polytypo 1.17.2 → 1.17.3

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/polytypo/data/VERSION +1 -1
  3. data/lib/polytypo/data/fixtures/bg.json +1 -1
  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 +9 -26
  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 +154 -516
  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 +12 -37
  14. data/lib/polytypo/data/fixtures/hr.json +1 -1
  15. data/lib/polytypo/data/fixtures/hu.json +1 -1
  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/lt.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 +1 -1
  27. data/lib/polytypo/data/fixtures/sr.json +1 -1
  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 +1 -1
  32. data/lib/polytypo/data/rules/order.json +1 -1
  33. data/lib/polytypo/version.rb +1 -1
  34. metadata +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "1.17.2",
2
+ "spec": "1.17.3",
3
3
  "locale": "en-US",
4
4
  "cases": [
5
5
  {
@@ -1908,9 +1908,7 @@
1908
1908
  "rule": "quotes",
1909
1909
  "mode": "markdown",
1910
1910
  "dialect": "commonmark",
1911
- "frontmatterKeys": [
1912
- "title"
1913
- ],
1911
+ "frontmatterKeys": ["title"],
1914
1912
  "in": "---\ntitle: \"He said 'hi' twice\"\nslug: \"he-said-hi\"\n---\n\nBody has \"quotes\" here.\n",
1915
1913
  "out": "---\ntitle: \"He said “hi” twice\"\nslug: \"he-said-hi\"\n---\n\nBody has “quotes” here.\n",
1916
1914
  "note": "modes.md §3.7.4: the option names title, so that scalar is processable and everything else in the block — the unlisted slug, both delimiters, every key — is not. Compare en-us-markdown-commonmark-frontmatter, the same shape with the option absent."
@@ -1930,9 +1928,7 @@
1930
1928
  "rule": "dashes",
1931
1929
  "mode": "markdown",
1932
1930
  "dialect": "commonmark",
1933
- "frontmatterKeys": [
1934
- "title"
1935
- ],
1931
+ "frontmatterKeys": ["title"],
1936
1932
  "in": "---\ndescription: \"Fast - reliable\"\n---\n\nBody - here.\n",
1937
1933
  "out": "---\ndescription: \"Fast - reliable\"\n---\n\nBody—here.\n",
1938
1934
  "note": "modes.md §3.7.4: a block containing none of the listed keys is left exactly as the skip left it. The same dash converts in the body, so the case pins that the block was not processed rather than that the rule declined."
@@ -1942,9 +1938,7 @@
1942
1938
  "rule": "quotes",
1943
1939
  "mode": "markdown",
1944
1940
  "dialect": "commonmark",
1945
- "frontmatterKeys": [
1946
- "title"
1947
- ],
1941
+ "frontmatterKeys": ["title"],
1948
1942
  "in": "+++\ntitle = \"He said 'hi'\"\n+++\n\nBody has \"quotes\" here.\n",
1949
1943
  "out": "+++\ntitle = \"He said 'hi'\"\n+++\n\nBody has “quotes” here.\n",
1950
1944
  "note": "modes.md §3.7.4: a TOML block yields no spans with the option given. TOML quoting is a second grammar the scan does not claim (§7.13), so +++ keeps §3.7.3's skip-whole treatment whatever the caller lists."
@@ -1954,9 +1948,7 @@
1954
1948
  "rule": "quotes",
1955
1949
  "mode": "markdown",
1956
1950
  "dialect": "commonmark",
1957
- "frontmatterKeys": [
1958
- "title"
1959
- ],
1951
+ "frontmatterKeys": ["title"],
1960
1952
  "in": "---\ntitle: \"Unclosed\"\n\nBody \"quotes\" here.\n",
1961
1953
  "out": "---\ntitle: “Unclosed”\n\nBody “quotes” here.\n",
1962
1954
  "note": "modes.md §3.7.4: an opening delimiter with no closing one is not a block, so the option has nothing to name and adds no spans. The line converts anyway — as ordinary prose, per en-us-markdown-commonmark-frontmatter-unterminated — which is why the option must not be credited with it."
@@ -1966,9 +1958,7 @@
1966
1958
  "rule": "quotes",
1967
1959
  "mode": "markdown",
1968
1960
  "dialect": "commonmark",
1969
- "frontmatterKeys": [
1970
- "title"
1971
- ],
1961
+ "frontmatterKeys": ["title"],
1972
1962
  "in": "---\ntitle: \"She said \\\"hi\\\" to me\"\n---\n\nBody has \"quotes\" here.\n",
1973
1963
  "out": "---\ntitle: \"She said \\\"hi\\\" to me\"\n---\n\nBody has “quotes” here.\n",
1974
1964
  "note": "modes.md §3.7.4 inherits every bail of §3.8.6: a double-quoted scalar whose content contains U+005C yields no spans, because the source spells the content with more characters than it has. The listed key is not enough on its own."
@@ -1978,9 +1968,7 @@
1978
1968
  "rule": "ellipsis",
1979
1969
  "mode": "markdown",
1980
1970
  "dialect": "commonmark",
1981
- "frontmatterKeys": [
1982
- "title"
1983
- ],
1971
+ "frontmatterKeys": ["title"],
1984
1972
  "in": "---\ntitle: 'It''s a test...'\n---\n\nBody it's here.\n",
1985
1973
  "out": "---\ntitle: 'It''s a test…'\n---\n\nBody it’s here.\n",
1986
1974
  "note": "modes.md §3.7.4 inherits §3.8.6's split of `''` (spec 1.9.0): the value converts on both sides of the unit and the apostrophe it spells stays straight, while the body's own apostrophe converts. Until 1.9.0 the whole value yielded no spans."
@@ -1990,9 +1978,7 @@
1990
1978
  "rule": "quotes",
1991
1979
  "mode": "markdown",
1992
1980
  "dialect": "commonmark",
1993
- "frontmatterKeys": [
1994
- "title"
1995
- ],
1981
+ "frontmatterKeys": ["title"],
1996
1982
  "in": "---\ntitle: He said \"hello\n---\n\nworld\" she said\n",
1997
1983
  "out": "---\ntitle: He said \"hello\n---\n\nworld\" she said\n",
1998
1984
  "note": "modes.md §3.7.4: the block is its own text unit, so the unbalanced mark in title cannot pair with the one in the body. This case discriminates: run as one unit the pair converts — measured, text mode over the same characters gives “hello … world” — and under two units both marks stay straight. A runtime that concatenates the block with the body passes every other frontmatter case and fails this one."
@@ -2002,9 +1988,7 @@
2002
1988
  "rule": "quotes",
2003
1989
  "mode": "markdown",
2004
1990
  "dialect": "commonmark",
2005
- "frontmatterKeys": [
2006
- "title"
2007
- ],
1991
+ "frontmatterKeys": ["title"],
2008
1992
  "in": "---\nseo:\n title: He said \"hi\"\nslug: \"x\"\n---\n\nBody \"quotes\" here.\n",
2009
1993
  "out": "---\nseo:\n title: He said “hi”\nslug: \"x\"\n---\n\nBody “quotes” here.\n",
2010
1994
  "note": "modes.md §3.7.4 with §3.8.2's matching: a listed key is processable at any depth and by bare name only, so a nested title converts while the sibling slug does not. §7.12's accepted cost is the same one — a caller cannot say seo.title and not title."
@@ -2014,9 +1998,7 @@
2014
1998
  "rule": "dashes",
2015
1999
  "mode": "markdown",
2016
2000
  "dialect": "commonmark",
2017
- "frontmatterKeys": [
2018
- "summary"
2019
- ],
2001
+ "frontmatterKeys": ["summary"],
2020
2002
  "in": "---\nsummary: |\n One line - here.\n Another - line.\n---\n\nBody - here.\n",
2021
2003
  "out": "---\nsummary: |\n One line—here.\n Another—line.\n---\n\nBody—here.\n",
2022
2004
  "note": "modes.md §3.7.4 reuses §3.8.5: each non-blank content line of a listed block scalar is one span, the header and the indentation stay outside every span, and the gap between two content lines is a −2 marker."
@@ -2026,9 +2008,7 @@
2026
2008
  "rule": "quotes",
2027
2009
  "mode": "markdown",
2028
2010
  "dialect": "commonmark",
2029
- "frontmatterKeys": [
2030
- "title"
2031
- ],
2011
+ "frontmatterKeys": ["title"],
2032
2012
  "in": "---\r\ntitle: \"He said 'hi'\"\r\n---\r\n\r\nBody has \"quotes\" here.\r\n",
2033
2013
  "out": "---\r\ntitle: \"He said “hi”\"\r\n---\r\n\r\nBody has “quotes” here.\r\n",
2034
2014
  "note": "modes.md §3.7.4: a U+000D before the terminator belongs to the terminator, so a CRLF document gives the same block content as the same bytes with LF and the delimiters stay outside every span."
@@ -2038,9 +2018,7 @@
2038
2018
  "rule": "quotes",
2039
2019
  "mode": "markdown",
2040
2020
  "dialect": "mdx",
2041
- "frontmatterKeys": [
2042
- "title"
2043
- ],
2021
+ "frontmatterKeys": ["title"],
2044
2022
  "in": "---\ntitle: \"He said 'hi'\"\n---\n\n<Callout>Body \"quotes\" here</Callout>\n",
2045
2023
  "out": "---\ntitle: \"He said “hi”\"\n---\n\n<Callout>Body “quotes” here</Callout>\n",
2046
2024
  "note": "modes.md §3.7.4 applies to both dialects: YAML frontmatter is the same construct in mdx as in commonmark, and §3.7.3 lists it once for both."
@@ -2230,9 +2208,7 @@
2230
2208
  "id": "en-us-yaml-plain-value",
2231
2209
  "rule": "quotes",
2232
2210
  "mode": "yaml",
2233
- "keys": [
2234
- "description"
2235
- ],
2211
+ "keys": ["description"],
2236
2212
  "in": "description: He said \"hi\" to us\n",
2237
2213
  "out": "description: He said “hi” to us\n",
2238
2214
  "note": "modes.md §3.8.4: a plain scalar under a listed key is a processable span and converts exactly as text mode does."
@@ -2241,9 +2217,7 @@
2241
2217
  "id": "en-us-yaml-unlisted-key-untouched",
2242
2218
  "rule": "ellipsis",
2243
2219
  "mode": "yaml",
2244
- "keys": [
2245
- "description"
2246
- ],
2220
+ "keys": ["description"],
2247
2221
  "in": "description: one...two\nrun: three...four\n",
2248
2222
  "out": "description: one…two\nrun: three...four\n",
2249
2223
  "note": "modes.md §3.8.2: `keys` is the whole of what makes a scalar processable. A port that processes every string scalar changes the `run:` value too, which is the defect this option exists to prevent."
@@ -2261,9 +2235,7 @@
2261
2235
  "id": "en-us-yaml-key-never-processed",
2262
2236
  "rule": "ellipsis",
2263
2237
  "mode": "yaml",
2264
- "keys": [
2265
- "a...b"
2266
- ],
2238
+ "keys": ["a...b"],
2267
2239
  "in": "a...b: one...two\n",
2268
2240
  "out": "a...b: one…two\n",
2269
2241
  "note": "modes.md §3.8.4 step 5: keys are never processable, including the key that was matched against `keys`."
@@ -2272,9 +2244,7 @@
2272
2244
  "id": "en-us-yaml-colon-inside-key",
2273
2245
  "rule": "ellipsis",
2274
2246
  "mode": "yaml",
2275
- "keys": [
2276
- "a:b"
2277
- ],
2247
+ "keys": ["a:b"],
2278
2248
  "in": "a:b: one...two\n",
2279
2249
  "out": "a:b: one…two\n",
2280
2250
  "note": "modes.md §3.8.4 step 5: a colon not followed by U+0020 or the line end is an ordinary key character, so the key here is `a:b`. A port that stops at the first colon finds no key and yields no spans."
@@ -2283,9 +2253,7 @@
2283
2253
  "id": "en-us-yaml-quoted-scalar-with-colon",
2284
2254
  "rule": "ellipsis",
2285
2255
  "mode": "yaml",
2286
- "keys": [
2287
- "title"
2288
- ],
2256
+ "keys": ["title"],
2289
2257
  "in": "title: \"Chapter 1: one...two\"\n",
2290
2258
  "out": "title: \"Chapter 1: one…two\"\n",
2291
2259
  "note": "modes.md §3.8.6: the plain-scalar colon test does not apply to a quoted scalar — quoting neutralises the colon. A port that applies it declines this line."
@@ -2294,9 +2262,7 @@
2294
2262
  "id": "en-us-yaml-plain-colon-declined",
2295
2263
  "rule": "ellipsis",
2296
2264
  "mode": "yaml",
2297
- "keys": [
2298
- "description"
2299
- ],
2265
+ "keys": ["description"],
2300
2266
  "in": "description: She asked: one...two\n",
2301
2267
  "out": "description: She asked: one...two\n",
2302
2268
  "note": "modes.md §3.8.6 \"compact nesting is not a value\": a plain scalar containing a colon followed by U+0020 yields no spans, even though its key is listed. The line is not what it looks like — YAML reads it as a nested mapping and a real parser rejects the document outright (\"Nested mappings are not allowed in compact mappings\"), so a port that processes it is rewriting text it cannot read back. The pair with en-us-yaml-block-scalar-takes-the-same-colon is what makes the distinction visible: identical prose, opposite outcome, decided only by the value's form."
@@ -2305,9 +2271,7 @@
2305
2271
  "id": "en-us-yaml-block-scalar-takes-the-same-colon",
2306
2272
  "rule": "ellipsis",
2307
2273
  "mode": "yaml",
2308
- "keys": [
2309
- "description"
2310
- ],
2274
+ "keys": ["description"],
2311
2275
  "in": "description: |\n She asked: one...two\n",
2312
2276
  "out": "description: |\n She asked: one…two\n",
2313
2277
  "note": "modes.md §3.8.5: the compact-nesting bail of §3.8.6 belongs to the plain form alone and does not leak into a block scalar, so this line is processed. Paired with en-us-yaml-plain-colon-declined: identical prose, opposite outcome, decided only by the value's form. This case does NOT discriminate whether a port wrongly applies §3.8.6's colon split to block-scalar content — `one...two` is not adjacent to the colon, so such a port emits the same output; §8 item 3a's `-spaced` locale requirement is what covers that."
@@ -2316,9 +2280,7 @@
2316
2280
  "id": "en-us-yaml-block-literal-lines",
2317
2281
  "rule": "ellipsis",
2318
2282
  "mode": "yaml",
2319
- "keys": [
2320
- "description"
2321
- ],
2283
+ "keys": ["description"],
2322
2284
  "in": "description: |\n one...two\n three...four\n",
2323
2285
  "out": "description: |\n one…two\n three…four\n",
2324
2286
  "note": "modes.md §3.8.5: one span per content line, beginning after the block indentation; indentation beyond that is content and stays inside the span."
@@ -2327,9 +2289,7 @@
2327
2289
  "id": "en-us-yaml-chomping-clip",
2328
2290
  "rule": "ellipsis",
2329
2291
  "mode": "yaml",
2330
- "keys": [
2331
- "description"
2332
- ],
2292
+ "keys": ["description"],
2333
2293
  "in": "description: |\n one...two\n\n\nz: 1\n",
2334
2294
  "out": "description: |\n one…two\n\n\nz: 1\n",
2335
2295
  "note": "modes.md §3.8.5: the trailing line terminators the chomping indicator governs are outside every span. Compare en-us-yaml-chomping-strip and en-us-yaml-chomping-keep: three indicators, identical content edit, identical trailing bytes."
@@ -2338,9 +2298,7 @@
2338
2298
  "id": "en-us-yaml-chomping-strip",
2339
2299
  "rule": "ellipsis",
2340
2300
  "mode": "yaml",
2341
- "keys": [
2342
- "description"
2343
- ],
2301
+ "keys": ["description"],
2344
2302
  "in": "description: |-\n one...two\n\n\nz: 1\n",
2345
2303
  "out": "description: |-\n one…two\n\n\nz: 1\n",
2346
2304
  "note": "modes.md §3.8.5: `|-` differs from `|` only in bytes the mode never touches. A port that decodes the block and re-encodes it produces a different byte count here than for en-us-yaml-chomping-clip."
@@ -2349,9 +2307,7 @@
2349
2307
  "id": "en-us-yaml-chomping-keep",
2350
2308
  "rule": "ellipsis",
2351
2309
  "mode": "yaml",
2352
- "keys": [
2353
- "description"
2354
- ],
2310
+ "keys": ["description"],
2355
2311
  "in": "description: |+\n one...two\n\n\nz: 1\n",
2356
2312
  "out": "description: |+\n one…two\n\n\nz: 1\n",
2357
2313
  "note": "modes.md §3.8.5: `|+` keeps every trailing line terminator, and they are outside every span. This is the case the reported corruption in §3.8.1 failed."
@@ -2360,9 +2316,7 @@
2360
2316
  "id": "en-us-yaml-quotes-pair-across-block-lines",
2361
2317
  "rule": "quotes",
2362
2318
  "mode": "yaml",
2363
- "keys": [
2364
- "description"
2365
- ],
2319
+ "keys": ["description"],
2366
2320
  "in": "description: |\n He said \"hi\n there\" and left\n",
2367
2321
  "out": "description: |\n He said “hi\n there” and left\n",
2368
2322
  "note": "modes.md §3.2 model C: a block scalar's content lines are separate spans joined by a −2 marker, so a quotation opened on one line pairs with a mark on the next. A port that runs each line independently leaves both marks straight."
@@ -2371,10 +2325,7 @@
2371
2325
  "id": "en-us-yaml-multiline-quoted-untouched",
2372
2326
  "rule": "quotes",
2373
2327
  "mode": "yaml",
2374
- "keys": [
2375
- "a",
2376
- "b"
2377
- ],
2328
+ "keys": ["a", "b"],
2378
2329
  "in": "a: \"open here\n b: some prose \"word\" close\"\n",
2379
2330
  "out": "a: \"open here\n b: some prose \"word\" close\"\n",
2380
2331
  "note": "modes.md §3.8.4 step 7: a quoted scalar that does not close on its opening line consumes its continuation lines, which are never rescanned. A port that rescans them puts the scalar's own closing quote inside a span, and `quotes` can then leave the scalar unterminated."
@@ -2383,11 +2334,7 @@
2383
2334
  "id": "en-us-yaml-multiline-flow-untouched",
2384
2335
  "rule": "ellipsis",
2385
2336
  "mode": "yaml",
2386
- "keys": [
2387
- "a",
2388
- "b",
2389
- "c"
2390
- ],
2337
+ "keys": ["a", "b", "c"],
2391
2338
  "in": "a: {\n b: one...two,\n c: x\n}\n",
2392
2339
  "out": "a: {\n b: one...two,\n c: x\n}\n",
2393
2340
  "note": "modes.md §3.8.4 step 7: a flow collection spanning several lines consumes them all. A port that bails only on the opening line processes the interior and can edit next to the structural comma."
@@ -2396,9 +2343,7 @@
2396
2343
  "id": "en-us-yaml-block-ambiguous-indent-untouched",
2397
2344
  "rule": "ellipsis",
2398
2345
  "mode": "yaml",
2399
- "keys": [
2400
- "description"
2401
- ],
2346
+ "keys": ["description"],
2402
2347
  "in": "description: |\n deep one...two\n shallow three...four\n",
2403
2348
  "out": "description: |\n deep one...two\n shallow three...four\n",
2404
2349
  "note": "modes.md §3.8.5: a later content line dedented inside the block is ambiguous, so the whole block yields no spans rather than the scan guessing which line the author meant as content."
@@ -2407,9 +2352,7 @@
2407
2352
  "id": "en-us-yaml-not-yaml-untouched",
2408
2353
  "rule": "ellipsis",
2409
2354
  "mode": "yaml",
2410
- "keys": [
2411
- "description"
2412
- ],
2355
+ "keys": ["description"],
2413
2356
  "in": "{{ not yaml at all ... }}\n\t\tmixed\tindentation...\n",
2414
2357
  "out": "{{ not yaml at all ... }}\n\t\tmixed\tindentation...\n",
2415
2358
  "note": "modes.md §3.8.3: a construct the scan does not recognise yields no spans and the input comes back byte for byte. `transform` never throws on input in this mode."
@@ -2418,10 +2361,7 @@
2418
2361
  "id": "en-us-yaml-document-marker-prefix-untouched",
2419
2362
  "rule": "ellipsis",
2420
2363
  "mode": "yaml",
2421
- "keys": [
2422
- "description",
2423
- "--- description"
2424
- ],
2364
+ "keys": ["description", "--- description"],
2425
2365
  "in": "--- description: one...two\n",
2426
2366
  "out": "--- description: one...two\n",
2427
2367
  "note": "modes.md §3.8.4 step 3: a document marker introducing a node is declined along with the bare form, so no key of `--- description` can ever be formed."
@@ -2430,9 +2370,7 @@
2430
2370
  "id": "en-us-yaml-astral-preserved",
2431
2371
  "rule": "quotes",
2432
2372
  "mode": "yaml",
2433
- "keys": [
2434
- "description"
2435
- ],
2373
+ "keys": ["description"],
2436
2374
  "in": "description: A rocket 🚀 and a \"quote\"\n",
2437
2375
  "out": "description: A rocket 🚀 and a “quote”\n",
2438
2376
  "note": "modes.md §4: offsets are code points, not code units. A runtime indexing UTF-16 code units mis-slices the span after the astral character."
@@ -2449,9 +2387,7 @@
2449
2387
  "id": "en-us-yaml-folded-clip",
2450
2388
  "rule": "ellipsis",
2451
2389
  "mode": "yaml",
2452
- "keys": [
2453
- "description"
2454
- ],
2390
+ "keys": ["description"],
2455
2391
  "in": "description: >\n one...two\n\n\nz: 1\n",
2456
2392
  "out": "description: >\n one…two\n\n\nz: 1\n",
2457
2393
  "note": "modes.md §3.8.5: `>` is handled identically to `|` because the difference between them lives entirely in bytes the mode never touches. Companion to en-us-yaml-folded-strip and en-us-yaml-folded-keep."
@@ -2460,9 +2396,7 @@
2460
2396
  "id": "en-us-yaml-folded-strip",
2461
2397
  "rule": "ellipsis",
2462
2398
  "mode": "yaml",
2463
- "keys": [
2464
- "description"
2465
- ],
2399
+ "keys": ["description"],
2466
2400
  "in": "description: >-\n one...two\n\n\nz: 1\n",
2467
2401
  "out": "description: >-\n one…two\n\n\nz: 1\n",
2468
2402
  "note": "modes.md §3.8.5: identical content edit and identical trailing bytes to en-us-yaml-folded-clip and en-us-yaml-folded-keep — a port that decodes the block and re-encodes it produces three different byte counts."
@@ -2471,9 +2405,7 @@
2471
2405
  "id": "en-us-yaml-folded-keep",
2472
2406
  "rule": "ellipsis",
2473
2407
  "mode": "yaml",
2474
- "keys": [
2475
- "description"
2476
- ],
2408
+ "keys": ["description"],
2477
2409
  "in": "description: >+\n one...two\n\n\nz: 1\n",
2478
2410
  "out": "description: >+\n one…two\n\n\nz: 1\n",
2479
2411
  "note": "modes.md §3.8.5: `>+` keeps every trailing line terminator, and they lie outside every span. Completes the six chomping indicators with en-us-yaml-chomping-clip, -strip and -keep."
@@ -2482,9 +2414,7 @@
2482
2414
  "id": "en-us-yaml-quoted-key-untouched",
2483
2415
  "rule": "ellipsis",
2484
2416
  "mode": "yaml",
2485
- "keys": [
2486
- "description"
2487
- ],
2417
+ "keys": ["description"],
2488
2418
  "in": "\"description\": one...two\n",
2489
2419
  "out": "\"description\": one...two\n",
2490
2420
  "note": "modes.md §3.8.4 step 5 and §7.11: a key containing a quote is declined before it is ever compared against `keys`, so a document that quotes its keys gets nothing from this mode. An accepted cost, pinned so it is a decision rather than a surprise."
@@ -2493,9 +2423,7 @@
2493
2423
  "id": "en-us-yaml-bang-in-key-untouched",
2494
2424
  "rule": "ellipsis",
2495
2425
  "mode": "yaml",
2496
- "keys": [
2497
- "a!b"
2498
- ],
2426
+ "keys": ["a!b"],
2499
2427
  "in": "a!b: one...two\n",
2500
2428
  "out": "a!b: one...two\n",
2501
2429
  "note": "modes.md §3.8.4 step 5: the character test applies at every position of the key, not only the first, so a key merely containing `!` is declined too. A port testing only the first position processes this line and diverges."
@@ -2504,9 +2432,7 @@
2504
2432
  "id": "en-us-yaml-same-key-two-depths",
2505
2433
  "rule": "ellipsis",
2506
2434
  "mode": "yaml",
2507
- "keys": [
2508
- "description"
2509
- ],
2435
+ "keys": ["description"],
2510
2436
  "in": "description: one...two\nnested:\n inner:\n description: three...four\n",
2511
2437
  "out": "description: one…two\nnested:\n inner:\n description: three…four\n",
2512
2438
  "note": "modes.md §3.8.2: `keys` matches a bare name at any depth and nothing narrower. Both occurrences convert; a port that matches only at the top level converts one."
@@ -2515,9 +2441,7 @@
2515
2441
  "id": "en-us-yaml-crlf-block",
2516
2442
  "rule": "ellipsis",
2517
2443
  "mode": "yaml",
2518
- "keys": [
2519
- "description"
2520
- ],
2444
+ "keys": ["description"],
2521
2445
  "in": "description: |\r\n one...two\r\n",
2522
2446
  "out": "description: |\r\n one…two\r\n",
2523
2447
  "note": "modes.md §3.8.4: a U+000D immediately before the U+000A is a terminator, not part of the line, so a CRLF file yields the same spans as the same bytes with LF and the carriage returns come back untouched. A port splitting lines on U+000A alone reads the header as `|` + U+000D and yields nothing."
@@ -2526,9 +2450,7 @@
2526
2450
  "id": "en-us-yaml-sequence-entry",
2527
2451
  "rule": "ellipsis",
2528
2452
  "mode": "yaml",
2529
- "keys": [
2530
- "description"
2531
- ],
2453
+ "keys": ["description"],
2532
2454
  "in": "- description: one...two\n- - description: three...four\n",
2533
2455
  "out": "- description: one…two\n- - description: three…four\n",
2534
2456
  "note": "modes.md §3.8.4 step 4: block sequence entries are consumed rather than skipped, and they nest."
@@ -2537,9 +2459,7 @@
2537
2459
  "id": "en-us-yaml-single-quoted",
2538
2460
  "rule": "ellipsis",
2539
2461
  "mode": "yaml",
2540
- "keys": [
2541
- "description"
2542
- ],
2462
+ "keys": ["description"],
2543
2463
  "in": "description: 'one...two'\n",
2544
2464
  "out": "description: 'one…two'\n",
2545
2465
  "note": "modes.md §3.8.6: a single-quoted scalar's content is one span; the quotes themselves are outside it."
@@ -2548,9 +2468,7 @@
2548
2468
  "id": "en-us-yaml-single-quoted-escape-split",
2549
2469
  "rule": "ellipsis",
2550
2470
  "mode": "yaml",
2551
- "keys": [
2552
- "description"
2553
- ],
2471
+ "keys": ["description"],
2554
2472
  "in": "description: 'it''s one...two'\n",
2555
2473
  "out": "description: 'it''s one…two'\n",
2556
2474
  "note": "modes.md §3.8.6 (spec 1.9.0): `''` is one apostrophe of content spelled with two code points, so it is an opaque skipped unit and the scalar is split around it. Everything on either side converts; the apostrophe it spells is outside every span and stays U+0027. Until 1.9.0 the whole scalar yielded no spans."
@@ -2559,9 +2477,7 @@
2559
2477
  "id": "en-us-yaml-single-quoted-escape-quotes",
2560
2478
  "rule": "quotes",
2561
2479
  "mode": "yaml",
2562
- "keys": [
2563
- "description"
2564
- ],
2480
+ "keys": ["description"],
2565
2481
  "in": "description: 'It''s -- he said \"hi\" to me...'\n",
2566
2482
  "out": "description: 'It''s—he said “hi” to me…'\n",
2567
2483
  "note": "modes.md §3.8.6: the same scalar with a double-quoted run after the unit. The run pairs and converts, the dash and ellipsis convert, and the apostrophe stays straight."
@@ -2570,9 +2486,7 @@
2570
2486
  "id": "en-us-yaml-single-quoted-escape-at-ends",
2571
2487
  "rule": "ellipsis",
2572
2488
  "mode": "yaml",
2573
- "keys": [
2574
- "description"
2575
- ],
2489
+ "keys": ["description"],
2576
2490
  "in": "description: '''one...two'''\n",
2577
2491
  "out": "description: '''one…two'''\n",
2578
2492
  "note": "modes.md §3.8.6: a unit directly after the opening quote and directly before the closing one. The scan claims each pair as it is met, so `'''` is the unit followed by content and `'''` at the end is the unit followed by the closing quote."
@@ -2581,9 +2495,7 @@
2581
2495
  "id": "en-us-yaml-single-quoted-escape-only",
2582
2496
  "rule": "ellipsis",
2583
2497
  "mode": "yaml",
2584
- "keys": [
2585
- "description"
2586
- ],
2498
+ "keys": ["description"],
2587
2499
  "in": "description: ''''\n",
2588
2500
  "out": "description: ''''\n",
2589
2501
  "note": "modes.md §3.8.6: a scalar that is nothing but one unit yields no non-empty segment, so no span, and comes back byte for byte."
@@ -2592,9 +2504,7 @@
2592
2504
  "id": "en-us-yaml-single-quoted-escape-contraction-at-unit",
2593
2505
  "rule": "dashes",
2594
2506
  "mode": "yaml",
2595
- "keys": [
2596
- "description"
2597
- ],
2507
+ "keys": ["description"],
2598
2508
  "in": "description: 'a''--''b'\n",
2599
2509
  "out": "description: 'a''—''b'\n",
2600
2510
  "note": "modes.md §3.8.6 and §3.4: the dash sits between two units, so it is a whole span. A contraction (2 → 1) is applied at a span extremity, exactly as it is against `:` and `#` in a plain scalar."
@@ -2603,9 +2513,7 @@
2603
2513
  "id": "en-us-yaml-single-quoted-escape-unterminated",
2604
2514
  "rule": "ellipsis",
2605
2515
  "mode": "yaml",
2606
- "keys": [
2607
- "description"
2608
- ],
2516
+ "keys": ["description"],
2609
2517
  "in": "description: 'it''s one...two\n",
2610
2518
  "out": "description: 'it''s one...two\n",
2611
2519
  "note": "modes.md §3.8.6: after a unit the scan keeps looking for a closing quote on the same line, finds none, and the value yields no spans — a trailing unit is not mistaken for a close."
@@ -2614,9 +2522,7 @@
2614
2522
  "id": "en-us-yaml-double-quoted-escape-untouched",
2615
2523
  "rule": "ellipsis",
2616
2524
  "mode": "yaml",
2617
- "keys": [
2618
- "description"
2619
- ],
2525
+ "keys": ["description"],
2620
2526
  "in": "description: \"one \\\"two\\\"... three\"\n",
2621
2527
  "out": "description: \"one \\\"two\\\"... three\"\n",
2622
2528
  "note": "modes.md §3.8.6: a backslash in a double-quoted scalar means the same thing — source characters and content characters stop being the same, exactly as an HTML character reference does in §3.6."
@@ -2625,10 +2531,7 @@
2625
2531
  "id": "en-us-yaml-anchor-untouched",
2626
2532
  "rule": "ellipsis",
2627
2533
  "mode": "yaml",
2628
- "keys": [
2629
- "description",
2630
- "use"
2631
- ],
2534
+ "keys": ["description", "use"],
2632
2535
  "in": "description: &anchor one...two\nuse: *anchor\n",
2633
2536
  "out": "description: &anchor one...two\nuse: *anchor\n",
2634
2537
  "note": "modes.md §3.8.4 step 9: an anchored or aliased value is not a construct this scan claims, listed key or not."
@@ -2637,9 +2540,7 @@
2637
2540
  "id": "en-us-yaml-tag-untouched",
2638
2541
  "rule": "ellipsis",
2639
2542
  "mode": "yaml",
2640
- "keys": [
2641
- "description"
2642
- ],
2543
+ "keys": ["description"],
2643
2544
  "in": "description: !!str one...two\n",
2644
2545
  "out": "description: !!str one...two\n",
2645
2546
  "note": "modes.md §3.8.4 step 9: a tagged value is declined for the same reason as an anchored one."
@@ -2648,9 +2549,7 @@
2648
2549
  "id": "en-us-yaml-comment-only-value",
2649
2550
  "rule": "ellipsis",
2650
2551
  "mode": "yaml",
2651
- "keys": [
2652
- "description"
2653
- ],
2552
+ "keys": ["description"],
2654
2553
  "in": "# a comment...here\n%TAG ! tag:example.com,2000:\ndescription: # one...two\n",
2655
2554
  "out": "# a comment...here\n%TAG ! tag:example.com,2000:\ndescription: # one...two\n",
2656
2555
  "note": "modes.md §3.8.4 steps 2 and 9: a comment line, a directive line, and a value that is only a comment all yield no spans."
@@ -2659,9 +2558,7 @@
2659
2558
  "id": "en-us-yaml-document-markers",
2660
2559
  "rule": "ellipsis",
2661
2560
  "mode": "yaml",
2662
- "keys": [
2663
- "description"
2664
- ],
2561
+ "keys": ["description"],
2665
2562
  "in": "---\ndescription: one...two\n...\n",
2666
2563
  "out": "---\ndescription: one…two\n...\n",
2667
2564
  "note": "modes.md §3.8.4 step 3: the bare document markers are declined as lines, and the mapping between them is scanned normally."
@@ -2670,10 +2567,7 @@
2670
2567
  "id": "en-us-yaml-flow-one-line-untouched",
2671
2568
  "rule": "ellipsis",
2672
2569
  "mode": "yaml",
2673
- "keys": [
2674
- "description",
2675
- "inner"
2676
- ],
2570
+ "keys": ["description", "inner"],
2677
2571
  "in": "description: [one...two, three]\ninner: {a: four...five}\n",
2678
2572
  "out": "description: [one...two, three]\ninner: {a: four...five}\n",
2679
2573
  "note": "modes.md §3.8.4 step 9: a flow collection is declined whole, on one line as much as across several."
@@ -2682,9 +2576,7 @@
2682
2576
  "id": "en-us-yaml-explicit-indent-indicator",
2683
2577
  "rule": "ellipsis",
2684
2578
  "mode": "yaml",
2685
- "keys": [
2686
- "description"
2687
- ],
2579
+ "keys": ["description"],
2688
2580
  "in": "description: |2\n one...two\n",
2689
2581
  "out": "description: |2\n one…two\n",
2690
2582
  "note": "modes.md §3.8.5: an explicit indentation indicator sets `bi` to `indent + n`, so the leading space here is content and stays inside the span."
@@ -2693,9 +2585,7 @@
2693
2585
  "id": "en-us-yaml-empty-value-nested-node",
2694
2586
  "rule": "ellipsis",
2695
2587
  "mode": "yaml",
2696
- "keys": [
2697
- "description"
2698
- ],
2588
+ "keys": ["description"],
2699
2589
  "in": "outer:\n description: one...two\n",
2700
2590
  "out": "outer:\n description: one…two\n",
2701
2591
  "note": "modes.md §3.8.4 step 6: a key with no inline value introduces a nested node whose lines ARE scanned on their own — the one case where following lines are not consumed by step 7."
@@ -2704,9 +2594,7 @@
2704
2594
  "id": "en-us-yaml-multiline-plain-untouched",
2705
2595
  "rule": "ellipsis",
2706
2596
  "mode": "yaml",
2707
- "keys": [
2708
- "description"
2709
- ],
2597
+ "keys": ["description"],
2710
2598
  "in": "description: one...two\n three...four\n",
2711
2599
  "out": "description: one...two\n three...four\n",
2712
2600
  "note": "modes.md §3.8.6: a multi-line plain scalar's folding is a construct this scan does not claim, so the whole value yields no spans — including its first line."
@@ -2772,9 +2660,7 @@
2772
2660
  "id": "en-us-yaml-plain-apostrophe",
2773
2661
  "rule": "apostrophe",
2774
2662
  "mode": "yaml",
2775
- "keys": [
2776
- "description"
2777
- ],
2663
+ "keys": ["description"],
2778
2664
  "in": "description: it's one of theirs\n",
2779
2665
  "out": "description: it’s one of theirs\n",
2780
2666
  "note": "modes.md §3.8.6 and §7.11: an apostrophe is ordinary content in a plain scalar — nothing about it is syntactic, so the scan claims the value and `apostrophe` curls it. The style matrix's first cell: the single-quoted bail is about how the source spells the character, not about the character."
@@ -2783,9 +2669,7 @@
2783
2669
  "id": "en-us-yaml-double-quoted-apostrophe",
2784
2670
  "rule": "apostrophe",
2785
2671
  "mode": "yaml",
2786
- "keys": [
2787
- "description"
2788
- ],
2672
+ "keys": ["description"],
2789
2673
  "in": "description: \"it's one of theirs\"\n",
2790
2674
  "out": "description: \"it’s one of theirs\"\n",
2791
2675
  "note": "modes.md §3.8.6: inside a double-quoted scalar an apostrophe needs no escape, so the content and the source are the same characters and the scan claims it. Compare en-us-yaml-single-quoted-escape-untouched, the same sentence in the one style that has to double the mark."
@@ -2794,9 +2678,7 @@
2794
2678
  "id": "en-us-yaml-block-scalar-apostrophe",
2795
2679
  "rule": "apostrophe",
2796
2680
  "mode": "yaml",
2797
- "keys": [
2798
- "description"
2799
- ],
2681
+ "keys": ["description"],
2800
2682
  "in": "description: |-\n it's one of theirs\n",
2801
2683
  "out": "description: |-\n it’s one of theirs\n",
2802
2684
  "note": "modes.md §3.8.5: a block scalar has no quoting and therefore no escaping, so an apostrophe in it is content like any other. Together with the plain and double-quoted cases this pins that only one of the four styles declines, which is what makes §7.13's measured cost a property of that style rather than of the mark."
@@ -2806,9 +2688,7 @@
2806
2688
  "rule": "apostrophe",
2807
2689
  "mode": "markdown",
2808
2690
  "dialect": "commonmark",
2809
- "frontmatterKeys": [
2810
- "title"
2811
- ],
2691
+ "frontmatterKeys": ["title"],
2812
2692
  "in": "---\ntitle: it's one of theirs\n---\n\nBody it's here.\n",
2813
2693
  "out": "---\ntitle: it’s one of theirs\n---\n\nBody it’s here.\n",
2814
2694
  "note": "modes.md §3.7.4 inherits §3.8.6 whole, so the style matrix holds inside a frontmatter block too: a plain scalar's apostrophe converts, while the single-quoted form does not (en-us-markdown-commonmark-frontmatter-keys-single-quote-bail)."
@@ -2971,9 +2851,7 @@
2971
2851
  "rule": "quotes",
2972
2852
  "mode": "markdown",
2973
2853
  "dialect": "commonmark",
2974
- "frontmatterKeys": [
2975
- "title"
2976
- ],
2854
+ "frontmatterKeys": ["title"],
2977
2855
  "in": "--- \ntitle: He said \"hello\" once\nslug: \"he-said-hello\"\n---\n\nBody \"quotes\" here.\n",
2978
2856
  "out": "--- \ntitle: He said “hello” once\nslug: \"he-said-hello\"\n---\n\nBody “quotes” here.\n",
2979
2857
  "note": "modes.md §3.7.4 with §3.7.3a: every other locator case takes the skip path, where a wrong extent only costs prose. Here it costs an offset — a port computing the content start as \"four code points in\" is right for every bare fence and wrong for this one, and the spans it emits land on the wrong characters."
@@ -3046,9 +2924,7 @@
3046
2924
  "rule": "quotes",
3047
2925
  "mode": "markdown",
3048
2926
  "dialect": "commonmark",
3049
- "frontmatterKeys": [
3050
- "title"
3051
- ],
2927
+ "frontmatterKeys": ["title"],
3052
2928
  "in": "---\rtitle: a \"b\"\rslug: \"x\"\r---\r\rBody \"c\" here.\r",
3053
2929
  "out": "---\rtitle: a \"b\"\rslug: \"x\"\r---\r\rBody “c” here.\r",
3054
2930
  "note": "modes.md §3.7.3a step 5 and §7.13: the block is found by CommonMark's line model, and the content is then read by §3.8.4's LF-only one, which sees a two-line block as a single line and yields no span. So the option is inert here — nothing machine-read is typeset, the block is still skipped, and the body converts. Pinned because it is a silence, and a silence nobody pinned is a silence nobody notices."
@@ -3058,9 +2934,7 @@
3058
2934
  "rule": "quotes",
3059
2935
  "mode": "markdown",
3060
2936
  "dialect": "commonmark",
3061
- "frontmatterKeys": [
3062
- "title"
3063
- ],
2937
+ "frontmatterKeys": ["title"],
3064
2938
  "in": "---\rtitle: a \"b\"\r---\r\rBody \"c\" here.\r",
3065
2939
  "out": "---\rtitle: a \"b\"\r---\r\rBody “c” here.\r",
3066
2940
  "note": "modes.md §3.7.4: a block whose content carries a U+000D not followed by U+000A yields no spans, however few lines it has. An earlier draft let a one-line block through and declined a two-line one, which made the rule depend on a line count rather than on the character; the two-line case is en-us-markdown-commonmark-frontmatter-keys-lone-cr-is-inert and this is the other side of it."
@@ -3088,9 +2962,7 @@
3088
2962
  "rule": "apostrophe",
3089
2963
  "mode": "markdown",
3090
2964
  "dialect": "commonmark",
3091
- "frontmatterKeys": [
3092
- "title"
3093
- ],
2965
+ "frontmatterKeys": ["title"],
3094
2966
  "in": "---\ntitle: café 😀 it's ok\n---\n\nBody \"q\" here...\n",
3095
2967
  "out": "---\ntitle: café 😀 it’s ok\n---\n\nBody “q” here…\n",
3096
2968
  "note": "modes.md §3.7.3a's mask is one U+0020 per index unit, not per code point: a runtime that indexes bytes and masks an astral character to a single space shortens its input by three and shifts every body offset after it. The trailing ellipsis is what a shift eats first, so this case fails loudly rather than subtly."
@@ -3100,10 +2972,7 @@
3100
2972
  "rule": "quotes",
3101
2973
  "mode": "markdown",
3102
2974
  "dialect": "commonmark",
3103
- "frontmatterKeys": [
3104
- "title",
3105
- "slug"
3106
- ],
2975
+ "frontmatterKeys": ["title", "slug"],
3107
2976
  "in": "---\ntitle: \"a\rb\"\nslug: c \"d\"\n---\n\nBody \"q\" here.\n",
3108
2977
  "out": "---\ntitle: \"a\rb\"\nslug: c “d”\n---\n\nBody “q” here.\n",
3109
2978
  "note": "modes.md §3.7.4's U+000D bail is per line, not per block: `title`'s value carries a stray carriage return and is declined, `slug`'s line converts, and the body converts. The other side of the lone-U+000D document cases, which lose everything because such a document is one §3.8.4 line. Implementers: the per-line test has to run to the next line's start rather than to the line's end, or a block whose only line ends in U+000D looks clean — that is the one reading under which both this case and -keys-lone-cr-one-key pass."
@@ -3113,10 +2982,7 @@
3113
2982
  "rule": "quotes",
3114
2983
  "mode": "markdown",
3115
2984
  "dialect": "commonmark",
3116
- "frontmatterKeys": [
3117
- "title",
3118
- "slug"
3119
- ],
2985
+ "frontmatterKeys": ["title", "slug"],
3120
2986
  "in": "---\ntitle: a \"b\"\nslug: c \"d\"\n\r---\n\nBody \"q\" here.\n",
3121
2987
  "out": "---\ntitle: a “b”\nslug: c “d”\n\r---\n\nBody “q” here.\n",
3122
2988
  "note": "modes.md §3.7.4 and §3.8.4 step 7: the content's last line is a lone U+000D on a line of its own, and both `title` and `slug` convert. That line is blank to the value-run test, so it is not a continuation line of `slug` (1.11.0; until then it joined `slug`'s run and silenced it, which this note used to describe as the point of the case). What the case discriminates now is an implementation that substitutes the U+000D for another declining character such as U+0009: that makes the last line non-blank and silences `slug`. The per-line filter itself is exercised by -keys-lone-cr-one-key and -keys-lone-cr-costs-one-line."
@@ -3126,10 +2992,7 @@
3126
2992
  "rule": "dashes",
3127
2993
  "mode": "markdown",
3128
2994
  "dialect": "commonmark",
3129
- "frontmatterKeys": [
3130
- "summary",
3131
- "title"
3132
- ],
2995
+ "frontmatterKeys": ["summary", "title"],
3133
2996
  "in": "---\nsummary: a\rb\n title: c -- d\n---\n\nBody \"q\" here.\n",
3134
2997
  "out": "---\nsummary: a\rb\n title: c -- d\n---\n\nBody “q” here.\n",
3135
2998
  "note": "modes.md §3.7.4: the decline drops the spans the content scan produced for that line and does not alter the content the scan was given. Here the U+000D sits on a listed key whose value run continues onto a more-indented line, so the scan yields nothing for the block at all — `title` is inside `summary`'s value run, not a key of its own. Substituting the U+000D for U+0009 instead converts `c -- d` and is the divergence this case exists to fail."
@@ -3139,9 +3002,7 @@
3139
3002
  "rule": "quotes",
3140
3003
  "mode": "markdown",
3141
3004
  "dialect": "commonmark",
3142
- "frontmatterKeys": [
3143
- "title"
3144
- ],
3005
+ "frontmatterKeys": ["title"],
3145
3006
  "in": "---\rtitle: a \"b\"\r---\r\rBody \"q\".\r",
3146
3007
  "out": "---\rtitle: a \"b\"\r---\r\rBody “q”.\r",
3147
3008
  "note": "modes.md §3.7.3a steps 1 and 5 composed: a byte-order mark in front of a document whose lines end with lone U+000D. Each clause is pinned alone and their combination is where one runtime lost the body entirely — found by an adversarial pass over a finished port, not by any fixture then in the suite. The block is located and skipped, its content is declined for the U+000D, and the body converts."
@@ -3150,11 +3011,7 @@
3150
3011
  "id": "en-us-yaml-lone-cr-plain-untouched",
3151
3012
  "rule": "dashes",
3152
3013
  "mode": "yaml",
3153
- "keys": [
3154
- "title",
3155
- "slug",
3156
- "summary"
3157
- ],
3014
+ "keys": ["title", "slug", "summary"],
3158
3015
  "in": "title: a\rb -- c\n",
3159
3016
  "out": "title: a\rb -- c\n",
3160
3017
  "note": "modes.md §3.8.4 step 9 (spec 1.10.0): a U+000D that is not a line's terminator would land inside the scalar's span, and line terminators are never inside a span. The line yields no spans and comes back byte for byte. Until 1.10.0 this converted, with the carriage return inside the span."
@@ -3163,11 +3020,7 @@
3163
3020
  "id": "en-us-yaml-lone-cr-quoted-untouched",
3164
3021
  "rule": "dashes",
3165
3022
  "mode": "yaml",
3166
- "keys": [
3167
- "title",
3168
- "slug",
3169
- "summary"
3170
- ],
3023
+ "keys": ["title", "slug", "summary"],
3171
3024
  "in": "title: \"a\rb -- c\"\n",
3172
3025
  "out": "title: \"a\rb -- c\"\n",
3173
3026
  "note": "modes.md §3.8.4 step 9: the same line with a double-quoted scalar. The decline is on the line, not on the scalar form."
@@ -3176,11 +3029,7 @@
3176
3029
  "id": "en-us-yaml-lone-cr-block-scalar-untouched",
3177
3030
  "rule": "dashes",
3178
3031
  "mode": "yaml",
3179
- "keys": [
3180
- "title",
3181
- "slug",
3182
- "summary"
3183
- ],
3032
+ "keys": ["title", "slug", "summary"],
3184
3033
  "in": "title: |\n a -- b\n c\rd -- e\n",
3185
3034
  "out": "title: |\n a -- b\n c\rd -- e\n",
3186
3035
  "note": "modes.md §3.8.5 (spec 1.10.0): a U+000D on any line of a block scalar's run makes the whole block yield no spans, as a tab does — the first line, which is clean, is not converted either."
@@ -3189,11 +3038,7 @@
3189
3038
  "id": "en-us-yaml-lone-cr-value-run-consumed",
3190
3039
  "rule": "dashes",
3191
3040
  "mode": "yaml",
3192
- "keys": [
3193
- "title",
3194
- "slug",
3195
- "summary"
3196
- ],
3041
+ "keys": ["title", "slug", "summary"],
3197
3042
  "in": "summary: a\rb\n title: c -- d\n",
3198
3043
  "out": "summary: a\rb\n title: c -- d\n",
3199
3044
  "note": "modes.md §3.8.4 step 9: the declined line's value run is still consumed, so the indented `title: c -- d` stays a continuation of `summary` and is not read as a mapping line of its own. Declining without consuming would convert a key that is not a key."
@@ -3202,11 +3047,7 @@
3202
3047
  "id": "en-us-yaml-trailing-cr-is-a-terminator",
3203
3048
  "rule": "dashes",
3204
3049
  "mode": "yaml",
3205
- "keys": [
3206
- "title",
3207
- "slug",
3208
- "summary"
3209
- ],
3050
+ "keys": ["title", "slug", "summary"],
3210
3051
  "in": "title: a -- b\r",
3211
3052
  "out": "title: a—b\r",
3212
3053
  "note": "modes.md §3.8.4: a U+000D that ends the input with no U+000A after it is a terminator, like one before a U+000A, so it is not a lone carriage return and the line converts."
@@ -3215,11 +3056,7 @@
3215
3056
  "id": "en-us-yaml-crlf-still-converts",
3216
3057
  "rule": "dashes",
3217
3058
  "mode": "yaml",
3218
- "keys": [
3219
- "title",
3220
- "slug",
3221
- "summary"
3222
- ],
3059
+ "keys": ["title", "slug", "summary"],
3223
3060
  "in": "title: a -- b\r\nslug: c -- d\r\n",
3224
3061
  "out": "title: a—b\r\nslug: c—d\r\n",
3225
3062
  "note": "modes.md §3.8.4: CRLF is two terminator characters and neither is lone, so step 9 does not apply to a Windows-line-ended document."
@@ -3228,11 +3065,7 @@
3228
3065
  "id": "en-us-yaml-cr-line-is-not-blank",
3229
3066
  "rule": "dashes",
3230
3067
  "mode": "yaml",
3231
- "keys": [
3232
- "title",
3233
- "slug",
3234
- "summary"
3235
- ],
3068
+ "keys": ["title", "slug", "summary"],
3236
3069
  "in": "title: |\n a -- b\n\r \n c -- d\n",
3237
3070
  "out": "title: |\n a—b\n\r \n c -- d\n",
3238
3071
  "note": "modes.md §3.8.4 step 1 (spec 1.10.0): a line is blank only if it is empty or all U+0020, so `<CR>␣␣` is not blank. It has indent 0, which ends the block's value run, and `a -- b` converts while `c -- d` is outside the block. A port that trims U+000D before testing blankness keeps the line in the run and declines the whole block instead."
@@ -3241,11 +3074,7 @@
3241
3074
  "id": "en-us-yaml-double-trailing-cr-untouched",
3242
3075
  "rule": "dashes",
3243
3076
  "mode": "yaml",
3244
- "keys": [
3245
- "title",
3246
- "slug",
3247
- "summary"
3248
- ],
3077
+ "keys": ["title", "slug", "summary"],
3249
3078
  "in": "title: a -- b\r\r",
3250
3079
  "out": "title: a -- b\r\r",
3251
3080
  "note": "modes.md §3.8.4: only the last U+000D at the end of the input is a terminator, so the first is a lone one and the line yields no spans. A port that strips every trailing U+000D converts it."
@@ -3254,11 +3083,7 @@
3254
3083
  "id": "en-us-yaml-cr-before-lf-after-cr-untouched",
3255
3084
  "rule": "dashes",
3256
3085
  "mode": "yaml",
3257
- "keys": [
3258
- "title",
3259
- "slug",
3260
- "summary"
3261
- ],
3086
+ "keys": ["title", "slug", "summary"],
3262
3087
  "in": "title: a -- b\r\r\n",
3263
3088
  "out": "title: a -- b\r\r\n",
3264
3089
  "note": "modes.md §3.8.4: a U+000D immediately before a U+000A is a terminator, and only that one; the U+000D before it is lone. The same line as the previous case with a final U+000A."
@@ -3267,11 +3092,7 @@
3267
3092
  "id": "en-us-yaml-cr-then-hash-untouched",
3268
3093
  "rule": "dashes",
3269
3094
  "mode": "yaml",
3270
- "keys": [
3271
- "title",
3272
- "slug",
3273
- "summary"
3274
- ],
3095
+ "keys": ["title", "slug", "summary"],
3275
3096
  "in": "title: a\r#c -- d\n",
3276
3097
  "out": "title: a\r#c -- d\n",
3277
3098
  "note": "modes.md §3.8.4 step 9: YAML 1.2 reads `<CR>#c -- d` as a comment line, which step 2 declines when it starts a line. The LF-only model sees one line, so the decline has to be on the carriage return itself."
@@ -3280,11 +3101,7 @@
3280
3101
  "id": "en-us-yaml-double-quoted-trailing-blank-line",
3281
3102
  "rule": "dashes",
3282
3103
  "mode": "yaml",
3283
- "keys": [
3284
- "title",
3285
- "slug",
3286
- "summary"
3287
- ],
3104
+ "keys": ["title", "slug", "summary"],
3288
3105
  "in": "title: \"a -- b\"\n\n",
3289
3106
  "out": "title: \"a—b\"\n\n",
3290
3107
  "note": "modes.md §3.8.4 step 7 and §3.8.6 (spec 1.11.0): blank lines after a closed quoted scalar are not a continuation line, so a file that ends in a blank line converts exactly as the same file without it. Until 1.11.0 the run being non-empty silenced the scalar in every runtime."
@@ -3293,11 +3110,7 @@
3293
3110
  "id": "en-us-yaml-single-quoted-trailing-blank-line",
3294
3111
  "rule": "dashes",
3295
3112
  "mode": "yaml",
3296
- "keys": [
3297
- "title",
3298
- "slug",
3299
- "summary"
3300
- ],
3113
+ "keys": ["title", "slug", "summary"],
3301
3114
  "in": "title: 'a -- b'\n\n",
3302
3115
  "out": "title: 'a—b'\n\n",
3303
3116
  "note": "modes.md §3.8.6 (spec 1.11.0): the single-quoted form of the trailing blank line."
@@ -3306,11 +3119,7 @@
3306
3119
  "id": "en-us-yaml-plain-trailing-blank-line",
3307
3120
  "rule": "dashes",
3308
3121
  "mode": "yaml",
3309
- "keys": [
3310
- "title",
3311
- "slug",
3312
- "summary"
3313
- ],
3122
+ "keys": ["title", "slug", "summary"],
3314
3123
  "in": "summary: the one -- here\n\n",
3315
3124
  "out": "summary: the one—here\n\n",
3316
3125
  "note": "modes.md §3.8.6 continuation bail (spec 1.11.0): trailing blank lines are not a continuation line, so a plain scalar followed by a blank line is not a multi-line plain scalar."
@@ -3319,11 +3128,7 @@
3319
3128
  "id": "en-us-yaml-blank-line-between-mappings",
3320
3129
  "rule": "dashes",
3321
3130
  "mode": "yaml",
3322
- "keys": [
3323
- "title",
3324
- "slug",
3325
- "summary"
3326
- ],
3131
+ "keys": ["title", "slug", "summary"],
3327
3132
  "in": "title: \"a -- b\"\n\nslug: c -- d\n",
3328
3133
  "out": "title: \"a—b\"\n\nslug: c—d\n",
3329
3134
  "note": "modes.md §3.8.4 step 7 (spec 1.11.0): a blank line between two mappings belongs to the first value's run and is not a continuation line, so both values convert."
@@ -3332,11 +3137,7 @@
3332
3137
  "id": "en-us-yaml-quoted-continuation-line-declined",
3333
3138
  "rule": "dashes",
3334
3139
  "mode": "yaml",
3335
- "keys": [
3336
- "title",
3337
- "slug",
3338
- "summary"
3339
- ],
3140
+ "keys": ["title", "slug", "summary"],
3340
3141
  "in": "title: \"a -- b\"\n more -- c\n",
3341
3142
  "out": "title: \"a -- b\"\n more -- c\n",
3342
3143
  "note": "modes.md §3.8.6 (spec 1.11.0): a non-blank, more-indented line after a closed quoted scalar is a continuation line and the scalar yields no spans. Pinned so that narrowing the bail for blank lines does not widen it for this."
@@ -3345,11 +3146,7 @@
3345
3146
  "id": "en-us-yaml-plain-continuation-after-blank-declined",
3346
3147
  "rule": "dashes",
3347
3148
  "mode": "yaml",
3348
- "keys": [
3349
- "title",
3350
- "slug",
3351
- "summary"
3352
- ],
3149
+ "keys": ["title", "slug", "summary"],
3353
3150
  "in": "summary: a -- b\n\n more -- c\n",
3354
3151
  "out": "summary: a -- b\n\n more -- c\n",
3355
3152
  "note": "modes.md §3.8.6 continuation bail (spec 1.11.0): a blank line followed by a more-indented line is a genuine multi-line plain scalar, which YAML folds. The blank line does not hide the continuation line behind it."
@@ -3358,11 +3155,7 @@
3358
3155
  "id": "en-us-yaml-tab-line-is-not-blank-after-quoted",
3359
3156
  "rule": "dashes",
3360
3157
  "mode": "yaml",
3361
- "keys": [
3362
- "title",
3363
- "slug",
3364
- "summary"
3365
- ],
3158
+ "keys": ["title", "slug", "summary"],
3366
3159
  "in": "title: \"a -- b\"\n \t\n",
3367
3160
  "out": "title: \"a -- b\"\n \t\n",
3368
3161
  "note": "modes.md §3.8.4 step 1 and step 7 (spec 1.11.0): a line holding U+0009 is not blank, so it is a continuation line and the quoted scalar yields no spans. A port that tests blankness with a trim converts this."
@@ -3371,11 +3164,7 @@
3371
3164
  "id": "en-us-yaml-cr-line-is-not-blank-after-quoted",
3372
3165
  "rule": "dashes",
3373
3166
  "mode": "yaml",
3374
- "keys": [
3375
- "title",
3376
- "slug",
3377
- "summary"
3378
- ],
3167
+ "keys": ["title", "slug", "summary"],
3379
3168
  "in": "title: \"a -- b\"\n \r \n",
3380
3169
  "out": "title: \"a -- b\"\n \r \n",
3381
3170
  "note": "modes.md §3.8.4 step 1 and step 7 (spec 1.11.0): a lone U+000D makes a line non-blank, so it is a continuation line and the quoted scalar yields no spans."
@@ -3384,11 +3173,7 @@
3384
3173
  "id": "en-us-yaml-crlf-blank-line-after-quoted",
3385
3174
  "rule": "dashes",
3386
3175
  "mode": "yaml",
3387
- "keys": [
3388
- "title",
3389
- "slug",
3390
- "summary"
3391
- ],
3176
+ "keys": ["title", "slug", "summary"],
3392
3177
  "in": "title: \"a -- b\"\r\n\r\n",
3393
3178
  "out": "title: \"a—b\"\r\n\r\n",
3394
3179
  "note": "modes.md §3.8.4 (spec 1.11.0): a U+000D before U+000A is a terminator, so the second line is empty and blank, and the quoted scalar converts."
@@ -3397,11 +3182,7 @@
3397
3182
  "id": "en-us-yaml-blank-then-less-indented-key",
3398
3183
  "rule": "dashes",
3399
3184
  "mode": "yaml",
3400
- "keys": [
3401
- "title",
3402
- "slug",
3403
- "summary"
3404
- ],
3185
+ "keys": ["title", "slug", "summary"],
3405
3186
  "in": "meta:\n title: \"a -- b\"\n\nslug: c -- d\n",
3406
3187
  "out": "meta:\n title: \"a—b\"\n\nslug: c—d\n",
3407
3188
  "note": "modes.md §3.8.4 step 7 (spec 1.11.0): the blank line is followed by a less-indented line, which ends the run; both values convert."
@@ -3410,11 +3191,7 @@
3410
3191
  "id": "en-us-yaml-blank-then-column-zero-comment",
3411
3192
  "rule": "dashes",
3412
3193
  "mode": "yaml",
3413
- "keys": [
3414
- "title",
3415
- "slug",
3416
- "summary"
3417
- ],
3194
+ "keys": ["title", "slug", "summary"],
3418
3195
  "in": "title: \"a -- b\"\n\n# c\n",
3419
3196
  "out": "title: \"a—b\"\n\n# c\n",
3420
3197
  "note": "modes.md §3.8.4 step 7 (spec 1.11.0): the column-0 comment is not more indented, so it ends the run and the quoted scalar converts."
@@ -3423,11 +3200,7 @@
3423
3200
  "id": "en-us-yaml-indented-comment-after-quoted-declined",
3424
3201
  "rule": "dashes",
3425
3202
  "mode": "yaml",
3426
- "keys": [
3427
- "title",
3428
- "slug",
3429
- "summary"
3430
- ],
3203
+ "keys": ["title", "slug", "summary"],
3431
3204
  "in": "title: \"a -- b\"\n # c\n",
3432
3205
  "out": "title: \"a -- b\"\n # c\n",
3433
3206
  "note": "modes.md §3.8.6 and §7.11 (spec 1.11.0): a more-indented comment line is a continuation line to this scan, so the quoted scalar yields no spans. A valid document, missed rather than damaged."
@@ -3436,11 +3209,7 @@
3436
3209
  "id": "en-us-yaml-sequence-item-second-key-declined",
3437
3210
  "rule": "dashes",
3438
3211
  "mode": "yaml",
3439
- "keys": [
3440
- "title",
3441
- "slug",
3442
- "summary"
3443
- ],
3212
+ "keys": ["title", "slug", "summary"],
3444
3213
  "in": "- title: \"a -- b\"\n slug: c -- d\n",
3445
3214
  "out": "- title: \"a -- b\"\n slug: c -- d\n",
3446
3215
  "note": "modes.md §7.11 (spec 1.11.0): in a sequence item the second key counts as more indented than the first, so `title`'s quoted scalar sees a continuation line and yields no spans; `slug` is consumed as part of that run. Pinned as the accepted miss it is."
@@ -3450,10 +3219,7 @@
3450
3219
  "rule": "dashes",
3451
3220
  "mode": "markdown",
3452
3221
  "dialect": "commonmark",
3453
- "frontmatterKeys": [
3454
- "title",
3455
- "slug"
3456
- ],
3222
+ "frontmatterKeys": ["title", "slug"],
3457
3223
  "in": "---\ntitle: \"a -- b\"\n\nslug: c -- d\n\n---\n\nBody -- here.\n",
3458
3224
  "out": "---\ntitle: \"a—b\"\n\nslug: c—d\n\n---\n\nBody—here.\n",
3459
3225
  "note": "modes.md §3.7.4 and §3.8.4 step 7 (spec 1.11.0): blank lines between frontmatter entries and before the closing delimiter are not continuation lines, so both values convert. The block reuses the yaml scan, so this is the same change seen through markdown mode."
@@ -3462,9 +3228,7 @@
3462
3228
  "id": "en-us-yaml-cr-region-block-scalar-payload",
3463
3229
  "rule": "dashes",
3464
3230
  "mode": "yaml",
3465
- "keys": [
3466
- "title"
3467
- ],
3231
+ "keys": ["title"],
3468
3232
  "in": "run: |\n echo a\n\r x\n title: c -- d\n",
3469
3233
  "out": "run: |\n echo a\n\r x\n title: c -- d\n",
3470
3234
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): the line `\\r x` has indent 0 under the LF-only line model and ends the unlisted `run:` block's value run, so the next line used to be scanned as a mapping line of its own and converted. A line carrying a U+000D opens a region that runs to the first non-empty line in column 0 without one, and nothing in it yields a span. polytypo/polytypo#63."
@@ -3473,9 +3237,7 @@
3473
3237
  "id": "en-us-yaml-cr-region-key-opens-inside-the-cr-line",
3474
3238
  "rule": "dashes",
3475
3239
  "mode": "yaml",
3476
- "keys": [
3477
- "title"
3478
- ],
3240
+ "keys": ["title"],
3479
3241
  "in": "k:\n a\rrun: |\n title: c -- d\n",
3480
3242
  "out": "k:\n a\rrun: |\n title: c -- d\n",
3481
3243
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): a key shape opens inside the line that carries the U+000D, deeper than the piece after it. A region floored at the line's own indent misses this; the floor is column 0."
@@ -3484,9 +3246,7 @@
3484
3246
  "id": "en-us-yaml-cr-region-line-inside-another-run",
