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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2005b3a52f6a24868969c8c42da7d245336a2163e629e9ab275ba00ff3bf2337
4
- data.tar.gz: 63fe30887b06905f4d0de3d780559d3fe6f68e4d1718a499b49d68222281690e
3
+ metadata.gz: 8c8aba5b27eb6b2b852217b3c4ba1652d78fee2fd291ce2a14e8cfc36da9ea5f
4
+ data.tar.gz: 321cf32a34decf2b526b6ae4231df91cf8a7d07c96b55a211b25582e701c9abe
5
5
  SHA512:
6
- metadata.gz: 9eb140ef0546ab98091237959f7318d10a70eee753419f173aaaa7d36532ed7688bf6de432ade2c14d8d6e872b03887cd9e5128db6476aba21ff75278b3f8edd
7
- data.tar.gz: ebf0496b94a294d4a9bd29e4a20ddb13152cd6e8ce333c0c25f8d8a746000b2bc1372a745cc522df7f269e20f7aeffde12d1a61c37a4ea07dbf4c903f5c38ba0
6
+ metadata.gz: d4ba1cd320aeaca4076180463c47d0d802fa3c0c9672a34326bbef2cd39ce6308b1209454792eccc2a534aec8476c840413b9f4cdddbd8cf248ef0f7205c1f0f
7
+ data.tar.gz: f5dd45b49cec16dcfdca6994646d6083242cfc8cb1357ec687786bfb73f24390af6b940fe49570ab0183d6507c79c4bb29581c5fdd40caa208a4bc2d3666845d
@@ -1 +1 @@
1
- 1.11.0
1
+ 1.12.0
@@ -0,0 +1,253 @@
1
+ {
2
+ "spec": "1.12.0",
3
+ "locale": "bg",
4
+ "cases": [
5
+ {
6
+ "id": "bg-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "Той каза: \"не\" и си тръгна.",
10
+ "out": "Той каза: „не“ и си тръгна.",
11
+ "note": "ИБЕ, s.v. «кавички»: the base form is „…“ (U+201E, U+201C); the close is U+201C, not U+201D."
12
+ },
13
+ {
14
+ "id": "bg-quotes-nested-same-pair",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "Той каза: \"стихотворението \"Кафене Славия\" е хубаво\" и спря.",
18
+ "out": "Той каза: „стихотворението „Кафене Славия“ е хубаво“ и спря.",
19
+ "note": "ОПР т. 135.1.5, via ИБЕ: a quote inside a quote takes the same „ “ pair, so the inner level is not a different glyph."
20
+ },
21
+ {
22
+ "id": "bg-quotes-nested-single-straight",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "Той каза: \"стихотворението 'Кафене' е хубаво\".",
26
+ "out": "Той каза: „стихотворението „Кафене“ е хубаво“.",
27
+ "note": "A straight single mark inside a double quote becomes the secondary pair, which in bg equals the primary pair."
28
+ },
29
+ {
30
+ "id": "bg-quotes-already-typeset-kept",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "Той каза: „стихотворението „Кафене Славия“ е хубаво“ и спря.",
34
+ "out": "Той каза: „стихотворението „Кафене Славия“ е хубаво“ и спря.",
35
+ "note": "Already typeset at both levels: left as it is."
36
+ },
37
+ {
38
+ "id": "bg-quotes-nest-at-end-declined",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "Той каза: \"това е 'Славия'\".",
42
+ "out": "Той каза: \"това е ’Славия'\".",
43
+ "note": "Accepted miss: secondary equals primary, so a nest whose inner mark touches the outer one is declined by the quotes rule (quotes.md §3.2 V1, §3.5), and apostrophe then turns the inner opening mark into U+2019. Pinned as measured; the cost of the identical pair."
44
+ },
45
+ {
46
+ "id": "bg-quotes-nest-at-end-double-declined",
47
+ "rule": "quotes",
48
+ "mode": "text",
49
+ "in": "\"Кафене \"Славия\"\"",
50
+ "out": "\"Кафене \"Славия\"\"",
51
+ "note": "Accepted miss: the ОПР т. 135.1.5 shape typed with straight marks stays entirely straight; the identical pair would put two like glyphs side by side."
52
+ },
53
+ {
54
+ "id": "bg-quotes-nest-at-start-declined",
55
+ "rule": "quotes",
56
+ "mode": "text",
57
+ "in": "\"'b' a\"",
58
+ "out": "\"'b’ a\"",
59
+ "note": "Accepted miss: the inner mark at the start of the outer quote; the decline leaves a half-typeset result."
60
+ },
61
+ {
62
+ "id": "bg-quotes-decline-spreads",
63
+ "rule": "quotes",
64
+ "mode": "text",
65
+ "in": "\"x\" и \"a 'b'\"",
66
+ "out": "\"x\" и \"a ’b'\"",
67
+ "note": "Accepted miss: the decline is not local, the plain pair before the failing nest also stays straight."
68
+ },
69
+ {
70
+ "id": "bg-quotes-no-inner-space",
71
+ "rule": "quotes",
72
+ "mode": "text",
73
+ "in": "„ не “",
74
+ "out": "„не“",
75
+ "note": "ИБЕ spacing article: no space inside the marks."
76
+ },
77
+ {
78
+ "id": "bg-ellipsis-three-dots",
79
+ "rule": "ellipsis",
80
+ "mode": "text",
81
+ "in": "Чакай... какво?",
82
+ "out": "Чакай… какво?",
83
+ "note": "ИБЕ №2158: three dots, not four; the mark attaches to the preceding word."
84
+ },
85
+ {
86
+ "id": "bg-ellipsis-not-abbreviated",
87
+ "rule": "ellipsis",
88
+ "mode": "text",
89
+ "in": "Наистина?.. да",
90
+ "out": "Наистина?… да",
91
+ "note": "abbreviatedAfterTerminal is false: `?..` is a typing slip, not an abbreviated ellipsis (decision, no source)."
92
+ },
93
+ {
94
+ "id": "bg-dashes-parenthetical",
95
+ "rule": "dashes",
96
+ "mode": "text",
97
+ "in": "Утре - ако вали - няма да дойда.",
98
+ "out": "Утре – ако вали – няма да дойда.",
99
+ "note": "ИБЕ №572: a space before and after the long dash; U+2013 by decision."
100
+ },
101
+ {
102
+ "id": "bg-dashes-existing-em-dash",
103
+ "rule": "dashes",
104
+ "mode": "text",
105
+ "in": "Утре — ако вали — няма да дойда.",
106
+ "out": "Утре – ако вали – няма да дойда.",
107
+ "note": "An authored em dash becomes the locale's en dash (the DGT handbook's U+2014 is house style)."
108
+ },
109
+ {
110
+ "id": "bg-ranges-years-hyphen",
111
+ "rule": "ranges",
112
+ "mode": "text",
113
+ "in": "през 2000-2010 г. и I-II в.",
114
+ "out": "през 2000 – 2010 г. и I-II в.",
115
+ "note": "ranges.md §3: ОПР т. 103.4 prints «2000 – 2010 г.» with spaces; the Roman-numeral member is declined, so `I-II` stays.",
116
+ "rules": {
117
+ "ranges": true
118
+ }
119
+ },
120
+ {
121
+ "id": "bg-ranges-en-dash-gets-spaces",
122
+ "rule": "ranges",
123
+ "mode": "text",
124
+ "in": "2000–2010 г.",
125
+ "out": "2000 – 2010 г.",
126
+ "note": "ranges.md §3: a tight en dash is the pre-2012 form and takes the spaced form.",
127
+ "rules": {
128
+ "ranges": true
129
+ }
130
+ },
131
+ {
132
+ "id": "bg-ranges-spaced-kept",
133
+ "rule": "ranges",
134
+ "mode": "text",
135
+ "in": "2000 – 2010 г.",
136
+ "out": "2000 – 2010 г.",
137
+ "note": "ranges.md §3: the spaced en dash is already the correct form.",
138
+ "rules": {
139
+ "ranges": true
140
+ }
141
+ },
142
+ {
143
+ "id": "bg-ranges-dates",
144
+ "rule": "ranges",
145
+ "mode": "text",
146
+ "in": "13.10. - 20.11.2018 г.",
147
+ "out": "13.10. – 20.11.2018 г.",
148
+ "note": "ranges.md §3: ОПР т. 109.4 prints «13.10. – 20.11.2018 г.».",
149
+ "rules": {
150
+ "ranges": true
151
+ }
152
+ },
153
+ {
154
+ "id": "bg-ranges-word-hyphen-untouched",
155
+ "rule": "ranges",
156
+ "mode": "text",
157
+ "in": "Българо-руски речник",
158
+ "out": "Българо-руски речник",
159
+ "note": "ranges.md §3: a hyphenated word is not a digit range and is left alone.",
160
+ "rules": {
161
+ "ranges": true
162
+ }
163
+ },
164
+ {
165
+ "id": "bg-hyphen-noop",
166
+ "rule": "hyphen",
167
+ "mode": "text",
168
+ "in": "северо-западен и по-добър",
169
+ "out": "северо-западен и по-добър",
170
+ "note": "ОПР т. 65–66 govern syllable breaks only; no list ships, nothing changes."
171
+ },
172
+ {
173
+ "id": "bg-nbsp-units",
174
+ "rule": "nbsp",
175
+ "mode": "text",
176
+ "in": "100 км, 5 кг и 20 лв.",
177
+ "out": "100 км, 5 кг и 20 лв.",
178
+ "note": "ИБЕ №1601: a space separates the unit or abbreviation from its number."
179
+ },
180
+ {
181
+ "id": "bg-nbsp-year-abbreviation",
182
+ "rule": "nbsp",
183
+ "mode": "text",
184
+ "in": "през 2020 г. беше",
185
+ "out": "през 2020 г. беше",
186
+ "note": "ИБЕ №1601: «2020 г.» with a space."
187
+ },
188
+ {
189
+ "id": "bg-nbsp-percent-inert",
190
+ "rule": "nbsp",
191
+ "mode": "text",
192
+ "in": "5% и 5 %",
193
+ "out": "5% и 5 %",
194
+ "note": "ИБЕ №626 writes 5% without a space, so % is not a unit here and nothing is bound."
195
+ },
196
+ {
197
+ "id": "bg-nbsp-single-letter-unit-inert",
198
+ "rule": "nbsp",
199
+ "mode": "text",
200
+ "in": "10 м и 5 с",
201
+ "out": "10 м и 5 с",
202
+ "note": "Single-letter symbols are excluded by decision, not by citation (ИБЕ №1601 writes «10 м» with a space): `с` is a Bulgarian preposition."
203
+ },
204
+ {
205
+ "id": "bg-nbsp-short-words-inert",
206
+ "rule": "nbsp",
207
+ "mode": "text",
208
+ "in": "в къщата и с приятел",
209
+ "out": "в къщата и с приятел",
210
+ "note": "afterShortWords ships empty: no source gives a rule for в, с, к, и."
211
+ },
212
+ {
213
+ "id": "bg-nbsp-initials-unbound",
214
+ "rule": "nbsp",
215
+ "mode": "text",
216
+ "in": "Иван Вазов и И. Вазов",
217
+ "out": "Иван Вазов и И. Вазов",
218
+ "note": "initialBinding is none: no source states a rule on initials."
219
+ },
220
+ {
221
+ "id": "bg-nbsp-no-space-before-question",
222
+ "rule": "nbsp",
223
+ "mode": "text",
224
+ "in": "Наистина ? Да !",
225
+ "out": "Наистина? Да!",
226
+ "note": "ИБЕ spacing article: no space before ? and !, so nothing is put back."
227
+ },
228
+ {
229
+ "id": "bg-spaces-brackets",
230
+ "rule": "spaces",
231
+ "mode": "text",
232
+ "in": "Текст ( нормален ) остава .",
233
+ "out": "Текст (нормален) остава.",
234
+ "note": "spaces.md: brackets tighten, no space before the final stop."
235
+ },
236
+ {
237
+ "id": "bg-symbols-copyright",
238
+ "rule": "symbols",
239
+ "mode": "text",
240
+ "in": "Copyright (c) 2026",
241
+ "out": "Copyright © 2026",
242
+ "note": "symbols rule, locale-neutral."
243
+ },
244
+ {
245
+ "id": "bg-apostrophe-foreign-name",
246
+ "rule": "apostrophe",
247
+ "mode": "text",
248
+ "in": "Това е McDonald's",
249
+ "out": "Това е McDonald’s",
250
+ "note": "apostrophe rule, locale-neutral."
251
+ }
252
+ ]
253
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "cs",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "de-CH",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "de-DE",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "el",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "en-GB",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "en-US",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "es",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "fi",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "fr-CA",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.11.0",
2
+ "spec": "1.12.0",
3
3
  "locale": "fr",
4
4
  "cases": [
5
5
  {
@@ -0,0 +1,253 @@
1
+ {
2
+ "spec": "1.12.0",
3
+ "locale": "hr",
4
+ "cases": [
5
+ {
6
+ "id": "hr-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "Rekao je: \"da\" i otišao.",
10
+ "out": "Rekao je: „da” i otišao.",
11
+ "note": "Hrvatski pravopis 8.16: the base form is „…” (U+201E, U+201D); the close is U+201D, not U+201C."
12
+ },
13
+ {
14
+ "id": "hr-quotes-nested-secondary",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "Rekao je: \"pjesma 'Lijepa naša' je himna\" i otišao.",
18
+ "out": "Rekao je: „pjesma ‘Lijepa naša’ je himna” i otišao.",
19
+ "note": "Hrvatski pravopis 8.17: a quotation inside a quotation takes the single upper pair ‘…’ (U+2018, U+2019), not the low U+201A."
20
+ },
21
+ {
22
+ "id": "hr-quotes-nested-at-end",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "Rekao je: \"pjesma 'Lijepa naša'\".",
26
+ "out": "Rekao je: „pjesma ‘Lijepa naša’”.",
27
+ "note": "Hrvatski pravopis 8.17: the inner level may end where the outer one does; the secondary pair differs from the primary, so nothing is declined."
28
+ },
29
+ {
30
+ "id": "hr-quotes-two-pairs",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "x \"a\" y \"b 'c'\"",
34
+ "out": "x „a” y „b ‘c’”",
35
+ "note": "Two sibling pairs, the second with a nest: both are typeset."
36
+ },
37
+ {
38
+ "id": "hr-quotes-already-typeset-kept",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "Rekao je: „pjesma ‘Lijepa naša’ je himna” i otišao.",
42
+ "out": "Rekao je: „pjesma ‘Lijepa naša’ je himna” i otišao.",
43
+ "note": "Already typeset at both levels: left as it is."
44
+ },
45
+ {
46
+ "id": "hr-quotes-no-inner-space",
47
+ "rule": "quotes",
48
+ "mode": "text",
49
+ "in": "„ da ”",
50
+ "out": "„da”",
51
+ "note": "Hrvatski pravopis 8.16: no space after the opening or before the closing mark."
52
+ },
53
+ {
54
+ "id": "hr-ellipsis-three-dots",
55
+ "rule": "ellipsis",
56
+ "mode": "text",
57
+ "in": "Čekaj... što?",
58
+ "out": "Čekaj… što?",
59
+ "note": "Hrvatski pravopis 8.10: three dots become the single ellipsis character."
60
+ },
61
+ {
62
+ "id": "hr-ellipsis-not-abbreviated",
63
+ "rule": "ellipsis",
64
+ "mode": "text",
65
+ "in": "Što?.. da",
66
+ "out": "Što?… da",
67
+ "note": "abbreviatedAfterTerminal is false: `?..` is an ordinary ellipsis after the question mark, not a two-dot abbreviated one (decision; neither 8.10 nor 8.3 states a two-dot form)."
68
+ },
69
+ {
70
+ "id": "hr-dashes-parenthetical",
71
+ "rule": "dashes",
72
+ "mode": "text",
73
+ "in": "Idemo - ako pada - kasnije.",
74
+ "out": "Idemo – ako pada – kasnije.",
75
+ "note": "Hrvatski pravopis 8.14: the dash is written with a space on each side; U+2013 read from rendered text."
76
+ },
77
+ {
78
+ "id": "hr-dashes-existing-em-dash",
79
+ "rule": "dashes",
80
+ "mode": "text",
81
+ "in": "Idemo — ako pada — kasnije.",
82
+ "out": "Idemo – ako pada – kasnije.",
83
+ "note": "An authored em dash becomes the locale's en dash: 8.14 does not mention U+2014."
84
+ },
85
+ {
86
+ "id": "hr-ranges-year-tight-untouched",
87
+ "rule": "ranges",
88
+ "mode": "text",
89
+ "in": "2010.-2012.",
90
+ "out": "2010.-2012.",
91
+ "note": "ranges.md §3.2: the left flank of the hyphen is the ordinal period U+002E, not a digit, so this attested year form is not a range candidate and stays as typed.",
92
+ "rules": {
93
+ "ranges": true
94
+ }
95
+ },
96
+ {
97
+ "id": "hr-ranges-year-spaced-gets-en-dash",
98
+ "rule": "ranges",
99
+ "mode": "text",
100
+ "in": "2010. - 2012.",
101
+ "out": "2010. – 2012.",
102
+ "note": "ranges.md §3: a spaced hyphen between years is taken by the dashes rule and becomes the spaced en dash that 8.14 prints («2010. – 2012.»).",
103
+ "rules": {
104
+ "ranges": true
105
+ }
106
+ },
107
+ {
108
+ "id": "hr-ranges-digits",
109
+ "rule": "ranges",
110
+ "mode": "text",
111
+ "in": "Posjeti: 15-17 i 30-45",
112
+ "out": "Posjeti: 15 – 17 i 30 – 45",
113
+ "note": "ranges.md §3: 8.1 prints «Posjeti: 15 – 17»; digit-to-digit hyphens take the spaced en dash.",
114
+ "rules": {
115
+ "ranges": true
116
+ }
117
+ },
118
+ {
119
+ "id": "hr-ranges-page-range-spaced",
120
+ "rule": "ranges",
121
+ "mode": "text",
122
+ "in": "str. 145-162",
123
+ "out": "str. 145 – 162",
124
+ "note": "ranges.md §3: ACCEPTED COST. 8.14 writes bibliographic page ranges tight («str. 145–162»), but locale data cannot select by context, so the rule spaces them (the ranges rule is off by default).",
125
+ "rules": {
126
+ "ranges": true
127
+ }
128
+ },
129
+ {
130
+ "id": "hr-ranges-word-hyphen-untouched",
131
+ "rule": "ranges",
132
+ "mode": "text",
133
+ "in": "Zagreb-Split i hrvatsko-engleski",
134
+ "out": "Zagreb-Split i hrvatsko-engleski",
135
+ "note": "ranges.md §3: a hyphenated word is not a digit range and is left alone.",
136
+ "rules": {
137
+ "ranges": true
138
+ }
139
+ },
140
+ {
141
+ "id": "hr-hyphen-noop",
142
+ "rule": "hyphen",
143
+ "mode": "text",
144
+ "in": "hrvatsko-engleski rječnik i bez-",
145
+ "out": "hrvatsko-engleski rječnik i bez-",
146
+ "note": "Hrvatski pravopis 8.13: breaking at a hyphen is provided for and no closed list ships, so nothing changes."
147
+ },
148
+ {
149
+ "id": "hr-nbsp-units",
150
+ "rule": "nbsp",
151
+ "mode": "text",
152
+ "in": "3 kg, 50 %, 0,5 ‰, 99,90 € i 5 °C",
153
+ "out": "3 kg, 50 %, 0,5 ‰, 99,90 € i 5 °C",
154
+ "note": "Hrvatski pravopis 8.1 and 8.19.11: a space separates the number from the unit, percent, per-mille, currency sign and degree Celsius."
155
+ },
156
+ {
157
+ "id": "hr-nbsp-single-letter-unit-inert",
158
+ "rule": "nbsp",
159
+ "mode": "text",
160
+ "in": "2 m, 220 V i 60 W",
161
+ "out": "2 m, 220 V i 60 W",
162
+ "note": "Single-letter symbols are excluded by decision (8.1 writes «2 m» with a space), as in sk and bg."
163
+ },
164
+ {
165
+ "id": "hr-nbsp-defunct-currency-inert",
166
+ "rule": "nbsp",
167
+ "mode": "text",
168
+ "in": "34 kn",
169
+ "out": "34 kn",
170
+ "note": "kn is excluded as defunct (decision, not citation); 8.1 still prints «34 kn»."
171
+ },
172
+ {
173
+ "id": "hr-nbsp-article-sign",
174
+ "rule": "nbsp",
175
+ "mode": "text",
176
+ "in": "§ 25. i § 3",
177
+ "out": "§ 25. i § 3",
178
+ "note": "Hrvatski pravopis 8.1 and 8.19.8: the section sign is separated from its number by a space."
179
+ },
180
+ {
181
+ "id": "hr-nbsp-page-abbreviation",
182
+ "rule": "nbsp",
183
+ "mode": "text",
184
+ "in": "str. 12",
185
+ "out": "str. 12",
186
+ "note": "beforeNumber lists str., from «str. 145–162» in 8.14 (form evidence; a decision, MEDIUM)."
187
+ },
188
+ {
189
+ "id": "hr-nbsp-complex-abbreviations",
190
+ "rule": "nbsp",
191
+ "mode": "text",
192
+ "in": "tvrtka d. o. o. i dipl. ing. Ivo",
193
+ "out": "tvrtka d. o. o. i dipl. ing. Ivo",
194
+ "note": "Hrvatski pravopis 8.13 rule 6: complex abbreviations such as dipl. ing. and d. o. o. should not be split at a line end."
195
+ },
196
+ {
197
+ "id": "hr-nbsp-other-abbreviations-inert",
198
+ "rule": "nbsp",
199
+ "mode": "text",
200
+ "in": "d. d. i dr. sc. Ana",
201
+ "out": "d. d. i dr. sc. Ana",
202
+ "note": "The other spaced abbreviations of 7.1 are not listed: extending 8.13's line-break intent to them would be a derivation, not a citation."
203
+ },
204
+ {
205
+ "id": "hr-nbsp-short-words-inert",
206
+ "rule": "nbsp",
207
+ "mode": "text",
208
+ "in": "u kući i s prijateljem",
209
+ "out": "u kući i s prijateljem",
210
+ "note": "afterShortWords ships empty: no online section of the pravopis states a rule for one-letter prepositions or conjunctions at a line end."
211
+ },
212
+ {
213
+ "id": "hr-nbsp-initials-unbound",
214
+ "rule": "nbsp",
215
+ "mode": "text",
216
+ "in": "A. G. Matoš",
217
+ "out": "A. G. Matoš",
218
+ "note": "initialBinding is none: 7.3 and 8.1 give the spaced form of initials and say nothing about line breaks."
219
+ },
220
+ {
221
+ "id": "hr-nbsp-no-space-before-question",
222
+ "rule": "nbsp",
223
+ "mode": "text",
224
+ "in": "Što ? Da !",
225
+ "out": "Što? Da!",
226
+ "note": "Hrvatski pravopis 8.1: no space before ? and !, so nothing is put back."
227
+ },
228
+ {
229
+ "id": "hr-spaces-brackets",
230
+ "rule": "spaces",
231
+ "mode": "text",
232
+ "in": "Tekst ( normalan ) ostaje .",
233
+ "out": "Tekst (normalan) ostaje.",
234
+ "note": "spaces.md: brackets tighten, no space before the final stop."
235
+ },
236
+ {
237
+ "id": "hr-symbols-copyright",
238
+ "rule": "symbols",
239
+ "mode": "text",
240
+ "in": "Copyright (c) 2026",
241
+ "out": "Copyright © 2026",
242
+ "note": "symbols rule, locale-neutral."
243
+ },
244
+ {
245
+ "id": "hr-apostrophe-foreign-name",
246
+ "rule": "apostrophe",
247
+ "mode": "text",
248
+ "in": "To je McDonald's",
249
+ "out": "To je McDonald’s",
250
+ "note": "apostrophe rule, locale-neutral; 8.18 uses U+2019 for the elision mark as well."
251
+ }
252
+ ]
253
+ }