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
|
-- texdoclib.tlu: the texdoc library
--[[
Copyright 2008, 2009, 2010, 2011 Manuel Pégourié-Gonnard.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <http://www.gnu.org/licenses/>.
Previous work in the public domain:
- Contributions from Reinhard Kotucha (2008).
- First texlua versions by Frank Küster (2007).
- Original shell script by Thomas Esser, David Aspinall, and Simon Wilkinson.
--]]
------------------------ functions for submodules ------------------------
-- texdoc is divided in submodules (files). Each module is loaded in a private
-- copy of a shared environment, and can export symbols to this environments
-- by returning a table to be merge with this environment.
-- return a simple (not deep) copy of a table
local function simple_copy(t)
local c = {}
for sym, val in pairs(t) do
c[sym] = val
end
return c
end
-- initialise the shared environment with a copy of the global environment
local prv_env = simple_copy(_G)
if setfenv then
setfenv(1, prv_env)
else
_ENV = prv_env
end
-- import symbols from a table to the share environment
local function import_symbols(symbols, name)
for sym, val in pairs(symbols) do
assert(val ~= nil,
'Internal error: '..name..' exporting undefined symbol '..sym..'.')
assert(prv_env[sym] == nil,
'Internal error: '..name..' exporting existing symbol '..sym..'.')
prv_env[sym] = val
end
end
-- load a submodule of texdoc
local function texdoc_do(name)
local pathname = kpse.find_file('texdoc/'..name, 'lua')
assert(pathname, 'Internal error: missing submodule: '..name)
local submod
if setfenv then
submod = assert(loadfile (pathname))
setfenv(submod, simple_copy(prv_env))
else
local f = assert(io.open(pathname))
local s = f:read('*a')
f:close()
submod = assert(load(s, pathname, 'bt', simple_copy(prv_env)))
-- submod = assert(loadfile(pathname, 'bt', simple_copy(prv_env)))
end
local symbols = submod()
if symbols then import_symbols(symbols, name) end
end
------------------------ initilisation & main code -------------------------
-- pre-declare variables in the shared environment
C = {} -- constants
config = {} -- configuration settings
-- actually load the submodules now
texdoc_do('constants')
texdoc_do('functions')
texdoc_do('alias')
texdoc_do('score')
texdoc_do('config')
texdoc_do('search')
texdoc_do('view')
return {
setup_config_and_alias = setup_config_and_alias,
read_config_file = read_config_file,
init_databases = init_databases,
print_usage = print_usage,
get_doclist = get_doclist,
deliver_results = deliver_results,
aliased_names = aliased_names,
show_config_files = show_config_files,
config = config,
view_file = view_file,
const = C,
}
|