diff options
-rw-r--r-- | Makefile | 23 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | luaotfload-auxiliary.lua | 94 | ||||
-rwxr-xr-x | mkcharacters | 123 |
4 files changed, 234 insertions, 9 deletions
@@ -7,6 +7,9 @@ OTFL = $(wildcard luaotfload-*.lua) luaotfload-blacklist.cnf GLYPHSCRIPT = mkglyphlist GLYPHSOURCE = glyphlist.txt +CHARSCRIPT = mkcharacters + +RESOURCESCRIPTS = $(GLYPHSCRIPT) $(CHARSCRIPT) SCRIPTNAME = luaotfload-tool SCRIPT = $(SCRIPTNAME).lua @@ -20,12 +23,13 @@ DOT = $(GRAPH).dot # Files grouped by generation mode GLYPHS = luaotfload-glyphlist.lua +CHARS = luaotfload-characters.lua GRAPHED = $(DOTPDF) MAN = $(MANPAGE) COMPILED = $(DOC) UNPACKED = luaotfload.sty luaotfload.lua -GENERATED = $(GRAPHED) $(UNPACKED) $(COMPILED) $(GLYPHS) $(MAN) -SOURCE = $(DTX) $(MANSOURCE) $(OTFL) README Makefile NEWS $(GLYPHSCRIPT) +GENERATED = $(GRAPHED) $(UNPACKED) $(COMPILED) $(GLYPHS) $(CHARS) $(MAN) +SOURCE = $(DTX) $(MANSOURCE) $(OTFL) README Makefile NEWS $(RESOURCESCRIPTS) # test files TESTDIR = tests @@ -34,7 +38,7 @@ TESTFILES_SYS = $(TESTDIR)/systemfonts.tex $(TESTDIR)/fontconfig_conf_reading.t TESTFILES_TL = $(filter-out $(TESTFILES_SYS), $(TESTFILES)) # Files grouped by installation location -SCRIPTFILES = $(SCRIPT) $(OLDSCRIPT) $(GLYPHSCRIPT) +SCRIPTFILES = $(SCRIPT) $(OLDSCRIPT) $(RESOURCESCRIPTS) RUNFILES = $(UNPACKED) $(filter-out $(SCRIPTFILES),$(OTFL)) DOCFILES = $(DOC) $(DOTPDF) README NEWS MANFILES = $(MANPAGE) @@ -57,11 +61,14 @@ CTAN_ZIP = $(NAME).zip TDS_ZIP = $(NAME).tds.zip ZIPS = $(CTAN_ZIP) $(TDS_ZIP) +LUA = texlua + DO_TEX = luatex --interaction=batchmode $< >/dev/null # (with the next version of latexmk: -pdf -pdflatex=lualatex) DO_LATEX = latexmk -pdf -e '$$pdflatex = q(lualatex %O %S)' -silent $< >/dev/null DO_GRAPHVIZ = dot -Tpdf -o $@ $< > /dev/null -DO_GLYPHLIST = texlua ./mkglyphlist > /dev/null +DO_GLYPHS = $(LUA) $(GLYPHSCRIPT) > /dev/null +DO_CHARS = $(LUA) $(CHARSCRIPT) > /dev/null DO_DOCUTILS = rst2man $< >$@ 2>/dev/null all: $(GENERATED) @@ -69,13 +76,17 @@ graph: $(GRAPHED) doc: $(GRAPHED) $(COMPILED) $(MAN) manual: $(MAN) unpack: $(UNPACKED) -glyphs: $(GLYPHS) +resources: $(GLYPHS) $(CHARS) +chars: $(CHARS) ctan: $(CTAN_ZIP) tds: $(TDS_ZIP) world: all ctan $(GLYPHS): /dev/null - $(DO_GLYPHLIST) + $(DO_GLYPHS) + +$(CHARS): /dev/null + $(DO_CHARS) $(GRAPHED): $(DOT) $(DO_GRAPHVIZ) @@ -1,7 +1,7 @@ Change History -------------- -2013/05/11, luaotfload v2.2: +2013/05/17, luaotfload v2.2: * There is now a central, non-personal dev repo on github: https://github.com/lualatex/luaotfload * Synchronisation with ConTeXt from TeXLive 2013, inducing @@ -30,6 +30,7 @@ Change History * Unsupported v1.3 codebase is included in the luaotfload-*lua files. Crude, but effective way to support older Luatex binaries * implemented basic cache control/stats option for luaotfload-tool + * Character list is generated from char-def.lua (mkcharacters) 2013/04/27, luaotfload v1.3: * blacklisting lingoes.ttf (segfaults) diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index 64fac90..2bfcbf0 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -21,11 +21,15 @@ config.luaotfload = config.luaotfload or { } local aux = luaotfload.aux local log = luaotfload.log local warning = luaotfload.log -local identifiers = fonts.hashes.identifiers +local fonthashes = fonts.hashes +local identifiers = fonthashes.identifiers local fontid = font.id local texsprint = tex.sprint +local dofile = dofile +local getmetatable = getmetatable +local setmetatable = setmetatable local utf8 = unicode.utf8 local stringlower = string.lower local stringformat = string.format @@ -227,7 +231,7 @@ luatexbase.add_to_callback( "luaotfload.aux.set_capheight") ----------------------------------------------------------------------- ---- glyphs +--- glyphs and characters ----------------------------------------------------------------------- local agl = fonts.encodings.agl @@ -321,6 +325,43 @@ end aux.name_of_slot = name_of_slot +--[[doc-- + + In Context, characters.data is where the data from char-def.lua + resides. The file is huge (>3.7 MB as of 2013) and not part of the + isolated font loader. Nevertheless, we include a partial version + generated by the mkcharacters script that contains only the + “direction” and “mirror” fields of each character defined. + +--doc]]-- + +characters = characters or { } --- should be created in basics-gen +characters.data = { } +local chardef = "luaotfload-characters" + +do + local chardata + local index = function (t, k) + if chardata == nil then + log("Loading character metadata from %s.", chardef) + chardata = dofile(kpse.find_file("luaotfload-characters.lua")) + if chardata == nil then + warning("Could not load %s; continuing with empty character table.", + chardef) + chardata = { } + end + end + return chardata[k] + end + + local mt = getmetatable(characters.data) + if mt then + mt.__index = index + else + setmetatable(characters.data, { __index = index }) + end +end + ----------------------------------------------------------------------- --- features / scripts / languages ----------------------------------------------------------------------- @@ -640,4 +681,53 @@ end aux.get_raw_fonts = get_raw_fonts +----------------------------------------------------------------------- +--- font parameters +----------------------------------------------------------------------- +--- analogy of font-hsh + +fonthashes.parameters = fonthashes.parameters or { } +fonthashes.quads = fonthashes.quads or { } + +local parameters = fonthashes.parameters or { } +local quads = fonthashes.quads or { } + +setmetatable(parameters, { __index = function (t, font_id) + local tfmdata = identifiers[font_id] + if not tfmdata then --- unsafe; avoid + tfmdata = font.fonts[font_id] + end + if tfmdata and type(tfmdata) == "table" then + local fontparameters = tfmdata.parameters + t[font_id] = fontparameters + return fontparameters + end + return nil +end}) + +--[[doc-- + + Note that the reason as to why we prefer functions over table indices + is that functions are much safer against unintended manipulation. + This justifies the overhead they cost. + +--doc]]-- + +--- int -> (number | false) +local get_quad = function (font_id) + local quad = quads[font_id] + if quad then + return quad + end + local fontparameters = parameters[font_id] + if fontparameters then + local quad = fontparameters.quad or 0 + quads[font_id] = quad + return quad + end + return false +end + +aux.get_quad = get_quad + -- vim:tw=71:sw=2:ts=2:expandtab diff --git a/mkcharacters b/mkcharacters new file mode 100755 index 0000000..a627ea9 --- /dev/null +++ b/mkcharacters @@ -0,0 +1,123 @@ +#!/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: 1.0 +-- CREATED: 2013-05-17 12:41:39+0200 +----------------------------------------------------------------------- +-- we create a stripped-down version of char-def.lua +----------------------------------------------------------------------- + +----------------------------------------------------------------------- +-- config +----------------------------------------------------------------------- +local charfile = "./luaotfload-characters.lua" +local chardef = "~phg/base/char-def.lua" +local import = { "direction", "mirror", } --> πολυγλωσσία/uax9 + +----------------------------------------------------------------------- +-- 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) + |