summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/mkcharacters156
-rwxr-xr-xscripts/mkglyphlist176
-rwxr-xr-xscripts/mkstatus173
-rwxr-xr-xscripts/mktests311
4 files changed, 816 insertions, 0 deletions
diff --git a/scripts/mkcharacters b/scripts/mkcharacters
new file mode 100755
index 0000000..abed2c9
--- /dev/null
+++ b/scripts/mkcharacters
@@ -0,0 +1,156 @@
+#!/usr/bin/env texlua
+-----------------------------------------------------------------------
+-- FILE: mkcharacters.lua
+-- USAGE: ./mkcharacters.lua
+-- DESCRIPTION: import parts of char-def.lua
+-- REQUIREMENTS: lua, ConTeXt, the lualibs package
+-- AUTHOR: Philipp Gesang (Phg), <phg42.2a@gmail.com>
+-- VERSION: 2.5
+-- MODIFIED: 2014-02-11 07:24:25+0100
+-----------------------------------------------------------------------
+-- we create a stripped-down version of char-def.lua
+-----------------------------------------------------------------------
+
+-----------------------------------------------------------------------
+-- config
+-----------------------------------------------------------------------
+local charfile = "./build/luaotfload-characters.lua"
+local chardef = "/home/phg/base/char-def.lua"
+
+--- for every code point char-def.lua provides a set of fields. they
+--- are:
+---
+--- * adobename
+--- * category
+--- * cjkwd
+--- * comment
+--- * contextname
+--- * description
+--- * direction
+--- * lccode
+--- * linebreak
+--- * mathclass
+--- * mathextensible
+--- * mathfiller
+--- * mathname
+--- * mathspec
+--- * mathstretch
+--- * mathsymbol
+--- * mirror
+--- * shcode
+--- * specials
+--- * textclass
+--- * uccode
+--- * unicodeslot
+--- * variants
+
+local import = {
+ "direction", "mirror", --> πολυγλωσσία/uax9
+ "category", --> https://gist.github.com/phi-gamma/5812290
+ "textclass", --> https://gist.github.com/phi-gamma/6488187
+}
+
+-----------------------------------------------------------------------
+-- includes
+-----------------------------------------------------------------------
+
+kpse.set_program_name"luatex"
+
+for _, lib in next, { "lualibs-lua.lua",
+ "lualibs-lpeg.lua",
+ "lualibs-table.lua", } do
+ local found = assert(kpse.find_file(lib, "lua"),
+ "Could not locate " .. lib .. ".\n"
+ .. "Please install the lualibs package.")
+ require(found)
+end
+
+if not (chardef and lfs.isfile(chardef)) then
+ --- we could grab the file from contextgarden but as Context is part
+ --- of TL it’s not worth bothering
+ chardef = assert(kpse.find_file("char-def.lua", "lua"),
+ "Could not find ConTeXt.")
+end
+
+-----------------------------------------------------------------------
+-- functionality
+-----------------------------------------------------------------------
+
+local get_characters = function ( )
+ local data
+ local inchan = io.open(chardef, "r")
+ if not inchan then
+ io.write("Could not open file for reading: "..chardef.."\n.")
+ goto fail
+ end
+ data = inchan:read "*all"
+ inchan:close()
+ data = loadstring(data)
+ if data then
+ data() --> characters.data
+ data = nil
+ collectgarbage "collect"
+ if characters.data and next(characters.data) then
+ return characters.data
+ end
+ io.write "Character table empty.\n"
+ goto fail
+ end
+ io.write(chardef .. " is not a valid Lua file.\n")
+ ::fail::
+ io.write "Emergency exit.\n"
+ os.exit(1)
+end
+
+local extract_fields_indeed
+extract_fields_indeed = function (data, acc, lastidx)
+ local idx, char = next(data, lastidx)
+ if idx then
+ local imported = { }
+ for i=1, #import do
+ local field = import[i]
+ imported[field] = char[field]
+ end
+ acc[idx] = imported
+ return extract_fields_indeed(data, acc, idx)
+ end
+ return acc
+end
+
+local extract_fields = function (data)
+ return extract_fields_indeed(data, {}, nil)
+end
+
+local writedata = function (data)
+ local outchan = io.open(charfile, "w")
+ if not outchan then
+ io.write("Could not open "..charfile.." for writing.\n")
+ return false
+ end
+ outchan:write(data)
+ outchan:close()
+ return true
+end
+
+do
+ local chardata = get_characters()
+ local stripped = extract_fields(chardata)
+ local serialized = table.serialize(stripped, true, {
+ compact = true,
+ noquotes = true,
+ hexify = true, --- for consistency with char-def
+ })
+ if writedata(serialized) then
+ goto done
+ end
+ goto fail
+end
+
+::done::
+ os.exit(0)
+
+::fail::
+ io.write "Emergency exit.\n"
+ os.exit(1)
+
+--- vim:ft=lua:ts=2:et:sw=2
diff --git a/scripts/mkglyphlist b/scripts/mkglyphlist
new file mode 100755
index 0000000..8fde098
--- /dev/null
+++ b/scripts/mkglyphlist
@@ -0,0 +1,176 @@
+#!/usr/bin/env texlua
+-----------------------------------------------------------------------
+-- FILE: mkglyphlist.lua
+-- USAGE: ./mkglyphlist.lua
+-- DESCRIPTION: part of the luaotfload package
+-- REQUIREMENTS: lua, lpeg, luasocket, the lualibs package
+-- AUTHOR: Philipp Gesang (Phg), <phg42.2a@gmail.com>
+-- VERSION: 2.5
+-- MODIFIED: 2014-02-11 06:44:50+0100
+-----------------------------------------------------------------------
+-- interesting thread on the Context list:
+-- http://www.ntg.nl/pipermail/ntg-context/2008/029057.html
+--
+-- N.B. this script assumes network connectivity!
+-----------------------------------------------------------------------
+
+
+-----------------------------------------------------------------------
+-- config
+-----------------------------------------------------------------------
+local glyphfile = "./build/glyphlist.txt"
+local font_age = "./build/luaotfload-glyphlist.lua"
+local glyph_source = "http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt"
+
+-----------------------------------------------------------------------
+-- fallbacks
+-----------------------------------------------------------------------
+--- Hans adds a small list of mappings that are not in the original
+--- glyph list but seem to be normalizations of some sort. I trust his
+--- experience, so I’ll just include them here. Background:
+--- http://www.ntg.nl/pipermail/ntg-context/2013/073089.html
+
+local fallbacks = {
+ ["SF10000"]=9484, ["SF20000"]=9492, ["SF30000"]=9488,
+ ["SF40000"]=9496, ["SF50000"]=9532, ["SF60000"]=9516,
+ ["SF70000"]=9524, ["SF80000"]=9500, ["SF90000"]=9508,
+ ["afii208"]=8213,
+}
+
+-----------------------------------------------------------------------
+-- includes
+-----------------------------------------------------------------------
+require"lpeg"
+require"socket"
+
+kpse.set_program_name"luatex"
+for _, lib in next, { "lualibs-lua.lua",
+ "lualibs-lpeg.lua",
+ "lualibs-table.lua", } do
+ local found = assert(kpse.find_file(lib, "lua"),
+ "Could not locate " .. lib)
+ require(found)
+end
+
+local C, Cf, Cg, Ct, P, R =
+ lpeg.C, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.R
+
+local http = socket.http
+
+-----------------------------------------------------------------------
+-- functionality
+-----------------------------------------------------------------------
+
+local dec_of_hex = function (hex) return tonumber(hex, 16) end
+
+local separator = P";"
+local gartenzaun = P"#"
+local eol = P"\n\r" + P"\r\n" + P"\r" + P"\n"
+local space = P" "
+local alphanum = R("az", "AZ", "09")
+local hexdigit = R("af", "AF", "09")
+local eof_tag = gartenzaun * P"--end"
+local header_line = gartenzaun * (1-eol)^0 * eol
+local codepoint = hexdigit^1
+local glyphname = alphanum^1
+
+local definition = Cg(C(glyphname) * separator * (C(codepoint)/ dec_of_hex))
+ --- With combined glyphs we take only the first
+ --- value as char-def and font-age do, and skip
+ --- the rest.
+ * (space * codepoint)^0
+ * eol
+local definitions = Cf(Ct"" * definition^1, rawset)
+
+local p_glyphs = header_line^0 * definitions * eof_tag
+
+local get_glyphs = function (data)
+ local res = lpeg.match(p_glyphs, data)
+ if not res then
+ print("error: could not parse glyph list")
+ os.exit(-1)
+ end
+ for name, glyph in next, fallbacks do
+ res[name] = res[name] or glyph
+ end
+ return res
+end
+
+local file_header = [==[
+if not modules then modules = { } end modules ["font-age"] = {
+ version = 2.400,
+ comment = "part of the luaotfload package",
+ author = "luaotfload team / mkglyphlist",
+ copyright = "derived from %s",
+ original = "Adobe Glyph List, version 2.0, September 20, 2002",
+ dataonly = true,
+}
+
+if context then
+ logs.report("fatal error","this module is not for context")
+ os.exit(-1)
+end
+
+--[[doc--
+Everything below has been autogenerated. Run mkglyphlist to rebuild
+luaotfload-glyphlist.lua.
+--doc]]--
+
+]==]
+
+local writedata = function (data)
+ data = table.serialize(data, true)
+ data = string.format(file_header, glyph_source) .. data
+ local fh = io.open(font_age, "wb")
+ if not fh then
+ print(string.format("error: %s not writable", font_age))
+ os.exit(-1)
+ end
+ print(string.format("saving %d bytes to %s", #data, font_age))
+ fh:write(data)
+ fh:close()
+end
+
+
+local get_raw get_raw = function (retry)
+ local fh = io.open(glyphfile, "rb")
+ if fh then
+ print ("info: reading glyph list from", glyphfile)
+ local data = fh:read"*all"
+ fh:close()
+ if data then return data end
+ elseif not retry then --- attempt download
+ print"info: retrieving glyph list from"
+ print(glyph_source)
+ local glyphdata = http.request(glyph_source)
+ if glyphdata then
+ local fh = io.open(glyphfile, "wb")
+ if not fh then
+ print (string.format ("error: glyph file (%s) not writable", glyphfile))
+ os.exit(-1)
+ end
+ fh:write(glyphdata)
+ fh:close()
+ return get_raw(true)
+ end
+ print"error: download failed"
+ os.exit(-1)
+ end
+ print("error: could not obtain glyph data from "..glyphfile)
+ os.exit(-1)
+end
+
+local main = function ()
+ if arg[1] then glyphfile = arg[1] end
+ if arg[2] then font_age = arg[2] end
+
+ local data = get_raw()
+ local parsed = get_glyphs(data)
+ writedata(parsed)
+ return 0
+end
+
+
+return main()
+
+--- vim:ft=lua:ts=2:et:sw=2
diff --git a/scripts/mkstatus b/scripts/mkstatus
new file mode 100755
index 0000000..15cb97c
--- /dev/null
+++ b/scripts/mkstatus
@@ -0,0 +1,173 @@
+#!/usr/bin/env texlua
+-----------------------------------------------------------------------
+-- FILE: mkstatus.lua
+-- USAGE: ./mkstatus.lua
+-- DESCRIPTION: writes the repository state
+-- REQUIREMENTS: luatex, the lualibs package
+-- AUTHOR: Philipp Gesang (Phg), <phg42.2a@gmail.com>
+-- VERSION: 1.0
+-- CREATED: 2013-07-07 14:01:12+0200
+-----------------------------------------------------------------------
+--
+-- This script generates a list of hashes that serves as the input
+-- for the file integrity check (option --diagnose). md5 is all we can
+-- assume in Luatex, so it’s really only a superficial test.
+
+kpse.set_program_name "luatex"
+
+local md5 = require "md5"
+
+require "lualibs"
+
+local stringformat = string.format
+local md5sumhexa = md5.sumhexa
+local ioloaddata = io.loaddata
+local iosavedata = io.savedata
+local iopopen = io.popen
+local iowrite = io.write
+local lfsisdir = lfs.isdir
+
+-----------------------------------------------------------------------
+-- settings
+-----------------------------------------------------------------------
+
+local verbose = false
+local filelist = "./build/luaotfload-status.lua" --- result
+
+local names = {
+ --- only the runtime files and scripts
+ { "src", "luaotfload-auxiliary.lua", },
+ { "src", "luaotfload-basics-gen.lua", },
+ { "src", "luaotfload-basics-nod.lua", },
+ { "build", "luaotfload-characters.lua", },
+ { "src", "luaotfload-colors.lua", },
+ { "src", "luaotfload-database.lua", },
+ { "src", "luaotfload-diagnostics.lua", },
+ { "src", "luaotfload-features.lua", },
+ { "src", "luaotfload-fonts-cbk.lua", },
+ { "src", "luaotfload-fonts-def.lua", },
+ { "src", "luaotfload-fonts-enc.lua", },
+ { "src", "luaotfload-fonts-ext.lua", },
+ { "src", "luaotfload-fonts-lua.lua", },
+ { "src", "luaotfload-fonts-tfm.lua", },
+ { "build", "luaotfload-glyphlist.lua", },
+ { "src", "luaotfload-letterspace.lua", },
+ { "src", "luaotfload-loaders.lua", },
+ { "src", "luaotfload-log.lua", },
+ { "src", "luaotfload-main.lua", },
+ { "src", "luaotfload-fontloader.lua", },
+ { "src", "luaotfload-override.lua", },
+ { "src", "luaotfload-parsers.lua", },
+ { "src", "luaotfload-tool.lua", },
+ { "scripts", "mkcharacters", },
+ { "scripts", "mkglyphlist", },
+ { "scripts", "mkstatus", },
+}
+
+-----------------------------------------------------------------------
+-- helpers
+-----------------------------------------------------------------------
+
+local die = function (...)
+ io.stderr:write "[fatal error]: "
+ io.stderr:write (stringformat (...))
+ io.stderr:write "\naborting.\n"
+ os.exit (1)
+end
+
+local gitcmd = "git log -1 \z
+ --format=\"return {\z
+ %n revision = [[%H]],\z
+ %n timestamp = [[%cd]],\z
+ %n committer = [[%cn <%ce>]],\z
+ %n}\" \z
+ --date=iso"
+
+local git_info = function ()
+ --io.write (gitcmd)
+ --io.write "\n"
+ local chan = iopopen (gitcmd)
+ if not chan then
+ die ("this script needs to be run inside \z
+ the luaotfload git repository")
+ end
+
+ local data = chan:read "*all"
+ chan:close ()
+ if data and type (data) == "string" and data ~= "" then
+ data = load (data)
+ if not data then
+ die "cannot parse git information"
+ end
+ return data ()
+ end
+ die "cannot read from pipe"
+end
+
+-----------------------------------------------------------------------
+-- functionality
+-----------------------------------------------------------------------
+
+local hash_file = function (fname)
+ if not lfs.isfile (fname) then
+ die ("cannot find %s.", fname)
+ end
+ local raw = ioloaddata (fname)
+ if not raw then
+ die ("cannot read from %s.", fname)
+ end
+ return md5sumhexa (raw)
+end
+
+local hash_all
+hash_all = function (list, acc)
+ if list == nil then
+ return hash_all (table.fastcopy (names), { })
+ end
+
+ local finfo = list[#list]
+ list[#list] = nil
+ if finfo then
+ local fpath
+ if type (finfo) == "table" then
+ local d, f = finfo [1], finfo [2]
+ if lfs.isdir (d) then
+ fpath = file.join (d, f)
+ else
+ fpath = f
+ end
+ else
+ fpath = finfo
+ end
+ if verbose then
+ iowrite "· md5("
+ iowrite (fpath)
+ end
+ local sum = hash_file (fpath)
+ if verbose then
+ iowrite ") = \""
+ iowrite (sum)
+ iowrite "\"\n"
+ end
+ acc[#acc+1] = { fpath, sum }
+ return hash_all (list, acc)
+ end
+ return acc
+end
+
+local main = function ()
+ if arg [1] == "-v" then verbose = true end
+ local hashes = hash_all ()
+ local notes = git_info ()
+ local serialized = table.serialize ({ notes = notes,
+ hashes = hashes }, true)
+ local success = io.savedata (filelist, serialized)
+ if success == false then
+ die ("could not write to %s.", filelist)
+ end
+ return 0
+end
+
+return main ()
+
+--- vim:ft=lua:ts=2:et:sw=2
diff --git a/scripts/mktests b/scripts/mktests
new file mode 100755
index 0000000..b36b6dd
--- /dev/null
+++ b/scripts/mktests
@@ -0,0 +1,311 @@
+#!/usr/bin/env texlua
+-----------------------------------------------------------------------
+-- FILE: mktests
+-- USAGE: ./mktests
+-- DESCRIPTION: test the behavior of Luaotfload
+-- REQUIREMENTS: Luatex > 0.76, Luaotfload
+-- AUTHOR: Philipp Gesang (Phg), <phg42.2a@gmail.com>
+-- VERSION: 2.4
+-- MODIFIED: 2014-05-15 22:16:47+0200
+-----------------------------------------------------------------------
+--
+--===================================================================--
+-- NOTE
+-- this is a stub, to be completed long-term
+-- suggestions welcome
+--===================================================================--
+
+
+local tests = { }
+local lpeg = require "lpeg"
+local lpegmatch = lpeg.match
+
+kpse.set_program_name "luatex"
+
+require "lualibs"
+require "luaotfload-basics-gen.lua"
+require "luaotfload-log.lua"
+require "luaotfload-parsers"
+require "luaotfload-configuration"
+require "luaotfload-database"
+
+local names = fonts.names
+
+-----------------------------------------------------------------------
+--- helper functions
+-----------------------------------------------------------------------
+
+local pprint_resolve = function (input, output, result)
+ texio.write_nl (string.format ("[%s] “%s” -> “%s”",
+ result == true and "passed" or "failed",
+ input,
+ output))
+end
+
+local pprint_result = function (name, failed, total)
+ if failed == 0 then
+ texio.write_nl (string.format ("[%s] all %d passed", name, total))
+ else
+ texio.write_nl (string.format ("[%s] %d of %d failed",
+ name,
+ failed,
+ total))
+ end
+end
+
+local pprint_spec = function (spec)
+ return string.format ("%s/%s*%.2fpt",
+ spec.specification,
+ spec.style or "regular",
+ spec.optsize or 0)
+end
+
+-----------------------------------------------------------------------
+--- parser tests
+-----------------------------------------------------------------------
+
+local test_config_input = [==[
+
+
+[foo]
+bar = baz
+xyzzy = no
+buzz
+
+[lavernica "brutalitops"]
+# It’s a locomotive that runs on us.
+ laan-ev = zip zop zooey ; jib-jab
+Crouton = "Fibrosis \"\\ # "
+
+]==]
+
+local test_config_output = {
+ { section = { title = "foo" },
+ variables = { bar = "baz",
+ xyzzy = false,
+ buzz = true } },
+ { section = { title = "lavernica",
+ subtitle = "brutalitops" },
+ variables = { ["laan-ev"] = "zip zop zooey",
+ crouton = "Fibrosis \"\\ # " } }
+}
+
+local parse_config = function ()
+ local parser = luaotfload.parsers.config
+ local result = lpegmatch (parser, test_config_input)
+ --- compare values recursively
+ local aux aux = function (t1, t2)
+ --- cheaply non-tail recursive
+ local k1 = table.keys (t1)
+ local k2 = table.keys (t2)
+ if #k1 ~= #k2 then
+ return false
+ end
+ for i = 1, #k1 do
+ local k = k1[i]
+ local v1 = t1[k]
+ local v2 = t2[k]
+ if type (v1) == "table" then
+ if type (v2) ~= "table" or not aux (v1, v2) then
+ return false
+ end
+ elseif v1 ~= v2 then
+ return false
+ end
+ end
+ return true
+ end
+ return aux (result, test_config_output) and 0 or 1, 1
+end
+
+tests["parse_config"] = parse_config
+
+-----------------------------------------------------------------------
+--- font tests
+-----------------------------------------------------------------------
+
+--- test sets
+
+local infer_regular_style = {
+ --- inferring which one is the correct style for “regular”; can be
+ --- obscured by synonyms like “book” etc.
+ { "Iwona", "Iwona-Regular.otf" }, -- trivial case
+ { "DejaVu Serif", "DejaVuSerif.ttf" },
+ { "DejaVu Sans", "DejaVuSans.ttf" },
+ { "Adobe Garamond Pro", "agaramondpro_regular.otf" },
+ { "Garamond Premier Pro", "GaramondPremrPro.otf" },
+ { "CMU Serif", "cmunrm.otf" },
+ { "CMU Sans Serif", "cmunss.otf" },
+ { "Minion Pro", "MinionPro-Regular.otf" },
+ --- Below test will succeed only if we match for the
+ --- splainname (= sanitized tfmdata.fullname) field
+ --- explicitly.
+ { "Minion Pro Italic", "MinionPro-It.otf" },
+}
+
+local choose_optical_size = {
+ { { name = "Latin Modern Roman", optsize = 1 }, "lmroman5-regular.otf" },
+ { { name = "Latin Modern Roman", optsize = 10 }, "lmroman10-regular.otf" },
+ { { name = "Latin Modern Roman", optsize = 12 }, "lmroman12-regular.otf" },
+ { { name = "Latin Modern Roman", optsize = 42 }, "lmroman17-regular.otf" },
+ { { name = "EB Garamond", optsize = 1 }, "EBGaramond08-Regular.otf" },
+ { { name = "EB Garamond", optsize = 8 }, "EBGaramond08-Regular.otf" },
+ { { name = "EB Garamond", optsize = 12 }, "EBGaramond12-Regular.otf" },
+ { { name = "EB Garamond", optsize = 42 }, "EBGaramond12-Regular.otf" },
+ { { name = "Garamond Premier Pro", optsize = 1 }, "GaramondPremrPro-Capt.otf" },
+ { { name = "Garamond Premier Pro", optsize = 10 }, "GaramondPremrPro.otf" },
+ { { name = "Garamond Premier Pro", optsize = 15 }, "GaramondPremrPro-Subh.otf" },
+ { { name = "Garamond Premier Pro", optsize = 42 }, "GaramondPremrPro-Disp.otf" },
+}
+
+local choose_style = {
+ { { name = "DejaVu Sans", style = "regular" }, "DejaVuSans.ttf" },
+ { { name = "DejaVu Sans", style = "italic" }, "DejaVuSans-Oblique.ttf" },
+ { { name = "DejaVu Sans", style = "bold" }, "DejaVuSans-Bold.ttf" },
+ { { name = "DejaVu Sans", style = "bolditalic" }, "DejaVuSans-BoldOblique.ttf" },
+ { { name = "Linux Libertine O", style = "regular" }, "LinLibertine_R.otf" },
+ { { name = "Linux Libertine O", style = "italic" }, "LinLibertine_RI.otf" },
+ { { name = "Linux Libertine O", style = "bold" }, "LinLibertine_RB.otf" },
+ { { name = "Linux Libertine O", style = "bolditalic" }, "LinLibertine_RBI.otf" },
+ { { name = "Liberation Serif", style = "regular" }, "LiberationSerif-Regular.ttf" },
+ { { name = "Liberation Serif", style = "italic" }, "LiberationSerif-Italic.ttf" },
+ { { name = "Liberation Serif", style = "bold" }, "LiberationSerif-Bold.ttf" },
+ { { name = "Liberation Serif", style = "bolditalic" }, "LiberationSerif-BoldItalic.ttf" },
+ { { name = "CMU Sans Serif", style = "regular" }, "cmunss.otf" }, -- no “regular” but “medium”
+ { { name = "CMU Sans Serif", style = "italic" }, "cmunsi.otf" }, -- no “italic” but “oblique”
+ { { name = "CMU Sans Serif", style = "bold" }, "cmunsx.otf" },
+ { { name = "CMU Sans Serif", style = "bolditalic" }, "cmunso.otf" },
+ --[[--
+ Minion Pro Italic is exceptionally weird regarding identifiers in
+ that the postscript fontname and both info.fontname and
+ info.fullname are given as “minionproit”. Now its english fullname
+ (field 18) is “minionproital”. Only the value “fullname” in the root of
+ the tfmdata structure (not the one returned by fontloader.info()!)
+ accurately yields “Minion Pro Italic”.
+
+ To complete the picture, the file naming isn’t very consistent either:
+ we find the suffixes “Regular” and “Bold”, but “It” and “BoldIt”. What
+ the hell were the designers smoking?
+
+ Also, the full Minion Pro set comes with different optical sizes which
+ for monetary reasons cannot considered here.
+ --]]--
+ { { name = "Minion Pro", style = "regular" }, "MinionPro-Regular.otf" },
+ { { name = "Minion Pro", style = "italic" }, "MinionPro-It.otf" },
+ { { name = "Minion Pro", style = "bold" }, "MinionPro-Bold.otf" },
+ { { name = "Minion Pro", style = "bolditalic" }, "MinionPro-BoldIt.otf" },
+}
+
+--- this needs a database built with --formats=+pfa,pfb,afm
+
+local resolve_t1_font = {
+ { { name = "URW Gothic L", style = "regular" }, "a010013l.pfb" }, --> “book”
+-- { { name = "URW Gothic L", style = "italic" }, "a010033l.pfb" }, --> “book oblique”
+-- { { name = "URW Gothic L", style = "bold" }, "a010015l.pfb" }, --> “demi”
+-- { { name = "URW Gothic L", style = "bolditalic" }, "a010035l.pfb" }, --> “demi oblique”
+ { { name = "Century Schoolbook L", style = "regular" }, "c059013l.pfb" },
+ { { name = "Century Schoolbook L", style = "italic" }, "c059033l.pfb" },
+ { { name = "Century Schoolbook L", style = "bold" }, "c059016l.pfb" },
+ { { name = "Century Schoolbook L", style = "bolditalic" }, "c059036l.pfb" },
+ { { name = "Nimbus Roman No9 L", style = "regular" }, "n021003l.pfb" },
+ { { name = "Nimbus Roman No9 L", style = "italic" }, "n021023l.pfb" },
+ { { name = "Nimbus Roman No9 L", style = "bold" }, "n021004l.pfb" }, --- medium, actually
+ { { name = "Nimbus Roman No9 L", style = "bolditalic" }, "n021024l.pfb" },
+}
+
+local translate_style = {
+ regular = "r",
+ italic = "i",
+ bold = "b",
+ bolditalic = "bi",
+}
+
+local font_name_tests = {
+ infer_regular_style,
+ choose_optical_size,
+ choose_style,
+ resolve_t1_font,
+}
+
+local default_spec = {
+ name = false,
+ lookup = "name",
+ specification = false,
+ optsize = 0,
+}
+
+local resolve_font_name = function ()
+ local failed, total = 0, 0
+ local resolve_name = names.resolve_name
+ for nset = 1, #font_name_tests do
+ local set = font_name_tests[nset]
+
+ for ntest = 1, #set do
+ local test = set[ntest]
+ local input, output = test[1], test[2]
+
+ if type (input) == "string" then
+ local input_spec = table.copy (default_spec)
+ input_spec.name = input
+ input_spec.specification = input_spec.lookup .. ":" .. input
+ local result = resolve_name (input_spec) == output
+ total = total + 1
+ if not result then
+ failed = failed + 1
+ end
+ pprint_resolve (input, output, result)
+
+ else
+ local input_spec, output = test[1], test[2]
+ input_spec.specification = (input_spec.lookup
+ or default_spec.lookup)
+ .. ":" .. input_spec.name
+ input_spec.optsize = input_spec.optsize or default_spec.optsize
+ input_spec.style = translate_style [input_spec.style]
+ local result = resolve_name (input_spec) == output
+ total = total + 1
+ if not result then
+ failed = failed + 1
+ end
+ pprint_resolve (pprint_spec (input_spec), output, result)
+ end
+
+ end
+ end
+ return failed, total
+end
+
+tests ["resolve_font_name"] = resolve_font_name
+
+
+-----------------------------------------------------------------------
+--- runner
+-----------------------------------------------------------------------
+
+local main = function ()
+ local failed, total = 0, 0
+ config.actions.apply_defaults ()
+ for name, test in next, tests do
+ texio.write_nl ("[" .. name .. "]")
+ local newfailed, newtotal = test ()
+ total = total + 1
+ pprint_result (name, newfailed, newtotal)
+ failed = failed + newfailed
+ total = total + newtotal
+ end
+
+ if failed == 0 then
+ texio.write_nl (string.format ("[report] all %d tests passed.", total))
+ else
+ texio.write_nl (string.format ("[report] %d of %d tests failed (%d %%).",
+ failed,
+ total,
+ failed / total * 100))
+ end
+ texio.write_nl ""
+ os.exit (0)
+end
+
+return main ()
+
+--- vim:ft=lua:ts=2:et:sw=2