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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
--
-- This is file `modutils.lua',
-- generated with the docstrip utility.
--
-- The original source files were:
--
-- luatexbase-modutils.dtx (with options: `luamodule')
--
-- See the aforementioned source file(s) for copyright and licensing information.
--
luatexbase = luatexbase or { }
local luatexbase = luatexbase
local string_gsub = string.gsub
local modules = modules or {}
local function date_to_int(date)
if date == '' then return -1 end
local numbers = string_gsub(date, "(%d+)/(%d+)/(%d+)", "%1%2%3")
return tonumber(numbers)
end
local function msg_format(msg_type, mod_name, ...)
local cont = '('..mod_name..')' .. ('Module: '..msg_type):gsub('.', ' ')
return 'Module '..mod_name..' '..msg_type..': '
.. string.format(...):gsub('\n', '\n'..cont) .. '\n'
end
local function module_error_int(mod, ...)
error(msg_format('error', mod, ...), 3)
end
local function module_error(mod, ...)
module_error_int(mod, ...)
end
luatexbase.module_error = module_error
local function module_warning(mod, ...)
for _, line in ipairs(msg_format('warning', mod, ...):explode('\n')) do
texio.write_nl(line)
end
end
luatexbase.module_warning = module_warning
local function module_info(mod, ...)
for _, line in ipairs(msg_format('info', mod, ...):explode('\n')) do
texio.write_nl(line)
end
end
luatexbase.module_info = module_info
local function module_log(mod, msg, ...)
texio.write_nl('log', mod..': '..msg:format(...))
end
luatexbase.module_log = module_log
local function errwarinf(name)
return function(...) module_error_int(name, ...) end,
function(...) module_warning(name, ...) end,
function(...) module_info(name, ...) end,
function(...) module_log(name, ...) end
end
luatexbase.errwarinf = errwarinf
local err, warn = errwarinf('luatexbase.modutils')
local function require_module(name, req_date)
require(name)
local info = modules[name]
if not info then
warn("module '%s' was not properly identified", name)
elseif req_date and info.date then
if date_to_int(info.date) < date_to_int(req_date) then
warn("module '%s' required in version '%s'\n"
.. "but found in version '%s'", name, req_date, info.date)
end
end
end
luatexbase.require_module = require_module
local function provides_module(info)
if not (info and info.name) then
err('provides_module: missing information')
end
texio.write_nl('log', string.format("Lua module: %s %s %s %s\n",
info.name, info.date or '', info.version or '', info.description or ''))
modules[info.name] = info
return errwarinf(info.name)
end
luatexbase.provides_module = provides_module
local fastcopy
fastcopy = table.fastcopy or function(old)
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
new[k] = fastcopy(v)
else
new[k] = v
end
end
local mt = getmetatable(old)
if mt then
setmetatable(new,mt)
end
return new
else
return { }
end
end
local function get_module_info(name)
local module_table = modules[name]
if not module_table then
return nil
else
return fastcopy(module_table)
end
end
luatexbase.get_module_info = get_module_info
function get_module_version(name)
local module_table = modules[name]
if not module_table then
return nil
else
return module_table.version
end
end
luatexbase.get_module_version = get_module_version
function get_module_date(name)
local module_table = modules[name]
if not module_table then
return nil
else
return module_table.date
end
end
luatexbase.get_module_date = get_module_date
function get_module_date_int(name)
local module_table = modules[name]
if not module_table then
return nil
else
return module_table.date and date_to_int(module_table.date)
end
end
luatexbase.get_module_date_int = get_module_date_int
function is_module_loaded(name)
if modules[name] then
return true
else
return false
end
end
luatexbase.is_module_loaded = is_module_loaded
--
-- End of File `modutils.lua'.
|