├── .editorconfig ├── .gitattributes ├── .github └── workflows │ ├── deploy.yml │ ├── luacheck.yml │ ├── sile.yml │ └── versioning.yml ├── .gitignore ├── .luacheckrc ├── .luarc.json ├── Dockerfile ├── Justfile ├── LICENSE.md ├── Makefile ├── README.md ├── action.yml ├── classes └── fontproof │ └── init.lua ├── fontproof-dev-1.rockspec ├── fontproof.rockspec.in ├── hooks └── build ├── packages └── fontproof │ ├── groups.lua │ ├── gutenberg.lua │ ├── init.lua │ └── texts.lua ├── rockspecs ├── fontproof-2.0.0-1.rockspec ├── fontproof-2.0.1-1.rockspec ├── fontproof-2.0.10-1.rockspec ├── fontproof-2.0.11-1.rockspec ├── fontproof-2.0.2-1.rockspec ├── fontproof-2.0.3-1.rockspec ├── fontproof-2.0.4-1.rockspec ├── fontproof-2.0.5-1.rockspec ├── fontproof-2.0.6-1.rockspec ├── fontproof-2.0.7-1.rockspec ├── fontproof-2.0.8-1.rockspec ├── fontproof-2.0.9-1.rockspec ├── fontproof-2.1.0-1.rockspec ├── fontproof-2.2.0-1.rockspec ├── fontproof-2.2.1-1.rockspec ├── fontproof-2.2.2-1.rockspec ├── fontproof-2.2.3-1.rockspec ├── fontproof-2.2.4-1.rockspec ├── fontproof-2.2.5-1.rockspec ├── fontproof-3.0.0-1.rockspec ├── fontproof-3.0.1-1.rockspec ├── fontproof-3.0.2-1.rockspec └── fontproof-3.0.3-1.rockspec ├── src └── fontproof.lua └── templates ├── full.sil ├── gutenberg.sil ├── locator.lua ├── test.sil └── unichar.sil /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | 9 | [{Makefile*,*.mk,*.mk.in}] 10 | indent_style = tab 11 | indent_size = 4 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | 16 | [{*.lua,*.lua.in,sile.in,*.rockspec,*.rockspec.in,.busted,.luacov,.luacheckrc,config.ld}] 17 | indent_style = space 18 | indent_size = 3 19 | max_line_length = 120 20 | 21 | # StyLua keys 22 | collapse_simple_statement = never 23 | space_after_function_names = definitions 24 | 25 | # EmmyLuaCodeStyle keys 26 | continuation_indent = 6 27 | quote_style = double, 28 | call_arg_parentheses = keep, 29 | trailing_table_separator = always, 30 | align_call_args = true, 31 | end_statement_with_semicolon = same_line 32 | 33 | [{*.rockspec,*.rockspec.in}] 34 | max_line_length = 190 35 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Some strings in pattern tablse make Git think our code files are binary 2 | *.lua diff merge text 3 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: [ push, workflow_dispatch ] 4 | 5 | jobs: 6 | 7 | affected: 8 | uses: sile-typesetter/.github/.github/workflows/list_affected_rockspecs.yml@master 9 | 10 | build: 11 | needs: affected 12 | if: ${{ needs.affected.outputs.rockspecs }} 13 | uses: sile-typesetter/.github/.github/workflows/test_build_rock.yml@master 14 | with: 15 | rockspecs: ${{ needs.affected.outputs.rockspecs }} 16 | 17 | upload: 18 | needs: [ affected, build ] 19 | # Only run upload if: 20 | # 1. We are on the canonical repository (no uploads from forks) 21 | # 2. The current commit is either tagged or on the default branch (the workflow will upload dev/scm rockspecs any 22 | # time they are touched, tagged ones whenever the edited rockspec and tag match) 23 | # 3. Some rockspecs were changed — this implies the commit changing the rockspec is the same one that gets tagged 24 | if: >- 25 | ${{ 26 | github.repository == 'sile-typesetter/fontproof' && 27 | ( github.ref_name == 'master' || startsWith(github.ref, 'refs/tags/') ) && 28 | needs.affected.outputs.rockspecs 29 | }} 30 | uses: sile-typesetter/.github/.github/workflows/upload_to_luarocks.yml@master 31 | with: 32 | rockspecs: ${{ needs.affected.outputs.rockspecs }} 33 | secrets: 34 | apikey: ${{ secrets.LUAROCKS_SILETYPESETTER }} 35 | 36 | ghcr: 37 | if: >- 38 | ${{ 39 | github.repository == 'sile-typesetter/fontproof' && 40 | ( github.ref_name == 'master' || startsWith(github.ref, 'refs/tags/') ) 41 | }} 42 | strategy: 43 | fail-fast: false 44 | runs-on: ubuntu-22.04 45 | steps: 46 | - name: Checkout 47 | uses: actions/checkout@v4 48 | with: 49 | fetch-depth: 0 50 | - name: Fetch tags 51 | run: | 52 | git fetch --prune --tags ||: 53 | - name: Publish Docker Image to GH Container Registry 54 | run: | 55 | make docker-build-push 56 | env: 57 | DOCKER_REGISTRY: ghcr.io 58 | DOCKER_REPO: ${{ github.repository }} 59 | DOCKER_TAG: ${{ github.ref_name }} 60 | DOCKER_USERNAME: ${{ github.actor }} 61 | DOCKER_PAT: ${{ secrets.CR_SILE_TYPESETTER }} 62 | -------------------------------------------------------------------------------- /.github/workflows/luacheck.yml: -------------------------------------------------------------------------------- 1 | name: Luacheck 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | 7 | luacheck: 8 | runs-on: ubuntu-22.04 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v4 12 | - name: Luacheck 13 | uses: lunarmodules/luacheck@v1 14 | -------------------------------------------------------------------------------- /.github/workflows/sile.yml: -------------------------------------------------------------------------------- 1 | name: SILE 2 | 3 | on: [ push, pull_request ] 4 | 5 | jobs: 6 | 7 | sile: 8 | strategy: 9 | fail-fast: false 10 | matrix: 11 | sileVersion: [ "v0.15.9", "v0.15.13" ] 12 | runs-on: ubuntu-22.04 13 | container: 14 | image: ghcr.io/sile-typesetter/sile:${{ matrix.sileVersion }} 15 | options: --entrypoint=bash 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | # Danger alert! This partial upgrade scenario is explicitly *not* supported 20 | # by Arch Linux and *will* break at some point as the container ages. It 21 | # isn't needed when testing soon after a SILE release, and eventually will 22 | # stop working when any libraries SILE depends on get bumped. But it does 23 | # work to extend the life of the CI matrix between those two extreemes. 24 | - name: Refresh package database 25 | run: pacman --needed --noconfirm -Syq archlinux-keyring 26 | - name: Install dev dependencies 27 | run: pacman --noconfirm --needed -S luarocks make words 28 | - name: Build and install locally 29 | run: make install 30 | - name: Run test template 31 | run: ./lua_modules/bin/fontproof -t test -o test.pdf 32 | - name: Run gutenberg template 33 | run: ./lua_modules/bin/fontproof -t gutenberg -o gutenberg.pdf 34 | - name: Run unichar template 35 | run: ./lua_modules/bin/fontproof -t unichar -o unichar.pdf 36 | - name: Run full template 37 | run: ./lua_modules/bin/fontproof -t full -o full.pdf 38 | - name: Upload artifacts 39 | uses: actions/upload-artifact@v4 40 | with: 41 | name: fp-template-tests-${{ matrix.sileVersion }}.zip 42 | path: '*.pdf' 43 | -------------------------------------------------------------------------------- /.github/workflows/versioning.yml: -------------------------------------------------------------------------------- 1 | name: Versioning 2 | 3 | on: 4 | release: 5 | types: [created, published, edited] 6 | 7 | jobs: 8 | 9 | actions-tagger: 10 | runs-on: ubuntu-22.04 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | - name: Update release tags 15 | uses: Actions-R-Us/actions-tagger@v2 16 | with: 17 | publish_latest_tag: true 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lua_modules 2 | *.pdf 3 | .version* 4 | *.src.rock 5 | -------------------------------------------------------------------------------- /.luacheckrc: -------------------------------------------------------------------------------- 1 | std = "min+sile" 2 | include_files = { 3 | "**/*.lua", 4 | "*.rockspec", 5 | ".luacheckrc", 6 | } 7 | exclude_files = { 8 | "lua_modules", 9 | ".lua", 10 | ".luarocks", 11 | ".install", 12 | } 13 | globals = { 14 | "_fpFamily", 15 | "_fpFeatures", 16 | "_fpFilename", 17 | "_fpLanguage", 18 | "_fpScript", 19 | "_fpSize", 20 | "_fpStyle", 21 | "_fpWeight", 22 | } 23 | max_line_length = false 24 | -- vim: ft=lua 25 | -------------------------------------------------------------------------------- /.luarc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json", 3 | "Lua.runtime.version": "LuaJIT", 4 | "Lua.diagnostics.globals": [ 5 | "SILE", 6 | "SU", 7 | "luautf8", 8 | "pl", 9 | "fluent", 10 | "_fpFamily", 11 | "_fpFeatures", 12 | "_fpFilename", 13 | "_fpLanguage", 14 | "_fpScript", 15 | "_fpSize", 16 | "_fpStyle", 17 | "_fpWeight" 18 | ], 19 | "Lua.workspace.preloadFileSize": 5120, 20 | "Lua.workspace.checkThirdParty": false 21 | } 22 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: © 2016 SIL International 2 | # SPDX-License-Identifier: MIT 3 | 4 | #syntax=docker/dockerfile:1.2 5 | 6 | ARG SILETAG 7 | 8 | FROM ghcr.io/sile-typesetter/sile:$SILETAG AS fontproof 9 | 10 | # This is a hack to convince Docker Hub that its cache is behind the times. 11 | # This happens when the contents of our dependencies changes but the base 12 | # system hasn’t been refreshed. It’s helpful to have this as a separate layer 13 | # because it saves a lot of time for local builds, but it does periodically 14 | # need a poke. Incrementing this when changing dependencies or just when the 15 | # remote Docker Hub builds die should be enough. 16 | ARG DOCKER_HUB_CACHE=0 17 | 18 | ARG RUNTIME_DEPS 19 | 20 | # Install run-time dependencies 21 | RUN pacman --needed --noconfirm -Sq $RUNTIME_DEPS && yes | pacman -Sccq 22 | 23 | # Set at build time, forces Docker’s layer caching to reset at this point 24 | ARG REVISION 25 | ARG VERSION 26 | 27 | # Install fontproof in SILE container 28 | COPY ./ /src 29 | WORKDIR /src 30 | RUN luarocks make fontproof-dev-1.rockspec 31 | 32 | LABEL org.opencontainers.image.title="FontProof" 33 | LABEL org.opencontainers.image.description="A containerized version of FontProof" 34 | LABEL org.opencontainers.image.authors="Caleb Maclennan " 35 | LABEL org.opencontainers.image.licenses="MIT" 36 | LABEL org.opencontainers.image.url="https://github.com/sile-typesetter/fontproof/pkgs/container/fontproof" 37 | LABEL org.opencontainers.image.source="https://github.com/sile-typesetter/fontproof" 38 | LABEL org.opencontainers.image.version="v$VERSION" 39 | LABEL org.opencontainers.image.revision="$REVISION" 40 | 41 | RUN fontproof --version 42 | 43 | WORKDIR /data 44 | ENTRYPOINT ["fontproof"] 45 | -------------------------------------------------------------------------------- /Justfile: -------------------------------------------------------------------------------- 1 | set ignore-comments := true 2 | set shell := ["zsh", "+o", "nomatch", "-ecu"] 3 | set unstable := true 4 | set script-interpreter := ["zsh", "+o", "nomatch", "-eu"] 5 | 6 | _default: 7 | @just --list --unsorted 8 | 9 | [private] 10 | [doc('Block execution if Git working tree isn’t pristine.')] 11 | pristine: 12 | # Ensure there are no changes in staging 13 | git diff-index --quiet --cached HEAD || exit 1 14 | # Ensure there are no changes in the working tree 15 | git diff-files --quiet || exit 1 16 | 17 | [private] 18 | [doc('Block execution if we don’t have access to private keys.')] 19 | keys: 20 | gpg -a --sign > /dev/null <<< "test" 21 | 22 | release semver: pristine 23 | sed -i -e "/image:/s/:v.*/:v{{semver}}/" action.yml 24 | make rockspecs/fontproof-{{semver}}-1.rockspec 25 | git add action.yml README.md rockspecs/fontproof-{{semver}}-1.rockspec 26 | git commit -m "chore: Release {{semver}}" 27 | git tag v{{semver}} 28 | git push --atomic upstream master v{{semver}} 29 | luarocks pack rockspecs/fontproof-{{semver}}-1.rockspec 30 | gh release create v{{semver}} -t "FontProof v{{semver}}" fontproof-{{semver}}-1.src.rock 31 | 32 | post-release semver: keys 33 | gh release download --clobber v{{semver}} 34 | ls fontproof-{{semver}}-1.src.rock | xargs -n1 gpg -a --detach-sign 35 | gh release upload v{{semver}} fontproof-{{semver}}-1.src.rock.asc 36 | 37 | # vim: set ft=just 38 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | ===================== 3 | 4 | Copyright © 2016 SIL International 5 | 6 | Permission is hereby granted, free of charge, to any person 7 | obtaining a copy of this software and associated documentation 8 | files (the “Software”), to deal in the Software without 9 | restriction, including without limitation the rights to use, 10 | copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the 12 | Software is furnished to do so, subject to the following 13 | conditions: 14 | 15 | The above copyright notice and this permission notice shall be 16 | included in all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, 19 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 20 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25 | OTHER DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PACKAGE = fontproof 2 | 3 | SHELL := bash 4 | .SHELLFLAGS := -e -c 5 | 6 | .ONESHELL: 7 | .SECONDEXPANSION: 8 | .DELETE_ON_ERROR: 9 | .SUFFIXES: 10 | 11 | VERSION != git describe --tags --always --abbrev=7 | sed 's/-/-r/' 12 | SEMVER != git describe --tags | sed 's/^v//;s/-.*//' 13 | ROCKREV = 1 14 | TAG ?= v$(SEMVER) 15 | 16 | LUAROCKS_ARGS ?= --local --tree lua_modules 17 | 18 | DEV_SPEC = $(PACKAGE)-dev-$(ROCKREV).rockspec 19 | DEV_ROCK = $(PACKAGE)-dev-$(ROCKREV).src.rock 20 | REL_SPEC = rockspecs/$(PACKAGE)-$(SEMVER)-$(ROCKREV).rockspec 21 | REL_ROCK = $(PACKAGE)-$(SEMVER)-$(ROCKREV).src.rock 22 | 23 | .PHONY: all 24 | all: rockspecs dist 25 | 26 | .PHONY: rockspecs 27 | rockspecs: $(DEV_SPEC) $(REL_SPEC) 28 | 29 | .PHONY: dist 30 | dist: $(DEV_ROCK) $(REL_ROCK) 31 | 32 | .PHONY: install 33 | install: $(DEV_SPEC) 34 | luarocks $(LUAROCKS_ARGS) make $(DEV_SPEC) 35 | 36 | define rockspec_template = 37 | sed -e "s/@PACKAGE@/$(PACKAGE)/g" \ 38 | -e "s/@SEMVER@/$(SEMVER)/g" \ 39 | -e "s/@ROCKREV@/$(ROCKREV)/g" \ 40 | -e "s/@TAG@/$(TAG)/g" \ 41 | $< > $@ 42 | endef 43 | 44 | $(DEV_SPEC): SEMVER = dev 45 | $(DEV_SPEC): TAG = master 46 | $(DEV_SPEC): $(PACKAGE).rockspec.in 47 | $(rockspec_template) 48 | sed -i \ 49 | -e "1i -- DO NOT EDIT! Modify template $< and rebuild with \`make $@\`" \ 50 | -e '/tag =/s/tag/branch/' \ 51 | $@ 52 | 53 | rockspecs/$(PACKAGE)-%-$(ROCKREV).rockspec: SEMVER = $* 54 | rockspecs/$(PACKAGE)-%-$(ROCKREV).rockspec: TAG = v$* 55 | rockspecs/$(PACKAGE)-%-$(ROCKREV).rockspec: $(PACKAGE).rockspec.in 56 | $(rockspec_template) 57 | sed -i \ 58 | -e '/rockspec_format/s/3.0/1.0/' \ 59 | -e '/url = "git/a\ dir = "$(PACKAGE)",' \ 60 | -e '/issues_url/d' \ 61 | -e '/maintainer/d' \ 62 | -e '/labels/d' \ 63 | $@ 64 | 65 | $(DEV_ROCK): $(DEV_SPEC) 66 | luarocks $(LUAROCKS_ARGS) pack $< 67 | 68 | $(PACKAGE)-%.src.rock: rockspecs/$(PACKAGE)-%.rockspec 69 | luarocks $(LUAROCKS_ARGS) pack $< 70 | 71 | _BRANCH_REF != $(AWK) '{print ".git/" $$2}' .git/HEAD 2>/dev/null ||: 72 | 73 | .version: $(_BRANCH_REF) 74 | [[ -e "$@" ]] && mv "$@" "$@-prev" || touch "$@-prev" 75 | printf "$(VERSION)" > "$@" 76 | 77 | export DOCKER_REGISTRY ?= ghcr.io 78 | export DOCKER_REPO ?= sile-typesetter/$(PACKAGE) 79 | export DOCKER_TAG ?= HEAD 80 | 81 | .PHONY: docker 82 | docker: Dockerfile hooks/build .version 83 | ./hooks/build $(VERSION) 84 | 85 | .PHONY: docker-build-push 86 | docker-build-push: docker 87 | docker tag $${DOCKER_REPO/-/}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_REPO):$(DOCKER_TAG) 88 | test -z "$(DOCKER_PAT)" || \ 89 | docker login https://$(DOCKER_REGISTRY) -u $(DOCKER_USERNAME) -p $(DOCKER_PAT) 90 | docker push $(DOCKER_REGISTRY)/$(DOCKER_REPO):$(DOCKER_TAG) 91 | if [[ "$(DOCKER_TAG)" == v*.*.* ]]; then \ 92 | tag=$(DOCKER_TAG) ; \ 93 | docker tag $${DOCKER_REPO/-/}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_REPO):latest ; \ 94 | docker tag $${DOCKER_REPO/-/}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_REPO):$${tag//.*} ; \ 95 | docker push $(DOCKER_REGISTRY)/$(DOCKER_REPO):latest ; \ 96 | docker push $(DOCKER_REGISTRY)/$(DOCKER_REPO):$${tag//.*} ; \ 97 | fi 98 | 99 | $(MAKEFILE_LIST):; 100 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Luacheck Lint Status](https://img.shields.io/github/actions/workflow/status/sile-typesetter/fontproof/luacheck.yml?branch=master&label=Luacheck&logo=Lua)](https://github.com/sile-typesetter/fontproof/actions?workflow=Luacheck) 2 | [![SILE Render Status](https://img.shields.io/github/actions/workflow/status/sile-typesetter/fontproof/sile.yml?branch=master&label=SILE&logo=Github)](https://github.com/sile-typesetter/fontproof/actions?workflow=SILE) 3 | [![Docker Build Status](https://img.shields.io/github/actions/workflow/status/sile-typesetter/fontproof/deploy.yml?branch=master&label=Docker%20Build&logo=Docker)](https://github.com/sile-typesetter/fontproof/pkgs/container/fontproof) 4 | 5 | # FontProof 6 | 7 | A font design testing class for SILE. 8 | 9 | FontProof enables you to produce PDF font test documents without fiddling with InDesign or other manual page layout or word processing programs. 10 | You can apply one of the predesigned test documents (to be added later) or use FontProof to build your own custom font test document. 11 | 12 | _Note that FontProof is very much a work-in-progress, so there's a lot that doesn't work yet, or doesn't work very elegantly. Use at your own risk, and help us make it better._ 13 | 14 | ## Installation 15 | 16 | FontProof requires [The SILE Typesetter](https://sile-typesetter.org). 17 | You'll need to [install SILE](https://github.com/sile-typesetter/sile/#download-and-installation) according to that package's instructions. 18 | 19 | _Note that SILE is changing rapidly. The current class was developed for and tested with release 0.15.0 or newer._ 20 | For support of older versions of SILE see older versions of FontProof. 21 | 22 | Installation of FontProof is primarily done through Lua Rocks: 23 | 24 | ``` console 25 | $ luarocks install fontproof 26 | ``` 27 | 28 | A working installation of SILE v0.15.0 or newer is required but not checked at installation time. 29 | 30 | You may also install from manually from the source directory: 31 | 32 | ``` console 33 | $ luarocks make 34 | ``` 35 | ## Usage 36 | 37 | Running FontProof is done through its own CLI: 38 | 39 | ``` console 40 | $ fontproof --help 41 | Usage: fontproof [OPTIONS] [--] [SILEARGS-1 [SILEARGS-2 [...]]] 42 | 43 | ARGUMENTS: 44 | SILEARGS All remaining args are passed directly to SILE 45 | (optional) 46 | 47 | OPTIONS: 48 | -F, --family=VALUE Specify the font to be tested as a family name 49 | (ignored if --filename used) 50 | -f, --filename=VALUE Specify the font to be tested as a path to a 51 | font file 52 | -o, --output=FILE output file name 53 | -p, --features=VALUE Specify the test font features 54 | -s, --size=VALUE Specify the test font size 55 | -S, --style=VALUE Specify the test font style (ignored if 56 | --filename used) 57 | -t, --template=VALUE Use the bundled template by name (full, 58 | gutenberg, test, unichar); 59 | -w, --weight=VALUE Specify the test font weight (ignored if 60 | --filename used) 61 | -h, --help display this help, then exit 62 | -v, --version display version information, then exit 63 | ``` 64 | 65 | ## Using the templates 66 | 67 | Four starter templates are provided out of the box. 68 | To adapt them, the best thing to do is probably copy the one most similar to where you plan to head and modify it yourself. 69 | The main feature of a template is that it uses the *fontproof* class. 70 | Use of the specialty commands it defines is on an as-needed basis. 71 | 72 | For example: 73 | 74 | ``` console 75 | $ cp /usr/local/share/lua//fontproof/templates/full.sil mytemplate.sil 76 | $ fontproof -- mytemplate.sil 77 | ``` 78 | 79 | At this point there is one main template - _fpFull.sil_ - but more will follow. 80 | That template will show you almost all that FontProof can do. 81 | SILE itself is capable of far, far, more, and you're very welcome to play around with it. 82 | 83 | ## Docker usage 84 | 85 | As an alternative method to use FontProof, Docker images are available from [Docker Hub](https://hub.docker.com/repository/docker/siletypesetter/fontproof) or the [GitHub Container Registry](https://github.com/sile-typesetter/fontproof/pkgs/container/fontproof%2Ffontproof) with SILE and the *fontproof* class baked in and ready for use. 86 | Released versions are tagged to match (e.g. `v2.0.5`), the latest release will be tagged `latest`, and a `master` tag is also available with the freshest development build. 87 | In order to be useful you need to tell the Docker run command a way to reach your source documents (and hence also to give it a place to write the output) as well as tell it who you are on the host machine so the output generated inside the container can be created with the expected ownership properties. 88 | You may find it easiest to run with an alias like this: 89 | 90 | ```console 91 | $ alias fontproof='docker run -it --volume "$(pwd):/data" --user "$(id -u):$(id -g)" siletypesetter/fontproof:latest' 92 | $ fontproof proofs.sil 93 | ``` 94 | 95 | ## Remote usage 96 | 97 | Any remote CI system that can use Docker images as job runners could be configured to run FontProof jobs. 98 | Additionally a ready-made GitHub Action is [available on the marketplace](https://github.com/marketplace/actions/fontproof): 99 | 100 | ```yaml 101 | name: FontProof 102 | on: [push, pull_request] 103 | jobs: 104 | fontproof: 105 | runs-on: ubuntu-latest 106 | name: FontProof 107 | steps: 108 | - name: Checkout 109 | uses: actions/checkout@v4 110 | - name: FontProof 111 | uses: sile-typesetter/fontproof@latest 112 | with: 113 | args: proofs.sil 114 | ``` 115 | 116 | Add to your repository as `.github/workflows/fontproof.yml`. 117 | This work flow assumes your project has a source file `proofs.sil` and will leave behind a `fontproof.pdf`. 118 | Note that the comments in [the section about Docker](#docker-usage) regarding tagged versions besides `latest` apply equally here, but GitHub Actions uses an `@` separator instead of Docker's `:`. 119 | 120 | ## Adding or modifying tests 121 | 122 | Each template can contain a full selection of tests. Each test is specified using a command in this general format: 123 | 124 | ``` sile 125 | \commandname[set of parameters]{text to be typeset} 126 | ``` 127 | 128 | Some tests may have only parameters, or only text, or neither, as in this example that is natively supported within SILE itself: 129 | 130 | ``` sile 131 | \pangrams 132 | ``` 133 | 134 | More details on running commands in SILE can be found in the SILE [manual](https://sile-typesetter.org/manual/sile-latest.pdf). 135 | 136 | ## Headings and sections 137 | 138 | By default, the running head lists the filename, font (family or filename), date, and time. The content is not (currently) configurable, but you can set the font and size with the `\setRunHeadStyle` command. Note that this has no relation to the test font. 139 | 140 | ``` sile 141 | %\setRunHeadStyle[filename="Example-Bold.ttf", size="12pt"] 142 | ``` 143 | 144 | To add a section and subsection headings: 145 | 146 | ``` sile 147 | \section{Heading text} 148 | \subsection{Heading text} 149 | ``` 150 | 151 | The style of these is not currently configurable, but you can manually tweak them for all FontProof docs by changing the settings in _classes/fontproof.lua_. 152 | 153 | ## Test types 154 | 155 | The following kinds of tests are supported, and are illustrated in _fpFull.sil_ : 156 | 157 | - Simple test text 158 | - Waterfall (a text repeated in multiple sizes) 159 | - Patterns (where a text is repeated with one or more substituted characters) 160 | - Lorem ipsum 161 | - Pangrams 162 | - Full glyph repertoire 163 | 164 | Details on the commands used to specify these are below. 165 | 166 | ## Contributing to the project 167 | 168 | FontProof is Copyright © 2016 [SIL International](http://www.sil.org) and licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License). 169 | BTW - Despite the name similarity, SILE itself is not developed by SIL International, though we like the project very much. 170 | You're very welcome to contribute to both FontProof and SILE. 171 | 172 | --- 173 | 174 | # Proof Tests and Options 175 | 176 | ## Commands provided by FontProof 177 | 178 | These commands are currently supported. 179 | 180 | #### __\proof[]{}__ 181 | 182 | This is the main FontProof command, and can be used to set both simple test texts and waterfalls. 183 | Optional parameters include font (by family or filename) and size(s). 184 | You can also set a test heading here rather than using a separate `\section` command. 185 | 186 | ``` sile 187 | \proof{This is basic proof text using the test font} 188 | 189 | \proof[family="Gentium Plus",heading=A basic family test]{This is basic text with a font defined by family} 190 | 191 | \proof[size="10pt",filename="Example-Light.ttf",heading=A basic filename test]{This is another basic text with common parameters} 192 | 193 | \proof[size="10pt,11pt,12pt,16pt"]{This is basic proof text in a range of sizes} 194 | 195 | \proof[size="10,11,12,13,20"]{This is basic proof text in a range of sizes with numbers only} 196 | 197 | \proof[features="Ligatures=Rare, Ligatures=Discretionary"]{This is a proof with rare ligatures turned on} 198 | 199 | \proof[features="+dlig,+hlig"]{This is a proof with features manipulated manually} 200 | 201 | \proof[language="grk",direction = "rtl"]{Here are some options which are passed on to the font command} 202 | 203 | \proof[color="green"]{Here are some options which are passed on to the color command} 204 | 205 | \proof[shapers="ot,fallback"]{Here we pass a list of subshapers to Harfbuzz} 206 | ``` 207 | 208 | #### __\pattern[]{}__ 209 | 210 | This produces multiple copies of a text with a range of characters substituted in key places. 211 | These are sometimes referred to as 'frame tests'. 212 | Traditionally a common test of this type was the 'hobonop' test. 213 | A 'hobonop' for the letters a b c d would look like: 214 | 215 | > _haoabaoanaoap hbobbbobnbobp hcocbcocncocp hdodbdodndodp_ 216 | 217 | The command to produce this would be: 218 | 219 | ``` sile 220 | \pattern[chars="@",reps="abcd"]{h@o@b@o@n@o@p} 221 | ``` 222 | 223 | This defines a placeholder character, then the set of letters used to replace it, then the text pattern containing the placeholder(s). 224 | 225 | You can also use multiple placeholders to create all combinations, as in: 226 | 227 | > _ooaxoo oobxoo oocxoo_ 228 | > _ooayoo oobyoo oocyoo_ 229 | 230 | The command for this would be: (Be sure to follow the syntax of this exactly, or you may get very confusing errors!) 231 | 232 | ``` sile 233 | \pattern[chars="@,#",reps="abc,xy"]{oo@#oo} 234 | ``` 235 | 236 | There are some characters that are special to SILE and Lua and shouldn't be used as _chars_. 237 | (A list of suggested safe ones would be a good addition here!) 238 | It's also a bad idea to use a character that is in _reps_. 239 | 240 | There is one more optional parameter to the `\pattern` command: 241 | 242 | - _format = "table"_ (the default) will typeset patterns with multiple placeholders grouped into one paragraph per second placeholder replacement. 243 | - _format = "list"_ will typeset each pattern in a separate line (paragraph). 244 | - _format = "para"_ will group all results into a single paragraph. 245 | 246 | It's easier to demonstrate this than to explain. 247 | First the formatted example, then the command to produce it: 248 | 249 | > _ooaxoo oobxoo oocxoo_ 250 | > _ooayoo oobyoo oocyoo_ 251 | 252 | ``` sile 253 | \pattern[chars="@,#",reps="abc,xy",format="table"]{oo@#oo} 254 | ``` 255 | 256 | > _ooaxoo_ 257 | > _oobxoo_ 258 | > _oocxoo_ 259 | > _ooayoo_ 260 | > _oobyoo_ 261 | > _oocyoo_ 262 | 263 | ``` sile 264 | \pattern[chars="@,#",reps="abc,xy",format="list"]{oo@#oo} 265 | ``` 266 | 267 | > _ooaxoo oobxoo oocxoo ooayoo oobyoo oocyoo_ 268 | 269 | ``` sile 270 | \pattern[chars="@,#",reps="abc,xy",format="para"]{oo@#oo} 271 | ``` 272 | 273 | #### __\patterngroup[]{}__ 274 | 275 | This is cool! 276 | Say that you have a group of letters that you want to use in multiple pattern tests, but don't want to have to define them over and over again. 277 | You can define these as a pattern group, with a specific name. 278 | Note that you have to define these groups in your document before you refer to them. 279 | Also note that this command doesn't really produce anything on the page by itself. 280 | It's only useful for later `\pattern` commands. 281 | 282 | ``` sile 283 | \patterngroup[name="vowels"]{aeiou} 284 | ``` 285 | 286 | To refer to this in a `\pattern` command prefix the group name with "group_" and use in the `reps` parameter. 287 | For example: 288 | 289 | ``` sile 290 | \pattern[chars="@,#",reps="group_vowels,xy",format="table"]{oo@#oo} 291 | ``` 292 | 293 | There are also a few predefined groups, as listed below. 294 | You can also define your own permanent groups in _packages/fontproofgroups.lua_. 295 | 296 | | Group Name | Description | 297 | |-----------------|----------------------------| 298 | | group_az | basic lowercase alphabet | 299 | | group_AZ | basic uppercase alphabet | 300 | | group_combdiacs | basic combining diacritics | 301 | | group_09 | basic numerals | 302 | | group_punct | basic punctuation | 303 | 304 | 305 | ## Additional FontProof Features 306 | 307 | #### __text_*xxxxx*__ 308 | 309 | FontProof includes a range of built-in test texts. 310 | Set the content of a `\proof` or `\pattern` command to any of the following preset `text_xxxx` names. 311 | You can also add your own texts in _packages/fontprooftexts.lua_. 312 | 313 | | Content | Description | 314 | |-------------------|------------------------------------------------------------------------| 315 | | text_az | basic lowercase alphabet | 316 | | text_AZ | basic uppercase alphabet | 317 | | text_combdiacs | basic combining diacritics | 318 | | text_spacingdiacs | basic spacing diacritics | 319 | | text_09 | basic numerals | 320 | | text_numsym | numerals and related symbols | 321 | | text_nummath | mathematical symbols | 322 | | text_symbols | common symbols | 323 | | text_punct | basic punctuation | 324 | | text_pangram | simple pangram | 325 | | text_verne | excerpt from *20,000 Leagues Under the Sea* | 326 | | text_verneCaps | uppercase version | 327 | | text_revEng | excerpt from Revelation 7 (English) | 328 | | text_revFin | excerpt from Revelation 7 (Finnish) | 329 | | text_revGer | excerpt from Revelation 7 (German) | 330 | | text_revDut | excerpt from Revelation 7 (Dutch) | 331 | | text_revInd | excerpt from Revelation 7 (Indonesia) | 332 | | text_revSwa | excerpt from Revelation 7 (Swahili) | 333 | | text_arrowroot | traditional font testing text | 334 | | text_capslower | Latin capitals against the lowercase key letters /o and /n | 335 | | text_bringhurst | Kerning test from Bringhurst’s “Elements of Typographic Style” | 336 | | text_allkernpairs | Text containing all combinations of Latin upper and lower case letters | 337 | | text_jafkerns | Kerning test from Just Another Foundry’s text generator | 338 | 339 | #### __\adhesion__ 340 | 341 | This uses dictionaries to produce garbage text made up of real words, similar to `\lorem`. 342 | However the words would only contain letters from a set you supply: 343 | 344 | ``` sile 345 | \adhesion[characters=hamburgefonsiv] 346 | ``` 347 | 348 | Optional arguments are `words`, the number of words (defaulting to 120), and `dict`, the path of a dictionary file. 349 | The class looks in `/usr/share/dict/words` and `/usr/dict/words` if the `dict` option is not provided. 350 | Words are selected from the dictionary file if they contain only the characters specified. 351 | 352 | #### __\gutenberg__ 353 | 354 | This downloads and typesets a text from Project Gutenberg. 355 | 356 | ``` casile 357 | \gutenberg[id=100] % The complete works of Shakespeare 358 | ``` 359 | 360 | #### __\pi__ 361 | 362 | Typesets some digits of pi: 363 | 364 | ``` sile 365 | \pi[digits=500] 366 | ``` 367 | #### __\unicharchart__ 368 | 369 | This produces a simple unbordered table that would show a range of unicode and any glyphs that represent the USVs in that range. 370 | 371 | Some examples: 372 | 373 | ``` sile 374 | \unicharchart[type="all",columns="12",rows="16"] 375 | ``` 376 | 377 | This produces a table that shows every encoded character in the font, formatted as a table with increasing USVs descending down a column, 16 chars per column, with a maximum of 12 columns before breaking into a new table. 378 | This is very similar to the tables in The Unicode Standard code charts, and could be the default settings for a simple `\unicharchart`. 379 | 380 | ``` sile 381 | \unicharchart[type="range",start="AA80",end="AADF"] 382 | ``` 383 | 384 | This produces the same, except only showing the given range of USVs. 385 | 386 | ## Commands provided natively by SILE 387 | 388 | These work in SILE even without FontProof, although you would then need to load them with `\script[src=packages/specimen]`. 389 | 390 | #### __\pangrams__ 391 | 392 | This produces a set of predefined pangrams. 393 | 394 | #### __\lorem[words=#]__ 395 | 396 | This produces garbage _lorem ipsum_ text, with the number of words indicated. 397 | 398 | #### __\repertoire__ 399 | 400 | This produces a nicely arranged table of all the glyphs in the font. 401 | 402 | ## Future features 403 | 404 | Here are some commands we hope to someday support, with suggested command formats. 405 | Some may never be implemented. Suggestions welcome! 406 | 407 | #### Enhancements to __\proof__ 408 | 409 | We'd love to see even more potential parameters to `\proof`: 410 | 411 | ``` sile 412 | \proof[ 413 | size = "10, 11/13, 12/16", 414 | columns = 3, 415 | lines = 12 416 | ]{Text} 417 | ``` 418 | 419 | #### Support for multiple fonts with a single test type 420 | 421 | Oooooh! 422 | 423 | #### _What else would you like?_ 424 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: FontProof 2 | description: A font design testing class for SILE 3 | inputs: 4 | args: 5 | description: Arguments passed to fontproof; defaults to ‘-t test’. 6 | required: false 7 | default: -t test 8 | runs: 9 | using: docker 10 | image: docker://ghcr.io/sile-typesetter/fontproof:v3.0.3 11 | entrypoint: sh 12 | args: 13 | - -c 14 | - fontproof ${{ inputs.args }} 15 | branding: 16 | icon: book-open 17 | color: blue 18 | -------------------------------------------------------------------------------- /classes/fontproof/init.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local hb = require("justenoughharfbuzz") 5 | local plain = require("classes.plain") 6 | 7 | local class = pl.class(plain) 8 | class._name = "fontproof" 9 | 10 | local _scratch = SILE.scratch.fontproof 11 | 12 | class.defaultFrameset = { 13 | content = { 14 | left = "8%pw", 15 | right = "92%pw", 16 | top = "6%ph", 17 | bottom = "96%ph", 18 | }, 19 | runningHead = { 20 | left = "left(content)", 21 | right = "right(content)", 22 | top = "top(content)-3%ph", 23 | bottom = "top(content)-1%ph", 24 | }, 25 | } 26 | 27 | -- If we are in a git repository, report the latest commit ID 28 | local function getGitCommit () 29 | local fh = io.popen("git describe --always --long --tags --abbrev=7 --dirty='*'") 30 | local commit = fh:read() 31 | return commit and (" [%s]"):format(commit) or "" 32 | end 33 | 34 | function class:_init (options) 35 | _scratch = { 36 | runhead = {}, 37 | section = {}, 38 | subsection = {}, 39 | } 40 | 41 | _scratch.runhead.family = "Gentium Plus" 42 | _scratch.runhead.size = "5pt" 43 | _scratch.section.family = "Gentium Plus" 44 | _scratch.section.size = "12pt" 45 | _scratch.subsection.family = "Gentium Plus" 46 | _scratch.subsection.size = "12pt" 47 | 48 | plain._init(self, options) 49 | 50 | self:loadPackage("fontproof") 51 | self:loadPackage("linespacing") 52 | self:loadPackage("lorem") 53 | self:loadPackage("specimen") 54 | self:loadPackage("rebox") 55 | self:loadPackage("features") 56 | self:loadPackage("color") 57 | 58 | SILE.settings:set("document.parindent", SILE.types.node.glue(0)) 59 | SILE.settings:set("document.spaceskip") 60 | return self 61 | end 62 | 63 | function class:declareOptions () 64 | plain.declareOptions(self) 65 | local filename, family, language, script, size, style, features, weight 66 | self:declareOption("filename", function (_, value) 67 | if value then 68 | filename = value 69 | end 70 | return filename 71 | end) 72 | self:declareOption("family", function (_, value) 73 | if value then 74 | family = value 75 | end 76 | return family 77 | end) 78 | self:declareOption("language", function (_, value) 79 | if value then 80 | language = value 81 | end 82 | return language 83 | end) 84 | self:declareOption("script", function (_, value) 85 | if value then 86 | script = value 87 | end 88 | return script 89 | end) 90 | self:declareOption("size", function (_, value) 91 | if value then 92 | size = value 93 | end 94 | return size 95 | end) 96 | self:declareOption("style", function (_, value) 97 | if value then 98 | style = value 99 | end 100 | return style 101 | end) 102 | self:declareOption("features", function (_, value) 103 | if value then 104 | features = value 105 | end 106 | return features 107 | end) 108 | self:declareOption("weight", function (_, value) 109 | if value then 110 | weight = value 111 | end 112 | return weight 113 | end) 114 | end 115 | 116 | function class:setOptions (options) 117 | if not self._initialized then 118 | plain.setOptions(self, options) 119 | end 120 | self.options.filename = _fpFilename or options.filename or nil 121 | self.options.family = _fpFamily or options.family or "Gentium Plus" 122 | self.options.language = _fpLanguage or options.language or nil 123 | self.options.script = _fpScript or options.script or nil 124 | self.options.size = _fpSize or options.size or "12pt" 125 | self.options.style = _fpStyle or options.style or nil 126 | self.options.features = _fpFeatures or options.features or "" 127 | self.options.weight = _fpWeight or options.weight or nil 128 | end 129 | 130 | function class:endPage () 131 | SILE.call("nofolios") 132 | local fontinfo 133 | if self.options.filename then 134 | fontinfo = ("%s %s"):format(self.options.filename, self.options.features) 135 | else 136 | fontinfo = ("%s %s %s %s"):format( 137 | self.options.family, 138 | self.options.style, 139 | self.options.weight, 140 | self.options.features 141 | ) 142 | end 143 | if self.options.language then 144 | fontinfo = fontinfo .. (" %s"):format(self.options.language) 145 | end 146 | if self.options.script then 147 | fontinfo = fontinfo .. (" %s"):format(self.options.script) 148 | end 149 | local gitcommit = getGitCommit() 150 | local templateinfo = ("%s"):format(SILE.input.filenames[1]) 151 | local dateinfo = os.date("%A %d %b %Y %X %z %Z") 152 | local sileinfo = ("SILE %s"):format(SILE.version) 153 | local harfbuzzinfo = ("HarfBuzz %s"):format(hb.version()) 154 | local runheadinfo = ("Fontproof: %s %s - %s - %s - %s - %s"):format( 155 | fontinfo, 156 | gitcommit, 157 | templateinfo, 158 | dateinfo, 159 | sileinfo, 160 | harfbuzzinfo 161 | ) 162 | SILE.typesetNaturally(SILE.getFrame("runningHead"), function () 163 | SILE.settings:set("document.rskip", SILE.types.node.hfillglue()) 164 | SILE.settings:set("typesetter.parfillskip", SILE.types.node.glue(0)) 165 | SILE.settings:set("document.spaceskip", SILE.shaper:measureChar(" ").width) 166 | SILE.call("font", { 167 | family = _scratch.runhead.family, 168 | size = _scratch.runhead.size, 169 | }, { runheadinfo }) 170 | SILE.call("par") 171 | end) 172 | return plain.endPage(self) 173 | end 174 | 175 | function class:registerCommands () 176 | plain.registerCommands(self) 177 | 178 | self:registerCommand("setTestFont", function (options, _) 179 | self:setOptions(options) 180 | SILE.call("font", self:_fpOptions()) 181 | end) 182 | 183 | -- optional way to override defaults 184 | self:registerCommand("setRunHeadStyle", function (options, _) 185 | _scratch.runhead.family = options.family 186 | _scratch.runhead.size = options.size or "8pt" 187 | end) 188 | 189 | self:registerCommand("section", function (_, content) 190 | SILE.typesetter:leaveHmode() 191 | SILE.call("goodbreak") 192 | SILE.call("bigskip") 193 | SILE.call("noindent") 194 | SILE.call("font", { 195 | family = _scratch.section.family, 196 | size = _scratch.section.size, 197 | }, function () 198 | SILE.call("raggedright", {}, content) 199 | end) 200 | SILE.call("novbreak") 201 | SILE.call("medskip") 202 | SILE.call("novbreak") 203 | SILE.typesetter:inhibitLeading() 204 | end) 205 | 206 | self:registerCommand("subsection", function (_, content) 207 | SILE.typesetter:leaveHmode() 208 | SILE.call("goodbreak") 209 | SILE.call("bigskip") 210 | SILE.call("noindent") 211 | SILE.call("font", { 212 | family = _scratch.subsection.family, 213 | size = _scratch.subsection.size, 214 | }, function () 215 | SILE.call("raggedright", {}, content) 216 | end) 217 | SILE.call("novbreak") 218 | SILE.call("medskip") 219 | SILE.call("novbreak") 220 | SILE.typesetter:inhibitLeading() 221 | end) 222 | end 223 | 224 | function class:_fpOptions (options) 225 | options = options or {} 226 | local opts = {} 227 | if options.filename or self.options.filename then 228 | opts.filename = options.filename or self.options.filename 229 | else 230 | opts.family = options.family or self.options.family 231 | opts.weight = options.weight or self.options.weight 232 | opts.style = options.style or self.options.style 233 | end 234 | opts.language = options.language or self.options.language 235 | opts.script = options.script or self.options.script 236 | opts.size = options.size or self.options.size 237 | opts.features = options.features or self.options.features 238 | return opts 239 | end 240 | 241 | return class 242 | -------------------------------------------------------------------------------- /fontproof-dev-1.rockspec: -------------------------------------------------------------------------------- 1 | -- DO NOT EDIT! Modify template fontproof.rockspec.in and rebuild with `make fontproof-dev-1.rockspec` 2 | rockspec_format = "3.0" 3 | package = "fontproof" 4 | version = "dev-1" 5 | 6 | source = { 7 | url = "git+https://github.com/sile-typesetter/fontproof.git", 8 | branch = "master" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | issues_url = "https://github.com/sile-typesetter/fontproof/issues", 21 | maintainer = "Caleb Maclennan ", 22 | labels = { "typesetting", "fonts" } 23 | } 24 | 25 | dependencies = { 26 | "lua >= 5.1", 27 | "lua_cliargs == 3.0-2" 28 | } 29 | 30 | deploy = { 31 | wrap_bin_scripts = true, 32 | } 33 | 34 | build = { 35 | type = "builtin", 36 | modules = { 37 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 38 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 39 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 40 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 41 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 42 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 43 | }, 44 | install = { 45 | lua = { 46 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 47 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 48 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 49 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 50 | }, 51 | bin = { 52 | fontproof = "src/fontproof.lua" 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /fontproof.rockspec.in: -------------------------------------------------------------------------------- 1 | rockspec_format = "3.0" 2 | package = "@PACKAGE@" 3 | version = "@SEMVER@-@ROCKREV@" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | tag = "@TAG@" 8 | } 9 | 10 | description = { 11 | summary = "A font design testing class for SILE", 12 | detailed = [[FontProof enables you to produce PDF font test documents without 13 | fiddling with InDesign or other manual page layout or word 14 | processing programs. You can apply one of the predesigned test 15 | documents (to be added later) or use FontProof to build your own 16 | custom font test document.]], 17 | license = "MIT", 18 | homepage = "https://github.com/sile-typesetter/fontproof", 19 | issues_url = "https://github.com/sile-typesetter/fontproof/issues", 20 | maintainer = "Caleb Maclennan ", 21 | labels = { "typesetting", "fonts" } 22 | } 23 | 24 | dependencies = { 25 | "lua >= 5.1", 26 | "lua_cliargs == 3.0.2-1" 27 | } 28 | 29 | build = { 30 | type = "builtin", 31 | modules = { 32 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 33 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 34 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 35 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 36 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 37 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 38 | }, 39 | install = { 40 | lua = { 41 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 42 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 43 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 44 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 45 | }, 46 | bin = { 47 | fontproof = "src/fontproof.lua" 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /hooks/build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # SPDX-FileCopyrightText: © 2016 SIL International 3 | # SPDX-License-Identifier: MIT 4 | 5 | set -e 6 | 7 | : "${SILETAG:=v0.15.13}" 8 | 9 | REVISION=$(git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g') 10 | 11 | RUNTIME_DEPS='words' 12 | 13 | : "${DOCKER_BUILDKIT:=1}" 14 | export DOCKER_BUILDKIT 15 | 16 | docker build \ 17 | --build-arg SILETAG="$SILETAG" \ 18 | --build-arg REVISION="$REVISION" \ 19 | --build-arg VERSION="${1:-$REVISION}" \ 20 | --build-arg RUNTIME_DEPS="$RUNTIME_DEPS" \ 21 | --tag ${DOCKER_REPO/-/}:$DOCKER_TAG \ 22 | ./ 23 | -------------------------------------------------------------------------------- /packages/fontproof/groups.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local groups = {} 5 | 6 | -- basics 7 | groups["az"] = "abcdefghijklmnopqrstuvwxyz" 8 | groups["AZ"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 9 | groups["combdiacs"] = "̧̨̛̣̱̀́̂̃̄̆̇̈̉̊̋̌ " 10 | 11 | -- numerals, symbols, punctuation 12 | groups["09"] = "0123456789" 13 | groups["punct"] = ".,:;!¡?¿ '\"‘’‚“”„*­-–—/" 14 | 15 | return groups 16 | -------------------------------------------------------------------------------- /packages/fontproof/gutenberg.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local base = require("packages.base") 5 | 6 | local package = pl.class(base) 7 | package._name = "fontproof.gutenberg" 8 | 9 | local json = {} 10 | -- Internal functions. 11 | 12 | local function kind_of (obj) 13 | if type(obj) ~= "table" then 14 | return type(obj) 15 | end 16 | local i = 1 17 | for _ in pairs(obj) do 18 | if obj[i] ~= nil then 19 | i = i + 1 20 | else 21 | return "table" 22 | end 23 | end 24 | if i == 1 then 25 | return "table" 26 | else 27 | return "array" 28 | end 29 | end 30 | 31 | local function escape_str (s) 32 | local in_char = { "\\", '"', "/", "\b", "\f", "\n", "\r", "\t" } 33 | local out_char = { "\\", '"', "/", "b", "f", "n", "r", "t" } 34 | for i, c in ipairs(in_char) do 35 | s = s:gsub(c, "\\" .. out_char[i]) 36 | end 37 | return s 38 | end 39 | 40 | -- Returns pos, did_find; there are two cases: 41 | -- 1. Delimiter found: pos = pos after leading space + delim; did_find = true. 42 | -- 2. Delimiter not found: pos = pos after leading space; did_find = false. 43 | -- This throws an error if err_if_missing is true and the delim is not found. 44 | local function skip_delim (str, pos, delim, err_if_missing) 45 | pos = pos + #str:match("^%s*", pos) 46 | if str:sub(pos, pos) ~= delim then 47 | if err_if_missing then 48 | error("Expected " .. delim .. " near position " .. pos) 49 | end 50 | return pos, false 51 | end 52 | return pos + 1, true 53 | end 54 | 55 | -- Expects the given pos to be the first character after the opening quote. 56 | -- Returns val, pos; the returned pos is after the closing quote character. 57 | local function parse_str_val (str, pos, val) 58 | val = val or "" 59 | local early_end_error = "End of input found while parsing string." 60 | if pos > #str then 61 | error(early_end_error) 62 | end 63 | local c = str:sub(pos, pos) 64 | if c == '"' then 65 | return val, pos + 1 66 | end 67 | if c ~= "\\" then 68 | return parse_str_val(str, pos + 1, val .. c) 69 | end 70 | -- We must have a \ character. 71 | local esc_map = { b = "\b", f = "\f", n = "\n", r = "\r", t = "\t" } 72 | local nextc = str:sub(pos + 1, pos + 1) 73 | if not nextc then 74 | error(early_end_error) 75 | end 76 | return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc)) 77 | end 78 | 79 | -- Returns val, pos; the returned pos is after the number's final character. 80 | local function parse_num_val (str, pos) 81 | local num_str = str:match("^-?%d+%.?%d*[eE]?[+-]?%d*", pos) 82 | local val = tonumber(num_str) 83 | if not val then 84 | error("Error parsing number at position " .. pos .. ".") 85 | end 86 | return val, pos + #num_str 87 | end 88 | 89 | -- Public values and functions. 90 | 91 | function json.stringify (obj, as_key) 92 | local s = {} -- We'll build the string as an array of strings to be concatenated. 93 | local kind = kind_of(obj) -- This is 'array' if it's an array or type(obj) otherwise. 94 | if kind == "array" then 95 | if as_key then 96 | error("Can't encode array as key.") 97 | end 98 | s[#s + 1] = "[" 99 | for i, val in ipairs(obj) do 100 | if i > 1 then 101 | s[#s + 1] = ", " 102 | end 103 | s[#s + 1] = json.stringify(val) 104 | end 105 | s[#s + 1] = "]" 106 | elseif kind == "table" then 107 | if as_key then 108 | error("Can't encode table as key.") 109 | end 110 | s[#s + 1] = "{" 111 | for k, v in pairs(obj) do 112 | if #s > 1 then 113 | s[#s + 1] = ", " 114 | end 115 | s[#s + 1] = json.stringify(k, true) 116 | s[#s + 1] = ":" 117 | s[#s + 1] = json.stringify(v) 118 | end 119 | s[#s + 1] = "}" 120 | elseif kind == "string" then 121 | return '"' .. escape_str(obj) .. '"' 122 | elseif kind == "number" then 123 | if as_key then 124 | return '"' .. tostring(obj) .. '"' 125 | end 126 | return tostring(obj) 127 | elseif kind == "boolean" then 128 | return tostring(obj) 129 | elseif kind == "nil" then 130 | return "null" 131 | else 132 | error("Unjsonifiable type: " .. kind .. ".") 133 | end 134 | return table.concat(s) 135 | end 136 | 137 | json.null = {} -- This is a one-off table to represent the null value. 138 | 139 | function json.parse (str, pos, end_delim) 140 | pos = pos or 1 141 | if pos > #str then 142 | error("Reached unexpected end of input.") 143 | end 144 | pos = pos + #str:match("^%s*", pos) -- Skip whitespace. 145 | local first = str:sub(pos, pos) 146 | if first == "{" then -- Parse an object. 147 | local obj, delim_found = {}, true 148 | local key 149 | pos = pos + 1 150 | while true do 151 | key, pos = json.parse(str, pos, "}") 152 | if key == nil then 153 | return obj, pos 154 | end 155 | if not delim_found then 156 | error("Comma missing between object items.") 157 | end 158 | pos = skip_delim(str, pos, ":", true) -- true -> error if missing. 159 | obj[key], pos = json.parse(str, pos) 160 | pos, delim_found = skip_delim(str, pos, ",") 161 | end 162 | elseif first == "[" then -- Parse an array. 163 | local arr, delim_found = {}, true 164 | local val 165 | pos = pos + 1 166 | while true do 167 | val, pos = json.parse(str, pos, "]") 168 | if val == nil then 169 | return arr, pos 170 | end 171 | if not delim_found then 172 | error("Comma missing between array items.") 173 | end 174 | arr[#arr + 1] = val 175 | pos, delim_found = skip_delim(str, pos, ",") 176 | end 177 | elseif first == '"' then -- Parse a string. 178 | return parse_str_val(str, pos + 1) 179 | elseif first == "-" or first:match("%d") then -- Parse a number. 180 | return parse_num_val(str, pos) 181 | elseif first == end_delim then -- End of an object or array. 182 | return nil, pos + 1 183 | else -- Parse true, false, or null. 184 | local literals = { ["true"] = true, ["false"] = false, ["null"] = json.null } 185 | for lit_str, lit_val in pairs(literals) do 186 | local lit_end = pos + #lit_str - 1 187 | if str:sub(pos, lit_end) == lit_str then 188 | return lit_val, lit_end + 1 189 | end 190 | end 191 | local pos_info_str = "position " .. pos .. ": " .. str:sub(pos, pos + 10) 192 | error("Invalid json syntax starting at " .. pos_info_str) 193 | end 194 | end 195 | 196 | local function getGutenberg (id) 197 | local infourl = "https://gutendex.com/books/" .. id .. "/" 198 | local http 199 | if not pcall(function () 200 | http = require("socket.http") 201 | end) then 202 | SU.error("Install luasocket from luarocks") 203 | end 204 | local result, statuscode, _ = http.request(infourl) 205 | if statuscode ~= 200 then 206 | SU.error("Could not load catalogue from " .. infourl .. ": " .. statuscode) 207 | end 208 | local parsed = json.parse(result) 209 | if not parsed.formats then 210 | SU.error("Couldn't parse the JSON") 211 | end 212 | local tryFormats = { "text/plain", "text/plain; charset=utf-8" } 213 | local gotformat 214 | for i = 1, #tryFormats do 215 | local format = tryFormats[i] 216 | if parsed.formats[format] then 217 | gotformat = format 218 | end 219 | end 220 | if not gotformat then 221 | SU.error("Couldn't find a suitable format") 222 | end 223 | io.stderr:write("Downloading " .. parsed.title .. "... ") 224 | local contenturl = parsed.formats[gotformat] 225 | result, statuscode, _ = http.request(contenturl) 226 | if statuscode ~= 200 then 227 | SU.error("Could not load file from " .. contenturl .. ": " .. statuscode) 228 | end 229 | io.stderr:write("Done\n") 230 | local lines = {} 231 | local go = false 232 | for token in SU.gtoke(result, "\n") do 233 | local s = token.string or token.separator 234 | if s:match("***[ ]*END") then 235 | break 236 | end 237 | if go then 238 | table.insert(lines, s) 239 | end 240 | if s:match("***[ ]*START OF") then 241 | go = true 242 | end 243 | end 244 | return table.concat(lines, "") 245 | end 246 | 247 | function package:registerCommands () 248 | self:registerCommand("gutenberg", function (options, _) 249 | SU.required(options, "id") 250 | local text = getGutenberg(options.id) 251 | SILE.call("font", self.class:_fpOptions(options), { text }) 252 | end) 253 | end 254 | 255 | return package 256 | -------------------------------------------------------------------------------- /packages/fontproof/init.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local base = require("packages.base") 5 | 6 | local package = pl.class(base) 7 | package._name = "fontproof" 8 | 9 | local texts = require("packages.fontproof.texts") 10 | local groups = require("packages.fontproof.groups") 11 | 12 | -- Try and find a dictionary 13 | local dict = {} 14 | 15 | local function preload_dict (dictfile) 16 | if #dict == 0 then 17 | local f 18 | if dictfile then 19 | f = io.open(dictfile, "r") 20 | else 21 | f = io.open("/usr/share/dict/words", "r") 22 | if not f then 23 | f = io.open("/usr/dict/words", "r") 24 | end 25 | end 26 | if f then 27 | for line in f:lines() do 28 | line = line:gsub("\n", "") 29 | table.insert(dict, line) 30 | end 31 | else 32 | SU.error("Couldn't find a dictionary file to use") 33 | end 34 | end 35 | end 36 | 37 | local function processtext (str) 38 | local newstr = str 39 | local temp = str[1] 40 | if string.sub(temp, 1, 5) == "text_" then 41 | local textname = string.sub(temp, 6) 42 | if texts[textname] ~= nil then 43 | newstr[1] = texts[textname].text 44 | end 45 | end 46 | return newstr 47 | end 48 | 49 | local function shuffle_in_place (tbl) 50 | local size = #tbl 51 | for i = size, 1, -1 do 52 | local rand = math.random(size) 53 | tbl[i], tbl[rand] = tbl[rand], tbl[i] 54 | end 55 | end 56 | 57 | local function sizesplit (str) 58 | local sizes = {} 59 | for s in string.gmatch(str, "%w+") do 60 | if not string.find(s, "%a") then 61 | s = s .. "pt" 62 | end 63 | table.insert(sizes, s) 64 | end 65 | return sizes 66 | end 67 | 68 | local hasGlyph = function (g) 69 | local options = SILE.font.loadDefaults({}) 70 | local newItems = SILE.shapers.harfbuzz:shapeToken(g, options) 71 | for i = 1, #newItems do 72 | if newItems[i].gid > 0 then 73 | return true 74 | end 75 | end 76 | return false 77 | end 78 | 79 | function package:_init (options) 80 | base._init(self, options) 81 | end 82 | 83 | function package:registerCommands () 84 | self:registerCommand("adhesion", function (options, _) 85 | local chars = SU.required(options, "characters") 86 | local wordcount = options.wordcount or 120 87 | preload_dict(options.dict) 88 | shuffle_in_place(dict) 89 | local words = {} 90 | for _, word in ipairs(dict) do 91 | if wordcount == 0 then 92 | break 93 | end 94 | -- This is fragile. Would be better to check and escape. 95 | if word:match("^[" .. chars .. "]+$") then 96 | table.insert(words, word) 97 | wordcount = wordcount - 1 98 | end 99 | end 100 | SILE.call("font", self.class:_fpOptions(options), { table.concat(words, " ") .. "." }) 101 | end) 102 | 103 | self:registerCommand("basic", function (_, content) 104 | local options = self.class:_fpOptions() 105 | SILE.settings:temporarily(function () 106 | SILE.call("font", options, function () 107 | SILE.call("raggedright", {}, content) 108 | end) 109 | end) 110 | end) 111 | 112 | self:registerCommand("pattern", function (options, content) 113 | --SU.required(options, "reps") 114 | local chars = pl.stringx.split(options.chars, ",") 115 | local reps = pl.stringx.split(options.reps, ",") 116 | local format = options.format or "table" 117 | local size = options.size or self.class.options.size 118 | local cont = processtext(content)[1] 119 | local paras = {} 120 | if options.heading then 121 | SILE.call("subsection", {}, { options.heading }) 122 | else 123 | SILE.call("bigskip") 124 | end 125 | for i, _ in ipairs(chars) do 126 | local char, group = chars[i], reps[i] 127 | local gitems 128 | if string.sub(group, 1, 6) == "group_" then 129 | local groupname = string.sub(group, 7) 130 | gitems = SU.splitUtf8(groups[groupname]) 131 | else 132 | gitems = SU.splitUtf8(group) 133 | end 134 | local newcont = "" 135 | for r = 1, #gitems do 136 | if gitems[r] == "%" then 137 | gitems[r] = "%%" 138 | end 139 | local newstr = string.gsub(cont, char, gitems[r]) 140 | newcont = newcont .. char .. newstr 141 | end 142 | cont = newcont 143 | end 144 | if format == "table" then 145 | if chars[2] then 146 | paras = pl.stringx.split(cont, chars[2]) 147 | else 148 | table.insert(paras, cont) 149 | end 150 | elseif format == "list" then 151 | for _, c in ipairs(chars) do 152 | cont = string.gsub(cont, c, chars[1]) 153 | end 154 | paras = pl.stringx.split(cont, chars[1]) 155 | else 156 | table.insert(paras, cont) 157 | end 158 | for _, para in ipairs(paras) do 159 | for _, c in ipairs(chars) do 160 | para = string.gsub(para, c, " ") 161 | end 162 | SILE.call("proof", { size = size, type = "pattern" }, { para }) 163 | end 164 | end) 165 | 166 | self:registerCommand("patterngroup", function (options, content) 167 | SU.required(options, "name") 168 | local group = content[1] 169 | groups[options.name] = group 170 | end) 171 | 172 | self:registerCommand("pi", function (options, _) 173 | local digits = tonumber(options.digits) or 100 174 | digits = digits + 4 -- to match previous behaviour 175 | local pi = 176 | "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822" 177 | local pi_digits = pi:sub(1, digits) 178 | SILE.call("font", self.class:_fpOptions(), function () 179 | for i = 1, #pi_digits do 180 | SILE.typesetter:typeset(pi_digits:sub(i, i)) 181 | SILE.typesetter:pushPenalty({}) -- Ugly 182 | end 183 | end) 184 | end) 185 | 186 | -- special tests 187 | self:registerCommand("proof", function (options, content) 188 | local proof = {} 189 | local procontent = processtext(content) 190 | if options.type ~= "pattern" then 191 | if options.heading then 192 | SILE.call("subsection", {}, { options.heading }) 193 | else 194 | SILE.call("bigskip") 195 | end 196 | end 197 | if options.size then 198 | proof.sizes = sizesplit(options.size) 199 | else 200 | proof.sizes = { self.class.options.size } 201 | end 202 | if options.shapers then 203 | if SILE.settings.declarations["harfbuzz.subshapers"] then 204 | SILE.settings:set("harfbuzz.subshapers", options.shapers) 205 | else 206 | SU.warn("Can't use shapers on this version of SILE; upgrade!") 207 | end 208 | end 209 | SILE.call("color", options, function () 210 | for i = 1, #proof.sizes do 211 | SILE.settings:temporarily(function () 212 | local fontoptions = self.class:_fpOptions(options) 213 | fontoptions.size = proof.sizes[i] 214 | -- Pass on some options from \proof to \font. 215 | local tocopy = { "language", "direction", "script" } 216 | for j = 1, #tocopy do 217 | if options[tocopy[j]] then 218 | fontoptions[tocopy[j]] = options[tocopy[j]] 219 | end 220 | end 221 | -- Add feature options 222 | if options.featuresraw then 223 | fontoptions.features = options.featuresraw 224 | end 225 | if options.features then 226 | for j in SU.gtoke(options.features, ",") do 227 | if j.string then 228 | local feat = {} 229 | local _, _, k, v = j.string:find("(%w+)=(.*)") 230 | feat[k] = v 231 | SILE.call("add-font-feature", feat, {}) 232 | end 233 | end 234 | end 235 | SILE.call("font", fontoptions, {}) 236 | SILE.call("raggedright", {}, procontent) 237 | end) 238 | end 239 | end) 240 | end) 241 | 242 | self:registerCommand("unicharchart", function (options, _) 243 | local type = options.type or "all" 244 | local showheader = SU.boolean(options.showheader, true) 245 | local rows = tonumber(options.rows) or 16 246 | local columns = tonumber(options.columns) or 12 247 | local charsize = tonumber(options.charsize) or 14 248 | local usvsize = tonumber(options.usvsize) or 6 249 | local glyphs = {} 250 | local rangeStart 251 | local rangeEnd 252 | if type == "range" then 253 | rangeStart = tonumber(SU.required(options, "start"), 16) 254 | rangeEnd = tonumber(SU.required(options, "end"), 16) 255 | for cp = rangeStart, rangeEnd do 256 | local uni = SU.utf8charfromcodepoint(tostring(cp)) 257 | glyphs[#glyphs + 1] = { present = hasGlyph(uni), cp = cp, uni = uni } 258 | end 259 | else 260 | -- XXX For now, brute force inspect the glyph set 261 | local allglyphs = {} 262 | for cp = 0x1, 0xFFFF do 263 | allglyphs[#allglyphs + 1] = SU.utf8charfromcodepoint(tostring(cp)) 264 | end 265 | local s = table.concat(allglyphs, "") 266 | local shape_options = SILE.font.loadDefaults({}) 267 | local items = SILE.shapers.harfbuzz:shapeToken(s, shape_options) 268 | for i in ipairs(items) do 269 | local cp = SU.codepoint(items[i].text) 270 | if items[i].gid ~= 0 and cp > 0 then 271 | glyphs[#glyphs + 1] = { 272 | present = true, 273 | cp = cp, 274 | uni = items[i].text, 275 | } 276 | end 277 | end 278 | end 279 | local width = SILE.types.measurement("100%fw"):absolute() / columns 280 | local fontoptions = self.class:_fpOptions({ size = charsize }) 281 | local done = 0 282 | while done < #glyphs do 283 | -- header row 284 | if type == "range" and showheader then 285 | SILE.call("font", fontoptions, function () 286 | for j = 0, columns - 1 do 287 | local ix = done + j * rows 288 | local cp = rangeStart + ix 289 | if cp > rangeEnd then 290 | break 291 | end 292 | SILE.call("hbox") 293 | SILE.call("hbox", {}, function () 294 | local header = string.format("%04X", cp) 295 | local hexDigits = string.len(header) - 1 296 | SILE.typesetter:typeset(header:sub(1, hexDigits)) 297 | end) 298 | local nbox = SILE.typesetter.state.nodes[#SILE.typesetter.state.nodes] 299 | local centeringglue = SILE.types.node.glue((width - nbox.width) / 2) 300 | SILE.typesetter.state.nodes[#SILE.typesetter.state.nodes] = centeringglue 301 | SILE.typesetter:pushHorizontal(nbox) 302 | SILE.typesetter:pushGlue(centeringglue) 303 | SILE.call("hbox") 304 | end 305 | end) 306 | SILE.call("bigskip") 307 | SILE.call("hbox") 308 | end 309 | for i = 0, rows - 1 do 310 | for j = 0, columns - 1 do 311 | local ix = done + j * rows + i 312 | SILE.call("font", fontoptions, function () 313 | if glyphs[ix + 1] then 314 | local char = glyphs[ix + 1].uni 315 | if glyphs[ix + 1].present then 316 | local left = SILE.shaper:measureChar(char).width 317 | local centeringglue = SILE.types.node.glue((width - left) / 2) 318 | SILE.typesetter:pushGlue(centeringglue) 319 | SILE.typesetter:typeset(char) 320 | SILE.typesetter:pushGlue(centeringglue) 321 | else 322 | SILE.typesetter:pushGlue(width) 323 | end 324 | SILE.call("hbox") 325 | end 326 | end) 327 | end 328 | SILE.call("par") 329 | SILE.call("hbox") 330 | SILE.call("font", { size = usvsize }, function () 331 | for j = 0, columns - 1 do 332 | local ix = done + j * rows + i 333 | if glyphs[ix + 1] then 334 | SILE.call("hbox", {}, function () 335 | SILE.typesetter:typeset(string.format("%04X", glyphs[ix + 1].cp)) 336 | end) 337 | local nbox = SILE.typesetter.state.nodes[#SILE.typesetter.state.nodes] 338 | local centeringglue = SILE.types.node.glue((width - nbox.width) / 2) 339 | SILE.typesetter.state.nodes[#SILE.typesetter.state.nodes] = centeringglue 340 | SILE.typesetter:pushHorizontal(nbox) 341 | SILE.typesetter:pushGlue(centeringglue) 342 | SILE.call("hbox") 343 | end 344 | end 345 | end) 346 | SILE.call("bigskip") 347 | end 348 | SILE.call("pagebreak") 349 | done = done + rows * columns 350 | end 351 | end) 352 | end 353 | 354 | package.documentation = [[ 355 | \begin{document} 356 | \end{document} 357 | ]] 358 | 359 | return package 360 | -------------------------------------------------------------------------------- /packages/fontproof/texts.lua: -------------------------------------------------------------------------------- 1 | -- Copyright (C) 2016-2023 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local texts = {} 5 | 6 | -- basics 7 | texts["az"] = { text = "abcdefghijklmnopqrstuvwxyz" } 8 | texts["AZ"] = { text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" } 9 | texts["combdiacs"] = { text = "òóôõōŏȯöỏo̊őǒơọo̧ǫo̱o̿o͞oo͟o" } 10 | texts["spacingdiacs"] = { text = "oʼoˀoˆoˇoˉoˊoˋoˍo˗o˘o˙o˚o˛o˜o˝o" } 11 | 12 | -- numerals, symbols, punctuation 13 | texts["09"] = { text = "0123456789" } 14 | texts["numsym"] = { text = "01234567890#0¢0£0¤0¥0€0$0‰0%¹²³¼½¾" } 15 | texts["nummath"] = { text = "0−0~0+0±0≤0≥0<0=0>0≠0≈0×0÷0⁄0√0∞0∫0" } 16 | texts["symbols"] = { text = "∂µπ∆∏Π∑ΩΩ@&§◊†‡¶ {|}[\\](¦)«»‹›∅©®ªº™¬•" } 17 | texts["punct"] = { text = "x x x...x.x,x:x;x!x¡x?x¿x x'x\"x‘x’x‚x“x”x„x*x­x-x–x—x/x" } 18 | 19 | -- extended 20 | 21 | --pangrams 22 | texts["pangram"] = { text = "The quick brown fox jumps over the lazy dog" } 23 | 24 | -- UDHR 25 | 26 | -- kerning tests 27 | texts["arrowroot"] = { 28 | text = "Arrowroot Barley Chervil Dumpling Endive Flaxseed Garbanzo Hijiki Ishtu Jicama Kale Lychee Marjoram Nectarine Oxtail Pizza Quinoa Roquefort Squash Tofu Uppuma Vanilla Wheat Xergis Yogurt Zweiback", 29 | } 30 | texts["capslower"] = { 31 | text = "Another Aorta. Boastful Bnai. Contemporary Cnith. Donated Dry. Enough Eons. Forensic Fnord. Gneiss Gonads. Hospital Hnuh. Iodine India. Jon Jnada. Koala Knife. Lord Lning. More Mnemonics. None Nnung. Oops Onion. Pneumatic Portal. Queen. Roast Rnip. Sorted Snorted. Toast Tnanga. Unable Uove. Vocal Vning. Woven Wnoon. Xono Xnuno. Yokel Yngwe. Zoom Znana.", 32 | } 33 | texts["bringhurst"] = { 34 | text = "I “Ask Jeff” or ‘Ask Jeff’. Take the chef d’œuvre! Two of [of] (of) ‘of’ “of” of? of! of*. Ydes, Yffignac and Ygrande are in France: so are Ypres, Les Woëvres, the Fôret de Wœvres, the Voire and Vauvise. Yves is in heaven; D’Amboise is in jail. Lyford’s in Texas & L’Anse-aux-Griffons in Québec; the Łyna in Poland. Yriarte, Yciar and Ysaÿe are at Yale. Kyoto and Ryotsu are both in Japan, Kwikpak on the Yukon delta, Kvæven in Norway, Kyulu in Kenya, not in Rwanda.… Walton’s in West Virginia, but «Wren» is in Oregon. Tlálpan is near Xochimilco in México. The Zygos & Xylophagou are in Cyprus, Zwettl in Austria, Fænø in Denmark, the Vøringsfossen and Værøy in Norway. Tchula is in Mississippi, the Tittabawassee in Michigan. Twodot is here in Montana, Ywamun in Burma. Yggdrasil and Ymir, Yngvi and Vóden, Vídrið and Skeggjöld and Týr are all in the Eddas. Tørberget and Våg, of course, are in Norway, Ktipas and Tmolos in Greece, but Vázquez is in Argentina, Vreden in Germany, Von-Vincke-Straße in Münster, Vdovino in Russia, Ytterbium in the periodic table. Are Toussaint L’Ouverture, Wölfflin, Wolfe, Miłosz and Wū Wŭ all in the library? 1510–1620, 11:÷00 pm, and the 1980s are over.", 35 | } 36 | texts["allkernpairs"] = { 37 | text = "jw Shahjahanpur supercalifragilisticexpialidocious acquaintanceship dichlorodifluoromethane insightfulnesses jl Erzgebirge vx kx Overijssel solemnifying roofgarden boxberries fq substratosphere bxs Gewurztraminer disconnectedly jg Thanksgivings bugbears Allhallowmas labdanums pq adjt chymotrypsin sleepwalked kibitka awlworts unobjectionable sheqel magnetohydrodynamics anthropomorphize goldfields Chappaquiddick Moskva clxii misjudgment tx Panmunjom px earthquake outperform mx Netzahualcoyotl Skopje bandwidths clavicytherium clampdown zx convolvulaceous honeysuckle qf fz Gelbvieh succinylsulfathiazole sixfold bogtrotter subcultural pkwy eurhythmy Ecbatana qx jimjams cml crowfeet prajna Flaxman Kafkaesque weekday Reykjavik manoeuvrability Hochheimer sauerbraten cobwebby wv Schwarzkopf xrefs aftergrowth schnozzle Prokopyevsk Liederkranz eggplant abmho overwhelmingly wx Rajput machzor snuffboxes dumdum Fujiyama backgammon xk Qiqihar blowgun Oxycontin Tsongkhapa qv Bernbach qp syrinx blowzier Yellowknife halfheartedness abhenries Acrux exquisite qn fv Algonquian jf Karlsruhe switchgear syzygy nextdoor Mahfouz Iroquoian bq Houyhnhnm Berezniki vq Osmanli yukky vj tramroad vf jz cg zj duumvir Aduwa Vazquez Akbar Elroy newsflash xxxv colicweed bkcy Leipzig qt hdqrs Alzheimer Balikpapan fwd kudzu Fuzzbuster conferva mfd hamza Manxwoman Trabzon Bydgoszcz beachcomber jh qz pulpboard Fafnir wq acpt seqq qj Axum Ahvenanmaa qc Abner avdp cj Concepcion Freyja Albuquerque yq showjumping Geulincx mkt qk Artaxerxes Macdonald jct Bodhisattva baggywrinkle Jodhpur Fitzsimmons bpm qy Hoffman Arjuna foxglove Baroja jb Gujranwala Aramco Adkins zf kz exactness mtg gx cf qoph Cuxhaven Bradbury ql bevvy jq Azrael myxoedema evzone campground Cuthbert Aqaba disbandment qwerty qm Urumqi Oldcastle Bangweulu twayblade Chongjin Qingdao Amway Mazda crabgrass Betjeman zugzwang Dreyfus hryvnia Fitzpatrick sx qd xcvi Newcastle Sejm qg Avalokitesvara Ghazvanid pvt vb Bitolj Oxnard Shawwal Bigfoot Atbara xj Hovhaness dvandva fx Daugavpils vw Chongqing Beckford jx misdoubt Sumgait Catawba Iqbal Pfc Guadalquivir Bexley cotquean hx qs flexdollars kq dx Noxzema Altman Ayyubid dogvane Changchun Azikiwe Boltzmann vm Eijkman Gerlachovka fp hajj Novgorod Cowpens jy Avlona jv fjeld vc Ashkenazi Hypnos qh Nejd Procne Liebfraumilch", 38 | } 39 | texts["jafkerns"] = { 40 | text = "Tords,' stoweve fording, antlay,” ars. Tomplum Mateds,” Takedis,” dis: 365 nuting,” Gody, be contach art,' Int,” weed; any.' Debta,” fordifir,' beetwe's mulare. Tork. Willy. Lany,” Conal ar, Counta.” vacquilly-Chredis, thavel’s. A. Aphy,” may,” anted) ow,' Tary,” watedif,” ingly,” to Smaxon's,” ing,” Trated wayste.” Somy, ov, ated: Civedy,” (mumbee yedinvis velike,” ourecul at, Expora's aultea,' aw.' istach's joy,” Cam an’s,” istays.' Timate” ings.” droute,” Whys,” (Jullys,” Mureate,” ing.” Aughte. Any.' Tormal’s.” aporia; bear,' Suffeca’s fecute. Satted; bown) ack; ar, aves, we.' likey’s bablive,” ante,” whatiat,” townwelifix-dintom thaved dis, Peteduat’s,” by,” Medshey,” Whys.” is,” Tecompe watight.” throris.” ow,” sych) ardifing,” Takes.' stimpat,' win's,” rating).” Eveated; Finted; Rommunn’s really. Apost,' Eurcal’s for, Fightly,” Turtan atimplin's-storee,' In res.” stedur, Eur,” by,” othated” If Fords.” To-ort-co-Paurty,” autpon’s is. Hom).” Tabst,” ingete.” orthat,” sy.” Ashavin excedur, whys,” Grates.” Meturs,” aged” (ablinve.” istell; willumate,” difing.' wis,” for,” ontativ. Liffic.” staxte,” Treed) ovinte.” my. Pea, torece, Whypeat havelly,' res,” ate,” Accorlik,' thaw.' 'Butly,” thy,” Seared; edurun'stinvey,” aut wat, aw,” aving,” invoinuat.' - foo, andhamb, ought.” Cark: Tres beget’s way,” Jountim; thavoy,' havis ratedife,” worshat,” To thumply, unnumb. Foximun atight.” Hebt,” If, wily.” (abstual’s pated’s toodia. Behave,” ant.” con: Tarece,' (wiligan,' age,' Afteate,” Opte be.” (dur.” (ges,' Hinatto, pat ontly, angs,” (co, thaved” wary,” anked; hung,” istany.” tock,” arm: have.” ot; be) complin’t unton’s,” ing,” my.” Tur.' To parce,” ant,” Evisto, ing,” whavelve.' Intat-tedurd), th's quirs.” Irany,” ang.” ton plight,' arday.” Accongly; atedive,” Tecompla, frecon; cartat,” wought,” istures.” con’s ke,” Ovelf,” Geords,” Chumpla,” Souted comyst,” hirequal” hatedifir,” ang: Astapp. Fampeca.” Tay, an's wignavin; Ambeek,” Outhap. Nowilif, antedly,” inte.' whave,” Intive.” Inted” Bece” wily, Evoce,” frount’s.” thavel's,' is ornall: Accutc.” D.C. Amy.' Tow, ap. hanatin: my, ablist, Requir,” intedly.” Cativinn’s rods, sy,' thaves,” thatim’s vateave,” Pos, “abliblibe.” Pow,” invelf.” imparce,” atedur.' Troves,' hatech ing). 40 say,” int. Ming,” ifirs,” ont’s,” evellis, of th: “hatilivin toweatz, youreb. To-cornagratt,” Teauta,' Heatelie.” Uning.” th any,” ing.' thated; work: Tobjece.” beedur,” Duking, Jource.” Buromps,” Artant,” Tobjecat, Recant,” stint,” whis,” (affirob. Aftedia,” Tor.” Navell: antly.” (banatinna, intorat be.” Sys,' Contarry.” Ack,” complat.” tedirt, Intedis,” Offe,” ings,” by,” In than's.' Burvinte,” ox, Cypown's ally,” Atte,” al’s Islive wordre. To gly-Wely,' an argativing,” Sevathave.” Toduablin.” flative.' - Tecaught.' Toyear.' How glardia,” (forly. In als.' still pors.” body’s.” th’s tomakes.” tood ing: Stanth’s,” optedur, apeall), wordiump,” ontedin's,” whatia.' lim; any,” behavir, wrow,” wish thany,” Counte,” Use.” weeduang,” re.", 41 | } 42 | 43 | -- other excerpts 44 | texts["verne"] = { 45 | text = "Upon my arrival in New York several persons did me the honour of consulting me on the phenomenon in question. I had published in France a work in quarto, in two volumes, entitled Mysteries of the Great Submarine Grounds. This book, highly approved of in the learned world, gained for me a special reputation in this rather obscure branch of Natural History. My advice was asked. As long as I could deny the reality of the fact, I confined myself to a decided negative. But soon, finding myself driven into a corner, I was obliged to explain myself point by point. I discussed the question in all its forms, politically and scientifically; and I give here an extract from a carefully-studied article which I published in the number of the 30th of April. It ran as follows: After examining one by one the different theories, rejecting all other suggestions, it becomes necessary to admit the existence of a marine animal of enormous power. The great depths of the ocean are entirely unknown to us. Soundings cannot reach them. What passes in those remote depths—what beings live, or can live, twelve or fifteen miles beneath the surface of the waters—what is the organisation of these animals, we can scarcely conjecture. However, the solution of the problem submitted to me may modify the form of the dilemma. Either we do know all the varieties of beings which people our planet, or we do not. If we do NOT know them all—if Nature has still secrets in the deeps for us, nothing is more conformable to reason than to admit the existence of fishes, or cetaceans of other kinds, or even of new species, of an organisation formed to inhabit the strata inaccessible to soundings, and which an accident of some sort has brought at long intervals to the upper level of the ocean. If, on the contrary, we DO know all living kinds, we must necessarily seek for the animal in question amongst those marine beings already classed; and, in that case, I should be disposed to admit the existence of a gigantic narwhal. The common narwhal, or unicorn of the sea, often attains a length of sixty feet. Increase its size fivefold or tenfold, give it strength proportionate to its size, lengthen its destructive weapons, and you obtain the animal required. It will have the proportions determined by the officers of the Shannon, the instrument required by the perforation of the Scotia, and the power necessary to pierce the hull of the steamer. Indeed, the narwhal is armed with a sort of ivory sword, a halberd, according to the expression of certain naturalists. The principal tusk has the hardness of steel. Some of these tusks have been found buried in the bodies of whales, which the unicorn always attacks with success. Others have been drawn out, not without trouble, from the bottoms of ships, which they had pierced through and through, as a gimlet pierces a barrel. The Museum of the Faculty of Medicine of Paris possesses one of these defensive weapons, two yards and a quarter in length, and fifteen inches in diameter at the base.", 46 | } 47 | texts["verneCaps"] = { 48 | text = "UPON MY ARRIVAL IN NEW YORK SEVERAL PERSONS DID ME THE HONOUR OF CONSULTING ME ON THE PHENOMENON IN QUESTION. I HAD PUBLISHED IN FRANCE A WORK IN QUARTO, IN TWO VOLUMES, ENTITLED MYSTERIES OF THE GREAT SUBMARINE GROUNDS. THIS BOOK, HIGHLY APPROVED OF IN THE LEARNED WORLD, GAINED FOR ME A SPECIAL REPUTATION IN THIS RATHER OBSCURE BRANCH OF NATURAL HISTORY. MY ADVICE WAS ASKED. AS LONG AS I COULD DENY THE REALITY OF THE FACT, I CONFINED MYSELF TO A DECIDED NEGATIVE. BUT SOON, FINDING MYSELF DRIVEN INTO A CORNER, I WAS OBLIGED TO EXPLAIN MYSELF POINT BY POINT. I DISCUSSED THE QUESTION IN ALL ITS FORMS, POLITICALLY AND SCIENTIFICALLY; AND I GIVE HERE AN EXTRACT FROM A CAREFULLY-STUDIED ARTICLE WHICH I PUBLISHED IN THE NUMBER OF THE 30TH OF APRIL. IT RAN AS FOLLOWS: AFTER EXAMINING ONE BY ONE THE DIFFERENT THEORIES, REJECTING ALL OTHER SUGGESTIONS, IT BECOMES NECESSARY TO ADMIT THE EXISTENCE OF A MARINE ANIMAL OF ENORMOUS POWER. THE GREAT DEPTHS OF THE OCEAN ARE ENTIRELY UNKNOWN TO US. SOUNDINGS CANNOT REACH THEM. WHAT PASSES IN THOSE REMOTE DEPTHS—WHAT BEINGS LIVE, OR CAN LIVE, TWELVE OR FIFTEEN MILES BENEATH THE SURFACE OF THE WATERS—WHAT IS THE ORGANISATION OF THESE ANIMALS, WE CAN SCARCELY CONJECTURE. HOWEVER, THE SOLUTION OF THE PROBLEM SUBMITTED TO ME MAY MODIFY THE FORM OF THE DILEMMA. EITHER WE DO KNOW ALL THE VARIETIES OF BEINGS WHICH PEOPLE OUR PLANET, OR WE DO NOT. IF WE DO NOT KNOW THEM ALL—IF NATURE HAS STILL SECRETS IN THE DEEPS FOR US, NOTHING IS MORE CONFORMABLE TO REASON THAN TO ADMIT THE EXISTENCE OF FISHES, OR CETACEANS OF OTHER KINDS, OR EVEN OF NEW SPECIES, OF AN ORGANISATION FORMED TO INHABIT THE STRATA INACCESSIBLE TO SOUNDINGS, AND WHICH AN ACCIDENT OF SOME SORT HAS BROUGHT AT LONG INTERVALS TO THE UPPER LEVEL OF THE OCEAN. IF, ON THE CONTRARY, WE DO KNOW ALL LIVING KINDS, WE MUST NECESSARILY SEEK FOR THE ANIMAL IN QUESTION AMONGST THOSE MARINE BEINGS ALREADY CLASSED; AND, IN THAT CASE, I SHOULD BE DISPOSED TO ADMIT THE EXISTENCE OF A GIGANTIC NARWHAL. THE COMMON NARWHAL, OR UNICORN OF THE SEA, OFTEN ATTAINS A LENGTH OF SIXTY FEET. INCREASE ITS SIZE FIVEFOLD OR TENFOLD, GIVE IT STRENGTH PROPORTIONATE TO ITS SIZE, LENGTHEN ITS DESTRUCTIVE WEAPONS, AND YOU OBTAIN THE ANIMAL REQUIRED. IT WILL HAVE THE PROPORTIONS DETERMINED BY THE OFFICERS OF THE SHANNON, THE INSTRUMENT REQUIRED BY THE PERFORATION OF THE SCOTIA, AND THE POWER NECESSARY TO PIERCE THE HULL OF THE STEAMER. INDEED, THE NARWHAL IS ARMED WITH A SORT OF IVORY SWORD, A HALBERD, ACCORDING TO THE EXPRESSION OF CERTAIN NATURALISTS. THE PRINCIPAL TUSK HAS THE HARDNESS OF STEEL. SOME OF THESE TUSKS HAVE BEEN FOUND BURIED IN THE BODIES OF WHALES, WHICH THE UNICORN ALWAYS ATTACKS WITH SUCCESS. OTHERS HAVE BEEN DRAWN OUT, NOT WITHOUT TROUBLE, FROM THE BOTTOMS OF SHIPS, WHICH THEY HAD PIERCED THROUGH AND THROUGH, AS A GIMLET PIERCES A BARREL. THE MUSEUM OF THE FACULTY OF MEDICINE OF PARIS POSSESSES ONE OF THESE DEFENSIVE WEAPONS, TWO YARDS AND A QUARTER IN LENGTH, AND FIFTEEN INCHES IN DIAMETER AT THE BASE.", 49 | } 50 | texts["revEng"] = { 51 | text = "After this I looked and there before me was a great multitude that no-one could count, from every nation, tribe, people and language, standing before the throne and in front of the Lamb. They were wearing white robes and were holding palm branches in their hands. and they cried out in a loud voice: Salvation belongs to our God, who sits on the throne, and to the Lamb. All the angels were standing round the throne and around the elders and the four living creatures. They fell down on their faces before the throne and worshipped God, saying: Amen! Praise and glory and wisdom and thanks and honour and power and strength be to our God for ever and ever. Amen!", 52 | } 53 | texts["revFin"] = { 54 | text = "Tämän jälkeen minä näin, ja katso, oli suuri joukko, jota ei kukaan voinut lukea, kaikista kansanheimoista ja sukukunnista ja kansoista ja kielistä, ja ne seisoivat valtaistuimen edessä ja Karitsan edessä puettuina pitkiin valkeihin vaatteisiin, ja heillä oli palmut käsissään, ja he huusivat suurella äänellä sanoen: Pelastus tulee meidän Jumalaltamme, joka valtaistuimella istuu, ja Karitsalta. Ja kaikki enkelit seisoivat piirissä valtaistuimen ja vanhinten ja neljän olennon ympärillä ja lankesivat kasvoilleen valtaistuimen eteen ja kumartaen rukoilivat Jumalaa, sanoen: Amen! Ylistys ja kirkkaus ja viisaus ja kiitos ja kunnia ja voima ja väkevyys meidän Jumalallemme aina ja iankaikkisesti, amen!", 55 | } 56 | texts["revGer"] = { 57 | text = "Nach diesem sah ich: und siehe, eine große Volksmenge, welche niemand zählen konnte, aus jeder Nation und aus Stämmen und Völkern und Sprachen, und sie standen vor dem Throne und vor dem Lamme, bekleidet mit weißen Gewändern, und Palmen waren in ihren Händen. Und sie rufen mit lauter Stimme und sagen: Das Heil unserem Gott, der auf dem Throne sitzt, und dem Lamme! Und alle Engel standen um den Thron her und um die Ältesten und die vier lebendigen Wesen, und sie fielen vor dem Throne auf ihre Angesichter und beteten Gott an und sagten: Amen! die Segnung und die Herrlichkeit und die Weisheit und die Danksagung und die Ehre und die Macht und die Stärke unserem Gott in die Zeitalter der Zeitalter! Amen.", 58 | } 59 | texts["revDut"] = { 60 | text = "Na dezen zag ik, en ziet, een grote schare, die niemand tellen kon, uit alle natie, en geslachten, en volken, en talen, staande voor den troon, en voor het Lam, bekleed zijnde met lange witte klederen, en palm takken waren in hun handen. En zij riepen met grote stem, zeggende: De zaligheid zij onzen God, Die op den troon zit, en het Lam. En al de engelen stonden rondom den troon, en rondom de ouderlingen en de vier dieren; en vielen voor den troon neder op hun aangezicht, en aanbaden God, Zeggende: Amen. De lof, en de heerlijkheid, en de wijsheid, en de dankzegging, en de eer, en de kracht, en de sterkte zij onzen God in alle eeuwigheid. Amen.", 61 | } 62 | texts["revInd"] = { 63 | text = "Sesudah itu saya melihat lagi, lalu nampak lautan manusia yang luar biasa banyaknya--tidak ada seorang pun yang dapat menghitung jumlahnya. Mereka adalah orang-orang dari setiap bangsa, suku, negara, dan bahasa. Dengan berpakaian jubah yang putih-putih dan dengan memegang dahan-dahan pohon palem di tangan, orang-orang banyak itu berdiri menghadap takhta dan menghadap Anak Domba itu. Lalu dengan suara yang kuat mereka berseru, Keselamatan kita datangnya dari Allah kita, yang duduk di atas takhta, dan dari Anak Domba itu! Semua malaikat berdiri mengelilingi takhta dan para pemimpin serta keempat makhluk itu. Malaikat-malaikat itu tersungkur di depan takhta lalu menyembah Allah. Mereka berseru, Amin! Terpujilah Allah kita yang agung dan bijaksana. Ia patut dilimpahi ucapan-ucapan syukur dan penghormatan. Ia berkuasa dan kuat untuk selama-lamanya! Amin.", 64 | } 65 | texts["revSwa"] = { 66 | text = "Kisha nikatazama, nikaona umati mkubwa wa watu wasiohesabika: watu wa kila taifa, ukoo, jamaa na lugha. Nao walikuwa wamesimama mbele ya kiti cha enzi na mbele ya Mwanakondoo, wakiwa wamevaa mavazi meupe na kushika matawi ya mitende mikononi mwao. Wakapaaza sauti: Ukombozi wetu watoka kwa Mungu wetu aketiye juu ya kiti cha enzi, na kutoka kwa Mwanakondoo! Malaika wote wakasimama kukizunguka kiti cha enzi, wazee na vile viumbe hai vinne. Wakaanguka kifudifudi mbele ya kiti cha enzi, wakamwabudu Mungu, wakisema, Amina! Sifa, utukufu, hekima, shukrani, heshima, uwezo na nguvu viwe kwa Mungu wetu, milele na milele! Amina!", 67 | } 68 | 69 | return texts 70 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.0-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.0-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.0" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2", 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 32 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua" 34 | }, 35 | install = { 36 | lua = { 37 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 38 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 39 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 40 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 41 | }, 42 | bin = { 43 | fontproof = "src/fontproof.lua" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.1-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.1-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.1" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2", 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua" 35 | }, 36 | install = { 37 | lua = { 38 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 39 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 40 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 41 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 42 | }, 43 | bin = { 44 | fontproof = "src/fontproof.lua" 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.10-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.10-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.10" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.11-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.11-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.11" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.2-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.2-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.2" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua" 35 | }, 36 | install = { 37 | lua = { 38 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 39 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 40 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 41 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 42 | }, 43 | bin = { 44 | fontproof = "src/fontproof.lua" 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.3-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.3-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.3" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.4-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.4-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.4" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.5-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.5-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.5" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.6-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.6-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.6" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.7-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.7-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.7" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.8-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.8-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.8" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.0.9-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.0.9-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.0.9" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.1.0-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.1.0-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.1.0" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.0-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.0-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.0" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.1-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.1-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.1" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.2-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.2-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.2" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.3-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.3-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.3" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.4-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.4-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.4" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-2.2.5-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "2.2.5-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v2.2.5" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0-2" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-3.0.0-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "3.0.0-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v3.0.0" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0.2-1" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-3.0.1-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "3.0.1-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v3.0.1" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0.2-1" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-3.0.2-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "3.0.2-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v3.0.2" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0.2-1" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /rockspecs/fontproof-3.0.3-1.rockspec: -------------------------------------------------------------------------------- 1 | rockspec_format = "1.0" 2 | package = "fontproof" 3 | version = "3.0.3-1" 4 | 5 | source = { 6 | url = "git+https://github.com/sile-typesetter/fontproof.git", 7 | dir = "fontproof", 8 | tag = "v3.0.3" 9 | } 10 | 11 | description = { 12 | summary = "A font design testing class for SILE", 13 | detailed = [[FontProof enables you to produce PDF font test documents without 14 | fiddling with InDesign or other manual page layout or word 15 | processing programs. You can apply one of the predesigned test 16 | documents (to be added later) or use FontProof to build your own 17 | custom font test document.]], 18 | license = "MIT", 19 | homepage = "https://github.com/sile-typesetter/fontproof", 20 | } 21 | 22 | dependencies = { 23 | "lua >= 5.1", 24 | "lua_cliargs == 3.0.2-1" 25 | } 26 | 27 | build = { 28 | type = "builtin", 29 | modules = { 30 | ["sile.classes.fontproof"] = "classes/fontproof/init.lua", 31 | ["sile.packages.fontproof"] = "packages/fontproof/init.lua", 32 | ["sile.packages.fontproof.groups"] = "packages/fontproof/groups.lua", 33 | ["sile.packages.fontproof.gutenberg"] = "packages/fontproof/gutenberg.lua", 34 | ["sile.packages.fontproof.texts"] = "packages/fontproof/texts.lua", 35 | ["sile.packages.fontproof.templates.locator"] = "templates/locator.lua" 36 | }, 37 | install = { 38 | lua = { 39 | ["sile.packages.fontproof.templates.full"] = "templates/full.sil", 40 | ["sile.packages.fontproof.templates.gutenberg"] = "templates/gutenberg.sil", 41 | ["sile.packages.fontproof.templates.test"] = "templates/test.sil", 42 | ["sile.packages.fontproof.templates.unichar"] = "templates/unichar.sil" 43 | }, 44 | bin = { 45 | fontproof = "src/fontproof.lua" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/fontproof.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | local cliargs = require("cliargs") 5 | 6 | local sile = os.getenv("SILE") or "sile" 7 | 8 | local print_version = function () 9 | os.execute(sile .. " --version") 10 | local res, loader = pcall(require, "luarocks.loader") 11 | print("FontProof installed from rockspec " .. (res and loader.context.fontproof or "UNKNOWN")) 12 | os.exit(0) 13 | end 14 | 15 | cliargs:set_name("fontproof") 16 | cliargs:set_description([[ 17 | FontProof enables you to produce PDF font test documents without fiddling with InDesign or other manual page layout 18 | or word processing programs. You can apply one of the predesigned test documents or use FontProof to build your own 19 | custom font test document. 20 | ]]) 21 | cliargs:option("-F, --family=VALUE", "Specify the font to be tested as a family name (ignored if --filename used)") 22 | cliargs:option("-f, --filename=VALUE", "Specify the font to be tested as a path to a font file") 23 | cliargs:option("-o, --output=FILE", "output file name") 24 | cliargs:option("-p, --features=VALUE", "Specify the test font features") 25 | cliargs:option("-s, --size=VALUE", "Specify the test font size") 26 | cliargs:option("-S, --style=VALUE", "Specify the test font style (ignored if --filename used)") 27 | cliargs:option("-t, --template=VALUE", "Use the bundled template by name (full, gutenberg, test, unichar);") 28 | cliargs:option("-w, --weight=VALUE", "Specify the test font weight (ignored if --filename used)") 29 | cliargs:flag("-h, --help", "display this help, then exit") 30 | cliargs:flag("-v, --version", "display version information, then exit", print_version) 31 | cliargs:splat("SILEARGS", "All remaining args are passed directly to SILE", nil, 999) 32 | 33 | local opts, parse_err = cliargs:parse(_G.arg) 34 | 35 | if not opts and parse_err then 36 | print(parse_err) 37 | local code = parse_err:match("^Usage:") and 0 or 1 38 | os.exit(code) 39 | end 40 | 41 | local templatedir = require("sile.packages.fontproof.templates.locator")() 42 | 43 | local family = opts.family and ("-e '_fpFamily=\"%s\"'"):format(opts.family) or "" 44 | local features = opts.features and ("-e '_fpFeatures=\"%s\"'"):format(opts.features) or "" 45 | local filename = opts.filename and ("-e '_fpFilename=\"%s\"'"):format(opts.filename) or "" 46 | local output = ("-o %s"):format(opts.output or "fontproof.pdf") 47 | local size = opts.size and ("-e '_fpSize=\"%s\"'"):format(opts.size) or "" 48 | local style = opts.style and ("-e '_fpStyle=\"%s\"'"):format(opts.style) or "" 49 | local template = opts.template and ("%s%s.sil"):format(templatedir, opts.template) or "" 50 | local weight = opts.weight and ("-e '_fpWeight=\"%s\"'"):format(opts.weight) or "" 51 | local args = opts.SILEARGS and table.concat(opts.SILEARGS, " ") or "" 52 | 53 | local ret, status, signal = 54 | os.execute(table.concat({ sile, filename, family, style, weight, size, features, output, args, template }, " ")) 55 | 56 | if status == "exit" then -- PUC Lua 57 | os.exit(signal) 58 | elseif status == "signal" then -- PUC Lua 59 | error(("Interrupted with signal %s"):format(signal)) 60 | os.exit(1) 61 | elseif type(ret) == "number" then -- LuaJIT 62 | os.exit(ret) 63 | else 64 | error("Unknown error encountered trying to run SILE") 65 | os.exit(1) 66 | end 67 | -------------------------------------------------------------------------------- /templates/full.sil: -------------------------------------------------------------------------------- 1 | % SPDX-FileCopyrightText: © 2016 SIL International 2 | % SPDX-License-Identifier: MIT 3 | 4 | \begin[class=fontproof]{document} 5 | \section{Main section head} 6 | 7 | Text under main section head 8 | 9 | \subsection{Subsection head} 10 | 11 | Text under subsection head 12 | 13 | \section{Example proof texts} 14 | 15 | \proof{This is basic proof text using the test font and with no heading} 16 | 17 | %\proof[size="10pt",filename="packages/fontproofsupport/Lato2OFL/Lato-Light.ttf",heading=A basic test]{This is another basic text with common parameters} 18 | 19 | \proof[size="10pt,11pt,12pt,16pt",heading=A simple waterfall]{This is basic proof text in a range of sizes} 20 | 21 | \proof[size="10,11,12,16",heading=Another simple waterfall]{This is basic proof text in a range of sizes defined with numbers only} 22 | 23 | \proof[size="18,24,30,36",heading=Using a built-in text]{text_az} 24 | 25 | \section{Example pattern texts} 26 | 27 | \pattern[chars="@",reps="abcd",heading=A simple hobonop]{h@o@b@o@n@o@p} 28 | \pattern[chars="i",reps="abcd",format="list",heading=Using a built-in frame]{text_pangram} 29 | 30 | \pattern[chars="@,#",reps="abc,xy",heading=A default pattern]{oo@#oo} 31 | \pattern[chars="@,#",reps="abc,xy",format="table",heading=A pattern with explicit table format]{oo@#oo} 32 | \pattern[chars="@,#",reps="abc,xy",format="list",heading=A pattern with explicit list format]{oo@#oo} 33 | \pattern[chars="@,#",reps="abc,xy",format="para",heading=A pattern with explicit para format]{oo@#oo} 34 | 35 | \patterngroup[name="vowels"]{aeiou} 36 | \pattern[chars="@,#",reps="group_vowels,xy",format="table",heading=A pattern using a group]{oo@#oo} 37 | \pattern[chars="@,#",reps="group_09,0123456789",format="table",heading=A pattern using one of the predefined groups]{00@#00} 38 | 39 | \section{Other tests} 40 | 41 | Adhesion: \adhesion[characters=adhesion] 42 | 43 | \bigskip 44 | 45 | Here are some digits of pi: \pi[digits=500] 46 | 47 | %\setTestFont[family="EB Garamond"] 48 | %\proof[features = "Ligatures=Discretionary, Ligatures=Historic",language = "grk",direction = "rtl",shapers = "ot", color="green"]{This Turns on Historical Features} 49 | %\setTestFont[family="Georgia"] 50 | 51 | \section{Built-in SILE commands} 52 | 53 | \begin{basic} 54 | \pangrams 55 | \lorem[words=100] 56 | \repertoire 57 | \end{basic} 58 | \end{document} 59 | -------------------------------------------------------------------------------- /templates/gutenberg.sil: -------------------------------------------------------------------------------- 1 | % SPDX-FileCopyrightText: © 2016 SIL International 2 | % SPDX-License-Identifier: MIT 3 | 4 | \begin[class=fontproof]{document} 5 | \use[module=packages.fontproof.gutenberg] 6 | \set[parameter=document.parskip,value=12pt plus 2pt minus 2pt] 7 | \gutenberg[id=32549] 8 | 9 | %\set[parameter=document.parskip,value=2pt] 10 | %\setTestFont[family="Murty Telugu"] 11 | %\gutenberg[id=39561] 12 | \end{document} 13 | -------------------------------------------------------------------------------- /templates/locator.lua: -------------------------------------------------------------------------------- 1 | -- SPDX-FileCopyrightText: © 2016 SIL International 2 | -- SPDX-License-Identifier: MIT 3 | 4 | -- Help the CLI locate template files wherever LuaRocks stashes them 5 | return function () 6 | local src = debug.getinfo(1, "S").source:sub(2) 7 | local base = src:match("(.*[/\\])") 8 | return base 9 | end 10 | -------------------------------------------------------------------------------- /templates/test.sil: -------------------------------------------------------------------------------- 1 | % SPDX-FileCopyrightText: © 2016 SIL International 2 | % SPDX-License-Identifier: MIT 3 | 4 | \begin[class=fontproof]{document} 5 | Welcome to FontProof! 6 | 7 | \basic{Set in the test font.} 8 | \end{document} 9 | -------------------------------------------------------------------------------- /templates/unichar.sil: -------------------------------------------------------------------------------- 1 | % SPDX-FileCopyrightText: © 2016 SIL International 2 | % SPDX-License-Identifier: MIT 3 | 4 | \begin[class=fontproof]{document} 5 | \section{Range test} 6 | 7 | \unicharchart[type=range,start=0100,end=01F7] 8 | \unicharchart[type=range,start=1D500,end=1D51F] 9 | 10 | %\font[size=30pt,weight=700]{Repertoire test}\par 11 | %\unicharchart[type=all] 12 | \end{document} 13 | --------------------------------------------------------------------------------