summaryrefslogtreecommitdiff
path: root/src/fontloader/misc/fontloader-fonts-syn.lua
blob: f03d558bfb4b52b77c9e872fdc0c87faa4a6d19d (plain)
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
99
100
101
102
103
104
105
106
if not modules then modules = { } end modules ['luatex-fonts-syn'] = {
    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
    texio.write_nl("fatal error: this module is not for context")
    os.exit()
end

-- Generic font names support.
--
-- Watch out, the version number is the same as the one used in
-- the mtx-fonts.lua function scripts.fonts.names as we use a
-- simplified font database in the plain solution and by using
-- a different number we're less dependent on context.
--
-- mtxrun --script font --reload --simple
--
-- The format of the file is as follows:
--
-- return {
--     ["version"]       = 1.001,
--     ["cache_version"] = 1.001,
--     ["mappings"]      = {
--         ["somettcfontone"] = { "Some TTC Font One", "SomeFontA.ttc", 1 },
--         ["somettcfonttwo"] = { "Some TTC Font Two", "SomeFontA.ttc", 2 },
--         ["somettffont"]    = { "Some TTF Font",     "SomeFontB.ttf"    },
--         ["someotffont"]    = { "Some OTF Font",     "SomeFontC.otf"    },
--     },
-- }

local fonts = fonts
fonts.names = fonts.names or { }

fonts.names.version    = 1.001 -- not the same as in context but matches mtx-fonts --simple
fonts.names.basename   = "luatex-fonts-names"
fonts.names.new_to_old = { }
fonts.names.old_to_new = { }
fonts.names.cache      = containers.define("fonts","data",fonts.names.version,true)

local data, loaded = nil, false

local fileformats = { "lua", "tex", "other text files" }

function fonts.names.reportmissingbase()
    texio.write("<missing font database, run: mtxrun --script fonts --reload --simple>")
    fonts.names.reportmissingbase = nil
end

function fonts.names.reportmissingname()
    texio.write("<unknown font in database, run: mtxrun --script fonts --reload --simple>")
    fonts.names.reportmissingname = nil
end

function fonts.names.resolve(name,sub)
    if not loaded then
        local basename = fonts.names.basename
        if basename and basename ~= "" then
            data = containers.read(fonts.names.cache,basename)
            if not data then
                basename = file.addsuffix(basename,"lua")
                for i=1,#fileformats do
                    local format = fileformats[i]
                    local foundname = resolvers.findfile(basename,format) or ""
                    if foundname ~= "" then
                        data = dofile(foundname)
                        texio.write("<font database loaded: ",foundname,">")
                        break
                    end
                end
            end
        end
        loaded = true
    end
    if type(data) == "table" and data.version == fonts.names.version then
        local condensed = string.gsub(string.lower(name),"[^%a%d]","")
        local found = data.mappings and data.mappings[condensed]
        if found then
            local fontname, filename, subfont = found[1], found[2], found[3]
            if subfont then
                return filename, fontname
            else
                return filename, false
            end
        elseif fonts.names.reportmissingname then
            fonts.names.reportmissingname()
            return name, false -- fallback to filename
        end
    elseif fonts.names.reportmissingbase then
        fonts.names.reportmissingbase()
    end
end

fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv

function fonts.names.getfilename(askedname,suffix)  -- only supported in mkiv
    return ""
end

function fonts.names.ignoredfile(filename) -- only supported in mkiv
    return false -- will be overloaded
end