polytypo 1.13.0 → 1.15.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/polytypo/data/VERSION +1 -1
  4. data/lib/polytypo/data/fixtures/bg.json +1 -1
  5. data/lib/polytypo/data/fixtures/cs.json +1 -1
  6. data/lib/polytypo/data/fixtures/de-CH.json +1 -1
  7. data/lib/polytypo/data/fixtures/de-DE.json +1 -1
  8. data/lib/polytypo/data/fixtures/el.json +1 -1
  9. data/lib/polytypo/data/fixtures/en-GB.json +1 -1
  10. data/lib/polytypo/data/fixtures/en-US.json +1 -1
  11. data/lib/polytypo/data/fixtures/es.json +1 -1
  12. data/lib/polytypo/data/fixtures/fi.json +1 -1
  13. data/lib/polytypo/data/fixtures/fr-CA.json +1 -1
  14. data/lib/polytypo/data/fixtures/fr.json +1 -1
  15. data/lib/polytypo/data/fixtures/hr.json +1 -1
  16. data/lib/polytypo/data/fixtures/hu.json +1 -1
  17. data/lib/polytypo/data/fixtures/it.json +1 -1
  18. data/lib/polytypo/data/fixtures/locale-resolution.json +1 -1
  19. data/lib/polytypo/data/fixtures/nl.json +1 -1
  20. data/lib/polytypo/data/fixtures/pl.json +1 -1
  21. data/lib/polytypo/data/fixtures/pt-BR.json +1 -1
  22. data/lib/polytypo/data/fixtures/pt-PT.json +1 -1
  23. data/lib/polytypo/data/fixtures/ro.json +1 -1
  24. data/lib/polytypo/data/fixtures/ru.json +1 -1
  25. data/lib/polytypo/data/fixtures/sk.json +1 -1
  26. data/lib/polytypo/data/fixtures/sl.json +247 -0
  27. data/lib/polytypo/data/fixtures/sr.json +183 -0
  28. data/lib/polytypo/data/fixtures/sv.json +1 -1
  29. data/lib/polytypo/data/fixtures/tr.json +1 -1
  30. data/lib/polytypo/data/fixtures/uk.json +1 -1
  31. data/lib/polytypo/data/locales/registry.json +4 -2
  32. data/lib/polytypo/data/locales/sl.json +82 -0
  33. data/lib/polytypo/data/locales/sr.json +82 -0
  34. data/lib/polytypo/data/rules/order.json +1 -1
  35. data/lib/polytypo/errors.rb +1 -1
  36. data/lib/polytypo/version.rb +1 -1
  37. metadata +5 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5085a8645d4f2ef3be4dfc709d3be2ddeadee79c69b4a12c3fe3f2fa771f9099
4
- data.tar.gz: e6994423f5fc58dc7142b27deae4dfb1504dbda181370c9d349feb9682a3672f
3
+ metadata.gz: d2bab0efc918f7a01ecea6058420525619d73371f49a994d4b96298493634823
4
+ data.tar.gz: e61264965c63d676674b02c1f2b52a2363b50c567cad449eb83d6f08e8b6b85b
5
5
  SHA512:
6
- metadata.gz: 90dcb32715c71d9305f6d71730409c232cdf13d920a0e2173444832c534c8a1195e7149d322484de45afad87a51b8c0fb22d0a30df8cd1408fbdf43331a14ebc
7
- data.tar.gz: d365d8dec671abfb9230edb85509cc8a2ef0aaa87a6df4a6dd3bedbac2bacccea7752b9cd2b15cadaf9f7f023dbe49fa3ce3244ff16457534b7e8de97cb44394
6
+ metadata.gz: 7c1e0d2fad416baf3b346ba6d4364e7b5ad27f29dc3b92c51dc94a79a31a5dc4c0beaddc1eb701cb15419b5a186d8632e39aa06c7862a8a542751d0093f5091e
7
+ data.tar.gz: bab8b97e60ee90d1758373f8e05f061e7647ca3f0c56d432d8d7cdccc8a0ab727e4ac0f585049178c6f5295eeb5664fbbd01ccc573fbc737e80455a7a5d6c26e
data/README.md CHANGED
@@ -155,7 +155,7 @@ no-break one back), so replaying the list is not guaranteed to reproduce the out
155
155
 
156
156
  ### Errors
157
157
 
158
- Every error `Polytypo.transform` raises is a `Polytypo::Error` carrying one of seven stable
158
+ Every error `Polytypo.transform` raises is a `Polytypo::Error` carrying one of eight stable
159
159
  codes — check `#code`, not the message text, which is English and informative but not part of
160
160
  the contract:
161
161
 
