polytypo 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/polytypo/data/VERSION +1 -1
  3. data/lib/polytypo/data/fixtures/bg.json +253 -0
  4. data/lib/polytypo/data/fixtures/cs.json +1 -1
  5. data/lib/polytypo/data/fixtures/de-CH.json +1 -1
  6. data/lib/polytypo/data/fixtures/de-DE.json +1 -1
  7. data/lib/polytypo/data/fixtures/el.json +1 -1
  8. data/lib/polytypo/data/fixtures/en-GB.json +1 -1
  9. data/lib/polytypo/data/fixtures/en-US.json +1 -1
  10. data/lib/polytypo/data/fixtures/es.json +1 -1
  11. data/lib/polytypo/data/fixtures/fi.json +1 -1
  12. data/lib/polytypo/data/fixtures/fr-CA.json +1 -1
  13. data/lib/polytypo/data/fixtures/fr.json +1 -1
  14. data/lib/polytypo/data/fixtures/hr.json +253 -0
  15. data/lib/polytypo/data/fixtures/hu.json +264 -0
  16. data/lib/polytypo/data/fixtures/it.json +1 -1
  17. data/lib/polytypo/data/fixtures/locale-resolution.json +1 -1
  18. data/lib/polytypo/data/fixtures/nl.json +1 -1
  19. data/lib/polytypo/data/fixtures/pl.json +1 -1
  20. data/lib/polytypo/data/fixtures/pt-BR.json +1 -1
  21. data/lib/polytypo/data/fixtures/pt-PT.json +1 -1
  22. data/lib/polytypo/data/fixtures/ro.json +234 -0
  23. data/lib/polytypo/data/fixtures/ru.json +1 -1
  24. data/lib/polytypo/data/fixtures/sk.json +1 -1
  25. data/lib/polytypo/data/fixtures/sv.json +1 -1
  26. data/lib/polytypo/data/fixtures/tr.json +1 -1
  27. data/lib/polytypo/data/fixtures/uk.json +1 -1
  28. data/lib/polytypo/data/locales/bg.json +82 -0
  29. data/lib/polytypo/data/locales/hr.json +82 -0
  30. data/lib/polytypo/data/locales/hu.json +88 -0
  31. data/lib/polytypo/data/locales/registry.json +6 -2
  32. data/lib/polytypo/data/locales/ro.json +82 -0
  33. data/lib/polytypo/data/rules/dashes.md +2 -1
  34. data/lib/polytypo/data/rules/order.json +1 -1
  35. data/lib/polytypo/data/rules/quotes.md +9 -0
  36. data/lib/polytypo/data/rules/ranges.md +6 -5
  37. data/lib/polytypo/data/schema/locale.schema.json +2 -2
  38. data/lib/polytypo/version.rb +1 -1
  39. metadata +9 -1
