File: unicode.ml

package info (click to toggle)
ocaml 5.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,384 kB
  • sloc: ml: 370,196; ansic: 52,820; sh: 27,419; asm: 5,462; makefile: 3,684; python: 974; awk: 278; javascript: 273; perl: 59; fortran: 21; cs: 9
file content (179 lines) | stat: -rw-r--r-- 8,120 bytes parent folder | download
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
(* TEST
 flags = "-I ${ocamlsrcdir}/toplevel";
 expect;
*)


let setup ~out_width n =
  Format.set_geometry ~max_indent:(n-2) ~margin:n;
  let fns = Format.get_formatter_out_functions () in
  Format.set_formatter_out_functions  { fns with out_width }

let zws = "\u{200B}"

let () = Toploop.max_printer_steps := 1 + 100 * String.length zws

let zero_width_spaces =
  let len = String.length zws in
  String.init (20 * len) (fun i -> zws.[i mod len])

let test ~out_width n s =
  setup ~out_width n;
  Format.printf "@[@<0>%s%a@]@."
    zero_width_spaces
    Format.pp_print_text s
[%%expect {|
val setup : out_width:(string -> pos:int -> len:int -> int) -> int -> unit =
  <fun>
val zws : string = "​"
val zero_width_spaces : string = "​​​​​​​​​​​​​​​​​​​​"
val test :
  out_width:(string -> pos:int -> len:int -> int) -> int -> string -> unit =
  <fun>
|}]

(** Alphabetic scripts *)
let () =
  test ~out_width:Format.utf_8_scalar_width 40
  "Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, \
   πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν \
   οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην \
   ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς."
[%%expect {|
​​​​​​​​​​​​​​​​​​​​Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος
οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε,
πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν
ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν
οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο
βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην
ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ
δῖος Ἀχιλλεύς.
|}]

let () =
  setup ~out_width:Format.utf_8_scalar_width 40;
  Format.printf
    "@[Μῆνιν@ ἄειδε@ θεὰ@ Πηληϊάδεω@ Ἀχιλῆος@ οὐλομένην,@ ἣ@ μυρί᾿@ Ἀχαιοῖς@ ἄλγε᾿@ ἔθηκε,@ \
     πολλὰς@ δ᾿@ ἰφθίμους@ ψυχὰς@ Ἄϊδι@ προΐαψεν@ ἡρώων,@ αὐτοὺς@ δὲ@ ἑλώρια@ τεῦχε@ \
     κύνεσσιν@ οἰωνοῖσί@ τε@ πᾶσι·@ Διὸς@ δ᾿@ ἐτελείετο@ βουλή@ ἐξ@ οὗ@ δὴ@ τὰ@ πρῶτα@ \
     διαστήτην@ ἐρίσαντε@ Ἀτρεΐδης@ τε@ ἄναξ@ ἀνδρῶν@ καὶ@ δῖος@ Ἀχιλλεύς.@]@."
[%%expect {|
Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος
οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε,
πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν
ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν
οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο
βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην
ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ
δῖος Ἀχιλλεύς.
|}]

let () =
  test ~out_width:Format.ascii_width 40
  "Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, \
   πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν \
   οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην \
   ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς."
[%%expect {|
​​​​​​​​​​​​​​​​​​​​Μῆνιν ἄειδε θεὰ
Πηληϊάδεω Ἀχιλῆος
οὐλομένην, ἣ μυρί᾿
Ἀχαιοῖς ἄλγε᾿
ἔθηκε, πολλὰς δ᾿
ἰφθίμους ψυχὰς
Ἄϊδι προΐαψεν
ἡρώων, αὐτοὺς δὲ
ἑλώρια τεῦχε
κύνεσσιν οἰωνοῖσί
τε πᾶσι· Διὸς δ᾿
ἐτελείετο βουλή ἐξ
οὗ δὴ τὰ πρῶτα
διαστήτην ἐρίσαντε
Ἀτρεΐδης τε ἄναξ
ἀνδρῶν καὶ δῖος
Ἀχιλλεύς.
|}]

(** Vietnamese tends to use many combining diacritics *)
let () =
  test ~out_width:Format.utf_8_scalar_width 40
    "Trăm năm trong cõi người ta, \
     Chữ tài chữ mệnh khéo là ghét nhau. \
     Trải qua một cuộc bể dâu, \
     Những điều trông thấy mà đau đớn lòng."
[%%expect{|
​​​​​​​​​​​​​​​​​​​​Trăm năm trong cõi người ta, Chữ tài
chữ mệnh khéo là ghét nhau. Trải qua
một cuộc bể dâu, Những điều trông thấy
mà đau đớn lòng.
|}]

let () =
  test ~out_width:Format.ascii_width 40
    "Trăm năm trong cõi người ta, \
     Chữ tài chữ mệnh khéo là ghét nhau. \
     Trải qua một cuộc bể dâu, \
     Những điều trông thấy mà đau đớn lòng."
[%%expect{|
​​​​​​​​​​​​​​​​​​​​Trăm năm trong cõi người ta,
Chữ tài chữ mệnh khéo là ghét
nhau. Trải qua một cuộc bể
dâu, Những điều trông thấy mà
đau đớn lòng.
|}]

(** Logographic *)
let () =
  test ~out_width:Format.ascii_width 40
    "めぐり逢ひ \
     見しやそれとも \
     わかぬ間に \
     雲隠れにし"
[%%expect {|
​​​​​​​​​​​​​​​​​​​​めぐり逢ひ 見しやそれとも
わかぬ間に 雲隠れにし
|}]

let () =
  test ~out_width:Format.utf_8_scalar_width 40
    "めぐり逢ひ \
     見しやそれとも \
     わかぬ間に \
     雲隠れにし"
[%%expect {|
​​​​​​​​​​​​​​​​​​​​めぐり逢ひ 見しやそれとも わかぬ間に 雲隠れにし
|}]



(** The number of unicode scalar values is really not a good approximation for
    abugida scripts, but those scripts width tend to be really dependent on
    shaping anyway. *)
let () =
  test  ~out_width:Format.utf_8_scalar_width 40
    "अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम होतारं रत्नधातमम अग्निः \
     पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स देवानेह वक्षति"
[%%expect{|
​​​​​​​​​​​​​​​​​​​​अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम
होतारं रत्नधातमम अग्निः
पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स
देवानेह वक्षति
|}]

let () =
  test  ~out_width:Format.ascii_width 40
    "अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम होतारं रत्नधातमम अग्निः \
     पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स देवानेह वक्षति"
[%%expect{|
​​​​​​​​​​​​​​​​​​​​अग्निमीळे
पुरोहितं
यज्ञस्य देवं
रत्वीजम
होतारं
रत्नधातमम
अग्निः
पूर्वेभिर्र्षिभिरीड्यो
नूतनैरुत स
देवानेह
वक्षति
|}]