From 4921643624581f05c0f0bb17d7960b599872238c Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 8 May 2013 17:31:04 +0200 Subject: ignore glyph list workaround when running the db tool --- luaotfload-override.lua | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/luaotfload-override.lua b/luaotfload-override.lua index c047dad..f143009 100644 --- a/luaotfload-override.lua +++ b/luaotfload-override.lua @@ -101,32 +101,34 @@ logs.names_report = names_report --doc]]-- -if next(fonts.encodings.agl) then - print(next, fonts.encodings.agl) - --- unnecessary because the file shouldn’t be loaded at this time - --- but we’re just making sure - fonts.encodings.agl = nil - collectgarbage"collect" -end - +if fonts then --- need to be running TeX + if next(fonts.encodings.agl) then + print(next, fonts.encodings.agl) + --- unnecessary because the file shouldn’t be loaded at this time + --- but we’re just making sure + fonts.encodings.agl = nil + collectgarbage"collect" + end -fonts.encodings.agl = { } -setmetatable(fonts.encodings.agl, { __index = function (t, k) - if k == "unicodes" then - local glyphlist = resolvers.findfile"luaotfload-glyphlist.lua" - if glyphlist then - names_report("both", 0, "load", "loading the Adobe glyph list") + fonts.encodings.agl = { } + + setmetatable(fonts.encodings.agl, { __index = function (t, k) + if k == "unicodes" then + local glyphlist = resolvers.findfile"luaotfload-glyphlist.lua" + if glyphlist then + names_report("both", 0, "load", "loading the Adobe glyph list") + else + glyphlist = resolvers.findfile"font-age.lua" + names_report("both", 0, "load", "loading the extended glyph list from ConTeXt") + end + local unicodes = dofile(glyphlist) + fonts.encodings.agl = { unicodes = unicodes } + return unicodes else - glyphlist = resolvers.findfile"font-age.lua" - names_report("both", 0, "load", "loading the extended glyph list from ConTeXt") + return nil end - local unicodes = dofile(glyphlist) - fonts.encodings.agl = { unicodes = unicodes } - return unicodes - else - return nil - end -end }) + end }) +end -- vim:tw=71:sw=4:ts=4:expandtab -- cgit v1.2.3 From 69f51727fba1c348d78348d9f163cf884e7ab558 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 13:45:14 +0200 Subject: add querying of font metadata to luaotfload-tool --- luaotfload-auxiliary.lua | 4 ++ luaotfload-database.lua | 26 +++++---- luaotfload-tool.lua | 147 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 162 insertions(+), 15 deletions(-) diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index 2d459d0..9f7974a 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -64,6 +64,10 @@ local add_fontdata_fallbacks = function (fontdata) metadata = fontdata.shared.rawdata.metadata fontdata.units = fontparameters.units local resources = fontdata.resources + --- the next line is a hack that fixes scaling of fonts with + --- non-standard em-sizes (most ms fonts have 2048, others + --- come with 256) + --- this is considered a bug in the font loader fontdata.size = fontparameters.size * fontdata.units / 1000 --- for legacy fontspec.lua and unicode-math.lua fontdata.shared.otfdata = metadata diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 576341f..96db195 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -146,10 +146,11 @@ This is a sketch of the luaotfload db: psname : string; subfamily : string; } - size : int list; - slant : int; - weight : int; - width : int; + size : int list; + slant : int; + weight : int; + width : int; + units_per_em : int; // mainly 1000, but also 2048 or 256 } and filestatus = (fullname, { index : int list; timestamp : int }) dict @@ -836,13 +837,16 @@ font_fullinfo = function (filename, subfont) report("log", 1, "db", "broken font rejected", "%s", basefile) return end - tfmdata.fontname = metadata.fontname - tfmdata.fullname = metadata.fullname - tfmdata.familyname = metadata.familyname - tfmdata.filename = { filename, subfont } -- always store full path - tfmdata.weight = metadata.pfminfo.weight - tfmdata.width = metadata.pfminfo.width - tfmdata.slant = metadata.italicangle + tfmdata.fontname = metadata.fontname + tfmdata.fullname = metadata.fullname + tfmdata.familyname = metadata.familyname + tfmdata.filename = { filename, subfont } -- always store full path + tfmdata.weight = metadata.pfminfo.weight + tfmdata.width = metadata.pfminfo.width + tfmdata.slant = metadata.italicangle + --- this is for querying + tfmdata.units_per_em = metadata.units_per_em + tfmdata.version = metadata.version -- don't waste the space with zero values tfmdata.size = { metadata.design_size ~= 0 and metadata.design_size or nil, diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 0cd19b1..6662291 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -32,6 +32,8 @@ local stringformat = string.format local texiowrite_nl = texio.write_nl local stringlower = string.lower +local C, Ct, P = lpeg.C, lpeg.Ct, lpeg.P +local lpegmatch = lpeg.match local loader_file = "luatexbase.loader.lua" local loader_path = assert(kpse.find_file(loader_file, "lua"), @@ -64,8 +66,6 @@ local config = config config.luaotfload = config.luaotfload or { } do -- we don’t have file.basename and the likes yet, so inline parser ftw - local C, P = lpeg.C, lpeg.P - local lpegmatch = lpeg.match local slash = P"/" local dot = P"." local noslash = 1 - slash @@ -228,7 +228,7 @@ set. --]]-- local action_sequence = { - "loglevel", "help", "version", "flush", "generate", "query" + "loglevel", "help", "version", "flush", "generate", "list", "query" } local action_pending = table.tohash(action_sequence, false) @@ -286,7 +286,7 @@ actions.query = function (job) lookup = "name", specification = "name:" .. query, optsize = 0, - } + } local foundname, subfont, success = fonts.names.resolve(nil, nil, tmpspec) @@ -317,6 +317,137 @@ actions.query = function (job) return true, true end +--- --list= +--- --list=: +--- +--- --list= --fields=,,,... + +local get_fields get_fields = function (entry, fields, acc, n) + if not acc then + return get_fields(entry, fields, { }, 1) + end + + local field = fields[n] + if field then + local value = entry[field] + acc[#acc+1] = value or false + return get_fields(entry, fields, acc, n+1) + end + return acc +end + +local comma = P"," +local noncomma = 1-comma +local split_comma = Ct((C(noncomma^1) + comma)^1) + +local texiowrite_nl = texio.write_nl +local tableconcat = table.concat +local stringexplode = string.explode + +local separator = "\t" --- could be “,” for csv + +local format_fields format_fields = function (fields, acc, n) + if not acc then + return format_fields(fields, { }, 1) + end + + local field = fields[n] + if field ~= nil then + if field == false then + acc[#acc+1] = "" + else + acc[#acc+1] = tostring(field) + end + return format_fields(fields, acc, n+1) + end + return tableconcat(acc, separator) +end + +local set_primary_field +set_primary_field = function (fields, addme, acc, n) + if not acc then + return set_primary_field(fields, addme, { addme }, 1) + end + + local field = fields[n] + if field then + if field ~= addme then + acc[#acc+1] = field + end + return set_primary_field(fields, addme, acc, n+1) + end + return acc +end + +actions.list = function (job) + local criterion = job.criterion + + local asked_fields = job.asked_fields + if asked_fields then + asked_fields = lpegmatch(split_comma, asked_fields) + else + --- some defaults + asked_fields = { "fullname", "version", } + end + + if not names.data then + names.data = names.load() + end + + local mappings = names.data.mappings + local nmappings = #mappings + + if criterion == "*" then + logs.names_report(false, 1, "list", "all %d entries", nmappings) + for i=1, nmappings do + local entry = mappings[i] + local fields = get_fields(entry, asked_fields) + --- we could collect these instead ... + local formatted = format_fields(fields) + texiowrite_nl(formatted) + end + + else + criterion = stringexplode(criterion, ":") --> { field, value } + local asked_value = criterion[2] + criterion = criterion[1] + asked_fields = set_primary_field(asked_fields, criterion) + + logs.names_report(false, 1, "list", "by %s", criterion) + + --- firstly, build a list of fonts to operate on + local targets, ntargets + + if asked_value then + logs.names_report(false, 2, "list", "restricting to value %s", asked_value) + targets = { } + for i=1, nmappings do + local entry = mappings[i] + if entry[criterion] + and tostring(entry[criterion]) == asked_value + then + targets[#targets+1] = entry + end + end + ntargets = #targets + else --- all + targets = mappings + ntargets = nmappings + end + logs.names_report(false, 2, "list", "%d entries", ntargets) + + --- now, output the collection + for i=1, ntargets do + local entry = targets[i] + local fields = get_fields(entry, asked_fields) + local formatted = format_fields(fields) + texiowrite_nl(formatted) + end + end + + return true, true +end + --[[-- Command-line processing. mkluatexfontdb.lua relies on the script alt_getopt to process argv and @@ -330,6 +461,7 @@ alt_getopt. local process_cmdline = function ( ) -- unit -> jobspec local result = { -- jobspec force_reload = nil, + criterion = "", query = "", log_level = 1, --- 2 is approx. the old behavior } @@ -337,12 +469,14 @@ local process_cmdline = function ( ) -- unit -> jobspec local long_options = { alias = 1, ["flush-cache"] = "c", + fields = 1, find = 1, force = "f", fuzzy = "F", help = "h", info = "i", limit = 1, + list = 1, log = 1, quiet = "q", update = "u", @@ -401,6 +535,11 @@ local process_cmdline = function ( ) -- unit -> jobspec config.luaotfload.self = optarg[n] elseif v == "c" then action_pending["flush"] = true + elseif v == "list" then + action_pending["list"] = true + result.criterion = optarg[n] + elseif v == "fields" then + result.asked_fields = optarg[n] end end -- cgit v1.2.3 From 822273918a0475abb91418e63dccff021e1d7983 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 14:02:05 +0200 Subject: sort output for unspecified fields --- luaotfload-tool.lua | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 6662291..3e10820 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -416,11 +416,9 @@ actions.list = function (job) logs.names_report(false, 1, "list", "by %s", criterion) --- firstly, build a list of fonts to operate on - local targets, ntargets - - if asked_value then + local targets = { } + if asked_value then --- only those whose value matches logs.names_report(false, 2, "list", "restricting to value %s", asked_value) - targets = { } for i=1, nmappings do local entry = mappings[i] if entry[criterion] @@ -429,11 +427,34 @@ actions.list = function (job) targets[#targets+1] = entry end end - ntargets = #targets - else --- all - targets = mappings - ntargets = nmappings + + else --- whichever have the field, sorted + local categories, by_category = { }, { } + for i=1, nmappings do + local entry = mappings[i] + local value = entry[criterion] + if value then + --value = tostring(value) + local entries = by_category[value] + if not entries then + entries = { entry } + categories[#categories+1] = value + else + entries[#entries+1] = entry + end + by_category[value] = entries + end + end + table.sort(categories) + + for i=1, #categories do + local entries = by_category[categories[i]] + for j=1, #entries do + targets[#targets+1] = entries[j] + end + end end + local ntargets = #targets logs.names_report(false, 2, "list", "%d entries", ntargets) --- now, output the collection -- cgit v1.2.3 From ab06ec4422bc2e18ee5528a0ae7abd95a031c694 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 15:11:33 +0200 Subject: update manpage and usage info --- luaotfload-tool.lua | 9 +++++++-- luaotfload-tool.rst | 23 ++++++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 3e10820..8d7f6f5 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -129,11 +129,14 @@ This tool is part of the luaotfload package. Valid options are: -v --verbose=LEVEL be more verbose (print the searched directories) -vv print the loaded fonts -vvv print all steps of directory searching + --log=stdout redirect log output to stdout + -V --version print version and exit -h --help print this message --alias= force behavior of “luaotfload-tool” or legacy “mkluatexfontdb” + ------------------------------------------------------------------------------- DATABASE @@ -147,7 +150,9 @@ This tool is part of the luaotfload package. Valid options are: (default: n = 1) -i --info display font metadata - --log=stdout redirect log output to stdout + --list= output list of entries by field + --list=: restrict to entries with = + --fields=,,…, which fields to print with --list The font database will be saved to %s @@ -158,7 +163,7 @@ The font database will be saved to Usage: %s [OPTION]... -Rebuild the LuaTeX font database. +Rebuild or update the LuaTeX font database. Valid options: -f --force force re-indexing all fonts diff --git a/luaotfload-tool.rst b/luaotfload-tool.rst index cd42606..5b6c6b8 100644 --- a/luaotfload-tool.rst +++ b/luaotfload-tool.rst @@ -23,6 +23,8 @@ SYNOPSIS **luaotfload** --flush-cache +**luaotfload** --list=CRITERION[:VALUE] [ --fields=F1,F2,...,Fn ] + **luaotfload** --help **luaotfload** --version @@ -54,13 +56,28 @@ update mode query mode ----------------------------------------------------------------------- ---find= Resolve a font name; this looks up in +--find=NAME Resolve a font name; this looks up in the database and prints the file name it is mapped to. --fuzzy, -F Show approximate matches to the file name if - the lookup was unsuccessful (requires ``--find``). + the lookup was unsuccessful (requires + ``--find``). --info, -i Display basic information to a resolved font file (requires ``--find``). +--list=CRITERION Show entries, where *CRITERION* is one of the + following: + + 1) the character ``*``, selecting all entries; + 2) a field of a database entry, for instance + *fullname* or *units_per_em*, according to + which the output will be sorted; or + 3) an expression of the form ``field:value`` to + limit the output to entries whose ``field`` + matches ``value``. + +--fields=FIELDS Comma-separated list of fields that should be + printed. The default is *fullname,version*. + (Only meaningful with ``--list``.) lookup cache ----------------------------------------------------------------------- @@ -68,7 +85,7 @@ lookup cache miscellaneous ----------------------------------------------------------------------- ---verbose=, -v Set verbosity level to *n* or the number of +--verbose=N, -v Set verbosity level to *n* or the number of repetitions of ``-v``. --quiet No verbose output (log level set to zero). --log=stdout Redirect log output to terminal (for database -- cgit v1.2.3 From dde1b993cfd1aa07f31c0a97b8de8233e18f4fb4 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 15:22:20 +0200 Subject: [doc] mention manpage in manual --- luaotfload-database.lua | 2 +- luaotfload-tool.rst | 2 +- luaotfload.dtx | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 96db195..84b884d 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -71,7 +71,7 @@ fonts.definers = fonts.definers or { } local names = fonts.names -names.version = 2.203 +names.version = 2.204 names.data = nil --- contains the loaded database names.lookups = nil --- contains the lookup cache names.path = { diff --git a/luaotfload-tool.rst b/luaotfload-tool.rst index 5b6c6b8..6fc6138 100644 --- a/luaotfload-tool.rst +++ b/luaotfload-tool.rst @@ -19,7 +19,7 @@ SYNOPSIS **luaotfload** --update [ --force ] [ --quiet ] [ --verbose ] -**luaotfload** --find=filename [ --fuzzy ] [ --info ] +**luaotfload** --find=FONTNAME [ --fuzzy ] [ --info ] **luaotfload** --flush-cache diff --git a/luaotfload.dtx b/luaotfload.dtx index 6c88e37..74cf467 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -947,6 +947,11 @@ and the derived files % % \verb|luaotfload-tool --help| will list the available command line % switches, including some not discussed in detail here. +% For a full documentation of \identifier{luaotfload-tool} and its +% capabilities refer to the manpage +% (\verb|man 1 luaotfload-tool|).\footnote{% +% Or see \verb|luaotfload-tool.rst| in the source directory. +% } % % \subsection{Blacklisting Fonts} % \label{font-blacklist} -- cgit v1.2.3 From e6b989e65849ea7294500a6e156371696f7cbf52 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 17:45:50 +0200 Subject: set higher loglevels for database tracing --- luaotfload-database.lua | 9 +++++---- luaotfload-tool.lua | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 84b884d..f59954e 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -1071,25 +1071,25 @@ local scan_dir = function (dirname, fontnames, newfontnames) - texmf used to be a boolean saying if we are scanning a texmf directory ]] local n_scanned, n_new = 0, 0 --- total of fonts collected - report("log", 2, "db", "scanning", "%s", dirname) + report("both", 2, "db", "scanning directory %s", dirname) for _,i in next, font_extensions do for _,ext in next, { i, stringupper(i) } do local found = dirglob(stringformat("%s/**.%s$", dirname, ext)) local n_found = #found --- note that glob fails silently on broken symlinks, which --- happens sometimes in TeX Live. - report("log", 2, "db", "%s '%s' fonts found", n_found, ext) + report("both", 4, "db", "%s '%s' fonts found", n_found, ext) n_scanned = n_scanned + n_found for j=1, n_found do local fullname = found[j] fullname = path_normalize(fullname) - report("log", 2, "db", "loading font “%s”", fullname) + report("both", 4, "db", "loading font “%s”", fullname) local new = load_font(fullname, fontnames, newfontnames) if new then n_new = n_new + 1 end end end end - report("log", 2, "db", "%d fonts found in '%s'", n_scanned, dirname) + report("both", 4, "db", "%d fonts found in '%s'", n_scanned, dirname) return n_scanned, n_new end @@ -1108,6 +1108,7 @@ local function scan_texmf_fonts(fontnames, newfontnames) fontdirs = fontdirs .. stringgsub(kpseexpand_path("$TTFONTS"), "^%.", "") if not stringis_empty(fontdirs) then for _,d in next, filesplitpath(fontdirs) do + report("info", 4, "db", "Entering directory %s", d) local found, new = scan_dir(d, fontnames, newfontnames) n_scanned = n_scanned + found n_new = n_new + new diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 8d7f6f5..0d3b229 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -572,6 +572,7 @@ local process_cmdline = function ( ) -- unit -> jobspec if config.luaotfload.self == "mkluatexfontdb" then action_pending["generate"] = true result.log_level = math.max(2, result.log_level) + logs.set_logout"stdout" end return result end -- cgit v1.2.3 From 14c57c4e0d5b9589c52bcef547f9478857d0c2f3 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 20:04:34 +0200 Subject: sync with Context as of 2013-05-09 --- luaotfload-merged.lua | 51 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/luaotfload-merged.lua b/luaotfload-merged.lua index bf22bac..a0a58cc 100644 --- a/luaotfload-merged.lua +++ b/luaotfload-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 04/29/13 20:30:03 +-- merge date : 05/09/13 15:23:31 do -- begin closure to overcome local limits and interference @@ -4586,7 +4586,7 @@ local floor=math.floor local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end) local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_unimapping=v end) local report_fonts=logs.reporter("fonts","loading") -local fonts=fonts +local fonts=fonts or {} local mappings=fonts.mappings or {} fonts.mappings=mappings local function loadlumtable(filename) @@ -4602,7 +4602,7 @@ local function loadlumtable(filename) end local hex=R("AF","09") local hexfour=(hex*hex*hex*hex)/function(s) return tonumber(s,16) end -local hexsix=(hex^1)/function(s) return tonumber(s,16) end +local hexsix=(hex*hex*hex*hex*hex*hex)/function(s) return tonumber(s,16) end local dec=(R("09")^1)/tonumber local period=P(".") local unicode=P("uni")*(hexfour*(period+P(-1))*Cc(false)+Ct(hexfour^1)*Cc(true)) @@ -4622,16 +4622,16 @@ local function makenameparser(str) return p end end -local function tounicode16(unicode) +local function tounicode16(unicode,name) if unicode<0x10000 then return format("%04X",unicode) elseif unicode<0x1FFFFFFFFF then return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) else - report_fonts("can't convert %a into tounicode",unicode) + report_fonts("can't convert %a in %a into tounicode",unicode,name) end end -local function tounicode16sequence(unicodes) +local function tounicode16sequence(unicodes,name) local t={} for l=1,#unicodes do local unicode=unicodes[l] @@ -4640,7 +4640,7 @@ local function tounicode16sequence(unicodes) elseif unicode<0x1FFFFFFFFF then t[l]=format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00) else - report_fonts ("can't convert %a into tounicode",unicode) + report_fonts ("can't convert %a in %a into tounicode",unicode,name) end end return concat(t) @@ -4702,7 +4702,7 @@ function mappings.addtounicode(data,filename) local unicode=lumunic and lumunic[name] or unicodevector[name] if unicode then originals[index]=unicode - tounicode[index]=tounicode16(unicode) + tounicode[index]=tounicode16(unicode,name) ns=ns+1 end if (not unicode) and usedmap then @@ -4711,7 +4711,7 @@ function mappings.addtounicode(data,filename) unicode=cidcodes[foundindex] if unicode then originals[index]=unicode - tounicode[index]=tounicode16(unicode) + tounicode[index]=tounicode16(unicode,name) ns=ns+1 else local reference=cidnames[foundindex] @@ -4721,11 +4721,11 @@ function mappings.addtounicode(data,filename) unicode=cidcodes[foundindex] if unicode then originals[index]=unicode - tounicode[index]=tounicode16(unicode) + tounicode[index]=tounicode16(unicode,name) ns=ns+1 end end - if not unicode then + if not unicode or unicode=="" then local foundcodes,multiple=lpegmatch(uparser,reference) if foundcodes then originals[index]=foundcodes @@ -4734,7 +4734,7 @@ function mappings.addtounicode(data,filename) nl=nl+1 unicode=true else - tounicode[index]=tounicode16(foundcodes) + tounicode[index]=tounicode16(foundcodes,name) ns=ns+1 unicode=foundcodes end @@ -4744,7 +4744,7 @@ function mappings.addtounicode(data,filename) end end end - if not unicode then + if not unicode or unicode=="" then local split=lpegmatch(ligsplitter,name) local nplit=split and #split or 0 if nplit>=2 then @@ -4765,7 +4765,7 @@ function mappings.addtounicode(data,filename) if n==0 then elseif n==1 then originals[index]=t[1] - tounicode[index]=tounicode16(t[1]) + tounicode[index]=tounicode16(t[1],name) else originals[index]=t tounicode[index]=tounicode16sequence(t) @@ -4775,17 +4775,17 @@ function mappings.addtounicode(data,filename) else end end - if not unicode then + if not unicode or unicode=="" then local foundcodes,multiple=lpegmatch(uparser,name) if foundcodes then if multiple then originals[index]=foundcodes - tounicode[index]=tounicode16sequence(foundcodes) + tounicode[index]=tounicode16sequence(foundcodes,name) nl=nl+1 unicode=true else originals[index]=foundcodes - tounicode[index]=tounicode16(foundcodes) + tounicode[index]=tounicode16(foundcodes,name) ns=ns+1 unicode=foundcodes end @@ -8484,6 +8484,19 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun end start=start.next end + local start=base.next + while start and start.id==glyph_code do + local char=start.char + if marks[char] then + start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex) + if trace_marks then + logwarning("%s: find mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + end + else + break + end + start=start.next + end end return head,base end @@ -8751,6 +8764,10 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) end return head,start,true + else + if trace_bugs then + logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(kind,lookupname),gref(markchar),gref(basechar),index) + end end end end -- cgit v1.2.3 From 9f697f3c5f0e19ab3beab9a2891c42aa8cc8a325 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 20:56:10 +0200 Subject: make file lookups return string instead of pair --- luaotfload-auxiliary.lua | 2 +- luaotfload-database.lua | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index 9f7974a..e93ea9d 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -68,7 +68,7 @@ local add_fontdata_fallbacks = function (fontdata) --- non-standard em-sizes (most ms fonts have 2048, others --- come with 256) --- this is considered a bug in the font loader - fontdata.size = fontparameters.size * fontdata.units / 1000 + --fontdata.size = fontparameters.size * fontdata.units / 1000 --- for legacy fontspec.lua and unicode-math.lua fontdata.shared.otfdata = metadata fontdata.shared.otfdata.metadata = metadata --- brr, that’s meta indeed diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 84b884d..df5b531 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -317,7 +317,7 @@ end local type1_formats = { "tfm", "ofm", } ---- string -> (string * bool | int) +--- string -> string crude_file_lookup_verbose = function (filename) if not names.data then names.data = load_names() end local data = names.data @@ -327,18 +327,18 @@ crude_file_lookup_verbose = function (filename) --- look up in db first ... found = data.barenames[filename] if found and mappings[found] then - found = mappings[found].filename + found = mappings[found].filename[1] report("info", 0, "db", "crude file lookup: req=%s; hit=bare; ret=%s", - filename, found[1]) + filename, found) return found end found = data.basenames[filename] if found and mappings[found] then - found = mappings[found].filename + found = mappings[found].filename[1] report("info", 0, "db", "crude file lookup: req=%s; hit=base; ret=%s", - filename, found[1]) + filename, found) return found end @@ -346,13 +346,13 @@ crude_file_lookup_verbose = function (filename) for i=1, #type1_formats do local format = type1_formats[i] if resolvers.findfile(filename, format) then - return { file.addsuffix(filename, format), false }, format + return file.addsuffix(filename, format), format end end - return { filename, false }, nil + return filename, nil end ---- string -> (string * bool | int) +--- string -> string crude_file_lookup = function (filename) if not names.data then names.data = load_names() end local data = names.data @@ -361,15 +361,15 @@ crude_file_lookup = function (filename) or data.basenames[filename] if found then found = data.mappings[found] - if found then return found.filename end + if found then return found.filename[1] end end for i=1, #type1_formats do local format = type1_formats[i] if resolvers.findfile(filename, format) then - return { file.addsuffix(filename, format), false }, format + return file.addsuffix(filename, format), format end end - return { filename, false }, nil + return filename, nil end --[[doc-- -- cgit v1.2.3 From fc83c9e8f100a4149896d0bbafed1ce6c3088bd0 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 21:01:30 +0200 Subject: fix font type forcing --- luaotfload.dtx | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/luaotfload.dtx b/luaotfload.dtx index 74cf467..073ffa8 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1259,17 +1259,6 @@ local reset_callback, call_callback = local dummy_function = function () end -% \end{macrocode} -% No final decision has been made on how to handle font definition. At -% the moment, there are three candidates: The \identifier{generic} -% callback as hard-coded in the font loader, the \identifier{old} -% wrapper, and a simplified version of the latter (\identifier{patch}) -% that does nothing besides applying font patches. -% -% \begin{macrocode} - -luaotfload.font_definer = "patch" --- | “generic” | “old” - local error, warning, info, log = luatexbase.provides_module(luaotfload.module) @@ -1611,13 +1600,22 @@ formats.ofm = "type1" % most cases when looking up font files, only when generating the database. % % \begin{macrocode} -request_resolvers.file = function (specification) - local found = fonts.names.crude_file_lookup(specification.name) - --local found = fonts.names.crude_file_lookup_verbose(specification.name) - specification.name = found[1] - --if format then specification.forced = format end + +local resolvefile = fonts.names.crude_file_lookup +--local resolvefile = fonts.names.crude_file_lookup_verbose + +function request_resolvers.file(specification) + local name=resolvefile(specification.name) + local suffix=file.suffix(name) + if formats[suffix] then + specification.forced=suffix + specification.name=file.removesuffix(name) + else + specification.name=name + end end + % \end{macrocode} % We classify as \verb|anon:| those requests that have neither a % prefix nor brackets. According to Khaled\footnote{% -- cgit v1.2.3 From 7647a39d3d704888b105dfb000970b7bd60d7682 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 9 May 2013 21:58:45 +0200 Subject: tame fontspec compatibility hacks --- luaotfload-auxiliary.lua | 39 +++++++++++++++++++++++++++++---------- luaotfload.dtx | 9 +++++---- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index e93ea9d..c08f775 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -20,6 +20,7 @@ config.luaotfload = config.luaotfload or { } local aux = luaotfload.aux local log = luaotfload.log +local warning = luaotfload.log local identifiers = fonts.hashes.identifiers local fontid = font.id @@ -60,32 +61,50 @@ local add_fontdata_fallbacks = function (fontdata) --- bother to do any checks, will access --- fontdata.shared no matter what ... fontdata.units = fontdata.units_per_em + else --- otf metadata = fontdata.shared.rawdata.metadata - fontdata.units = fontparameters.units + fontdata.units = fontdata.units_per_em local resources = fontdata.resources --- the next line is a hack that fixes scaling of fonts with --- non-standard em-sizes (most ms fonts have 2048, others --- come with 256) - --- this is considered a bug in the font loader --fontdata.size = fontparameters.size * fontdata.units / 1000 --- for legacy fontspec.lua and unicode-math.lua - fontdata.shared.otfdata = metadata - fontdata.shared.otfdata.metadata = metadata --- brr, that’s meta indeed - --- for microtype.lua + fontdata.shared.otfdata = { + pfminfo = { os2_capheight = metadata.pfminfo.os2_capheight }, + metadata = { ascent = metadata.ascent }, + } + --fontdata.shared.otfdata.metadata = metadata --- brr, that’s meta indeed + --- for microtype and fontspec + local fake_features = { } -- wrong: table.copy(resources.features) + setmetatable(fake_features, { __index = function (tab, idx) + warning("some package (probably fontspec) is outdated") + warning( + "attempt to index " .. + "tfmdata.shared.otfdata.luatex.features (%s)", + idx) + --os.exit(1) + return nil --- empty anyways + end}) fontdata.shared.otfdata.luatex = { unicodes = resources.unicodes, - features = resources.features, + features = fake_features, } end end return fontdata end -luatexbase.add_to_callback( - "luaotfload.patch_font", - add_fontdata_fallbacks, - "luaotfload.fontdata_fallbacks") +--if config.luaotfload.compatibility == true then +if true then + --- this will cause the output pdf to be garbled + --- in pdf.js + luatexbase.add_to_callback( + "luaotfload.patch_font", + add_fontdata_fallbacks, + "luaotfload.fontdata_fallbacks") +end --[[doc-- diff --git a/luaotfload.dtx b/luaotfload.dtx index 073ffa8..daaa48c 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1224,11 +1224,12 @@ local luaotfload = luaotfload config = config or { } config.luaotfload = config.luaotfload or { } -------.luaotfload.resolver = config.luaotfload.resolver or "normal" -config.luaotfload.resolver = config.luaotfload.resolver or "cached" -config.luaotfload.definer = config.luaotfload.definer or "patch" +------.luaotfload.resolver = config.luaotfload.resolver or "normal" +config.luaotfload.resolver = config.luaotfload.resolver or "cached" +config.luaotfload.definer = config.luaotfload.definer or "patch" +config.luaotfload.compatibility = config.luaotfload.compatibility or false config.luaotfload.loglevel = config.luaotfload.loglevel or 1 -config.luaotfload.color_callback = config.luaotfload.color_callback or "pre_linebreak_filter" +config.luaotfload.color_callback = config.luaotfload.color_callback or "pre_linebreak_filter" --luaotfload.prefer_merge = config.luaotfload.prefer_merge or true luaotfload.module = { -- cgit v1.2.3