% \iffalse meta-comment
% vim: textwidth=75
%<*internal>
\iffalse
%</internal>
%<*readme>
|
-------:| -----------------------------------------------------------------
ekdosis:| Typesetting TEI xml compliant critical editions
 Author:| Robert Alessi
 E-mail:| alessi@robertalessi.net
License:| Released under the GNU General Public License v3 or later
    See:| http://www.gnu.org/licenses/


Short description:
Some text about the package: probably the same as the abstract.
%</readme>
%<*luapre>
--[[
This file is part of the `ekdosis' package

ekdosis -- Typesetting TEI xml compliant critical editions
Copyright (C) 2016  Robert Alessi

Please send error reports and suggestions for improvements to Robert
Alessi <alessi@robertalessi.net>

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 3 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, see
<http://www.gnu.org/licenses/>.
--]]

%</luapre>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
-------:| -----------------------------------------------------------------
ekdosis:| Typesetting TEI xml compliant critical editions
 Author:| Robert Alessi
 E-mail:| alessi@robertalessi.net
License:| Released under the GNU General Public License v3 or later
    See:| http://www.gnu.org/licenses/

This file is part of the `ekdosis' package

ekdosis -- Typesetting TEI xml compliant critical editions
Copyright (C) 2016  Robert Alessi

Please send error reports and suggestions for improvements to Robert
Alessi <alessi@robertalessi.net>

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 3 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, see
<http://www.gnu.org/licenses/>.

This work consists of the file ekdosis.dtx and a Makefile.
Running "make" generates the derived files README, ekdosis.pdf and ekdosis.sty.
Running "make inst" installs the files in the user's TeX tree.
Running "make install" installs the files in the local TeX tree.
\endpreamble

\usedir{tex/lualatex/ekdosis}
\generate{
  \file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
\nopreamble\nopostamble
\usedir{tex/lualatex/ekdosis}
\generate{
  \file{\jobname.lua}{
  \from{\jobname.dtx}{luapre}
  \from{\jobname.dtx}{lua}
  }
}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/lualatex/ekdosis}
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\usedir{doc/lualatex/ekdosis}
\generate{
  \file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{ekdosis.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{ekdosis}
%<*package>
    [2016/08/03 v1.0 Typesetting TEI xml compliant critical editions]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[letterpaper,margin=25mm,left=50mm,nohead]{geometry}
\usepackage{hologo}
\usepackage{hyperxmp}
\usepackage{uri}
\usepackage[numbered]{hypdoc}
\hypersetup{unicode=true, colorlinks, allcolors=blue,
  linktocpage=true, pdfauthor={Robert Alessi}, pdftitle={The
    ekdosis package}, pdfcontactemail={alessi@robertalessi.net},
  pdfcontacturl={http://www.robertalessi.net/ekdosis},
  pdfcopyright={Copyright (C) 2018 Robert Alessi
    <alessi@robertalessi.net>. This document is licensed under the
    Creative Commons Attribution-ShareAlike 4.0 International
    License. To view a copy of this license, visit
    http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to
    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.},
  pdflicenseurl={https://creativecommons.org/licenses/by-sa/4.0/legalcode},
  pdfmetalang={en-US}, pdftype={Text}, pdfkeywords={Arabic language,
    arabtex, luatex}}
\usepackage[lot]{multitoc}
\usepackage{ekdosis}
\usepackage{fontspec}
\setmainfont{Old Standard}[RawFeature={+ss05;+ss06}]
\usepackage{newunicodechar}
\newunicodechar{ǧ}{ǧ} % Old Standard does not include ǧ/Ǧ
\newunicodechar{Ǧ}{Ǧ} %
\usepackage{arabluatex}
\usepackage{relsize}
\usepackage{units}
\usepackage{minted}
\newminted[ekdlua]{lua}{linenos, fontsize=\relsize{-0.5},
  xleftmargin=12pt,
  numberblanklines=false, numbersep=3pt, firstnumber=last}
\renewcommand{\theFancyVerbLine}{\rmfamily\smaller\arabic{FancyVerbLine}}
\usepackage[contents]{colordoc}
\newcommand{\package}[1]{\textsf{#1}\index{#1=#1 (package)}}
\usepackage{tikz}
\usepackage[breakable, skins, xparse, minted]{tcolorbox}
\usepackage{etoc}
\etocsettocdepth{paragraph}
\newcommand{\ekdtableofcontents}{%
  \begingroup
  \etocsetstyle{section}{}{}
  {\etocsavedsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}
  \etocsetstyle{subsection}{}{}
  {\etocsavedsubsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{subsubsection}{}{}
  {\etocsavedsubsubsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{paragraph}{}{\leftskip2cm\rightskip 2.2em \parfillskip
    0pt plus 1fil\relax \nobreak}
  {\noindent\etocname{} \etocpage{} }{\par}%
  \etocmulticolstyle[2]{\section*{Contents}}
  \pdfbookmark[1]{Contents}{toc}
  \tableofcontents
  \endgroup}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%\OnlyDescription
\begin{document}
  \DocInput{\jobname.dtx}
  \PrintChanges
  \PrintIndex
\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{\jobname.dtx}
% \DoNotIndex{\newcommand,\newenvironment}
%
% \title{\tcbox[colframe=black, enhanced, tikznode, drop lifted
% shadow, colback=white, boxrule=.25mm]%
% {ἔκδοσις\\
% Typesetting \texttt{TEI xml} compliant critical editions\\
% \fileversion\ --- \filedate}}
%  
% \author{Robert Alessi \\
% \href{mailto:alessi@robertalessi.net?Subject=ekdosis package}%
% {\texttt{alessi@robertalessi.net}}}
% 
% \date{}
%
% \maketitle
% \footnotesize
% \ekdtableofcontents
% \normalsize
%
%\changes{v1.00}{2016/08/03}{First public release}
%
% \begin{abstract}
% ==== Put abstract text here. ====
% \end{abstract}
%
% \section{Usage}
%
% ==== Put descriptive text here. ====
% 
% \DescribeMacro{\dummyMacro}
% This macro does nothing.\index{doing nothing|usage} It is merely an
% example.  If this were a real macro, you would put a paragraph here
% describing what the macro is supposed to do, what its mandatory and
% optional arguments are, and so forth.
% 
% \DescribeEnv{dummyEnv}
% This environment does nothing.  It is merely an example.
% If this were a real environment, you would put a paragraph here
% describing what the environment is supposed to do, what its
% mandatory and optional arguments are, and so forth.
%
% \section{Grid}
% \begin{keyfigure}[H]{c={Grid
%   typesetting},l={fig:grid-typesetting},t={Each square in the grid
%   has a side length of \unit[10]{pt}. Therefore, the distance
%   between the last line of the text and the first line of the
%   apparatus is here approximately \unit[25]{pt}.}}
%   \begin{tikzpicture}
%     \draw[lightgray,thin] (0.5,0.5) grid [step=10pt] (10,5); %
%     \path node [align=justify, text width=8cm] at (5.5,3) {%
%     I saw my friend Peter at the station yesterday. I saw my friend
%     Peter at the station yesterday. I saw my friend Peter at the
%     station yesterday. I saw my friend Peter at the station
%     yesterday.\par
%     \rule{3cm}{0.01cm}\par\footnotesize%
%     \textbf{1}~Peter A: John B \textbf{2}~Peter A: John B
%     \textbf{3}~Peter A: John B \textbf{4}~Peter A: John B}; \node at
%     (0,3) {\scriptsize $\approx$ \unit[25]{pt}}; \draw [->] (0,2.9) --
%     (0,2);
%   \end{tikzpicture}
% \end{keyfigure}
% 
% \section{Implementation}
%
% \iffalse
%<*package>
% \fi
% 
% \package{ekdosis} relies on Lua functions and tables. Read the
% |.lua| files that accompany \package{ekdosis} for more
% information.
%    \begin{macrocode}
\RequirePackage{ifluatex}
%    \end{macrocode}
% \package{ekdosis} requires \hologo{LuaLaTeX} of course. Issue a warning
% if the document is processed with another engine.
%    \begin{macrocode}
\ifluatex\else
 \PackageError{ekdosis}{lualatex needed}{%
  Package `ekdosis' needs LuaTeX.\MessageBreak
  So you should use `lualatex' to process your document.\MessageBreak
  See documentation of `ekdosis' for further information.}%
  \expandafter\expandafter\expandafter\csname endinput\endcsname
\fi
%    \end{macrocode}
% Packages that are required by \package{ekdosis}:
%    \begin{macrocode}
\RequirePackage{xkeyval}
\newif\if@parnotesroman
\newif\if@pkg@parnotes
\define@choicekey+{ekdosis.sty}{parnotes}{true, false, roman}[true]{%
  \edef\@pntrue{true}\edef\@pnfalse{false}\edef\@pnrm{roman}
  \edef\@tempa{#1}
  \ifx\@tempa\@pnfalse
  \else
  \ifx\@tempa\@pntrue\@pkg@parnotestrue
  \else
  \ifx\@tempa\@pnrm
    \@pkg@parnotestrue\@parnotesromantrue
  \fi\fi\fi
}{\PackageWarning{ekdosis}{parnotes: erroneous input (ignored)}}
\ExecuteOptionsX{}
\ProcessOptionsX\relax
\RequirePackage{luacode}
\RequirePackage{paracol}
\RequirePackage{keycommand}
\RequirePackage{xparse}
\RequirePackage{etoolbox}
\PassOptionsToPackage{addpageno}{lineno}
\RequirePackage{lineno}
\RequirePackage{keyfloat}
\RequirePackage{refcount}
\RequirePackage{xspace}
\RequirePackage[user,abspage]{zref}
\if@pkg@parnotes
  \RequirePackage{parnotes}
\fi
%    \end{macrocode}
% Here begins the real work: load |ekdosis.lua|:
%    \begin{macrocode}
\luadirect{dofile(kpse.find_file("ekdosis.lua"))}
%    \end{macrocode}
%    \begin{macrocode}
\AtEndDocument{\luadirect{ekdosis.closestream()}}
%    \end{macrocode}
%    \begin{macrocode}
\newbool{ekd@started}
\newbool{do@app}
\newbool{ekd@state}
\providebool{al@rlmode}
\newcounter{ekd@lab}
\def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext}
\def\add@@apparatus{%
  % \blfootnote{\apparatus}%
  \if@pkg@parnotes\parnotes\else\fi%
  \keyparbox[b!]{}{%
    \rule{5cm}{0.5pt}\\
    \if@pkg@parnotes%
    \if@parnotesroman%
    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi%
    \parnoteclear\else\fi%
    \footnotesize\apparatus%
    \if@pkg@parnotes\parnotes\parnotereset\else\fi%
  }%
}
\def\add@apparatus{%
  \notbool{ekd@started}{\add@@apparatus%
    \setbool{ekd@started}{true}}
  {\text@apparatus%
    \ifbool{do@app}{\add@@apparatus}{}}%
}
\NewDocumentCommand{\append@app}{+m}{%
  \ifbool{ekd@state}{%
    \luadirect{ekdosis.appin(
      \luastring{<\zref@extract{ekd:\theekd@lab}{abspage}>},
      "no")}%
    \luadirect{ekdosis.appin(\luastringN{#1}, "no")}%
    \luadirect{ekdosis.appin(
      \luastring{</\zref@extract{ekd:\theekd@lab}{abspage}>},
      "yes")}%
  }{}}
\NewDocumentCommand{\append@ln@app}{+m}%
  {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringN{#1}))}}
\NewDocumentCommand{\app}{+m}{%
  \stepcounter{ekd@lab}%
  \zlabel{ekd:\theekd@lab}%
  \luadirect{%
    ekdosis.storeabspg(\luastring{\zref@extract{ekd:\theekd@lab}{abspage}},
    "pg_ii")}%
  \ifbool{ekd@state}{\add@apparatus}{}%
  #1}
\newkeycommand+[\|]{\lem}[wit, alt, pre, post, prewit, postwit,
choice nolem={false,,true}][1]{%
  #1%
  |\ifnum|%
  \commandkey{nolem}>0%
  |\append@ln@app{}|%
  |\else|%
  |\ifbool{al@rlmode}|%
  {|\append@ln@app|{%
      \bgroup%
      |\setRL|%
      \ifcommandkey{alt}{%
        \ifcommandkey{post}{ \commandkey{post} }{}%
        \commandkey{alt}%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
      }{%
        \ifcommandkey{post}{ \commandkey{post} }{}%
        #1%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
      }%
      \egroup{}%
      \ifcommandkey{prewit}{ \commandkey{prewit} }{}%
      \ifcommandkey{wit}{ \commandkey{wit}}{}%
      \ifcommandkey{postwit}{ \commandkey{postwit}}{}:%
    }}%
  {|\append@ln@app|{%
      \ifcommandkey{alt}{%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
        \commandkey{alt}%
        \ifcommandkey{post}{ \commandkey{post} }{}%
      }{%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
        #1%
        \ifcommandkey{post}{ \commandkey{post} }{}%
      }%
      \ifcommandkey{prewit}{ \commandkey{prewit} }{}%
      \ifcommandkey{wit}{ \commandkey{wit}}{}%
      \ifcommandkey{postwit}{ \commandkey{postwit}}{}:%
    }}%
|\fi|}
\newkeycommand+[\|]{\rdg}[wit, alt, pre, post, prewit, postwit][1]{%
  |\ifbool{al@rlmode}|%
  {|\append@app|{%
      \bgroup%
      |\setRL|%
      \ifcommandkey{alt}{%
        \ifcommandkey{post}{ \commandkey{post} }{}%
        \commandkey{alt}%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
      }{%
        \ifcommandkey{post}{ \commandkey{post} }{}%
        #1%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
      }%
      \egroup{}%
      \ifcommandkey{prewit}{ \commandkey{prewit} }{}%
      \ifcommandkey{wit}{ \commandkey{wit}}{}%
      \ifcommandkey{postwit}{ \commandkey{postwit}}{}%
    }}%
  {|\append@app|{%
      \ifcommandkey{alt}{%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
        \commandkey{alt}%
        \ifcommandkey{post}{ \commandkey{post} }{}%
      }{%
        \ifcommandkey{pre}{ \commandkey{pre} }{}%
        #1%
        \ifcommandkey{post}{ \commandkey{post} }{}%
      }%
      \ifcommandkey{prewit}{ \commandkey{prewit} }{}%
      \ifcommandkey{wit}{ \commandkey{wit}}{}%
      \ifcommandkey{postwit}{ \commandkey{postwit}}{}%
    }}%
}
\NewDocumentCommand{\note}{s +m}{%
  \IfBooleanTF{#1}{%
    \if@pkg@parnotes\append@app{\parnote{#2}}%
    \else\append@app{\footnote{#2}}\fi}{\append@app{#2}}%
}
\NewDocumentCommand{\apparatus}{}{\luadirect{tex.sprint(ekdosis.appout())}}
\NewDocumentCommand{\text@apparatus}{}{%
  \luadirect{tex.sprint(ekdosis.testapparatus())}}
\NewDocumentCommand{\EkdosisStart}{}{%
  \stepcounter{ekd@lab}%
  \zlabel{ekd:\theekd@lab}%
  \luadirect{%
    ekdosis.storeabspg(\luastring{\zref@extract{ekd:\theekd@lab}{abspage}},
    "pg_i")}%
}
\NewDocumentCommand{\EkdosisOn}{}{\setbool{ekd@state}{true}}
\NewDocumentCommand{\EkdosisOff}{}{%
  \setbool{ekd@state}{false}%
}
\newenvironment{ekdosis}{%
  \begin{linenumbers}
    \EkdosisStart%
    \EkdosisOn}{%
    \EkdosisOff
  \end{linenumbers}}
%    \end{macrocode}
% \iffalse
%</package>
% \fi
% \StopEventually{}
% \Finale
% \iffalse `'
%<*lua>
% \fi
% \begin{ekdlua}

ekdosis = {}

function ekdosis.closestream()
   os.remove(tex.jobname..".ekd")
   os.rename(tex.jobname.."_tmp.ekd", tex.jobname..".ekd")
   return true
end

local pg_i = 0
local pg_ii = 0
local cur_abs_pg = 0

function ekdosis.update_abspg(n)
   cur_abs_pg = n
   return true
end

function ekdosis.get_abs_page()
   return cur_abs_pg
end

function ekdosis.storeabspg(n, pg)
   if pg == "pg_i" then
      pg_i = n
   elseif pg == "pg_ii" then
      pg_ii = n
   end
   cur_abs_pg = n
   return true
end

ekdosis.getabspg = function(pg) --not used
   if pg == "pg_i" then
      return pg_i
   elseif pg == "pg_ii" then
      return pg_ii
   end
end

local function isintable(table, value)
   for _, v in pairs(table) do
      if v == value then return true end
   end
   return false
end

function ekdosis.appin(str, nl)
   local f = io.open(tex.jobname.."_tmp.ekd", "a+")
   if nl == "yes" then
      f:write(str, "\n")
   else
      f:write(str)
   end
   f:close()
   return true
end

function ekdosis.appout()
   local file = io.open(tex.jobname..".ekd", "r")
   if file ~= nil then io.close(file)
      f = assert(io.open(tex.jobname..".ekd", "r"))
      t = f:read("*a")
      local output = {}
      for i in string.gmatch(t,
			     "<"..cur_abs_pg..">.-</"..cur_abs_pg..">")
      do
	 table.insert(output, i)
      end
      f:close()
      str = table.concat(output, "\n")
      str = string.gsub(str, "</"..cur_abs_pg..">", " ")
      str = string.gsub(str, "<"..cur_abs_pg..">", "")
      return str
   else end
end

function ekdosis.testapparatus()
   if pg_ii == pg_i then
      return "\\boolfalse{do@app}"
   elseif pg_ii > pg_i then
      pg_i = pg_ii
      return "\\booltrue{do@app}"
   else
      return "\\boolfalse{do@app}"
   end
end

md5items = {}
local salt = 0

function ekdosis.mdvappend(str)
   i = md5.sumhexa(str)
   if not isintable(md5items, i) then
      table.insert(md5items, i)
   else
      i = i..salt
      table.insert(md5items, i)
      salt = salt + 1
   end
   return "\\linelabel{"..i.."}"
   ..
   "\\csname append@app\\endcsname{\\textbf{\\getrefnumber{"..i.."}} "..str.."}"
end

% \end{ekdlua}
% \iffalse
%</lua>
% \fi
\endinput
