@8btc/mditor 0.0.13 → 0.0.15

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 (267) hide show
  1. package/dist/css/content-theme/dark.css +7 -2
  2. package/dist/index.css +67 -17
  3. package/dist/index.js +438 -124
  4. package/dist/index.min.js +1 -1
  5. package/dist/js/highlight.js/styles/a11y-dark.min.css +82 -2
  6. package/dist/js/highlight.js/styles/a11y-light.min.css +80 -2
  7. package/dist/js/highlight.js/styles/agate.min.css +101 -2
  8. package/dist/js/highlight.js/styles/an-old-hope.min.css +60 -2
  9. package/dist/js/highlight.js/styles/androidstudio.min.css +57 -1
  10. package/dist/js/highlight.js/styles/arduino-light.min.css +74 -1
  11. package/dist/js/highlight.js/styles/arta.min.css +63 -1
  12. package/dist/js/highlight.js/styles/ascetic.min.css +41 -1
  13. package/dist/js/highlight.js/styles/atom-one-dark-reasonable.min.css +95 -1
  14. package/dist/js/highlight.js/styles/atom-one-dark.min.css +72 -1
  15. package/dist/js/highlight.js/styles/atom-one-light.min.css +72 -1
  16. package/dist/js/highlight.js/styles/base16/3024.min.css +97 -1
  17. package/dist/js/highlight.js/styles/base16/apathy.min.css +97 -1
  18. package/dist/js/highlight.js/styles/base16/apprentice.min.css +97 -1
  19. package/dist/js/highlight.js/styles/base16/ashes.min.css +97 -1
  20. package/dist/js/highlight.js/styles/base16/atelier-cave-light.min.css +97 -1
  21. package/dist/js/highlight.js/styles/base16/atelier-cave.min.css +97 -1
  22. package/dist/js/highlight.js/styles/base16/atelier-dune-light.min.css +97 -1
  23. package/dist/js/highlight.js/styles/base16/atelier-dune.min.css +97 -1
  24. package/dist/js/highlight.js/styles/base16/atelier-estuary-light.min.css +97 -1
  25. package/dist/js/highlight.js/styles/base16/atelier-estuary.min.css +97 -1
  26. package/dist/js/highlight.js/styles/base16/atelier-forest-light.min.css +97 -1
  27. package/dist/js/highlight.js/styles/base16/atelier-forest.min.css +97 -1
  28. package/dist/js/highlight.js/styles/base16/atelier-heath-light.min.css +97 -1
  29. package/dist/js/highlight.js/styles/base16/atelier-heath.min.css +97 -1
  30. package/dist/js/highlight.js/styles/base16/atelier-lakeside-light.min.css +97 -1
  31. package/dist/js/highlight.js/styles/base16/atelier-lakeside.min.css +97 -1
  32. package/dist/js/highlight.js/styles/base16/atelier-plateau-light.min.css +97 -1
  33. package/dist/js/highlight.js/styles/base16/atelier-plateau.min.css +97 -1
  34. package/dist/js/highlight.js/styles/base16/atelier-savanna-light.min.css +97 -1
  35. package/dist/js/highlight.js/styles/base16/atelier-savanna.min.css +97 -1
  36. package/dist/js/highlight.js/styles/base16/atelier-seaside-light.min.css +97 -1
  37. package/dist/js/highlight.js/styles/base16/atelier-seaside.min.css +97 -1
  38. package/dist/js/highlight.js/styles/base16/atelier-sulphurpool-light.min.css +97 -1
  39. package/dist/js/highlight.js/styles/base16/atelier-sulphurpool.min.css +97 -1
  40. package/dist/js/highlight.js/styles/base16/atlas.min.css +97 -1
  41. package/dist/js/highlight.js/styles/base16/bespin.min.css +97 -1
  42. package/dist/js/highlight.js/styles/base16/black-metal-bathory.min.css +97 -1
  43. package/dist/js/highlight.js/styles/base16/black-metal-burzum.min.css +97 -1
  44. package/dist/js/highlight.js/styles/base16/black-metal-dark-funeral.min.css +97 -1
  45. package/dist/js/highlight.js/styles/base16/black-metal-gorgoroth.min.css +97 -1
  46. package/dist/js/highlight.js/styles/base16/black-metal-immortal.min.css +97 -1
  47. package/dist/js/highlight.js/styles/base16/black-metal-khold.min.css +97 -1
  48. package/dist/js/highlight.js/styles/base16/black-metal-marduk.min.css +97 -1
  49. package/dist/js/highlight.js/styles/base16/black-metal-mayhem.min.css +97 -1
  50. package/dist/js/highlight.js/styles/base16/black-metal-nile.min.css +97 -1
  51. package/dist/js/highlight.js/styles/base16/black-metal-venom.min.css +97 -1
  52. package/dist/js/highlight.js/styles/base16/black-metal.min.css +97 -1
  53. package/dist/js/highlight.js/styles/base16/brewer.min.css +97 -1
  54. package/dist/js/highlight.js/styles/base16/bright.min.css +97 -1
  55. package/dist/js/highlight.js/styles/base16/brogrammer.min.css +97 -1
  56. package/dist/js/highlight.js/styles/base16/brush-trees-dark.min.css +97 -1
  57. package/dist/js/highlight.js/styles/base16/brush-trees.min.css +97 -1
  58. package/dist/js/highlight.js/styles/base16/chalk.min.css +97 -1
  59. package/dist/js/highlight.js/styles/base16/circus.min.css +97 -1
  60. package/dist/js/highlight.js/styles/base16/classic-dark.min.css +97 -1
  61. package/dist/js/highlight.js/styles/base16/classic-light.min.css +97 -1
  62. package/dist/js/highlight.js/styles/base16/codeschool.min.css +97 -1
  63. package/dist/js/highlight.js/styles/base16/colors.min.css +97 -1
  64. package/dist/js/highlight.js/styles/base16/cupcake.min.css +97 -1
  65. package/dist/js/highlight.js/styles/base16/cupertino.min.css +95 -1
  66. package/dist/js/highlight.js/styles/base16/danqing.min.css +97 -1
  67. package/dist/js/highlight.js/styles/base16/darcula.min.css +97 -1
  68. package/dist/js/highlight.js/styles/base16/dark-violet.min.css +97 -1
  69. package/dist/js/highlight.js/styles/base16/darkmoss.min.css +97 -1
  70. package/dist/js/highlight.js/styles/base16/darktooth.min.css +97 -1
  71. package/dist/js/highlight.js/styles/base16/decaf.min.css +97 -1
  72. package/dist/js/highlight.js/styles/base16/default-dark.min.css +97 -1
  73. package/dist/js/highlight.js/styles/base16/default-light.min.css +97 -1
  74. package/dist/js/highlight.js/styles/base16/dirtysea.min.css +97 -1
  75. package/dist/js/highlight.js/styles/base16/dracula.min.css +97 -1
  76. package/dist/js/highlight.js/styles/base16/edge-dark.min.css +95 -1
  77. package/dist/js/highlight.js/styles/base16/edge-light.min.css +95 -1
  78. package/dist/js/highlight.js/styles/base16/eighties.min.css +97 -1
  79. package/dist/js/highlight.js/styles/base16/embers.min.css +97 -1
  80. package/dist/js/highlight.js/styles/base16/equilibrium-dark.min.css +97 -1
  81. package/dist/js/highlight.js/styles/base16/equilibrium-gray-dark.min.css +97 -1
  82. package/dist/js/highlight.js/styles/base16/equilibrium-gray-light.min.css +97 -1
  83. package/dist/js/highlight.js/styles/base16/equilibrium-light.min.css +97 -1
  84. package/dist/js/highlight.js/styles/base16/espresso.min.css +97 -1
  85. package/dist/js/highlight.js/styles/base16/eva-dim.min.css +97 -1
  86. package/dist/js/highlight.js/styles/base16/eva.min.css +97 -1
  87. package/dist/js/highlight.js/styles/base16/flat.min.css +97 -1
  88. package/dist/js/highlight.js/styles/base16/framer.min.css +97 -1
  89. package/dist/js/highlight.js/styles/base16/fruit-soda.min.css +97 -1
  90. package/dist/js/highlight.js/styles/base16/gigavolt.min.css +97 -1
  91. package/dist/js/highlight.js/styles/base16/github.min.css +95 -1
  92. package/dist/js/highlight.js/styles/base16/google-dark.min.css +95 -1
  93. package/dist/js/highlight.js/styles/base16/google-light.min.css +95 -1
  94. package/dist/js/highlight.js/styles/base16/grayscale-dark.min.css +97 -1
  95. package/dist/js/highlight.js/styles/base16/grayscale-light.min.css +97 -1
  96. package/dist/js/highlight.js/styles/base16/green-screen.min.css +97 -1
  97. package/dist/js/highlight.js/styles/base16/gruvbox-dark-hard.min.css +97 -1
  98. package/dist/js/highlight.js/styles/base16/gruvbox-dark-medium.min.css +97 -1
  99. package/dist/js/highlight.js/styles/base16/gruvbox-dark-pale.min.css +97 -1
  100. package/dist/js/highlight.js/styles/base16/gruvbox-dark-soft.min.css +97 -1
  101. package/dist/js/highlight.js/styles/base16/gruvbox-light-hard.min.css +97 -1
  102. package/dist/js/highlight.js/styles/base16/gruvbox-light-medium.min.css +97 -1
  103. package/dist/js/highlight.js/styles/base16/gruvbox-light-soft.min.css +97 -1
  104. package/dist/js/highlight.js/styles/base16/hardcore.min.css +97 -1
  105. package/dist/js/highlight.js/styles/base16/harmonic16-dark.min.css +97 -1
  106. package/dist/js/highlight.js/styles/base16/harmonic16-light.min.css +97 -1
  107. package/dist/js/highlight.js/styles/base16/heetch-dark.min.css +97 -1
  108. package/dist/js/highlight.js/styles/base16/heetch-light.min.css +97 -1
  109. package/dist/js/highlight.js/styles/base16/helios.min.css +97 -1
  110. package/dist/js/highlight.js/styles/base16/hopscotch.min.css +97 -1
  111. package/dist/js/highlight.js/styles/base16/horizon-dark.min.css +97 -1
  112. package/dist/js/highlight.js/styles/base16/horizon-light.min.css +97 -1
  113. package/dist/js/highlight.js/styles/base16/humanoid-dark.min.css +97 -1
  114. package/dist/js/highlight.js/styles/base16/humanoid-light.min.css +97 -1
  115. package/dist/js/highlight.js/styles/base16/ia-dark.min.css +97 -1
  116. package/dist/js/highlight.js/styles/base16/ia-light.min.css +97 -1
  117. package/dist/js/highlight.js/styles/base16/icy-dark.min.css +97 -1
  118. package/dist/js/highlight.js/styles/base16/ir-black.min.css +97 -1
  119. package/dist/js/highlight.js/styles/base16/isotope.min.css +97 -1
  120. package/dist/js/highlight.js/styles/base16/kimber.min.css +97 -1
  121. package/dist/js/highlight.js/styles/base16/london-tube.min.css +97 -1
  122. package/dist/js/highlight.js/styles/base16/macintosh.min.css +95 -1
  123. package/dist/js/highlight.js/styles/base16/marrakesh.min.css +97 -1
  124. package/dist/js/highlight.js/styles/base16/materia.min.css +97 -1
  125. package/dist/js/highlight.js/styles/base16/material-darker.min.css +97 -1
  126. package/dist/js/highlight.js/styles/base16/material-lighter.min.css +97 -1
  127. package/dist/js/highlight.js/styles/base16/material-palenight.min.css +97 -1
  128. package/dist/js/highlight.js/styles/base16/material-vivid.min.css +97 -1
  129. package/dist/js/highlight.js/styles/base16/material.min.css +97 -1
  130. package/dist/js/highlight.js/styles/base16/mellow-purple.min.css +97 -1
  131. package/dist/js/highlight.js/styles/base16/mexico-light.min.css +97 -1
  132. package/dist/js/highlight.js/styles/base16/mocha.min.css +97 -1
  133. package/dist/js/highlight.js/styles/base16/monokai.min.css +97 -1
  134. package/dist/js/highlight.js/styles/base16/nebula.min.css +97 -1
  135. package/dist/js/highlight.js/styles/base16/nord.min.css +97 -1
  136. package/dist/js/highlight.js/styles/base16/nova.min.css +95 -1
  137. package/dist/js/highlight.js/styles/base16/ocean.min.css +97 -1
  138. package/dist/js/highlight.js/styles/base16/oceanicnext.min.css +97 -1
  139. package/dist/js/highlight.js/styles/base16/one-light.min.css +97 -1
  140. package/dist/js/highlight.js/styles/base16/onedark.min.css +97 -1
  141. package/dist/js/highlight.js/styles/base16/outrun-dark.min.css +97 -1
  142. package/dist/js/highlight.js/styles/base16/papercolor-dark.min.css +97 -1
  143. package/dist/js/highlight.js/styles/base16/papercolor-light.min.css +95 -1
  144. package/dist/js/highlight.js/styles/base16/paraiso.min.css +97 -1
  145. package/dist/js/highlight.js/styles/base16/pasque.min.css +97 -1
  146. package/dist/js/highlight.js/styles/base16/phd.min.css +97 -1
  147. package/dist/js/highlight.js/styles/base16/pico.min.css +97 -1
  148. package/dist/js/highlight.js/styles/base16/pop.min.css +97 -1
  149. package/dist/js/highlight.js/styles/base16/porple.min.css +97 -1
  150. package/dist/js/highlight.js/styles/base16/qualia.min.css +97 -1
  151. package/dist/js/highlight.js/styles/base16/railscasts.min.css +97 -1
  152. package/dist/js/highlight.js/styles/base16/rebecca.min.css +97 -1
  153. package/dist/js/highlight.js/styles/base16/ros-pine-dawn.min.css +97 -1
  154. package/dist/js/highlight.js/styles/base16/ros-pine-moon.min.css +97 -1
  155. package/dist/js/highlight.js/styles/base16/ros-pine.min.css +97 -1
  156. package/dist/js/highlight.js/styles/base16/sagelight.min.css +97 -1
  157. package/dist/js/highlight.js/styles/base16/sandcastle.min.css +93 -1
  158. package/dist/js/highlight.js/styles/base16/seti-ui.min.css +97 -1
  159. package/dist/js/highlight.js/styles/base16/shapeshifter.min.css +97 -1
  160. package/dist/js/highlight.js/styles/base16/silk-dark.min.css +97 -1
  161. package/dist/js/highlight.js/styles/base16/silk-light.min.css +97 -1
  162. package/dist/js/highlight.js/styles/base16/snazzy.min.css +97 -1
  163. package/dist/js/highlight.js/styles/base16/solar-flare-light.min.css +97 -1
  164. package/dist/js/highlight.js/styles/base16/solar-flare.min.css +97 -1
  165. package/dist/js/highlight.js/styles/base16/solarized-dark.min.css +97 -1
  166. package/dist/js/highlight.js/styles/base16/solarized-light.min.css +97 -1
  167. package/dist/js/highlight.js/styles/base16/spacemacs.min.css +97 -1
  168. package/dist/js/highlight.js/styles/base16/summercamp.min.css +97 -1
  169. package/dist/js/highlight.js/styles/base16/summerfruit-dark.min.css +97 -1
  170. package/dist/js/highlight.js/styles/base16/summerfruit-light.min.css +97 -1
  171. package/dist/js/highlight.js/styles/base16/synth-midnight-terminal-dark.min.css +97 -1
  172. package/dist/js/highlight.js/styles/base16/synth-midnight-terminal-light.min.css +97 -1
  173. package/dist/js/highlight.js/styles/base16/tango.min.css +97 -1
  174. package/dist/js/highlight.js/styles/base16/tender.min.css +97 -1
  175. package/dist/js/highlight.js/styles/base16/tomorrow-night.min.css +97 -1
  176. package/dist/js/highlight.js/styles/base16/tomorrow.min.css +97 -1
  177. package/dist/js/highlight.js/styles/base16/twilight.min.css +97 -1
  178. package/dist/js/highlight.js/styles/base16/unikitty-dark.min.css +97 -1
  179. package/dist/js/highlight.js/styles/base16/unikitty-light.min.css +97 -1
  180. package/dist/js/highlight.js/styles/base16/vulcan.min.css +93 -1
  181. package/dist/js/highlight.js/styles/base16/windows-10-light.min.css +97 -1
  182. package/dist/js/highlight.js/styles/base16/windows-10.min.css +97 -1
  183. package/dist/js/highlight.js/styles/base16/windows-95-light.min.css +97 -1
  184. package/dist/js/highlight.js/styles/base16/windows-95.min.css +97 -1
  185. package/dist/js/highlight.js/styles/base16/windows-high-contrast-light.min.css +97 -1
  186. package/dist/js/highlight.js/styles/base16/windows-high-contrast.min.css +97 -1
  187. package/dist/js/highlight.js/styles/base16/windows-nt-light.min.css +97 -1
  188. package/dist/js/highlight.js/styles/base16/windows-nt.min.css +97 -1
  189. package/dist/js/highlight.js/styles/base16/woodland.min.css +97 -1
  190. package/dist/js/highlight.js/styles/base16/xcode-dusk.min.css +97 -1
  191. package/dist/js/highlight.js/styles/base16/zenburn.min.css +97 -1
  192. package/dist/js/highlight.js/styles/brown-paper.min.css +54 -1
  193. package/dist/js/highlight.js/styles/codepen-embed.min.css +53 -1
  194. package/dist/js/highlight.js/styles/color-brewer.min.css +56 -1
  195. package/dist/js/highlight.js/styles/dark.min.css +54 -1
  196. package/dist/js/highlight.js/styles/default.min.css +79 -1
  197. package/dist/js/highlight.js/styles/devibeans.min.css +80 -2
  198. package/dist/js/highlight.js/styles/docco.min.css +81 -1
  199. package/dist/js/highlight.js/styles/far.min.css +59 -1
  200. package/dist/js/highlight.js/styles/felipec.min.css +89 -2
  201. package/dist/js/highlight.js/styles/foundation.min.css +74 -1
  202. package/dist/js/highlight.js/styles/github-dark-dimmed.min.css +87 -2
  203. package/dist/js/highlight.js/styles/github-dark.min.css +87 -2
  204. package/dist/js/highlight.js/styles/github.min.css +87 -2
  205. package/dist/js/highlight.js/styles/gml.min.css +68 -1
  206. package/dist/js/highlight.js/styles/googlecode.min.css +75 -1
  207. package/dist/js/highlight.js/styles/gradient-dark.min.css +92 -1
  208. package/dist/js/highlight.js/styles/gradient-light.min.css +94 -1
  209. package/dist/js/highlight.js/styles/grayscale.min.css +85 -1
  210. package/dist/js/highlight.js/styles/hybrid.min.css +75 -1
  211. package/dist/js/highlight.js/styles/idea.min.css +82 -1
  212. package/dist/js/highlight.js/styles/intellij-light.min.css +91 -1
  213. package/dist/js/highlight.js/styles/ir-black.min.css +64 -1
  214. package/dist/js/highlight.js/styles/isbl-editor-dark.min.css +84 -1
  215. package/dist/js/highlight.js/styles/isbl-editor-light.min.css +84 -1
  216. package/dist/js/highlight.js/styles/kimbie-dark.min.css +58 -1
  217. package/dist/js/highlight.js/styles/kimbie-light.min.css +58 -1
  218. package/dist/js/highlight.js/styles/lightfair.min.css +73 -1
  219. package/dist/js/highlight.js/styles/lioshi.min.css +65 -1
  220. package/dist/js/highlight.js/styles/magula.min.css +59 -1
  221. package/dist/js/highlight.js/styles/mono-blue.min.css +54 -1
  222. package/dist/js/highlight.js/styles/monokai-sublime.min.css +72 -1
  223. package/dist/js/highlight.js/styles/monokai.min.css +66 -1
  224. package/dist/js/highlight.js/styles/night-owl.min.css +136 -1
  225. package/dist/js/highlight.js/styles/nnfx-dark.min.css +96 -2
  226. package/dist/js/highlight.js/styles/nnfx-light.min.css +96 -2
  227. package/dist/js/highlight.js/styles/nord.min.css +205 -1
  228. package/dist/js/highlight.js/styles/obsidian.min.css +76 -1
  229. package/dist/js/highlight.js/styles/panda-syntax-dark.min.css +88 -1
  230. package/dist/js/highlight.js/styles/panda-syntax-light.min.css +85 -1
  231. package/dist/js/highlight.js/styles/paraiso-dark.min.css +57 -1
  232. package/dist/js/highlight.js/styles/paraiso-light.min.css +57 -1
  233. package/dist/js/highlight.js/styles/pojoaque.min.css +70 -1
  234. package/dist/js/highlight.js/styles/purebasic.min.css +66 -1
  235. package/dist/js/highlight.js/styles/qtcreator-dark.min.css +71 -1
  236. package/dist/js/highlight.js/styles/qtcreator-light.min.css +69 -1
  237. package/dist/js/highlight.js/styles/rainbow.min.css +73 -1
  238. package/dist/js/highlight.js/styles/routeros.min.css +77 -1
  239. package/dist/js/highlight.js/styles/school-book.min.css +57 -1
  240. package/dist/js/highlight.js/styles/shades-of-purple.min.css +76 -1
  241. package/dist/js/highlight.js/styles/srcery.min.css +70 -1
  242. package/dist/js/highlight.js/styles/stackoverflow-dark.min.css +79 -2
  243. package/dist/js/highlight.js/styles/stackoverflow-light.min.css +79 -2
  244. package/dist/js/highlight.js/styles/sunburst.min.css +85 -1
  245. package/dist/js/highlight.js/styles/tokyo-night-dark.min.css +83 -2
  246. package/dist/js/highlight.js/styles/tokyo-night-light.min.css +83 -2
  247. package/dist/js/highlight.js/styles/tomorrow-night-blue.min.css +59 -1
  248. package/dist/js/highlight.js/styles/tomorrow-night-bright.min.css +59 -1
  249. package/dist/js/highlight.js/styles/vs.min.css +59 -1
  250. package/dist/js/highlight.js/styles/vs2015.min.css +94 -1
  251. package/dist/js/highlight.js/styles/xcode.min.css +85 -1
  252. package/dist/js/highlight.js/styles/xt256.min.css +74 -1
  253. package/dist/js/icons/material.js +8 -4
  254. package/dist/method.d.ts +4 -1
  255. package/dist/method.js +430 -121
  256. package/dist/method.min.js +1 -1
  257. package/dist/ts/markdown/codeRender.d.ts +9 -1
  258. package/dist/ts/util/attachLineNumbers.d.ts +6 -5
  259. package/dist/types/index.d.ts +8 -1
  260. package/package.json +2 -2
  261. package/src/assets/less/_line-number.less +24 -13
  262. package/src/assets/less/_reset.less +13 -7
  263. package/src/ts/markdown/codeRender.ts +152 -58
  264. package/src/ts/markdown/previewRender.ts +69 -25
  265. package/src/ts/util/attachLineNumbers.ts +382 -98
  266. package/src/ts/util/editorCommonEvent.ts +15 -8
  267. package/src/ts/wysiwyg/index.ts +6 -3
