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