1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
if not modules then modules = { } end modules ['luatex-fonts-def'] = {
version = 1.001,
comment = "companion to luatex-*.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
if context then
os.exit()
end
local fonts = fonts
-- A bit of tuning for definitions.
fonts.constructors.namemode = "specification" -- somehow latex needs this (changed name!) => will change into an overload
-- tricky: we sort of bypass the parser and directly feed all into
-- the sub parser
function fonts.definers.getspecification(str)
return "", str, "", ":", str
end
-- the generic name parser (different from context!)
local list = { } -- we could pass Carg but let's keep the old one
local function issome () list.lookup = 'name' end -- xetex mode prefers name (not in context!)
local function isfile () list.lookup = 'file' end
local function isname () list.lookup = 'name' end
local function thename(s) list.name = s end
local function issub (v) list.sub = v end
local function iscrap (s) list.crap = string.lower(s) end
local function iskey (k,v) list[k] = v end
local function istrue (s) list[s] = true end
local function isfalse(s) list[s] = false end
local P, S, R, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs
local spaces = P(" ")^0
local namespec = Cs((P("{")/"") * (1-S("}"))^0 * (P("}")/"") + (1-S("/:("))^0)
local crapspec = spaces * P("/") * (((1-P(":"))^0)/iscrap) * spaces
local filename_1 = P("file:")/isfile * (namespec/thename)
local filename_2 = P("[") * P(true)/isfile * (((1-P("]"))^0)/thename) * P("]")
local fontname_1 = P("name:")/isname * (namespec/thename)
local fontname_2 = P(true)/issome * (namespec/thename)
local sometext = R("az","AZ","09")^1
local somekey = R("az","AZ","09")^1
local somevalue = (P("{")/"")*(1-P("}"))^0*(P("}")/"") + (1-S(";"))^1
local truevalue = P("+") * spaces * (sometext/istrue)
local falsevalue = P("-") * spaces * (sometext/isfalse)
local keyvalue = (C(somekey) * spaces * P("=") * spaces * C(somevalue))/iskey
local somevalue = sometext/istrue
local subvalue = P("(") * (C(P(1-S("()"))^1)/issub) * P(")") -- for Kim
local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
local options = P(":") * spaces * (P(";")^0 * option)^0
local pattern = (filename_1 + filename_2 + fontname_1 + fontname_2)
* subvalue^0 * crapspec^0 * options^0
function fonts.definers.analyze(str,size)
local specification = fonts.definers.makespecification(str,nil,nil,nil,":",nil,size)
list = { }
lpeg.match(pattern,str)
list.crap = nil
if list.name then
specification.name = list.name
list.name = nil
end
if list.lookup then
specification.lookup = list.lookup
list.lookup = nil
end
if list.sub then
specification.sub = list.sub
list.sub = nil
end
specification.features.normal = fonts.handlers.otf.features.normalize(list)
list = nil
return specification
end
function fonts.definers.applypostprocessors(tfmdata)
local postprocessors = tfmdata.postprocessors
if postprocessors then
for i=1,#postprocessors do
local extrahash = postprocessors[i](tfmdata) -- after scaling etc
if type(extrahash) == "string" and extrahash ~= "" then
-- e.g. a reencoding needs this
extrahash = string.gsub(lower(extrahash),"[^a-z]","-")
tfmdata.properties.fullname = format("%s-%s",tfmdata.properties.fullname,extrahash)
end
end
end
return tfmdata
end
|