3485
3247
  "rule": "dashes",
3486
3248
  "mode": "yaml",
3487
- "keys": [
3488
- "title"
3489
- ],
3249
+ "keys": ["title"],
3490
3250
  "in": "a:\n run: |\n echo\n x\rfoo: |\n title: c -- d\n",
3491
3251
  "out": "a:\n run: |\n echo\n x\rfoo: |\n title: c -- d\n",
3492
3252
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): the line with the U+000D is consumed by another key's value run and never visited by the scan as a line of its own; the region is computed over all lines, not only visited ones."
@@ -3495,9 +3255,7 @@
3495
3255
  "id": "en-us-yaml-cr-region-comment-line",
3496
3256
  "rule": "dashes",
3497
3257
  "mode": "yaml",
3498
- "keys": [
3499
- "title"
3500
- ],
3258
+ "keys": ["title"],
3501
3259
  "in": "# note\rrun: |\n echo\n title: c -- d\n",
3502
3260
  "out": "# note\rrun: |\n echo\n title: c -- d\n",
3503
3261
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): the U+000D sits on a comment line, where no key is found; the region does not depend on the line having a key shape."
@@ -3506,9 +3264,7 @@
3506
3264
  "id": "en-us-yaml-cr-region-ends-at-column-zero",
3507
3265
  "rule": "dashes",
