• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

sile-typesetter / sile / 6915845768

18 Nov 2023 07:23PM UTC coverage: 63.161% (-5.6%) from 68.751%
6915845768

push

github

web-flow
Merge 0f5c09a66 into f64e235fa

9802 of 15519 relevant lines covered (63.16%)

2045.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/languages/tr.lua
1
-- Quotes may be part of a word in Turkish
2
SILE.nodeMakers.tr = pl.class(SILE.nodeMakers.unicode)
×
3
SILE.nodeMakers.tr.isWordType = { cm = true, qu = true }
×
4

5
SILE.hyphenator.languages["tr"] = {}
×
6
SILE.hyphenator.languages["tr"].patterns =
×
7
   {
8
"2a1",
9
"2â1",
10
"2e1",
11
"2ı1",
12
"2i1",
13
"2î1",
14
"2o1",
15
"2ö1",
16
"2u1",
17
"2ü1",
18
"2û1",
19
-- allow hyphen either side of consonants
20
"1b1",
21
"1c1",
22
"1ç1",
23
"1d1",
24
"1f1",
25
"1g1",
26
"1ğ1",
27
"1h1",
28
"1j1",
29
"1k1",
30
"1l1",
31
"1m1",
32
"1n1",
33
"1p1",
34
"1r1",
35
"1s1",
36
"1ş1",
37
"1t1",
38
"1v1",
39
"1y1",
40
"1z1",
41
-- prevent a-cak/e-cek at end of word
42
"2a2cak.",
43
"2e2cek.",
44
-- prohibit hyphen before pair of consonants
45
-- many pairs generated here are impossible anyway
46
"2bb",
47
"2bc",
48
"2bç",
49
"2bd",
50
"2bf",
51
"2bg",
52
"2bğ",
53
"2bh",
54
"2bj",
55
"2bk",
56
"2bl",
57
"2bm",
58
"2bn",
59
"2bp",
60
"2br",
61
"2bs",
62
"2bş",
63
"2bt",
64
"2bv",
65
"2by",
66
"2bz",
67
"2cb",
68
"2cc",
69
"2cç",
70
"2cd",
71
"2cf",
72
"2cg",
73
"2cğ",
74
"2ch",
75
"2cj",
76
"2ck",
77
"2cl",
78
"2cm",
79
"2cn",
80
"2cp",
81
"2cr",
82
"2cs",
83
"2cş",
84
"2ct",
85
"2cv",
86
"2cy",
87
"2cz",
88
"2çb",
89
"2çc",
90
"2çç",
91
"2çd",
92
"2çf",
93
"2çg",
94
"2çğ",
95
"2çh",
96
"2çj",
97
"2çk",
98
"2çl",
99
"2çm",
100
"2çn",
101
"2çp",
102
"2çr",
103
"2çs",
104
"2çş",
105
"2çt",
106
"2çv",
107
"2çy",
108
"2çz",
109
"2db",
110
"2dc",
111
"2dç",
112
"2dd",
113
"2df",
114
"2dg",
115
"2dğ",
116
"2dh",
117
"2dj",
118
"2dk",
119
"2dl",
120
"2dm",
121
"2dn",
122
"2dp",
123
"2dr",
124
"2ds",
125
"2dş",
126
"2dt",
127
"2dv",
128
"2dy",
129
"2dz",
130
"2fb",
131
"2fc",
132
"2fç",
133
"2fd",
134
"2ff",
135
"2fg",
136
"2fğ",
137
"2fh",
138
"2fj",
139
"2fk",
140
"2fl",
141
"2fm",
142
"2fn",
143
"2fp",
144
"2fr",
145
"2fs",
146
"2fş",
147
"2ft",
148
"2fv",
149
"2fy",
150
"2fz",
151
"2gb",
152
"2gc",
153
"2gç",
154
"2gd",
155
"2gf",
156
"2gg",
157
"2gğ",
158
"2gh",
159
"2gj",
160
"2gk",
161
"2gl",
162
"2gm",
163
"2gn",
164
"2gp",
165
"2gr",
166
"2gs",
167
"2gş",
168
"2gt",
169
"2gv",
170
"2gy",
171
"2gz",
172
"2ğb",
173
"2ğc",
174
"2ğç",
175
"2ğd",
176
"2ğf",
177
"2ğg",
178
"2ğğ",
179
"2ğh",
180
"2ğj",
181
"2ğk",
182
"2ğl",
183
"2ğm",
184
"2ğn",
185
"2ğp",
186
"2ğr",
187
"2ğs",
188
"2ğş",
189
"2ğt",
190
"2ğv",
191
"2ğy",
192
"2ğz",
193
"2hb",
194
"2hc",
195
"2hç",
196
"2hd",
197
"2hf",
198
"2hg",
199
"2hğ",
200
"2hh",
201
"2hj",
202
"2hk",
203
"2hl",
204
"2hm",
205
"2hn",
206
"2hp",
207
"2hr",
208
"2hs",
209
"2hş",
210
"2ht",
211
"2hv",
212
"2hy",
213
"2hz",
214
"2jb",
215
"2jc",
216
"2jç",
217
"2jd",
218
"2jf",
219
"2jg",
220
"2jğ",
221
"2jh",
222
"2jj",
223
"2jk",
224
"2jl",
225
"2jm",
226
"2jn",
227
"2jp",
228
"2jr",
229
"2js",
230
"2jş",
231
"2jt",
232
"2jv",
233
"2jy",
234
"2jz",
235
"2kb",
236
"2kc",
237
"2kç",
238
"2kd",
239
"2kf",
240
"2kg",
241
"2kğ",
242
"2kh",
243
"2kj",
244
"2kk",
245
"2kl",
246
"2km",
247
"2kn",
248
"2kp",
249
"2kr",
250
"2ks",
251
"2kş",
252
"2kt",
253
"2kv",
254
"2ky",
255
"2kz",
256
"2lb",
257
"2lc",
258
"2lç",
259
"2ld",
260
"2lf",
261
"2lg",
262
"2lğ",
263
"2lh",
264
"2lj",
265
"2lk",
266
"2ll",
267
"2lm",
268
"2ln",
269
"2lp",
270
"2lr",
271
"2ls",
272
"2lş",
273
"2lt",
274
"2lv",
275
"2ly",
276
"2lz",
277
"2mb",
278
"2mc",
279
"2mç",
280
"2md",
281
"2mf",
282
"2mg",
283
"2mğ",
284
"2mh",
285
"2mj",
286
"2mk",
287
"2ml",
288
"2mm",
289
"2mn",
290
"2mp",
291
"2mr",
292
"2ms",
293
"2mş",
294
"2mt",
295
"2mv",
296
"2my",
297
"2mz",
298
"2nb",
299
"2nc",
300
"2nç",
301
"2nd",
302
"2nf",
303
"2ng",
304
"2nğ",
305
"2nh",
306
"2nj",
307
"2nk",
308
"2nl",
309
"2nm",
310
"2nn",
311
"2np",
312
"2nr",
313
"2ns",
314
"2nş",
315
"2nt",
316
"2nv",
317
"2ny",
318
"2nz",
319
"2pb",
320
"2pc",
321
"2pç",
322
"2pd",
323
"2pf",
324
"2pg",
325
"2pğ",
326
"2ph",
327
"2pj",
328
"2pk",
329
"2pl",
330
"2pm",
331
"2pn",
332
"2pp",
333
"2pr",
334
"2ps",
335
"2pş",
336
"2pt",
337
"2pv",
338
"2py",
339
"2pz",
340
"2rb",
341
"2rc",
342
"2rç",
343
"2rd",
344
"2rf",
345
"2rg",
346
"2rğ",
347
"2rh",
348
"2rj",
349
"2rk",
350
"2rl",
351
"2rm",
352
"2rn",
353
"2rp",
354
"2rr",
355
"2rs",
356
"2rş",
357
"2rt",
358
"2rv",
359
"2ry",
360
"2rz",
361
"2sb",
362
"2sc",
363
"2sç",
364
"2sd",
365
"2sf",
366
"2sg",
367
"2sğ",
368
"2sh",
369
"2sj",
370
"2sk",
371
"2sl",
372
"2sm",
373
"2sn",
374
"2sp",
375
"2sr",
376
"2ss",
377
"2sş",
378
"2st",
379
"2sv",
380
"2sy",
381
"2sz",
382
"2şb",
383
"2şc",
384
"2şç",
385
"2şd",
386
"2şf",
387
"2şg",
388
"2şğ",
389
"2şh",
390
"2şj",
391
"2şk",
392
"2şl",
393
"2şm",
394
"2şn",
395
"2şp",
396
"2şr",
397
"2şs",
398
"2şş",
399
"2şt",
400
"2şv",
401
"2şy",
402
"2şz",
403
"2tb",
404
"2tc",
405
"2tç",
406
"2td",
407
"2tf",
408
"2tg",
409
"2tğ",
410
"2th",
411
"2tj",
412
"2tk",
413
"2tl",
414
"2tm",
415
"2tn",
416
"2tp",
417
"2tr",
418
"2ts",
419
"2tş",
420
"2tt",
421
"2tv",
422
"2ty",
423
"2tz",
424
"2vb",
425
"2vc",
426
"2vç",
427
"2vd",
428
"2vf",
429
"2vg",
430
"2vğ",
431
"2vh",
432
"2vj",
433
"2vk",
434
"2vl",
435
"2vm",
436
"2vn",
437
"2vp",
438
"2vr",
439
"2vs",
440
"2vş",
441
"2vt",
442
"2vv",
443
"2vy",
444
"2vz",
445
"2yb",
446
"2yc",
447
"2yç",
448
"2yd",
449
"2yf",
450
"2yg",
451
"2yğ",
452
"2yh",
453
"2yj",
454
"2yk",
455
"2yl",
456
"2ym",
457
"2yn",
458
"2yp",
459
"2yr",
460
"2ys",
461
"2yş",
462
"2yt",
463
"2yv",
464
"2yy",
465
"2yz",
466
"2zb",
467
"2zc",
468
"2zç",
469
"2zd",
470
"2zf",
471
"2zg",
472
"2zğ",
473
"2zh",
474
"2zj",
475
"2zk",
476
"2zl",
477
"2zm",
478
"2zn",
479
"2zp",
480
"2zr",
481
"2zs",
482
"2zş",
483
"2zt",
484
"2zv",
485
"2zy",
486
"2zz",
487
-- allow hyphen between vowels, but not after second vowel of pair
488
-- several phonetically impossible pairs here
489
"a3a2",
490
"a3â2",
491
"a3e2",
492
"a3ı2",
493
"a3i2",
494
"a3î2",
495
"a3o2",
496
"a3ö2",
497
"a3u2",
498
"a3ü2",
499
"a3û2",
500
"â3a2",
501
"â3â2",
502
"â3e2",
503
"â3ı2",
504
"â3i2",
505
"â3î2",
506
"â3o2",
507
"â3ö2",
508
"â3u2",
509
"â3ü2",
510
"â3û2",
511
"e3a2",
512
"e3â2",
513
"e3e2",
514
"e3ı2",
515
"e3i2",
516
"e3î2",
517
"e3o2",
518
"e3ö2",
519
"e3u2",
520
"e3ü2",
521
"e3û2",
522
"ı3a2",
523
"ı3â2",
524
"ı3e2",
525
"ı3ı2",
526
"ı3i2",
527
"ı3î2",
528
"ı3o2",
529
"ı3ö2",
530
"ı3u2",
531
"ı3ü2",
532
"ı3û2",
533
"i3a2",
534
"i3â2",
535
"i3e2",
536
"i3ı2",
537
"i3i2",
538
"i3î2",
539
"i3o2",
540
"i3ö2",
541
"i3u2",
542
"i3ü2",
543
"i3û2",
544
"î3a2",
545
"î3â2",
546
"î3e2",
547
"î3ı2",
548
"î3i2",
549
"î3î2",
550
"î3o2",
551
"î3ö2",
552
"î3u2",
553
"î3ü2",
554
"î3û2",
555
"o3a2",
556
"o3â2",
557
"o3e2",
558
"o3ı2",
559
"o3i2",
560
"o3î2",
561
"o3o2",
562
"o3ö2",
563
"o3u2",
564
"o3ü2",
565
"o3û2",
566
"ö3a2",
567
"ö3â2",
568
"ö3e2",
569
"ö3ı2",
570
"ö3i2",
571
"ö3î2",
572
"ö3o2",
573
"ö3ö2",
574
"ö3u2",
575
"ö3ü2",
576
"ö3û2",
577
"u3a2",
578
"u3â2",
579
"u3e2",
580
"u3ı2",
581
"u3i2",
582
"u3î2",
583
"u3o2",
584
"u3ö2",
585
"u3u2",
586
"u3ü2",
587
"u3û2",
588
"ü3a2",
589
"ü3â2",
590
"ü3e2",
591
"ü3ı2",
592
"ü3i2",
593
"ü3î2",
594
"ü3o2",
595
"ü3ö2",
596
"ü3u2",
597
"ü3ü2",
598
"ü3û2",
599
"û3a2",
600
"û3â2",
601
"û3e2",
602
"û3ı2",
603
"û3i2",
604
"û3î2",
605
"û3o2",
606
"û3ö2",
607
"û3u2",
608
"û3ü2",
609
"û3û2",
610
-- a couple of consonant-clusters
611
"tu4r4k",
612
"m1t4rak",
613
-- See https://github.com/sile-typesetter/sile/issues/355
614
-- Allow hyphenation to apply before apostrophes (before per pattern rules but
615
-- will be substututed later, allowing after breaks minright), but work around
616
-- minleft not being applied mid-word by excluding all possible single letter
617
-- candidates before apostrophes.
618
"1'2",
619
"1’2",
620
"4a1'",
621
"4a1’",
622
"4â1'",
623
"4â1’",
624
"4b1'",
625
"4b1’",
626
"4c1'",
627
"4c1’",
628
"4ç1'",
629
"4ç1’",
630
"4d1'",
631
"4d1’",
632
"4e1'",
633
"4e1’",
634
"4f1'",
635
"4f1’",
636
"4g1'",
637
"4g1’",
638
"4ğ1'",
639
"4ğ1’",
640
"4h1'",
641
"4h1’",
642
"4j1'",
643
"4j1’",
644
"4k1'",
645
"4k1’",
646
"4ı1'",
647
"4ı1’",
648
"4i1'",
649
"4i1’",
650
"4î1'",
651
"4î1’",
652
"4l1'",
653
"4l1’",
654
"4m1'",
655
"4m1’",
656
"4n1'",
657
"4n1’",
658
"4o1'",
659
"4o1’",
660
"4ö1'",
661
"4ö1’",
662
"4p1'",
663
"4p1’",
664
"4r1'",
665
"4r1’",
666
"4s1'",
667
"4s1’",
668
"4ş1'",
669
"4ş1’",
670
"4t1'",
671
"4t1’",
672
"4u1'",
673
"4u1’",
674
"4ü1'",
675
"4ü1’",
676
"4û1'",
677
"4û1’",
678
"4v1'",
679
"4v1’",
680
"4y1'",
681
"4y1’",
682
"4z1'",
683
"4z1’",
684
   }