@@ -214,6 +214,7 @@
214
214
 
215
215
  pre {
216
216
  margin: 1em 0;
217
+ position: relative;
217
218
 
218
219
  & > code {
219
220
  margin: 0;
@@ -230,8 +231,13 @@
230
231
  word-wrap: normal;
231
232
  }
232
233
 
233
- &:hover div.vditor-copy {
234
- display: block;
234
+ div.vditor-copy {
235
+ display: inline-flex;
236
+ position: absolute;
237
+ right: 0.94rem;
238
+ top: 0.5em;
239
+ align-items: center;
240
+ gap: var(--vditor-copy-gap, 0.5rem);
235
241
  }
236
242
  }
237
243
 
@@ -341,9 +347,11 @@
341
347
  }
342
348
 
343
349
  &-copy {
344
- position: relative;
350
+ position: absolute;
345
351
  display: none;
346
352
  z-index: 1;
353
+ right: 0.94rem;
354
+ top: 0.5em;
347
355
 
348
356
  textarea {
349
357
  position: absolute;
@@ -351,11 +359,9 @@
351
359
  height: 0.63rem;
352
360
  }
353
361
 
354
- span {
362
+ &__item {
355
363
  cursor: pointer;
356
- position: absolute;
357
- right: 0.94rem;
358
- top: 0.5em;
364
+ position: static;
359
365
  }
360
366
 
361
367
  svg {
@@ -1,60 +1,154 @@
1
- import {code160to32} from "../util/code160to32";
2
- import {Constants} from "../constants";
3
-
4
- export const codeRender = (element: HTMLElement, option?: IHljs) => {
5
- Array.from<HTMLElement>(element.querySelectorAll("pre > code")).filter((e, index) => {
6
- if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
7
- e.parentElement.classList.contains("vditor-ir__marker--pre")) {
8
- return false;
9
- }
10
- if (e.classList.contains("language-mermaid") || e.classList.contains("language-flowchart") ||
11
- e.classList.contains("language-echarts") || e.classList.contains("language-mindmap") ||
12
- e.classList.contains("language-plantuml") || e.classList.contains("language-markmap") ||
13
- e.classList.contains("language-abc") || e.classList.contains("language-graphviz") ||
14
- e.classList.contains("language-math") || e.classList.contains("language-smiles")) {
15
- return false;
16
- }
17
-
18
- if (e.style.maxHeight.indexOf("px") > -1) {
19
- return false;
20
- }
21
-
22
- // 避免预览区在渲染后由于代码块过多产生性能问题 https://github.com/b3log/vditor/issues/67
23
- if (element.classList.contains("vditor-preview") && index > 5) {
24
- return false;
25
- }
26
- return true;
27
- }).forEach((e) => {
28
- let codeText = e.innerText;
29
- if (e.classList.contains("highlight-chroma")) {
30
- const codeElement = e.cloneNode(true) as HTMLElement;
31
- codeElement.querySelectorAll(".highlight-ln").forEach((item: HTMLElement) => {
32
- item.remove();
1
+ import { code160to32 } from "../util/code160to32";
2
+ import { Constants } from "../constants";
3
+
4
+ /**
5
+ * 为预览区域中的代码块添加辅助操作:
6
+ * - 复制按钮:一键复制代码文本
7
+ * - 运行按钮:当启用 runCode 时,向外部回调当前代码块的 HTML 字符串
8
+ */
9
+ export const codeRender = (
10
+ element: HTMLElement,
11
+ option?: IHljs,
12
+ runCode?: {
13
+ enable?: boolean;
14
+ items?: string[];
15
+ callback?(payload: { code: string; lang: string }): void;
16
+ }
17
+ ) => {
18
+ Array.from<HTMLElement>(element.querySelectorAll("pre > code"))
19
+ .filter((e, index) => {
20
+ if (
21
+ e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
22
+ e.parentElement.classList.contains("vditor-ir__marker--pre")
23
+ ) {
24
+ return false;
25
+ }
26
+ if (
27
+ e.classList.contains("language-mermaid") ||
28
+ e.classList.contains("language-flowchart") ||
29
+ e.classList.contains("language-echarts") ||
30
+ e.classList.contains("language-mindmap") ||
31
+ e.classList.contains("language-plantuml") ||
32
+ e.classList.contains("language-markmap") ||
33
+ e.classList.contains("language-abc") ||
34
+ e.classList.contains("language-graphviz") ||
35
+ e.classList.contains("language-math") ||
36
+ e.classList.contains("language-smiles")
37
+ ) {
38
+ return false;
39
+ }
40
+
41
+ if (e.style.maxHeight.indexOf("px") > -1) {
42
+ return false;
43
+ }
44
+
45
+ // 避免预览区在渲染后由于代码块过多产生性能问题 https://github.com/b3log/vditor/issues/67
46
+ if (element.classList.contains("vditor-preview") && index > 5) {
47
+ return false;
48
+ }
49
+ return true;
50
+ })
51
+ .forEach((e) => {
52
+ let codeText = e.innerText;
53
+ if (e.classList.contains("highlight-chroma")) {
54
+ const codeElement = e.cloneNode(true) as HTMLElement;
55
+ codeElement
56
+ .querySelectorAll(".highlight-ln")
57
+ .forEach((item: HTMLElement) => {
58
+ item.remove();
59
+ });
60
+ codeText = codeElement.innerText;
61
+ } else if (codeText.endsWith("\n")) {
62
+ codeText = codeText.substr(0, codeText.length - 1);
63
+ }
64
+ let iconHTML =
65
+ '<svg><use xlink:href="#vditor-icon-copy"></use></svg>';
66
+ if (!document.getElementById("vditorIconScript")) {
67
+ iconHTML =
68
+ '<svg viewBox="0 0 32 32"><path d="M22.545-0h-17.455c-1.6 0-2.909 1.309-2.909 2.909v20.364h2.909v-20.364h17.455v-2.909zM26.909 5.818h-16c-1.6 0-2.909 1.309-2.909 2.909v20.364c0 1.6 1.309 2.909 2.909 2.909h16c1.6 0 2.909-1.309 2.909-2.909v-20.364c0-1.6-1.309-2.909-2.909-2.909zM26.909 29.091h-16v-20.364h16v20.364z"></path></svg>';
69
+ }
70
+ const playIconHTML = document.getElementById("vditorIconScript")
71
+ ? '<svg><use xlink:href="#vditor-icon-run"></use></svg>'
72
+ : '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-play-icon lucide-circle-play"><path d="M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z"/><circle cx="12" cy="12" r="10"/></svg>';
73
+
74
+ const divElement = document.createElement("div");
75
+ divElement.className = "vditor-copy";
76
+
77
+ const textarea = document.createElement("textarea");
78
+ textarea.value = code160to32(codeText);
79
+ divElement.appendChild(textarea);
80
+
81
+ const langMatch = e.className.match(/language-([^\s]+)/);
82
+ const lang = langMatch ? langMatch[1] : "";
83
+ const allowRun =
84
+ !!runCode?.enable &&
85
+ (!runCode.items || (lang && runCode.items.includes(lang)));
86
+
87
+ if (allowRun) {
88
+ const runSpan = document.createElement("span");
89
+ runSpan.setAttribute(
90
+ "aria-label",
91
+ (window.VditorI18n as any)?.run || "运行"
92
+ );
93
+ runSpan.setAttribute(
94
+ "onmouseover",
95
+ `this.setAttribute('aria-label', '${
96
+ (window.VditorI18n as any)?.run || "运行"
97
+ }')`
98
+ );
99
+ runSpan.className =
100
+ "vditor-copy__item vditor-tooltipped vditor-tooltipped__w";
101
+ runSpan.innerHTML = playIconHTML;
102
+ runSpan.addEventListener("click", (evt) => {
103
+ evt.stopPropagation();
104
+ runCode?.callback?.({
105
+ code: code160to32(codeText),
106
+ lang,
107
+ });
108
+ });
109
+ divElement.appendChild(runSpan);
110
+ }
111
+
112
+ const copySpan = document.createElement("span");
113
+ copySpan.setAttribute(
114
+ "aria-label",
115
+ window.VditorI18n?.copy || "复制"
116
+ );
117
+ copySpan.setAttribute(
118
+ "onmouseover",
119
+ `this.setAttribute('aria-label', '${
120
+ window.VditorI18n?.copy || "复制"
121
+ }')`
122
+ );
123
+ copySpan.className =
124
+ "vditor-copy__item vditor-tooltipped vditor-tooltipped__w";
125
+ copySpan.addEventListener("click", (evt) => {
126
+ evt.stopPropagation();
127
+ const ta = divElement.querySelector(
128
+ "textarea"
129
+ ) as HTMLTextAreaElement;
130
+ if (ta) {
131
+ ta.select();
132
+ document.execCommand("copy");
133
+ copySpan.setAttribute(
134
+ "aria-label",
135
+ window.VditorI18n?.copied || "已复制"
136
+ );
137
+ ta.blur();
138
+ }
33
139
  });
34
- codeText = codeElement.innerText;
35
- } else if (codeText.endsWith("\n")) {
36
- codeText = codeText.substr(0, codeText.length - 1)
37
- }
38
- let iconHTML = '<svg><use xlink:href="#vditor-icon-copy"></use></svg>';
39
- if (!document.getElementById("vditorIconScript")) {
40
- iconHTML = '<svg viewBox="0 0 32 32"><path d="M22.545-0h-17.455c-1.6 0-2.909 1.309-2.909 2.909v20.364h2.909v-20.364h17.455v-2.909zM26.909 5.818h-16c-1.6 0-2.909 1.309-2.909 2.909v20.364c0 1.6 1.309 2.909 2.909 2.909h16c1.6 0 2.909-1.309 2.909-2.909v-20.364c0-1.6-1.309-2.909-2.909-2.909zM26.909 29.091h-16v-20.364h16v20.364z"></path></svg>';
41
- }
42
-
43
- const divElement = document.createElement("div");
44
- divElement.className = "vditor-copy";
45
- divElement.innerHTML = `<span aria-label="${window.VditorI18n?.copy || "复制"}"
46
- onmouseover="this.setAttribute('aria-label', '${window.VditorI18n?.copy || "复制"}')"
47
- class="vditor-tooltipped vditor-tooltipped__w"
48
- onclick="event.stopPropagation();this.previousElementSibling.select();document.execCommand('copy');this.setAttribute('aria-label', '${window.VditorI18n?.copied || "已复制"}');this.previousElementSibling.blur()">${iconHTML}</span>`;
49
- const textarea = document.createElement("textarea");
50
- textarea.value = code160to32(codeText);
51
- divElement.insertAdjacentElement("afterbegin", textarea);
52
- if (option && option.renderMenu) {
53
- option.renderMenu(e, divElement);
54
- }
55
- e.before(divElement);
56
- e.style.maxHeight = (window.outerHeight - 40) + "px";
57
- // https://github.com/Vanessa219/vditor/issues/1356
58
- e.insertAdjacentHTML("afterend", `<span style="position: absolute">${Constants.ZWSP}</span>`)
59
- });
140
+ copySpan.innerHTML = iconHTML;
141
+ divElement.appendChild(copySpan);
142
+
143
+ if (option && option.renderMenu) {
144
+ option.renderMenu(e, divElement);
145
+ }
146
+ e.before(divElement);
147
+ e.style.maxHeight = 300 + "px";
148
+ // https://github.com/Vanessa219/vditor/issues/1356
149
+ e.insertAdjacentHTML(
150
+ "afterend",
151
+ `<span style="position: absolute">${Constants.ZWSP}</span>`
152
+ );
153
+ });
60
154
  };
@@ -1,7 +1,10 @@
1
1
  import { Constants } from "../constants";
2
2
  import { setContentTheme } from "../ui/setContentTheme";
3
3
  import { addScript } from "../util/addScript";
4
- import { hasClosestByClassName, hasClosestByMatchTag } from "../util/hasClosest";
4
+ import {
5
+ hasClosestByClassName,
6
+ hasClosestByMatchTag,
7
+ } from "../util/hasClosest";
5
8
  import { merge } from "../util/merge";
6
9
  import { abcRender } from "./abcRender";
7
10
  import { anchorRender } from "./anchorRender";
@@ -37,16 +40,19 @@ const mergeOptions = (options?: IPreviewOptions) => {
37
40
  speech: {
38
41
  enable: false,
39
42
  },
43
+ runCode: {
44
+ enable: false,
45
+ },
40
46
  render: {
41
47
  media: {
42
48
  enable: true,
43
- }
49
+ },
44
50
  },
45
51
  theme: Constants.THEME_OPTIONS,
46
52
  };
47
53
  if (options.cdn) {
48
54
  if (!options.theme?.path) {
49
- defaultOption.theme.path = `${options.cdn}/dist/css/content-theme`
55
+ defaultOption.theme.path = `${options.cdn}/dist/css/content-theme`;
50
56
  }
51
57
  if (!options.emojiPath) {
52
58
  defaultOption.emojiPath = `${options.cdn}/dist/images/emoji`;
@@ -57,7 +63,10 @@ const mergeOptions = (options?: IPreviewOptions) => {
57
63
 
58
64
  export const md2html = (mdText: string, options?: IPreviewOptions) => {
59
65
  const mergedOptions = mergeOptions(options);
60
- return addScript(`${mergedOptions.cdn}/dist/js/lute/lute.min.js`, "vditorLuteScript").then(() => {
66
+ return addScript(
67
+ `${mergedOptions.cdn}/dist/js/lute/lute.min.js`,
68
+ "vditorLuteScript"
69
+ ).then(() => {
61
70
  const lute = setLute({
62
71
  autoSpace: mergedOptions.markdown.autoSpace,
63
72
  gfmAutoLink: mergedOptions.markdown.gfmAutoLink,
@@ -74,7 +83,8 @@ export const md2html = (mdText: string, options?: IPreviewOptions) => {
74
83
  listStyle: mergedOptions.markdown.listStyle,
75
84
  mark: mergedOptions.markdown.mark,
76
85
  mathBlockPreview: mergedOptions.markdown.mathBlockPreview,
77
- paragraphBeginningSpace: mergedOptions.markdown.paragraphBeginningSpace,
86
+ paragraphBeginningSpace:
87
+ mergedOptions.markdown.paragraphBeginningSpace,
78
88
  sanitize: mergedOptions.markdown.sanitize,
79
89
  sub: mergedOptions.markdown.sub,
80
90
  sup: mergedOptions.markdown.sup,
@@ -92,7 +102,11 @@ export const md2html = (mdText: string, options?: IPreviewOptions) => {
92
102
  });
93
103
  };
94
104
 
95
- export const previewRender = async (previewElement: HTMLDivElement, markdown: string, options?: IPreviewOptions) => {
105
+ export const previewRender = async (
106
+ previewElement: HTMLDivElement,
107
+ markdown: string,
108
+ options?: IPreviewOptions
109
+ ) => {
96
110
  const mergedOptions: IPreviewOptions = mergeOptions(options);
97
111
  let html = await md2html(markdown, mergedOptions);
98
112
  if (mergedOptions.transform) {
@@ -102,33 +116,56 @@ export const previewRender = async (previewElement: HTMLDivElement, markdown: st
102
116
  previewElement.classList.add("vditor-reset");
103
117
 
104
118
  if (!mergedOptions.i18n) {
105
- if (!["de_DE", "en_US", "es_ES", "fr_FR", "ja_JP", "ko_KR", "pt_BR", "ru_RU", "sv_SE", "vi_VN", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) {
119
+ if (
120
+ ![
121
+ "de_DE",
122
+ "en_US",
123
+ "es_ES",
124
+ "fr_FR",
125
+ "ja_JP",
126
+ "ko_KR",
127
+ "pt_BR",
128
+ "ru_RU",
129
+ "sv_SE",
130
+ "vi_VN",
131
+ "zh_CN",
132
+ "zh_TW",
133
+ ].includes(mergedOptions.lang)
134
+ ) {
106
135
  throw new Error(
107
- "options.lang error, see https://ld246.com/article/1549638745630#options",
136
+ "options.lang error, see https://ld246.com/article/1549638745630#options"
108
137
  );
109
138
  } else {
110
139
  const i18nScriptPrefix = "vditorI18nScript";
111
140
  const i18nScriptID = i18nScriptPrefix + mergedOptions.lang;
112
- document.querySelectorAll(`head script[id^="${i18nScriptPrefix}"]`).forEach((el) => {
113
- if (el.id !== i18nScriptID) {
114
- document.head.removeChild(el);
115
- }
116
- });
117
- await addScript(`${mergedOptions.cdn}/dist/js/i18n/${mergedOptions.lang}.js`, i18nScriptID);
141
+ document
142
+ .querySelectorAll(`head script[id^="${i18nScriptPrefix}"]`)
143
+ .forEach((el) => {
144
+ if (el.id !== i18nScriptID) {
145
+ document.head.removeChild(el);
146
+ }
147
+ });
148
+ await addScript(
149
+ `${mergedOptions.cdn}/dist/js/i18n/${mergedOptions.lang}.js`,
150
+ i18nScriptID
151
+ );
118
152
  }
119
153
  } else {
120
154
  window.VditorI18n = mergedOptions.i18n;
121
155
  }
122
156
 
123
157
  if (mergedOptions.icon) {
124
- await addScript(`${mergedOptions.cdn}/dist/js/icons/${mergedOptions.icon}.js`, "vditorIconScript");
158
+ await addScript(
159
+ `${mergedOptions.cdn}/dist/js/icons/${mergedOptions.icon}.js`,
160
+ "vditorIconScript"
161
+ );
125
162
  }
126
163
 
127
164
  setContentTheme(mergedOptions.theme.current, mergedOptions.theme.path);
128
165
  if (mergedOptions.anchor === 1) {
129
166
  previewElement.classList.add("vditor-reset--anchor");
130
167
  }
131
- codeRender(previewElement, mergedOptions.hljs);
168
+ codeRender(previewElement, mergedOptions.hljs, mergedOptions.runCode);
132
169
  highlightRender(mergedOptions.hljs, previewElement, mergedOptions.cdn);
133
170
  mathRender(previewElement, {
134
171
  cdn: mergedOptions.cdn,
@@ -159,15 +196,22 @@ export const previewRender = async (previewElement: HTMLDivElement, markdown: st
159
196
  if (mergedOptions.lazyLoadImage) {
160
197
  lazyLoadImageRender(previewElement);
161
198
  }
162
- previewElement.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => {
163
- const spanElement = hasClosestByMatchTag(event.target, "SPAN");
164
- if (spanElement && hasClosestByClassName(spanElement, "vditor-toc")) {
165
- const headingElement =
166
- previewElement.querySelector("#" + spanElement.getAttribute("data-target-id")) as HTMLElement;
167
- if (headingElement) {
168
- window.scrollTo(window.scrollX, headingElement.offsetTop);
199
+ previewElement.addEventListener(
200
+ "click",
201
+ (event: MouseEvent & { target: HTMLElement }) => {
202
+ const spanElement = hasClosestByMatchTag(event.target, "SPAN");
203
+ if (
204
+ spanElement &&
205
+ hasClosestByClassName(spanElement, "vditor-toc")
206
+ ) {
207
+ const headingElement = previewElement.querySelector(
208
+ "#" + spanElement.getAttribute("data-target-id")
209
+ ) as HTMLElement;
210
+ if (headingElement) {
211
+ window.scrollTo(window.scrollX, headingElement.offsetTop);
212
+ }
213
+ return;
169
214
  }
170
- return;
171
215
  }
172
- });
216
+ );
173
217
  };