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{|
अग्निमीळे
पुरोहितं
यज्ञस्य देवं
रत्वीजम
होतारं
रत्नधातमम
अग्निः
पूर्वेभिर्र्षिभिरीड्यो
नूतनैरुत स
देवानेह
वक्षति
|}]
|