summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/lualibs/lualibs-extended.lua
blob: db1eef60720950b7ed3e96df42f0cd5b75d9c6a6 (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
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
-- 
--  This is file `lualibs-extended.lua',
--  generated with the docstrip utility.
-- 
--  The original source files were:
-- 
--  lualibs.dtx  (with options: `extended')
--  This is a generated file.
--  
--  Copyright (C) 2009 by PRAGMA ADE / ConTeXt Development Team
--  
--  See ConTeXt's mreadme.pdf for the license.
--  
--  This work consists of the main source file lualibs.dtx
--  and the derived file lualibs.lua.
--  
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  By default, \identifier{lualibs} will not load the libraries individually.
  Instead, it includes two \emphasis{merged packages} that have been compiled
  from the original files.
  This is achieved by means of \identifier{mtx-package}, a script for bundling
  \LUA code shipped with \CONTEXT.
  This concatenates the code of several \LUA files into a single file that is
  both easier to distribute and loading (marginally) faster.
  \identifier{mtx-package} ensures that the code from each file gets its
  own closure and strips newlines and comments, resulting in a smaller payload.
  Another package that relies on it heavily is the font loader as contained in
  \identifier{luaotfload} and \identifier{luatex-fonts}.

  If \CONTEXT is installed on the system, the merge files can be created
  by running:

  \begin{quote}\begin{verbatim}
    mtxrun --script package --merge lualibs-basic.lua
    mtxrun --script package --merge lualibs-extended.lua
  \end{verbatim}\end{quote}

  \noindent
  Of course there is a make target for that:

  \begin{quote}\begin{verbatim}
    make merge
  \end{verbatim}\end{quote}
  \noindent
  will take care of assembling the packages from the files distributed with
  \identifier{lualibs}.

  For this to work, the syntax of the \LUA file needs to be well-formed:
  files that should be merged must be included via a function
  \verb|loadmodule()|.
  It doesn’t matter if the function actually does something; a dummy will
  suffice.
  Also, the argument to \verb|loadmodule()| must be wrapped in parentheses.
  This rule is quite convenient, actually, since it allows excluding files
  from the merge while still using \verb|loadmodule()| consistently.

  \begin{quote}\begin{verbatim}
    ...
    loadmodule("my-lua-file.lua") -- <= will be merged
    loadmodule('my-2nd-file.lua') -- <= will be merged
    loadmodule "my-3rd-file.lua"  -- <= will be ignored
    ...
  \end{verbatim}\end{quote}

  Note that there is one exception to the packaging:
  \fileent{lualibs-util-jsn.lua} cannot be successfully packaged because
  it follows a different coding convention, returning a \LUA table on exit.
  Therefore, the file is loaded separately as part of the \identifier{extended}
  set like any other \LUA module.

-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
lualibs = lualibs or { }


local lualibs_extended_module = {
  name          = "lualibs-extended",
  version       = 2.00,
  date          = "2013/04/30",
  description   = "ConTeXt Lua libraries -- extended collection.",
  author        = "Hans Hagen, PRAGMA-ADE, Hasselt NL & Elie Roux & Philipp Gesang",
  copyright     = "PRAGMA ADE / ConTeXt Development Team",
  license       = "See ConTeXt's mreadme.pdf for the license",
}

local stringformat     = string.format
local loadmodule       = lualibs.loadmodule
local texiowrite       = texio.write
local texiowrite_nl    = texio.write_nl


local error, logger, mklog
if luatexbase and luatexbase.provides_module then
  --- TODO test how those work out when running tex
  local __error,_,_,__logger =
    luatexbase.provides_module(lualibs_extended_module)
  error  = __error
  logger = __logger
  mklog = function ( ) return logger end
else
  mklog = function (t)
    local prefix = stringformat("[%s] ", t)
    return function (...)
      texiowrite_nl(prefix)
      texiowrite   (stringformat(...))
    end
  end
  error  = mklog"ERROR"
  logger = mklog"INFO"
end

local info = lualibs.info


local dummy_function = function ( ) end
local newline        = function ( ) texiowrite_nl"" end

local fake_logs = function (name)
  return {
    name     = name,
    enable   = dummy_function,
    disable  = dummy_function,
    reporter = mklog,
    newline  = newline
  }
end

local fake_trackers = function (name)
  return {
    name     = name,
    enable   = dummy_function,
    disable  = dummy_function,
    register = mklog,
    newline  = newline,
  }
end


local backup_store = { }

local fake_context = function ( )
  if logs     then backup_store.logs     = logs     end
  if trackers then backup_store.trackers = trackers end
  logs     = fake_logs"logs"
  trackers = fake_trackers"trackers"

  backup_store.argv = table.fastcopy(arg)
end

local unfake_context = function ( )
  if backup_store then
    local bl, bt = backup_store.logs, backup_store.trackers
    local argv   = backup_store.argv
    if bl   then logs     = bl   end
    if bt   then trackers = bt   end
    if argv then arg      = argv end
  end
end

fake_context()

local loaded = false
if lualibs.prefer_merged then
  info"Loading merged package for collection “extended”."
  loaded = loadmodule('lualibs-extended-merged.lua')
else
  info"Ignoring merged packages."
  info"Falling back to individual libraries from collection “extended”."
end

if loaded == false then
  loadmodule("lualibs-util-str.lua")--- string formatters (fast)
  loadmodule("lualibs-util-tab.lua")--- extended table operations
  loadmodule("lualibs-util-sto.lua")--- storage (hash allocation)
  ----------("lualibs-util-pck.lua")---!packers; necessary?
  ----------("lualibs-util-seq.lua")---!sequencers (function chaining)
  ----------("lualibs-util-mrg.lua")---!only relevant in mtx-package
  loadmodule("lualibs-util-prs.lua")--- miscellaneous parsers; cool. cool cool cool
  ----------("lualibs-util-fmt.lua")---!column formatter (rarely used)
  loadmodule("lualibs-util-dim.lua")--- conversions between dimensions
  ----------("lualibs-util-jsn.lua")--- JSON parser

  ----------("lualibs-trac-set.lua")---!generalization of trackers
  ----------("lualibs-trac-log.lua")---!logging
  loadmodule("lualibs-trac-inf.lua")--- timing/statistics
  loadmodule("lualibs-util-lua.lua")--- operations on lua bytecode
  loadmodule("lualibs-util-deb.lua")--- extra debugging
  loadmodule("lualibs-util-tpl.lua")--- templating
  loadmodule("lualibs-util-sta.lua")--- stacker (for writing pdf)
  -------------------------------------!data-* -- Context specific
  ----------("lualibs-util-lib.lua")---!swiglib; there is a luatex-swiglib
  loadmodule("lualibs-util-env.lua")--- environment arguments
  ----------("lualibs-mult-ini.lua")---
  ----------("lualibs-core-con.lua")---
end

loadmodule"lualibs-util-jsn.lua"--- cannot be merged because of return statement

unfake_context() --- TODO check if this works at runtime

lualibs.extended_loaded = true
-- vim:tw=71:sw=2:ts=2:expandtab

-- 
--  End of File `lualibs-extended.lua'.