3508
3266
  "mode": "yaml",
3509
- "keys": [
3510
- "slug"
3511
- ],
3267
+ "keys": ["slug"],
3512
3268
  "in": "run: |\n echo a\n\r x\nslug: c -- d\n",
3513
3269
  "out": "run: |\n echo a\n\r x\nslug: c—d\n",
3514
3270
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): control: the first non-empty line in column 0 without a U+000D ends the region, so `slug` converts."
@@ -3517,9 +3273,7 @@
3517
3273
  "id": "en-us-yaml-cr-region-nested-cost",
3518
3274
  "rule": "dashes",
3519
3275
  "mode": "yaml",
3520
- "keys": [
3521
- "title"
3522
- ],
3276
+ "keys": ["title"],
3523
3277
  "in": "info:\n a: x\r b: y\n title: c -- d\n",
3524
3278
  "out": "info:\n a: x\r b: y\n title: c -- d\n",
3525
3279
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): the accepted cost: in a nested document the region reaches to the next column-0 line, so a real listed key after a U+000D is declined. A miss, never damage."
@@ -3528,9 +3282,7 @@
3528
3282
  "id": "en-us-yaml-cr-region-document-marker-cost",
3529
3283
  "rule": "dashes",
3530
3284
  "mode": "yaml",
3531
- "keys": [
3532
- "title"
3533
- ],
3285
+ "keys": ["title"],
3534
3286
  "in": "---\rinfo:\n title: a -- b\n",
