summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/context/lua/mtx-fonts.lua')
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-fonts.lua231
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