summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/luatex/hyph-utf8/luatex-hyphen.dtx
blob: 36c0851ce1f2c7143485f5316be7da0b45ce08a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
% \iffalse meta-comment
%
% This is a modified version of the hyphen.cfg file from the babel system,
% intended for use with LuaTeX, but compatible with other engines.
% The present file IS NOT part of the babel system.
%
% The modifications are Copyright 2010 Khaled Hosny, Elie Roux, and Manuel
% Pegourie-Gonnard, under LPPL version 1.3 or later.
%
% Here is the licence statement of the original hyphen.cfg file:
%  |
%  | Copyright 1989-2008 Johannes L. Braams and any individual authors
%  | Listed elsewhere in this file.  All rights reserved.
%  |
%  | 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 Johannes Braams.
%  |
%  `---=(licence statement of original hyphen.cfg)=---
% 
%<*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

\preamble

This is a modified version of the hyphen.cfg file from the babel system,
intended for use with LuaTeX, but compatible with other engines.
The present file IS NOT part of the babel system.

The modifications are Copyright 2010 Khaled Hosny, Elie Roux, and Manuel
Pegourie-Gonnard, under LPPL version 1.3 or later.

Here is the licence statement of the original hyphen.cfg file:
 |
 | Copyright 1989-2008 Johannes L. Braams and any individual authors
 | Listed elsewhere in this file.  All rights reserved.
 |
 | 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 Johannes Braams.
 |
 `---=(licence statement of original hyphen.cfg)=---

\endpreamble

\generate{%
  \file{hyphen.cfg}{\from{luatex-hyphen.dtx}{hyphen}}%
}

\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) 2010 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}
  [2010/04/28 v1.4 Hyphenation file for LuaTeX]
\documentclass{ltxdoc}
\usepackage[ascii]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\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{2010/04/28 v1.4}
% \author{Khaled Hosny, \'Elie Roux, and Manuel P\'egouri\'e-Gonnard\\
% \texttt{khaledhosny@eglug.org} \\
% \texttt{elie.roux@telecom-bretagne.eu} \\
% \texttt{mpg@elzevir.fr}}
%
% \maketitle
%
% \begin{abstract}
% This is a modified version of the file \texttt{hyphen.cfg} distributed with
% the \textsf{babel} package, with a supporting Lua module, aimed at adapting
% \textsf{babel}'s 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.
%
% 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 utf8, 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}.}
%
% The modified version of \texttt{hyphen.cfg} provided here checks for the
% engine, and should continue to work with any engine without any modified
% behaviour. However, it is recommended to install it in such a way that the
% original \verb+hyphen.cfg+ from \textsf{babel} is found first by any engine
% other than Lua\TeX.
%
% \StopEventually{
% }
%
% \section{Implementation}
%
% \subsection{luatex-hyphen.lua}
%
%    \begin{macrocode}
%<*lua>
%    \end{macrocode}
%
%    Start a Lua module, importing only the necessary functions as locals.
%
%    \begin{macrocode}
local error, dofile, pairs, ipairs = error, dofile, pairs, ipairs
local io, texio, lang, kpse = io, texio, lang, kpse
module('luatexhyphen')
%    \end{macrocode}
%
%    Two functions for error and information reporting.
%
%    \begin{macrocode}
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)
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}
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
%    \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}
function loadlanguage(lname, id)
    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
