summaryrefslogtreecommitdiff
path: root/tex/context/base/font-ctx.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2013-03-15 11:59:00 +0100
committerHans Hagen <pragma@wxs.nl>2013-03-15 11:59:00 +0100
commitd85ec4e39d1529a187aa1435f45625d5ac00f9d3 (patch)
treeefca7334a935e4353882c986911245bb2e805352 /tex/context/base/font-ctx.lua
parent3df21ff8ee5dcb6a894a74e6c26a9be8486822e3 (diff)
downloadcontext-d85ec4e39d1529a187aa1435f45625d5ac00f9d3.tar.gz
beta 2013.03.15 11:59
Diffstat (limited to 'tex/context/base/font-ctx.lua')
-rw-r--r--tex/context/base/font-ctx.lua89
1 files changed, 65 insertions, 24 deletions
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index bf39ca025..0c99268a4 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -646,20 +646,35 @@ local function mergecontext(currentnumber,extraname,option) -- number string num
end
end
-local function mergecontextfeatures(currentname,extraname) -- string string
+local function mergecontextfeatures(currentname,extraname,how,mergedname) -- string string
local extra = setups[extraname]
if extra then
local current = setups[currentname]
- local mergedfeatures, mergedname = { }, nil
- if current then
- for k, v in next, current do
+ local mergedfeatures = { }
+ if how == "+" then
+ if current then
+ for k, v in next, current do
+ mergedfeatures[k] = v
+ end
+ end
+ for k, v in next, extra do
+ mergedfeatures[k] = v
+ end
+ elseif how == "-" then
+ if current then
+ for k, v in next, current do
+ mergedfeatures[k] = v
+ end
+ end
+ for k, v in next, extra do
+ mergedfeatures[k] = not v
+ end
+ else -- =
+ for k, v in next, extra do
mergedfeatures[k] = v
end
end
- for k, v in next, extra do
- mergedfeatures[k] = v
- end
- mergedname = currentname .. "+" .. extraname
+ -- local mergedname = currentname .. how .. extraname
local number = #numbers + 1
mergedfeatures.number = number
numbers[number] = mergedname
@@ -694,6 +709,25 @@ local function registercontext(fontnumber,extraname,option)
end
end
+local function registercontextfeature(fontnumber,extraname,how)
+ local extra = setups[extraname]
+ if extra then
+ local mergedfeatures, mergedname = { }, nil
+ mergedname = fontnumber .. how .. extraname
+ for k, v in next, extra do
+ mergedfeatures[k] = v
+ end
+ local number = #numbers + 1
+ mergedfeatures.number = number
+ numbers[number] = mergedname
+ merged[number] = option
+ setups[mergedname] = mergedfeatures
+ return number -- contextnumber(mergedname)
+ else
+ return 0
+ end
+end
+
specifiers.presetcontext = presetcontext
specifiers.contextnumber = contextnumber
specifiers.mergecontext = mergecontext
@@ -1662,26 +1696,33 @@ end
commands.definefontfeature = presetcontext
-function commands.feature(parent,name,font)
- local font = font or currentfont()
- local full = parent .. "+" .. name
- local hash = font .. "*" .. full .. "*" .. 2 -- what
- local done = withcache[hash]
- if done then
+local cache = { }
+
+function commands.feature(how,parent,name,font)
+ if not how then
+ texattribute[0] = 0
else
- local n = setups[full]
- if n then
+ local font = font or currentfont()
+ local full = parent .. how .. name
+ local hash = font .. how .. full -- what, hm
+ local done = cache[hash]
+ if done then
else
- n = mergecontextfeatures(parent,name) -- registers parent .. "+" .. name
- end
- done = registercontext(font,full,2) -- what
- withcache[hash] = done
- if trace_features then
- report_cummulative("font %!font:name!, number %a, set %a : %!font:features!",
- fontdata[font],done,full,setups[numbers[done]])
+ local n = setups[full]
+ if n then
+ -- already defined
+ else
+ n = mergecontextfeatures(parent,name,how,full) -- registers parent .. "+" .. name
+ end
+ done = registercontextfeature(font,full,how)
+ cache[hash] = done
+ if trace_features then
+ report_cummulative("font %!font:name!, number %a, set %a : %!font:features!",
+ fontdata[font],done,full,setups[numbers[done]])
+ end
end
+ texattribute[0] = done
end
- texattribute[0] = done
end
function commands.featurelist(...)