685

686
-- Internationalisation stuff
687

688
-- local sum_tens = function (val, loc, digits)
689
--   local ten = string.sub(digits, loc+1, loc+1)
690
--   if ten:len() == 1 then val = val + tonumber(ten) * 10 end
691
--   return val
692
-- end
693

694
local sum_hundreds = function (val, loc, digits)
695
  local ten = string.sub(digits, loc+1, loc+1)
×
696
  local hundred = string.sub(digits, loc+2, loc+2)
×
697
  if ten:len() == 1 then val = val + tonumber(ten) * 10 end
×
698
  if hundred:len() == 1 then val = val + tonumber(hundred) * 100 end
×
699
  return val
×
700
end
701

702
local tr_nums = function (num, ordinal)
703
  local abs = math.abs(num)
×
704
  if abs >= 1e+36 then
×
705
    SU.error("Numbers past decillions not supported in Turkish")
×
706
  end
707
  ordinal = SU.boolean(ordinal, false)
×
708
  local minus =  "eksi"
×
709
  local zero =  "sıfır"
×
710
  local ones = { "bir", "iki", "üç", "dört", "beş", "altı", "yedi", "sekiz", "dokuz" }
×
711
  local tens = { "on", "yirmi", "otuz", "kırk", "eli", "altmış", "yetmiş", "seksen", "doksan" }