3535
3287
  "out": "---\rinfo:\n title: a -- b\n",
3536
3288
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): the accepted cost: a document marker whose line carries a U+000D opens a region too."
@@ -3539,9 +3291,7 @@
3539
3291
  "id": "en-us-yaml-cr-region-crlf-is-a-terminator",
3540
3292
  "rule": "dashes",
3541
3293
  "mode": "yaml",
3542
- "keys": [
3543
- "title"
3544
- ],
3294
+ "keys": ["title"],
3545
3295
  "in": "info:\r\n title: a -- b\r\n",
3546
3296
  "out": "info:\r\n title: a—b\r\n",
3547
3297
  "note": "modes.md §3.8.4's carriage-return region (spec 1.11.0): control: a U+000D before U+000A is a terminator and belongs to no line, so it opens no region."
@@ -3551,9 +3301,7 @@
3551
3301
  "rule": "dashes",
3552
3302
  "mode": "markdown",
3553
3303
  "dialect": "commonmark",
3554
- "frontmatterKeys": [
3555
- "title"
3556
- ],
3304
+ "frontmatterKeys": ["title"],
3557
3305
  "in": "---\nrun: |\n echo a\n\r x\n title: c -- d\n---\n\nBody \"q\" here.\n",
3558
3306
  "out": "---\nrun: |\n echo a\n\r x\n title: c -- d\n---\n\nBody “q” here.\n",
