summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/font-sel.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/font-sel.lua')
-rw-r--r--tex/context/base/mkiv/font-sel.lua195
1 files changed, 107 insertions, 88 deletions
diff --git a/tex/context/base/mkiv/font-sel.lua b/tex/context/base/mkiv/font-sel.lua
index 4c80ff1fb..b4dd9a555 100644
--- a/tex/context/base/mkiv/font-sel.lua
+++ b/tex/context/base/mkiv/font-sel.lua
@@ -1,64 +1,63 @@
if not modules then modules = { } end modules ['font-sel'] = {
- version = 1.000,
+ version = 1.001,
comment = "companion to font-sel.mkvi",
author = "Wolfgang Schuster",
copyright = "Wolfgang Schuster",
license = "GNU General Public License"
}
-local context = context
-local cleanname = fonts.names.cleanname
-local gsub, splitup, find = string.gsub, string.splitup, string.find
-local concat, sortedkeys = table.concat, table.sortedkeys
-local merge, remove = table.merge, table.remove
-local splitbase, removesuffix = file.splitbase, file.removesuffix
-local splitat, lpegmatch = lpeg.splitat, lpeg.match
-
-local formatters = string.formatters
-local settings_to_array = utilities.parsers.settings_to_array
-local settings_to_hash = utilities.parsers.settings_to_hash
-
-local v_yes = interfaces.variables.yes
-local v_default = interfaces.variables.default
-
-local implement = interfaces.implement
-
-local selectfont = fonts.select or { }
-fonts.select = selectfont
-
-local data = selectfont.data or { }
-selectfont.data = data
-
-local fallbacks = selectfont.fallbacks or { }
-selectfont.fallbacks = fallbacks
-
-local methods = selectfont.methods or { }
-selectfont.methods = methods
-
-local extras = selectfont.extras or { }
-selectfont.extras = extras
-
-local alternatives = selectfont.alternatives or { }
-selectfont.alternatives = alternatives
-
-local presets = selectfont.presets or { }
-selectfont.presets = presets
-
-local defaults = selectfont.defaults or { }
-selectfont.defaults = defaults
-
-local getlookups = fonts.names.getlookups
-local registerdesignsizes = fonts.goodies.designsizes.register
-local bodyfontsizes = storage.shared.bodyfontsizes
-
-local ctx_definefontsynonym = context.definefontsynonym
-local ctx_resetfontfallback = context.resetfontfallback
-local ctx_startfontclass = context.startfontclass
-local ctx_stopfontclass = context.stopfontclass
-local ctx_loadfontgoodies = context.loadfontgoodies
-local ctx_definefontfallback = context.definefontfallback
-local ctx_definetypeface = context.definetypeface
-local ctx_definebodyfont = context.definebodyfont
+local context = context
+local cleanname = fonts.names.cleanname
+local gsub, splitup, find, lower = string.gsub, string.splitup, string.find, string.lower
+local concat, sortedkeys = table.concat, table.sortedkeys
+local merge, remove = table.merge, table.remove
+local splitbase, removesuffix = file.splitbase, file.removesuffix
+local splitat, lpegmatch = lpeg.splitat, lpeg.match
+
+local formatters = string.formatters
+local settings_to_array = utilities.parsers.settings_to_array
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+local v_default = interfaces.variables.default
+
+local implement = interfaces.implement
+
+local fonts = fonts
+
+local getlookups = fonts.names.getlookups
+local registerdesignsizes = fonts.goodies.designsizes.register
+local bodyfontsizes = storage.shared.bodyfontsizes
+
+fonts.select = fonts.select or { }
+local selectfont = fonts.select
+
+selectfont.data = selectfont.data or allocate()
+selectfont.fallbacks = selectfont.fallbacks or allocate()
+selectfont.methods = selectfont.methods or allocate()
+selectfont.extras = selectfont.extras or allocate()
+selectfont.alternatives = selectfont.alternatives or allocate()
+selectfont.presets = selectfont.presets or allocate()
+selectfont.defaults = selectfont.defaults or allocate()
+
+storage.register("fonts/select/presets", selectfont.presets, "fonts.select.presets")
+
+local data = selectfont.data
+local fallbacks = selectfont.fallbacks
+local methods = selectfont.methods
+local extras = selectfont.extras
+local alternatives = selectfont.alternatives
+local presets = selectfont.presets
+local defaults = selectfont.defaults
+
+local ctx_definefontsynonym = context.definefontsynonym
+local ctx_resetfontfallback = context.resetfontfallback
+local ctx_startfontclass = context.startfontclass
+local ctx_stopfontclass = context.stopfontclass
+local ctx_loadfontgoodies = context.loadfontgoodies
+local ctx_definefontfallback = context.definefontfallback
+local ctx_definetypeface = context.definetypeface
+local ctx_definebodyfont = context.definebodyfont
local trace_register = false trackers.register("selectfont.register", function(v) trace_register = v end)
local trace_files = false trackers.register("selectfont.files", function(v) trace_files = v end)
@@ -71,7 +70,6 @@ local report_selectfont = logs.reporter("selectfont")
local report_files = logs.reporter("selectfont","files")
local report_features = logs.reporter("selectfont","features")
local report_goodies = logs.reporter("selectfont","goodies")
-local report_alternatives = logs.reporter("selectfont","alternatives")
local report_typescript = logs.reporter("selectfont","typescripts")
defaults["rm"] = { features = { ["sc"] = "*,f:smallcaps" } }
@@ -83,6 +81,8 @@ defaults["dejavumath"] = { options = { extras = "dejavu",
defaults["neoeuler"] = { options = { extras = "euler-math", features = "math\\mathsizesuffix" } }
defaults["latinmodernmath"] = { options = { extras = "lm,lm-math", features = "math\\mathsizesuffix,lm-math", goodies = "lm" } }
defaults["lucidabrightmathot"] = { options = { extras = "lucida-opentype-math", features = "math\\mathsizesuffix", goodies = "lucida-opentype-math" } }
+defaults["minionmath"] = { options = { extras = "minion-math", features = "math\\mathsizesuffix", goodies = "minion-math" } }
+defaults["texgyredejavumath"] = { options = { extras = "dejavu", features = "math\\mathsizesuffix" } }
defaults["texgyrepagellamath"] = { options = { extras = "texgyre", features = "math\\mathsizesuffix" } }
defaults["texgyrebonummath"] = { options = { extras = "texgyre", features = "math\\mathsizesuffix" } }
defaults["texgyrescholamath"] = { options = { extras = "texgyre", features = "math\\mathsizesuffix" } }
@@ -148,9 +148,9 @@ methods["name"] = function(data,alternative,name)
local fontname = getlookups{ fontname = filename }
local fullname = getlookups{ fullname = filename }
if #fontname > 0 then
- selectfont_savefile(data,alternative,0,"default",fullname[1])
- elseif #fullname > 0 then
selectfont_savefile(data,alternative,0,"default",fontname[1])
+ elseif #fullname > 0 then
+ selectfont_savefile(data,alternative,0,"default",fullname[1])
else
if trace_alternatives then
report_selectfont("Alternative '%s': No font was found for the requested name '%s'",alternative,filename)
@@ -227,7 +227,7 @@ local m_alternative = {
["sl"] = "italic",
["bi"] = "bolditalic",
["bs"] = "bolditalic",
- ["sc"] = "regular"
+ ["sc"] = "smallcaps"
}
--~ methods["style"] = function(data,alternative,style)
@@ -294,6 +294,20 @@ local function m_style_family(family)
end
end
+local function m_style_subfamily(entries,style,family)
+ local t = { }
+ local style = cleanname(style)
+ local family = cleanname(family)
+ for index, entry in next, entries do
+ if entry["familyname"] == family and entry["subfamilyname"] == style then -- familyname + subfamilyname
+ t[#t+1] = entry
+ elseif entry["family"] == family and entry["subfamily"] == style then -- family + subfamily
+ t[#t+1] = entry
+ end
+ end
+ return #t ~= 0 and t or nil
+end
+
local function m_style_weight(entries,style)
local t = { }
local weight = m_name[style] and m_name[style]["weight"] or "regular"
@@ -396,13 +410,18 @@ methods["style"] = function(data,alternative,style)
local fontstyle = m_alternative[style] or style
local entries = m_style_family(fontfamily)
if entries then
- entries = m_style_weight(entries,fontstyle)
- if entries then
- entries = m_style_style(entries,fontstyle)
+ local subfamily = m_style_subfamily(entries,fontstyle,fontfamily)
+ if subfamily then
+ entries = subfamily
+ else
+ entries = m_style_weight(entries,fontstyle)
if entries then
- entries = m_style_variant(entries,fontstyle)
- if entries and #entries > 1 and designsize == "default" then
- entries = m_style_width(entries,fontstyle)
+ entries = m_style_style(entries,fontstyle)
+ if entries then
+ entries = m_style_variant(entries,fontstyle)
+ if entries and #entries > 1 and designsize == "default" then
+ entries = m_style_width(entries,fontstyle)
+ end
end
end
end
@@ -543,7 +562,7 @@ function selectfont.registerfontalternative(alternative)
end
function selectfont.registerfallback(index)
- local data = data[index]
+ local data = data[index]
local fontclass = data.metadata.typeface
local fontstyle = data.metadata.style
local fallback = fallbacks[fontclass]
@@ -640,18 +659,19 @@ function selectfont.fontsynonym(data,class,style,alternative,index)
local fontfiles = data.files[alternative] or data.files["tf"]
local fontsizes = sortedkeys(fontfiles)
local fallback = index ~= 0
+ local fontclass = lower(class)
--~ local fontfeature = data.features and data.features[alternative] or data.options.features
--~ local fontgoodie = data.goodies and data.goodies [alternative] or data.options.goodies
local fontfeature = selectfont.features(data,style,alternative)
local fontgoodie = selectfont.goodies (data,style,alternative)
local synonym = m_synonym[style] and m_synonym[style][alternative]
- local fontfile = formatters ["file-%s-%s-%s"](class,style,alternative)
- local fontsynonym = formatters ["synonym-%s-%s-%s"](class,style,alternative)
+ local fontfile = formatters ["file-%s-%s-%s"](fontclass,style,alternative)
+ local fontsynonym = formatters ["synonym-%s-%s-%s"](fontclass,style,alternative)
if fallback then
- fontfile = formatters ["file-%s-%s-%s-%s"](class,style,alternative,index)
- fontsynonym = formatters ["synonym-%s-%s-%s-%s"](class,style,alternative,index)
+ fontfile = formatters ["file-%s-%s-%s-%s"](fontclass,style,alternative,index)
+ fontsynonym = formatters ["synonym-%s-%s-%s-%s"](fontclass,style,alternative,index)
end
- local fontfallback = formatters["fallback-%s-%s-%s"](class,style,alternative)
+ local fontfallback = formatters["fallback-%s-%s-%s"](fontclass,style,alternative)
for _, fontsize in next, fontsizes do
--~ if trace_typescript then
--~ report_typescript("Synonym: '%s', Size: '%s', File: '%s'",fontfile,fontfiles[fontsize][1],fontfiles[fontsize][2])
@@ -678,13 +698,14 @@ function selectfont.fontsynonym(data,class,style,alternative,index)
end
function selectfont.fontfallback(data,class,style,alternative,index)
- local range = data.options.range
- local scale = data.options.rscale ~= "" and data.options.rscale or 1
- local check = data.options.check ~= "" and data.options.check or "yes"
- local force = data.options.force ~= "" and data.options.force or "no"
- local fontfeature = data.features and data.features[alternative] or data.options.features
- local fontsynonym = formatters["synonym-%s-%s-%s-%s"](class,style,alternative,index)
- local fontfallback = formatters["fallback-%s-%s-%s"] (class,style,alternative)
+ local range = data.options.range
+ local scale = data.options.rscale ~= "" and data.options.rscale or 1
+ local check = data.options.check ~= "" and data.options.check or ""
+ local force = data.options.force ~= "" and data.options.force or ""
+ local fontfeature = data.features and data.features[alternative] or data.options.features
+ local fontclass = lower(class)
+ local fontsynonym = formatters ["synonym-%s-%s-%s-%s"](fontclass,style,alternative,index)
+ local fontfallback = formatters["fallback-%s-%s-%s"] (fontclass,style,alternative)
if index == 1 then
ctx_resetfontfallback( { fontfallback } )
end
@@ -702,7 +723,8 @@ function selectfont.filefallback(data,class,style,alternative,index)
local force = data.options.force ~= "" and data.options.force or "yes"
local fontfile = data.files[alternative] and data.files[alternative][0] or data.files["tf"][0]
local fontfeature = data.features and data.features[alternative] or data.options.features
- local fontfallback = formatters["fallback-%s-%s-%s"](class,style,alternative)
+ local fontclass = lower(class)
+ local fontfallback = formatters["fallback-%s-%s-%s"](fontclass,style,alternative)
if index == 1 then
ctx_resetfontfallback( { fontfallback } )
end
@@ -713,7 +735,7 @@ function selectfont.filefallback(data,class,style,alternative,index)
end
function selectfont.mathfallback(index,entry,class,style)
- local data = data[entry]
+ local data = data[entry]
ctx_startfontclass( { class } )
for alternative, _ in next, alternatives do
if alternative == "tf" or alternative == "bf" then
@@ -724,7 +746,7 @@ function selectfont.mathfallback(index,entry,class,style)
end
function selectfont.textfallback(index,entry,class,style)
- local data = data[entry]
+ local data = data[entry]
ctx_startfontclass( { class } )
for alternative, _ in next, alternatives do
selectfont.fontsynonym (data,class,style,alternative,index)
@@ -780,8 +802,9 @@ function selectfont.typescript(data)
end
function selectfont.bodyfont(data)
- local fontclass = data.metadata.typeface
+ local class = data.metadata.typeface
local fontstyle = data.metadata.style
+ local fontclass = lower(class)
local fontsizes = concat(sortedkeys(bodyfontsizes),",")
local fontsynonym = nil
local fontlist = { }
@@ -793,7 +816,7 @@ function selectfont.bodyfont(data)
--~ end
end
fontlist = concat(fontlist,",")
- ctx_definebodyfont( { fontclass }, { fontsizes }, { fontstyle }, { fontlist } )
+ ctx_definebodyfont( { class }, { fontsizes }, { fontstyle }, { fontlist } )
end
local m_style = {
@@ -814,11 +837,7 @@ function selectfont.typeface(data)
--~ if trace_typescript then
--~ report_typescript("Class: '%s', Style: '%s', Size: '%s', Scale: '%s'",fontclass,fontstyle,size,scale)
--~ end
- if fontstyle == "mm" then -- math uses the default bodyfont settings because it uses 'ma' and 'mb' as alternative names
- ctx_definetypeface( { fontclass }, { fontstyle }, { style }, { "" }, { "default" }, { designsize = size, rscale = scale } )
- else
- ctx_definetypeface( { fontclass }, { fontstyle }, { "" }, { "" }, { "" }, { designsize = size, rscale = scale } )
- end
+ ctx_definetypeface( { fontclass }, { fontstyle }, { style }, { "" }, { "default" }, { designsize = size, rscale = scale } )
end
function selectfont.default(data)
@@ -923,4 +942,4 @@ implement {
name = "definefontfamilypreset",
actions = selectfont.definefontfamilypreset,
arguments = { "string", "string" }
-} \ No newline at end of file
+}