diff options
Diffstat (limited to 'scripts/context/lua/mtx-fonts.lua')
-rw-r--r-- | scripts/context/lua/mtx-fonts.lua | 214 |
1 files changed, 160 insertions, 54 deletions
diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua index 0cd9a3270..67c48d0a8 100644 --- a/scripts/context/lua/mtx-fonts.lua +++ b/scripts/context/lua/mtx-fonts.lua @@ -20,23 +20,46 @@ function scripts.fonts.reload(verbose) end function scripts.fonts.names(name) + local simpleversion = 1.001 + local simplelist = { "ttf", "otf", "ttc", "dfont" } name = name or "luatex-fonts-names.lua" + fonts.names.filters.list = simplelist + fonts.names.version = simpleversion -- this number is the same as in font-dum.lua + logs.report("fontnames","generating font database for 'luatex-fonts' version %s",fonts.names.version) fonts.names.identify(true) local data = fonts.names.data if data then - data.fallback_mapping = nil + local simplemappings = { } + local simplified = { + mappings = simplemappings, + version = simpleversion, + } + local specifications = data.specifications + for _, format in ipairs(simplelist) do + for tag, index in pairs(data.mappings[format]) do + local s = specifications[index] + simplemappings[tag] = { s.rawname, s.filename, s.subfont } + end + end logs.report("fontnames","saving names in '%s'",name) - io.savedata(name,table.serialize(data,true)) + io.savedata(name,table.serialize(simplified,true)) + local data = io.loaddata(resolvers.find_file("font-dum.lua","tex")) + local dummy = string.match(data,"fonts%.names%.version%s*=%s*([%d%.]+)") + if tonumber(dummy) ~= simpleversion then + logs.report("fontnames","warning: version number %s in 'font-dum' does not match database version number %s",dummy or "?",simpleversion) + end elseif lfs.isfile(name) then os.remove(name) end end -local function showfeatures(v,n,f,s,t) - logs.simple("fontname: %s",v) - logs.simple("fullname: %s",n) - logs.simple("filename: %s",f) - local features = fonts.get_features(f,t) +local function showfeatures(tag,specification) + logs.simple("mapping : %s",tag) + logs.simple("fontname: %s",specification.fontname) + logs.simple("fullname: %s",specification.fullname) + logs.simple("filename: %s",specification.filename) + -- maybe more + local features = fonts.get_features(specification.filename,specification.format) if features then for what, v in table.sortedpairs(features) do local data = features[what] @@ -61,6 +84,10 @@ local function showfeatures(v,n,f,s,t) end end end + else + logs.simple() + logs.simple("no features") + logs.simple() end logs.reportline() end @@ -74,7 +101,7 @@ local function make_pattern(pattern) -- will become helper in string if pattern == "" then pattern = ".*" else - pattern = "^" .. pattern .. "$" +--~ pattern = "^" .. pattern .. "$" end return pattern end @@ -87,53 +114,120 @@ local function reloadbase(reload) end end -function scripts.fonts.list_by_pattern(pattern,reload,all,info) - reloadbase(reload) - local t = fonts.names.list(make_pattern(pattern)) +local function subfont(sf) + if sf then + return string.format("index: % 2s", sf) + else + return "" + end +end +local function fontweight(fw) + if fw then + return string.format("conflict: %s", fw) + else + return "" + end +end + +local function list_specifications(t) if t then local s, w = table.sortedkeys(t), { 0, 0, 0 } for k,v in ipairs(s) do local entry = t[v] - local n = #v if n > w[1] then w[1] = n end - local n = #entry[2] if n > w[2] then w[2] = n end - local n = #entry[3] if n > w[3] then w[3] = n end + s[k] = { + entry.familyname or "<nofamily>", + entry.weight or "<noweight>", + entry.style or "<nostyle>", + entry.width or "<nowidth>", + entry.fontname, + entry.filename, + subfont(entry.subfont), + fontweight(entry.fontweight), + } end - local template = "%-" .. w[1] .. "s %-" .. w[2] .. "s %-" .. w[3] .. "s %s" + table.formatcolumns(s) for k,v in ipairs(s) do - local entry = t[v] - local tag, fontname, filename, sub = v, entry[2], entry[3], entry[4] - if sub then sub = "(sub)" else sub = "" end - if info then - showfeatures(tag,fontname,filename,sub,t) - else - print(string.format(template,tag,fontname,filename,sub)) + texio.write_nl(v) + end + end +end + +local function list_matches(t) + if t then + local s, w = table.sortedkeys(t), { 0, 0, 0 } + if info then + for k,v in ipairs(s) do + showfeatures(v,t[v]) + end + else + for k,v in ipairs(s) do + local entry = t[v] + s[k] = { + v, + entry.fontname, + entry.filename, + subfont(entry.subfont) + } + end + table.formatcolumns(s) + for k,v in ipairs(s) do + texio.write_nl(v) end end end end -function scripts.fonts.list_by_specification(specification,reload,all,info) +function scripts.fonts.list() + + local all = environment.argument("all") + local info = environment.argument("info") + local reload = environment.argument("reload") + local pattern = environment.argument("pattern") + local filter = environment.argument("filter") + local given = environment.files[1] + reloadbase(reload) - local t = fonts.names.collectspec(specification) - if t then - local w, tags = { 0, 0, 0 }, { } - for k,entry in ipairs(t) do - local s = entry[5] .. "-" .. (entry[6] or "noweight") .. "-" .. (entry[7] or "nostyle") .. "-" .. (entry[8] or "nowidth") - local n = #s if n > w[1] then w[1] = n end - local n = #entry[2] if n > w[2] then w[2] = n end - local n = #entry[3] if n > w[3] then w[3] = n end - tags[k] = s + + if environment.argument("name") then + if pattern then + --~ mtxrun --script font --list --name --pattern=*somename* + list_matches(fonts.names.list(make_pattern(pattern),reload,all)) + elseif filter then + logs.report("fontnames","not supported: --list --name --filter",name) + elseif given then + --~ mtxrun --script font --list --name somename + list_matches(fonts.names.list(given,reload,all)) + else + logs.report("fontnames","not supported: --list --name <no specification>",name) end - local template = "%-" .. w[1] .."s %-" .. w[2] .. "s %-" .. w[3] .. "s %s" - for k,entry in ipairs(t) do - local tag, fontname, filename, sub, name, weight, style = tags[k], entry[2], entry[3], entry[4], entry[5], entry[6], entry[7] - if sub then sub = "(sub)" else sub = "" end - print(string.format(template,tag,fontname,filename,sub)) + elseif environment.argument("spec") then + if pattern then + --~ mtxrun --script font --list --spec --pattern=*somename* + logs.report("fontnames","not supported: --list --spec --pattern",name) + elseif filter then + --~ mtxrun --script font --list --spec --filter="fontname=somename" + list_specifications(fonts.names.getlookups(filter),nil,reload) + elseif given then + --~ mtxrun --script font --list --spec somename + list_specifications(fonts.names.collectspec(given,reload,all)) + else + logs.report("fontnames","not supported: --list --spec <no specification>",name) end + elseif pattern then + --~ mtxrun --script font --list --pattern=*somename* + list_matches(fonts.names.list(make_pattern(pattern),reload,all)) + elseif given then + --~ mtxrun --script font --list somename + list_matches(fonts.names.list(given,reload,all)) + else + logs.report("fontnames","not supported: --list <no specification>",name) end + end -function scripts.fonts.save(name,sub) +function scripts.fonts.save() + local name = environment.files[1] or "" + local sub = environment.files[2] or "" local function save(savename,fontblob) if fontblob then savename = savename:lower() .. ".lua" @@ -171,37 +265,49 @@ function scripts.fonts.save(name,sub) end end -logs.extendbanner("Font Tools 0.20",true) +logs.extendbanner("Font Tools 0.21",true) messages.help = [[ --reload generate new font database ---list [--info] list installed fonts (show info) --save save open type font in raw table --names generate 'luatex-fonts-names.lua' (not for context!) +--list list installed fonts (show info) + +--name filter by name +--spec filter by spec --pattern=str filter files using pattern +--filter=list key-value pairs --all provide alternatives +--info give more details +--track=list enable trackers + +examples: + +mtxrun --script font --list somename (== --pattern=*somename*) + +mtxrun --script font --list --name somename +mtxrun --script font --list --name --pattern=*somename* + +mtxrun --script font --list --spec somename +mtxrun --script font --list --spec somename-bold-italic +mtxrun --script font --list --spec --pattern=*somename* +mtxrun --script font --list --spec --filter="fontname=somename" +mtxrun --script font --list --spec --filter="familyname=somename,weight=bold,style=italic,width=condensed" ]] +local track = environment.argument("track") + +if track then trackers.enable(track) end + if environment.argument("reload") then scripts.fonts.reload(true) elseif environment.argument("names") then scripts.fonts.names() -elseif environment.argument("list") then - local all = environment.argument("all") - local info = environment.argument("info") - local reload = environment.argument("reload") - if environment.argument("pattern") then - scripts.fonts.list_by_pattern(environment.argument("pattern"),reload,all,info) - elseif environment.files[1] then - scripts.fonts.list_by_specification(environment.files[1],reload,all,info) - else - scripts.fonts.list_by_pattern("",reload,all,info) -- wildcard - end elseif environment.argument("save") then - local name = environment.files[1] or "" - local sub = environment.files[2] or "" - scripts.fonts.save(name,sub) + scripts.fonts.save() +elseif environment.argument("list") then + scripts.fonts.list() else logs.help(messages.help) end |