% \iffalse meta-comment
%
% Copyright (C) 2009-2011 by Elie Roux    <elie.roux@telecom-bretagne.eu>
%                        and Khaled Hosny <khaledhosny@eglug.org>
%                             (Support: <lualatex-dev@tug.org>.)
%
% This work is under the CC0 license.
%
% This work consists of the main source file luaotfload.dtx
% and the derived files
%    luaotfload.sty, luaotfload.lua
%
% Unpacking:
%    tex luaotfload.dtx
%
% Documentation:
%    pdflatex luaotfload.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
\Msg{************************************************************************}
\Msg{* Installation}
\Msg{* Package: luaotfload v2.0 OpenType layout system}
\Msg{************************************************************************}

\keepsilent
\askforoverwritefalse

\let\MetaPrefix\relax

\preamble
This is a generated file.

Copyright (C) 2009-2011 by by Elie Roux    <elie.roux@telecom-bretagne.eu>
                          and Khaled Hosny <khaledhosny@eglug.org>
                               (Support: <lualatex-dev@tug.org>.)

This work is under the CC0 license.

This work consists of the main source file luaotfload.dtx
and the derived files
    luaotfload.sty, luaotfload.lua

\endpreamble

\let\MetaPrefix\DoubleperCent


\generate{%
  \usedir{tex/luatex/luaodfload}%
  \file{luaotfload.sty}{\from{luaotfload.dtx}{package}}%
}

% The following hacks are to generate a lua file with lua comments starting by
% -- instead of %%

\def\MetaPrefix{-- }