@@ -0,0 +1,264 @@
1
+ {
2
+ "spec": "1.12.0",
3
+ "locale": "hu",
4
+ "cases": [
5
+ {
6
+ "id": "hu-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "Azt mondta: \"szia\" és elment.",
10
+ "out": "Azt mondta: „szia” és elment.",
11
+ "note": "AkH12 §240 j: the base form is „…” (U+201E, U+201D)."
12
+ },
13
+ {
14
+ "id": "hu-quotes-not-german",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "„szia“",
18
+ "out": "„szia”",
19
+ "note": "U+201C as a closing mark is the German form; AkH12 §240 j closes with U+201D."
20
+ },
21
+ {
22
+ "id": "hu-quotes-nested",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "\"Ő azt mondta 'jó' volt\"",
26
+ "out": "„Ő azt mondta »jó« volt”",
27
+ "note": "AkH12 §257: a quote inside a quote takes the lúdlábidézőjel »…« (opens with U+00BB, the reverse of ro)."
28
+ },
29
+ {
30
+ "id": "hu-quotes-nested-guillemets-kept",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "„Ő azt mondta »jó« volt”",
34
+ "out": "„Ő azt mondta »jó« volt”",
35
+ "note": "Already typeset: both levels are left as they are."
36
+ },
37
+ {
38
+ "id": "hu-quotes-no-inner-space",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "„ szia ”",
42
+ "out": "„szia”",
43
+ "note": "AkH12 §240 j: the marks attach to the words they enclose, no inner space."
44
+ },
45
+ {
46
+ "id": "hu-ellipsis-three-dots",
47
+ "rule": "ellipsis",
48
+ "mode": "text",
49
+ "in": "Várj... mi?",
50
+ "out": "Várj… mi?",
51
+ "note": "AkH12 §240 b: three dots, attached to the preceding word."
52
+ },
53
+ {
54
+ "id": "hu-ellipsis-not-abbreviated",
55
+ "rule": "ellipsis",
56
+ "mode": "text",
57
+ "in": "Tényleg?.. igen",
58
+ "out": "Tényleg?… igen",
59
+ "note": "abbreviatedAfterTerminal is false: `?..` is a typing slip, not an abbreviated ellipsis."
60
+ },
61
+ {
62
+ "id": "hu-dashes-parenthetical",
63
+ "rule": "dashes",
64
+ "mode": "text",
65
+ "in": "Holnap - ha esik - elmegyünk.",
66
+ "out": "Holnap – ha esik – elmegyünk.",
67
+ "note": "AkH12 §240 g, §252: en dash with a space on both sides."
68
+ },
69
+ {
70
+ "id": "hu-dashes-existing-em-dash",
71
+ "rule": "dashes",
72
+ "mode": "text",
73
+ "in": "Holnap — ha esik — elmegyünk.",
74
+ "out": "Holnap – ha esik – elmegyünk.",
75
+ "note": "An authored em dash becomes the locale's en dash."
76
+ },
77
+ {
78
+ "id": "hu-dashes-tight-compound-kept",
79
+ "rule": "dashes",
80
+ "mode": "text",
81
+ "in": "Budapest–Bécs és Osztrák–Magyar",
82
+ "out": "Budapest–Bécs és Osztrák–Magyar",
83
+ "note": "AkH12 §264 c: the tight en dash is already correct, no spaces are added."
84
+ },
85
+ {
86
+ "id": "hu-ranges-years-and-pages",
87
+ "rule": "ranges",
88
+ "mode": "text",
89
+ "in": "az 1983-1984. évi és az 1-4. osztályban",
90
+ "out": "az 1983⁠–⁠1984. évi és az 1⁠–⁠4. osztályban",
91
+ "note": "ranges.md §3: AkH12 §264 c attaches the en dash to its members (1983–1984. évi, az 1–4. osztályban); the word joiners are the spec's line-break guard.",
92
+ "rules": {
93
+ "ranges": true
94
+ }
95
+ },
96
+ {
97
+ "id": "hu-ranges-spaced-input-tightened",
98
+ "rule": "ranges",
99
+ "mode": "text",
100
+ "in": "1 - 4 oldal",
101
+ "out": "1⁠–⁠4 oldal",
102
+ "note": "ranges.md §3: en-tight takes the spaced form of a digit range to the tight one.",
103
+ "rules": {
104
+ "ranges": true
105
+ }
106
+ },
107
+ {
108
+ "id": "hu-ranges-en-dash-kept",
109
+ "rule": "ranges",
110
+ "mode": "text",
111
+ "in": "1914–1918 és Budapest–Bécs",
112
+ "out": "1914–1918 és Budapest–Bécs",
113
+ "note": "ranges.md §3: an authored tight en dash is the correct form and is kept.",
114
+ "rules": {
115
+ "ranges": true
116
+ }
117
+ },
118
+ {
119
+ "id": "hu-ranges-complex-spaced-kept",
120
+ "rule": "ranges",
121
+ "mode": "text",
122
+ "in": "2011. április 25. – 2012. május 13.",
123
+ "out": "2011. április 25. – 2012. május 13.",
124
+ "note": "ranges.md §3: AkH12 §264 c allows the spaced en dash for complex members; a '.' beside the space keeps it out of the range candidates.",
125
+ "rules": {
126
+ "ranges": true
127
+ }
128
+ },
129
+ {
130
+ "id": "hu-ranges-ordinal-shape-declined",
131
+ "rule": "ranges",
132
+ "mode": "text",
133
+ "in": "a 128-9. lapon",
134
+ "out": "a 128-9. lapon",
135
+ "note": "ranges.md §3.2: AkH12 §264 c prints «a 128–9. lapon», but the shape (3,1) is declined by G4, so a typed hyphen stays a hyphen. Accepted miss, as `2020-24` in en-US.",
136
+ "rules": {
137
+ "ranges": true
138
+ }
139
+ },
140
+ {
141
+ "id": "hu-ranges-word-hyphen-untouched",
142
+ "rule": "ranges",
143
+ "mode": "text",
144
+ "in": "Budapest-Bécs út",
145
+ "out": "Budapest-Bécs út",
146
+ "note": "ranges.md §3: words joined by a hyphen are not a digit range and are left alone.",
147
+ "rules": {
148
+ "ranges": true
149
+ }
150
+ },
151
+ {
152
+ "id": "hu-hyphen-noop",
153
+ "rule": "hyphen",
154
+ "mode": "text",
155
+ "in": "A MÁV-ot és a tűzzel-vassal",
156
+ "out": "A MÁV-ot és a tűzzel-vassal",
157
+ "note": "AkH12 §270 permits breaking at a hyphen; no list ships, nothing changes."
158
+ },
159
+ {
160
+ "id": "hu-nbsp-units",
161
+ "rule": "nbsp",
162
+ "mode": "text",
163
+ "in": "100 km, 1 kg, 10 kWh és 120 km/h",
164
+ "out": "100 km, 1 kg, 10 kWh és 120 km/h",
165
+ "note": "AkH12 §279 c: a space separates the unit from its number."
166
+ },
167
+ {
168
+ "id": "hu-nbsp-celsius",
169
+ "rule": "nbsp",
170
+ "mode": "text",
171
+ "in": "23 °C",
172
+ "out": "23 °C",
173
+ "note": "AkH12 §275: «23 °C» with a space."
174
+ },
175
+ {
176
+ "id": "hu-nbsp-percent-inert",
177
+ "rule": "nbsp",
178
+ "mode": "text",
179
+ "in": "48 % és 48%",
180
+ "out": "48 % és 48%",
181
+ "note": "AkH12 §275 prints 48% without a space, so % is not a unit here and nothing is bound."
182
+ },
183
+ {
184
+ "id": "hu-nbsp-single-letter-unit-inert",
185
+ "rule": "nbsp",
186
+ "mode": "text",
187
+ "in": "220 W és 5 s",
188
+ "out": "220 W és 5 s",
189
+ "note": "Single-letter symbols are excluded by decision, not by citation (AkH12 §279 c writes «220 W» with a space): `s` is a Hungarian conjunction."
190
+ },
191
+ {
192
+ "id": "hu-nbsp-forint-inert",
193
+ "rule": "nbsp",
194
+ "mode": "text",
195
+ "in": "2890 Ft",
196
+ "out": "2890 Ft",
197
+ "note": "Ft is attested only by example (§290) and ships unverified: nothing is bound."
198
+ },
199
+ {
200
+ "id": "hu-nbsp-abbreviations",
201
+ "rule": "nbsp",
202
+ "mode": "text",
203
+ "in": "Kr. e. 44-ben, Kr. u. 2. században, i. sz. 3. század",
204
+ "out": "Kr. e. 44-ben, Kr. u. 2. században, i. sz. 3. század",
205
+ "note": "AkH12 §277 a, §284: abbreviations written with an internal space; N4 binds it."
206
+ },
207
+ {
208
+ "id": "hu-nbsp-abbreviations-short",
209
+ "rule": "nbsp",
210
+ "mode": "text",
211
+ "in": "a. m. annyi mint, s. k. aláírás",
212
+ "out": "a. m. annyi mint, s. k. aláírás",
213
+ "note": "AkH12 §277 a: a. m. and s. k."
214
+ },
215
+ {
216
+ "id": "hu-nbsp-initials-unbound",
217
+ "rule": "nbsp",
218
+ "mode": "text",
219
+ "in": "Kossuth L. és L. Kossuth",
220
+ "out": "Kossuth L. és L. Kossuth",
221
+ "note": "initialBinding is none: AkH12 has no rule on initials."
222
+ },
223
+ {
224
+ "id": "hu-nbsp-no-space-before-question",
225
+ "rule": "nbsp",
226
+ "mode": "text",
227
+ "in": "Tényleg ? Igen !",
228
+ "out": "Tényleg? Igen!",
229
+ "note": "AkH12 §240 c: no space before ? and !, so nothing is put back."
230
+ },
231
+ {
232
+ "id": "hu-nbsp-paragraph-sign-inert",
233
+ "rule": "nbsp",
234
+ "mode": "text",
235
+ "in": "a 4. § szerint",
236
+ "out": "a 4. § szerint",
237
+ "note": "AkH12 §275 writes '4. §' with the number first; afterSymbols ships empty."
238
+ },
239
+ {
240
+ "id": "hu-spaces-brackets",
241
+ "rule": "spaces",
242
+ "mode": "text",
243
+ "in": "Szöveg ( rendes ) marad .",
244
+ "out": "Szöveg (rendes) marad.",
245
+ "note": "spaces.md: brackets tighten, no space before the final stop."
246
+ },
247
+ {
248
+ "id": "hu-symbols-copyright",
249
+ "rule": "symbols",
250
+ "mode": "text",
251
+ "in": "Copyright (c) 2026",
252
+ "out": "Copyright © 2026",
253
+ "note": "symbols rule, locale-neutral."
254
+ },
255
+ {
256
+ "id": "hu-apostrophe-foreign-name",
257
+ "rule": "apostrophe",
258
+ "mode": "text",
259
+ "in": "Ez a McDonald's",
260
+ "out": "Ez a McDonald’s",
261
+ "note": "apostrophe rule, locale-neutral."
262
+ }
263
+ ]
264
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "it",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "cases": [
4
4
  {
5
5
  "id": "exact-en-us",
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "nl",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "pl",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "pt-BR",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "pt-PT",
4
4
  "cases": [
5
5
  {
@@ -0,0 +1,234 @@
1
+ {
2
+ "spec": "1.12.0",
3
+ "locale": "ro",
4
+ "cases": [
5
+ {
6
+ "id": "ro-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "A spus \"salut\".",
10
+ "out": "A spus „salut”.",
11
+ "note": "quotes.primary = U+201E/U+201D (forma «99…99»): ÎOOP6 §III.1.2, «ghilimele românești „ ”»."
12
+ },
13
+ {
14
+ "id": "ro-quotes-not-german",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "„salut“",
18
+ "out": "„salut”",
19
+ "note": "DISTINCTIVE CASE: input is the German/Czech pair with closing U+201C; output is the Romanian closing U+201D. The two differ by one glyph in print, hence a fixture of their own."
20
+ },
21
+ {
22
+ "id": "ro-quotes-nested",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "\"Ea a zis 'bine' acolo\"",
26
+ "out": "„Ea a zis «bine» acolo”",
27
+ "note": "quotes.secondary = U+00AB/U+00BB, pointing inwards: ÎOOP6 gives guillemets the role of a quote inside a quote."
28
+ },
29
+ {
30
+ "id": "ro-quotes-nested-guillemets-kept",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "„Ea a zis «bine» acolo”",
34
+ "out": "„Ea a zis «bine» acolo”",
35
+ "note": "An already typeset nested pair is a fixed point."
36
+ },
37
+ {
38
+ "id": "ro-quotes-no-inner-space",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "„ salut ”",
42
+ "out": "„salut”",
43
+ "note": "innerSpace = none: ÎOOP6 «Între ghilimele și elementul pe care îl încadrează nu se lasă blanc.»"
44
+ },
45
+ {
46
+ "id": "ro-ellipsis-three-dots",
47
+ "rule": "ellipsis",
48
+ "mode": "text",
49
+ "in": "Stai... ce?",
50
+ "out": "Stai… ce?",
51
+ "note": "Three dots become the single character U+2026."
52
+ },
53
+ {
54
+ "id": "ro-ellipsis-not-abbreviated",
55
+ "rule": "ellipsis",
56
+ "mode": "text",
57
+ "in": "Serios?.. da",
58
+ "out": "Serios?… da",
59
+ "note": "abbreviatedAfterTerminal = false: no source attests the two-dot form after a terminal mark; medium confidence, see sources."
60
+ },
61
+ {
62
+ "id": "ro-dashes-parenthetical",
63
+ "rule": "dashes",
64
+ "mode": "text",
65
+ "in": "Nu avem încă - firește - rezultate.",
66
+ "out": "Nu avem încă – firește – rezultate.",
67
+ "note": "dash.parenthetical = en-spaced: ÎOOP6 «Înainte și după linia de pauză, blancul este obligatoriu»."
68
+ },
69
+ {
70
+ "id": "ro-dashes-existing-em-dash",
71
+ "rule": "dashes",
72
+ "mode": "text",
73
+ "in": "Nu avem încă — firește — rezultate.",
74
+ "out": "Nu avem încă – firește – rezultate.",
75
+ "note": "The sources name U+2013 (the Order's annex, En-Dash) and never U+2014, so an em dash is rewritten."
76
+ },
77
+ {
78
+ "id": "ro-ranges-hyphen-kept",
79
+ "rule": "ranges",
80
+ "mode": "text",
81
+ "in": "anii 2020-2021, perioada 1-13 mai",
82
+ "out": "anii 2020-2021, perioada 1-13 mai",
83
+ "note": "ranges.md §3: dash.range = none. ÎOOP6 and DOOM3 prefer the unspaced hyphen for ranges, which is the input form, so nothing is substituted.",
84
+ "rules": {
85
+ "ranges": true
86
+ }
87
+ },
88
+ {
89
+ "id": "ro-ranges-spaced-kept",
90
+ "rule": "ranges",
91
+ "mode": "text",
92
+ "in": "noaptea de 30 – 31 decembrie",
93
+ "out": "noaptea de 30 – 31 decembrie",
94
+ "note": "ranges.md §3: dash.range = none. The spaced en dash is the second form ÎOOP6 attests for dates (30 – 31 decembrie); none preserves it.",
95
+ "rules": {
96
+ "ranges": true
97
+ }
98
+ },
99
+ {
100
+ "id": "ro-ranges-en-dash-tight-kept",
101
+ "rule": "ranges",
102
+ "mode": "text",
103
+ "in": "perioada 1–31 ianuarie",
104
+ "out": "perioada 1–31 ianuarie",
105
+ "note": "ranges.md §3: dash.range = none. DOOM3 «Bara oblică» II.3 b attests the unspaced en dash as a third range form; none preserves it.",
106
+ "rules": {
107
+ "ranges": true
108
+ }
109
+ },
110
+ {
111
+ "id": "ro-ranges-spaced-hyphen-untouched",
112
+ "rule": "ranges",
113
+ "mode": "text",
114
+ "in": "paginile 1 - 22",
115
+ "out": "paginile 1 - 22",
116
+ "note": "ranges.md §3: dash.range = none. With range = none a spaced hyphen is left as authored.",
117
+ "rules": {
118
+ "ranges": true
119
+ }
120
+ },
121
+ {
122
+ "id": "ro-hyphen-noop",
123
+ "rule": "hyphen",
124
+ "mode": "text",
125
+ "in": "s-a dus și l-am văzut",
126
+ "out": "s-a dus și l-am văzut",
127
+ "note": "The hyphen lists are empty: DOOM3 5.1.5 gives a general recommendation, not a closed list of forms."
128
+ },
129
+ {
130
+ "id": "ro-nbsp-no-short-words",
131
+ "rule": "nbsp",
132
+ "mode": "text",
133
+ "in": "și la ea, o dată",
134
+ "out": "și la ea, o dată",
135
+ "note": "afterShortWords is empty: no source states a short-word rule."
136
+ },
137
+ {
138
+ "id": "ro-nbsp-before-number",
139
+ "rule": "nbsp",
140
+ "mode": "text",
141
+ "in": "conform art. 3 și nr. 5",
142
+ "out": "conform art. 3 și nr. 5",
143
+ "note": "beforeNumber: DOOM3 5.2 «nu art. // 3»; nr. is the same class."
144
+ },
145
+ {
146
+ "id": "ro-nbsp-units",
147
+ "rule": "nbsp",
148
+ "mode": "text",
149
+ "in": "10 km, 5 kg, 20 cm, 3 mm și 90 km/h",
150
+ "out": "10 km, 5 kg, 20 cm, 3 mm și 90 km/h",
151
+ "note": "beforeUnits: DOOM3 5.2 «nu 10 // km»; the other symbols follow BIPM."
152
+ },
153
+ {
154
+ "id": "ro-nbsp-celsius",
155
+ "rule": "nbsp",
156
+ "mode": "text",
157
+ "in": "19 °C",
158
+ "out": "19 °C",
159
+ "note": "°C: same class as the other unit symbols; BIPM leaves a single space before the unit."
160
+ },
161
+ {
162
+ "id": "ro-nbsp-percent-inert",
163
+ "rule": "nbsp",
164
+ "mode": "text",
165
+ "in": "50 % din preț",
166
+ "out": "50 % din preț",
167
+ "note": "% is not listed: it rests only on a non-normative guide, so it is not bound."
168
+ },
169
+ {
170
+ "id": "ro-nbsp-initial-single",
171
+ "rule": "nbsp",
172
+ "mode": "text",
173
+ "in": "I. Popescu",
174
+ "out": "I. Popescu",
175
+ "note": "initialBinding = single: DOOM3 5.2 «nu Ion // Popescu, I. // Popescu»."
176
+ },
177
+ {
178
+ "id": "ro-nbsp-initials-compact-unbound",
179
+ "rule": "nbsp",
180
+ "mode": "text",
181
+ "in": "I.L. Caragiale",
182
+ "out": "I.L. Caragiale",
183
+ "note": "ACCEPTED MISS: DOOM3 1.2.6 writes compound initials closed up (I.L.), and N7 (nbsp.md §3.9) does not treat the L. after a full stop as an initial, so the space before the surname stays breakable. A false negative, never a damaged text."
184
+ },
185
+ {
186
+ "id": "ro-nbsp-initial-sentence-boundary",
187
+ "rule": "nbsp",
188
+ "mode": "text",
189
+ "in": "în anul A. Apoi",
190
+ "out": "în anul A. Apoi",
191
+ "note": "ACCEPTED COST of initialBinding = single: a lone capital before a full stop is read as an initial even at a sentence boundary (nbsp.md §3.9), the price of binding «I. // Popescu»."
192
+ },
193
+ {
194
+ "id": "ro-nbsp-no-space-before-question",
195
+ "rule": "nbsp",
196
+ "mode": "text",
197
+ "in": "Serios?",
198
+ "out": "Serios?",
199
+ "note": "No no-break space before ? ! : ;."
200
+ },
201
+ {
202
+ "id": "ro-nbsp-abbreviation-inert",
203
+ "rule": "nbsp",
204
+ "mode": "text",
205
+ "in": "nr. crt. 4",
206
+ "out": "nr. crt. 4",
207
+ "note": "abbreviations is empty: no source forbids splitting a spaced abbreviation such as nr. crt."
208
+ },
209
+ {
210
+ "id": "ro-spaces-brackets-and-final-stop",
211
+ "rule": "spaces",
212
+ "mode": "text",
213
+ "in": "Text ( obișnuit ) rămâne .",
214
+ "out": "Text (obișnuit) rămâne.",
215
+ "note": "The spaces rule is language-independent."
216
+ },
217
+ {
218
+ "id": "ro-symbols-copyright",
219
+ "rule": "symbols",
220
+ "mode": "text",
221
+ "in": "Copyright (c) 2026",
222
+ "out": "Copyright © 2026",
223
+ "note": "The symbols rule is language-independent."
224
+ },
225
+ {
226
+ "id": "ro-apostrophe-foreign-name",
227
+ "rule": "apostrophe",
228
+ "mode": "text",
229
+ "in": "A mers la McDonald's și înapoi",
230
+ "out": "A mers la McDonald’s și înapoi",
231
+ "note": "An apostrophe in a foreign name is written U+2019."
232
+ }
233
+ ]
234
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "ru",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "sk",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "sv",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "tr",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "uk",
4
4
  "cases": [
5
5
  {