%    \end{macrocode}
%
%    \begin{macrocode}
%</lua>
%    \end{macrocode}
%
% \subsection{hyphen.cfg}
%
%    \begin{macrocode}
%<*hyphen>
%    \end{macrocode}
%
%    Start with unmodified code from \textsf{babel}.
%
%    \begin{macrocode}
\ifx\ProvidesFile\@undefined
  \def\ProvidesFile#1[#2 #3 #4]{%
    \wlog{File: #1 #4 #3 <#2>}%
%    \end{macrocode}
%
%    Use a modified banner for Lua\TeX.
%
%    \begin{macrocode}
    \ifx\directlua\@undefined
      \toks8{Babel <#3> and hyphenation patterns for }%
    \else
      \toks8{LuaTeX adaptation of babel <#3>
        and hyphenation patterns for }%
    \fi
%    \end{macrocode}
%
%    \begin{macrocode}
    \let\ProvidesFile\@undefined
    }
  \def\ProvidesLanguage#1[#2 #3 #4]{%
    \wlog{Language: #1 #4 #3 <#2>}%
    }
\else
  \let\bbl@tempa\ProvidesFile
  \def\ProvidesFile#1[#2 #3 #4]{%
%    \end{macrocode}
%
%    Same here.
%
%    \begin{macrocode}
    \ifx\directlua\@undefined
      \toks8{Babel <#3> and hyphenation patterns for }%
    \else
      \toks8{LuaTeX adaptation of babel <#3>
        and hyphenation patterns for }%
    \fi
%    \end{macrocode}
%
%    \begin{macrocode}
    \bbl@tempa#1[#2 #3 #4]%
    \let\ProvidesFile\bbl@tempa}
  \def\ProvidesLanguage#1{%
    \begingroup
      \catcode`\ 10 %
      \@makeother\/%
      \@ifnextchar[%]
        {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}}
  \def\@provideslanguage#1[#2]{%
    \wlog{Language: #1 #2}%
    \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}%
    \endgroup}
\fi

%    \end{macrocode}
%
%    File identification is modified again.
%
%    \begin{macrocode}
\ProvidesFile{hyphen.cfg}
                [2010/04/26 v3.8l-luatex-1.4 %
      Language switching mechanism for LuaTeX, adapted from babel v3.8l]
%    \end{macrocode}
%
%    \begin{macrocode}
\ifx\AtBeginDocument\@undefined
  \input plain.def\relax
\fi
\ifx\language\@undefined
  \csname newcount\endcsname\language
\fi
\ifx\newlanguage\@undefined
  \csname newcount\endcsname\last@language
\else
  \countdef\last@language=19
\fi
\ifx\newlanguage\@undefined
  \def\addlanguage#1{%
    \global\advance\last@language \@ne
    \ifnum\last@language<\@cclvi
    \else
        \errmessage{No room for a new \string\language!}%
    \fi
    \global\chardef#1\last@language
    \wlog{\string#1 = \string\language\the\last@language}}
\else
  \def\addlanguage{\alloc@9\language\chardef\@cclvi}
\fi
\def\adddialect#1#2{%
    \global\chardef#1#2\relax
    \wlog{\string#1 = a dialect from \string\language#2}}
\def\iflanguage#1{%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
    \bbl@afterfi{\ifnum\csname l@#1\endcsname=\language
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
    \fi}%
  \fi}
\edef\selectlanguage{%
  \noexpand\protect
  \expandafter\noexpand\csname selectlanguage \endcsname
  }
\ifx\@undefined\protect\let\protect\relax\fi
\ifx\documentclass\@undefined
  \def\xstring{\string\string\string}
\else
  \let\xstring\string
\fi
\xdef\bbl@language@stack{}
\def\bbl@push@language{%
  \xdef\bbl@language@stack{\languagename+\bbl@language@stack}%
  }
\def\bbl@pop@lang#1+#2-#3{%
  \def\languagename{#1}\xdef#3{#2}%
  }
\def\bbl@pop@language{%
  \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack
  \expandafter\bbl@set@language\expandafter{\languagename}%
  }
\expandafter\def\csname selectlanguage \endcsname#1{%
  \bbl@push@language
  \aftergroup\bbl@pop@language
  \bbl@set@language{#1}}
\def\bbl@set@language#1{%
  \edef\languagename{%
    \ifnum\escapechar=\expandafter`\string#1\@empty
    \else \string#1\@empty\fi}%
  \select@language{\languagename}%
  \if@filesw
    \protected@write\@auxout{}{\string\select@language{\languagename}}%
    \addtocontents{toc}{\xstring\select@language{\languagename}}%
    \addtocontents{lof}{\xstring\select@language{\languagename}}%
    \addtocontents{lot}{\xstring\select@language{\languagename}}%
  \fi}
\def\select@language#1{%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
    \expandafter\ifx\csname date#1\endcsname\relax
      \@noopterr{#1}%
    \else
      \bbl@patterns{\languagename}%
      \originalTeX
      \expandafter\def\expandafter\originalTeX
          \expandafter{\csname noextras#1\endcsname
                       \let\originalTeX\@empty}%
      \languageshorthands{none}%
      \babel@beginsave
      \csname captions#1\endcsname
      \csname date#1\endcsname
      \csname extras#1\endcsname\relax
      \babel@savevariable\lefthyphenmin
      \babel@savevariable\righthyphenmin
      \expandafter\ifx\csname #1hyphenmins\endcsname\relax
        \set@hyphenmins\tw@\thr@@\relax
      \else
        \expandafter\expandafter\expandafter\set@hyphenmins
          \csname #1hyphenmins\endcsname\relax
      \fi
    \fi
  \fi}
\long\def\otherlanguage#1{%
  \csname selectlanguage \endcsname{#1}%
  \ignorespaces
  }
\long\def\endotherlanguage{%
  \originalTeX
  \global\@ignoretrue\ignorespaces
  }
\expandafter\def\csname otherlanguage*\endcsname#1{%
  \foreign@language{#1}%
  }
\expandafter\def\csname endotherlanguage*\endcsname{%
  \csname noextras\languagename\endcsname
  }
\def\foreignlanguage{\protect\csname foreignlanguage \endcsname}
\expandafter\def\csname foreignlanguage \endcsname#1#2{%
  \begingroup
    \originalTeX
    \foreign@language{#1}%
    #2%
    \csname noextras#1\endcsname
  \endgroup
  }
