diff options
Diffstat (limited to 'Master/texmf-dist/scripts/context/lua/mtx-fonts.lua')
-rw-r--r-- | Master/texmf-dist/scripts/context/lua/mtx-fonts.lua | 231 |
1 files changed, 140 insertions, 91 deletions
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua index 74012ae38d3..8c8f47a70ab 100644 --- a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua +++ b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua @@ -6,22 +6,107 @@ if not modules then modules = { } end modules ['mtx-fonts'] = { license = "see context related readme files" } +local helpinfo = [[ +--save save open type font in raw table + +--reload generate new font database +--reload --simple generate 'luatex-fonts-names.lua' (not for context!) + +--list --name list installed fonts, filter by name [--pattern] +--list --spec list installed fonts, filter by spec [--filter] +--list --file list installed fonts, filter by file [--pattern] + +--pattern=str filter files using pattern +--filter=list key-value pairs +--all show all found instances +--info give more details +--track=list enable trackers +--statistics some info about the database + +examples of searches: + +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" +mtxrun --script font --list --spec --filter="familyname=crap*,weight=bold,style=italic" + +mtxrun --script font --list --file somename +mtxrun --script font --list --file --pattern=*somename* +]] + +local application = logs.application { + name = "mtx-fonts", + banner = "ConTeXt Font Database Management 0.21", + helpinfo = helpinfo, +} + +local report = application.report + +-- todo: fc-cache -v en check dirs, or better is: fc-cat -v | grep Directory + if not fontloader then fontloader = fontforge end -dofile(resolvers.find_file("font-otp.lua","tex")) -dofile(resolvers.find_file("font-syn.lua","tex")) -dofile(resolvers.find_file("font-mis.lua","tex")) +dofile(resolvers.findfile("font-otp.lua","tex")) -- we need to unpack the font for analysis +dofile(resolvers.findfile("font-syn.lua","tex")) +dofile(resolvers.findfile("font-mis.lua","tex")) scripts = scripts or { } scripts.fonts = scripts.fonts or { } +function fonts.names.statistics() + fonts.names.load() + + local data = fonts.names.data + local statistics = data.statistics + + local function counted(t) + local n = { } + for k, v in next, t do + n[k] = table.count(v) + end + return table.sequenced(n) + end + + report("cache uuid : %s", data.cache_uuid) + report("cache version : %s", data.cache_version) + report("number of trees : %s", #data.datastate) + report() + report("number of fonts : %s", statistics.fonts or 0) + report("used files : %s", statistics.readfiles or 0) + report("skipped files : %s", statistics.skippedfiles or 0) + report("duplicate files : %s", statistics.duplicatefiles or 0) + report("specifications : %s", #data.specifications) + report("families : %s", table.count(data.families)) + report() + report("mappings : %s", counted(data.mappings)) + report("fallbacks : %s", counted(data.fallbacks)) + report() + report("used styles : %s", table.sequenced(statistics.used_styles)) + report("used variants : %s", table.sequenced(statistics.used_variants)) + report("used weights : %s", table.sequenced(statistics.used_weights)) + report("used widths : %s", table.sequenced(statistics.used_widths)) + report() + report("found styles : %s", table.sequenced(statistics.styles)) + report("found variants : %s", table.sequenced(statistics.variants)) + report("found weights : %s", table.sequenced(statistics.weights)) + report("found widths : %s", table.sequenced(statistics.widths)) + +end + function fonts.names.simple() local simpleversion = 1.001 local simplelist = { "ttf", "otf", "ttc", "dfont" } local name = "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) + report("generating font database for 'luatex-fonts' version %s",fonts.names.version) fonts.names.identify(true) local data = fonts.names.data if data then @@ -38,12 +123,12 @@ function fonts.names.simple() simplemappings[tag] = { s.rawname, s.filename, s.subfont } end end - logs.report("fontnames","saving names in '%s'",name) + report("saving names in '%s'",name) io.savedata(name,table.serialize(simplified,true)) - local data = io.loaddata(resolvers.find_file("font-dum.lua","tex")) + local data = io.loaddata(resolvers.findfile("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) + report("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) @@ -75,28 +160,29 @@ local function fontweight(fw) end 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) - logs.simple("family : %s",specification.familyname or "<nofamily>") - logs.simple("weight : %s",specification.weight or "<noweight>") - logs.simple("style : %s",specification.style or "<nostyle>") - logs.simple("width : %s",specification.width or "<nowidth>") - logs.simple("variant : %s",specification.variant or "<novariant>") - logs.simple("subfont : %s",subfont(specification.subfont)) - logs.simple("fweight : %s",fontweight(specification.fontweight)) + report() + report("mapping : %s",tag) + report("fontname: %s",specification.fontname) + report("fullname: %s",specification.fullname) + report("filename: %s",specification.filename) + report("family : %s",specification.familyname or "<nofamily>") + report("weight : %s",specification.weight or "<noweight>") + report("style : %s",specification.style or "<nostyle>") + report("width : %s",specification.width or "<nowidth>") + report("variant : %s",specification.variant or "<novariant>") + report("subfont : %s",subfont(specification.subfont)) + report("fweight : %s",fontweight(specification.fontweight)) -- maybe more - local features = fonts.get_features(specification.filename,specification.format) + local features = fonts.helpers.getfeatures(specification.filename,specification.format) if features then for what, v in table.sortedhash(features) do local data = features[what] if data and next(data) then - logs.simple() - logs.simple("%s features:",what) - logs.simple() - logs.simple("feature script languages") - logs.simple() + report() + report("%s features:",what) + report() + report("feature script languages") + report() for f,ff in table.sortedhash(data) do local done = false for s, ss in table.sortedhash(ff) do @@ -107,24 +193,22 @@ local function showfeatures(tag,specification) else done = true end - logs.simple("% -8s % -8s % -8s",f,s,table.concat(table.sortedkeys(ss), " ")) + report("% -8s % -8s % -8s",f,s,table.concat(table.sortedkeys(ss), " ")) -- todo: padd 4 end end end end else - logs.simple() - logs.simple("no features") - logs.simple() + report("no features") end - logs.reportline() + report() end local function reloadbase(reload) if reload then - logs.simple("fontnames, reloading font database") + report("fontnames, reloading font database") names.load(true) - logs.simple("fontnames, done\n\n") + report("fontnames, done\n\n") end end @@ -151,12 +235,10 @@ local function list_specifications(t,info) subfont(entry.subfont), fontweight(entry.fontweight), } - e[k] = entry end - table.formatcolumns(s) + utilities.formatters.formatcolumns(s) for k=1,#s do - local v = s[k] - texio.write_nl(v) + texio.write_nl(s[k]) end end end @@ -181,7 +263,7 @@ local function list_matches(t,info) subfont(entry.subfont) } end - table.formatcolumns(s) + utilities.formatters.formatcolumns(s) for k=1,#s do texio.write_nl(s[k]) end @@ -205,17 +287,17 @@ function scripts.fonts.list() --~ mtxrun --script font --list --name --pattern=*somename* list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info) elseif filter then - logs.report("fontnames","not supported: --list --name --filter",name) + report("not supported: --list --name --filter",name) elseif given then --~ mtxrun --script font --list --name somename list_matches(fonts.names.list(given,reload,all),info) else - logs.report("fontnames","not supported: --list --name <no specification>",name) + report("not supported: --list --name <no specification>",name) end elseif environment.argument("spec") then if pattern then --~ mtxrun --script font --list --spec --pattern=*somename* - logs.report("fontnames","not supported: --list --spec --pattern",name) + report("not supported: --list --spec --pattern",name) elseif filter then --~ mtxrun --script font --list --spec --filter="fontname=somename" list_specifications(fonts.names.getlookups(filter),info) @@ -223,19 +305,19 @@ function scripts.fonts.list() --~ mtxrun --script font --list --spec somename list_specifications(fonts.names.collectspec(given,reload,all),info) else - logs.report("fontnames","not supported: --list --spec <no specification>",name) + report("not supported: --list --spec <no specification>",name) end elseif environment.argument("file") then if pattern then --~ mtxrun --script font --list --file --pattern=*somename* list_specifications(fonts.names.collectfiles(string.topattern(pattern,true),reload,all),info) elseif filter then - logs.report("fontnames","not supported: --list --spec",name) + report("not supported: --list --spec",name) elseif given then --~ mtxrun --script font --list --file somename list_specifications(fonts.names.collectfiles(given,reload,all),info) else - logs.report("fontnames","not supported: --list --file <no specification>",name) + report("not supported: --list --file <no specification>",name) end elseif pattern then --~ mtxrun --script font --list --pattern=*somename* @@ -243,8 +325,11 @@ function scripts.fonts.list() elseif given then --~ mtxrun --script font --list somename list_matches(fonts.names.list(given,reload,all),info) + elseif all then + pattern = "*" + list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info) else - logs.report("fontnames","not supported: --list <no specification>",name) + report("not supported: --list <no specification>",name) end end @@ -255,19 +340,20 @@ function scripts.fonts.save() local function save(savename,fontblob) if fontblob then savename = savename:lower() .. ".lua" - logs.simple("fontsave, saving data in %s",savename) + report("fontsave, saving data in %s",savename) +-- fontloader.apply_featurefile(fontblob, "./ts/test.fea") table.tofile(savename,fontloader.to_table(fontblob),"return") fontloader.close(fontblob) end end if name and name ~= "" then - local filename = resolvers.find_file(name) -- maybe also search for opentype + local filename = resolvers.findfile(name) -- maybe also search for opentype if filename and filename ~= "" then - local suffix = file.extname(filename) + local suffix = string.lower(file.extname(filename)) if suffix == 'ttf' or suffix == 'otf' or suffix == 'ttc' or suffix == "dfont" then local fontinfo = fontloader.info(filename) if fontinfo then - logs.simple("font: %s located as %s",name,filename) + report("font: %s located as %s",name,filename) if fontinfo[1] then for k=1,#fontinfo do local v = fontinfo[k] @@ -277,58 +363,19 @@ function scripts.fonts.save() save(fontinfo.fullname,fontloader.open(filename)) end else - logs.simple("font: %s cannot be read",filename) + report("font: %s cannot be read",filename) end else - logs.simple("font: %s not saved",filename) + report("font: %s not saved",filename) end else - logs.simple("font: %s not found",name) + report("font: %s not found",name) end else - logs.simple("font: no name given") + report("font: no name given") end end -logs.extendbanner("ConTeXt Font Database Management 0.21",true) - -messages.help = [[ ---save save open type font in raw table - ---reload generate new font database ---reload --simple generate 'luatex-fonts-names.lua' (not for context!) - ---list --name list installed fonts, filter by name [--pattern] ---list --spec list installed fonts, filter by spec [--filter] ---list --file list installed fonts, filter by file [--pattern] - ---pattern=str filter files using pattern ---filter=list key-value pairs ---all show all found instances ---info give more details ---track=list enable trackers - -examples of searches: - -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" - -mtxrun --script font --list --file somename -mtxrun --script font --list --file --pattern=*somename* -]] - -local track = environment.argument("track") - -if track then trackers.enable(track) end - if environment.argument("names") then environment.setargument("reload",true) environment.setargument("simple",true) @@ -340,6 +387,8 @@ elseif environment.argument("reload") then scripts.fonts.reload() elseif environment.argument("save") then scripts.fonts.save() +elseif environment.argument("statistics") then + fonts.names.statistics() else - logs.help(messages.help) + application.help() end |