3559
3307
  "note": "modes.md §3.7.4 and §3.8.4's carriage-return region (spec 1.11.0): the frontmatter block reuses the yaml scan, so the unlisted block's payload is declined there too and only the body converts."
@@ -3562,9 +3310,7 @@
3562
3310
  "id": "en-us-yaml-leak-seq-literal-block",
3563
3311
  "rule": "dashes",
3564
3312
  "mode": "yaml",
3565
- "keys": [
3566
- "title"
3567
- ],
3313
+ "keys": ["title"],
3568
3314
  "in": "- |\n title: c -- d\n",
3569
3315
  "out": "- |\n title: c -- d\n",
3570
3316
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a literal block scalar opened on a sequence entry; YAML reads `title: c -- d` as its content. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3573,9 +3319,7 @@
3573
3319
  "id": "en-us-yaml-leak-seq-folded-block",
3574
3320
  "rule": "dashes",
3575
3321
  "mode": "yaml",
3576
- "keys": [
3577
- "title"
3578
- ],
3322
+ "keys": ["title"],
3579
3323
  "in": "- >\n title: c -- d\n",
3580
3324
  "out": "- >\n title: c -- d\n",
3581
3325
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): the folded form of the same. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3584,9 +3328,7 @@
3584
3328
  "id": "en-us-yaml-leak-own-line-block-header",