\def\foreign@language#1{%
  \def\languagename{#1}%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
    \bbl@patterns{\languagename}%
    \languageshorthands{none}%
    \csname extras#1\endcsname
    \expandafter\ifx\csname #1hyphenmins\endcsname\relax
      \set@hyphenmins\tw@\thr@@\relax
    \else
      \expandafter\expandafter\expandafter\set@hyphenmins
        \csname #1hyphenmins\endcsname\relax
    \fi
  \fi
  }
\def\bbl@patterns#1{%
  \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax
    \csname l@#1\endcsname
  \else
    \csname l@#1:\f@encoding\endcsname
  \fi\relax
%    \end{macrocode}
%
%    With Lua\TeX, load patterns and exceptions on the fly using functions
%    from the supporting Lua module, unless of course they are already loaded
%    for this language (identified by its number to avoid problems with
%    synonyms).
%
%    Also, since this code will be executed at runtime, be careful while
%    testing if we're using Lua\TeX.
%
%    \begin{macrocode}
  \ifx\directlua\@undefined\else
    \ifx\directlua\relax\else
      \ifcsname lu@texhyphen@loaded@\the\language\endcsname \else
        \global\@namedef{lu@texhyphen@loaded@\the\language}{}%
        \directlua{
          if not luatexhyphen then
              dofile(assert(kpse.find_file("luatex-hyphen.lua")))
          end
          luatexhyphen.loadlanguage("\luatexluaescapestring{#1}",
            \the\language)}%
      \fi
    \fi
  \fi
