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\lettonothing\askedlanguage
62\mutable\lettonothing\currentlanguage
63\mutable\lettonothing\currentmainlanguage
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 {\cdef\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\lettonothing\currentsetuplanguage
195
196\permanent\tolerant\protected\def\installlanguage[#1]#*[#S#2]
197 {\ifhastok={#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 \cdef\currentsetuplanguage{#1}
204 \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}
205 \expand\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!define}\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[#S#1]#*[#S#2]
248 {\ifarguments
249
250 \or
251 \let\currentsetuplanguage\currentlanguage
252 \getparameters[\??language\currentsetuplanguage][#1]
253 \expand\everysetuplanguage
254 \or
255 \push_macro_currentlanguage
256 \cdef\currentsetuplanguage{\reallanguagetag{#1}}
257 \getparameters[\??language\currentsetuplanguage][#2]
258 \expand\everysetuplanguage
259 \pop_macro_currentlanguage
260 \fi
261 \lang_basics_synchronize}
262
263\appendtoks
264 \clf_unloadlanguage{\currentsetuplanguage}
265\to \everysetuplanguage
266
267\setuplanguage
268 [\s!default]
269 [\s!patterns=,
270 \s!goodies=,
271 \s!lefthyphenmin=2,
272 \s!righthyphenmin=2,
273 \s!lefthyphenchar=1,
274 \s!righthyphenchar=45,
275 \s!explicitlefthyphenchar=\languageparameter\s!lefthyphenchar,
276 \s!explicitrighthyphenchar=\languageparameter\s!righthyphenchar,
277
278 \c!lefthyphen=,
279 \c!righthyphen=,
280 \c!hyphen=,
281 \c!spacing=\v!packed,
282 \c!compoundhyphen=\compoundhyphen,
283 \c!rightcompoundhyphen=\compoundhyphen,
284 \c!leftcompoundhyphen=,
285 \c!midsentence=,
286 \c!leftsentence=,
287 \c!rightsentence=,
288 \c!leftsubsentence=,
289 \c!rightsubsentence=,
290 \c!leftquote=\upperleftsinglesixquote,
291 \c!rightquote=\upperrightsingleninequote,
292 \c!leftquotation=\upperleftdoublesixquote,
293 \c!rightquotation=\upperrightdoubleninequote,
294 \c!leftspeech=\languageparameter\c!leftquotation,
295 \c!middlespeech=,
296 \c!rightspeech=\languageparameter\c!rightquotation,
297 \c!limittext=\unknown,
298 \c!time={h,:,m},
299 \c!date={\v!year,\ ,\v!month,\ ,\v!day},
300 \c!text=Ag,
301 \c!font=]
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320\permanent\def\currentdatespecification{\languageparameter\c!date}
321\permanent\def\currenttimespecification{\languageparameter\c!time}
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\newtoks \everylanguage
358
359\installcorenamespace{languagenumbers}
360
361\appendtoks
362
363
364 \gletcsname\??languagenumbers\currentlanguage\endcsname\undefined
365\to \everysetuplanguage
366
367\def\lang_basics_synchronize_yes
368 {\zerocount
369 \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname
370 \clf_languagenumber
371 {\currentlanguage}
372 {\defaultlanguage\currentlanguage}
373 {\languageparameter\s!patterns}
374 {\languageparameter\s!goodies}
375 {\languageparameter\c!factor}
376 \relax
377 \normallanguage\csname\??languagenumbers\currentlanguage\endcsname}
378
379\let\lang_basics_synchronize_nop\zerocount
380
381\letcsname\??languagenumbers\endcsname\lang_basics_synchronize_nop
382
383\appendtoks
384 \letcsname\??languagenumbers\endcsname\lang_basics_synchronize_yes
385\to \everydump
386
387\def\lang_basics_synchronize
388 {\normallanguage\csname\??languagenumbers
389 \ifcsname\??languagenumbers\currentlanguage\endcsname
390 \currentlanguage
391 \fi
392 \endcsname
393 \relax
394 \expand\everylanguage
395 \relax}
396
397\newinteger\hyphenstate
398\newinteger\hyphenminoffset
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418\exhyphenchar 45
419
420
421
422
423\permanent \integerdef \completehyphenationcode \numexpr
424 \normalhyphenationcode
425 \automatichyphenationcode
426 \explicithyphenationcode
427 \syllablehyphenationcode
428 \uppercasehyphenationcode
429 \compoundhyphenationcode
430
431
432 \automaticpenaltyhyphenationcode
433 \explicitpenaltyhyphenationcode
434 \permitgluehyphenationcode
435 \permitallhyphenationcode
436 \permitmathreplacehyphenationcode
437 \forcehandlerhyphenationcode
438 \feedbackcompoundhyphenationcode
439 \ignoreboundshyphenationcode
440 \collapsehyphenationcode
441 \replaceapostrophehyphenationcode
442\relax
443
444\permanent \integerdef \partialhyphenationcode \numexpr
445 \ignoreboundshyphenationcode
446
447 \collapsehyphenationcode
448 \replaceapostrophehyphenationcode
449\relax
450
451\hccode"002D "002D
452\hccode"00B7 "00B7
453
454\permanent\protected\def\keephyphensequences
455 {\hccode"2010 \zerocount
456 \hccode"2013 \zerocount
457 \hccode"2014 \zerocount}
458
459\permanent\protected\def\collapsehyphensequences
460 {\hccode"2010 "2010\relax
461 \hccode"2013 "2013\relax
462 \hccode"2014 "2014\relax}
463
464\collapsehyphensequences
465
466
467
468\permanent\protected\def\dohyphens{\hyphenationmode\completehyphenationcode}
469\permanent\protected\def\nohyphens{\hyphenationmode\partialhyphenationcode}
470
471\permanent\protected\def\doapostrophes{\hyphenationmode\bitwiseflip\hyphenationmode \replaceapostrophehyphenationcode}
472\permanent\protected\def\noapostrophes{\hyphenationmode\bitwiseflip\hyphenationmode\replaceapostrophehyphenationcode}
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488\permanent\protected\def\dohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode \collapsehyphenationcode}
489\permanent\protected\def\nohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode\collapsehyphenationcode}
490
491\permanent\protected\def\doexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode \explicithyphenationcode}
492\permanent\protected\def\noexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode\explicithyphenationcode}
493
494\permanent\protected\def\usehyphensparameter#1
495 {\ifcstok{#1\c!hyphens}\v!no
496 \ifbitwiseand\hyphenationmode\collapsehyphenationcode
497 \nohyphens
498 \else
499 \nohyphens
500 \nohyphencollapsing
501 \fi
502 \fi}
503
504\dohyphens
505
506
507
508\permanent\protected\def\lesshyphens
509 {\advanceby\hyphenminoffset\plusone
510 \lang_basics_synchronize_min_max}
511
512\permanent\protected\def\morehyphens
513 {\ifcase\hyphenminoffset \else
514 \advanceby\hyphenminoffset\minusone
515 \fi
516 \lang_basics_synchronize_min_max}
517
518
519
520
521
522
523
524
525
526
527\protected\def\lang_basics_synchronize_min_max
528 {
529
530
531
532 \lefthyphenmin {\ifchknumexpr\languageparameter\s!lefthyphenmin \or\lastchknumber\fi\hyphenminoffset}
533 \righthyphenmin{\ifchknumexpr\languageparameter\s!righthyphenmin\or\lastchknumber\fi\hyphenminoffset}
534 \hyphenationmin{\ifchknumexpr\languageparameter\s!hyphenmin \or\lastchknumber\else\zeropoint\fi}
535
536 \prehyphenchar \languageparameter\s!righthyphenchar\relax
537 \posthyphenchar \languageparameter\s!lefthyphenchar \relax
538 \preexhyphenchar \languageparameter\s!explicitrighthyphenchar\relax
539 \postexhyphenchar\languageparameter\s!explicitlefthyphenchar \relax}
540
541\appendtoks
542 \lang_basics_synchronize_min_max
543\to \everylanguage
544
545\appendtoks
546 \ifcstok{\languageparameter\s!apostrophe}\v!yes
547 \doapostrophes
548 \else
549 \noapostrophes
550 \fi
551\to \everylanguage
552
553\exapostrophechar\singlequoteasciicode
554
555\permanent\protected\def\unhyphenated
556 {\groupedcommand{\lefthyphenmin\maxdimen}\donothing}
557
558
559
560
561
562
563
564\mutable\lettonothing\currentlanguagesetups
565
566\appendtoks
567 \edef\currentlanguagesetups{\languageparameter\c!setups}
568 \ifempty\currentlanguagesetups \else
569 \setups[\currentlanguagesetups]
570 \fi
571\to \everylanguage
572
573
574
575\appendtoks
576 \usebidiparameter\languageparameter
577\to \everylanguage
578
579
580
581\appendtoks
582 \ifcstok{\languageparameter\c!spacing}\v!broad
583 \nonfrenchspacing
584 \else
585 \frenchspacing
586 \fi
587\to \everylanguage
588
589
590
591
592
593
594
595
596\permanent\protected\def\setuplanguages
597 {\setuplanguage[\s!default]}
598
599
600
601
602
603\appendtoks
604 \edef\p_language_font{\languageparameter\c!font}
605 \ifempty\p_language_font
606 \orelse\ifx\p_language_font\v!auto
607 \doaddfeature\currentlanguage
608 \else
609 \doaddfeature\p_language_font
610 \fi
611\to \everylanguage
612
613
614
615\def\lang_basics_switch_asked
616 {\ifcsname\??languagelinked\askedlanguage\endcsname
617 \edef\askedlanguage{\lastnamedcs}
618 \ifx\currentlanguage\askedlanguage \else
619 \setcurrentlanguage\currentmainlanguage\askedlanguage
620 \lang_basics_synchronize
621 \fi
622 \fi}
623
624\permanent\protected\def\uselanguageparameter#1
625 {\edef\askedlanguage{#1\c!language}
626 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
627
628\permanent\protected\def\douselanguageparameter#1
629 {\edef\askedlanguage{#1}
630 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
631
632\protected\def\lang_basics_set_current[#1]
633 {\edef\askedlanguage{#1}
634 \ifempty\askedlanguage\else\lang_basics_switch_asked\fi}
635
636\pushoverloadmode
637
638 \permanent\protected\def\language
639 {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage}
640
641 \aliased\let\setlanguage\language
642
643 \aliased\let\patterns\gobbleoneargument
644
645\popoverloadmode
646
647\newinteger\mainlanguagenumber
648
649
650
651
652\permanent\protected\def\startlanguage
653 {\begingroup\language}
654
655\permanent\let\stoplanguage\endgroup
656
657\permanent\protected\def\mainlanguage[#1]
658 {\edef\askedlanguage{#1}
659 \ifempty\askedlanguage
660 \orelse\ifcsname\??languagelinked\askedlanguage\endcsname
661
662 \edef\askedlanguage{\lastnamedcs}
663 \ifx\currentlanguage\askedlanguage
664 \ifx\currentmainlanguage\askedlanguage \else
665 \setcurrentlanguage\askedlanguage\askedlanguage
666 \lang_basics_synchronize
667 \fi
668 \else
669 \setcurrentlanguage\askedlanguage\askedlanguage
670 \lang_basics_synchronize
671 \fi
672 \fi
673 \mainlanguagenumber\normallanguage}
674
675\appendtoks
676 \normallanguage\mainlanguagenumber
677\to \everybeforepagebody
678
679
680
681\permanent\def\splitsequence#1#2
682 {\ifcstok{#1}\v!no
683 #2
684 \orelse\ifcstok{#1}\v!yes
685 \languageparameter\c!limittext
686 \else
687 #1
688 \fi}
689
690\permanent\def\splitsymbol#1
691 {\splitsequence{#1}{\languageparameter\c!limittext}}
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\permanent\protected\def\nopatterns{\normallanguage\minusone}
802
803
804
805
806\setupcurrentlanguage[\s!en]
807
808\permanent\protected\def\initializemainlanguage
809 {\mainlanguage[\currentlanguage]
810 \showmessage\m!languages9\currentlanguage}
811
812
813
814\permanent\let\stopexceptions\relax
815
816\tolerant\permanent\protected\def\startexceptions[#1]#:#2\stopexceptions
817 {\begingroup
818 \edef\askedlanguage{\reallanguagetag{#1}}
819 \ifempty\askedlanguage
820 \let\askedlanguage\currentlanguage
821 \fi
822 \clf_setlanguageexceptions{\askedlanguage}{#2}
823 \endgroup}
824
825\permanent\let\stoppatterns\relax
826
827\tolerant\permanent\protected\def\startpatterns[#1]#:#2\stoppatterns
828 {\begingroup
829 \edef\askedlanguage{\reallanguagetag{#1}}
830 \ifempty\askedlanguage
831 \let\askedlanguage\currentlanguage
832 \fi
833 \clf_setlanguagepatterns{\askedlanguage}{#2}
834 \endgroup}
835
836
837\pushoverloadmode
838
839\permanent\protected\def\hyphenation{\clf_setlanguageexceptions{\currentlanguage}}
840\permanent\protected\def\patterns {\clf_setlanguagepatterns {\currentlanguage}}
841
842\popoverloadmode
843
844
845
846\permanent\protected\def\traceddiscretionary#1#
847 {\dontleavehmode\lang_basics_traced_discretionary{#1}}
848
849\protected\def\lang_basics_traced_discretionary#1#2#3#4
850 {\normaldiscretionary#1{\darkred#2}{\darkgreen#3}{\darkblue#4}}
851
852\def\lang_basics_trace_discretionary_yes{\enforced\let\discretionary\traceddiscretionary}
853\def\lang_basics_trace_discretionary_nop{\enforced\let\discretionary\normaldiscretionary}
854
855
856\installtextracker
857 {discretionaries}
858 {\lang_basics_trace_discretionary_yes}
859 {\lang_basics_trace_discretionary_nop}
860
861\permanent\protected\def\samplediscretionary
862 {\traceddiscretionary
863 {pre\clf_currentprehyphenchar}
864 {\clf_currentposthyphenchar post}
865 {replace}}
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880\immutable\integerdef\nokerningcode \numexpr\noleftkernglyphoptioncode \norightkernglyphoptioncode \relax
881\immutable\integerdef\noligaturingcode\numexpr\noleftligatureglyphoptioncode \norightligatureglyphoptioncode \relax
882\immutable\integerdef\noitalicscode \numexpr\noitaliccorrectionglyphoptioncode\nozeroitaliccorrectionglyphoptioncode\relax
883
884\permanent\protected\def\nokerning {\bitwiseflip\glyphoptions\nokerningcode}
885\permanent\protected\def\noligaturing {\bitwiseflip\glyphoptions\noligaturingcode}
886\permanent\protected\def\noitaliccorrection{\bitwiseflip\glyphoptions\noitalicscode}
887
888\permanent\protected\def\noleftkerning {\bitwiseflip\glyphoptions\noleftkernglyphoptioncode}
889\permanent\protected\def\noleftligaturing {\bitwiseflip\glyphoptions\noleftligatureglyphoptioncode}
890\permanent\protected\def\norightkerning {\bitwiseflip\glyphoptions\norightkernglyphoptioncode}
891\permanent\protected\def\norightligaturing {\bitwiseflip\glyphoptions\norightligatureglyphoptioncode}
892
893\bitwiseflip\glyphoptions\nozeroitaliccorrectionglyphoptioncode
894
895
896
897
898
899
900
901\permanent\let\stoplanguageoptions\relax
902
903\permanent\protected\def\startlanguageoptions
904 {\begingroup
905 \catcode\othercatcode
906 \lang_startlanguageoptions}
907
908\tolerant\def\lang_startlanguageoptions[#1]#:#2\stoplanguageoptions
909 {\edef\askedlanguage{\reallanguagetag{#1}}
910 \ifempty\askedlanguage
911 \let\askedlanguage\currentlanguage
912 \fi
913 \clf_setlanguageoptions{\askedlanguage}{#2}
914 \endgroup}
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932\protect \endinput
933 |