×
712
  local places = { "yüz", "bin", "milyon", "milyar", "trilyon", "katrilyon", "kentilyon", "sekstilyon", "septilyon", "oktilyon", "nonilyon", "desilyon" }
×
713
  local zeroordinal = "sıfırıncı"
×
714
  local onesordinals = { "birinci", "ikinci", "üçüncü", "dördüncü", "beşinci", "altıncı", "yedinci", "sekizinci", "dokuzuncu" }
×
715
  local tensordinals = { "onuncu", "yirmiyinci", "otuzuncu", "kırkıncı", "eliyinci", "altmışıncı", "yetmişinci", "sekseninci", "Doksanıncı" }
×
716
  local placesordinals = { "yüzüncü", "bininci", "milyonuncu", "milyarıncı", "trilyonuncu", "katrilyonuncu", "kentilyonuncu", "sekstilyonuncu", "septilyonuncu", "oktilyonuncu", "nonilyonuncu", "desilyonuncu" }
×
717
  local digits = string.reverse(string.format("%.f", abs))
×
718
  local words = {}
×
719
  for i = 1, #digits do
×
720
    local val, place, mod = tonumber(string.sub(digits, i, i)), math.floor(i / 3), i % 3
×
721
    if #digits == 1 and val == 0 then
×
722
      words[#words+1] = ordinal and zeroordinal or zero
×
723
    elseif val >= 1 or i > 1 then
×
724
      if i == 1 then
×
725
        words[#words+1] = ordinal and onesordinals[val] or ones[val]
×
726
        ordinal = false
×
727
      elseif mod == 2 then
×
728
        if val >= 1 then
×
729
          words[#words+1] = ordinal and tensordinals[val] or tens[val]
×
730
          ordinal = false
×
731
        end
732
      elseif mod == 1 then
×
733
        if sum_hundreds(val, i, digits) >= 1 then
×
734
          words[#words+1] = ordinal and placesordinals[place+1] or places[place+1]
×
735
          ordinal = false
×
736
          if val > 0 and (i >= 7 or sum_hundreds(val, i, digits) >= 2) then
×
737
            words[#words+1] = ones[val]
×
738
          end
739
        end
740
      elseif mod == 0 then
×
741
        if val > 0 then
×
742
          words[#words+1] = ordinal and placesordinals[1] or places[1]
×
743
          ordinal = false
×
744
        end
745
        if val >= 2 then
×
746
          words[#words+1] = ones[val]
×
747
        end
748
      end
749
    end
750
  end
751
  if abs > num then
×
752
    words[#words+1] = minus
×
753
  end
754
  SU.flip_in_place(words)
×
755
  return table.concat(words, " ")
×
756
end
757

758
SU.formatNumber.tr = {
×
759
  string = function (num, _)
760
    return tr_nums(num, false)
×
761
  end,
762
  ['ordinal-string'] = function (num, _)
763
    return tr_nums(num, true)
×
764
  end
765
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc