summaryrefslogtreecommitdiff
path: root/language/hyph-utf8/source/luatex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /language/hyph-utf8/source/luatex
Initial commit
Diffstat (limited to 'language/hyph-utf8/source/luatex')
-rw-r--r--language/hyph-utf8/source/luatex/hyph-utf8/Makefile35
-rw-r--r--language/hyph-utf8/source/luatex/hyph-utf8/luatex-hyphen.dtx337
2 files changed, 372 insertions, 0 deletions
diff --git a/language/hyph-utf8/source/luatex/hyph-utf8/Makefile b/language/hyph-utf8/source/luatex/hyph-utf8/Makefile
new file mode 100644
index 0000000000..2ae8bd67a1
--- /dev/null
+++ b/language/hyph-utf8/source/luatex/hyph-utf8/Makefile
@@ -0,0 +1,35 @@
+# Makefile for luatex-hyphen in tex-hyphen/hyph-utf8
+
+NAME = luatex-hyphen
+DTX = $(NAME).dtx
+
+# Generated files
+COMPILED = $(NAME).pdf
+UNPACKED = $(NAME).lua hyphen.cfg
+
+# Installation locations
+RUNDIR = ../../../tex/luatex/hyph-utf8
+DOCDIR = ../../../doc/luatex/hyph-utf8
+
+# Final files
+RUNFILES = $(patsubst %, $(RUNDIR)/%, $(UNPACKED))
+DOCFILE = $(DOCDIR)/$(COMPILED)
+
+all: $(RUNFILES) $(DOCFILE)
+
+DO_TEX = tex --interaction=batchmode $< >/dev/null
+DO_PDFLATEX = pdflatex --interaction=batchmode $< >/dev/null
+
+$(DOCFILE): $(DTX)
+ $(DO_PDFLATEX)
+ $(DO_PDFLATEX)
+ mv $(COMPILED) $(DOCDIR)
+
+$(RUNFILES): $(DTX)
+ $(DO_TEX)
+ for file in $(UNPACKED); do mv $$file $(RUNDIR); done
+
+clean:
+ @$(RM) -- *.log *.aux *.toc *.idx *.ind *.ilg
+
+.PHONY: clean
diff --git a/language/hyph-utf8/source/luatex/hyph-utf8/luatex-hyphen.dtx b/language/hyph-utf8/source/luatex/hyph-utf8/luatex-hyphen.dtx
new file mode 100644
index 0000000000..ca1761ef2b
--- /dev/null
+++ b/language/hyph-utf8/source/luatex/hyph-utf8/luatex-hyphen.dtx
@@ -0,0 +1,337 @@
+% \iffalse meta-comment
+%
+% This is a module for hyphenation patterns loading for LuaTeX. It is under
+% the CC0 license (http://creativecommons.org/publicdomain/zero/1.0/).
+%
+%<*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
+
+\def\MetaPrefix{-- }
+
+\def\luapostamble{%
+ \MetaPrefix^^J%
+ \MetaPrefix\space End of File `\outFileName'.%
+}
+
+\def\currentpostamble{\luapostamble}%
+
+\preamble
+
+This is a generated file (source: luatex-hyphen.dtx).
+
+Copyright (C) 2012-2013 by The LuaLaTeX development team.
+
+This work is under the CC0 license.
+
+\endpreamble
+
+\generate{%
+ \file{luatex-hyphen.lua}{\from{luatex-hyphen.dtx}{lua}}%
+}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{luatex-hyphen.drv}
+ [2013/05/16 v1.6 Hyphenation pattern loading for LuaTeX]
+\documentclass{ltxdoc}
+\usepackage[
+ pdftitle={The luatex-hyphen package},
+ pdfsubject={Hyphenation pattern loading for LuaTeX},
+ pdfauthor={Manuel Pégourié-Gonnard, Khaled Hosny & Elie Roux},
+ pdfkeywords={luatex, lualatex, unicode, hyphenation}
+]{hyperref}
+\usepackage{fontspec}
+\setmainfont[
+ Ligatures = TeX,
+ BoldFont = {Linux Libertine O Bold},
+ ItalicFont = {Linux Libertine O Italic},
+ SlantedFont = {Linux Libertine O Italic},
+]{Linux Libertine O}
+\setmonofont[Ligatures=TeX,Scale=MatchLowercase]{Liberation Mono}
+\setsansfont[Ligatures=TeX,Scale=MatchLowercase]{Iwona Medium}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{luatex-hyphen.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{luatex-hyphen.drv}
+%
+% \title{The \texttt{hyphen.cfg} file for Lua\TeX }
+% \date{2013/05/16 v1.6}
+% \author{Khaled Hosny, Élie Roux, and Manuel Pégourié-Gonnard\\
+% \texttt{khaledhosny@eglug.org} \\
+% \texttt{elie.roux@telecom-bretagne.eu} \\
+% \texttt{mpg@elzevir.fr}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package is mainly a Lua module, to be used by \textsf{Babel} and
+% \textsf{polyglossia} to adapt their hyphenation patterns loading mechanism to
+% Lua\TeX's dynamic pattern loading capabilities. It makes use of a
+% \texttt{language.dat.lua} file (whose format is described below) that should
+% be present in the distribution, in addition to the regular
+% \texttt{language.dat} file.
+%
+% \textsf{Babel} needed to be updated -- this used to be the goal of this
+% package -- before version \textsf{3.9} (\TeX Live 2013) and
+% \textsf{polyglossia} handles Lua\TeX\ since version \textsf{1.3} (\TeX Live
+% 2013).
+%
+% There is a version of \texttt{etex.src} modified for the same reasons using
+% similar code, which also makes use of the \texttt{luatex-hyphen.lua} and
+% \texttt{language.dat.lua} files described here.
+% \end{abstract}
+%
+% \section{Documentation}
+%
+% Hyphenation patterns should be loaded at runtime with Lua\TeX: if they appear
+% in the format, they will be rehashed when the format is loaded anyway, which
+% makes the format quite long to load (many seconds even on modern machines)
+% and provides for bad user experience. Hence, it is desirable to load as few
+% patterns as possible in the format, and load on-demand the needed patterns
+% at runtime.
+%
+% This package provides a modified version of hyphen.cfg adapted to Lua\TeX,
+% as well as a supporting Lua module. Since a lot of things, especially the
+% catcodes, are not as predictable at runtime than at format creation time, we
+% don't \verb+\input+ the usual pattern files, but rather load the patterns
+% using the Lua interface, using a special plain text version of the pattern
+% files if available.
+%
+% The existence and file name of such a version cannot be guessed, so we need
+% a specific database: the file \texttt{language.dat.lua}. This file should be
+% loadable by Lua and return a table whose keys are the canonical language
+% names as found in \texttt{language.dat}, and the values are Lua tables
+% consisting of:
+% \begin{enumerate}
+% \item A fixed part with one mandatory field:
+% \begin{quote}
+% \verb+synonyms = { <string> alternative name, ...}+
+% \end{quote}
+% This field's value must be the same as in \texttt{language.dat}.
+% \item A variable part consisting of either:
+% \begin{itemize}
+% \item For most languages:
+% \begin{quote}
+% \verb+patterns = <string> filenames for patterns+\\
+% \verb+hyphenation = <string> filenames for exceptions+\\
+% \end{quote}
+% Each string contains a coma-separated list of file names (whitespace
+% before or after the coma is not accepted).
+% The files given by \verb+patterns+ (resp. \verb+hypenation+) must be
+% plain text files encoded in UTF-8, with only patterns (resp.
+% exceptions) and not even comments: their content will be used
+% directly without being parsed by \TeX. If one of these keys is
+% missing or is the empty string, it is ignored and no patterns (resp.
+% exceptions) are loaded for this language.
+% \item Special cases are supported by a field \verb+special+. Currently,
+% the following kind of values are recognized:
+% \begin{description}
+% \item[\texttt{'disabled:<reason>'}] allows to disable specific
+% languages: when the user tries to load this language, an error
+% will be issued, with the \verb+<reason>+.
+% \item[\texttt{'language0'}] only \texttt{english} should use this
+% type of special, to indicate it is normally dumped in the format
+% as \verb+\language0+ (see below).
+% \end{description}
+% Special languages may have \texttt{*hyphenmin} information when it
+% makes sense (mostly \verb+\language0+).
+% \end{itemize}
+% \item Optional fields may be added. For example:
+% \begin{quote}
+% \verb+loader = <string> name of the TeX loader+\\
+% \verb+lefthyphenmin = <number> value for \lefthyphenmin+\\
+% \verb+righthyphenmin = <number> value for \righthyphenmin+
+% \end{quote}
+% Those fields are present in \texttt{language.dat.lua} as generated by
+% \texttt{tlmgr}, for example, but they \emph{are not} used by the present
+% code in any way.
+% \end{enumerate}
+% Languages that are mentioned in \texttt{language.dat} but not in
+% \texttt{language.dat.lua} will be loaded in the format. So, if the
+% \texttt{language.dat.lua} file is missing or incomplete, languages will just
+% go back to the ``old'' behaviour, resulting in longer startup time, which
+% seems less bad than complete breakage.
+%
+% For backward compatibility, Knuth's original patterns for US English are
+% always loaded in the format, as \verb+\language0+.\footnote{It is assumed
+% to be the first entry in \texttt{language.dat}.}
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*lua>
+% \end{macrocode}
+%
+% Start a Lua module, two functions for error and information reporting.
+%
+% \begin{macrocode}
+luatexhyphen = luatexhyphen or {}
+local luatexhyphen = luatexhyphen
+local function wlog(msg, ...)
+ texio.write_nl('log', 'luatex-hyphen: '..msg:format(...))
+end
+local function err(msg, ...)
+ error('luatex-hyphen: '..msg:format(...), 2)
+end
+% \end{macrocode}
+%
+% Load the \texttt{language.dat.lua} file with the Lua version of the
+% language database.
+%
+% \begin{macrocode}
+local dbname = "language.dat.lua"
+local language_dat
+local dbfile = kpse.find_file(dbname, 'lua')
+if not dbfile then
+ err("file not found: "..dbname)
+else
+ wlog('using data file: %s', dbfile)
+ language_dat = dofile(dbfile)
+end
+% \end{macrocode}
+%
+% Look up a language in the database, and return the associated
+% information, as well as the canonical name of the language.
+%
+% \begin{macrocode}
+local function lookupname(name)
+ if language_dat[name] then
+ return language_dat[name], name
+ else
+ for canon, data in pairs(language_dat) do
+ for _,syn in ipairs(data.synonyms) do
+ if syn == name then
+ return data, canon
+ end
+ end
+ end
+ end
+end
+luatexhyphen.lookupname = lookupname
+% \end{macrocode}
+%
+% Set hyphenation patterns and exceptions for a language given by its name
+% (in the database) and number (value of \verb+\language+). Doesn't return
+% anything, but will call \verb+error()+ if things go wrong.
+%
+% \begin{macrocode}
+local function loadlanguage(lname, id)
+ if id == 0 then
+ return
+ end
+ local msg = "loading%s patterns and exceptions for: %s (\\language%d)"
+% \end{macrocode}
+%
+% Lookup the language in the database.
+%
+% \begin{macrocode}
+ local ldata, cname = lookupname(lname)
+ if not ldata then
+ err("no entry in %s for this language: %s", dbname, lname)
+ end
+% \end{macrocode}
+%
+% Handle special languages.
+%
+% \begin{macrocode}
+ if ldata.special then
+ if ldata.special:find('^disabled:') then
+ err("language disabled by %s: %s (%s)", dbname, cname,
+ ldata.special:gsub('^disabled:', ''))
+ elseif ldata.special == 'language0' then
+ err("\\language0 should be dumped in the format")
+ else
+ err("bad entry in %s for language %s")
+ end
+ end
+% \end{macrocode}
+%
+% The generic case: load hyphenation patterns and exceptions from files
+% given by the language code.
+%
+% \begin{macrocode}
+ wlog(msg, '', cname, id)
+ for _, item in ipairs{'patterns', 'hyphenation'} do
+ local filelist = ldata[item]
+ if filelist ~= nil and filelist ~= '' then
+ for _, file in ipairs(filelist:explode(',')) do
+ local file = kpse.find_file(file) or err("file not found: %s", file)
+ local fh = io.open(file, 'r')
+ local data = fh:read('*a') or err("file not readable: %s", f)
+ fh:close()
+ lang[item](lang.new(id), data)
+ end
+ else
+ if item == 'hyphenation' then item = item..' exceptions' end
+ wlog("info: no %s for this language", item)
+ end
+ end
+end
+luatexhyphen.loadlanguage = loadlanguage
+% \end{macrocode}
+%
+% Add \textsf{Babel}'s ``dialects'' as synonyms.
+%
+% \begin{macrocode}
+local function adddialect(dialect, language)
+ if dialect ~= '0' then
+ dialect = dialect:gsub('l@', '')
+ language = language:gsub('l@', '')
+ data = lookupname(language)
+ if data then
+ data.synonyms[#data.synonyms+1] = dialect
+ end
+ end
+end
+luatexhyphen.adddialect = adddialect
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</lua>
+% \end{macrocode}
+%
+% \Finale
+\endinput