style_config.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. """可配置的样式与辅助开关。
  2. 将样式集中到本文件,方便按需注释或将 `enabled` 置为 False。
  3. 每条规则都给出了针对的语法成分及效果说明,帮助快速定位高亮条件。
  4. """
  5. from dataclasses import dataclass
  6. from typing import Iterable, List
  7. @dataclass
  8. class StyleRule:
  9. selector: str
  10. target: str
  11. description: str
  12. css: str
  13. enabled: bool = True
  14. def to_css(self) -> str:
  15. return f"{self.selector}{{{self.css}}}"
  16. def build_style_block(rules: Iterable["StyleRule"]) -> str:
  17. body = "".join(rule.to_css() for rule in rules if rule.enabled)
  18. return f"<style>{body}</style>"
  19. # 统一的句子辅助说明开关:True 时在句尾打印中文结构摘要。
  20. SENTENCE_HELPER_ENABLED: bool = False
  21. STYLE_RULES: List[StyleRule] = [
  22. StyleRule(
  23. selector=".analysis",
  24. target="语法分析容器",
  25. description="设置整体行距与字号,并保持换行,保证输出易读。",
  26. css="line-height:1.65;font-size:1rem;font-weight:400",
  27. ),
  28. StyleRule(
  29. selector=".analysis span",
  30. target="所有高亮片段",
  31. description="为每个高亮片段加入适度内边距和圆角,提升视觉分隔感。",
  32. css="padding:.04rem .08rem;border-radius:.15rem",
  33. ),
  34. StyleRule(
  35. selector=".sentence-scope",
  36. target="句子外层容器",
  37. description="包裹整句,方便显示序号与复杂度指示。",
  38. css=(
  39. "position:relative;display:inline;padding:0;margin:0;"
  40. "box-decoration-break:clone"
  41. ),
  42. ),
  43. StyleRule(
  44. selector=".sentence-scope::before",
  45. target="句子编号",
  46. description="在句首展示圈号,快速定位句子编号。",
  47. css=(
  48. "content:attr(data-sid)' ';color:#475569!important;font-size:.85em;"
  49. "margin-right:.4rem;display:inline-flex;align-items:center;justify-content:center;"
  50. "min-width:1.5em;padding:0;background:transparent!important;border:none!important;"
  51. "box-shadow:none!important;text-shadow:none;filter:none;white-space:nowrap"
  52. ),
  53. ),
  54. StyleRule(
  55. selector=".paragraph-scope",
  56. target="段落容器",
  57. description="块级包裹原始段落,保持输入段落分隔并留出下边距。",
  58. css=(
  59. "display:block;padding:0;margin:15px 0 15px 0;background:none;border-radius:0;"
  60. "line-height:1.65;color:inherit;"
  61. ),
  62. ),
  63. StyleRule(
  64. selector=".analysis .paragraph-scope[data-list-kind]",
  65. target="列表容器",
  66. description="当段落来自列表时为其留出项目符号区域并缩进。",
  67. css="position:relative;padding-left:1.35rem;margin-left:.25rem",
  68. ),
  69. StyleRule(
  70. selector=".analysis .paragraph-scope[data-list-kind][data-list-depth='2']",
  71. target="二级列表缩进",
  72. description="二级列表额外缩进。",
  73. css="margin-left:1.5rem",
  74. ),
  75. StyleRule(
  76. selector=".analysis .paragraph-scope[data-list-kind][data-list-depth='3']",
  77. target="三级列表缩进",
  78. description="三级列表额外缩进。",
  79. css="margin-left:2.5rem",
  80. ),
  81. StyleRule(
  82. selector=".analysis .paragraph-scope[data-list-kind][data-list-depth='4']",
  83. target="四级列表缩进",
  84. description="四级列表额外缩进。",
  85. css="margin-left:3.5rem",
  86. ),
  87. StyleRule(
  88. selector=".analysis .paragraph-scope[data-list-kind][data-list-depth='5']",
  89. target="五级以上缩进",
  90. description="更深层级列表保持缩进阶梯。",
  91. css="margin-left:4.25rem",
  92. ),
  93. StyleRule(
  94. selector=".analysis .paragraph-scope[data-list-kind]::before",
  95. target="列表项目符号",
  96. description="绘制原始列表的符号或编号。",
  97. css="content:'';position:absolute;left:0;top:0;color:#475569;font-weight:600",
  98. ),
  99. StyleRule(
  100. selector=".analysis .paragraph-scope[data-list-kind='ul']::before",
  101. target="无序列表",
  102. description="使用圆点恢复无序列表样式。",
  103. css="content:'•';",
  104. ),
  105. StyleRule(
  106. selector=".analysis .paragraph-scope[data-list-kind='ol']::before",
  107. target="有序列表",
  108. description="使用原编号恢复有序列表样式。",
  109. css="content:attr(data-list-index) '. ';",
  110. ),
  111. # StyleRule(
  112. # selector=".sentence-scope[data-complex='1']",
  113. # target="复杂句提示",
  114. # description="复杂句底部加淡橙色阴影,以提示结构较复杂。",
  115. # css="box-shadow:inset 0 -0.2rem 0 rgba(250,209,155,.6)",
  116. # ),
  117. StyleRule(
  118. selector=".analysis[data-helper='on'] .sentence-scope::after",
  119. target="句子辅助说明",
  120. description="在句后输出中文提示,解释成分与从句情况。",
  121. css="content:attr(data-note);display:block;font-size:.85rem;color:#64748b;margin:.2rem 0 .45rem 1.5rem;line-height:1.4",
  122. ),
  123. StyleRule(
  124. selector=".analysis[data-helper='off'] .sentence-scope::after",
  125. target="关闭辅助说明",
  126. description="当 helper 关闭时隐藏说明,避免额外占位。",
  127. css="content:'';display:none",
  128. ),
  129. StyleRule(
  130. selector=".role-subject",
  131. target="主语",
  132. description="淡黄色底纹突出主语位置。",
  133. css="background-color:#fff3bf",
  134. ),
  135. StyleRule(
  136. selector=".role-predicate",
  137. target="谓语动词",
  138. description="深玫红字体并加粗,强调谓语中心。",
  139. css="color:#000000!important;font-weight:700;background-color:rgba(255,235,239,.8)",
  140. ),
  141. StyleRule(
  142. selector=".role-object-do",
  143. target="直接宾语",
  144. description="浅绿底色显示直接宾语。",
  145. css="background-color:#e5ffcc",
  146. ),
  147. StyleRule(
  148. selector=".role-object-io",
  149. target="间接宾语",
  150. description="黄绿底色区分间接宾语。",
  151. css="background-color:#cef0a3",
  152. ),
  153. StyleRule(
  154. selector=".role-complement",
  155. target="表语/主补语",
  156. description="实线下划线指示补语区域。",
  157. css="border-bottom:2px solid #e6a04c",
  158. ),
  159. StyleRule(
  160. selector=".role-object-complement",
  161. target="宾补",
  162. description="虚线下划线提示补充说明的宾补。",
  163. css="border-bottom:2px dashed #e6a04c",
  164. ),
  165. StyleRule(
  166. selector=".role-apposition",
  167. target="同位语",
  168. description="蓝色立线和缩进强调同位语说明。",
  169. css="border-left:2px solid #63a4d4;padding-left:.15rem",
  170. ),
  171. StyleRule(
  172. selector=".role-adverbial",
  173. target="状语短语",
  174. description="黄绿底色突出状语信息。",
  175. css="background-color:#e7fded",
  176. ),
  177. StyleRule(
  178. selector=".role-connector",
  179. target="连接词",
  180. description="灰蓝底纹突出并列/从属连词,避免分散显示。",
  181. css="background-color:#e2e8f0;color:#1f2937",
  182. ),
  183. # StyleRule(
  184. # selector=".role-determiner",
  185. # target="限定词/冠词",
  186. # description="更浅的背景温和提示限定词。",
  187. # css="background-color:#f8fafc;color:#475569",
  188. # ),
  189. StyleRule(
  190. selector=".role-modifier",
  191. target="形容词或并列修饰",
  192. description="虚线下划线标出修饰信息,保证主体和修饰对比。",
  193. css="border-bottom:1px dotted #93c5fd",
  194. ),
  195. StyleRule(
  196. selector=".role-parenthetical",
  197. target="插入语",
  198. description="灰色虚线边框表示插入语。",
  199. css="border:1px dotted #888",
  200. ),
  201. # StyleRule(
  202. # selector=".role-absolute",
  203. # target="独立主格",
  204. # description="淡紫底色展示独立主格结构。",
  205. # css="background-color:#f0e8ff",
  206. # ),
  207. # StyleRule(
  208. # selector=".clause-noun,.clause-relative,.clause-adverbial,.clause-nonfinite",
  209. # target="从句容器(公共样式)",
  210. # description="统一使用彩色立线和左内边距包裹从句内容。",
  211. # css="border-left:2px solid currentColor;padding-left:.25rem;margin-left:.1rem",
  212. # ),
  213. # StyleRule(
  214. # selector=".clause-noun",
  215. # target="名词从句",
  216. # description="绿色配色突出名词性从句。",
  217. # css="color:#5c8f1d;background-color:rgba(158,201,134,.18)",
  218. # ),
  219. StyleRule(
  220. selector=".clause-relative",
  221. target="定语从句",
  222. description="紫色底色标记定语从句,便于和主句区分。",
  223. css="color:#6b4fa1;background-color:rgba(146,132,189,.15)",
  224. ),
  225. StyleRule(
  226. selector=".clause-adverbial",
  227. target="状语从句",
  228. description="灰色底色展示状语从句,配合数据属性显示功能类别。",
  229. css="color:#0f5132;background-color:rgba(128,203,196,.18)",
  230. ),
  231. StyleRule(
  232. selector=".clause-nonfinite",
  233. target="非限定从句 / 非谓语",
  234. description="橙色底纹提示非限定结构。",
  235. css="color:#c7780a;background-color:rgba(253,203,110,.18)",
  236. ),
  237. # StyleRule(
  238. # selector=".analysis[data-helper='on'] .clause-relative[data-modifies]::before,.analysis[data-helper='on'] .clause-adverbial[data-modifies]::before",
  239. # target="从句修饰箭头",
  240. # description="在辅助开启时显示“→”指向被修饰的成分。",
  241. # css="content:'→'attr(data-modifies)' ';color:#666;font-size:.85em",
  242. # ),
  243. # StyleRule(
  244. # selector=".analysis[data-helper='on'] .clause-adverbial[data-function]::after",
  245. # target="状语从句功能标签",
  246. # description="在尾部追加方括号说明(时间/原因等)。",
  247. # css="content:' ['attr(data-function)']';color:#1b5e20;font-size:.85em",
  248. # ),
  249. # StyleRule(
  250. # selector=".analysis[data-helper='on'] .clause-noun[data-clause-role]::after",
  251. # target="名词从句句法角色",
  252. # description="括号提示该名词从句在句中的角色(主语/宾语)。",
  253. # css="content:' ('attr(data-clause-role)')';color:#3f6212;font-size:.78em",
  254. # ),
  255. StyleRule(
  256. selector=".phrase-fixed",
  257. target="固定搭配",
  258. description="米色底与虚线强调固定表达或习语。",
  259. css="background-color:#fff8f0;border-bottom:1px dashed #c28150",
  260. ),
  261. # StyleRule(
  262. # selector=".role-residual",
  263. # target="未分类成分",
  264. # description="浅灰背景提示未归类成分,并通过 data-role 提供中文标签。",
  265. # css="background-color:#f6f8fa;color:#475569;border-bottom:1px dotted #cbd5e1",
  266. # ),
  267. StyleRule(
  268. selector=".lex-rare",
  269. target="低频词",
  270. description="深蓝色字体提示低频或重点词汇。",
  271. css="color:#000080",
  272. ),
  273. ]
  274. STYLE_BLOCK = build_style_block(STYLE_RULES)