3585
3329
  "rule": "dashes",
3586
3330
  "mode": "yaml",
3587
- "keys": [
3588
- "title"
3589
- ],
3331
+ "keys": ["title"],
3590
3332
  "in": "run:\n |\n title: c -- d\n",
3591
3333
  "out": "run:\n |\n title: c -- d\n",
3592
3334
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a block scalar header on a line of its own under an empty-valued key. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3595,9 +3337,7 @@
3595
3337
  "id": "en-us-yaml-leak-seq-double-quoted",
3596
3338
  "rule": "dashes",
3597
3339
  "mode": "yaml",
3598
- "keys": [
3599
- "title"
3600
- ],
3340
+ "keys": ["title"],
3601
3341
  "in": "- \"x\n title: c -- d\"\n",
3602
3342
  "out": "- \"x\n title: c -- d\"\n",
3603
3343
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a double-quoted scalar that continues onto the next line. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3606,9 +3346,7 @@
3606
3346
  "id": "en-us-yaml-leak-seq-single-quoted",
3607
3347
  "rule": "dashes",
3608
3348
  "mode": "yaml",
3609
- "keys": [
3610
- "title"
3611
- ],
3349
+ "keys": ["title"],
3612
3350
  "in": "- 'x\n title: c -- d'\n",
3613
3351
  "out": "- 'x\n title: c -- d'\n",
3614
3352
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): the single-quoted form; the closing quote used to be turned into U+2019. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3617,9 +3355,7 @@
3617
3355
  "id": "en-us-yaml-leak-quoted-key-block",
3618
3356
  "rule": "dashes",
3619
3357
  "mode": "yaml",
3620
- "keys": [
3621
- "title"
3622
- ],
3358
+ "keys": ["title"],
3623
3359
  "in": "\"a\": |\n title: c -- d\n",
3624
3360
  "out": "\"a\": |\n title: c -- d\n",
3625
3361
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a quoted key whose value is a block scalar. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3628,9 +3364,7 @@
3628
3364
  "id": "en-us-yaml-leak-special-char-key-block",
3629
3365
  "rule": "dashes",
3630
3366
  "mode": "yaml",
3631
- "keys": [
3632
- "title"
3633
- ],
3367
+ "keys": ["title"],
3634
3368
  "in": "a!b: |\n title: c -- d\n",
3635
3369
  "out": "a!b: |\n title: c -- d\n",
3636
3370
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a key holding a character step 5 declines, whose value is a block scalar. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3639,9 +3373,7 @@
3639
3373
  "id": "en-us-yaml-leak-special-char-key-quoted",
3640
3374
  "rule": "dashes",
3641
3375
  "mode": "yaml",
3642
- "keys": [
3643
- "title"
3644
- ],
3376
+ "keys": ["title"],
3645
3377
  "in": "a!b: \"x\n title: c -- d\"\n",
3646
3378
  "out": "a!b: \"x\n title: c -- d\"\n",
3647
3379
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): the same key with a quoted value that continues. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3650,9 +3382,7 @@
3650
3382
  "id": "en-us-yaml-leak-seq-flow-sequence",
3651
3383
  "rule": "dashes",
3652
3384
  "mode": "yaml",
3653
- "keys": [
3654
- "title"
3655
- ],
3385
+ "keys": ["title"],
3656
3386
  "in": "- [a,\n title: c -- d]\n",
3657
3387
  "out": "- [a,\n title: c -- d]\n",
3658
3388
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a flow sequence opened on a sequence entry. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3661,9 +3391,7 @@
3661
3391
  "id": "en-us-yaml-leak-seq-flow-mapping",
3662
3392
  "rule": "dashes",
3663
3393
  "mode": "yaml",
3664
- "keys": [
3665
- "title"
3666
- ],
3394
+ "keys": ["title"],
3667
3395
  "in": "- {a: 1,\n title: c -- d}\n",
3668
3396
  "out": "- {a: 1,\n title: c -- d}\n",
