1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21\writestatus{loading}{ConTeXt Language Macros Initialization}
22
23\registerctxluafile{langini}{autosuffix}
24\registerctxluafile{langdef}{}
25\registerctxluafile{langcnt}{}
26
27\unprotect
28
29\ifdefined\nonfrenchspacing\else \let\nonfrenchspacing\relax \fi
30\ifdefined\frenchspacing \else \let\frenchspacing \relax \fi
31
32
33
34
35
36
37
38
39
40
41
42\normallanguage\zerocount
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61\mutable\let\askedlanguage \empty
62\mutable\let\currentlanguage \empty
63\mutable\let\currentmainlanguage\empty
64
65
66
67
68
69
70
71\installcorenamespace{language}
72\installcorenamespace{languagelinked}
73
74\mutable\def\currentusedlanguage{\currentlanguage}
75
76\permanent\def\defaultlanguage#1
77 {\ifcsname\??language#1\s!default\endcsname
78 \expandafter\defaultlanguage\lastnamedcs
79 \else
80 #1
81 \fi}
82
83\permanent\def\languageparameter#1
84 {\ifcsname\??language\currentlanguage#1\endcsname
85 \lastnamedcs
86 \orelse\ifcsname\??language\currentlanguage\s!default\endcsname
87 \expandafter\specificlanguageparameter\lastnamedcs{#1}
88 \orelse\ifcsname\??language\s!default#1\endcsname
89 \lastnamedcs
90 \fi}
91
92\permanent\def\specificlanguageparameter#1#2
93 {\ifcsname\??language#1#2\endcsname
94 \lastnamedcs
95 \orelse\ifcsname\??language#1\s!default\endcsname
96 \expandafter\specificlanguageparameter\lastnamedcs{#2}
97 \orelse\ifcsname\??language\s!default#2\endcsname
98 \lastnamedcs
99 \fi}
100
101\permanent\def\mainlanguageparameter#1
102 {\ifcsname\??language\currentmainlanguage#1\endcsname
103 \lastnamedcs
104 \orelse\ifcsname\??language\currentmainlanguage\s!default\endcsname
105 \expandafter\specificlanguageparameter\lastnamedcs{#1}
106 \orelse\ifcsname\??language\s!default#1\endcsname
107 \lastnamedcs
108 \fi}
109
110\aliased\let\usedlanguageparameter\languageparameter
111
112\permanent\def\askedlanguageparameter#1
113 {\ifcsname\??language\currentusedlanguage#1\endcsname
114 \lastnamedcs
115 \orelse\ifcsname\??language\currentusedlanguage\s!default\endcsname
116 \expandafter\specificlanguageparameter\lastnamedcs{#1}
117 \orelse\ifcsname\??language\s!default#1\endcsname
118 \lastnamedcs
119 \fi}
120
121\permanent\protected\def\setusedlanguage#1
122 {\edef\currentusedlanguage{\reallanguagetag{#1}}
123 \ifempty\currentusedlanguage
124 \let\currentusedlanguage \currentlanguage
125 \enforced\let\usedlanguageparameter\languageparameter
126 \orelse\ifx\currentusedlanguage\v!global
127 \let\currentusedlanguage \currentmainlanguage
128 \enforced\let\usedlanguageparameter\mainlanguageparameter
129 \orelse\ifx\currentusedlanguage\v!local
130 \let\currentusedlanguage \currentlanguage
131 \enforced\let\usedlanguageparameter\languageparameter
132 \else
133 \enforced\let\usedlanguageparameter\askedlanguageparameter
134 \fi}
135
136\permanent\protected\def\setupcurrentlanguage[#1]
137 {\setcurrentlanguage\currentmainlanguage{#1}}
138
139\permanent\protected\def\setcurrentlanguage#1#2
140 {\edef\p_askedlanguage{#1}
141 \ifempty\p_askedlanguage \else
142 \ifempty\currentmainlanguage\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
143 \let\currentmainlanguage\p_askedlanguage
144 \setsystemmode{\systemmodeprefix\currentmainlanguage}
145 \fi
146 \edef\p_askedlanguage{#2}
147 \ifempty\p_askedlanguage \else
148 \ifempty\currentlanguage\else\resetsystemmode\currentlanguage\fi
149 \let\currentlanguage\p_askedlanguage
150 \setsystemmode\currentlanguage
151 \fi}
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\newtoks \everysetuplanguage
177
178\aliased\let\installedlanguages\clf_installedlanguages
179
180\permanent\protected\def\doifelselanguage#1
181 {\ifcsname\??language#1\c!state\endcsname
182 \expandafter\firstoftwoarguments
183 \else
184 \expandafter\secondoftwoarguments
185 \fi}
186
187\aliased\let\doiflanguageelse\doifelselanguage
188
189\permanent\def\reallanguagetag#1
190 {\ifcsname\??languagelinked#1\endcsname\lastnamedcs\else#1\fi}
191
192
193
194\mutable\let\currentsetuplanguage\empty
195
196\permanent\tolerant\protected\def\installlanguage[#1]#*[#2]
197 {\ifcondition\validassignment{#2}
198 \doifelselanguage{#1}
199 {\getparameters[\??language#1][#2]}
200 {\defcsname\??languagelinked#1\endcsname{#1}
201 \getparameters[\??language#1][\c!state=\v!start,#2]
202 \lang_basics_install_indeed{#1}{#1}}
203 \edef\currentsetuplanguage{#1}
204 \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}
205 \the\everysetuplanguage
206 \else
207 \defcsname\??languagelinked#1\endcsname{#2}
208 \clf_setlanguagesynonym{#1}{#2}
209 \lang_basics_install_indeed{#1}{#2}
210 \fi}
211
212\def\lang_basics_install_indeed#1#2
213 {\ifcstok{\specificlanguageparameter{#1}\c!command}\v!no\orelse\ifcsname#1\endcsname\else
214 \frozen\instance\protected\defcsname#1\endcsname{\lang_basics_set_current[#2]}
215 \fi}
216
217
218
219
220
221\permanent\protected\def\doifelsepatterns#1
222 {\begingroup
223 \lang_basics_set_current[#1]
224 \ifnum\normallanguage>\zerocount
225 \endgroup\expandafter\firstoftwoarguments
226 \else
227 \endgroup\expandafter\secondoftwoarguments
228 \fi}
229
230\aliased\let\doifpatternselse\doifelsepatterns
231
232
233
234
235
236
237
238
239
240
241\ifdefined\lang_basics_synchronize \else
242 \let\lang_basics_synchronize\relax
243\fi
244
245\installmacrostack\currentlanguage
246
247\permanent\tolerant\protected\def\setuplanguage[#1]#*[#2]
248 {\ifarguments
249
250 \or
251 \let\currentsetuplanguage\currentlanguage
252 \getparameters[\??language\currentsetuplanguage][#1]
253 \the\everysetuplanguage
254 \or
255 \push_macro_currentlanguage
256 \edef\currentsetuplanguage{\reallanguagetag{#1}}
257 \getparameters[\??language\currentsetuplanguage][#2]
258 \the\everysetuplanguage
259 \pop_macro_currentlanguage
260
261 \fi
262 \lang_basics_synchronize}
263
264\appendtoks
265 \clf_unloadlanguage{\currentsetuplanguage}
266\to \everysetuplanguage
267
268\setuplanguage
269 [\s!default]
270 [\s!patterns=,
271 \s!goodies=,
272 \s!lefthyphenmin=2,
273 \s!righthyphenmin=2,
274 \s!lefthyphenchar=1,
275 \s!righthyphenchar=45,
276
277 \c!lefthyphen=,
278 \c!righthyphen=,
279 \c!hyphen=,
280 \c!spacing=\v!packed,
281 \c!compoundhyphen=\compoundhyphen,
282 \c!rightcompoundhyphen=\compoundhyphen,
283 \c!leftcompoundhyphen=,
284 \c!midsentence=,
285 \c!leftsentence=,
286 \c!rightsentence=,
287 \c!leftsubsentence=,
288 \c!rightsubsentence=,
289 \c!leftquote=\upperleftsinglesixquote,
290 \c!rightquote=\upperrightsingleninequote,
291 \c!leftquotation=\upperleftdoublesixquote,
292 \c!rightquotation=\upperrightdoubleninequote,
293 \c!leftspeech=\languageparameter\c!leftquotation,
294 \c!middlespeech=,
295 \c!rightspeech=\languageparameter\c!rightquotation,
296 \c!limittext=\unknown,
297 \c!time={h,:,m},
298 \c!date={\v!year,\ ,\v!month,\ ,\v!day},
299 \c!text=Ag,
300 \c!font=]
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319\permanent\def\currentdatespecification{\languageparameter\c!date}
320\permanent\def\currenttimespecification{\languageparameter\c!time}
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\newtoks \everylanguage
357
358\installcorenamespace{languagenumbers}
359
360\appendtoks
361
362
363 \gletcsname\??languagenumbers\currentlanguage\endcsname\undefined
364\to \everysetuplanguage
365
366\def\lang_basics_synchronize_yes
367 {\zerocount
368 \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname
369 \clf_languagenumber
370 {\currentlanguage}
371 {\defaultlanguage\currentlanguage}
372 {\languageparameter\s!patterns}
373 {\languageparameter\s!goodies}
374 {\languageparameter\c!factor}
375 \relax
376 \normallanguage\csname\??languagenumbers\currentlanguage\endcsname}
377
378\let\lang_basics_synchronize_nop\zerocount
379
380\letvalue{\??languagenumbers}\lang_basics_synchronize_nop
381
382\appendtoks
383 \letvalue{\??languagenumbers}\lang_basics_synchronize_yes
384\to \everydump
385
386\def\lang_basics_synchronize
387 {\normallanguage\csname\??languagenumbers
388 \ifcsname\??languagenumbers\currentlanguage\endcsname
389 \currentlanguage
390 \fi
391 \endcsname
392 \relax
393 \the\everylanguage
394 \relax}
395
396\newcount\hyphenstate
397\newcount\hyphenminoffset
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417\exhyphenchar 45
418
419
420
421
422\permanent \integerdef \completehyphenationcode \numexpr
423 \normalhyphenationcode
424 \automatichyphenationcode
425 \explicithyphenationcode
426 \syllablehyphenationcode
427 \uppercasehyphenationcode
428 \compoundhyphenationcode
429
430
431 \automaticpenaltyhyphenationcode
432 \explicitpenaltyhyphenationcode
433 \permitgluehyphenationcode
434 \permitallhyphenationcode
435 \permitmathreplacehyphenationcode
436 \forcehandlerhyphenationcode
437 \feedbackcompoundhyphenationcode
438 \ignoreboundshyphenationcode
439 \collapsehyphenationcode
440\relax
441
442\permanent \integerdef \partialhyphenationcode \numexpr
443 \ignoreboundshyphenationcode
444
445 \collapsehyphenationcode
446\relax
447
448\hccode"002D "002D
449
450\permanent\protected\def\keephyphensequences
451 {\hccode"2010 \zerocount
452 \hccode"2013 \zerocount
453 \hccode"2014 \zerocount}
454
455\permanent\protected\def\collapsehyphensequences
456 {\hccode"2010 "2010\relax
457 \hccode"2013 "2013\relax
458 \hccode"2014 "2014\relax}
459
460\collapsehyphensequences
461
462
463
464\permanent\protected\def\dohyphens {\hyphenationmode\completehyphenationcode}
465\permanent\protected\def\nohyphens {\hyphenationmode\partialhyphenationcode}
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481\permanent\protected\def\dohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode \collapsehyphenationcode}
482\permanent\protected\def\nohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode\collapsehyphenationcode}
483
484\permanent\protected\def\doexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode \explicithyphenationcode}
485\permanent\protected\def\noexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode\explicithyphenationcode}
486
487\permanent\protected\def\usehyphensparameter#1
488 {\edef\p_hyphens{#1\c!hyphens}
489 \ifx\p_hyphens\v!no
490 \ifbitwiseand\hyphenationmode\collapsehyphenationcode
491 \nohyphens
492 \else
493 \nohyphens
494 \nohyphencollapsing
495 \fi
496 \fi}
497
498\dohyphens
499
500
501
502\permanent\protected\def\lesshyphens
503 {\advance\hyphenminoffset\plusone
504 \lang_basics_synchronize_min_max}
505
506\permanent\protected\def\morehyphens
507 {\ifcase\hyphenminoffset \else
508 \advance\hyphenminoffset\minusone
509 \fi
510 \lang_basics_synchronize_min_max}
511
512\protected\def\lang_basics_synchronize_min_max
513 {
514 \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin \hyphenminoffset\relax
515 \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin\hyphenminoffset\relax
516 \hyphenationmin\numexpr0\languageparameter\s!hyphenmin\relax
517
518 \prehyphenchar \languageparameter\s!righthyphenchar\relax
519 \posthyphenchar\languageparameter\s!lefthyphenchar \relax}
520
521\appendtoks
522 \lang_basics_synchronize_min_max
523\to \everylanguage
524
525\permanent\protected\def\unhyphenated
526 {\groupedcommand{\lefthyphenmin\maxdimen}\donothing}
527
528
529
530
531
532
533
534\mutable\let\currentlanguagesetups\empty
535
536\appendtoks
537 \edef\currentlanguagesetups{\languageparameter\c!setups}
538 \ifempty\currentlanguagesetups \else
539 \setups[\currentlanguagesetups]
540 \fi
541\to \everylanguage
542
543
544
545\appendtoks
546 \usebidiparameter\languageparameter
547\to \everylanguage
548
549
550
551\appendtoks
552 \edef\p_spacing{\languageparameter\c!spacing}
553 \ifx\p_spacing\v!broad
554 \nonfrenchspacing
555 \else
556 \frenchspacing
557 \fi
558\to \everylanguage
559
560
561
562
563
564
565
566
567\permanent\protected\def\setuplanguages
568 {\setuplanguage[\s!default]}
569
570
571
572
573
574\appendtoks
575 \edef\p_language_font{\languageparameter\c!font}
576 \ifempty\p_language_font
577 \orelse\ifx\p_language_font\v!auto
578 \doaddfeature\currentlanguage
579 \else
580 \doaddfeature\p_language_font
581 \fi
582\to \everylanguage
583
584
585
586\def\lang_basics_switch_asked
587 {\ifcsname\??languagelinked\askedlanguage\endcsname
588 \edef\askedlanguage{\lastnamedcs}
589 \ifx\currentlanguage\askedlanguage \else
590 \setcurrentlanguage\currentmainlanguage\askedlanguage
591 \lang_basics_synchronize
592 \fi
593 \fi}
594
595\permanent\protected\def\uselanguageparameter#1
596 {\edef\askedlanguage{#1\c!language}
597 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
598
599\permanent\protected\def\douselanguageparameter#1
600 {\edef\askedlanguage{#1}
601 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
602
603\protected\def\lang_basics_set_current[#1]
604 {\edef\askedlanguage{#1}
605 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
606
607\pushoverloadmode
608
609 \permanent\protected\def\language
610 {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage}
611
612 \aliased\let\setlanguage\language
613
614 \aliased\let\patterns\gobbleoneargument
615
616\popoverloadmode
617
618\newcount\mainlanguagenumber
619
620
621
622
623\permanent\protected\def\startlanguage
624 {\begingroup\language}
625
626\permanent\let\stoplanguage\endgroup
627
628\permanent\protected\def\mainlanguage[#1]
629 {\edef\askedlanguage{#1}
630 \ifempty\askedlanguage
631 \orelse\ifcsname\??languagelinked\askedlanguage\endcsname
632
633 \edef\askedlanguage{\lastnamedcs}
634 \ifx\currentlanguage\askedlanguage
635 \ifx\currentmainlanguage\askedlanguage \else
636 \setcurrentlanguage\askedlanguage\askedlanguage
637 \lang_basics_synchronize
638 \fi
639 \else
640 \setcurrentlanguage\askedlanguage\askedlanguage
641 \lang_basics_synchronize
642 \fi
643 \fi
644 \mainlanguagenumber\normallanguage}
645
646\appendtoks
647 \normallanguage\mainlanguagenumber
648\to \everybeforepagebody
649
650
651
652\permanent\def\splitsequence#1#2
653 {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}
654
655\permanent\def\splitsymbol#1
656 {\splitsequence{#1}{\languageparameter\c!limittext}}
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\permanent\protected\def\nopatterns{\normallanguage\minusone}
767
768
769
770
771\setupcurrentlanguage[\s!en]
772
773\permanent\protected\def\initializemainlanguage
774 {\mainlanguage[\currentlanguage]
775 \showmessage\m!languages9\currentlanguage}
776
777
778
779\permanent\let\stopexceptions\relax
780
781\tolerant\permanent\protected\def\startexceptions[#1]#:#2\stopexceptions
782 {\begingroup
783 \edef\askedlanguage{\reallanguagetag{#1}}
784 \ifempty\askedlanguage
785 \let\askedlanguage\currentlanguage
786 \fi
787 \clf_setlanguageexceptions{\askedlanguage}{#2}
788 \endgroup}
789
790\permanent\let\stoppatterns\relax
791
792\tolerant\permanent\protected\def\startpatterns[#1]#:#2\stoppatterns
793 {\begingroup
794 \edef\askedlanguage{\reallanguagetag{#1}}
795 \ifempty\askedlanguage
796 \let\askedlanguage\currentlanguage
797 \fi
798 \clf_setlanguagepatterns{\askedlanguage}{#2}
799 \endgroup}
800
801
802\pushoverloadmode
803
804\permanent\protected\def\hyphenation{\clf_setlanguageexceptions{\currentlanguage}}
805\permanent\protected\def\patterns {\clf_setlanguagepatterns {\currentlanguage}}
806
807\popoverloadmode
808
809
810
811\permanent\protected\def\traceddiscretionary#1#
812 {\dontleavehmode\lang_basics_traced_discretionary{#1}}
813
814\protected\def\lang_basics_traced_discretionary#1#2#3#4
815 {\normaldiscretionary#1{\darkred#2}{\darkgreen#3}{\darkblue#4}}
816
817\def\lang_basics_trace_discretionary_yes{\enforced\let\discretionary\traceddiscretionary}
818\def\lang_basics_trace_discretionary_nop{\enforced\let\discretionary\normaldiscretionary}
819
820
821\installtextracker
822 {discretionaries}
823 {\lang_basics_trace_discretionary_yes}
824 {\lang_basics_trace_discretionary_nop}
825
826\permanent\protected\def\samplediscretionary
827 {\traceddiscretionary
828 {pre\clf_currentprehyphenchar}
829 {\clf_currentposthyphenchar post}
830 {replace}}
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845\immutable\chardef\nokerningcode \numexpr\noleftkernglyphoptioncode \norightkernglyphoptioncode \relax
846\immutable\chardef\noligaturingcode\numexpr\noleftligatureglyphoptioncode\norightligatureglyphoptioncode\relax
847
848\permanent\protected\def\nokerning {\bitwiseflip\glyphoptions\nokerningcode}
849\permanent\protected\def\noligaturing{\bitwiseflip\glyphoptions\noligaturingcode}
850
851\permanent\protected\def\noleftkerning {\bitwiseflip\glyphoptions\noleftkernglyphoptioncode}
852\permanent\protected\def\noleftligaturing {\bitwiseflip\glyphoptions\noleftligatureglyphoptioncode}
853\permanent\protected\def\norightkerning {\bitwiseflip\glyphoptions\norightkernglyphoptioncode}
854\permanent\protected\def\norightligaturing{\bitwiseflip\glyphoptions\norightligatureglyphoptioncode}
855
856
857
858\permanent\protected\def\noitaliccorrection{\bitwiseflip\glyphoptions\noitaliccorrectionglyphoptioncode}
859
860
861
862
863
864
865
866\permanent\let\stoplanguageoptions\relax
867
868\permanent\protected\def\startlanguageoptions
869 {\begingroup
870 \catcode\othercatcode
871 \lang_startlanguageoptions}
872
873\tolerant\def\lang_startlanguageoptions[#1]#:#2\stoplanguageoptions
874 {\edef\askedlanguage{\reallanguagetag{#1}}
875 \ifempty\askedlanguage
876 \let\askedlanguage\currentlanguage
877 \fi
878 \clf_setlanguageoptions{\askedlanguage}{#2}
879 \endgroup}
880
881\protect \endinput
882 |