summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile14
-rw-r--r--README20
-rw-r--r--TODO7
-rw-r--r--luatexbase-cctb.dtx8
-rw-r--r--luatexbase-loader.dtx264
-rw-r--r--luatexbase-mods.dtx507
6 files changed, 295 insertions, 525 deletions
diff --git a/Makefile b/Makefile
index 3302117..3e7cb5a 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,10 @@ UNPACKED_ATTR = luatexbase-attr.sty luatexbase.attr.lua \
test-attr-plain.tex test-attr-latex.tex
UNPACKED_CCTB = luatexbase-cctb.sty luatexbase.cctb.lua \
test-cctb-plain.tex test-cctb-latex.tex
-UNPACKED = $(UNPACKED_MCB) $(UNPACKED_REGS) $(UNPACKED_ATTR) $(UNPACKED_CCTB)
+UNPACKED_LOADER = luatexbase-loader.sty luatexbase.loader.lua \
+ test-loader-plain.tex test-loader-latex.tex
+UNPACKED = $(UNPACKED_MCB) $(UNPACKED_REGS) $(UNPACKED_ATTR) $(UNPACKED_CCTB) \
+ $(UNPACKED_LOADER)
COMPILED = $(DOC)
GENERATED = $(COMPILED) $(UNPACKED)
SOURCE = $(DTX) $(DTXSTY) README TODO Changes Makefile
@@ -44,7 +47,7 @@ DO_MAKEINDEX = makeindex -s gind.ist $(subst .dtx,,$<) >/dev/null 2>&1
# Main targets definition
all: $(GENERATED)
-check: check-regs check-attr check-cctb
+check: check-regs check-attr check-cctb check-load
doc: $(COMPILED)
unpack: $(UNPACKED)
ctan: check $(CTAN_ZIP)
@@ -69,6 +72,9 @@ $(UNPACKED_ATTR): luatexbase-attr.dtx
$(UNPACKED_CCTB): luatexbase-cctb.dtx
$(DO_TEX)
+$(UNPACKED_LOADER): luatexbase-loader.dtx
+ $(DO_TEX)
+
check-regs: $(UNPACKED_REGS)
luatex --interaction=batchmode test-regs-plain.tex >/dev/null
lualatex --interaction=batchmode test-regs-latex.tex >/dev/null
@@ -81,6 +87,10 @@ check-cctb: $(UNPACKED_CCTB)
luatex --interaction=batchmode test-cctb-plain.tex >/dev/null
lualatex --interaction=batchmode test-cctb-latex.tex >/dev/null
+check-loader: $(UNPACKED_LOADER)
+ luatex --interaction=batchmode test-loader-plain.tex >/dev/null
+ lualatex --interaction=batchmode test-loader-latex.tex >/dev/null
+
$(CTAN_ZIP): $(SOURCE) $(COMPILED) $(TDS_ZIP)
@echo "Making $@ for CTAN upload."
@$(RM) -- $@
diff --git a/README b/README
index fbda4f2..c209d5e 100644
--- a/README
+++ b/README
@@ -9,10 +9,11 @@ Each resource is handled in a separate package, and luatexbase.sty merely loads
all of them.
The resources considered are:
-- registers (\count, \box, etc.) -> lualatex-regs
-- Lua modules -> lualatex-mods
-- \attribute's -> lualatex-attr
-- \catcodetable's -> lualatex-cctb
+- registers (\count, \box, etc.) -> luatexbase-regs
+- Lua modules -> luatexbase-loader
+- Additional functions for modules -> luatexbase-modutils
+- \attribute's -> luatexbase-attr
+- \catcodetable's -> luatexbase-cctb
- Lua callbacks -> luamcallbacks
WARNING: these packages are subject to change or even be merged or disappear in
@@ -39,17 +40,6 @@ Here are the recommended installation methods (preferred first).
4. Try to figure it out by looking at the Makefile and comments in the sources.
-Manifest
---------
-
-Source files:
- luamcallbacks.dtx
-
-Derived files:
- luamcallbacks.pdf
- luamcallbacks-test.tex
- luamcallbacks.lua
-
License
-------
diff --git a/TODO b/TODO
index fa38543..ae2a47b 100644
--- a/TODO
+++ b/TODO
@@ -12,9 +12,16 @@ general
- redo module loading in packages once mods is done.
- adjust preamble to avoid duplicated list of files (refer to DTX instead)
+loader
+------
+
+- a.b.c -> a/b/c or a/b.c or a.b.c
+
Later
=====
- change lua module name(s) (luatexbase or luatexbase.regs etc)
- check for macros starting with \luatex
+- compat with LuaTeX 0.25.4? (Means problems with \directlua, primitive names,
+ kpse.find_file(..., 'lua'), etc.)
diff --git a/luatexbase-cctb.dtx b/luatexbase-cctb.dtx
index 198da9c..3bfedac 100644
--- a/luatexbase-cctb.dtx
+++ b/luatexbase-cctb.dtx
@@ -391,7 +391,13 @@ and the derived files
% Finally do the shortcuts.
%
% \begin{macrocode}
-\directlua{luatexbase.catcodetable_do_shortcuts()}
+\directlua{luatextra.catcodetable_do_shortcuts()}
+% \end{macrocode}
+%
+% That's all, folks!
+%
+% \begin{macrocode}
+\lltxb@cctb@AtEnd
%</texpackage>
% \end{macrocode}
%
diff --git a/luatexbase-loader.dtx b/luatexbase-loader.dtx
new file mode 100644
index 0000000..b413a46
--- /dev/null
+++ b/luatexbase-loader.dtx
@@ -0,0 +1,264 @@
+% \iffalse meta-comment
+%
+% Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux.
+% <mpg@elzevir.fr>
+% <elie.roux@telecom-bretagne.eu>
+%
+% This work is under the CC0 license.
+%
+% This work consists of the main source file luatexbase-loader.dtx
+% and the derived files
+% luatexbase-loader.sty luatexbase.loader.lua
+% test-loader-plain.tex test-loader-latex.tex
+%
+% Unpacking:
+% tex luatexbase-loader.dtx
+% Documentation:
+% pdflatex luatexbase-loader.dtx
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\let\MetaPrefix\relax
+
+\preamble
+This is a generated file.
+
+Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux.
+ <mpg@elzevir.fr>
+ <elie.roux@telecom-bretagne.eu>
+
+This work is under the CC0 license.
+
+This work consists of the main source file luatexbase-loader.dtx
+and the derived files
+ luatexbase-loader.sty luatexbase.loader.lua
+ test-loader-plain.tex test-loader-latex.tex
+
+\endpreamble
+
+\let\MetaPrefix\DoubleperCent
+
+\generate{%
+ \usedir{tex/luatex/luatexbase}%
+ \file{luatexbase-loader.sty}{\from{luatexbase-loader.dtx}{texpackage}}%
+}
+
+\generate{%
+ \usedir{doc/luatex/luatexbase}%
+ \file{test-loader-plain.tex}{\from{luatexbase-loader.dtx}{testplain}}%
+ \file{test-loader-latex.tex}{\from{luatexbase-loader.dtx}{testlatex}}%
+}
+
+\def\MetaPrefix{-- }
+
+\def\luapostamble{%
+ \MetaPrefix^^J%
+ \MetaPrefix\space End of File `\outFileName'.%
+}
+
+\def\currentpostamble{\luapostamble}%
+
+\generate{%
+ \usedir{tex/luatex/luatexbase}%
+ \file{luatexbase.loader.lua}{\from{luatexbase-loader.dtx}{luamodule}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* luatexbase-loader.sty loader.lua ...}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\documentclass{ltxdoc}
+\input{lltxb-dtxstyle}
+\begin{document}
+ \DocInput{luatexbase-loader.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \title{The \textsf{luatexbase-loader} package}
+% \date{v0.1 2010-03-27}
+% \author{%
+% Manuel P\'egouri\'e-Gonnard \\ \texttt{mpg@elzevir.fr} \and
+% \'Elie Roux \\ \texttt{elie.roux@telecom-bretagne.eu}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Documentation}
+%
+% \section{Implementation}
+%
+% \subsection{\tex package}
+%
+% \begin{macrocode}
+%<*texpackage>
+% \end{macrocode}
+%
+% \subsubsection{Preliminaries}
+%
+% Reload protection, especially for \plaintex.
+%
+% \begin{macrocode}
+ \csname lltxb@loader@loaded\endcsname
+\expandafter\let\csname lltxb@loader@loaded\endcsname\endinput
+% \end{macrocode}
+%
+% Package declaration.
+%
+% \begin{macrocode}
+\begingroup
+ \expandafter\ifx\csname ProvidesPackage\endcsname\relax
+ \def\x#1[#2]{\immediate\write16{Package: #1 #2}}
+ \else
+ \let\x\ProvidesPackage
+ \fi
+\expandafter\endgroup
+\x{luatexbase-loader}[2010/03/26 v0.1 Lua module loader for LuaTeX (mpg)]
+% \end{macrocode}
+%
+% Make sure \luatex is used.
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input ifluatex.sty
+\else
+ \RequirePackage{ifluatex}
+\fi
+\ifluatex\else
+ \begingroup
+ \expandafter\ifx\csname PackageWarningNoLine\endcsname\relax
+ \def\x#1#2{\begingroup\newlinechar10
+ \immediate\write16{Package #1 warning: #2}\endgroup}
+ \else
+ \let\x\PackageWarningNoLine
+ \fi
+ \expandafter\endgroup
+ \x{luatexbase-loader}{LuaTeX is required for this package.^^J
+ Aborting package loading.}
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% Make sure the catcode of @ is correct, especially for \plaintex.
+%
+% \begin{macrocode}
+\expandafter\edef\csname lltxb@loader@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax}
+\catcode64 11
+% \end{macrocode}
+%
+% \subsubsection{Main content}
+%
+% Load the supporting Lua module.
+%
+% \begin{macrocode}
+\directlua{%
+ local file = "luatexbase.loader.lua"
+ local path = assert(kpse.find_file(file, 'tex'),
+ "File '"..file.."' no found")
+ texio.write_nl("("..path..")")
+ dofile(path)}
+% \end{macrocode}
+%
+% That's all, folks!
+%
+% \begin{macrocode}
+\lltxb@loader@AtEnd
+%</texpackage>
+% \end{macrocode}
+%
+% \subsection{Lua module}
+%
+% \begin{macrocode}
+%<*luamodule>
+module('luatextra', package.seeall)
+% \end{macrocode}
+%
+% \begin{macrocode}
+local function load_module(mod)
+ local file = kpse.find_file(mod, 'lua')
+ if not file then
+ return "\n\t[luatextra.loader] Search failed"
+ end
+ local loader, error = loadfile(file)
+ if not loader then
+ return "\n\t[luatextra.loader] Loading error:\n\t"..error
+ end
+ texio.write_nl("("..file..")")
+ return loader
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+table.insert(package.loaders, load_module)
+%</luamodule>
+% \end{macrocode}
+%
+% \section{Test files}
+%
+% We just check that the package loads properly, under both LaTeX and Plain
+% TeX. Anyway, the test files of other modules using this one already are a
+% test\dots
+%
+% \begin{macrocode}
+%<testplain>\input luatexbase-loader.sty
+%<testlatex>\RequirePackage{luatexbase-loader}
+%<*testplain,testlatex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</testplain,testlatex>
+%<testplain>\bye
+%<testlatex>\stop
+% \end{macrocode}
+%
+% \Finale
+\endinput
diff --git a/luatexbase-mods.dtx b/luatexbase-mods.dtx
deleted file mode 100644
index 9f45e1c..0000000
--- a/luatexbase-mods.dtx
+++ /dev/null
@@ -1,507 +0,0 @@
-% \iffalse meta-comment
-%
-% Template : look for DATE DESC VERSION !!!
-% and 'derived files' !!!
-%
-% Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux.
-% <mpg@elzevir.fr>
-% <elie.roux@telecom-bretagne.eu>
-%
-% This work is under the CC0 license.
-%
-% This work consists of the main source file luatexbase-mods.dtx
-% and the derived files
-% luatexbase-mods.sty mods.lua ...
-%
-% Unpacking:
-% tex luatexbase-mods.dtx
-% Documentation:
-% pdflatex luatexbase-mods.dtx
-%
-% The class ltxdoc loads the configuration file ltxdoc.cfg
-% if available. Here you can specify further options, e.g.
-% use A4 as paper format:
-% \PassOptionsToClass{a4paper}{article}
-%
-%<*ignore>
-\begingroup
- \def\x{LaTeX2e}%
-\expandafter\endgroup
-\ifcase 0\ifx\install y1\fi\expandafter
- \ifx\csname processbatchFile\endcsname\relax\else1\fi
- \ifx\fmtname\x\else 1\fi\relax
-\else\csname fi\endcsname
-%</ignore>
-%<*install>
-\input docstrip.tex
-
-\keepsilent
-\askforoverwritefalse
-
-\let\MetaPrefix\relax
-
-\preamble
-This is a generated file.
-
-Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux.
- <mpg@elzevir.fr>
- <elie.roux@telecom-bretagne.eu>
-
-This work is under the CC0 license.
-
-This work consists of the main source file luatexbase-mods.dtx
-and the derived files
- luatexbase-mods.sty mods.lua ...
-
-\endpreamble
-
-\let\MetaPrefix\DoubleperCent
-
-\generate{%
- \usedir{tex/luatex/luatexbase}%
- \file{luatexbase-mods.sty}{\from{luatexbase-mods.dtx}{texpackage}}%
-}
-
-\def\MetaPrefix{-- }
-
-\def\luapostamble{%
- \MetaPrefix^^J%
- \MetaPrefix\space End of File `\outFileName'.%
-}
-
-\def\currentpostamble{\luapostamble}%
-
-\generate{%
- \usedir{tex/luatex/luatexbase}%
- \file{mods.lua}{\from{luatexbase-mods.dtx}{luamodule}}%
-}
-
-\obeyspaces
-\Msg{************************************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* luatexbase-mods.sty mods.lua ...}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*}
-\Msg{************************************************************************}
-
-\endbatchfile
-%</install>
-%<*ignore>
-\fi
-%</ignore>
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{luatexbase-mods.drv}
- [DATE DESC]
-\documentclass{ltxdoc}
-\EnableCrossrefs
-\CodelineIndex
-\begin{document}
- \DocInput{luatexbase-mods.dtx}%
-\end{document}
-%</driver>
-% \fi
-%
-% \CheckSum{0}
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \GetFileInfo{luatexbase-mods.drv}
-%
-% \title{The \textsf{luatexbase-mods} package}
-% \date{DATE}
-% \author{%
-% Manuel P\'egouri\'e-Gonnard \\ \texttt{mpg@elzevir.fr} \and
-% \'Elie Roux \\ \texttt{elie.roux@telecom-bretagne.eu}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% \end{abstract}
-%
-% \section{Documentation}
-%
-% Lua has some embedded module management, with the functions \texttt{module}
-% and \texttt{require}. With this package we try get more control on the
-% module system, by implementing something close to the \LaTeX 's
-% \texttt{\string\usepackage} and \texttt{\string\RequirePackage} macros: the
-% \texttt{\string\luatexUseModule} and \texttt{\string\luatexRequireModule}
-% that act like them, but for lua files. The functions \texttt{module} and
-% \texttt{require} should not be used, in profit of the lua functions
-% \texttt{luatextra.provides\_module} and \texttt{luatextra.use\_module} or
-% \texttt{luatextra.require\_module}.
-%
-% \section{Implementation}
-%
-% \subsection{\TeX\ package}
-%
-% \begin{macrocode}
-%<*texpackage>
-% \end{macrocode}
-%
-% \subsubsection{Module handling}
-%
-% The \texttt{\string\luatexModuleError} macro is called by the lua function
-% \texttt{luatextra.module\_error}. It is necessary because we can't call
-% directly \texttt{\string\errmessage} in lua.
-%
-% \begin{macrocode}
-
-\def\luatexModuleError#1#2{%
- \errorcontextlines=0\relax
- \immediate\write16{}%
- \errmessage{Module #1 error: #2^^J^^J%
-See the module #1 documentation for explanation.^^J ...^^J}%
-}
-
-% \end{macrocode}
-%
-% Then we define
-% \texttt{\string\luatexUseModule} that simply calls
-% \texttt{luatextra.use\_module}.
-% If the package is loaded with Plain, we define
-% \texttt{\string\luaRequireModule} with two mandatory arguments.
-%
-% \begin{macrocode}
-\def\luatexUseModule#1{\luadirect{luatextra.use_module([[#1]])}}
-
-\expandafter\ifx\csname ProvidesPackage\endcsname\relax
- \def\luatexRequireModule#1#2{\luadirect{%
- luatextra.require_module([[#1]], [[#2]])}}
-\else
-% \end{macrocode}
-%
-% If the package is loaded with \LaTeX , we define
-% \texttt{\string\luaRequireModule} with one mandatory
-% argument (the name of the package) and one optional (the version or the
-% date).
-%
-% \begin{macrocode}
- \newcommand\luatexRequireModule[2][0]{\luadirect{luatextra.require_module([[#2]], [[#1]])}}
-\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</texpackage>
-% \end{macrocode}
-%
-% \subsection{Lua module}
-%
-% \begin{macrocode}
-%<*luamodule>
-% \end{macrocode}
-%
-% Initialisation borrowed from luatextra
-%
-% \begin{macrocode}
-module("luatextra", package.seeall)
-
-local format = string.format
-
-luatextra.modules = luatextra.modules or {}
-% \end{macrocode}
-%
-% Here we define the warning and error functions specific to
-% \texttt{luatextra}.
-%
-% \begin{macrocode}
-
-luatextra.internal_warning_spaces = " "
-
-function luatextra.internal_warning(msg)
- if not msg then return end
- texio.write_nl(format("\nLuaTeXtra Warning: %s\n\n", msg))
-end
-
-luatextra.internal_error_spaces = " "
-
-function luatextra.internal_error(msg)
- if not msg then return end
- tex.sprint(format("\\immediate\\write16{}\\errmessage{LuaTeXtra error: %s^^J^^J}", msg))
-end
-
-% \end{macrocode}
-%
-% \subsubsection{Error, warning and info function for modules}
-%
-% Some module printing functions are provided, they have the same
-% philosophy as the \LaTeX 's \texttt{\string\PackageError} and
-% \texttt{\string\PackageWarning} macros: their first argument is the name
-% of the module, and the second is the message. These functions are meant
-% to be used by lua module writers.
-%
-% \begin{macrocode}
-
-function luatextra.module_error(package, msg, helpmsg)
- if not package or not msg then
- return
- end
- if helpmsg then
- tex.sprint(format("\\errhelp{%s}", helpmsg))
- end
- tex.sprint(format("\\luatexModuleError{%s}{%s}", package, msg))
-end
-
-function luatextra.module_warning(modulename, msg)
- if not modulename or not msg then
- return
- end
- texio.write_nl(format("\nModule %s Warning: %s\n\n", modulename, msg))
-end
-
-function luatextra.module_log(modulename, msg)
- if not modulename or not msg then
- return
- end
- texio.write_nl('log', format("%s: %s", modulename, msg))
-end
-
-function luatextra.module_term(modulename, msg)
- if not modulename or not msg then
- return
- end
- texio.write_nl('term', format("%s: %s", modulename, msg))
-end
-
-function luatextra.module_info(modulename, msg)
- if not modulename or not msg then
- return
- end
- texio.write_nl(format("%s: %s\n", modulename, msg))
-end
-
-% \end{macrocode}
-%
-% \subsubsection{module loading and providing functions}
-%
-% A small function to find a lua module file according to its name, with or
-% without the \texttt{.lua} at the end of the filename.
-%
-% \begin{macrocode}
-
-function luatextra.find_module_file(name)
- if string.sub(name, -4) ~= '.lua' then
- name = name..'.lua'
- end
- path = kpse.find_file(name, 'tex')
- if not path then
- path = kpse.find_file(name, 'texmfscripts')
- end
- return path, name
-end
-
-% \end{macrocode}
-%
-% A small patch, for the \texttt{module} function to work in this file. I
-% can't understand why it doens't otherwise.
-%
-% \begin{macrocode}
-
-luatextra.module = module
-
-% \end{macrocode}
-%
-% \begin{macro}{luatextra.use module}
-%
-% This macro is the one used to simply load a lua module file. It does not
-% reload it if it's already loaded, and prints the filename in the terminal
-% and the log. A lua module must call the macro
-% \texttt{luatextra.provides\_module}.
-%
-% \begin{macrocode}
-
-
-function luatextra.use_module(name)
- if not name or luatextra.modules[name] then
- return
- end
- local path, filename = luatextra.find_module_file(name)
- if not path then
- luatextra.internal_error(format("unable to find lua module %s", name))
- else
- if path:sub(1,2) == "./" then
- path = path:sub(3)
- end
- texio.write_nl('('..path)
- dofile(path)
- if not luatextra.modules[name] then
- luatextra.internal_warning(format("You have requested module `%s',\n%s but the file %s does not provide it.", name, luatextra.internal_warning_spaces, filename))
- end
- if not package.loaded[name] then
- luatextra.module(name, package.seeall)
- end
- texio.write(')')
- end
-end
-
-% \end{macrocode}
-%
-% \end{macro}
-%
-% Some internal functions to convert a date into a number, and to determine
-% if a string is a date. It is useful for
-% \texttt{luatextra.require\_package} to understand if a user asks a
-% version with a date or a version number.
-%
-% \begin{macrocode}
-
-function luatextra.datetonumber(date)
- numbers = string.gsub(date, "(%d+)/(%d+)/(%d+)", "%1%2%3")
- return tonumber(numbers)
-end
-
-function luatextra.isdate(date)
- for _, _ in string.gmatch(date, "%d+/%d+/%d+") do
- return true
- end
- return false
-end
-
-local date, number = 1, 2
-
-function luatextra.versiontonumber(version)
- if luatextra.isdate(version) then
- return {type = date, version = luatextra.datetonumber(version), orig = version}
- else
- return {type = number, version = tonumber(version), orig = version}
- end
-end
-
-luatextra.requiredversions = {}
-
-% \end{macrocode}
-%
-% \begin{macro}{luatextra.require module}
-%
-% This function is like the \texttt{luatextra.use\_module} function, but
-% can accept a second argument that checks for the version of the module.
-% The version can be a number or a date (format yyyy/mm/dd).
-%
-% \begin{macrocode}
-
-function luatextra.require_module(name, version)
- if not name then
- return
- end
- if not version then
- return luatextra.use_module(name)
- end
- luaversion = luatextra.versiontonumber(version)
- if luatextra.modules[name] then
- if luaversion.type == date then
- if luatextra.datetonumber(luatextra.modules[name].date) < luaversion.version then
- luatextra.internal_error(format("found module `%s' loaded in version %s, but version %s was required", name, luatextra.modules[name].date, version))
- end
- else
- if luatextra.modules[name].version < luaversion.version then
- luatextra.internal_error(format("found module `%s' loaded in version %.02f, but version %s was required", name, luatextra.modules[name].version, version))
- end
- end
- else
- luatextra.requiredversions[name] = luaversion
- luatextra.use_module(name)
- end
-end
-
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{luatextra.provides module}
-%
-% This macro is the one that must be called in the module files. It takes a
-% table as argument. You can put any information you want in this table,
-% but the mandatory ones are \texttt{name} (a string), \texttt{version} (a
-% number), \texttt{date} (a string) and \texttt{description} (a string).
-% Other fields are usually \texttt{copyright}, \texttt{author} and
-% \texttt{license}.
-%
-% This function logs informations about the module the same way \LaTeX\
-% does for informations about packages.
-%
-% \begin{macrocode}
-
-function luatextra.provides_module(mod)
- if not mod then
- luatextra.internal_error('cannot provide nil module')
- return
- end
- if not mod.version or not mod.name or not mod.date or not mod.description then
- luatextra.internal_error('invalid module registered, fields name, version, date and description are mandatory')
- return
- end
- requiredversion = luatextra.requiredversions[mod.name]
- if requiredversion then
- if requiredversion.type == date and requiredversion.version > luatextra.datetonumber(mod.date) then
- luatextra.internal_error(format("loading module %s in version %s, but version %s was required", mod.name, mod.date, requiredversion.orig))
- elseif requiredversion.type == number and requiredversion.version > mod.version then
- luatextra.internal_error(format("loading module %s in version %.02f, but version %s was required", mod.name, mod.version, requiredversion.orig))
- end
- end
- luatextra.modules[mod.name] = module
- texio.write_nl('log', format("Lua module: %s %s v%.02f %s\n", mod.name, mod.date, mod.version, mod.description))
-end
-
-% \end{macrocode}
-%
-% \end{macro}
-%
-% Here we load the \textsf{luaextra} module, that contains a bunch of very
-% useful functions. See the documentation of \textsf{luaextra} for more
-% details.
-%
-% \begin{macrocode}
-
-luatextra.use_module('luaextra')
-
-% \end{macrocode}
-%
-% \texttt{luatextra.kpse\_module\_loader} finds a module with the
-% \texttt{kpse} library. This function is then registered in the table of
-% the functions used by the lua function \texttt{require} to look for
-% modules.
-%
-% \begin{macrocode}
-
-function luatextra.kpse_module_loader(mod)
- local file = luatextra.find_module_file(mod)
- if file then
- local loader, error = loadfile(file)
- if loader then
- texio.write_nl("(" .. file .. ")")
- return loader
- end
- return "\n\t[luatextra.kpse_module_loader] Loading error:\n\t"
- .. error
- end
- return "\n\t[luatextra.kpse_module_loader] Search failed"
-end
-
-table.insert(package.loaders, luatextra.kpse_module_loader)
-
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</luamodule>
-% \end{macrocode}
-%
-% \Finale
-\endinput