% \iffalse meta-comment
%
% Copyright 2013 Javier Bezos and any individual authors
% listed elsewhere in this file.  All rights reserved.
% 
% This file is part of the Babel system.
% --------------------------------------
% 
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% This work has the LPPL maintenance status "maintained".
% 
% The Current Maintainer of this work is Javier Bezos.
% 
% The list of all files belonging to the Babel system is
% given in the file `manifest.bbl. See also `legal.bbl' for additional
% information.
% 
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
% \fi
% \CheckSum{795}
%
% \iffalse
%<*dtx>
\ProvidesFile{bbunicode.dtx}
       [2013/04/22 v1.0b Babel hooks for Unicode engines]
%</dtx>
%
%% File `bbunicode.dtx'
%% Babel package for LaTeX version 2e
%% Copyright (C) 2103
%%           by Javier Bezos
%
%<*filedriver>
\documentclass{ltxdoc}
\font\manual=logo10 % font used for the METAFONT logo, etc.
\newcommand*\MF{{\manual META}\-{\manual FONT}}
\newcommand*{\babel}{\textsf{babel}}
\newcommand*{\langvar}{$\langle \it lang \rangle$}
\newcommand*{\note}[1]{}
\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\Lopt}[1]{\textsf{#1}}
\newcommand*{\file}[1]{\texttt{#1}}
\begin{document}
 \DocInput{bbunicode.dtx}
\end{document}
%</filedriver>
% \fi
%
% \GetFileInfo{bbunicode.dtx}
% \StopEventually{}
%
%    \section{Hooks for XeTeX and LuaTeX}
%
%    \subsection{XeTeX}
%
%    Unfortunately, the current encoding cannot be retrieved and
%    therefore it is reset always to |utf8|, which seems a sensible default.
%    \begin{macrocode}
%<*xetex>
\def\BabelStringsDefault{unicode}
\let\xebbl@stop\relax
\AddBabelHook{xetex}{encodedcommands}{%
  \def\bbl@tempa{#1}%
  \ifx\bbl@tempa\@empty
    \XeTeXinputencoding"bytes"%
  \else
      \XeTeXinputencoding"#1"%
  \fi
  \def\xebbl@stop{\XeTeXinputencoding"utf8"}}
\AddBabelHook{xetex}{stopcommands}{%
  \xebbl@stop
  \let\xebbl@stop\relax}
%</xetex>
%    \end{macrocode}
%    \subsection{LuaTeX}
%
%    This part relies on the |lua| stripts in \pkg{luatex-hyphen} by Khaled
%    Hosny, \'{E}lie Roux, and Manuel
%    P\'{e}gouri\'{e}-Gonnard. \'{E}lie also improved the code below.
% \changes{bbunicode~1.0b}{2013/04/22}{luatex-hyphen is loaded
%    with require. Changes supplied by \'{E}lie Roux.}
%
%    \begin{macrocode}
%<*luatex>
\directlua{%
  require("luatex-hyphen")
  Babel = {}
  function Babel.bytes(line)
    return line:gsub("(.)",
      function (chr) return unicode.utf8.char(string.byte(chr)) end)
  end
  function Babel.begin_process_input()
    if luatexbase and luatexbase.add_to_callback then
      luatexbase.add_to_callback('process_input_buffer',Babel.bytes,'Babel.bytes')
    else
      Babel.callback = callback.find('process_input_buffer')
      callback.register('process_input_buffer',Babel.bytes)
    end
  end
  function Babel.end_process_input ()
    if luatexbase and luatexbase.remove_from_callback then
      luatexbase.remove_from_callback('process_input_buffer','Babel.bytes')
    else
      callback.register('process_input_buffer',Babel.callback)
    end
  end
}
\def\BabelStringsDefault{unicode}
\let\luabbl@stop\relax
\AddBabelHook{luatex}{encodedcommands}{%
  \def\bbl@tempa{utf8}\def\bbl@tempb{#1}%
  \ifx\bbl@tempa\bbl@tempb\else
    \directlua{Babel.begin_process_input()}%
    \def\luabbl@stop{%
      \directlua{Babel.end_process_input()}}%
  \fi}%
\AddBabelHook{luatex}{stopcommands}{%
  \luabbl@stop
  \let\luabbl@stop\relax}
\AddBabelHook{luatex}{patterns}{%
  \ifx\directlua\relax\else
    \ifcsname lu@texhyphen@loaded@\the\language\endcsname \else
      \global\@namedef{lu@texhyphen@loaded@\the\language}{}%
      \directlua{
        luatexhyphen.loadlanguage('\luatexluaescapestring{\string#1}',
          '\the\language')}%
    \fi
  \fi}
\AddBabelHook{luatex}{adddialect}{%
  \ifx\directlua\relax\else
    \directlua{
      luatexhyphen.adddialect('\luatexluaescapestring{\string#1}', 
        '\luatexluaescapestring{\string#2}')
    }%
  \fi}
\AddBabelHook{luatex}{everylanguage}{%
  \directlua{
    processnow = (tex.language == 0) or
      (luatexhyphen.lookupname('\luatexluaescapestring{\string#1}') == nil)}%
  \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
    \global\@namedef{lu@texhyphen@loaded@\the\language}{}%
  \fi}
\AddBabelHook{luatex}{loadpatterns}{%
  \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
    \input #1\relax
  \fi}
\AddBabelHook{luatex}{loadexceptions}{%
  \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
    \input #1\relax
  \fi
  \directlua{processnow = nil}}
%</luatex>
%    \end{macrocode}
%
\endinput
%%
%% \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         \~}
