@cherry-markdown/cherry-markdown-dev 0.9.0-dev.202504110650.834443a → 0.9.0-dev.202504160300.d23d141

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 (327) hide show
  1. package/README.md +2 -2
  2. package/dist/addons/advance/cherry-table-echarts-plugin.js +1 -1
  3. package/dist/addons/cherry-code-block-mermaid-plugin.js +1 -1
  4. package/dist/cherry-markdown.core.common.js +1 -1
  5. package/dist/cherry-markdown.core.js +1 -1
  6. package/dist/cherry-markdown.engine.core.common.js +1 -1
  7. package/dist/cherry-markdown.engine.core.esm.js +1 -1
  8. package/dist/cherry-markdown.engine.core.js +1 -1
  9. package/dist/cherry-markdown.esm.js +1 -1
  10. package/dist/cherry-markdown.js +1 -1
  11. package/dist/cherry-markdown.min.js +1 -1
  12. package/dist/fonts/ch-icon.eot +0 -0
  13. package/dist/fonts/ch-icon.ttf +0 -0
  14. package/dist/fonts/ch-icon.woff +0 -0
  15. package/dist/fonts/ch-icon.woff2 +0 -0
  16. package/package.json +1 -3
  17. package/src/Cherry.config.js +0 -634
  18. package/src/Cherry.js +0 -1104
  19. package/src/CherryStatic.js +0 -70
  20. package/src/Editor.js +0 -748
  21. package/src/Engine.js +0 -402
  22. package/src/Event.js +0 -140
  23. package/src/Factory.js +0 -180
  24. package/src/Logger.js +0 -31
  25. package/src/Previewer.js +0 -1192
  26. package/src/Sanitizer.js +0 -4
  27. package/src/Sanitizer.node.js +0 -7
  28. package/src/UrlCache.js +0 -98
  29. package/src/addons/advance/cherry-table-echarts-plugin.js +0 -170
  30. package/src/addons/cherry-code-block-mermaid-plugin.js +0 -158
  31. package/src/addons/cherry-code-block-plantuml-plugin.js +0 -106
  32. package/src/core/HookCenter.js +0 -297
  33. package/src/core/HooksConfig.js +0 -105
  34. package/src/core/ParagraphBase.js +0 -332
  35. package/src/core/SentenceBase.js +0 -65
  36. package/src/core/SyntaxBase.js +0 -194
  37. package/src/core/hooks/AutoLink.js +0 -232
  38. package/src/core/hooks/BackgroundColor.js +0 -46
  39. package/src/core/hooks/Blockquote.js +0 -70
  40. package/src/core/hooks/Br.js +0 -85
  41. package/src/core/hooks/CodeBlock.js +0 -456
  42. package/src/core/hooks/Color.js +0 -46
  43. package/src/core/hooks/CommentReference.js +0 -96
  44. package/src/core/hooks/Detail.js +0 -108
  45. package/src/core/hooks/Emoji.config.js +0 -1825
  46. package/src/core/hooks/Emoji.js +0 -119
  47. package/src/core/hooks/Emphasis.js +0 -113
  48. package/src/core/hooks/Footnote.js +0 -125
  49. package/src/core/hooks/FrontMatter.js +0 -51
  50. package/src/core/hooks/Header.js +0 -234
  51. package/src/core/hooks/HighLight.js +0 -37
  52. package/src/core/hooks/Hr.js +0 -52
  53. package/src/core/hooks/HtmlBlock.js +0 -199
  54. package/src/core/hooks/Image.js +0 -174
  55. package/src/core/hooks/InlineCode.js +0 -48
  56. package/src/core/hooks/InlineMath.js +0 -108
  57. package/src/core/hooks/Link.js +0 -160
  58. package/src/core/hooks/List.js +0 -264
  59. package/src/core/hooks/MathBlock.js +0 -104
  60. package/src/core/hooks/Panel.js +0 -145
  61. package/src/core/hooks/Paragraph.js +0 -84
  62. package/src/core/hooks/Ruby.js +0 -34
  63. package/src/core/hooks/Size.js +0 -51
  64. package/src/core/hooks/Strikethrough.js +0 -54
  65. package/src/core/hooks/Sub.js +0 -47
  66. package/src/core/hooks/SuggestList.js +0 -333
  67. package/src/core/hooks/Suggester.js +0 -707
  68. package/src/core/hooks/Sup.js +0 -47
  69. package/src/core/hooks/Table.js +0 -275
  70. package/src/core/hooks/Toc.js +0 -292
  71. package/src/core/hooks/Transfer.js +0 -47
  72. package/src/core/hooks/Underline.js +0 -37
  73. package/src/index.core.js +0 -29
  74. package/src/index.engine.core.js +0 -68
  75. package/src/index.engine.js +0 -28
  76. package/src/index.js +0 -32
  77. package/src/libs/mermaidAPI.8.4.8.js +0 -1
  78. package/src/libs/mermaidAPI.8.5.2.js +0 -42
  79. package/src/libs/rawdeflate.js +0 -1663
  80. package/src/locales/en_US.js +0 -139
  81. package/src/locales/index.js +0 -25
  82. package/src/locales/ru_RU.js +0 -139
  83. package/src/locales/zh_CN.js +0 -142
  84. package/src/sass/base.scss +0 -26
  85. package/src/sass/bubble_formula.scss +0 -166
  86. package/src/sass/ch-icon.scss +0 -118
  87. package/src/sass/cherry.scss +0 -1116
  88. package/src/sass/components/bubble.scss +0 -173
  89. package/src/sass/components/shortcut_key_config.scss +0 -108
  90. package/src/sass/formula_utils_bubble.scss +0 -82
  91. package/src/sass/icon_template.scss +0 -24
  92. package/src/sass/icons/uEA03-list.svg +0 -19
  93. package/src/sass/icons/uEA04-check.svg +0 -14
  94. package/src/sass/icons/uEA09-square.svg +0 -10
  95. package/src/sass/icons/uEA0A-bold.svg +0 -20
  96. package/src/sass/icons/uEA0B-code.svg +0 -18
  97. package/src/sass/icons/uEA0C-color.svg +0 -13
  98. package/src/sass/icons/uEA0D-header.svg +0 -8
  99. package/src/sass/icons/uEA0E-image.svg +0 -15
  100. package/src/sass/icons/uEA0F-italic.svg +0 -8
  101. package/src/sass/icons/uEA10-link.svg +0 -16
  102. package/src/sass/icons/uEA11-ol.svg +0 -21
  103. package/src/sass/icons/uEA12-size.svg +0 -11
  104. package/src/sass/icons/uEA13-strike.svg +0 -16
  105. package/src/sass/icons/uEA14-table.svg +0 -12
  106. package/src/sass/icons/uEA15-ul.svg +0 -17
  107. package/src/sass/icons/uEA16-underline.svg +0 -13
  108. package/src/sass/icons/uEA17-word.svg +0 -16
  109. package/src/sass/icons/uEA18-blockquote.svg +0 -11
  110. package/src/sass/icons/uEA19-font.svg +0 -10
  111. package/src/sass/icons/uEA1F-insertClass.svg +0 -39
  112. package/src/sass/icons/uEA20-insertFlow.svg +0 -8
  113. package/src/sass/icons/uEA21-insertFormula.svg +0 -23
  114. package/src/sass/icons/uEA22-insertGantt.svg +0 -13
  115. package/src/sass/icons/uEA23-insertGraph.svg +0 -13
  116. package/src/sass/icons/uEA24-insertPie.svg +0 -19
  117. package/src/sass/icons/uEA25-insertSeq.svg +0 -20
  118. package/src/sass/icons/uEA26-insertState.svg +0 -35
  119. package/src/sass/icons/uEA27-line.svg +0 -11
  120. package/src/sass/icons/uEA28-preview.svg +0 -18
  121. package/src/sass/icons/uEA29-previewClose.svg +0 -24
  122. package/src/sass/icons/uEA2A-toc.svg +0 -24
  123. package/src/sass/icons/uEA2D-sub.svg +0 -15
  124. package/src/sass/icons/uEA2E-sup.svg +0 -15
  125. package/src/sass/icons/uEA2F-h1.svg +0 -16
  126. package/src/sass/icons/uEA30-h2.svg +0 -20
  127. package/src/sass/icons/uEA31-h3.svg +0 -23
  128. package/src/sass/icons/uEA32-h4.svg +0 -16
  129. package/src/sass/icons/uEA33-h5.svg +0 -20
  130. package/src/sass/icons/uEA34-h6.svg +0 -17
  131. package/src/sass/icons/uEA35-video.svg +0 -20
  132. package/src/sass/icons/uEA36-insert.svg +0 -25
  133. package/src/sass/icons/uEA37-little_table.svg +0 -30
  134. package/src/sass/icons/uEA38-pdf.svg +0 -27
  135. package/src/sass/icons/uEA39-checklist.svg +0 -22
  136. package/src/sass/icons/uEA40-close.svg +0 -12
  137. package/src/sass/icons/uEA41-fullscreen.svg +0 -81
  138. package/src/sass/icons/uEA42-minscreen.svg +0 -77
  139. package/src/sass/icons/uEA43-insertChart.svg +0 -23
  140. package/src/sass/icons/uEA44-question.svg +0 -25
  141. package/src/sass/icons/uEA45-settings.svg +0 -32
  142. package/src/sass/icons/uEA46-ok.svg +0 -7
  143. package/src/sass/icons/uEA47-br.svg +0 -22
  144. package/src/sass/icons/uEA48-normal.svg +0 -15
  145. package/src/sass/icons/uEA49-undo.svg +0 -19
  146. package/src/sass/icons/uEA50-redo.svg +0 -21
  147. package/src/sass/icons/uEA51-copy.svg +0 -6
  148. package/src/sass/icons/uEA52-phone.svg +0 -5
  149. package/src/sass/icons/uEA53-cherry-table-delete.svg +0 -17
  150. package/src/sass/icons/uEA54-cherry-table-insert-bottom.svg +0 -16
  151. package/src/sass/icons/uEA55-cherry-table-insert-left.svg +0 -15
  152. package/src/sass/icons/uEA56-cherry-table-insert-right.svg +0 -16
  153. package/src/sass/icons/uEA57-cherry-table-insert-top.svg +0 -16
  154. package/src/sass/icons/uEA58-sort-s.svg +0 -13
  155. package/src/sass/icons/uEA59-pinyin.svg +0 -1
  156. package/src/sass/icons/uEA5A-create.svg +0 -24
  157. package/src/sass/icons/uEA5B-download.svg +0 -34
  158. package/src/sass/icons/uEA5C-edit.svg +0 -3
  159. package/src/sass/icons/uEA5D-export.svg +0 -53
  160. package/src/sass/icons/uEA5E-folder-open.svg +0 -3
  161. package/src/sass/icons/uEA5F-folder.svg +0 -3
  162. package/src/sass/icons/uEA60-help.svg +0 -5
  163. package/src/sass/icons/uEA61-pen-fill.svg +0 -13
  164. package/src/sass/icons/uEA62-pen.svg +0 -3
  165. package/src/sass/icons/uEA64-tips.svg +0 -5
  166. package/src/sass/icons/uEA65-warn.svg +0 -5
  167. package/src/sass/icons/uEA66-mistake.svg +0 -4
  168. package/src/sass/icons/uEA67-success.svg +0 -4
  169. package/src/sass/icons/uEA68-danger.svg +0 -4
  170. package/src/sass/icons/uEA69-info.svg +0 -5
  171. package/src/sass/icons/uEA6A-primary.svg +0 -5
  172. package/src/sass/icons/uEA6B-warning.svg +0 -5
  173. package/src/sass/icons/uEA6C-justify.svg +0 -19
  174. package/src/sass/icons/uEA6D-justifyCenter.svg +0 -19
  175. package/src/sass/icons/uEA6E-justifyLeft.svg +0 -19
  176. package/src/sass/icons/uEA6F-justifyRight.svg +0 -19
  177. package/src/sass/icons/uEA70-chevronsLeft.svg +0 -1
  178. package/src/sass/icons/uEA71-chevronsRight.svg +0 -1
  179. package/src/sass/icons/uEA72-trendingUp.svg +0 -1
  180. package/src/sass/icons/uEA74-codeBlock.svg +0 -1
  181. package/src/sass/icons/uEA75-expand.svg +0 -3
  182. package/src/sass/icons/uEA76-unExpand.svg +0 -3
  183. package/src/sass/icons/uEA77-swap-vert.svg +0 -1
  184. package/src/sass/icons/uEA78-swap.svg +0 -1
  185. package/src/sass/icons/uEA79-keyboard.svg +0 -1
  186. package/src/sass/icons/uEA7A-command.svg +0 -1
  187. package/src/sass/icons/uEA7B-search.svg +0 -1
  188. package/src/sass/index.scss +0 -3
  189. package/src/sass/markdown.scss +0 -668
  190. package/src/sass/markdown_pure.scss +0 -9
  191. package/src/sass/prettyprint/prettyprint.scss +0 -118
  192. package/src/sass/previewer.scss +0 -179
  193. package/src/sass/print.scss +0 -13
  194. package/src/sass/prism/coy.scss +0 -220
  195. package/src/sass/prism/dark.scss +0 -132
  196. package/src/sass/prism/default.scss +0 -143
  197. package/src/sass/prism/funky.scss +0 -133
  198. package/src/sass/prism/okaidia.scss +0 -126
  199. package/src/sass/prism/one-dark.scss +0 -440
  200. package/src/sass/prism/one-light.scss +0 -428
  201. package/src/sass/prism/solarized-light.scss +0 -153
  202. package/src/sass/prism/tomorrow-night.scss +0 -125
  203. package/src/sass/prism/twilight.scss +0 -202
  204. package/src/sass/prism/vs-dark.scss +0 -275
  205. package/src/sass/prism/vs-light.scss +0 -168
  206. package/src/sass/themes/blue.scss +0 -411
  207. package/src/sass/themes/dark.scss +0 -517
  208. package/src/sass/themes/default.scss +0 -255
  209. package/src/sass/themes/green.scss +0 -395
  210. package/src/sass/themes/light.scss +0 -368
  211. package/src/sass/themes/red.scss +0 -397
  212. package/src/sass/themes/violet.scss +0 -410
  213. package/src/sass/variable.scss +0 -84
  214. package/src/toolbars/Bubble.js +0 -234
  215. package/src/toolbars/BubbleFormula.js +0 -298
  216. package/src/toolbars/BubbleTable.js +0 -147
  217. package/src/toolbars/FloatMenu.js +0 -131
  218. package/src/toolbars/HiddenToolbar.js +0 -36
  219. package/src/toolbars/HookCenter.js +0 -231
  220. package/src/toolbars/MenuBase.js +0 -569
  221. package/src/toolbars/PreviewerBubble.js +0 -608
  222. package/src/toolbars/ShortcutKeyConfigPanel.js +0 -345
  223. package/src/toolbars/Sidebar.js +0 -36
  224. package/src/toolbars/Toc.js +0 -242
  225. package/src/toolbars/Toolbar.js +0 -449
  226. package/src/toolbars/ToolbarRight.js +0 -37
  227. package/src/toolbars/hooks/Audio.js +0 -79
  228. package/src/toolbars/hooks/BarTable.js +0 -41
  229. package/src/toolbars/hooks/Bold.js +0 -73
  230. package/src/toolbars/hooks/Br.js +0 -34
  231. package/src/toolbars/hooks/ChangeLocale.js +0 -62
  232. package/src/toolbars/hooks/ChatGpt.js +0 -182
  233. package/src/toolbars/hooks/CheckList.js +0 -41
  234. package/src/toolbars/hooks/Code.js +0 -49
  235. package/src/toolbars/hooks/CodeTheme.js +0 -66
  236. package/src/toolbars/hooks/Color.js +0 -298
  237. package/src/toolbars/hooks/Copy.js +0 -141
  238. package/src/toolbars/hooks/Detail.js +0 -69
  239. package/src/toolbars/hooks/DrawIo.js +0 -57
  240. package/src/toolbars/hooks/Export.js +0 -49
  241. package/src/toolbars/hooks/File.js +0 -79
  242. package/src/toolbars/hooks/Formula.js +0 -69
  243. package/src/toolbars/hooks/FullScreen.js +0 -50
  244. package/src/toolbars/hooks/Graph.js +0 -263
  245. package/src/toolbars/hooks/H1.js +0 -71
  246. package/src/toolbars/hooks/H2.js +0 -71
  247. package/src/toolbars/hooks/H3.js +0 -71
  248. package/src/toolbars/hooks/Header.js +0 -118
  249. package/src/toolbars/hooks/Hr.js +0 -35
  250. package/src/toolbars/hooks/Image.js +0 -91
  251. package/src/toolbars/hooks/InlineCode.js +0 -53
  252. package/src/toolbars/hooks/Insert.js +0 -193
  253. package/src/toolbars/hooks/Italic.js +0 -72
  254. package/src/toolbars/hooks/Justify.js +0 -49
  255. package/src/toolbars/hooks/LineTable.js +0 -41
  256. package/src/toolbars/hooks/Link.js +0 -49
  257. package/src/toolbars/hooks/List.js +0 -55
  258. package/src/toolbars/hooks/MobilePreview.js +0 -44
  259. package/src/toolbars/hooks/Ol.js +0 -41
  260. package/src/toolbars/hooks/Panel.js +0 -140
  261. package/src/toolbars/hooks/Pdf.js +0 -78
  262. package/src/toolbars/hooks/Publish.js +0 -123
  263. package/src/toolbars/hooks/QuickTable.js +0 -43
  264. package/src/toolbars/hooks/Quote.js +0 -45
  265. package/src/toolbars/hooks/Redo.js +0 -33
  266. package/src/toolbars/hooks/Ruby.js +0 -59
  267. package/src/toolbars/hooks/Search.js +0 -53
  268. package/src/toolbars/hooks/Settings.js +0 -220
  269. package/src/toolbars/hooks/ShortcutKey.js +0 -62
  270. package/src/toolbars/hooks/Size.js +0 -118
  271. package/src/toolbars/hooks/Split.js +0 -37
  272. package/src/toolbars/hooks/Strikethrough.js +0 -71
  273. package/src/toolbars/hooks/Sub.js +0 -58
  274. package/src/toolbars/hooks/Sup.js +0 -58
  275. package/src/toolbars/hooks/SwitchModel.js +0 -56
  276. package/src/toolbars/hooks/Table.js +0 -56
  277. package/src/toolbars/hooks/Theme.js +0 -62
  278. package/src/toolbars/hooks/Toc.js +0 -35
  279. package/src/toolbars/hooks/TogglePreview.js +0 -91
  280. package/src/toolbars/hooks/Ul.js +0 -41
  281. package/src/toolbars/hooks/Underline.js +0 -68
  282. package/src/toolbars/hooks/Undo.js +0 -30
  283. package/src/toolbars/hooks/Video.js +0 -79
  284. package/src/toolbars/hooks/Word.js +0 -78
  285. package/src/toolbars/hooks/WordCount.js +0 -106
  286. package/src/utils/autoindent.js +0 -58
  287. package/src/utils/cm-search-replace.js +0 -794
  288. package/src/utils/code-preview-language-setting.js +0 -180
  289. package/src/utils/codeBlockContentHandler.js +0 -400
  290. package/src/utils/config.js +0 -174
  291. package/src/utils/copy.js +0 -55
  292. package/src/utils/dialog.js +0 -214
  293. package/src/utils/dom.js +0 -163
  294. package/src/utils/downloadUtil.js +0 -23
  295. package/src/utils/env.js +0 -22
  296. package/src/utils/error.js +0 -61
  297. package/src/utils/event.js +0 -38
  298. package/src/utils/export.js +0 -166
  299. package/src/utils/file.js +0 -164
  300. package/src/utils/formulaUtilsHandler.js +0 -232
  301. package/src/utils/htmlparser.js +0 -976
  302. package/src/utils/image.js +0 -99
  303. package/src/utils/imgSizeHandler.js +0 -279
  304. package/src/utils/lazyLoadImg.js +0 -327
  305. package/src/utils/lineFeed.js +0 -49
  306. package/src/utils/listContentHandler.js +0 -227
  307. package/src/utils/lookbehind-replace.js +0 -81
  308. package/src/utils/mathjax.js +0 -89
  309. package/src/utils/myersDiff.js +0 -211
  310. package/src/utils/pasteHelper.js +0 -253
  311. package/src/utils/platformTransform.js +0 -71
  312. package/src/utils/recount-pos.js +0 -59
  313. package/src/utils/regexp.js +0 -295
  314. package/src/utils/sanitize.js +0 -477
  315. package/src/utils/selection.js +0 -50
  316. package/src/utils/shortcutKey.js +0 -291
  317. package/src/utils/svgUtils.js +0 -96
  318. package/src/utils/tableContentHandler.js +0 -876
  319. package/test/core/CommonMark.spec.ts +0 -62
  320. package/test/core/hooks/AutoLink.spec.ts +0 -28
  321. package/test/core/hooks/List.spec.ts +0 -79
  322. package/test/core/hooks/__snapshots__/List.spec.ts.snap +0 -11
  323. package/test/example.md +0 -778
  324. package/test/node.js +0 -10
  325. package/test/suites/commonmark.spec.json +0 -5218
  326. package/test/tsconfig.test.json +0 -6
  327. package/test/utils/regexp.spec.ts +0 -28