3669
3397
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a flow mapping opened on a sequence entry. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3672,9 +3400,7 @@
3672
3400
  "id": "en-us-yaml-leak-seq-anchored-block",
3673
3401
  "rule": "dashes",
3674
3402
  "mode": "yaml",
3675
- "keys": [
3676
- "title"
3677
- ],
3403
+ "keys": ["title"],
3678
3404
  "in": "- &x |\n title: c -- d\n",
3679
3405
  "out": "- &x |\n title: c -- d\n",
3680
3406
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): an anchored block scalar. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3683,9 +3409,7 @@
3683
3409
  "id": "en-us-yaml-leak-seq-tagged-block",
3684
3410
  "rule": "dashes",
3685
3411
  "mode": "yaml",
3686
- "keys": [
3687
- "title"
3688
- ],
3412
+ "keys": ["title"],
3689
3413
  "in": "- !!str |\n title: c -- d\n",
3690
3414
  "out": "- !!str |\n title: c -- d\n",
3691
3415
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a tagged block scalar. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3694,9 +3418,7 @@
3694
3418
  "id": "en-us-yaml-leak-own-line-anchored-block",
3695
3419
  "rule": "dashes",
3696
3420
  "mode": "yaml",
3697
- "keys": [
3698
- "title"
3699
- ],
3421
+ "keys": ["title"],
3700
3422
  "in": "run:\n &x |\n title: c -- d\n",
3701
3423
  "out": "run:\n &x |\n title: c -- d\n",
3702
3424
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): an anchored block scalar on a line of its own. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3705,9 +3427,7 @@
3705
3427
  "id": "en-us-yaml-leak-nested-seq-block",
3706
3428
  "rule": "dashes",
3707
3429
  "mode": "yaml",
3708
- "keys": [
3709
- "title"
3710
- ],
3430
+ "keys": ["title"],
3711
3431
  "in": "run:\n - |\n title: c -- d\n",
3712
3432
  "out": "run:\n - |\n title: c -- d\n",
3713
3433
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a block scalar in a sequence entry nested under a key. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3716,9 +3436,7 @@
3716
3436
  "id": "en-us-yaml-leak-explicit-key-block",
3717
3437
  "rule": "dashes",
3718
3438
  "mode": "yaml",
3719
- "keys": [
3720
- "title"
3721
- ],
3439
+ "keys": ["title"],
3722
3440
  "in": "? |\n title: c -- d\n: v\n",
3723
3441
  "out": "? |\n title: c -- d\n: v\n",
3724
3442
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a block scalar as an explicit key. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3727,9 +3445,7 @@
3727
3445
  "id": "en-us-yaml-leak-explicit-value-block",
3728
3446
  "rule": "dashes",
3729
3447
  "mode": "yaml",
3730
- "keys": [
3731
- "title"
3732
- ],
3448
+ "keys": ["title"],
3733
3449
  "in": "? a\n: |\n title: c -- d\n",
3734
3450
  "out": "? a\n: |\n title: c -- d\n",
3735
3451
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a block scalar as the value of an explicit key. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3738,9 +3454,7 @@
3738
3454
  "id": "en-us-yaml-leak-escaped-quote-not-a-key",
3739
3455
  "rule": "dashes",
3740
3456
  "mode": "yaml",
3741
- "keys": [
3742
- "title"
3743
- ],
3457
+ "keys": ["title"],
3744
3458
  "in": "- \"a\\\": x\n title: c -- d\"\n",
3745
3459
  "out": "- \"a\\\": x\n title: c -- d\"\n",
3746
3460
  "note": "modes.md §3.8.4 step 5 (spec 1.11.0, polytypo#64): a U+005C and the code point after it never close a double quote, so the quote opened after `- ` has no close on the line, the line is a node line and absorbs the line under it. Until 1.11.0 `title` converted."
@@ -3749,9 +3463,7 @@
3749
3463
  "id": "en-us-yaml-leak-escaped-quote-key-block",
3750
3464
  "rule": "dashes",
3751
3465
  "mode": "yaml",
3752
- "keys": [
3753
- "title"
3754
- ],
3466
+ "keys": ["title"],
3755
3467
  "in": "\"a\\\"b\": |\n title: c -- d\n",
3756
3468
  "out": "\"a\\\"b\": |\n title: c -- d\n",
3757
3469
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a quoted key holding an escape, whose value is a block scalar. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3760,9 +3472,7 @@
3760
3472
  "id": "en-us-yaml-leak-doubled-quote-not-a-key",
3761
3473
  "rule": "dashes",
3762
3474
  "mode": "yaml",
3763
- "keys": [
3764
- "title"
3765
- ],
3475
+ "keys": ["title"],
3766
3476
  "in": "- 'a'': x\n title: c -- d'\n",
3767
3477
  "out": "- 'a'': x\n title: c -- d'\n",
3768
3478
  "note": "modes.md §3.8.4 step 5 (spec 1.11.0, polytypo#64): `''` is one unit inside a single-quoted scalar, so the quote after `a'` does not close it, the line is a node line and absorbs the line under it. Until 1.11.0 `title` converted and the closing quote became U+2019."
@@ -3771,9 +3481,7 @@
3771
3481
  "id": "en-us-yaml-leak-own-line-flow",
3772
3482
  "rule": "dashes",
3773
3483
  "mode": "yaml",
3774
- "keys": [
3775
- "title"
3776
- ],
3484
+ "keys": ["title"],
3777
3485
  "in": "run:\n [a,\n title: c -- d]\n",
3778
3486
  "out": "run:\n [a,\n title: c -- d]\n",
3779
3487
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a flow sequence on a line of its own, whose continuation sits at the opening line's indent. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3782,9 +3490,7 @@
3782
3490
  "id": "en-us-yaml-leak-own-line-quote",
3783
3491
  "rule": "dashes",
3784
3492
  "mode": "yaml",
3785
- "keys": [
3786
- "title"
3787
- ],
3493
+ "keys": ["title"],
3788
3494
  "in": "run:\n \"x\n title: c -- d\"\n",
3789
3495
  "out": "run:\n \"x\n title: c -- d\"\n",
3790
3496
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a quote opened on a line of its own, continued at the same indent. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3793,9 +3499,7 @@
3793
3499
  "id": "en-us-yaml-leak-own-line-quote-deeper",
3794
3500
  "rule": "dashes",
3795
3501
  "mode": "yaml",
3796
- "keys": [
3797
- "title"
3798
- ],
3502
+ "keys": ["title"],
3799
3503
  "in": "run:\n \"x\n title: c -- d\"\n",
3800
3504
  "out": "run:\n \"x\n title: c -- d\"\n",
3801
3505
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a quote opened deeper than its continuation. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3804,9 +3508,7 @@
3804
3508
  "id": "en-us-yaml-leak-own-line-block-header-same-indent",
3805
3509
  "rule": "dashes",
3806
3510
  "mode": "yaml",
3807
- "keys": [
3808
- "title"
3809
- ],
3511
+ "keys": ["title"],
3810
3512
  "in": "run:\n |\n title: c -- d\n",
3811
3513
  "out": "run:\n |\n title: c -- d\n",
3812
3514
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a block scalar header whose content sits at the header's own indent. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3815,9 +3517,7 @@
3815
3517
  "id": "en-us-yaml-leak-root-quote",
3816
3518
  "rule": "dashes",
3817
3519
  "mode": "yaml",
3818
- "keys": [
3819
- "title"
3820
- ],
3520
+ "keys": ["title"],
3821
3521
  "in": "\"x\ntitle: c -- d\"\n",
3822
3522
  "out": "\"x\ntitle: c -- d\"\n",
3823
3523
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): a quoted scalar at the root of the document. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3826,9 +3526,7 @@
3826
3526
  "id": "en-us-yaml-leak-tab-line",
3827
3527
  "rule": "dashes",
3828
3528
  "mode": "yaml",
3829
- "keys": [
3830
- "title"
3831
- ],
3529
+ "keys": ["title"],
3832
3530
  "in": "a: \"x\ty\n title: c -- d\"\n",
3833
3531
  "out": "a: \"x\ty\n title: c -- d\"\n",
3834
3532
  "note": "modes.md §3.8.4 step 1 (spec 1.11.0, polytypo#64): a line with a tab yields no spans, but steps 2 to 7 still decide what it absorbs, and the quoted scalar it opens owns the line under it. Until 1.11.0 that line was scanned as a mapping line and `title` converted."
@@ -3837,9 +3535,7 @@
3837
3535
  "id": "en-us-yaml-leak-document-marker-block",
3838
3536
  "rule": "dashes",
3839
3537
  "mode": "yaml",
3840
- "keys": [
3841
- "title"
3842
- ],
3538
+ "keys": ["title"],
3843
3539
  "in": "--- |\n title: c -- d\n",
3844
3540
  "out": "--- |\n title: c -- d\n",
3845
3541
  "note": "modes.md §3.8.4 step 3 (spec 1.11.0, polytypo#64): a block scalar introduced on a document marker line in column 0. The marker absorbs the document, so `title` is not read as a key. Until 1.11.0 it converted."
@@ -3848,9 +3544,7 @@
3848
3544
  "id": "en-us-yaml-leak-document-marker-block-column-zero",
3849
3545
  "rule": "dashes",
3850
3546
  "mode": "yaml",
3851
- "keys": [
3852
- "title"
3853
- ],
3547
+ "keys": ["title"],
3854
3548
  "in": "--- |\ntitle: c -- d\n",
3855
3549
  "out": "--- |\ntitle: c -- d\n",
3856
3550
  "note": "modes.md §3.8.4 steps 3 to 7 (spec 1.11.0, polytypo#64): the same with content in column 0. A line that opens a node and is not a listed key's value absorbs the lines under it, so `title` is not scanned as a key. Until 1.11.0 it was, and converted."
@@ -3859,9 +3553,7 @@
3859
3553
  "id": "en-us-yaml-ok-empty-item-mapping",
3860
3554
  "rule": "dashes",
3861
3555
  "mode": "yaml",
3862
- "keys": [
3863
- "title"
3864
- ],
3556
+ "keys": ["title"],
3865
3557
  "in": "-\n title: c -- d\n",
3866
3558
  "out": "-\n title: c—d\n",
3867
3559
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a sequence marker with nothing after it opens a nested mapping, whose lines are scanned."
@@ -3870,9 +3562,7 @@
3870
3562
  "id": "en-us-yaml-ok-nested-empty-items",
3871
3563
  "rule": "dashes",
3872
3564
  "mode": "yaml",
3873
- "keys": [
3874
- "title"
3875
- ],
3565
+ "keys": ["title"],
3876
3566
  "in": "- -\n title: c -- d\n",
3877
3567
  "out": "- -\n title: c—d\n",
3878
3568
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: nested empty sequence markers."
@@ -3881,9 +3571,7 @@
3881
3571
  "id": "en-us-yaml-ok-quoted-key-sibling",
3882
3572
  "rule": "dashes",
3883
3573
  "mode": "yaml",
3884
- "keys": [
3885
- "title"
3886
- ],
3574
+ "keys": ["title"],
3887
3575
  "in": "- \"a\": 1\n title: c -- d\n",
3888
3576
  "out": "- \"a\": 1\n title: c—d\n",
3889
3577
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a quoted key closes on its line and is followed by a colon, so `title` is a sibling key and converts."
@@ -3892,9 +3580,7 @@
3892
3580
  "id": "en-us-yaml-ok-single-quoted-key-sibling",
3893
3581
  "rule": "dashes",
3894
3582
  "mode": "yaml",
3895
- "keys": [
3896
- "title"
3897
- ],
3583
+ "keys": ["title"],
3898
3584
  "in": "- 'a''b': 1\n title: c -- d\n",
3899
3585
  "out": "- 'a''b': 1\n title: c—d\n",
3900
3586
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: the single-quoted form with `''` in the key."
@@ -3903,9 +3589,7 @@
3903
3589
  "id": "en-us-yaml-ok-quoted-key-nested",
3904
3590
  "rule": "dashes",
3905
3591
  "mode": "yaml",
3906
- "keys": [
3907
- "title"
3908
- ],
3592
+ "keys": ["title"],
3909
3593
  "in": "\"k\":\n title: c -- d\n",
3910
3594
  "out": "\"k\":\n title: c—d\n",
3911
3595
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a quoted key with an empty value opens a nested mapping."
@@ -3914,9 +3598,7 @@
3914
3598
  "id": "en-us-yaml-ok-quoted-item-then-item",
3915
3599
  "rule": "dashes",
3916
3600
  "mode": "yaml",