\def\luapostamble{%
  \MetaPrefix^^J%
  \MetaPrefix\space End of File `\outFileName'.%
}

\def\currentpostamble{\luapostamble}%

\generate{%
  \usedir{tex/luatex/luaotfload}%
  \file{luaotfload.lua}{\from{luaotfload.dtx}{lua}}%%
}

\obeyspaces
\Msg{************************************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the following}
\Msg{* files into a directory searched by TeX:}
\Msg{*}
\Msg{*     luaotfload.sty, luaotfload.lua}
\Msg{*}
\Msg{* Happy TeXing!}
\Msg{*}
\Msg{************************************************************************}

\endbatchfile
%</install>
%<*ignore>
\fi
%</ignore>
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{luaotfload.drv}%
  [2011/10/06 v2.0 OpenType layout system]%
\documentclass{ltxdoc}
\usepackage{metalogo,multicol,mdwlist,fancyvrb,xcolor,xspace}
\usepackage[
  bookmarks=true,
  colorlinks=true,
  linkcolor=niceblue,
% urlcolor=niceblue,
  citecolor=niceblue,
  pdftitle={The luaotfload package},
  pdfsubject={OpenType layout system for Plain TeX and LaTeX},
  pdfauthor={Elie Roux & Khaled Hosny},
  pdfkeywords={luatex, lualatex, unicode, opentype}
  ]{hyperref}

\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX]{Linux Libertine O}
\setsansfont[Ligatures=TeX]{Linux Biolinum O}
\setmathfont{XITS Math}

\definecolor{niceblue}{rgb}{0.4,0.6,1.000}

\newcommand\tex    {\TeX\xspace}
\newcommand\pdftex {PDF\TeX\xspace}
\newcommand\luatex {Lua\TeX\xspace}
\newcommand\xetex  {\XeTeX\xspace}
\newcommand\latex  {\LaTeX\xspace}
\newcommand\context{Con\TeX t\xspace}

\newcommand*\email[1]{\href{mailto:#1}{#1}}

\VerbatimFootnotes
\begin{document}
  \DocInput{luaotfload.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{luaotfload.drv}
%
% \title{The \textsf{luaotfload} package}
% \date{2011/10/06 v2.0}
% \author{Elie Roux and Khaled Hosny\\
%         Support: \email{lualatex-dev@tug.org}}
%
% \maketitle
%
% \begin{abstract}
% This package is an adaptation of the \context font loading system, providing
% the ability to load \textsf{OpenType} fonts with extended font loading syntax
% supporting a large selection of OpenType font features.
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
%
% Font management and installation has always been painful with \tex.  A lot of
% files are needed for one font (tfm, pfb, map, fd, vf), and as \tex is 8-bit
% each font is limited to 256 characters.  But the font world has evolved since
% \tex, and new font technologies have appeared, most notably the so called
% \emph{smart font} technologies like \textsf{OpenType} fonts. These fonts can
% contain a lot of characters, and additional functionalities like ligatures,
% old-style numbers, small capitals, etc., and support more complex writing
% systems like Arabic and Indic\footnote{Unfortunately, \textsf{luaotfload}
% doesn't support Indic scripts right now.} scripts.  They are widely deployed
% and available for all modern operating systems and are becoming the de facto
% standard fonts for advanced text layout.  Until now the only way to use them
% directly in the \tex world was by using them with \xetex.
%
% Unlike \xetex, \luatex does not provide direct support for using these fonts
% by default, but it provides a way to hook Lua code in some points of the \tex
% processing; for instance, we can improve the font loading system, and text
% procession, which what this package is about.
%
% \section{Loading fonts}
%
% \textsf{luaotfload} supports an extended font loading syntax which looks
% like:
%
% \begin{center}
% |\font\foo={|\meta{prefix}|:|\meta{font name}|:|\meta{font features}|}| \meta{\tex font features}
% \end{center}
%
% \noindent
% The curly brackets are optional and are used for escaping spaces in font
% names (double quotes can also used for the same purpose).
%
% \paragraph{Prefix}
%
% The \meta{prefix} can be either |file:| or |name:|, which specify whether to
% use a select the font from its filename or font name, respectively. If no
% prefix is specified |name:| is assumed.
%
% For compatibility with \xetex, surrounding the \meta{font name} with square
% brackets is synonymous to using the |file:| prefix.
%
% Accessing fonts by fontname allows loading system installed fonts as well as
% \textsc{texmf} ones, and requires a font names database; see
% Section~\ref{sec:fontdb} for more information.
%
% \paragraph{Font name}
%
% The \meta{font name} can be either a font filename or actual font name based
% on the \meta{prefix} as mentioned above.
%
% Fonts loaded by filename may either include their absolute path in the
% filesystem or consist of just the filename with a path.  If no path is
% specified then \textsf{kpathsea} is used to locate the font (which will
% typically be in the \textsc{texmf} tree or the current directory).
%
% For example,
% \begin{quote}
% \begin{verbatim}
% \font\1={file:ec-lmr10} at 10pt
% \font\2={/Users/Shared/Fonts/aldus.otf} at 11pt
% \font\3={name:TeX Gyre Pagella} at 9pt
% \end{verbatim}
% \end{quote}
%
%
% \paragraph{Font features}
%
% \meta{font features} is semicolon-separated list of feature
% tags\footnote{\url{http://www.microsoft.com/typography/otspec/featurelist.htm}}
% and font options. Font features are prepended with a |+| to turn them on and
% a |-| to turn them off, alternatively you can pass |true| or |false| value to
% the feature:
%
% |\font\test=Latin Modern Roman:+clig;-kern|
%
% \noindent or:
%
% |\font\test=Latin Modern Roman:clig=true;kern=false|
%
% \noindent For alternate substation features you can pass the index of the
% variant you want (starting from 1) or |random| to randomly select a variant
% each time an affected glyph is shown, e.g.:
%
% |\font\test=Latin Modern Roman:salt=1|
%
% \noindent Known font options include:
%
% \begin{description}
% \item [mode] \hfill \\
% \textsf{luaotfload} has two OpenType processing modes; |base| and |node|.
% |base| mode works by mapping OpenType features to traditional \tex ligature
% and kerning mechanisms, thus supporting only non-contextual substitutions and
% kerning pairs, but is slightly faster. |node| works by direct processing of
% the node list at Lua end and have more wide support of OpenType features but
% can be slow especially with complex fonts and can't be used in math mode.
%
% By default |node| mode is used, and you have to manually force |base| mode
% when needed e.g. for math fonts.
%
% \item [script] \hfill \\
% OpenType script
% string,\footnote{\url{http://www.microsoft.com/typography/otspec/scripttags.htm}}
% default value is |dflt|. Some fonts don't assign features to the |dflt|
% script, in which case the script need to be set explicitly.
%
% \item [language] \hfill \\
% OpenType language
% string,\footnote{\url{http://www.microsoft.com/typography/otspec/languagetags.htm}}
% default value is |latn|.
%
% \item [featurefile] \hfill \\
% a comma-separated list of feature files to be applied to the font.  Feature
% files are textual representation of OpenType tables and can be used to extend
% OpenType features of the font on fly. Features defined in a feature file,
% after being applied to the font, can be enabled/disabled like any other
% feature. The syntax is documented in Adobe's OpenType Feature File
% Specification.\footnote{\url{http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html}}
%
% For example, to set a |tkrn| feature from |mykern.fea| file:
%
% |\font\test=Latin Modern Roman:featurefile=mykern.fea;+tkrn|
%
% \item [color] \hfill \\
% font color, defined as a triplet of two-digit hexadecimal RGB values, with
% optionally another value for the transparency (where |00| is completely
% transparent and |FF| is opaque.)
%
% For example, to set text in semitransparent red:
%
% |\font\test=Latin Modern Roman:color=FF0000BB|
%
% \item [protrusion \& expansion] \hfill \\
% Both keys control microtypographic features of the font, namely glyph
% protrusion and expansion. The value of the key is the name of predefined Lua
% tables of protrusion and expansion values; see the end of |otfl-fonts-ext.lua|
% file for an example of such tables. The only predefined value is |default|.
%
% For example, to enable default protrusion:\footnote{You also need to set
% |\pdfprotrudechars2 \pdfadjustspacing2| to activate protrusion and expansion,
% respectively. See \pdftex manual for details.}
%
% |\font\test=Latin Modern Roman:protrusion=default|
% \end{description}
%
% \subparagraph{Non-standard font features}
% \textsf{luaotfload} defines some additional font feature not defined in
% OpenType, currently three features are defined:
%
% \begin{itemize*}
% \item |anum|: replaces European numbers with eastern Arabic numbers or
% Persian numbers, depending on the value of |language|.
% \item |tlig|: applies legacy \tex ligatures: |``|, |''|, |`|, |'|, |"|, |--|,
% |---|, |!`| and |?`|.\footnote{For \xetex users: this is the equivalent of
% writing |mapping=text-tex| using \xetex's input remapping feature.}
% \end{itemize*}
%
%
%
% \section{Font names database}
% \label{sec:fontdb}
%
% As introduced in the previous section, \textsf{luaotfload} uses a database to
% keep track of fonts available to \luatex. Using this database, fonts can be
% loaded by font name as well as filename.
%
% When \textsf{luaotfload} is asked to load a font by font name, it will check
% if font names database exists and load it, or generate a new database if non
% exists. This is all done automatically without user intervention. When the
% asked font is missing from the database, it will attempt to update the
% database and try to find the font again, so that the user can install new
% fonts without worrying about manually updating the database.
%
% However, it is sometimes desirable to update the database manually, so
% \textsf{luaotfload} provides a |mkluatexfontdb| utility to manually update
% the database. |mkluatexfontdb| is a lua script that can be either run
% directly or as an argument to |texlua|, depending on your system.\footnote{On
% MS Windows it can be run either by calling the wrapper application
% |mkluatexfontdb.exe| or with |texlua.exe mkluatexfontdb.lua|.}
%
% The first time the database is generated may take quite some time to process
% every font on your computer.  This is particularly noticeable if it occurs
% during a typesetting run.  Subsequent runs to update the database will be
% quite fast, however.
%
% \textsf{luaotfload} will parse standard places for fonts in your system to
% build the font database. On Linux, it will read |fontconfig| configuration
% files to find the font locations; on Windows and Mac~OS~X, it will search in
% the standard font locations, |%WINDIR%\Fonts| in Windows and
% |~/Library/Fonts|, |/Library/Fonts|, |/System/Library/Fonts|, and
% |/Network/Library/Fonts| in Mac~OS~X.
%
% If you do not wish the standard font locations be searched by default but
% would rather specify the exact locations in which to find your fonts, set the
% |OSFONTDIR| environment variable instead. When this variable is set, only the
% specified directories will be searched.
%
% |mkluatexfontdb.lua --help| provides a brief summary of the functionality of
% the script and includes some advanced options that we have not mentioned
% here.
%
% \subsection{Blacklisting fonts}
%
% Some fonts are problematic in \luatex, if you found that your document takes
% too long to compile, or eats all the free memory, you can find the culprit
% file by running |mkluatexfontdb| utility with |-v| option to see which font
% file it is stuck with. You can then instruct \textsf{luaotfload} to ignore
% this font by adding it to the blacklist configuration file.
%
% Simply, create a file named |otfl-blacklist.cnf| and added the to be
% blacklisted files, one per line. Then put the file some where \textsf{kpse}
% can find. You can either use the base name or the full path. Any thing after
% a |%| sign is ignored. \textsf{luaotfload} reads all files named named
% |otfl-blacklist.cnf|, so you can add your own fonts to the global blacklist
% by creating a local file |otfl-blacklist.cnf| with the entries you need.  You
% can also remove a font from this blacklist by prepending the name with a dash
% (|-|).
%
% \begin{verbatim}
% % example otf-blacklist.cnf
% /Library/Fonts/GillSans.ttc  % luaotfload ignores this font
% -/Library/Fonts/Optima.ttc   % it is usable again, even if it
%                              % is blacklisted somewhere else
% \end{verbatim}
%
% \section{Used \context files}
%
% This package is a wrapper for several files taken from the \context macro
% package. The philosophy is to let \context do all the implementation and
% update these files from time to time. So we try not to modify the files taken
% from \context as far as possible, but we changed their names to prevent name
% clashes.
%
% The \context files are renamed by adding the prefix |otfl-| to them (|otfl|
% as |OTF L|oad). The files are:
%
% \begin{multicols}{3}
% \begin{itemize*}
% \item |data-con.lua|
% \item |font-cid.lua|
% \item |font-con.lua|
% \item |font-def.lua|
% \item |font-ini.lua|
% \item |font-map.lua|
% \item |font-ota.lua|
% \item |font-otb.lua|
% \item |font-otc.lua|
% \item |font-otf.lua|
% \item |font-oti.lua|
% \item |font-otn.lua|
% \item |node-inj.lua|
% \item |luatex-fonts-cbk.lua|
% \item |luatex-fonts-enc.lua|
% \item |luatex-fonts-ext.lua|
% \item |luatex-fonts-lua.lua|
% \item |luatex-fonts-tfm.lua|
% \item |luatex-basics-gen.lua|
% \item |luatex-basics-nod.lua|
% \item |font-age.lua|\footnote{Not renamed as it is loaded directly from
% |fonts-enc.lua|.}
% \end{itemize*}
% \end{multicols}
%
% The following files have been written for this package:
% \begin{itemize*}
% \item |otfl-font-clr.lua|
% \item |otfl-font-nms.lua|
% \item |otfl-luat-ovr.lua|
% \item |otfl-font-ltx.lua|\footnote{A heavily modified version of
% |luatex-fonts-def.lua|.}
% \end{itemize*}
%
% \section{Troubleshooting}
%
% If you encounter problems with some fonts, please first update to the latest
% version of this package before reporting a bug, as this package is under
% active development.
%
% A very common problem is the lack of features for some OpenType fonts even
% when specified. It can be related to the fact that some fonts do not provide
% features for the |dflt| script, which is the default one in this package, so
% you may have to specify the script in the command line, for example:
%
% |\font\test=file:MyFont.otf:script=latn;+liga;|
%
% \part{\texttt{luaotfload.lua}}
%
% \iffalse
%<*lua>
% \fi
%
% \section{Initializations}
%
%    \begin{macrocode}
module("luaotfload", package.seeall)
%    \end{macrocode}
%
%    \begin{macrocode}
luaotfload.module = {
    name          = "luaotfload",
    version       = 2.0,
    date          = "2011/10/06",
    description   = "OpenType layout system.",
    author        = "Elie Roux & Hans Hagen",
    copyright     = "Elie Roux",
    license       = "CC0"
}
%    \end{macrocode}
%
%    \begin{macrocode}
local error, warning, info, log = luatexbase.provides_module(luaotfload.module)
%    \end{macrocode}
%
%    The minimal required \luatex version.
%
%    \begin{macrocode}
local luatex_version = 70
%    \end{macrocode}
%
%    \begin{macrocode}
if tex.luatexversion < luatex_version then
    warning("LuaTeX v%.2f is old, v%.2f is recommended.",
             tex.luatexversion/100,
             luatex_version   /100)
end
%    \end{macrocode}
%
%    Some required functions missing from \textsf{lualibs} package.
%
%    \begin{macrocode}
function table.reversed(t)
    if t then
        local tt, tn = { }, #t
        if tn > 0 then
            local ttn = 0
            for i=tn,1,-1 do
                ttn = ttn + 1
                tt[ttn] = t[i]
            end
        end
        return tt
    end
end
%    \end{macrocode}
%
%    \begin{macrocode}
function table.derive(parent)
    local child = { }
    if parent then
        setmetatable(child,{ __index = parent })
    end
    return child
end
%    \end{macrocode}
%
%    \begin{macrocode}
function string.quoted(str)
    return string.format("%q",str)
end
%    \end{macrocode}
%
% \section{Module loading}
%
%    \begin{macrocode}
require('otfl-basics-gen.lua')
require('otfl-luat-ovr.lua') -- overrides some otfl-basics-gen.lua functions
require('otfl-data-con.lua')
require('otfl-basics-nod.lua')
%    \end{macrocode}
%
%    By default \context takes some private attributes for internal use. To
%    avoide attribute clashes with other packages, we override the function
%    that allocates new attributes, making it a wraper around
%    |luatexbase.new_attribute()|. We also prefix attributes with |otfl@| to
%    avoid possiple name clashes.
%
%    \begin{macrocode}
function attributes.private(name)
    local attr   = "otfl@" .. name
    local number = luatexbase.attributes[attr]
    if not number then
        number = luatexbase.new_attribute(attr)
    end
    return number
end
%    \end{macrocode}
%
%    \begin{macrocode}
require('otfl-font-ini.lua')
require('otfl-font-con.lua')
require('otfl-fonts-enc.lua')
require('otfl-font-cid.lua')
require('otfl-font-map.lua')
require('otfl-font-nms.lua')
require('otfl-fonts-tfm.lua')
require('otfl-font-oti.lua')
require('otfl-font-otf.lua')
require('otfl-font-pfb.lua')
require('otfl-font-otb.lua')
require('otfl-node-inj.lua')
require('otfl-font-otn.lua')
require('otfl-font-ota.lua')
require('otfl-font-otc.lua')
require('otfl-fonts-lua.lua')
require('otfl-font-def.lua')
require('otfl-font-ltx.lua')
require('otfl-fonts-ext.lua')
require('otfl-fonts-cbk.lua')
require('otfl-font-clr.lua')
%    \end{macrocode}
%
%    Here we override some defaults set in \context code.
%
%    \begin{macrocode}
fonts.mode = "node"
caches.compilemethod = "both"
%    \end{macrocode}
%
%    Now overriding the \context's definition of |tlig| and |trep| features,
%    using code points instead of glyph names to make it font independent.
%
%    \begin{macrocode}
local everywhere = { ["*"] = { ["*"] = true } }

local tlig = {
    {
        type      = "substitution",
        features  = everywhere,
        data      = {
            [0x0022] = 0x201D,                   -- quotedblright
            [0x0027] = 0x2019,                   -- quoteleft
            [0x0060] = 0x2018,                   -- quoteright
        },
        flags     = { },
    },
    {
        type     = "ligature",
        features = everywhere,
        data     = {
            [0x2013] = {0x002D, 0x002D},         -- endash
            [0x2014] = {0x002D, 0x002D, 0x002D}, -- emdash
            [0x201C] = {0x2018, 0x2018},         -- quotedblleft
            [0x201D] = {0x2019, 0x2019},         -- quotedblright
            [0x201E] = {0x002C, 0x002C},         -- quotedblbase
            [0x00A1] = {0x0021, 0x2018},         -- exclamdown
            [0x00BF] = {0x003F, 0x2018},         -- questiondown
        },
        flags    = { },
    },
    {
        type     = "ligature",
        features = everywhere,
        data     = {
            [0x201C] = {0x0060, 0x0060},         -- quotedblleft
            [0x201D] = {0x0027, 0x0027},         -- quotedblright
            [0x00A1] = {0x0021, 0x0060},         -- exclamdown
            [0x00BF] = {0x003F, 0x0060},         -- questiondown
        },
        flags    = { },
    },
}

fonts.handlers.otf.addfeature("tlig", tlig)
fonts.handlers.otf.addfeature("trep", { }) -- empty, all in tlig now
%    \end{macrocode}
%
%    And overriding the \context's definition of |anum|.
%
%    \begin{macrocode}
local anum_arabic = {
    [0x0030] = 0x0660,
    [0x0031] = 0x0661,
    [0x0032] = 0x0662,
    [0x0033] = 0x0663,
    [0x0034] = 0x0664,
    [0x0035] = 0x0665,
    [0x0036] = 0x0666,
    [0x0037] = 0x0667,
    [0x0038] = 0x0668,
    [0x0039] = 0x0669,
}

local anum_persian = {
    [0x0030] = 0x06F0,
    [0x0031] = 0x06F1,
    [0x0032] = 0x06F2,
    [0x0033] = 0x06F3,
    [0x0034] = 0x06F4,
    [0x0035] = 0x06F5,
    [0x0036] = 0x06F6,
    [0x0037] = 0x06F7,
    [0x0038] = 0x06F8,
    [0x0039] = 0x06F9,
}

local function valid(data)
    local features = data.resources.features
    if features then
        for k, v in next, features do
            for k, v in next, v do
                if v.arab then
                    return true
                end
            end
        end
    end
end

local anum_specification = {
    {
        type     = "substitution",
        features = { arab = { far = true, urd = true, snd = true } },
        data     = anum_persian,
        flags    = { },
        valid    = valid,
    },
    {
        type     = "substitution",
	features = { arab = { ["*"] = true } },
        data     = anum_arabic,
        flags    = { },
        valid    = valid,
    },
}

fonts.handlers.otf.addfeature("anum",anum_specification)
%    \end{macrocode}
%
%    we provide a callback for patching fonts on the fly, to be used by other
%    packages.
%
%    \begin{macrocode}
luatexbase.create_callback("luaotfload.patch_font", "simple", function() end)
%    \end{macrocode}
%
%    \begin{macrocode}
local function deffont(...)
    local fontdata = fonts.definers.read(...)
    if type(fontdata) == "table" then
        luatexbase.call_callback("luaotfload.patch_font", fontdata)
    end
    return fontdata
end
%    \end{macrocode}
%
%    Finally we register the callbacks
%
%    \begin{macrocode}
local handler = nodes.simple_font_handler
luatexbase.reset_callback("define_font")
luatexbase.add_to_callback("pre_linebreak_filter", handler, "luaotfload")
luatexbase.add_to_callback("hpack_filter",         handler, "luaotfload")
luatexbase.add_to_callback("define_font",          deffont, "luaotfload")
%    \end{macrocode}
%
% \iffalse
%</lua>
% \fi
%
% \part{\texttt{luaotfload.sty}}
%
% \iffalse
%<*package>
% \fi
%
%    Classical Plain+\latex package initialization.
%
%    \begin{macrocode}
\csname ifluaotfloadloaded\endcsname
\let\ifluaotfloadloaded\endinput
%    \end{macrocode}
%
%    \begin{macrocode}
\bgroup\expandafter\expandafter\expandafter\egroup
\expandafter\ifx\csname ProvidesPackage\endcsname\relax
  \input luatexbase.sty
\else
  \NeedsTeXFormat{LaTeX2e}
  \ProvidesPackage{luaotfload}%
    [2011/10/06 v2.0 OpenType layout system]
  \RequirePackage{luatexbase}
\fi
%    \end{macrocode}
%
%    \begin{macrocode}
\RequireLuaModule{lualibs}
%    \end{macrocode}
%
%    \begin{macrocode}
\RequireLuaModule{luaotfload}
%    \end{macrocode}
% \iffalse
%</package>
% \fi
%
% \clearpage
% \section{The GNU GPL License v2}
%
% The GPL requires the complete license text to be distributed along
% with the code. I recommend the canonical source, instead:
% \url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html}.
% But if you insist on an included copy, here it is.
% You might want to zoom in.
%
% \newsavebox{\gpl}
% \begin{lrbox}{\gpl}
% \begin{minipage}{3\textwidth}
% \columnsep=3\columnsep
% \begin{multicols}{3}
% \begin{center}
% {\Large GNU GENERAL PUBLIC LICENSE\par}
% \bigskip
% {Version 2, June 1991}
% \end{center}
%
% \begin{center}
% {\parindent 0in
%
% Copyright \textcopyright\ 1989, 1991 Free Software Foundation, Inc.
%
% \bigskip
%
% 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
%
% \bigskip
%
% Everyone is permitted to copy and distribute verbatim copies
% of this license document, but changing it is not allowed.
% }
% \end{center}
%
% \begin{center}
% {\bf\large Preamble}
% \end{center}
%
%
% The licenses for most software are designed to take away your freedom to
% share and change it.  By contrast, the GNU General Public License is
% intended to guarantee your freedom to share and change free software---to
% make sure the software is free for all its users.  This General Public
% License applies to most of the Free Software Foundation's software and to
% any other program whose authors commit to using it.  (Some other Free
% Software Foundation software is covered by the GNU Library General Public
% License instead.)  You can apply it to your programs, too.
%
% When we speak of free software, we are referring to freedom, not price.
% Our General Public Licenses are designed to make sure that you have the
% freedom to distribute copies of free software (and charge for this service
% if you wish), that you receive source code or can get it if you want it,
% that you can change the software or use pieces of it in new free programs;
% and that you know you can do these things.
%
% To protect your rights, we need to make restrictions that forbid anyone to
% deny you these rights or to ask you to surrender the rights.  These
% restrictions translate to certain responsibilities for you if you
% distribute copies of the software, or if you modify it.
%
% For example, if you distribute copies of such a program, whether gratis or
% for a fee, you must give the recipients all the rights that you have.  You
% must make sure that they, too, receive or can get the source code.  And
% you must show them these terms so they know their rights.
%
% We protect your rights with two steps: (1) copyright the software, and (2)
% offer you this license which gives you legal permission to copy,
% distribute and/or modify the software.
%
% Also, for each author's protection and ours, we want to make certain that
% everyone understands that there is no warranty for this free software.  If
% the software is modified by someone else and passed on, we want its
% recipients to know that what they have is not the original, so that any
% problems introduced by others will not reflect on the original authors'
% reputations.
%
% Finally, any free program is threatened constantly by software patents.
% We wish to avoid the danger that redistributors of a free program will
% individually obtain patent licenses, in effect making the program
% proprietary.  To prevent this, we have made it clear that any patent must
% be licensed for everyone's free use or not licensed at all.
%
% The precise terms and conditions for copying, distribution and
% modification follow.
%
% \begin{center}
% {\Large \sc Terms and Conditions For Copying, Distribution and
%   Modification}
% \end{center}
%
% \begin{enumerate}
% \item
% This License applies to any program or other work which contains a notice
% placed by the copyright holder saying it may be distributed under the
% terms of this General Public License.  The ``Program'', below, refers to
% any such program or work, and a ``work based on the Program'' means either
% the Program or any derivative work under copyright law: that is to say, a
% work containing the Program or a portion of it, either verbatim or with
% modifications and/or translated into another language.  (Hereinafter,
% translation is included without limitation in the term ``modification''.)
% Each licensee is addressed as ``you''.
%
% Activities other than copying, distribution and modification are not
% covered by this License; they are outside its scope.  The act of
% running the Program is not restricted, and the output from the Program
% is covered only if its contents constitute a work based on the
% Program (independent of having been made by running the Program).
% Whether that is true depends on what the Program does.
%
% \item You may copy and distribute verbatim copies of the Program's source
%   code as you receive it, in any medium, provided that you conspicuously
%   and appropriately publish on each copy an appropriate copyright notice
%   and disclaimer of warranty; keep intact all the notices that refer to
%   this License and to the absence of any warranty; and give any other
%   recipients of the Program a copy of this License along with the Program.
%
% You may charge a fee for the physical act of transferring a copy, and you
% may at your option offer warranty protection in exchange for a fee.
%
% \item
% You may modify your copy or copies of the Program or any portion
% of it, thus forming a work based on the Program, and copy and
% distribute such modifications or work under the terms of Section 1
% above, provided that you also meet all of these conditions:
%
% \begin{enumerate}
%
% \item 
% You must cause the modified files to carry prominent notices stating that
% you changed the files and the date of any change.
%
% \item
% You must cause any work that you distribute or publish, that in
% whole or in part contains or is derived from the Program or any
% part thereof, to be licensed as a whole at no charge to all third
% parties under the terms of this License.
%
% \item
% If the modified program normally reads commands interactively
% when run, you must cause it, when started running for such
% interactive use in the most ordinary way, to print or display an
% announcement including an appropriate copyright notice and a
% notice that there is no warranty (or else, saying that you provide
% a warranty) and that users may redistribute the program under
% these conditions, and telling the user how to view a copy of this
% License.  (Exception: if the Program itself is interactive but
% does not normally print such an announcement, your work based on
% the Program is not required to print an announcement.)
%
% \end{enumerate}
%
%
% These requirements apply to the modified work as a whole.  If
% identifiable sections of that work are not derived from the Program,
% and can be reasonably considered independent and separate works in
% themselves, then this License, and its terms, do not apply to those
% sections when you distribute them as separate works.  But when you
% distribute the same sections as part of a whole which is a work based
% on the Program, the distribution of the whole must be on the terms of
% this License, whose permissions for other licensees extend to the
% entire whole, and thus to each and every part regardless of who wrote it.
%
% Thus, it is not the intent of this section to claim rights or contest
% your rights to work written entirely by you; rather, the intent is to
% exercise the right to control the distribution of derivative or
% collective works based on the Program.
%
% In addition, mere aggregation of another work not based on the Program
% with the Program (or with a work based on the Program) on a volume of
% a storage or distribution medium does not bring the other work under
% the scope of this License.
%
% \item
% You may copy and distribute the Program (or a work based on it,
% under Section 2) in object code or executable form under the terms of
% Sections 1 and 2 above provided that you also do one of the following:
%
% \begin{enumerate}
%
% \item
%
% Accompany it with the complete corresponding machine-readable
% source code, which must be distributed under the terms of Sections
% 1 and 2 above on a medium customarily used for software interchange; or,
%
% \item
%
% Accompany it with a written offer, valid for at least three
% years, to give any third party, for a charge no more than your
% cost of physically performing source distribution, a complete
% machine-readable copy of the corresponding source code, to be
% distributed under the terms of Sections 1 and 2 above on a medium
% customarily used for software interchange; or,
%
% \item
%
% Accompany it with the information you received as to the offer
% to distribute corresponding source code.  (This alternative is
% allowed only for noncommercial distribution and only if you
% received the program in object code or executable form with such
% an offer, in accord with Subsection b above.)
%
% \end{enumerate}
%
%
% The source code for a work means the preferred form of the work for
% making modifications to it.  For an executable work, complete source
% code means all the source code for all modules it contains, plus any
% associated interface definition files, plus the scripts used to
% control compilation and installation of the executable.  However, as a
% special exception, the source code distributed need not include
% anything that is normally distributed (in either source or binary
% form) with the major components (compiler, kernel, and so on) of the
% operating system on which the executable runs, unless that component
% itself accompanies the executable.
%
% If distribution of executable or object code is made by offering
% access to copy from a designated place, then offering equivalent
% access to copy the source code from the same place counts as
% distribution of the source code, even though third parties are not
% compelled to copy the source along with the object code.
%
% \item
% You may not copy, modify, sublicense, or distribute the Program
% except as expressly provided under this License.  Any attempt
% otherwise to copy, modify, sublicense or distribute the Program is
% void, and will automatically terminate your rights under this License.
% However, parties who have received copies, or rights, from you under
% this License will not have their licenses terminated so long as such
% parties remain in full compliance.
%
% \item
% You are not required to accept this License, since you have not
% signed it.  However, nothing else grants you permission to modify or
% distribute the Program or its derivative works.  These actions are
% prohibited by law if you do not accept this License.  Therefore, by
% modifying or distributing the Program (or any work based on the
% Program), you indicate your acceptance of this License to do so, and
% all its terms and conditions for copying, distributing or modifying
% the Program or works based on it.
%
% \item
% Each time you redistribute the Program (or any work based on the
% Program), the recipient automatically receives a license from the
% original licensor to copy, distribute or modify the Program subject to
% these terms and conditions.  You may not impose any further
% restrictions on the recipients' exercise of the rights granted herein.
% You are not responsible for enforcing compliance by third parties to
% this License.
%
% \item
% If, as a consequence of a court judgment or allegation of patent
% infringement or for any other reason (not limited to patent issues),
% conditions are imposed on you (whether by court order, agreement or
% otherwise) that contradict the conditions of this License, they do not
% excuse you from the conditions of this License.  If you cannot
% distribute so as to satisfy simultaneously your obligations under this
% License and any other pertinent obligations, then as a consequence you
% may not distribute the Program at all.  For example, if a patent
% license would not permit royalty-free redistribution of the Program by
% all those who receive copies directly or indirectly through you, then
% the only way you could satisfy both it and this License would be to
% refrain entirely from distribution of the Program.
%
% If any portion of this section is held invalid or unenforceable under
% any particular circumstance, the balance of the section is intended to
% apply and the section as a whole is intended to apply in other
% circumstances.
%
% It is not the purpose of this section to induce you to infringe any
% patents or other property right claims or to contest validity of any
% such claims; this section has the sole purpose of protecting the
% integrity of the free software distribution system, which is
% implemented by public license practices.  Many people have made
% generous contributions to the wide range of software distributed
% through that system in reliance on consistent application of that
% system; it is up to the author/donor to decide if he or she is willing
% to distribute software through any other system and a licensee cannot
% impose that choice.
%
% This section is intended to make thoroughly clear what is believed to
% be a consequence of the rest of this License.
%
% \item
% If the distribution and/or use of the Program is restricted in
% certain countries either by patents or by copyrighted interfaces, the
% original copyright holder who places the Program under this License
% may add an explicit geographical distribution limitation excluding
% those countries, so that distribution is permitted only in or among
% countries not thus excluded.  In such case, this License incorporates
% the limitation as if written in the body of this License.
%
% \item
% The Free Software Foundation may publish revised and/or new versions
% of the General Public License from time to time.  Such new versions will
% be similar in spirit to the present version, but may differ in detail to
% address new problems or concerns.
%
% Each version is given a distinguishing version number.  If the Program
% specifies a version number of this License which applies to it and ``any
% later version'', you have the option of following the terms and conditions
% either of that version or of any later version published by the Free
% Software Foundation.  If the Program does not specify a version number of
% this License, you may choose any version ever published by the Free Software
% Foundation.
%
% \item
% If you wish to incorporate parts of the Program into other free
% programs whose distribution conditions are different, write to the author
% to ask for permission.  For software which is copyrighted by the Free
% Software Foundation, write to the Free Software Foundation; we sometimes
% make exceptions for this.  Our decision will be guided by the two goals
% of preserving the free status of all derivatives of our free software and
% of promoting the sharing and reuse of software generally.
%
% \begin{center}
% {\Large\sc
% No Warranty
% }
% \end{center}
%
% \item
% {\sc Because the program is licensed free of charge, there is no warranty
% for the program, to the extent permitted by applicable law.  Except when
% otherwise stated in writing the copyright holders and/or other parties
% provide the program ``as is'' without warranty of any kind, either expressed
% or implied, including, but not limited to, the implied warranties of
% merchantability and fitness for a particular purpose.  The entire risk as
% to the quality and performance of the program is with you.  Should the
% program prove defective, you assume the cost of all necessary servicing,
% repair or correction.}
%
% \item
% {\sc In no event unless required by applicable law or agreed to in writing
% will any copyright holder, or any other party who may modify and/or
% redistribute the program as permitted above, be liable to you for damages,
% including any general, special, incidental or consequential damages arising
% out of the use or inability to use the program (including but not limited
% to loss of data or data being rendered inaccurate or losses sustained by
% you or third parties or a failure of the program to operate with any other
% programs), even if such holder or other party has been advised of the
% possibility of such damages.}
%
% \end{enumerate}
%
%
% \begin{center}
% {\Large\sc End of Terms and Conditions}
% \end{center}
%
%
% \pagebreak[2]
%
% \section*{Appendix: How to Apply These Terms to Your New Programs}
%
% If you develop a new program, and you want it to be of the greatest
% possible use to the public, the best way to achieve this is to make it
% free software which everyone can redistribute and change under these
% terms.
%
%   To do so, attach the following notices to the program.  It is safest to
%   attach them to the start of each source file to most effectively convey
%   the exclusion of warranty; and each file should have at least the
%   ``copyright'' line and a pointer to where the full notice is found.
%
% \begin{quote}
% one line to give the program's name and a brief idea of what it does. \\
% Copyright (C) yyyy  name of author \\
%
% 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 2 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, write to the Free Software
% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
% \end{quote}
%
% Also add information on how to contact you by electronic and paper mail.
%
% If the program is interactive, make it output a short notice like this
% when it starts in an interactive mode:
%
% \begin{quote}
% Gnomovision version 69, Copyright (C) yyyy  name of author \\
% Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. \\
% This is free software, and you are welcome to redistribute it
% under certain conditions; type `show c' for details.
% \end{quote}
%
%
% The hypothetical commands {\tt show w} and {\tt show c} should show the
% appropriate parts of the General Public License.  Of course, the commands
% you use may be called something other than {\tt show w} and {\tt show c};
% they could even be mouse-clicks or menu items---whatever suits your
% program.
%
% You should also get your employer (if you work as a programmer) or your
% school, if any, to sign a ``copyright disclaimer'' for the program, if
% necessary.  Here is a sample; alter the names:
%
% \begin{quote}
% Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\
% `Gnomovision' (which makes passes at compilers) written by James Hacker. \\
%
% signature of Ty Coon, 1 April 1989 \\
% Ty Coon, President of Vice
% \end{quote}
%
%
% This General Public License does not permit incorporating your program
% into proprietary programs.  If your program is a subroutine library, you
% may consider it more useful to permit linking proprietary applications
% with the library.  If this is what you want to do, use the GNU Library
% General Public License instead of this License.
%
% \end{multicols}
% \end{minipage}
% \end{lrbox}
%
% \begin{center}
% \scalebox{0.33}{\usebox{\gpl}}
% \end{center}
%
% \Finale
\endinput