feat(rules): 建立共享排版契约并收束 WebKit 与 Unicode 基线

This commit is contained in:
2026-09-04 21:44:11 +08:00
parent 8ee9895247
commit 993cf576c6
42 changed files with 8511 additions and 1422 deletions
+255
View File
@@ -0,0 +1,255 @@
{
"$schema": "./juzhen-rules.schema.json",
"schemaVersion": 1,
"rulesetVersion": "1.0.0",
"unicodeProfile": {
"version": "17.0.0",
"coverage": "CJK Unified Ideographs through Extension J, compatibility ideographs, kana, bopomofo, radicals, and enclosed CJK characters"
},
"characterClasses": {
"representation": "unicode-code-point-ranges",
"cjk": [
{ "start": "2E80", "end": "2EFF" },
{ "start": "2F00", "end": "2FDF" },
{ "start": "3040", "end": "309F" },
{ "start": "30A0", "end": "30FA" },
{ "start": "30FC", "end": "30FF" },
{ "start": "3100", "end": "312F" },
{ "start": "3200", "end": "32FF" },
{ "start": "3400", "end": "4DBF" },
{ "start": "4E00", "end": "9FFF" },
{ "start": "F900", "end": "FAFF" },
{ "start": "20000", "end": "2A6DF" },
{ "start": "2A700", "end": "2B73F" },
{ "start": "2B740", "end": "2B81F" },
{ "start": "2B820", "end": "2CEAF" },
{ "start": "2CEB0", "end": "2EBEF" },
{ "start": "2EBF0", "end": "2EE5F" },
{ "start": "2F800", "end": "2FA1F" },
{ "start": "30000", "end": "3134F" },
{ "start": "31350", "end": "323AF" },
{ "start": "323B0", "end": "3347F" }
],
"ansAfterCjk": [
{ "start": "0024", "end": "0026" },
{ "start": "002A", "end": "002B" },
{ "codePoint": "002D" },
{ "start": "0030", "end": "0039" },
{ "codePoint": "003D" },
{ "codePoint": "0040" },
{ "start": "0041", "end": "005A" },
{ "codePoint": "005C" },
{ "codePoint": "005E" },
{ "start": "0061", "end": "007A" },
{ "start": "00A1", "end": "00B6" },
{ "start": "00B8", "end": "00FF" },
{ "start": "0100", "end": "024F" },
{ "start": "0370", "end": "03FF" },
{ "start": "0400", "end": "04FF" },
{ "start": "20A0", "end": "20BF" },
{ "start": "2150", "end": "21FF" },
{ "start": "2200", "end": "22FF" },
{ "start": "2700", "end": "27BF" }
],
"ansBeforeCjk": [
{ "start": "0024", "end": "0026" },
{ "start": "002A", "end": "002B" },
{ "codePoint": "002D" },
{ "start": "0030", "end": "0039" },
{ "codePoint": "003D" },
{ "start": "0041", "end": "005A" },
{ "codePoint": "005C" },
{ "codePoint": "005E" },
{ "start": "0061", "end": "007A" },
{ "start": "00A1", "end": "00B6" },
{ "start": "00B8", "end": "00FF" },
{ "start": "0100", "end": "024F" },
{ "start": "0370", "end": "03FF" },
{ "start": "0400", "end": "04FF" },
{ "start": "20A0", "end": "20BF" },
{ "start": "2150", "end": "21FF" },
{ "start": "2200", "end": "22FF" },
{ "start": "2700", "end": "27BF" }
],
"variationSelectors": [
{ "start": "FE00", "end": "FE0F" },
{ "start": "E0100", "end": "E01EF" }
],
"biaodian": {
"classificationOrder": [ "stop", "pause", "open", "close", "middle", "liga" ],
"classes": {
"stop": [
{ "codePoint": "3002" },
{ "codePoint": "FF01" },
{ "codePoint": "FF0E" },
{ "codePoint": "FF1F" }
],
"pause": [
{ "codePoint": "3001" },
{ "codePoint": "FF0C" },
{ "codePoint": "FF1A" },
{ "codePoint": "FF1B" }
],
"open": [
{ "codePoint": "2018" },
{ "codePoint": "201C" },
{ "codePoint": "3008" },
{ "codePoint": "300A" },
{ "codePoint": "300C" },
{ "codePoint": "300E" },
{ "codePoint": "3010" },
{ "codePoint": "3014" },
{ "codePoint": "3016" },
{ "codePoint": "FF08" },
{ "codePoint": "FF3B" },
{ "codePoint": "FF5B" }
],
"close": [
{ "codePoint": "2019" },
{ "codePoint": "201D" },
{ "codePoint": "3009" },
{ "codePoint": "300B" },
{ "codePoint": "300D" },
{ "codePoint": "300F" },
{ "codePoint": "3011" },
{ "codePoint": "3015" },
{ "codePoint": "3017" },
{ "codePoint": "FF09" },
{ "codePoint": "FF3D" },
{ "codePoint": "FF5D" }
],
"middle": [
{ "codePoint": "00B7" },
{ "codePoint": "2027" },
{ "codePoint": "30FB" }
],
"liga": [
{ "codePoint": "2014" },
{ "codePoint": "2026" }
]
}
},
"overrideSemantics": {
"mode": "append",
"westernTargets": [ "ansAfterCjk", "ansBeforeCjk" ],
"removalAllowed": false,
"reclassificationAllowed": false
}
},
"atoms": {
"unit": "base-code-point-plus-optional-variation-selector",
"maxVariationSelectors": 1,
"variationSelectorMustFollowBase": true,
"isolatedVariationSelector": "independent-atom"
},
"locales": {
"classes": [ "zh-Hans", "zh-Hant", "ja", "other" ],
"primaryLanguageBoundary": "exact-or-hyphen-subtag",
"classificationOrder": [
"ja-primary-language",
"zh-explicit-script",
"zh-traditional-region",
"zh-bare-default",
"zh-remaining",
"other"
],
"zh": {
"explicitTraditionalSubtag": "hant",
"explicitSimplifiedSubtag": "hans",
"traditionalRegions": [ "tw", "hk", "mo" ],
"bare": "zh-Hant",
"remaining": "zh-Hans"
},
"ja": "ja",
"defaultPolicies": {
"zh-Hans": "kaiming",
"zh-Hant": "quanjiao",
"ja": "quanjiao",
"other": "quanjiao"
},
"resolutionPriority": [
"element-attribute-or-style-policy-nearest-ancestor",
"locale-class-policy",
"global-style",
"default-policy"
]
},
"punctuationStyles": {
"baselineHalfWidthClasses": {
"quanjiao": [],
"kaiming": [ "pause", "open", "close" ],
"banjiao": [ "stop", "pause", "open", "close" ]
},
"adjacency": {
"rule": "squeeze-each-facing-blank-side-independently",
"sentenceBoundaryException": {
"left": "stop",
"right": "open",
"preserve": "left-right-blank"
}
}
},
"spacing": {
"gapEm": 0.25,
"directions": {
"cjkToAns": "ansAfterCjk",
"ansToCjk": "ansBeforeCjk",
"asymmetry": "at-sign-only-after-cjk"
},
"authorSpaceDisposition": {
"cjkAns": "remove-and-use-managed-gap",
"ansCjk": "remove-and-use-managed-gap",
"cjkCjk": "remove-without-gap",
"revertRestoresRemovedSpace": false
}
},
"lineBreaking": {
"prohibitedBreaks": {
"before": [ "close", "pause", "stop", "middle", "liga" ],
"after": [ "open" ]
},
"orphan": {
"defaultMeaningfulCjkChars": 2,
"counts": "cjk-atoms-not-classified-as-biaodian",
"excludes": [ "biaodian", "non-cjk" ]
}
},
"applicabilityLevels": {
"text": [ "spacing", "punctuation-classification-and-width" ],
"paragraph": [ "prohibited-breaks", "orphan-minimum", "long-word-hyphenation" ]
},
"semanticProcessing": {
"dependencies": [
{ "before": "atomize", "after": "classify" },
{ "before": "classify", "after": "derive-spacing" },
{ "before": "classify", "after": "derive-punctuation-width" },
{ "before": "classify", "after": "derive-break-constraints" },
{ "before": "classify", "after": "derive-orphan-constraint" }
],
"conditionalLineEdgeOutcomes": [
"punctuation-half-width-at-line-edge",
"remove-managed-gap-at-line-end"
]
},
"adapterBoundary": {
"platformNeutral": [
"unicode-character-classes",
"logical-atom-boundaries",
"locale-classification-and-policy",
"punctuation-width-semantics",
"spacing-decisions-and-distance",
"prohibited-break-relations",
"orphan-count",
"applicability-levels-and-semantic-dependencies"
],
"excludedAdapterMechanisms": [
"generated-node-or-element-representation",
"ownership-and-reversion-bookkeeping",
"rendering-primitive-selection",
"generated-line-break-hints",
"mutation-observation-or-rerun-lifecycle",
"layout-measurement",
"platform-specific-workarounds"
]
}
}