%    \end{macrocode}
%
%    \begin{macrocode}
}
\def\hyphenrules#1{%
  \expandafter\ifx\csname l@#1\endcsname\@undefined
    \@nolanerr{#1}%
  \else
    \bbl@patterns{#1}%
    \languageshorthands{none}%
       \expandafter\ifx\csname #1hyphenmins\endcsname\relax
         \set@hyphenmins\tw@\thr@@\relax
       \else
         \expandafter\expandafter\expandafter\set@hyphenmins
         \csname #1hyphenmins\endcsname\relax
       \fi
  \fi
  }
\def\endhyphenrules{}
\def\providehyphenmins#1#2{%
  \expandafter\ifx\csname #1hyphenmins\endcsname\relax
    \@namedef{#1hyphenmins}{#2}%
  \fi}
\def\set@hyphenmins#1#2{\lefthyphenmin#1\righthyphenmin#2}
\def\LdfInit{%
  \chardef\atcatcode=\catcode`\@
  \catcode`\@=11\relax
  \input babel.def\relax
  \catcode`\@=\atcatcode \let\atcatcode\relax
  \LdfInit}
\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi
\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi
\ifx\PackageError\@undefined
  \def\@nolanerr#1{%
    \errhelp{Your command will be ignored, type <return> to proceed}%
    \errmessage{You haven't defined the language #1\space yet}}
  \def\@nopatterns#1{%
    \message{No hyphenation patterns were loaded for}%
    \message{the language `#1'}%
    \message{I will use the patterns loaded for \string\language=0
          instead}}
  \def\@noopterr#1{%
    \errmessage{The option #1 was not specified in \string\usepackage}
    \errhelp{You may continue, but expect unexpected results}}
  \def\@activated#1{%
    \wlog{Package babel Info: Making #1 an active character}}
\else
  \newcommand*{\@nolanerr}[1]{%
    \PackageError{babel}%
                 {You haven't defined the language #1\space yet}%
        {Your command will be ignored, type <return> to proceed}}
  \newcommand*{\@nopatterns}[1]{%
    \PackageWarningNoLine{babel}%
        {No hyphenation patterns were loaded for\MessageBreak
          the language `#1'\MessageBreak
          I will use the patterns loaded for \string\language=0
          instead}}
  \newcommand*{\@noopterr}[1]{%
    \PackageError{babel}%
                 {You haven't loaded the option #1\space yet}%
             {You may proceed, but expect unexpected results}}
  \newcommand*{\@activated}[1]{%
    \PackageInfo{babel}{%
      Making #1 an active character}}
\fi
\def\process@line#1#2 #3/{%
  \ifx=#1
    \process@synonym#2 /
  \else
    \process@language#1#2 #3/%
  \fi
  }
\toks@{}
\def\process@synonym#1 /{%
  \ifnum\last@language=\m@ne
    \expandafter\chardef\csname l@#1\endcsname0\relax
    \wlog{\string\l@#1=\string\language0}
    \toks@\expandafter{\the\toks@
      \expandafter\let\csname #1hyphenmins\expandafter\endcsname
      \csname\languagename hyphenmins\endcsname}%
  \else
    \expandafter\chardef\csname l@#1\endcsname\last@language
    \wlog{\string\l@#1=\string\language\the\last@language}
    \expandafter\let\csname #1hyphenmins\expandafter\endcsname
    \csname\languagename hyphenmins\endcsname
  \fi
  }
\def\process@language#1 #2 #3/{%
  \expandafter\addlanguage\csname l@#1\endcsname
  \expandafter\language\csname l@#1\endcsname
  \def\languagename{#1}%
%    \end{macrocode}
%
%    In the Lua\TeX\ case, we have to decide wether to load the language now.
%    Remember our choice, since we'll need it two times more.
%
%    If we choose to load the language now, mark it as loaded. This is done
%    using \TeX\ macros in order to survive the format dumping-loading cycle,
%    which would not be as straigthforward using Lua objects.
%
%    \begin{macrocode}
  \ifx\directlua\@undefined
    \global\toks8\expandafter{\the\toks8#1, }%
  \else
    \directlua{
      if not luatexhyphen then
        dofile(assert(kpse.find_file("luatex-hyphen.lua")))
      end
      processnow = (tex.language == 0) or
        (luatexhyphen.lookupname("\luatexluaescapestring{#1}") == nil)}%
    \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
      \global\toks8\expandafter{\the\toks8#1, }%
      \global\@namedef{lu@texhyphen@loaded@\the\language}{}%
    \fi
  \fi
%    \end{macrocode}
%
%    \begin{macrocode}
  \begingroup
    \bbl@get@enc#1:\@@@
    \ifx\bbl@hyph@enc\@empty
    \else
      \fontencoding{\bbl@hyph@enc}\selectfont
    \fi
    \lefthyphenmin\m@ne
%    \end{macrocode}
%
%    Conditionally input the patterns file.
%
%    \begin{macrocode}
    \ifx\directlua\@undefined
      \input #2\relax
    \else
      \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
        \input #2\relax
      \fi
    \fi
%    \end{macrocode}
%
%    \begin{macrocode}
    \ifnum\lefthyphenmin=\m@ne
    \else
      \expandafter\xdef\csname #1hyphenmins\endcsname{%
        \the\lefthyphenmin\the\righthyphenmin}%
    \fi
  \endgroup
  \ifnum\the\language=\z@
    \expandafter\ifx\csname #1hyphenmins\endcsname\relax
      \set@hyphenmins\tw@\thr@@\relax
    \else
      \expandafter\expandafter\expandafter\set@hyphenmins
        \csname #1hyphenmins\endcsname
    \fi
    \the\toks@
  \fi
  \toks@{}%
  \def\bbl@tempa{#3}%
  \ifx\bbl@tempa\@empty
  \else
    \ifx\bbl@tempa\space
    \else
%    \end{macrocode}
%
%    Conditionnaly input the exceptions file.
%
%    \begin{macrocode}
      \ifx\directlua\@undefined
        \input #3\relax
      \else
        \ifnum0=\directlua{tex.sprint(processnow and "0" or "1")}\relax
          \input #3\relax
        \fi
        \directlua{processnow = nil}%
      \fi
%    \end{macrocode}
%
%    \begin{macrocode}
    \fi
  \fi
  }
\def\bbl@get@enc#1:#2\@@@{%
  \def\bbl@tempa{#1}%
  \def\bbl@tempb{#2}%
  \ifx\bbl@tempb\@empty
    \let\bbl@hyph@enc\@empty
  \else
    \bbl@get@enc#2\@@@
    \edef\bbl@hyph@enc{\bbl@tempa}%
  \fi}
\openin1 = language.dat
\ifeof1
  \message{I couldn't find the file language.dat,\space
           I will try the file hyphen.tex}
  \input hyphen.tex\relax
\else
  \last@language\m@ne
  \loop
    \endlinechar\m@ne
    \read1 to \bbl@line
    \endlinechar`\^^M
    \ifx\bbl@line\@empty
    \else
      \edef\bbl@line{\bbl@line\space/}%
      \expandafter\process@line\bbl@line
    \fi
    \iftrue \csname fi\endcsname
    \csname if\ifeof1 false\else true\fi\endcsname
  \repeat
  \language=0
\fi
\closein1
\let\process@language\@undefined
\let\process@synonym\@undefined
\let\process@line\@undefined
\let\bbl@tempa\@undefined
\let\bbl@tempb\@undefined
\let\bbl@eq@\@undefined
\let\bbl@line\@undefined
\let\bbl@get@enc\@undefined
\ifx\addto@hook\@undefined
\else
  \expandafter\addto@hook\expandafter\everyjob\expandafter{%
    \expandafter\typeout\expandafter{\the\toks8 loaded.}}
\fi
%    \end{macrocode}
%
%    \begin{macrocode}
%</hyphen>
%    \end{macrocode}
%
% \Finale
\endinput