polytypo 1.0.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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +109 -0
  4. data/lib/polytypo/data/README.md +20 -0
  5. data/lib/polytypo/data/UNICODE +1 -0
  6. data/lib/polytypo/data/VERSION +1 -0
  7. data/lib/polytypo/data/fixtures/de-CH.json +501 -0
  8. data/lib/polytypo/data/fixtures/de-DE.json +547 -0
  9. data/lib/polytypo/data/fixtures/el.json +239 -0
  10. data/lib/polytypo/data/fixtures/en-GB.json +1274 -0
  11. data/lib/polytypo/data/fixtures/en-US.json +1807 -0
  12. data/lib/polytypo/data/fixtures/fi.json +1306 -0
  13. data/lib/polytypo/data/fixtures/fr-CA.json +268 -0
  14. data/lib/polytypo/data/fixtures/fr.json +603 -0
  15. data/lib/polytypo/data/fixtures/locale-resolution.json +209 -0
  16. data/lib/polytypo/data/fixtures/ru.json +688 -0
  17. data/lib/polytypo/data/fixtures/sv.json +1290 -0
  18. data/lib/polytypo/data/locales/de-CH.json +77 -0
  19. data/lib/polytypo/data/locales/de-DE.json +76 -0
  20. data/lib/polytypo/data/locales/el.json +90 -0
  21. data/lib/polytypo/data/locales/en-GB.json +115 -0
  22. data/lib/polytypo/data/locales/en-US.json +133 -0
  23. data/lib/polytypo/data/locales/fi.json +136 -0
  24. data/lib/polytypo/data/locales/fr-CA.json +78 -0
  25. data/lib/polytypo/data/locales/fr.json +84 -0
  26. data/lib/polytypo/data/locales/registry.json +9 -0
  27. data/lib/polytypo/data/locales/ru.json +112 -0
  28. data/lib/polytypo/data/locales/sv.json +124 -0
  29. data/lib/polytypo/data/rules/dashes.md +1238 -0
  30. data/lib/polytypo/data/rules/order.json +78 -0
  31. data/lib/polytypo/data/schema/fixtures.schema.json +79 -0
  32. data/lib/polytypo/data/schema/locale.schema.json +235 -0
  33. data/lib/polytypo/data/schema/registry.schema.json +29 -0
  34. data/lib/polytypo/data/schema/resolution.schema.json +50 -0
  35. data/lib/polytypo/engine/codepoints.rb +24 -0
  36. data/lib/polytypo/engine/edits.rb +64 -0
  37. data/lib/polytypo/engine/locale.rb +138 -0
  38. data/lib/polytypo/engine/pipeline.rb +61 -0
  39. data/lib/polytypo/engine/registry.rb +47 -0
  40. data/lib/polytypo/engine/rules/apostrophe.rb +127 -0
  41. data/lib/polytypo/engine/rules/dash_shared.rb +342 -0
  42. data/lib/polytypo/engine/rules/dashes.rb +125 -0
  43. data/lib/polytypo/engine/rules/ellipsis.rb +100 -0
  44. data/lib/polytypo/engine/rules/hyphen.rb +207 -0
  45. data/lib/polytypo/engine/rules/nbsp.rb +616 -0
  46. data/lib/polytypo/engine/rules/quote_ambiguity.rb +241 -0
  47. data/lib/polytypo/engine/rules/quotes.rb +420 -0
  48. data/lib/polytypo/engine/rules/ranges.rb +124 -0
  49. data/lib/polytypo/engine/rules/spaces.rb +232 -0
  50. data/lib/polytypo/engine/rules/symbols.rb +291 -0
  51. data/lib/polytypo/engine/rules.rb +19 -0
  52. data/lib/polytypo/engine/sentinels.rb +23 -0
  53. data/lib/polytypo/engine/unicode_util.rb +390 -0
  54. data/lib/polytypo/errors.rb +24 -0
  55. data/lib/polytypo/modes/html.rb +233 -0
  56. data/lib/polytypo/modes/markdown.rb +187 -0
  57. data/lib/polytypo/modes/parse_error.rb +19 -0
  58. data/lib/polytypo/modes/runner.rb +57 -0
  59. data/lib/polytypo/modes/spans.rb +132 -0
  60. data/lib/polytypo/version.rb +5 -0
  61. data/lib/polytypo.rb +91 -0
  62. data/polytypo.gemspec +37 -0
  63. metadata +122 -0
