font-imp-properties.lua /size: 4053 b    last modification: 2023-12-21 09:44
1if not modules then modules = { } end modules ['font-imp-properties'] = {
2    version   = 1.001,
3    comment   = "companion to font-ini.mkiv and hand-ini.mkiv",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files"
7}
8
9if not context then return end
10
11local next, type, tonumber, select = next, type, tonumber, select
12local byte, find, formatters = string.byte, string.find, string.formatters
13local utfchar = utf.char
14local sortedhash, sortedkeys, sort = table.sortedhash, table.sortedkeys, table.sort
15local insert = table.insert
16
17local context            = context
18local fonts              = fonts
19local utilities          = utilities
20
21local helpers            = fonts.helpers
22
23local handlers           = fonts.handlers
24local hashes             = fonts.hashes
25local otf                = handlers.otf
26local afm                = handlers.afm
27
28local registerotffeature = otf.features.register
29local registerafmfeature = afm.features.register
30
31local fontdata           = hashes.identifiers
32local fontproperties     = hashes.properties
33
34local constructors       = fonts.constructors
35local getprivate         = constructors.getprivate
36
37local allocate           = utilities.storage.allocate
38
39local setmetatableindex  = table.setmetatableindex
40
41local implement          = interfaces.implement
42
43do
44
45    local P, lpegpatterns, lpegmatch  = lpeg.P, lpeg.patterns, lpeg.match
46
47    local amount, stretch, shrink, extra
48
49    local factor  = lpegpatterns.unsigned
50    local space   = lpegpatterns.space
51    local pattern = (
52                                            (factor / function(n) amount  = tonumber(n) or amount  end)
53        + (P("+") + P("plus" )) * space^0 * (factor / function(n) stretch = tonumber(n) or stretch end)
54        + (P("-") + P("minus")) * space^0 * (factor / function(n) shrink  = tonumber(n) or shrink  end)
55        + (         P("extra")) * space^0 * (factor / function(n) extra   = tonumber(n) or extra   end)
56        + space^1
57    )^1
58
59    local function initialize(tfmdata,key,value)
60        local characters = tfmdata.characters
61        local parameters = tfmdata.parameters
62        if type(value) == "string" then
63            local emwidth = parameters.quad
64            amount, stretch, shrink, extra = 0, 0, 0, false
65            lpegmatch(pattern,value)
66            if not extra then
67                if shrink ~= 0 then
68                    extra = shrink
69                elseif stretch ~= 0 then
70                    extra = stretch
71                else
72                    extra = amount
73                end
74            end
75            parameters.space        = amount  * emwidth
76            parameters.spacestretch = stretch * emwidth
77            parameters.spaceshrink  = shrink  * emwidth
78            parameters.extraspace   = extra   * emwidth
79        end
80    end
81
82    -- 1.1 + 1.2 - 1.3 minus 1.4 plus 1.1 extra 1.4 -- last one wins
83
84    registerotffeature {
85        name        = "spacing",
86        description = "space settings",
87        manipulators = {
88            base = initialize,
89            node = initialize,
90        }
91    }
92
93end
94
95do
96
97    local function initialize(tfmdata,value)
98        local properties = tfmdata.properties
99        if properties then
100            properties.identity = value == "vertical" and "vertical" or "horizontal"
101        end
102    end
103
104    registerotffeature {
105        name         = "identity",
106        description  = "set font identity",
107        initializers = {
108            base = initialize,
109            node = initialize,
110        }
111    }
112
113    local function initialize(tfmdata,value)
114        local properties = tfmdata.properties
115        if properties then
116            properties.writingmode = value == "vertical" and "vertical" or "horizontal"
117        end
118    end
119
120    registerotffeature {
121        name         = "writingmode",
122        description  = "set font direction",
123        initializers = {
124            base = initialize,
125            node = initialize,
126        }
127    }
128
129end
130