3917
- "keys": [
3918
- "title"
3919
- ],
3601
+ "keys": ["title"],
3920
3602
  "in": "- \"x\"\n- title: c -- d\n",
3921
3603
  "out": "- \"x\"\n- title: c—d\n",
3922
3604
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a closed quoted scalar followed by a sibling entry."
@@ -3925,9 +3607,7 @@
3925
3607
  "id": "en-us-yaml-ok-block-item-then-item",
3926
3608
  "rule": "dashes",
3927
3609
  "mode": "yaml",
3928
- "keys": [
3929
- "title"
3930
- ],
3610
+ "keys": ["title"],
3931
3611
  "in": "- |\n a\n- title: c -- d\n",
3932
3612
  "out": "- |\n a\n- title: c—d\n",
3933
3613
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a block scalar ends at the next entry at its own indent."
@@ -3936,9 +3616,7 @@
3936
3616
  "id": "en-us-yaml-ok-quoted-item-blank-then-key",
3937
3617
  "rule": "dashes",
3938
3618
  "mode": "yaml",
3939
- "keys": [
3940
- "title"
3941
- ],
3619
+ "keys": ["title"],
3942
3620
  "in": "- \"x\"\n\ntitle: c -- d\n",
3943
3621
  "out": "- \"x\"\n\ntitle: c—d\n",
3944
3622
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a blank line and a column-0 key after a closed quoted scalar."
@@ -3947,9 +3625,7 @@
3947
3625
  "id": "en-us-yaml-ok-special-char-key-sibling",
3948
3626
  "rule": "dashes",
3949
3627
  "mode": "yaml",
3950
- "keys": [
3951
- "title"
3952
- ],
3628
+ "keys": ["title"],
3953
3629
  "in": "- a!b: 1\n title: c -- d\n",
3954
3630
  "out": "- a!b: 1\n title: c—d\n",
3955
3631
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a declined key with a plain value absorbs nothing."
@@ -3958,9 +3634,7 @@
3958
3634
  "id": "en-us-yaml-ok-quoted-key-comment",
3959
3635
  "rule": "dashes",
3960
3636
  "mode": "yaml",
3961
- "keys": [
3962
- "title"
3963
- ],
3637
+ "keys": ["title"],
3964
3638
  "in": "\"a\": # note\n title: c -- d\n",
3965
3639
  "out": "\"a\": # note\n title: c—d\n",
3966
3640
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a quoted key with only a comment after the colon absorbs nothing."
@@ -3969,9 +3643,7 @@
3969
3643
  "id": "en-us-yaml-ok-quoted-key-quoted-value",
3970
3644
  "rule": "dashes",
3971
3645
  "mode": "yaml",
3972
- "keys": [
3973
- "title"
3974
- ],
3646
+ "keys": ["title"],
3975
3647
  "in": "- \"a\": \"b\"\n title: c -- d\n",
3976
3648
  "out": "- \"a\": \"b\"\n title: c—d\n",
3977
3649
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a quoted key whose quoted value closes cleanly absorbs nothing."
@@ -3980,9 +3652,7 @@
3980
3652
  "id": "en-us-yaml-ok-comment-line-in-nest",
3981
3653
  "rule": "dashes",
3982
3654
  "mode": "yaml",
3983
- "keys": [
3984
- "title"
3985
- ],
3655
+ "keys": ["title"],
3986
3656
  "in": "info:\n# c\n title: c -- d\n",
3987
3657
  "out": "info:\n# c\n title: c—d\n",
3988
3658
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a comment line absorbs nothing."
@@ -3991,9 +3661,7 @@
3991
3661
  "id": "en-us-yaml-ok-comment-after-marker",
3992
3662
  "rule": "dashes",
3993
3663
  "mode": "yaml",
3994
- "keys": [
3995
- "title"
3996
- ],
3664
+ "keys": ["title"],
3997
3665
  "in": "- # c\n title: c -- d\n",
3998
3666
  "out": "- # c\n title: c—d\n",
3999
3667
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a sequence marker followed only by a comment opens a nested mapping."
@@ -4002,9 +3670,7 @@
4002
3670
  "id": "en-us-yaml-ok-crlf-quoted-key-nested",
4003
3671
  "rule": "dashes",
4004
3672
  "mode": "yaml",
4005
- "keys": [
4006
- "title"
4007
- ],
3673
+ "keys": ["title"],
4008
3674
  "in": "\"k\":\r\n title: c -- d\r\n",
4009
3675
  "out": "\"k\":\r\n title: c—d\r\n",
4010
3676
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: CRLF terminators change nothing."
@@ -4013,9 +3679,7 @@
4013
3679
  "id": "en-us-yaml-ok-openapi-path",
4014
3680
  "rule": "dashes",
4015
3681
  "mode": "yaml",
4016
- "keys": [
4017
- "summary"
4018
- ],
3682
+ "keys": ["summary"],
4019
3683
  "in": "paths:\n /users/{id}:\n get:\n summary: c -- d\n",
4020
3684
  "out": "paths:\n /users/{id}:\n get:\n summary: c—d\n",
4021
3685
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: an OpenAPI path key with braces has an empty value and absorbs nothing, so the operations under it are scanned."
@@ -4024,9 +3688,7 @@
4024
3688
  "id": "en-us-yaml-ok-explicit-value-mapping",
4025
3689
  "rule": "dashes",
4026
3690
  "mode": "yaml",
4027
- "keys": [
4028
- "title"
4029
- ],
3691
+ "keys": ["title"],
4030
3692
  "in": "? a\n: title: c -- d\n",
4031
3693
  "out": "? a\n: title: c—d\n",
4032
3694
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: a mapping as the value of an explicit key converts."
@@ -4035,9 +3697,7 @@
4035
3697
  "id": "en-us-yaml-cost-anchor-only-line",
4036
3698
  "rule": "dashes",
4037
3699
  "mode": "yaml",
4038
- "keys": [
4039
- "title"
4040
- ],
3700
+ "keys": ["title"],
4041
3701
  "in": "- &x\n title: c -- d\n",
4042
3702
  "out": "- &x\n title: c -- d\n",
4043
3703
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): a line holding only an anchor opens a nested node that YAML reads as a mapping, but the scan absorbs its lines."
@@ -4046,9 +3706,7 @@
4046
3706
  "id": "en-us-yaml-cost-quoted-key-block-sibling",
4047
3707
  "rule": "dashes",
4048
3708
  "mode": "yaml",
4049
- "keys": [
4050
- "title"
4051
- ],
3709
+ "keys": ["title"],
4052
3710
  "in": "- \"a\": |\n title: c -- d\n",
4053
3711
  "out": "- \"a\": |\n title: c -- d\n",
4054
3712
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): a declined key with a block scalar absorbs a sibling at the entry's indent that YAML reads as a key."
@@ -4057,9 +3715,7 @@
4057
3715
  "id": "en-us-yaml-cost-own-line-region-sibling",
4058
3716
  "rule": "dashes",
4059
3717
  "mode": "yaml",
4060
- "keys": [
4061
- "title"
4062
- ],
3718
+ "keys": ["title"],
4063
3719
  "in": "info:\n description:\n \"x\n y\"\n title: c -- d\n",
4064
3720
  "out": "info:\n description:\n \"x\n y\"\n title: c -- d\n",
4065
3721
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): the own-line region ends only at column 0, so a sibling key at a deeper indent is absorbed."
@@ -4068,9 +3724,7 @@
4068
3724
  "id": "en-us-yaml-ok-own-line-region-column-zero",
4069
3725
  "rule": "dashes",
4070
3726
  "mode": "yaml",
4071
- "keys": [
4072
- "title"
4073
- ],
3727
+ "keys": ["title"],
4074
3728
  "in": "info:\n description:\n \"x\n y\"\ntitle: c -- d\n",
4075
3729
  "out": "info:\n description:\n \"x\n y\"\ntitle: c—d\n",
4076
3730
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: the own-line region ends at the first line in column 0."
@@ -4080,9 +3734,7 @@
4080
3734
  "rule": "dashes",
4081
3735
  "mode": "markdown",
4082
3736
  "dialect": "commonmark",
4083
- "frontmatterKeys": [
4084
- "title"
4085
- ],
3737
+ "frontmatterKeys": ["title"],
4086
3738
  "in": "---\nnotes:\n |\n title: c -- d\n---\n\nBody -- here.\n",
4087
3739
  "out": "---\nnotes:\n |\n title: c -- d\n---\n\nBody—here.\n",
4088
3740
  "note": "modes.md §3.7.4 and §3.8.4 (spec 1.11.0, polytypo#64): the frontmatter block reuses the yaml scan, so a block scalar header on a line of its own absorbs its content there too, and the body is unaffected."
@@ -4091,9 +3743,7 @@
4091
3743
  "id": "en-us-yaml-ok-escaped-quote-key-sibling",
4092
3744
  "rule": "dashes",
4093
3745
  "mode": "yaml",
4094
- "keys": [
4095
- "title"
4096
- ],
3746
+ "keys": ["title"],
4097
3747
  "in": "\"a\\\"b\": 1\ntitle: c -- d\n",
4098
3748
  "out": "\"a\\\"b\": 1\ntitle: c—d\n",
4099
3749
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: step 5 skips a U+005C and the code point after it, so `\"a\\\"b\"` closes on its line and is a quoted key; `title` at column 0 is not under it and converts."
@@ -4102,9 +3752,7 @@
4102
3752
  "id": "en-us-yaml-ok-anchored-key-column-zero",
4103
3753
  "rule": "dashes",
4104
3754
  "mode": "yaml",
4105
- "keys": [
4106
- "title"
4107
- ],
3755
+ "keys": ["title"],
4108
3756
  "in": "&a k: v\ntitle: c -- d\n",
4109
3757
  "out": "&a k: v\ntitle: c—d\n",
4110
3758
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: an anchored key in column 0 is a node line without a region, so a sibling at column 0 converts."
@@ -4113,9 +3761,7 @@
4113
3761
  "id": "en-us-yaml-ok-indented-document-marker-text",
4114
3762
  "rule": "dashes",
4115
3763
  "mode": "yaml",
4116
- "keys": [
4117
- "title"
4118
- ],
3764
+ "keys": ["title"],
4119
3765
  "in": "a:\n --- x: 1\ntitle: c -- d\n",
4120
3766
  "out": "a:\n --- x: 1\ntitle: c—d\n",
4121
3767
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): control: YAML reads a document marker only in column 0, so an indented `--- x: 1` absorbs nothing and `title` converts."
@@ -4124,9 +3770,7 @@
4124
3770
  "id": "en-us-yaml-cost-explicit-key-in-entry",
4125
3771
  "rule": "dashes",
4126
3772
  "mode": "yaml",
4127
- "keys": [
4128
- "title"
4129
- ],
3773
+ "keys": ["title"],
4130
3774
  "in": "- ? a\n : b\n title: c -- d\n",
4131
3775
  "out": "- ? a\n : b\n title: c -- d\n",
4132
3776
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): an explicit key inside an entry is a node line that absorbs the lines under it, though YAML reads `title` as a sibling."
@@ -4135,9 +3779,7 @@
4135
3779
  "id": "en-us-yaml-cost-flow-key-column-zero",
4136
3780
  "rule": "dashes",
4137
3781
  "mode": "yaml",
4138
- "keys": [
4139
- "title"
4140
- ],
3782
+ "keys": ["title"],
4141
3783
  "in": "{a: 1}: v\ntitle: c -- d\n",
4142
3784
  "out": "{a: 1}: v\ntitle: c -- d\n",
4143
3785
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): a flow collection at indent 0 absorbs the rest of the document, though YAML reads `title` as a root key."
@@ -4146,9 +3788,7 @@
4146
3788
  "id": "en-us-yaml-cost-document-marker-tag",
4147
3789
  "rule": "dashes",
4148
3790
  "mode": "yaml",
4149
- "keys": [
4150
- "title"
4151
- ],
3791
+ "keys": ["title"],
4152
3792
  "in": "--- !t\ntitle: c -- d\n",
4153
3793
  "out": "--- !t\ntitle: c -- d\n",
4154
3794
  "note": "modes.md §3.8.4 (spec 1.11.0, polytypo#64): accepted miss (§7.11): a document marker in column 0 followed by a tag absorbs the document."
@@ -4507,9 +4147,7 @@
4507
4147
  "id": "en-us-protect-throws-yaml",
4508
4148
  "rule": "dashes",
4509
4149
  "mode": "yaml",
4510
- "keys": [
4511
- "title"
4512
- ],
4150
+ "keys": ["title"],
4513
4151
  "in": "title: a -- b\n",
4514
4152
  "protect": [
4515
4153
  {