@@ -1 +1 @@
1
- 1.13.0
1
+ 1.15.0
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "bg",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "cs",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "de-CH",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "de-DE",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "el",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "en-GB",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "en-US",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "es",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "fi",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "fr-CA",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "fr",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "hr",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "hu",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "it",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "cases": [
4
4
  {
5
5
  "id": "exact-en-us",
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "nl",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "pl",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "pt-BR",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "pt-PT",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "ro",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "ru",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "sk",
4
4
  "cases": [
5
5
  {
@@ -0,0 +1,247 @@
1
+ {
2
+ "spec": "1.15.0",
3
+ "locale": "sl",
4
+ "cases": [
5
+ {
6
+ "id": "sl-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "Rekel je: \"da\" in odšel.",
10
+ "out": "Rekel je: »da« in odšel.",
11
+ "note": "Slovenski pravopis 2001 §461 lists the double middle pair » « (U+00BB open, U+00AB close) first and every example uses it; chosen by decision. The low-high pair is handwriting (§465)."
12
+ },
13
+ {
14
+ "id": "sl-quotes-nested-secondary",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "Rekel je: \"pesem 'Zdravljica' je himna\" in odšel.",
18
+ "out": "Rekel je: »pesem ›Zdravljica‹ je himna« in odšel.",
19
+ "note": "Slovenski pravopis 2001 §461: a quotation inside a quotation takes the single middle pair › ‹ (U+203A, U+2039), by decision (§463's own example nests „…“ and ‚…‘)."
20
+ },
21
+ {
22
+ "id": "sl-quotes-nested-at-end",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "Rekel je: \"pesem 'Zdravljica'\".",
26
+ "out": "Rekel je: »pesem ›Zdravljica‹«.",
27
+ "note": "Slovenski pravopis 2001 §463: the inner level may end where the outer one does."
28
+ },
29
+ {
30
+ "id": "sl-quotes-before-question-mark",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "Ali res? \"Da!\" je rekel.",
34
+ "out": "Ali res? »Da!« je rekel.",
35
+ "note": "Slovenski pravopis 2001 §461: the close U+00AB follows the sentence mark flush; innerSpace is none."
36
+ },
37
+ {
38
+ "id": "sl-quotes-question-inside",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "\"Kaj?\" je vprašal.",
42
+ "out": "»Kaj?« je vprašal.",
43
+ "note": "Slovenski pravopis 2001 §461: a quote that opens a sentence takes U+00BB, flush against the text."
44
+ },
45
+ {
46
+ "id": "sl-quotes-reversed-guillemets",
47
+ "rule": "quotes",
48
+ "mode": "text",
49
+ "in": "Rekel je «da» in odšel.",
50
+ "out": "Rekel je »da« in odšel.",
51
+ "note": "Slovenski pravopis 2001 §461: input with the guillemets the French way round is normalised to » « (U+00BB open, U+00AB close)."
52
+ },
53
+ {
54
+ "id": "sl-quotes-low-high-input",
55
+ "rule": "quotes",
56
+ "mode": "text",
57
+ "in": "Rekel je „da“ in odšel.",
58
+ "out": "Rekel je »da« in odšel.",
59
+ "note": "Slovenski pravopis 2001 §465: the low-high pair is the handwriting form; typeset text takes » «."
60
+ },
61
+ {
62
+ "id": "sl-quotes-already-typeset-nested",
63
+ "rule": "quotes",
64
+ "mode": "text",
65
+ "in": "»pesem ›Zdravljica‹ je himna«",
66
+ "out": "»pesem ›Zdravljica‹ je himna«",
67
+ "note": "Slovenski pravopis 2001 §461: an already-typeset nested pair » › ‹ « is a fixed point."
68
+ },
69
+ {
70
+ "id": "sl-quotes-already-typeset-question",
71
+ "rule": "quotes",
72
+ "mode": "text",
73
+ "in": "»Ali prideš?« je vprašal.",
74
+ "out": "»Ali prideš?« je vprašal.",
75
+ "note": "Slovenski pravopis 2001 §461: a question mark inside already-typeset » « stays flush before the close."
76
+ },
77
+ {
78
+ "id": "sl-quotes-already-typeset",
79
+ "rule": "quotes",
80
+ "mode": "text",
81
+ "in": "Rekel je »da« in odšel.",
82
+ "out": "Rekel je »da« in odšel.",
83
+ "note": "Slovenski pravopis 2001 §461: text that already carries » « is a fixed point; a primary opener of U+00BB is not read as a closer."
84
+ },
85
+ {
86
+ "id": "sl-quotes-already-typeset-comma",
87
+ "rule": "quotes",
88
+ "mode": "text",
89
+ "in": "»Dobro,« je dejal.",
90
+ "out": "»Dobro,« je dejal.",
91
+ "note": "Slovenski pravopis 2001 §461: a comma inside the quote before the close stays; already-typeset input is unchanged."
92
+ },
93
+ {
94
+ "id": "sl-quotes-no-inner-space",
95
+ "rule": "quotes",
96
+ "mode": "text",
97
+ "in": "Rekel je: \" da \" in odšel.",
98
+ "out": "Rekel je: »da« in odšel.",
99
+ "note": "Slovenski pravopis 2001 §461: no space after the opener or before the closer (innerSpace none); the stray spaces inside the straight quotes are dropped."
100
+ },
101
+ {
102
+ "id": "sl-quotes-stray-period-after",
103
+ "rule": "quotes",
104
+ "mode": "text",
105
+ "in": "Vprašal je: \"Kaj?\".",
106
+ "out": "Vprašal je: »Kaj?«.",
107
+ "note": "Slovenski pravopis 2001 §461: the closing quote sits flush before the final period."
108
+ },
109
+ {
110
+ "id": "sl-ellipsis-three-dots",
111
+ "rule": "ellipsis",
112
+ "mode": "text",
113
+ "in": "Počakaj... in potem.",
114
+ "out": "Počakaj… in potem.",
115
+ "note": "Slovenski pravopis 2001 §399 Tri pike: three dots become one U+2026."
116
+ },
117
+ {
118
+ "id": "sl-ellipsis-not-abbreviated",
119
+ "rule": "ellipsis",
120
+ "mode": "text",
121
+ "in": "Kaj...?",
122
+ "out": "Kaj…?",
123
+ "note": "Slovenski pravopis 2001 §§399–410: no two-dot form after a terminal is prescribed (abbreviatedAfterTerminal false); the ellipsis stays whole before the mark."
124
+ },
125
+ {
126
+ "id": "sl-dashes-parenthetical",
127
+ "rule": "dashes",
128
+ "mode": "text",
129
+ "in": "Rekel je - seveda - da pride.",
130
+ "out": "Rekel je – seveda – da pride.",
131
+ "note": "Slovenski pravopis 2001 §228: the dash is set with a space on both sides; navadni pomišljaj is U+2013."
132
+ },
133
+ {
134
+ "id": "sl-dashes-existing-en",
135
+ "rule": "dashes",
136
+ "mode": "text",
137
+ "in": "Sin – hči sta prišla.",
138
+ "out": "Sin – hči sta prišla.",
139
+ "note": "Slovenski pravopis 2001 §228, §378: an en dash already spaced is left alone."
140
+ },
141
+ {
142
+ "id": "sl-ranges-digits-tight",
143
+ "rule": "ranges",
144
+ "mode": "text",
145
+ "in": "vojna 1941-1945 in str. 125-132",
146
+ "out": "vojna 1941⁠–⁠1945 in str. 125⁠–⁠132",
147
+ "note": "Slovenski pravopis 2001 §394: the dash for od … do is written closed up: v letih 1941–1945, str. 125–132. ranges.md §3: the en-tight form carries U+2060 on both sides.",
148
+ "rules": {
149
+ "ranges": true
150
+ }
151
+ },
152
+ {
153
+ "id": "sl-ranges-already-tight",
154
+ "rule": "ranges",
155
+ "mode": "text",
156
+ "in": "v letih 1941–1945",
157
+ "out": "v letih 1941–1945",
158
+ "note": "Slovenski pravopis 2001 §394, ranges.md §3: an en dash between digits gets the same en-tight treatment and the result is a fixed point.",
159
+ "rules": {
160
+ "ranges": true
161
+ }
162
+ },
163
+ {
164
+ "id": "sl-ranges-word-hyphen-untouched",
165
+ "rule": "ranges",
166
+ "mode": "text",
167
+ "in": "proga Ljubljana-Trst",
168
+ "out": "proga Ljubljana-Trst",
169
+ "note": "Slovenski pravopis 2001 §394, ranges.md §2: a hyphen between words is not a range; only digit flanks qualify.",
170
+ "rules": {
171
+ "ranges": true
172
+ }
173
+ },
174
+ {
175
+ "id": "sl-hyphen-noop",
176
+ "rule": "hyphen",
177
+ "mode": "text",
178
+ "in": "slovensko-angleški slovar",
179
+ "out": "slovensko-angleški slovar",
180
+ "note": "Slovenski pravopis 2001 §608: breaking at the hyphen is provided for, so the hyphen lists are empty and the text is unchanged."
181
+ },
182
+ {
183
+ "id": "sl-nbsp-units",
184
+ "rule": "nbsp",
185
+ "mode": "text",
186
+ "in": "10 % in 5 € in 38 °C in 10 kg in 3 km in 16 ‰",
187
+ "out": "10 % in 5 € in 38 °C in 10 kg in 3 km in 16 ‰",
188
+ "note": "Slovenski pravopis 2001 §610: units follow the number without a break (5 m, 10 kg); § 259 «38 °C»; the draft lists % ‰ €. beforeUnits binds each with U+00A0."
189
+ },
190
+ {
191
+ "id": "sl-nbsp-single-letter-unit-inert",
192
+ "rule": "nbsp",
193
+ "mode": "text",
194
+ "in": "5 m in 3 a",
195
+ "out": "5 m in 3 a",
196
+ "note": "Slovenski pravopis 2001 §610 names m, but single-letter units are excluded by decision (m, a are common words or initials); nothing is bound."
197
+ },
198
+ {
199
+ "id": "sl-nbsp-abbreviation-ti",
200
+ "rule": "nbsp",
201
+ "mode": "text",
202
+ "in": "glej t. i. pojem",
203
+ "out": "glej t. i. pojem",
204
+ "note": "Slovenski pravopis 2001 §595: t. i. is written with a space; the draft states the no-break intent. abbreviations binds it with U+00A0."
205
+ },
206
+ {
207
+ "id": "sl-nbsp-section-sign",
208
+ "rule": "nbsp",
209
+ "mode": "text",
210
+ "in": "glej § 10",
211
+ "out": "glej § 10",
212
+ "note": "Slovenski pravopis 2001 §235 shows § followed by a space and the number; the binding itself is from the Pravopis 8.0 draft (secondary). afterSymbols binds them with U+00A0."
213
+ },
214
+ {
215
+ "id": "sl-nbsp-short-words-inert",
216
+ "rule": "nbsp",
217
+ "mode": "text",
218
+ "in": "v hiši in k mizi",
219
+ "out": "v hiši in k mizi",
220
+ "note": "Slovenski pravopis 2001 §612 concerns word division, not one-letter prepositions; afterShortWords is empty, so nothing is bound."
221
+ },
222
+ {
223
+ "id": "sl-spaces-brackets",
224
+ "rule": "spaces",
225
+ "mode": "text",
226
+ "in": "Rekel ( tiho ) in odšel .",
227
+ "out": "Rekel (tiho) in odšel.",
228
+ "note": "Spaces: no space inside brackets or before a closing mark (spaces.md)."
229
+ },
230
+ {
231
+ "id": "sl-symbols-copyright",
232
+ "rule": "symbols",
233
+ "mode": "text",
234
+ "in": "(c) 2026",
235
+ "out": "© 2026",
236
+ "note": "symbols.md: (c) becomes ©, independent of the locale."
237
+ },
238
+ {
239
+ "id": "sl-apostrophe-foreign-name",
240
+ "rule": "apostrophe",
241
+ "mode": "text",
242
+ "in": "O'Brien je prišel.",
243
+ "out": "O’Brien je prišel.",
244
+ "note": "apostrophe.md: a straight apostrophe inside a foreign name becomes U+2019."
245
+ }
246
+ ]
247
+ }
@@ -0,0 +1,183 @@
1
+ {
2
+ "spec": "1.15.0",
3
+ "locale": "sr",
4
+ "cases": [
5
+ {
6
+ "id": "sr-quotes-primary",
7
+ "rule": "quotes",
8
+ "mode": "text",
9
+ "in": "Рекао је: \"да\" и отишао.",
10
+ "out": "Рекао је: „да” и отишао.",
11
+ "note": "Klikovac 2024 on Pravopis 2010, pp. 343–344: the base form is „…” (U+201E, U+201D); the close is U+201D, not U+201C."
12
+ },
13
+ {
14
+ "id": "sr-quotes-primary-latin",
15
+ "rule": "quotes",
16
+ "mode": "text",
17
+ "in": "Rekao je: \"da\" i otišao.",
18
+ "out": "Rekao je: „da” i otišao.",
19
+ "note": "No rule depends on the script: the Latin spelling gets the same pair."
20
+ },
21
+ {
22
+ "id": "sr-quotes-nested-secondary",
23
+ "rule": "quotes",
24
+ "mode": "text",
25
+ "in": "Рекао је: \"песма 'Лепа' је\" и отишао.",
26
+ "out": "Рекао је: „песма ’Лепа’ је” и отишао.",
27
+ "note": "Klikovac 2024 on Pravopis 2010, p. 361: a quotation inside a quotation takes the single pair, written with U+2019 on both sides."
28
+ },
29
+ {
30
+ "id": "sr-quotes-nested-roundtrip",
31
+ "rule": "quotes",
32
+ "mode": "text",
33
+ "in": "Рекао је: „песма ’Лепа’ је” и отишао.",
34
+ "out": "Рекао је: „песма ’Лепа’ је” и отишао.",
35
+ "note": "The same-glyph secondary pair is a fixed point."
36
+ },
37
+ {
38
+ "id": "sr-quotes-apostrophe-inside-secondary",
39
+ "rule": "quotes",
40
+ "mode": "text",
41
+ "in": "Рекао је: \"песма 'McDonald's' је\" и отишао.",
42
+ "out": "Рекао је: „песма ’McDonald’s’ је” и отишао.",
43
+ "note": "An apostrophe inside the same-glyph secondary pair is kept and the pair still closes; the result is a fixed point."
44
+ },
45
+ {
46
+ "id": "sr-quotes-already-typeset-kept",
47
+ "rule": "quotes",
48
+ "mode": "text",
49
+ "in": "„да” и „не”",
50
+ "out": "„да” и „не”",
51
+ "note": "Already typeset: left as it is."
52
+ },
53
+ {
54
+ "id": "sr-quotes-no-inner-space",
55
+ "rule": "quotes",
56
+ "mode": "text",
57
+ "in": "„ да ”",
58
+ "out": "„да”",
59
+ "note": "No space after the opening or before the closing mark."
60
+ },
61
+ {
62
+ "id": "sr-ellipsis-three-dots",
63
+ "rule": "ellipsis",
64
+ "mode": "text",
65
+ "in": "Чекај... шта?",
66
+ "out": "Чекај… шта?",
67
+ "note": "Pravopis 2010 (via Klikovac, p. 136): three dots, here the single ellipsis character."
68
+ },
69
+ {
70
+ "id": "sr-ellipsis-not-abbreviated",
71
+ "rule": "ellipsis",
72
+ "mode": "text",
73
+ "in": "Шта?.. да",
74
+ "out": "Шта?… да",
75
+ "note": "abbreviatedAfterTerminal is false (decision): `?..` is an ordinary ellipsis."
76
+ },
77
+ {
78
+ "id": "sr-dashes-parenthetical",
79
+ "rule": "dashes",
80
+ "mode": "text",
81
+ "in": "Идемо - ако пада - касније.",
82
+ "out": "Идемо – ако пада – касније.",
83
+ "note": "Klikovac p. 328: the separating dash is spaced; U+2013 is a decision."
84
+ },
85
+ {
86
+ "id": "sr-dashes-existing-em-dash",
87
+ "rule": "dashes",
88
+ "mode": "text",
89
+ "in": "Идемо — ако пада — касније.",
90
+ "out": "Идемо – ако пада – касније.",
91
+ "note": "An authored em dash becomes the locale's en dash."
92
+ },
93
+ {
94
+ "id": "sr-ranges-digits-tight",
95
+ "rule": "ranges",
96
+ "mode": "text",
97
+ "in": "рат 1941-1945 и стр. 145-162",
98
+ "out": "рат 1941⁠–⁠1945 и стр. 145⁠–⁠162",
99
+ "note": "ranges.md §3, Klikovac pp. 330–331: a dash between numbers is closed up («рат 1941–1945»). en-tight inserts U+2060 on both sides of the dash so a line cannot break there (ranges.md).",
100
+ "rules": {
101
+ "ranges": true
102
+ }
103
+ },
104
+ {
105
+ "id": "sr-ranges-already-tight",
106
+ "rule": "ranges",
107
+ "mode": "text",
108
+ "in": "рат 1941–1945",
109
+ "out": "рат 1941–1945",
110
+ "note": "ranges.md §3: already an en dash between numbers: left as it is.",
111
+ "rules": {
112
+ "ranges": true
113
+ }
114
+ },
115
+ {
116
+ "id": "sr-ranges-word-hyphen-untouched",
117
+ "rule": "ranges",
118
+ "mode": "text",
119
+ "in": "Нови Сад-Београд и српско-хрватски",
120
+ "out": "Нови Сад-Београд и српско-хрватски",
121
+ "note": "ranges.md §3: a hyphenated word is not a digit range.",
122
+ "rules": {
123
+ "ranges": true
124
+ }
125
+ },
126
+ {
127
+ "id": "sr-hyphen-noop",
128
+ "rule": "hyphen",
129
+ "mode": "text",
130
+ "in": "српско-хрватски речник и без-",
131
+ "out": "српско-хрватски речник и без-",
132
+ "note": "No closed list ships, so nothing changes."
133
+ },
134
+ {
135
+ "id": "sr-nbsp-units-inert",
136
+ "rule": "nbsp",
137
+ "mode": "text",
138
+ "in": "3 kg, 50 % и 99,90 €",
139
+ "out": "3 kg, 50 % и 99,90 €",
140
+ "note": "No verified rule: every nbsp list ships empty, so the plain spaces stay."
141
+ },
142
+ {
143
+ "id": "sr-nbsp-short-words-inert",
144
+ "rule": "nbsp",
145
+ "mode": "text",
146
+ "in": "у кући и с пријатељем",
147
+ "out": "у кући и с пријатељем",
148
+ "note": "afterShortWords ships empty."
149
+ },
150
+ {
151
+ "id": "sr-nbsp-initials-unbound",
152
+ "rule": "nbsp",
153
+ "mode": "text",
154
+ "in": "Б. Ћопић",
155
+ "out": "Б. Ћопић",
156
+ "note": "initialBinding is none."
157
+ },
158
+ {
159
+ "id": "sr-spaces-brackets",
160
+ "rule": "spaces",
161
+ "mode": "text",
162
+ "in": "Текст ( нормалан ) остаје .",
163
+ "out": "Текст (нормалан) остаје.",
164
+ "note": "spaces.md: brackets tighten, no space before the final stop."
165
+ },
166
+ {
167
+ "id": "sr-symbols-copyright",
168
+ "rule": "symbols",
169
+ "mode": "text",
170
+ "in": "Copyright (c) 2026",
171
+ "out": "Copyright © 2026",
172
+ "note": "symbols rule, locale-neutral."
173
+ },
174
+ {
175
+ "id": "sr-apostrophe-foreign-name",
176
+ "rule": "apostrophe",
177
+ "mode": "text",
178
+ "in": "То је McDonald's",
179
+ "out": "То је McDonald’s",
180
+ "note": "apostrophe rule, locale-neutral."
181
+ }
182
+ ]
183
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "sv",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "tr",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "locale": "uk",
4
4
  "cases": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "$comment": "Locale resolution input. Algorithm is specified in spec/rules/locale-resolution.md and is identical in every runtime — never delegate it to a platform locale-negotiation library. \"spec\" here must track spec/VERSION exactly — it is not itself the global version source; scripts/validate-spec.mjs enforces the match.",
4
4
  "locales": [
5
5
  "en-US",
@@ -25,7 +25,9 @@
25
25
  "ro",
26
26
  "hu",
27
27
  "bg",
28
- "hr"
28
+ "hr",
29
+ "sr",
30
+ "sl"
29
31
  ],
30
32
  "aliases": {
31
33
  "en": "en-US",
@@ -0,0 +1,82 @@
1
+ {
2
+ "locale": "sl",
3
+ "name": "Slovenian",
4
+ "quotes": {
5
+ "primary": {
6
+ "open": "»",
7
+ "close": "«",
8
+ "innerSpace": "none"
9
+ },
10
+ "secondary": {
11
+ "open": "›",
12
+ "close": "‹",
13
+ "innerSpace": "none"
14
+ },
15
+ "elisionIdioms": [],
16
+ "elisionClitics": {
17
+ "before": [],
18
+ "after": []
19
+ }
20
+ },
21
+ "dash": {
22
+ "parenthetical": "en-spaced",
23
+ "range": "en-tight"
24
+ },
25
+ "ellipsis": {
26
+ "abbreviatedAfterTerminal": false
27
+ },
28
+ "hyphen": {
29
+ "prefixes": [],
30
+ "suffixes": [],
31
+ "compounds": []
32
+ },
33
+ "nbsp": {
34
+ "beforePunctuation": [],
35
+ "narrowBeforePunctuation": [],
36
+ "afterShortWords": [],
37
+ "abbreviations": ["t. i."],
38
+ "beforeUnits": ["%", "‰", "€", "°C", "kg", "km"],
39
+ "beforeNumber": [],
40
+ "beforeWord": [],
41
+ "afterSymbols": ["§"],
42
+ "initialBinding": "none"
43
+ },
44
+ "sources": [
45
+ {
46
+ "rule": "quotes",
47
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §461 (p. 51; forms » «, › ‹, „ “, ‚ ‘, \" \"), §463 (nested quotes), §465 «Pri pisanju z roko uporabljamo dvojni narekovaj spodaj-zgoraj.», §467 (p. 52); dictionary entry narekovaj: «ločilo ‹“ ”›, ‹» «›»",
48
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
49
+ "note": "Primary: U+00BB open, U+00AB close. DECISION: §461 lists the double middle pair first, every example in §§461–466 and §473 uses it, and §465 assigns the low-high pair „ “ to handwriting. The list is introduced with «npr.» and is not explicitly ranked. Permitted variant, not adopted: U+201C/U+201D (dictionary entry; Pravopis 8.0 draft names it as equally common in computer typesetting). The issue's lead «„…“ / „…”» was an observation, not a norm; if the low-high pair were ever pinned its close is U+201C, not U+201D. Secondary: U+203A open, U+2039 close. DECISION and CONFLICT: §461 names the single middle pair (the counterpart of the primary), §463's own example nests „…“ and ‚…‘ inside »…«, and the Pravopis 8.0 draft example uses ‘…’; the single middle pair is listed in both editions. innerSpace none for both. Q-W: primary WIDE, secondary NARROW. elisionIdioms and elisionClitics are empty: §468 (Opuščaj) gives no closed set. Confidence: MEDIUM-HIGH that »…« is the print norm of the edition in force; MEDIUM on the secondary. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
50
+ },
51
+ {
52
+ "rule": "dashes",
53
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §228 (p. 30): «pomišljaj načeloma pišemo na obe strani s presledkom (je nestičen)»; §378, §381, §398 (pp. 44–45)",
54
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
55
+ "note": "dash.parenthetical = en-spaced (U+0020 U+2013 U+0020). The spaces are normative (HIGH). The width is a DECISION, MEDIUM-HIGH: §378 distinguishes the ordinary dash (navadni) from the long one (dolgi), which appears only between sentences or listed units; the ordinary one is U+2013 by glyph shape and in the Pravopis 8.0 draft. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
56
+ },
57
+ {
58
+ "rule": "ranges",
59
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §228; §394 (p. 45): «namesto predlogov od … do … piše se stično na obeh straneh: proga Ljubljana–Trst, … 80–100 SIT, str. 125–132, v letih 1941–1945»; §614 (p. 68)",
60
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
61
+ "note": "dash.range = en-tight. HIGH. The draft keeps ranges tight even between full dates («1. 1. 2024–30. 6. 2024»), so unlike sr no spaced exception for multi-word range members is needed. The ranges rule is off by default. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
62
+ },
63
+ {
64
+ "rule": "ellipsis",
65
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §§399–410 (pp. 46–47), Tri pike",
66
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
67
+ "note": "abbreviatedAfterTerminal = false is a DECISION, not a citation: no two-dot form after ? or ! is given. ACCEPTED COST: the edition sets the ellipsis spaced (nestično) and the draft recommends a no-break space before it; not adopted, because inserting one would break the word-internal ellipsis of §410 («prepr…!»). An author's own space stays, breakable. MEDIUM-HIGH. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
68
+ },
69
+ {
70
+ "rule": "hyphen",
71
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §437 (p. 48), §471 (p. 52), §608 (p. 68): «Če besedo, ki se piše z vezajem, delimo ravno tam, kjer je v njej vezaj, ga lahko prenesemo na začetek druge vrstice»",
72
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
73
+ "note": "All three lists are empty. Breaking at a hyphen is provided for, and no closed list of unbreakable hyphenated forms exists. HIGH. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
74
+ },
75
+ {
76
+ "rule": "nbsp",
77
+ "cite": "SAZU / ZRC SAZU Inštitut za slovenski jezik Frana Ramovša, Slovenski pravopis 2001, I Pravila, §610 (p. 68): «V naslednjo vrstico ne prenašamo posameznih simbolov za mere, uteži ipd. za številkami: 5 m, 10 kg.»; §250, §259 («38 °C»), §397, §595 («t. i.»), §612; dictionary entry odstotek «5 %»; Pravopis 8.0 (predlog), Nedeljivi presledek and Presledek («10 %», «16 ‰», «5 €», «10 °C», «§ 10», «t. i.»)",
78
+ "url": "https://fran.si/134/slovenski-pravopis/datoteke/Pravopis_Pravila.pdf",
79
+ "note": "(1) beforeUnits = %, ‰, €, °C, kg, km. %, °C, kg, km are in the edition in force; ‰ and € are from the draft only (SECONDARY). DECISIONS: single-letter units (m, g, V, a) are excluded although §610 names m, because they are common words or initials (as in hr, sk, bg); $ and £ are out; bare ° is never listed. (2) afterSymbols = §: draft, SECONDARY; the edition shows only the spaced form («§ 49», §235). (3) abbreviations = t. i.: the edition gives the spaced form and the draft states the no-break intent; the other spaced abbreviations (t. l., n. m., d. d., d. o. o.) are not listed, since extending the intent to them would be a derivation. DECISION, MEDIUM. (4) afterShortWords is empty: §612 concerns word division, not one-letter prepositions; nothing is imported from cs or sk. (5) beforePunctuation and narrowBeforePunctuation are empty: §228 puts punctuation closed up. (6) beforeNumber, beforeWord are empty and initialBinding = none: only the spaced form of « dr. F. Prešeren » is shown. Decisions, not citations. The PDF has no text layer and was read as page images, so code points are identified from glyph shape (MEDIUM-HIGH). Pravopis 8.0 (predlog, 2026) is a draft not in force and is cited only as a secondary check. Retrieved 2026-10-24."
80
+ }
81
+ ]
82
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "locale": "sr",
3
+ "name": "Serbian",
4
+ "quotes": {
5
+ "primary": {
6
+ "open": "„",
7
+ "close": "”",
8
+ "innerSpace": "none"
9
+ },
10
+ "secondary": {
11
+ "open": "’",
12
+ "close": "’",
13
+ "innerSpace": "none"
14
+ },
15
+ "elisionIdioms": [],
16
+ "elisionClitics": {
17
+ "before": [],
18
+ "after": []
19
+ }
20
+ },
21
+ "dash": {
22
+ "parenthetical": "en-spaced",
23
+ "range": "en-tight"
24
+ },
25
+ "ellipsis": {
26
+ "abbreviatedAfterTerminal": false
27
+ },
28
+ "hyphen": {
29
+ "prefixes": [],
30
+ "suffixes": [],
31
+ "compounds": []
32
+ },
33
+ "nbsp": {
34
+ "beforePunctuation": [],
35
+ "narrowBeforePunctuation": [],
36
+ "afterShortWords": [],
37
+ "abbreviations": [],
38
+ "beforeUnits": [],
39
+ "beforeNumber": [],
40
+ "beforeWord": [],
41
+ "afterSymbols": [],
42
+ "initialBinding": "none"
43
+ },
44
+ "sources": [
45
+ {
46
+ "rule": "quotes",
47
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, pp. 343–345 (table 5) and 360–363 (table 11)",
48
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
49
+ "note": "Primary: U+201E open, U+201D close. p. 343, table 5: «Пижурица и др. 2010: „ ” (То је једини облик који је наведен у наслову.)»; p. 344: the 2010 Pravopis prescribes and uses only this form. Secondary: U+2019 on both sides (the same-glyph pair of fi and sv), p. 361, table 11: «Полунаводницима се издваја ужи навод у оквиру ширег навода» (2010:135); p. 363 fn. 30 notes the form ‘ ’ at 2010:135 as «вероватно грешком». innerSpace none for both. CONFLICT, recorded not resolved: Пешикан и др. 1993:286 also allowed „ “ and » «; the dictionaries РМС, РСАНУ and РСЈ use „ “ (p. 345); Klikovac and Milanović 2019 argue for „ “ or free choice. U+201D follows the current Pravopis, as hr does. Q-W: primary WIDE, secondary NARROW. The secondary U+2019/U+2019 is a DECISION (MEDIUM): table 11 attributes ’ ’ to 2010, but fn. 30 reports ‘ ’ (U+2018/U+2019) printed at 2010:135 and calls it probably a mistake without the note stating which form Klikovac holds correct; pinned as U+2019 both sides, the form table 11 gives. The issue text «„…“ / „…”» was an observation, not a norm. elisionIdioms and elisionClitics are empty: no rule found. Confidence MEDIUM-HIGH: the glyph form is named in words by Klikovac, not read from a text layer. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
50
+ },
51
+ {
52
+ "rule": "dashes",
53
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, pp. 302, 320 (table 8), 328",
54
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
55
+ "note": "dash.parenthetical = en-spaced. The spaces are normative: the separating dash is set as a spaced mark (Пешикан и др. 1993, p. 328; 2010:122 confirms the function and every example is set spaced). The WIDTH is a DECISION: p. 302 says the dash should be about twice as long as the hyphen or more, which does not choose between U+2013 and U+2014; the monograph sets U+2013. MEDIUM, as hr and bg. Klikovac's p. 328 cites «Пижурица и др. (1993: 126)», probably a misprint for 2010; noted, not corrected. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
56
+ },
57
+ {
58
+ "rule": "ranges",
59
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, pp. 330–331",
60
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
61
+ "note": "dash.range = en-tight. A dash between numbers is written closed up (Пешикан 1993:278, Пижурица 2010:126, Дешић 2015): «рат 1941–1945», «у XV–XVIII веку». ACCEPTED COSTS: a multi-word range member takes spaces in 2010:126–127 («рат 6. IV 1941 – 9. V 1945»), and the rule «од … до» (no dash after «од») is an algorithm, not data; locale data can express neither. The ranges rule is off by default. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
62
+ },
63
+ {
64
+ "rule": "ellipsis",
65
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, p. 136 (table 1, fn. 5) and p. 164 (§12.1)",
66
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
67
+ "note": "abbreviatedAfterTerminal = false is a DECISION, not a citation. 2010 gives three dots closed up (p. 136) and allows them after ? and ! (p. 164); the two-dot form after a terminal appears only as older practice (Мирко Николић 1973, p. 136 fn. 5) and is never prescribed. MEDIUM. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
68
+ },
69
+ {
70
+ "rule": "hyphen",
71
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, (not consulted)",
72
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
73
+ "note": "All three lists are empty: no source consulted gives a closed list of unbreakable hyphenated forms. The 2010 Pravopis chapters on word division were not consulted. Operator decision (no paid sources, pick and pin): ship empty. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
74
+ },
75
+ {
76
+ "rule": "nbsp",
77
+ "cite": "Д. Кликовац, Српска интерпункција, Филолошки факултет Универзитета у Београду, 2024 (серија «Монографије – језик»), ISBN 978-86-6153-752-3, analysing Пешикан/Јерковић/Пижурица, Правопис српскога језика, Матица српска, Нови Сад, 2010, (not consulted)",
78
+ "url": "https://www.fil.bg.ac.rs/uploads/files/Strane/Biblioteke/Izdavacka%20delatnost/Monografije%20-%20Jezik/SRSKA%20INTERPUNKCIJA%20elek%20izd.pdf",
79
+ "note": "Every list is empty and initialBinding is none: no source consulted gives a rule for a space between a number and a unit or percent sign, for one-letter words or initials at a line end. Nothing is derived from another language. The 2010 Pravopis chapters on numbers and word division were not consulted. Operator decision (no paid sources, pick and pin): ship empty. The Pravopis 2010 itself was not read (paid); every statement is the edition of 2010 as Klikovac reports it. The PDF has no text layer and was read as page images. Retrieved 2026-10-24."
80
+ }
81
+ ]
82
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.13.0",
2
+ "spec": "1.15.0",
3
3
  "$comment": "Single source of truth for pipeline order. Rules run in ascending `order`. Disabling a rule removes it from the sequence and never reorders the rest. Rule ids are public API (see docs/ARCHITECTURE.md section 5). \"spec\" here must track spec/VERSION exactly — it is not itself the global version source; scripts/validate-spec.mjs enforces the match.",
4
4
  "rules": [
5
5
  {
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polytypo
4
- # The seven stable, cross-runtime error codes (docs/ARCHITECTURE.md section 4.6). Messages are
4
+ # The eight stable, cross-runtime error codes (docs/ARCHITECTURE.md section 4.6). Messages are
5
5
  # English and are not part of the contract; codes are.
6
6
  CODE_UNKNOWN_LOCALE = "POLYTYPO_UNKNOWN_LOCALE"
7
7
  CODE_INVALID_MODE = "POLYTYPO_INVALID_MODE"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polytypo
4
- VERSION = "1.13.0"
4
+ VERSION = "1.15.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polytypo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.0
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iurii Rogulia
@@ -62,6 +62,8 @@ files:
62
62
  - lib/polytypo/data/fixtures/ro.json
63
63
  - lib/polytypo/data/fixtures/ru.json
64
64
  - lib/polytypo/data/fixtures/sk.json
65
+ - lib/polytypo/data/fixtures/sl.json
66
+ - lib/polytypo/data/fixtures/sr.json
65
67
  - lib/polytypo/data/fixtures/sv.json
66
68
  - lib/polytypo/data/fixtures/tr.json
67
69
  - lib/polytypo/data/fixtures/uk.json
@@ -87,6 +89,8 @@ files:
87
89
  - lib/polytypo/data/locales/ro.json
88
90
  - lib/polytypo/data/locales/ru.json
89
91
  - lib/polytypo/data/locales/sk.json
92
+ - lib/polytypo/data/locales/sl.json
93
+ - lib/polytypo/data/locales/sr.json
90
94
  - lib/polytypo/data/locales/sv.json
91
95
  - lib/polytypo/data/locales/tr.json
92
96
  - lib/polytypo/data/locales/uk.json