@@ -1,232 +0,0 @@
1
- /**
2
- * Copyright (C) 2021 THL A29 Limited, a Tencent company.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import SyntaxBase from '@/core/SyntaxBase';
17
- import { escapeHTMLSpecialCharOnce as $e, encodeURIOnce } from '@/utils/sanitize';
18
- import { compileRegExp, EMAIL, EMAIL_INLINE, URL_INLINE_NO_SLASH, URL, URL_NO_SLASH, URL_INLINE } from '@/utils/regexp';
19
-
20
- export default class AutoLink extends SyntaxBase {
21
- static HOOK_NAME = 'autoLink';
22
-
23
- static escapePreservedSymbol = (text) => {
24
- // _ prevent conflict with emphasis
25
- // _ => 0x5f
26
- // * => 0x2a
27
- return text.replace(/_/g, '_').replace(/\*/g, '*');
28
- };
29
-
30
- constructor({ config, globalConfig }) {
31
- super({ config });
32
- this.enableShortLink = !!config.enableShortLink;
33
- this.shortLinkLength = config.shortLinkLength;
34
- // eslint-disable-next-line no-nested-ternary
35
- this.target = config.target ? `target="${config.target}"` : !!config.openNewPage ? 'target="_blank"' : '';
36
- this.rel = config.rel ? `rel="${config.rel}"` : '';
37
- }
38
-
39
- isLinkInHtmlAttribute(str, index, linkLength) {
40
- const xmlTagRegex = new RegExp(
41
- [
42
- '<', // tag start
43
- '([a-zA-Z][a-zA-Z0-9-]*)', // tagName
44
- '(', // attrs start
45
- [
46
- '\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*', // attr name
47
- '(', // attr value start
48
- [
49
- '\\s*=\\s*',
50
- '(',
51
- [
52
- '([^\\s"\'=<>`]+)', // unquoted value
53
- "('[^']*')", // single-quoted value
54
- '("[^"]*")', // double-quoted value
55
- ].join('|'), // either is ok
56
- ')',
57
- ].join(''),
58
- ')?', // attr value end
59
- ].join(''),
60
- ')*', // attrs end
61
- '\\s*[/]?>', // tag end
62
- ].join(''),
63
- 'g',
64
- );
65
- let match;
66
- while ((match = xmlTagRegex.exec(str)) !== null) {
67
- // 搜索范围超过了字符串匹配到的位置
68
- if (match.index > index + linkLength) {
69
- break;
70
- }
71
- // 正好在范围内,说明是HTML的属性,取等号是因为AutoLink的正则可能会匹配到标签的结束符号,如<img src="http://www.google.com">
72
- if (match.index < index && match.index + match[0].length >= index + linkLength) {
73
- return true;
74
- }
75
- }
76
- return false;
77
- }
78
-
79
- /**
80
- * 判断链接是否被包裹在a标签内部,如果被包裹,则不识别为自动链接
81
- * @param {string} str
82
- * @param {number} index
83
- * @param {number} linkLength
84
- */
85
- isLinkInATag(str, index, linkLength) {
86
- const aTagRegex = /<a.*>[^<]*<\/a>/g;
87
- let match;
88
- while ((match = aTagRegex.exec(str)) !== null) {
89
- // 搜索范围超过了字符串匹配到的位置
90
- if (match.index > index + linkLength) {
91
- break;
92
- }
93
- // 正好在范围内,说明是HTML的属性,取等号是因为AutoLink的正则可能会匹配到标签的结束符号
94
- // 如<a href="http://www.google.com">http://www.google.com</a>
95
- if (match.index < index && match.index + match[0].length >= index + linkLength) {
96
- return true;
97
- }
98
- }
99
- return false;
100
- }
101
-
102
- makeHtml(str, sentenceMakeFunc) {
103
- if (!(this.test(str) && (EMAIL_INLINE.test(str) || URL_INLINE_NO_SLASH.test(str)))) {
104
- return str;
105
- }
106
- return str.replace(this.RULE.reg, (match, left, protocol, address, right, index, str) => {
107
- // 数字实体字符系临时处理方法,详情参见HTMLBlock注释
108
- // maybe a html attr, skip it
109
- if (
110
- // ((left !== '<' || left !== '&#60;') && (right !== '>' || right !== '&#62;')) ||
111
- this.isLinkInHtmlAttribute(str, index, protocol.length + address.length) ||
112
- this.isLinkInATag(str, index, protocol.length + address.length)
113
- ) {
114
- return match;
115
- }
116
- const $protocol = protocol.toLowerCase();
117
- let prefix = '';
118
- let suffix = '';
119
- let isWrappedByBracket = true;
120
- // not a pair
121
- if (!((left === '<' || left === '&#60;') && (right === '>' || right === '&#62;'))) {
122
- prefix = left;
123
- suffix = right;
124
- isWrappedByBracket = false;
125
- }
126
- // not a valid address
127
- // 不被尖括号包裹,不带协议头,且不以www.开头的不识别
128
- if (address.trim() === '' || (!isWrappedByBracket && $protocol === '' && !/www\./.test(address))) {
129
- return match;
130
- }
131
- switch ($protocol) {
132
- case 'javascript:':
133
- return match;
134
- case 'mailto:': // email
135
- if (EMAIL.test(address)) {
136
- return `${prefix}<a href="${encodeURIOnce(`${$protocol}${address}`)}" ${this.target} ${this.rel}>${$e(
137
- address,
138
- )}</a>${suffix}`;
139
- }
140
- return match;
141
- case '': // 协议为空
142
- // 不被<>包裹或单边无效包裹,prefix === suffix 时都为空串
143
- if (prefix === suffix || !isWrappedByBracket) {
144
- // mailto
145
- if (EMAIL.test(address)) {
146
- return `${prefix}<a href="mailto:${encodeURIOnce(address)}" ${this.target} ${this.rel}>${$e(
147
- address,
148
- )}</a>${suffix}`;
149
- }
150
- // 不识别无协议头的URL,且开头不应该含有斜杠
151
- if (URL_NO_SLASH.test(address)) {
152
- return `${prefix}${this.renderLink(`//${address}`, address)}${suffix}`;
153
- }
154
- // 其他的属于非法情况
155
- return match;
156
- }
157
- // 被<>包裹
158
- if (isWrappedByBracket) {
159
- // mailto
160
- if (EMAIL.test(address)) {
161
- return `<a href="mailto:${encodeURIOnce(address)}" ${this.target} ${this.rel}>${$e(address)}</a>`;
162
- }
163
- // 可识别任意协议的URL,或不以斜杠开头的URL
164
- if (URL.test(address) || URL_NO_SLASH.test(address)) {
165
- return this.renderLink(address);
166
- }
167
- // 其他非法
168
- return match;
169
- }
170
- default:
171
- // 协议头不为空时的非法URL
172
- if (!URL.test(address)) {
173
- return match;
174
- }
175
- // TODO: Url Validator
176
- return `${prefix}${this.renderLink(`${$protocol}${address}`)}${suffix}`;
177
- }
178
- // this should never happen
179
- return match;
180
- });
181
- }
182
-
183
- rule() {
184
- // (?<protocol>\\w+:)\\/\\/
185
- const ret = {
186
- // ?<left>
187
- begin: '(<?)',
188
- content: [
189
- // ?<protocol>
190
- '((?:[a-z][a-z0-9+.-]{1,31}:)?)', // protocol is any seq of 2-32 chars beginning with letter
191
- // '(?<slash>(?:\\/{2})?)',
192
- // ?<address>
193
- // '([^\\s\\x00-\\x1f"<>]+)',
194
- `((?:${URL_INLINE.source})|(?:${EMAIL_INLINE.source}))`,
195
- // [
196
- // `(?<url>${ URL_INLINE.source })`,
197
- // `(?<email>${ EMAIL_INLINE.source })`, // email
198
- // ].join('|'),
199
- // ')'
200
- ].join(''),
201
- // ?<right>
202
- end: '(>?)', // TODO: extend attrs e.g. {target=_blank}
203
- };
204
- ret.reg = compileRegExp(ret, 'ig');
205
- return ret;
206
- }
207
-
208
- /**
209
- * 渲染链接为a标签,返回html
210
- * @param {string} url src链接
211
- * @param {string} [text] 展示的链接文本,不传默认使用url
212
- * @returns 渲染的a标签
213
- */
214
- renderLink(url, text) {
215
- let linkText = text;
216
- if (typeof linkText !== 'string') {
217
- if (this.enableShortLink) {
218
- const Url = url.replace(/^https?:\/\//i, '');
219
- linkText = `${Url.substring(0, this.shortLinkLength)}${Url.length > this.shortLinkLength ? '...' : ''}`;
220
- } else {
221
- linkText = url;
222
- }
223
- }
224
- const processedURL = this.$engine.urlProcessor(url, 'autolink');
225
- const safeUri = encodeURIOnce(processedURL);
226
- const displayUri = $e(linkText);
227
- const additionalAttrs = [this.target, this.rel].filter(Boolean).join(' ');
228
- return `<a href="${AutoLink.escapePreservedSymbol(safeUri)}" title="${AutoLink.escapePreservedSymbol(
229
- $e(url),
230
- )}" ${additionalAttrs}>${AutoLink.escapePreservedSymbol(displayUri)}</a>`;
231
- }
232
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * Copyright (C) 2021 THL A29 Limited, a Tencent company.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import SyntaxBase from '@/core/SyntaxBase';
17
- import { isLookbehindSupported } from '@/utils/regexp';
18
- import { replaceLookbehind } from '@/utils/lookbehind-replace';
19
-
20
- export default class BackgroundColor extends SyntaxBase {
21
- static HOOK_NAME = 'bgColor';
22
- // constructor() {
23
- // super();
24
- // }
25
-
26
- toHtml(whole, leadingChar, m1, m2) {
27
- return `${leadingChar}<span style="background-color:${m1}">${m2}</span>`;
28
- }
29
-
30
- makeHtml(str) {
31
- if (isLookbehindSupported()) {
32
- return str.replace(this.RULE.reg, this.toHtml);
33
- }
34
- return replaceLookbehind(str, this.RULE.reg, this.toHtml, true, 1);
35
- }
36
-
37
- rule() {
38
- const ret = {
39
- begin: isLookbehindSupported() ? '((?<!\\\\))!!!' : '(^|[^\\\\])!!!',
40
- end: '!!!',
41
- content: '(#[0-9a-zA-Z]{3,6}|[a-z]{3,10})[\\s]([\\w\\W]+?)',
42
- };
43
- ret.reg = new RegExp(ret.begin + ret.content + ret.end, 'g');
44
- return ret;
45
- }
46
- }
@@ -1,70 +0,0 @@
1
- /**
2
- * Copyright (C) 2021 THL A29 Limited, a Tencent company.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import ParagraphBase from '@/core/ParagraphBase';
17
- import { compileRegExp } from '@/utils/regexp';
18
-
19
- export default class Blockquote extends ParagraphBase {
20
- static HOOK_NAME = 'blockquote';
21
-
22
- constructor() {
23
- super({ needCache: true });
24
- // TODO: String.prototype.repeat polyfill
25
- }
26
-
27
- handleMatch(str, sentenceMakeFunc) {
28
- return str.replace(this.RULE.reg, (match, lines, content) => {
29
- const lineCount = this.getLineCount(match, lines); // 段落所占行数
30
- const sign = this.$engine.hash(match);
31
- const testHasCache = this.testHasCache(sign);
32
- if (testHasCache !== false) {
33
- return this.getCacheWithSpace(testHasCache, match);
34
- }
35
- let handledHtml = `<blockquote data-sign="${sign}_${lineCount}" data-lines="${lineCount}">`;
36
- const htmlDomTest = content.split(/\n</);
37
- // 如果引用内容后面有html dom结构,就认为这不是引用内容
38
- let after = '';
39
- if (htmlDomTest.length > 1) {
40
- after = `\n<${htmlDomTest.slice(1).join('\n<')}`;
41
- }
42
- const $content = htmlDomTest[0].replace(/^([ \t]*>)/gm, '');
43
- handledHtml += this.$engine.makeHtmlForBlockquote($content);
44
- // 标签闭合
45
- handledHtml += '</blockquote>';
46
- return `${this.getCacheWithSpace(this.pushCache(handledHtml, sign, lineCount), match)}${after}`;
47
- });
48
- }
49
-
50
- makeHtml(str, sentenceMakeFunc) {
51
- // return str;
52
- return this.handleMatch(str, sentenceMakeFunc);
53
- }
54
-
55
- rule() {
56
- const ret = {
57
- begin: '(?:^|\\n)(\\s*)',
58
- content: [
59
- '(',
60
- '>(?:.+?\\n(?![*+-]|\\d+[.]|[a-z]\\.))(?:>*.+?\\n(?![*+-]|\\d+[.]|[a-z]\\.))*(?:>*.+?)', // multiline
61
- '|', // or
62
- '>(?:.+?)', // single line
63
- ')',
64
- ].join(''),
65
- end: '(?=(\\n)|$)',
66
- };
67
- ret.reg = compileRegExp(ret, 'g');
68
- return ret;
69
- }
70
- }
@@ -1,85 +0,0 @@
1
- /**
2
- * Copyright (C) 2021 THL A29 Limited, a Tencent company.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import ParagraphBase from '@/core/ParagraphBase';
17
- import { isBrowser } from '@/utils/env';
18
- import { compileRegExp } from '@/utils/regexp';
19
- import { getIsClassicBrFromLocal, testKeyInLocal } from '@/utils/config';
20
-
21
- export default class Br extends ParagraphBase {
22
- static HOOK_NAME = 'br';
23
-
24
- constructor(options) {
25
- super({ needCache: true });
26
- this.classicBr = testKeyInLocal('classicBr') ? getIsClassicBrFromLocal() : options.globalConfig.classicBr;
27
- }
28
-
29
- beforeMakeHtml(str) {
30
- if (!this.test(str)) {
31
- return str;
32
- }
33
- return str.replace(this.RULE.reg, (match, lines, index) => {
34
- // 不处理全文开头的连续空行
35
- if (index === 0) {
36
- return match;
37
- }
38
- const lineCount = lines.match(/\n/g)?.length ?? 0;
39
- const sign = `br${lineCount}`;
40
- let html = '';
41
- if (isBrowser()) {
42
- // 为了同步滚动
43
- if (this.classicBr) {
44
- html = `<span data-sign="${sign}" data-type="br" data-lines="${lineCount}"></span>`;
45
- } else {
46
- html = `<p data-sign="${sign}" data-type="br" data-lines="${lineCount}">&nbsp;</p>`;
47
- }
48
- } else {
49
- // node环境下直接输出br
50
- html = this.classicBr ? '' : '<br/>';
51
- }
52
- const placeHolder = this.pushCache(html, sign, lineCount);
53
- // 结尾只补充一个\n是因为Br将下一个段落中间的所有换行都替换掉了,而两个换行符会导致下一个区块行数计算错误
54
- return `\n\n${placeHolder}\n`;
55
- });
56
- }
57
-
58
- makeHtml(str, sentenceMakeFunc) {
59
- return str;
60
- }
61
-
62
- // afterMakeHtml(str) {
63
- // return str.replace(/~~B/g, (match) => {
64
- // let lines = that.brCache.shift() - 1;
65
- // return '<p data-sign="br' + lines + '" data-type="br" data-lines="' + lines + '">&nbsp;</p>';
66
- // });
67
- // }
68
- // default: this.restoreCache();
69
-
70
- rule() {
71
- /**
72
- * 样例:
73
- * block1\n
74
- * \n
75
- * \n
76
- * block2
77
- *
78
- * 匹配逻辑:
79
- * 开头必为一个换行符,所以后续只需要匹配至少两个空行即可生成一个换行,行数即content匹配到的换行符个数
80
- */
81
- const ret = { begin: '(?:\\n)', end: '', content: '((?:\\h*\\n){2,})' };
82
- ret.reg = compileRegExp(ret, 'g', true);
83
- return ret;
84
- }
85
- }