% \iffalse meta-comment
%
% 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 luaextra.dtx
% and the derived file luaextra.lua.
%
% Unpacking:
%    tex luatextra.dtx
%
% Documentation:
%    pdflatex luaextra.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: luaextra 2010/01/11 v0.92 Lua additional functions.}
\Msg{************************************************************************}

\keepsilent
\askforoverwritefalse

\let\MetaPrefix\relax

\preamble
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 luaextra.dtx
and the derived file luaextra.lua.

\endpreamble

% 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/luatextra}%
  \file{luaextra.lua}{\from{luaextra.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{*     luaextra.lua}
\Msg{*}
\Msg{* Happy TeXing!}
\Msg{*}
\Msg{************************************************************************}

\endbatchfile
%</install>
%<*ignore>
\fi
%</ignore>
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{luaextra.drv}
  [2010/01/11 v0.92 Lua additional functions.]
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\begin{document}
  \DocInput{luaextra.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{luaextra.drv}
%
% \title{The \textsf{luaextra} package}
% \date{2010/01/11 v0.92}
% \author{Elie Roux \\ \texttt{elie.roux@telecom-bretagne.eu}}
%
% \maketitle
%
% \begin{abstract}
% Additional lua functions taken from the libs of Con\TeX t. For an
% introduction on this package (among others), please refer to the document
% \texttt{luatex-reference.pdf}.
% \end{abstract}
%
% \section{Overview}
%
% Lua is a very minimal language, and it does not have a lot of built-in
% functions. Some functions will certainly be needed by a lot of packages.
% Instead of making each of them implement these functions, the aim of this
% file is to provide a minimal set of functions. All functions are taken from
% Con\TeX t libraries.
%
% There are some differences with the Con\TeX t funtions though, especially on
% names: for example the \texttt{file.*} funtions are renamed in
% \texttt{fpath.*}. It seems more logical as they deal with file paths, not
% files. Also the \texttt{file.is\_readable} and \texttt{file.is\_writable}
% are renamed \texttt{lfs.is\_readable} and \texttt{lfs.is\_writable}.
%
% If you use a function you think is missing in this file, please tell the
% maintainer.
%
% \texttt{Warning:} Even if the names will certainly remain the same, some
% implementations may differ, and some functions might appear or dissapear. As
% Lua\TeX\ is not stable, this file is not neither.
%
% All functions are described in this document, but the one of the functions
% you'll use most will certainly be \texttt{table.serialize} (also named
% \texttt{table.tostring}) that takes a table and returns an intented string
% describing the table. It describes the table so that Lua\TeX\ can read it
% again as a table. You can do a lot of things with this functions, like
% printing a table for debugging, or saving a table into a file. Functions are
% also converted into bytecode to be saved.
%
% \section{\texttt{luaextra.lua}}
%
% \iffalse
%<*lua>
% \fi
%
%    \begin{macrocode}
do
    local luaextra_module = {
        name          = "luaextra",
        version       = 0.92,
        date          = "2010/01/11",
        description   = "Lua additional functions.",
        author        = "Hans Hagen, PRAGMA-ADE, Hasselt NL & Elie Roux",
        copyright     = "PRAGMA ADE / ConTeXt Development Team",
        license       = "See ConTeXt's mreadme.pdf for the license",
    }
    if luatextra then
        luatextra.provides_module(luaextra_module)
    end
end
%    \end{macrocode}
% Initialize \textsf{Kpathsea} library, so that |require()| will use it to
% locate modules.
%    \begin{macrocode}

kpse.set_program_name("luatex")

%    \end{macrocode}
% Load the individual modules.
%    \begin{macrocode}

require("luaextra-string.lua")
require("luaextra-lpeg.lua")
require("luaextra-boolean.lua")
require("luaextra-number.lua")
require("luaextra-math.lua")
require("luaextra-table.lua")
require("luaextra-aux.lua")
require("luaextra-io.lua")
require("luaextra-os.lua")
require("luaextra-file.lua")
require("luaextra-md5.lua")
require("luaextra-dir.lua")
require("luaextra-unicode.lua")
require("luaextra-utils.lua")
require("luaextra-dimen.lua")
require("luaextra-url.lua")
require("luaextra-set.lua")
require("luaextra-dimen.lua")

%    \end{macrocode}
% Aliases for backward compatibility.
%    \begin{macrocode}

fpath           = file
fpath.split     = file.split_path
lfs.is_readable = file.is_readable
lfs.is_writable = file.is_writable

%    \end{macrocode}
% Functions no longer provided by Con\TeX t module.
%
%    \begin{macro}{string:stripspaces}
%
%    A function to strip the spaces at the beginning and at the end of a
%    string.
%
%    \begin{macrocode}

function string:stripspaces()
    return (self:gsub("^%s*(.-)%s*$", "%1"))
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{lpeg.space and lpeg.newline}
%
%    Two small helpers for \texttt{lpeg}, that will certainly be widely used:
%    spaces and newlines.
%
%    \begin{macrocode}

lpeg.space    = lpeg.S(" \t\f\v")
lpeg.newline  = lpeg.P("\r\n") + lpeg.P("\r") +lpeg.P("\n")

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{table.contains value}
%
%    A function returning true if the value \texttt{val} is in the table
%    \texttt{t}.
%
%    \begin{macrocode}

function table.contains_value(t, val)
    if t then
        for k, v in pairs(t) do
            if v==val then
                return true
            end
        end
    end
    return false
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{table.contains key}
%
%    A function returning true if the key \texttt{key} is in the table
%    \texttt{t}
%
%    \begin{macrocode}

function table.contains_key(t, key)
    if t then
        for k, v in pairs(t) do
            if k==key then
                return true
            end
        end
    end
    return false
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{table.value position}
%
%    A function returning the position of a value in a table. This will be
%    important to be able to remove a value.
%
%    \begin{macrocode}

function table.value_position(t, val)
    if t then
        local i=1
        for k, v in pairs(t) do
            if v==val then
                return i
            end
            i=i+1
        end
    end
    return 0
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{table.key position}
%
%    A function returning the position of a key in a table.
%
%    \begin{macrocode}

function table.key_position(t, key)
    if t then
        local i=1
        for k,v in pairs(t) do
            if k==key then
                return i
            end
            i = i+1
        end
    end
    return -1
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{table.remove key}
%
%    Removing a key from a table.
%
%    \begin{macrocode}

function table.remove_key(t, k)
    local p = table.key_position(t,k)
    if p ~= -1 then
        table.remove(t, table.key_position(t,k))
    end
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{fpath.normalize sep}
%
%    A function to change directory separators to canonical ones (\texttt{/}).
%
%    \begin{macrocode}

function fpath.normalize_sep(str)
    return str:gsub("\\", "/")
end

%    \end{macrocode}
%
%    \end{macro}
%    \begin{macro}{fpath.localize sep}
%
%    A function changing directory separators into local ones (\texttt{/} on
%    Unix, |\| on Windows).
%
%    \begin{macrocode}

function fpath.localize_sep(str)
    if os.type == 'windows' or os.type == 'msdos' then
        return str:gsub("/", "\\")
    else
        return str:gsub("\\", "/")
    end
end

%    \end{macrocode}
%
%    \end{macro}
%
% \iffalse
%</lua>
% \fi
% \Finale
\endinput