@@ -0,0 +1,77 @@
1
+ {
2
+ "locale": "de-CH",
3
+ "name": "German (Switzerland)",
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
+ },
17
+ "dash": {
18
+ "parenthetical": "en-spaced",
19
+ "range": "en-tight"
20
+ },
21
+ "ellipsis": {
22
+ "abbreviatedAfterTerminal": false
23
+ },
24
+ "hyphen": {
25
+ "prefixes": [],
26
+ "suffixes": [],
27
+ "compounds": []
28
+ },
29
+ "nbsp": {
30
+ "beforePunctuation": [],
31
+ "narrowBeforePunctuation": [],
32
+ "afterShortWords": [],
33
+ "abbreviations": ["z. B.", "d. h.", "u. a.", "u. U.", "m. a. W.", "m. w. H."],
34
+ "beforeUnits": ["%", "‰", "°C", "km", "cm", "mm", "kg", "km/h", "kWh"],
35
+ "beforeNumber": ["Art.", "Abs.", "Ziff.", "Kap.", "S."],
36
+ "beforeWord": ["St."],
37
+ "afterSymbols": ["§", "§§"],
38
+ "initialBinding": "chain"
39
+ },
40
+ "sources": [
41
+ {
42
+ "rule": "quotes",
43
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 201–203: zu schreiben sind die Guillemets « » und, für eine Anführung innerhalb einer Anführung, die halben Anführungszeichen ‹ ›; die in Deutschland übliche Schreibung » « ist für amtliche Texte nicht zulässig",
44
+ "url": "https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf",
45
+ "note": "Rz. 202 regelt ausdrücklich nur das Leerzeichen VOR dem Anführungszeichen und NACH dem Schlusszeichen; ein Zwischenraum innerhalb der Guillemets wird weder gefordert noch in einem der Beispiele gesetzt («Zukunft für Schweizer Fahrende»). Daher innerSpace = none."
46
+ },
47
+ {
48
+ "rule": "dashes",
49
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 231, 237, 238: der Gedankenstrich ist der Halbgeviertstrich –; vor und nach dem Gedankenstrich bei Nachträgen und paarigen Einschüben steht ein Leerzeichen",
50
+ "url": "https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf",
51
+ "note": "Rz. 236 hält ausdrücklich fest, dass der Geviertstrich (—) nicht zulässig ist."
52
+ },
53
+ {
54
+ "rule": "dashes",
55
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 234: der Gedankenstrich als Begriffszeichen für „bis“ steht ohne Leerzeichen — „16–17 Uhr“, „die Artikel 10–12“, „die Jahre 1939–1945“",
56
+ "url": "https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf"
57
+ },
58
+ {
59
+ "rule": "nbsp",
60
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251 (Festabstand hält Zusammengehöriges zusammen: Ziffer und Masseinheit, Abkürzung und Ortsname, Teile mehrgliedriger Abkürzungen, Gliederungseinheit und Ziffer — „20 km“, „St. Gallen“, „Artikel 35“), Rz. 438 (mehrgliedrige Abkürzungen: d. h. / z. B. / u. a. / u. U. / m. a. W. / m. w. H.), Rz. 549–550 (Festabstand zwischen Zahl und Einheit), Rz. 554 (Festabstand vor % und ‰)",
61
+ "url": "https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf",
62
+ "note": "initialBinding: \"chain\" (spec 0.6.0: das Feld hieß zuvor das boolesche bindInitials) ist eine Ableitung, keine wörtliche Weisung: Rz. 251 nennt „eine Abkürzung und ein Ortsname“ (St. Gallen) und Rz. 438 die Teile mehrgliedriger Abkürzungen; die Bindung Initiale–Nachname ist dieselbe Konstruktion, wird aber in den Schreibweisungen nicht ausdrücklich erwähnt. Keine Quelle belegt eine einzelne Initiale (\"single\"); \"chain\" folgt derselben Zwei-oder-mehr-Logik wie de-DE/ru. Die Einheitenliste ist bewusst kurz und enthält keine einbuchstabigen Einheitenzeichen. Der Schweizer Verzicht auf ß (ss statt ß, Amtliches Regelwerk § 25 E2) lässt sich im Schema nicht ausdrücken und ist deshalb hier nicht abgebildet."
63
+ },
64
+ {
65
+ "rule": "nbsp",
66
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251 (Festabstand zwischen einer Gliederungseinheit eines Erlasses und der dazugehörigen Ziffer — Beispiele „Artikel 35“, „S. 17 f.“, „St. Gallen“), Rz. 438 (Entsprechendes gilt für die eingliedrige Abkürzung „St.“ für „Sankt“ in Ortsnamen: „St. Gallen“, „St. Moritz“), Rz. 439 (abschliessende Aufzählung der Begriffszeichen: Ziffern, %, ‰, Gedankenstrich, Schrägstrich, §, Währungszeichen, mathematische Zeichen, Einheitenzeichen), Rz. 440 (zwischen einem Begriffszeichen und der dazugehörigen Zahl steht ein Festabstand), Rz. 727 (in verknapptem Text werden die Gliederungseinheiten abgekürzt: „Kap., Art., Abs., Bst. (falsch: Buchst., lit.), Ziff.“), Rz. 730 (Nummerierung der Gliederungseinheiten)",
67
+ "url": "https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf",
68
+ "note": "Wortlaut im PDF selbst geprüft. Rz. 439 und Rz. 727 entscheiden die Zuordnung von „Art.“: die Aufzählung der Begriffszeichen in Rz. 439 ist abschliessend und enthält „Art.“ nicht, Rz. 727 führt „Art.“ ausdrücklich als Abkürzung einer Gliederungseinheit. „Art.“ gehört damit zu beforeNumber und nicht zu afterSymbols, wo es zuvor stand; die Bindung an die folgende Zahl folgt aus Rz. 251. Aus derselben Liste fehlt nur „Bst.“, weil ihm ein Buchstabe folgt, keine Zahl („Bst. a“). „S.“ ist mit „S. 17 f.“ in Rz. 251 wörtlich belegt. „Nr.“ wurde ersatzlos entfernt: es steht weder in Rz. 439 noch überhaupt im Sachregister (unter N nur „NGO“, „Normen“, „Null“); die einzige Fundstelle ist Rz. 431, wo „Nr. (Nummer), Tarif-Nrn.“ als Beispiel für Deklinationsendungen dient und keine Abstandsregel ausspricht. afterSymbols war damit nachweislich falsch, und für beforeNumber fehlt der Beleg — nach docs/PLAN.md §6.1 zieht das die Streichung nach sich. Zurückkommen kann „Nr.“ mit einer Lesung der DIN 5008. beforeWord enthält nur „St.“: Rz. 438 nennt genau diesen Fall wörtlich, weitere Abkürzung-plus-Wort-Bindungen sind in den Schreibweisungen nicht als geschlossene Liste geregelt („Küssnacht a. R.“ ist eine mehrgliedrige Abkürzung, kein Präfix)."
69
+ },
70
+ {
71
+ "rule": "hyphen",
72
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 223 und 224: der Bindestrich wird als Ergänzungsstrich für einen eingesparten Wortteil verwendet („Papierproduktion und -handel“); mit dem geschützten Ergänzungsstrich wird verhindert, dass der Ergänzungsstrich am Zeilenende auf der oberen Zeile bleibt, während der zugehörige zweite Wortbestandteil auf die nächste Zeile rutscht",
73
+ "url": "https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf",
74
+ "note": "Beleg dafür, dass die drei Listen leer bleiben. Das Deutsche kennt keine geschlossene Liste von Morphemen mit unteilbarem Bindestrich; die Trennung am Bindestrich ist zulässig (Rz. 269–271 behandeln nur sinnentstellende Trennungen). Der einzige belegte Fall eines geschützten Bindestrichs ist der Ergänzungsstrich (Rz. 224), und der ist offen: er betrifft jedes beliebige Zweitglied nach „und -“ und lässt sich als literale Wortliste nicht abbilden."
75
+ }
76
+ ]
77
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "locale": "de-DE",
3
+ "name": "German (Germany)",
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
+ },
17
+ "dash": {
18
+ "parenthetical": "en-spaced",
19
+ "range": "en-tight"
20
+ },
21
+ "ellipsis": {
22
+ "abbreviatedAfterTerminal": false
23
+ },
24
+ "hyphen": {
25
+ "prefixes": [],
26
+ "suffixes": [],
27
+ "compounds": []
28
+ },
29
+ "nbsp": {
30
+ "beforePunctuation": [],
31
+ "narrowBeforePunctuation": [],
32
+ "afterShortWords": [],
33
+ "abbreviations": ["z. B.", "d. h.", "u. a.", "u. Ä.", "z. T.", "i. d. R."],
34
+ "beforeUnits": ["%", "‰", "€", "°C", "km", "cm", "mm", "kg", "km/h", "kWh"],
35
+ "beforeNumber": ["S."],
36
+ "beforeWord": ["St."],
37
+ "afterSymbols": ["§", "§§"],
38
+ "initialBinding": "chain"
39
+ },
40
+ "sources": [
41
+ {
42
+ "rule": "quotes",
43
+ "cite": "Duden, Rechtschreibregeln, „Anführungszeichen“, Regeln D 5 und D 12: Gänsefüßchen „…“ als Anführungszeichen, halbe Anführungszeichen ‚…‘ für eine Anführung innerhalb einer Anführung",
44
+ "url": "https://www.duden.de/sprachwissen/rechtschreibregeln/anfuehrungszeichen",
45
+ "note": "Deckungsgleich mit dem Amtlichen Regelwerk der deutschen Rechtschreibung, § 79 E2 (Anführung innerhalb einer Anführung durch halbe Anführungszeichen)."
46
+ },
47
+ {
48
+ "rule": "dashes",
49
+ "cite": "Duden, Rechtschreibregeln, „Gedankenstrich“, Regel D 45: der Gedankenstrich (Halbgeviertstrich) steht mit Leerzeichen auf beiden Seiten beim Einschieben eines Zusatzes",
50
+ "url": "https://www.duden.de/sprachwissen/rechtschreibregeln/gedankenstrich"
51
+ },
52
+ {
53
+ "rule": "dashes",
54
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen (Ausgabe 2013, aktualisiert), Rz. 234: der Gedankenstrich als Begriffszeichen für „bis“ steht ohne Leerzeichen — „die Jahre 1939–1945“",
55
+ "url": "https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf",
56
+ "note": "Für den Bis-Strich konnte keine gleichwertig präzise Duden-Onlineregel gefunden werden; die schweizerische Weisung formuliert dieselbe im gesamten deutschen Sprachraum übliche Regel und wird hier als überprüfbare Quelle angegeben."
57
+ },
58
+ {
59
+ "rule": "nbsp",
60
+ "cite": "DIN 5008 (Schreib- und Gestaltungsregeln für die Text- und Informationsverarbeitung): geschütztes Leerzeichen zwischen den Teilen mehrgliedriger Abkürzungen („z. B.“, „d. h.“), bei Initialen („J. K. Rowling“) sowie zwischen Zahl und Einheit, Prozentzeichen und Paragrafenzeichen",
61
+ "note": "Die Norm selbst ist kostenpflichtig; die Regelinhalte wurden über die Duden-Regeln zu Abkürzungen (D 1) und über die von Duden selbst verwendete Schreibung „z. B.“ mit geschütztem Leerzeichen gegengeprüft. Der Einheitenliste liegt keine Normliste zugrunde: sie ist bewusst kurz gehalten und enthält keine einbuchstabigen Einheitenzeichen (m, g, l, s), weil diese ohne Kontextprüfung zu Falschtreffern führen."
62
+ },
63
+ {
64
+ "rule": "nbsp",
65
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251: der Festabstand verhindert, dass Zusammengehöriges beim Zeilensprung auseinandergerissen wird — Beispiele „20 km“, „St. Gallen“, „Artikel 35“, „S. 17 f.“, „20. November“; Rz. 438: Entsprechendes gilt für die eingliedrige Abkürzung „St.“ für „Sankt“ in Ortsnamen („St. Gallen“, „St. Moritz“); Rz. 439: abschliessende Aufzählung der Begriffszeichen (Ziffern, %, ‰, Gedankenstrich, Schrägstrich, §, Währungszeichen, mathematische Zeichen, Einheitenzeichen)",
66
+ "url": "https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf",
67
+ "note": "Wortlaut im PDF selbst geprüft. Für Deutschland regelt dieselbe Konstruktion die DIN 5008 (Schreib- und Gestaltungsregeln), die kostenpflichtig ist und deren Wortlaut hier nicht geprüft werden konnte; deshalb steht die schweizerische Weisung als überprüfbarer Beleg — dasselbe Vorgehen wie bei der Quelle zu Rz. 234 in diesem File. Die Übertragung auf de-DE ist insofern eine Ableitung, keine deutschlandspezifische Weisung. „S.“ ist mit „S. 17 f.“ wörtlich belegt und deckt die von docs/PLAN.md §7 geforderte Schreibung „S.“ + Zahl. „Nr.“ ist aus afterSymbols ersatzlos gestrichen und wurde NICHT nach beforeNumber übernommen: die Aufzählung der Begriffszeichen in Rz. 439 ist abschliessend und enthält „Nr.“ nicht (im Sachregister unter N stehen nur „NGO“, „Normen“, „Null“), der Duden führt „Nr.“ als Abkürzung, spricht aber weder im Wörterbucheintrag noch im Sprachratgeber zu Abkürzungen eine Abstandsregel aus. Damit ist afterSymbols nachweislich falsch und beforeNumber unbelegt; nach docs/PLAN.md §6.1 fährt ein Eintrag ohne deckende Quelle nicht mit. Zurückholen lässt sich „Nr.“ durch eine Lesung der DIN 5008 — die Zugehörigkeit zur Klasse allein genügt nicht, das wäre eine als Zitat ausgegebene Ableitung. Die von docs/PLAN.md §7 geforderte Schreibung „Nr.“ + Zahl bleibt damit vorerst offen."
68
+ },
69
+ {
70
+ "rule": "hyphen",
71
+ "cite": "Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 223 und 224: der Bindestrich wird als Ergänzungsstrich für einen eingesparten Wortteil verwendet („Papierproduktion und -handel“); mit dem geschützten Ergänzungsstrich wird verhindert, dass der Ergänzungsstrich am Zeilenende auf der oberen Zeile bleibt, während der zugehörige zweite Wortbestandteil auf die nächste Zeile rutscht",
72
+ "url": "https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf",
73
+ "note": "Beleg dafür, dass die drei Listen leer bleiben. Das Deutsche kennt keine geschlossene Liste von Morphemen mit unteilbarem Bindestrich; die Trennung am Bindestrich ist zulässig. Der einzige belegte Fall eines geschützten Bindestrichs ist der Ergänzungsstrich (Rz. 224), und der ist offen: er betrifft jedes beliebige Zweitglied nach „und -“ und lässt sich als literale Wortliste nicht abbilden."
74
+ }
75
+ ]
76
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "locale": "el",
3
+ "name": "Greek",
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
+ },
17
+ "dash": {
18
+ "parenthetical": "none",
19
+ "range": "none"
20
+ },
21
+ "ellipsis": {
22
+ "abbreviatedAfterTerminal": false
23
+ },
24
+ "hyphen": {
25
+ "prefixes": [],
26
+ "suffixes": [],
27
+ "compounds": []
28
+ },
29
+ "nbsp": {
30
+ "beforePunctuation": [],
31
+ "narrowBeforePunctuation": [],
32
+ "afterShortWords": [],
33
+ "abbreviations": [],
34
+ "beforeUnits": [],
35
+ "beforeNumber": [],
36
+ "beforeWord": [],
37
+ "afterSymbols": [],
38
+ "initialBinding": "none"
39
+ },
40
+ "sources": [
41
+ {
42
+ "rule": "quotes",
43
+ "cite": "Υπηρεσία Εκδόσεων της Ευρωπαϊκής Ένωσης, Διοργανικό εγχειρίδιο σύνταξης κειμένων (ελληνική έκδοση 2011, τελευταία ενημέρωση 30.4.2012), Μέρος Τέταρτο «Συμβατικοί κανόνες για την ελληνική γλώσσα», §10.1.7 «Εισαγωγικά»: «Σε εισαγωγικά (στο ελληνικό κείμενο προτιμώνται τα διπλά γωνιώδη εισαγωγικά: « ») κλείνονται κυρίως λόγια ή παραθέματα που αναφέρονται αυτολεξεί. […] Στην περίπτωση που χρειάζονται εισαγωγικά μέσα σε κείμενο που είναι ήδη σε εισαγωγικά, τότε για τα εισαγωγικά αυτά χρησιμοποιούνται τα διπλά ανωφερή εισαγωγικά (“ ”), ενώ σε τρίτο επίπεδο εσωτερικά χρησιμοποιούνται τα μονά ανωφερή εισαγωγικά (‘ ’)»",
44
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
45
+ "note": "Primary U+00AB/U+00BB, secondary U+201C/U+201D. Part Four of this guide is a Greek-specific punctuation chapter, not the multilingual part — the distinction matters and is the reason this source is cited for Greek at all. innerSpace is \"none\": the §6.4 spacing table sets «xx» with an ordinary space only outside the guillemets, and the Greek chapter never asks for one inside. The third nesting level the source describes (U+2018/U+2019) is not expressible in locale.schema.json, which has primary and secondary only; that is a schema limit, not a gap in the source. Corroborated by ΥΠΕΠΘ/ΙΤΥΕ, Γραμματική Νέας Ελληνικής Γλώσσας Α΄–Γ΄ Γυμνασίου, §3.3 («Τα εισαγωγικά ( « » ) σημειώνονται…»), whose examples likewise carry no inner space. Retrieved 2026-08-15."
46
+ },
47
+ {
48
+ "rule": "dashes",
49
+ "cite": "Διοργανικό εγχειρίδιο σύνταξης κειμένων (EL, 2011), §10.1.8 «Ενωτικό — Παύλα μεσαίου μεγέθους — Μεγάλη παύλα»: για τα αριθμητικά διαστήματα, «Παύλα μεσαίου μεγέθους ή μείον (–) […] γ) για να δηλώσει το διάστημα μεταξύ δύο ορίων (π.χ. άτομα ηλικίας 25–45 ετών) […] δ) στην αναφορά σε περιόδους τουλάχιστον δύο πλήρων ετών (π.χ. 1989–1991) […] Ωστόσο, και στην περίπτωση αυτή μπορεί να χρησιμοποιηθεί και ενωτικό». Ο ίδιος κανόνας για τα αριθμητικά διαστήματα εμφανίζεται ΔΥΟ ΦΟΡΕΣ στην §10.1.8, μία στην υποενότητα «Ενωτικό (-)» και μία στην υποενότητα «Παύλα μεσαίου μεγέθους (–)», και κάθε φορά η υποενότητα παραχωρεί ρητά το άλλο σημείο (paraphrase of the «Ενωτικό» occurrence — its verbatim text was not captured at review time; the «Παύλα» occurrence is quoted above verbatim)· για την παρενθετική χρήση, «Όπως η παρένθεση, η διπλή παύλα δεν χωρίζεται με κενά διαστήματα από τη λέξη, φράση ή πρόταση που περικλείει· αντίθετα, μπαίνουν διαστήματα πριν από την πρώτη και μετά τη δεύτερη παύλα»",
50
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
51
+ "note": "Justifies \"none\" on BOTH fields, which no other locale has — but for TWO DIFFERENT REASONS, and conflating them would misrepresent the source. Range: genuinely ambivalent. The rule appears twice in §10.1.8, once under «Ενωτικό (-)» and once under «Παύλα μεσαίου μεγέθους (–)», and each occurrence explicitly concedes the other mark. That mutual concession is the proof — a source that names both forms in both places is not being vague, it is declining to rank them, and substituting either would express a preference the citation does not carry. Parenthetical: NOT ambivalent. The guide prescribes a U+2014 pair (its own header gives «Alt 0151») with ordinary spaces outside the pair and none on the inner edges. \"none\" here is forced by a SCHEMA LIMIT, not by the source: locale.schema.json's dash enum has no value for asymmetric spacing — \"em-spaced\" puts a space on each side of each dash, which is precisely what this sentence forbids. See spec/rules/dashes.md §6 «el», which states the two justifications separately. SOURCE CONFLICT, recorded and deliberately not settled: this guide prescribes U+2014 for the parenthetical dash, while ΥΠΕΠΘ/ΙΤΥΕ Γραμματική Α΄–Γ΄ Γυμνασίου §3.3 appears to set U+2013 in the same role. The sources array has no way to represent a conflict — it models agreement, not disagreement — so it is recorded here in prose. Resolving it is with the operator and needs a source that ranks the two, not a third that adds a form. Retrieved 2026-08-15."
52
+ },
53
+ {
54
+ "rule": "ellipsis",
55
+ "cite": "Διοργανικό εγχειρίδιο σύνταξης κειμένων (EL, 2011), §10.1.9 «Αποσιωπητικά»: «Τα αποσιωπητικά, που είναι πάντοτε τρεις (και όχι περισσότερες) τελείες, χρησιμοποιούνται κυρίως: […]»· παρατήρηση ii): «Μεταξύ των αποσιωπητικών και της λέξης που προηγείται δεν αφήνουμε διάστημα»· παρατήρηση iii): «Όταν τα αποσιωπητικά βρίσκονται στο τέλος της περιόδου δεν προσθέτουμε τελεία»",
56
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
57
+ "note": "Justifies abbreviatedAfterTerminal = false. The source requires exactly three dots always and nowhere provides for the two-dot form after «?» or «!» that Russian uses, so the Russian branch of spec/rules/ellipsis.md must stay off for Greek. Corroborated by Γραμματική Α΄–Γ΄ Γυμνασίου §3.3: «Οι σημειούμενες τελείες είναι πάντα τρεις». Neither source gives any rule for αποσιωπητικά meeting the ερωτηματικό or the θαυμαστικό — checked specifically, in the Ministry of Education grammar and in the Κέντρο Ελληνικής Γλώσσας materials — so the engine's TERMINAL class is deliberately left as {U+0021, U+003F} and the Greek U+003B is not added to it (spaces.md §7.8; adding it would also regress Russian, where Лопатин §154 ties the two-dot form to «?» and «!» by name). Neither source addresses U+2026 versus three U+002E; that choice is the engine's, made identically in every locale, and is not claimed here. KNOWN DIVERGENCE, recorded because a verified source and the engine disagree and neither may stand unremarked: the same §10.1.9, παρατήρηση ii), states «Μεταξύ των αποσιωπητικών και της λέξης που προηγείται δεν αφήνουμε διάστημα» - no space between the ellipsis and the preceding word - and polytypo does NOT honour it. spec/rules/spaces.md §3.4 preserves a space before a dot run in EVERY locale, so «Πράγματι …» is returned as typed. The divergence is deliberate and argued in spaces.md §7.9 and ellipsis.md §6: honouring it needs either locale data in a rule that has none by design, or an ellipsis rule that deletes rather than replaces, which changes that rule's kind and forces a new composition argument. It would be revisited if a second locale wanted the same behaviour, at which point the shape is an ellipsis.noSpaceBefore flag consumed by the ellipsis rule. The source is right about Greek; the engine is declining to act on it, not disputing it. Retrieved 2026-08-15."
58
+ },
59
+ {
60
+ "rule": "spaces",
61
+ "cite": "Διοργανικό εγχειρίδιο σύνταξης κειμένων (EL, 2011), §10.1.4 «Διπλή τελεία», παρατήρηση iv): «Στα ελληνικά, πριν από τη διπλή τελεία δεν πρέπει να υπάρχει διάστημα (πράγμα που συμβαίνει, π.χ., στα γαλλικά)»· §10.1.3 «Άνω τελεία», παρατηρήσεις ii) και iii): «Στα ελληνικά, πριν από την άνω τελεία δεν πρέπει να υπάρχει διάστημα»· «Μετά την άνω τελεία αρχίζουμε με μικρό γράμμα»",
62
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
63
+ "note": "Note the exact standing of this citation, because it is weaker than the claim it is often read as supporting. Neither passage is about the ερωτηματικό: they are about the colon and the άνω τελεία. What they establish is that Greek denies the French space-before-punctuation pattern, by name, for the marks they do cover. No source examined addresses spacing before the Greek question mark specifically, so the position is \"no source contradicts it\", NOT \"a source requires it\". Nothing rests on the difference: the Greek question mark is written U+003B, which spec/rules/spaces.md lists in STRIP-BEFORE for the Latin semicolon on its own merits, so the space is stripped under the Latin reading alone and no Greek-specific decision is being made (spaces.md §3.5 part 2). The §6.4 spacing table is deliberately NOT offered as corroboration here — the nbsp source in this same file rejects §6.4 as publisher house style rather than evidence about Greek, and it cannot be house style there and evidence here. Retrieved 2026-08-15."
64
+ },
65
+ {
66
+ "rule": "nbsp",
67
+ "cite": "Διοργανικό εγχειρίδιο σύνταξης κειμένων (EL, 2011), §10.1.4 παρατήρηση iv) και §10.1.3 παρατήρηση ii) (ό.π., ρητή αντιπαραβολή με τα γαλλικά)· §10.6 «Συντομογραφίες», γενικός κανόνας γ): «Στις ελληνικές συντομογραφίες με τις οποίες συντέμνονται φράσεις που αποτελούνται από περισσότερες της μίας λέξεις μπαίνει κατά κανόνα τελεία έπειτα από κάθε συντεμνόμενη λέξη» (π.χ. κ.λπ., π.χ., πρβλ., κ.ο.κ.)",
68
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
69
+ "note": "Two empty lists closed by citation rather than by absence of one. beforePunctuation and narrowBeforePunctuation are empty because Greek takes neither U+00A0 nor U+202F before «;» «:» «!» «·» — the source denies the French practice by name. abbreviations is empty because Greek multi-word abbreviations appear to be written with no internal space at all (κ.λπ., not «κ. λπ.»), so there is no U+0020 for the rule to promote. INFERENCE, NOT CITATION: §10.6 γ) states only that a full stop follows each abbreviated word; it says nothing about spacing between them. The no-space form is visible in the guide's own printed examples and in no normative sentence examined. The list would be empty on the absence of a citation alone (docs/PLAN.md §6.1), so nothing rests on the inference — it is labelled because an unlabelled inference in a cite field is the failure mode this field exists to prevent. The remaining lists are empty because no Greek normative source examined states a binding: the one candidate, the §6.4 table binding a number to «%» and «°C», sits in Part Three — «Συμβατικοί κανόνες κοινοί για ΟΛΕΣ τις γλώσσες» — whose own preamble says it replaced diverging national rules for uniform presentation, which makes it publisher house style rather than evidence about Greek. A missing citation is never a licence to guess (docs/PLAN.md §6.1). Observed usage does not contradict that reading, which is worth recording because it was checked rather than assumed: a byte-level scan on 2026-08-15 of the Greek-language home pages of kathimerini.gr, kathimerini.gr/economy, tovima.gr, tanea.gr, efsyn.gr, in.gr, naftemporiki.gr, protagon.gr, lifo.gr, meteo.gr, kedros.gr, onassis.org/el and emst.gr found 183 number-plus-unit occurrences — 140 «%», 41 «°C», 2 «€» — and NOT ONE of them carried a space of any kind, no U+0020, no U+00A0. Greek web practice sets «50%» and «20°C» tight, so beforeUnits would have nothing to promote even if it were populated. Method, so the figure can be re-derived rather than taken on trust: fetch each page, strip script, style and noscript elements and then all tags, decode HTML entities (so that   becomes the U+00A0 it denotes rather than disappearing), and count matches of a digit followed by an optional single space character from {U+0020, U+00A0, U+202F, U+2009} followed by the unit. Pages carrying under 200 Greek letters were excluded as not being Greek-language content. That scan is an observation of usage, is not offered as a normative claim, and nothing in this file depends on it: the lists would be empty on the absence of a citation alone. Retrieved 2026-08-15."
70
+ },
71
+ {
72
+ "rule": "hyphen",
73
+ "cite": "Διοργανικό εγχειρίδιο σύνταξης κειμένων (EL, 2011), §10.1.8, υποενότητα «Ενωτικό (-)»: «Η μικρή οριζόντια παύλα, το βραχύτερο σε μήκος από τα τρία σημεία […] σημειώνεται χωρίς κενά σε σχέση με ό,τι προηγείται ή έπεται»",
74
+ "url": "http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2",
75
+ "note": "Justifies all three lists being empty. The source describes what the hyphen does — syllable division, numeric bounds, appositional compounds such as «απόφαση-πλαίσιο» — without defining any closed list of morphological forms whose hyphen must resist a line break, which is the only thing this rule consumes. No Greek source examined defines one. Empty lists make the rule a provable total no-op for Greek (spec/rules/hyphen.md §2), which is the normal case, not a deficiency. Retrieved 2026-08-15."
76
+ },
77
+ {
78
+ "rule": "apostrophe",
79
+ "cite": "ΥΠΕΠΘ / Ινστιτούτο Τεχνολογίας Υπολογιστών και Εκδόσεων, Γραμματική Νέας Ελληνικής Γλώσσας Α΄, Β΄, Γ΄ Γυμνασίου, §3.3 «Η στίξη — Τα σημεία στίξης»: «Η απόστροφος ( ’ ) χρησιμοποιείται για να δηλώσει ότι ένα φωνήεν έχει παραλειφθεί στη γραφή λόγω της προφοράς»· και, για την ταυτότητα του κωδικού σημείου, The Unicode Standard 17.0, Core Specification, §6.2.7 «Apostrophes»: «When text is set, U+2019 RIGHT SINGLE QUOTATION MARK is preferred as apostrophe, but only U+0027 is present on most keyboards»",
80
+ "url": "https://ebooks.edu.gr/ebooks/v/html/8547/2334/Grammatiki-Neas-Ellinikis-Glossas_A-B-G-Gymnasiou_html-apli/index_B_03.html",
81
+ "note": "Two sources for two separate facts. The Greek grammar establishes that elision and apocope (γι’ αυτό, απ’ την, σ’ αυτό) are marked with an apostrophe; the code point comes only from Unicode, because no Greek normative source examined names one. U+02BC is refused: Unicode §6.2.7 reserves it for use as a modifier letter, e.g. a glottal stop in transliteration. U+0384 GREEK TONOS is refused: no source proposes a diacritic in this role. The rule reads no locale data, so this citation certifies rather than configures — but Greek elision is the shape the rule most often meets in Greek text, and it earns a fixture. Retrieved 2026-08-15."
82
+ },
83
+ {
84
+ "rule": "symbols",
85
+ "cite": "Unicode Consortium, The Unicode Standard, Version 17.0, Core Specification, ch. 7 «Europe-I», §7.2.1 Greek, «Compatibility Punctuation», verbatim: «Therefore, use of U+037E and U+0387 is not necessary for interoperating with legacy Greek data, and their use is not generally encouraged for representation of Greek punctuation.» The preceding sentence of that subsection — to the effect that the two characters have canonical equivalences to U+003B and U+00B7, so that normalised Greek text loses the distinction — is given here as PARAPHRASE, not as quotation: it could not be confirmed word for word at review time. Its substance does not rest on the prose in any case; it is entailed directly by UnicodeData.txt, where U+037E carries the canonical decomposition mapping 003B and U+0387 carries 00B7, each as a singleton",
86
+ "url": "https://www.unicode.org/versions/Unicode17.0.0/core-spec/chapter-7/",
87
+ "note": "Code-point identity only, which is the one thing this source is authoritative for. Note the split standing of the citation: one sentence is verbatim, one is paraphrase backed by UnicodeData.txt rather than by the Core Specification's wording, and the file says which is which. Everything the rules do rests on the machine-readable field, not on the prose. The ερωτηματικό is written U+003B, not U+037E; the άνω τελεία is written U+00B7, not U+0387. Consequence for the rules: no rule may emit U+037E or U+0387, and none may rewrite one to the character it decomposes to — that is normalisation, forbidden by docs/ARCHITECTURE.md §4.3 and performed anyway by any downstream NFC pass. The full argument, including why U+00B7 must not join the spaces rule's STRIP-BEFORE set, is in spec/rules/spaces.md §3.5. Retrieved 2026-08-15."
88
+ }
89
+ ]
90
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "locale": "en-GB",
3
+ "name": "English (United Kingdom)",
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
+ },
17
+ "dash": {
18
+ "parenthetical": "en-spaced",
19
+ "range": "en-tight"
20
+ },
21
+ "ellipsis": {
22
+ "abbreviatedAfterTerminal": false
23
+ },
24
+ "hyphen": {
25
+ "prefixes": [],
26
+ "suffixes": [],
27
+ "compounds": []
28
+ },
29
+ "nbsp": {
30
+ "beforePunctuation": [],
31
+ "narrowBeforePunctuation": [],
32
+ "afterShortWords": [],
33
+ "abbreviations": [],
34
+ "beforeUnits": [
35
+ "%",
36
+ "kg",
37
+ "g",
38
+ "mg",
39
+ "km",
40
+ "m",
41
+ "cm",
42
+ "mm",
43
+ "mi",
44
+ "ft",
45
+ "lb",
46
+ "oz",
47
+ "L",
48
+ "mL",
49
+ "h",
50
+ "min",
51
+ "s",
52
+ "ms",
53
+ "°C",
54
+ "°F",
55
+ "kB",
56
+ "MB",
57
+ "GB",
58
+ "TB",
59
+ "kW",
60
+ "kWh"
61
+ ],
62
+ "beforeNumber": [],
63
+ "beforeWord": [],
64
+ "afterSymbols": [],
65
+ "initialBinding": "none"
66
+ },
67
+ "sources": [
68
+ {
69
+ "rule": "quotes",
70
+ "cite": "University of Oxford Style Guide, section “Quotation marks”",
71
+ "url": "https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation",
72
+ "note": "Verbatim: “Use single quotation marks for direct speech or a quote, and double quotation marks for direct speech or a quote within that.” Example given: ‘I have never been to Norway,’ he said, ‘but I have heard it described as “the Wales of the North”.’ This settles the ❓ in PLAN.md §7 in favour of single-first. The convention is genuinely divided in British practice — several national newspapers and trade publishers set double-first — but the cited Oxford authority (and New Hart’s Rules behind it) is unambiguous, and citation, not head-count, is the tie-breaker per ARCHITECTURE.md §8."
73
+ },
74
+ {
75
+ "rule": "dashes",
76
+ "cite": "University of Oxford Style Guide, section “Dashes and hyphens”",
77
+ "url": "https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation",
78
+ "note": "Verbatim, m-dash (—): “Do not use; use an n-dash instead.” n-dash (–): “Use in a pair in place of round brackets or commas, surrounded by spaces” (example: “It was – as far as I could tell – the only example of its kind.”), and “Use to link concepts or ranges of numbers, with no spaces either side” (example: “The salary for the post is £25,000–£30,000.”). Corroborated by CMOS Shop Talk, 23 January 2024: “In British style, spaced en dashes – like this – are more common.”"
79
+ },
80
+ {
81
+ "rule": "ellipsis",
82
+ "cite": "University of Oxford Style Guide, section “Ellipsis”",
83
+ "url": "https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation",
84
+ "note": "`abbreviatedAfterTerminal` is false. The Oxford guide describes the ellipsis as a single mark used for omitted text, a pause or a trailing off, and notes “an exclamation mark or a question mark can and should follow the ellipsis if required” — i.e. no merged two-dot form after terminal punctuation. That form is Russian-only."
85
+ },
86
+ {
87
+ "rule": "nbsp",
88
+ "cite": "BIPM, The International System of Units (SI), 9th ed. (2019), concise summary, “The language of science: using the SI to express the values of quantities”",
89
+ "url": "https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf",
90
+ "note": "Verbatim: “A single space is always left between the number and the unit.” Used here because the University of Oxford Style Guide sets measurements closed up (“The average height of a woman in the UK is 1.61m.”, “worth 10% of the available marks”) and is therefore silent on binding a space it does not itself write. The nbsp rule never inserts a space — it only makes an author-typed space non-breaking — so the two positions do not conflict."
91
+ },
92
+ {
93
+ "rule": "nbsp",
94
+ "cite": "University of Oxford Style Guide, “Specific abbreviations — people’s initials”",
95
+ "url": "https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation",
96
+ "note": "`initialBinding` is \"none\" (spec 0.6.0: the field used to be the boolean bindInitials, false). Oxford says only “Use a space to separate each initial” (examples: J R R Tolkien, C S Lewis — note, without full stops). No British authority consulted prescribes a non-breaking space there, so the true value is set rather than inferred from the American rule. Deliberate divergence from en-US, where Chicago states the nonbreaking space explicitly."
97
+ },
98
+ {
99
+ "rule": "nbsp",
100
+ "cite": "No normative source found for English short-word binding; lists deliberately empty",
101
+ "note": "`afterShortWords`, `beforePunctuation`, `narrowBeforePunctuation`, `abbreviations` and `afterSymbols` are empty by design. Oxford instructs “close up spaces and don’t use full stops in abbreviations (eg 6pm)”, so there are no multi-token abbreviations with internal spaces to bind."
102
+ },
103
+ {
104
+ "rule": "nbsp",
105
+ "cite": "University of Oxford Style Guide, “Abbreviations, contractions and acronyms”",
106
+ "url": "https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation",
107
+ "note": "`beforeNumber` and `beforeWord` are empty. Oxford says “Don’t use full stops after any abbreviations, contractions or acronyms”, so the British forms this field would hold (p., no., fig., ch., Mr., Dr.) are not even written with a full stop in this style, and nothing in the guide requires a non-breaking space after them. Per PLAN.md §7 the Mr./Dr. + name binding is an optional rule defaulting off; with no per-entry toggle in the schema, and no normative source requiring it, the honest value is an empty list."
108
+ },
109
+ {
110
+ "rule": "hyphen",
111
+ "cite": "No English authority prescribes non-breaking hyphens for particular word forms; lists deliberately empty",
112
+ "note": "`prefixes`, `suffixes` and `compounds` are empty. The field exists for languages with a closed, normative set of hyphenated morphological forms (Russian кое-, -таки, из-под). The Oxford guide’s hyphen section describes when to hyphenate (adjectival phrases before a noun, verb participles) and never restricts breaking at the resulting hyphen. An English list here would be an invented sample."
113
+ }
114
+ ]
115
+ }
@@ -0,0 +1,133 @@
1
+ {
2
+ "locale": "en-US",
3
+ "name": "English (United States)",
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
+ {
17
+ "left": "rock",
18
+ "elided": "n",
19
+ "right": "roll"
20
+ }
21
+ ]
22
+ },
23
+ "dash": {
24
+ "parenthetical": "em-tight",
25
+ "range": "en-tight"
26
+ },
27
+ "ellipsis": {
28
+ "abbreviatedAfterTerminal": false
29
+ },
30
+ "hyphen": {
31
+ "prefixes": [],
32
+ "suffixes": [],
33
+ "compounds": []
34
+ },
35
+ "nbsp": {
36
+ "beforePunctuation": [],
37
+ "narrowBeforePunctuation": [],
38
+ "afterShortWords": [],
39
+ "abbreviations": [],
40
+ "beforeUnits": [
41
+ "%",
42
+ "kg",
43
+ "g",
44
+ "mg",
45
+ "km",
46
+ "m",
47
+ "cm",
48
+ "mm",
49
+ "mi",
50
+ "ft",
51
+ "lb",
52
+ "oz",
53
+ "L",
54
+ "mL",
55
+ "h",
56
+ "min",
57
+ "s",
58
+ "ms",
59
+ "°C",
60
+ "°F",
61
+ "kB",
62
+ "MB",
63
+ "GB",
64
+ "TB",
65
+ "kW",
66
+ "kWh"
67
+ ],
68
+ "beforeNumber": [],
69
+ "beforeWord": [],
70
+ "afterSymbols": [],
71
+ "initialBinding": "chain"
72
+ },
73
+ "sources": [
74
+ {
75
+ "rule": "quotes",
76
+ "cite": "The Chicago Manual of Style, 18th ed., 6.11 (quotations within quotations); CMOS Q&A, topic “Quotations”",
77
+ "url": "https://www.chicagomanualofstyle.org/qanda/data/faq/topics/Quotations/faq0025.html",
78
+ "note": "US practice: double quotation marks at the first level, single at the second. CMOS 6.11: “When single quotation marks are nested within double quotation marks, and two of the marks appear next to each other, a space between the two marks, though not strictly required, aids legibility.” That optional legibility space is a typesetting refinement and is not expressed in this file."
79
+ },
80
+ {
81
+ "rule": "quotes",
82
+ "cite": "Chicago Manual of Style Online Q&A, topic “Special Characters”: “If you want, for example, an apostrophe rather than an opening single quotation mark at the beginning of a string (e.g., the apostrophe before the n in “rock ’n’ roll”), you must tell the computer that that's what you want.”",
83
+ "url": "https://www.chicagomanualofstyle.org/qanda/data/faq/topics/SpecialCharacters/faq0002.html",
84
+ "note": "Supports quotes.elisionIdioms = [{ left: \"rock\", elided: \"n\", right: \"roll\" }]: the leading mark of the elision must not be resolved as an opening quotation mark. CMOS states the mark's function, not a code point; U+2019 follows from spec/rules/apostrophe.md, which is unchanged. Reproduced verbatim, including CMOS's own U+2019 in “rock ’n’ roll” — not straightened to U+0027 — because it is a direct quotation of the source's printed text. Edition/section not fully cited: the page reports 17th ed. in-body while the site titles itself 18th ed., and the numbered CMOS section is paywalled."
85
+ },
86
+ {
87
+ "rule": "quotes",
88
+ "cite": "American Heritage Dictionary of the English Language, entry “rock and roll”: headword line “rock-and-roll or rock 'n' roll”, the elided variant spaced as rock 'n' roll with a mark on each side of the bare word n.",
89
+ "url": "https://www.ahdictionary.com/word/search.html?q=rock+and+roll",
90
+ "note": "Attests the spaced two-mark orthography of the \"rock\"/\"n\"/\"roll\" idiom only — this citation supports no other elisionIdioms entry. In particular it does not attest \"fish 'n' chips\", which is not listed here and would need its own citation before being added; the field is a closed set of individually evidenced idioms, not a general elision-word list."
91
+ },
92
+ {
93
+ "rule": "dashes",
94
+ "cite": "The Chicago Manual of Style — CMOS Shop Talk, “Hyphens and Dashes: A Refresher”, 23 January 2024",
95
+ "url": "https://cmosshoptalk.com/2024/01/23/hyphens-and-dashes-a-refresher/",
96
+ "note": "Verbatim: “In Chicago style, such dashes consist of em dashes—like this—with no space before or after.” And: “When consecutive digits express a range, however, they are separated in Chicago style not by hyphens but by en dashes, as in the range 3–5.”"
97
+ },
98
+ {
99
+ "rule": "ellipsis",
100
+ "cite": "The Chicago Manual of Style, 18th ed., ellipses (three dots)",
101
+ "url": "https://cmosshoptalk.com/2021/06/15/navigating-spaces-in-manuscripts-and-beyond/",
102
+ "note": "`abbreviatedAfterTerminal` is false: the two-dot form after `!`/`?` is a Russian convention with no counterpart in English usage. Chicago’s spaced ellipsis (. . .) is a print-typesetting variant, not a separate character sequence this spec models."
103
+ },
104
+ {
105
+ "rule": "nbsp",
106
+ "cite": "The Chicago Manual of Style — CMOS Shop Talk, “Navigating Spaces in Manuscripts and Beyond”, 15 June 2021",
107
+ "url": "https://cmosshoptalk.com/2021/06/15/navigating-spaces-in-manuscripts-and-beyond/",
108
+ "note": "Chicago recommends a nonbreaking space “between two or more initials in a name like ‘E. B. White’” (hence initialBinding: \"chain\" — spec 0.6.0: the field used to be the boolean bindInitials; Chicago's own “two or more” wording is the citation for the chain requirement, not merely for turning N7 on) and “between a numeral and an abbreviated unit of measure, as in ‘10 kg’” (hence beforeUnits)."
109
+ },
110
+ {
111
+ "rule": "nbsp",
112
+ "cite": "BIPM, The International System of Units (SI), 9th ed. (2019), concise summary, “The language of science: using the SI to express the values of quantities”",
113
+ "url": "https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf",
114
+ "note": "Verbatim: “A single space is always left between the number and the unit.” This is the authority for the unit list itself; Chicago is the authority for making that space non-breaking. `%` is included even though Chicago sets percentages closed up (45%): the rule only converts a space the author already typed, and a spaced `45 %` in English is a deliberate scientific-style choice worth binding."
115
+ },
116
+ {
117
+ "rule": "nbsp",
118
+ "cite": "No normative source found for English short-word binding; list deliberately empty",
119
+ "note": "`afterShortWords`, `beforePunctuation` and `narrowBeforePunctuation` are empty by design. English typography has no equivalent of the Russian rule against leaving short prepositions at line end, and no English authority prescribes a space before terminal punctuation. `afterSymbols` is empty because no consulted source states that `§`/`№` bind to a following number in English."
120
+ },
121
+ {
122
+ "rule": "hyphen",
123
+ "cite": "No English authority prescribes non-breaking hyphens for particular word forms; lists deliberately empty",
124
+ "note": "`prefixes`, `suffixes` and `compounds` are empty. This field exists for languages with a closed, normative set of hyphenated morphological forms (Russian кое-, -таки, из-под). English hyphenation is productive and open-ended — self-, ex-, -like, well-known and thousands more — so any list would be an invented sample, not a specification. Chicago’s hyphenation guidance (its hyphenation table) governs whether to hyphenate, not whether the resulting hyphen may break, and Chicago explicitly permits breaking at a hyphen."
125
+ },
126
+ {
127
+ "rule": "nbsp",
128
+ "cite": "The Chicago Manual of Style — CMOS Shop Talk, “Navigating Spaces in Manuscripts and Beyond”, 15 June 2021 (exhaustive list of recommended nonbreaking spaces)",
129
+ "url": "https://cmosshoptalk.com/2021/06/15/navigating-spaces-in-manuscripts-and-beyond/",
130
+ "note": "`beforeNumber` and `beforeWord` are empty. Chicago enumerates exactly four places where it recommends a nonbreaking space — the middle dot of a spaced ellipsis, between initials in a name, between adjacent single and double quotation marks, and between a numeral and an abbreviated unit of measure. Reference abbreviations before a numeral (p. 12, fig. 3, chap. 4, vol. 2) are not among them, and no other consulted Chicago material requires the binding, so they are left out rather than inferred. `beforeWord` is empty for the same reason plus PLAN.md §7: the Mr./Dr. + name binding is an optional rule defaulting off, and no normative source requires it — locale data must not turn an opt-in preference into a default."
131
+ }
132
+ ]
133
+ }