summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luaotfload/luaotfload-main.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/luaotfload/luaotfload-main.lua')
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-main.lua339
1 files changed, 2 insertions, 337 deletions
diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.lua b/macros/luatex/generic/luaotfload/luaotfload-main.lua
index 5fa8c54ad3..1b029bd514 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-main.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-main.lua
@@ -1,341 +1,6 @@
-----------------------------------------------------------------------
-- FILE: luaotfload-main.lua
--- DESCRIPTION: OpenType layout system / luaotfload entry point
--- REQUIREMENTS: luatex v.0.95.0 or later; package lualibs
--- AUTHOR: Élie Roux, Khaled Hosny, Philipp Gesang, Ulrike Fischer, Marcel Krüger
+-- DESCRIPTION: OpenType layout system / compatibility wrapper
-----------------------------------------------------------------------
-local authors = "\z
- Hans Hagen,\z
- Khaled Hosny,\z
- Elie Roux,\z
- Will Robertson,\z
- Philipp Gesang,\z
- Dohyun Kim,\z
- Reuben Thomas,\z
- David Carlisle,\
- Ulrike Fischer,\z
- Marcel Krüger\z
-"
--- version number is used below!
-local ProvidesLuaModule = {
- name = "luaotfload-main",
- version = "3.15", --TAGVERSION
- date = "2020-09-02", --TAGDATE
- description = "luaotfload entry point",
- author = authors,
- copyright = authors,
- license = "GPL v2.0"
-}
-
-if luatexbase and luatexbase.provides_module then
- luatexbase.provides_module (ProvidesLuaModule)
-end
-
-local osgettimeofday = os.gettimeofday
-config = config or { }
-luaotfload = luaotfload or { }
-local luaotfload = luaotfload
-luaotfload.log = luaotfload.log or { }
-local logreport
-luaotfload.version = ProvidesLuaModule.version
-luaotfload.loaders = { }
-luaotfload.fontloader_package = "reference" --- default: from current Context
-
-if not tex or not tex.luatexversion then
- error "this program must be run in TeX mode" --- or call tex.initialize() =)
-end
-
---- version check
-local revno = tonumber(tex.luatexrevision)
-local minimum = { 110, 0 }
-if tex.luatexversion < minimum[1] or tex.luatexversion == minimum[1] and revno < minimum[2] then
- texio.write_nl ("term and log",
- string.format ("\tFATAL ERROR\n\z
- \tLuaotfload requires a Luatex version >= %d.%d.%d.\n\z
- \tPlease update your TeX distribution!\n\n",
- math.floor(minimum[1] / 100), minimum[1] % 100, minimum[2]))
- error "version check failed"
-end
-
-if not utf8 then
- texio.write_nl("term and log", string.format("\z
- \tluaotfload: module utf8 is unavailable\n\z
- \tutf8 is available in Lua 5.3+; engine\'s _VERSION is %q\n\z
- \tThis probably means that the engine is not supported\n\z
- \n",
- _VERSION))
- error "module utf8 is unavailable"
-end
-
-if status.safer_option ~= 0 then
- texio.write_nl("term and log","luaotfload can't run with option --safer. Aborting")
- error("safer_option used")
-end
-
-
-
-
---[[doc--
-
- This file initializes the system and loads the font loader. To
- minimize potential conflicts between other packages and the code
- imported from \CONTEXT, several precautions are in order. Some of
- the functionality that the font loader expects to be present, like
- raw access to callbacks, are assumed to have been disabled by
- \identifier{luatexbase} when this file is processed. In some cases
- it is possible to trick it by putting dummies into place and
- restoring the behavior from \identifier{luatexbase} after
- initilization. Other cases such as attribute allocation require
- that we hook the functionality from \identifier{luatexbase} into
- locations where they normally wouldn’t be.
-
- Anyways we can import the code base without modifications, which is
- due mostly to the extra effort by Hans Hagen to make \LUATEX-Fonts
- self-contained and encapsulate it, and especially due to his
- willingness to incorporate our suggestions.
-
---doc]]--
-
-local luatexbase = luatexbase
-local require = require
-local type = type
-
-
---[[doc--
-
- \subsection{Module loading}
- We load the files imported from \CONTEXT with function derived this way. It
- automatically prepends a prefix to its argument, so we can refer to the
- files with their actual \CONTEXT name.
-
---doc]]--
-
-local function make_loader_name (prefix, name)
- local msg = luaotfload.log and luaotfload.log.report
- or function (stream, lvl, cat, ...)
- if lvl > 1 then --[[not pressing]] return end
- texio.write_nl ("log",
- string.format ("luaotfload | %s : ",
- tostring (cat)))
- texio.write (string.format (...))
- end
- if not name then
- msg ("both", 0, "load",
- "Fatal error: make_loader_name (%q, %q).",
- tostring (prefix), tostring (name))
- return "dummy-name"
- end
- name = tostring (name)
- if prefix == false then
- msg ("log", 9, "load",
- "No prefix requested, passing module name %q unmodified.",
- name)
- return tostring (name) .. ".lua"
- end
- prefix = tostring (prefix)
- msg ("log", 9, "load",
- "Composing module name from constituents %s, %s.",
- prefix, name)
- return prefix .. "-" .. name .. ".lua"
-end
-
-local timing_info = {
- t_load = { },
- t_init = { },
-}
-
-local function make_loader (prefix, load_helper)
- return function (name)
- local t_0 = osgettimeofday ()
- local modname = make_loader_name (prefix, name)
- --- We don’t want the stack info from inside, so just pcall().
- local ok, data = pcall (load_helper or require, modname)
- local t_end = osgettimeofday ()
- timing_info.t_load [name] = t_end - t_0
- if not ok then
- io.write "\n"
- local msg = luaotfload.log and luaotfload.log.report or print
- msg ("both", 0, "load", "FATAL ERROR")
- msg ("both", 0, "load", " × Failed to load %q module %q.",
- tostring (prefix), tostring (name))
- local lines = string.split (data, "\n\t")
- if not lines then
- msg ("both", 0, "load", " × Error message: %q", data)
- else
- msg ("both", 0, "load", " × Error message:")
- for i = 1, #lines do
- msg ("both", 0, "load", " × %q.", lines [i])
- end
- end
- io.write "\n\n"
- local debug = debug
- if debug then
- io.write (debug.traceback())
- io.write "\n\n"
- end
- os.exit(-1)
- end
- return data
- end
-end
-
---[[doc--
- Certain files are kept around that aren’t loaded because they are part of
- the imported fontloader. In order to keep the initialization structure
- intact we also provide a no-op version of the module loader that can be
- called in the expected places.
---doc]]--
-
-local function dummy_loader (name)
- luaotfload.log.report ("log", 3, "load",
- "Skipping module %q on purpose.",
- name)
-end
-
-local context_environment = setmetatable({}, {__index = _G})
-luaotfload.fontloader = context_environment
-local function context_isolated_load(name)
- local fullname = kpse.find_file(name, 'lua')
- if not fullname then
- error(string.format('Fontloader module %q could not be found.', name))
- end
- return assert(loadfile(fullname, nil, context_environment))(name)
-end
-
-local function context_loader (name, path)
- luaotfload.log.report ("log", 3, "load",
- "Loading module %q from Context.",
- name)
- local t_0 = osgettimeofday ()
- local modname = make_loader_name (false, name)
- local modpath = modname
- if path then
- if lfs.isdir (path) then
- luaotfload.log.report ("log", 3, "load",
- "Prepending path %q.",
- path)
- modpath = file.join (path, modname)
- else
- luaotfload.log.report ("both", 0, "load",
- "Non-existant path %q specified, ignoring.",
- path)
- end
- end
- local ret = context_isolated_load (modpath)
- local t_end = osgettimeofday ()
- timing_info.t_load [name] = t_end - t_0
-
- if ret ~= nil then
- --- require () returns “true” upon success unless the loaded file
- --- yields a non-zero exit code. This isn’t per se indicating that
- --- something isn’t right, but against HH’s coding practices. We’ll
- --- silently ignore this ever happening on lower log levels.
- luaotfload.log.report ("log", 4, "load",
- "Module %q returned %q.", modname, ret)
- end
- return ret
-end
-
-local function install_loaders ()
- local loaders = { }
- local loadmodule = make_loader "luaotfload"
- loaders.luaotfload = loadmodule
- loaders.fontloader = make_loader ("fontloader", context_isolated_load)
- loaders.context = context_loader
- loaders.ignore = dummy_loader
-----loaders.plaintex = make_loader "luatex" --=> for Luatex-Plain
-
- function loaders.initialize (name)
- local tmp = loadmodule (name)
- local init = type(tmp) == "table" and tmp.init or tmp
- if init and type (init) == "function" then
- local t_0 = osgettimeofday ()
- if not init () then
- logreport ("log", 0, "load",
- "Failed to load module %q.", name)
- return
- end
- local t_end = osgettimeofday ()
- local d_t = t_end - t_0
- logreport ("log", 4, "load",
- "Module %q loaded in %g ms.",
- name, d_t * 1000)
- timing_info.t_init [name] = d_t
- end
- end
-
- return loaders
-end
-
-local luaotfload_initialized = false --- prevent multiple invocations
-
-luaotfload.main = function ()
-
- if luaotfload_initialized then
- logreport ("log", 0, "load",
- "Luaotfload initialization requested but is already \z
- loaded, ignoring.")
- return
- end
- luaotfload_initialized = true
-
- luaotfload.loaders = install_loaders ()
- local loaders = luaotfload.loaders
- local loadmodule = loaders.luaotfload
- local initialize = loaders.initialize
-
- local starttime = osgettimeofday ()
-
- -- Feature detect HarfBuzz. This is done early to allow easy HarfBuzz
- -- detection in other modules
- local harfstatus, harfbuzz = pcall(require, 'luaharfbuzz')
- if harfstatus then
- luaotfload.harfbuzz = harfbuzz
- end
-
- local init = loadmodule "init" --- fontloader initialization
- init (function ()
-
- logreport = luaotfload.log.report
- initialize "parsers" --- fonts.conf and syntax
- initialize "configuration" --- configuration options
- end)
-
- initialize "loaders" --- Font loading; callbacks
- initialize "database" --- Font management.
- initialize "colors" --- Per-font colors.
-
- local init_resolvers = loadmodule "resolvers" --- Font lookup
- init_resolvers ()
-
- if not config.actions.reconfigure () then
- logreport ("log", 0, "load", "Post-configuration hooks failed.")
- end
-
- initialize "features" --- font request and feature handling
-
- if harfstatus then
- loadmodule "harf-define"
- loadmodule "harf-plug"
- end
- loadmodule "letterspace" --- extra character kerning
- loadmodule "embolden" --- fake bold
- loadmodule "notdef" --- missing glyph handling
- loadmodule "suppress" --- suppress ligatures by adding ZWNJ
- loadmodule "szss" --- missing glyph handling
- initialize "auxiliary" --- additional high-level functionality
- loadmodule "tounicode"
- if tex.outputmode == 0 then
- loadmodule "dvi" --- allow writing fonts to DVI files
- end
-
- luaotfload.aux.start_rewrite_fontname () --- to be migrated to fontspec
-
- logreport ("log", 1, "main",
- "initialization completed in %0.3f seconds\n",
- osgettimeofday() - starttime)
-----inspect (timing_info)
-end
-
--- vim:tw=79:sw=4:ts=4:et
+return require'luaotfload'