@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.
- package/dist/css/content-theme/dark.css +7 -2
- package/dist/index.css +67 -17
- package/dist/index.js +438 -124
- package/dist/index.min.js +1 -1
- package/dist/js/highlight.js/styles/a11y-dark.min.css +82 -2
- package/dist/js/highlight.js/styles/a11y-light.min.css +80 -2
- package/dist/js/highlight.js/styles/agate.min.css +101 -2
- package/dist/js/highlight.js/styles/an-old-hope.min.css +60 -2
- package/dist/js/highlight.js/styles/androidstudio.min.css +57 -1
- package/dist/js/highlight.js/styles/arduino-light.min.css +74 -1
- package/dist/js/highlight.js/styles/arta.min.css +63 -1
- package/dist/js/highlight.js/styles/ascetic.min.css +41 -1
- package/dist/js/highlight.js/styles/atom-one-dark-reasonable.min.css +95 -1
- package/dist/js/highlight.js/styles/atom-one-dark.min.css +72 -1
- package/dist/js/highlight.js/styles/atom-one-light.min.css +72 -1
- package/dist/js/highlight.js/styles/base16/3024.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/apathy.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/apprentice.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ashes.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-cave-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-cave.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-dune-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-dune.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-estuary-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-estuary.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-forest-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-forest.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-heath-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-heath.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-lakeside-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-lakeside.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-plateau-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-plateau.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-savanna-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-savanna.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-seaside-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-seaside.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-sulphurpool-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atelier-sulphurpool.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/atlas.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/bespin.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-bathory.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-burzum.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-dark-funeral.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-gorgoroth.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-immortal.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-khold.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-marduk.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-mayhem.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-nile.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal-venom.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/black-metal.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/brewer.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/bright.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/brogrammer.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/brush-trees-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/brush-trees.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/chalk.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/circus.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/classic-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/classic-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/codeschool.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/colors.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/cupcake.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/cupertino.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/danqing.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/darcula.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/dark-violet.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/darkmoss.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/darktooth.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/decaf.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/default-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/default-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/dirtysea.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/dracula.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/edge-dark.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/edge-light.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/eighties.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/embers.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/equilibrium-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/equilibrium-gray-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/equilibrium-gray-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/equilibrium-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/espresso.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/eva-dim.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/eva.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/flat.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/framer.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/fruit-soda.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gigavolt.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/github.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/google-dark.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/google-light.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/grayscale-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/grayscale-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/green-screen.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-dark-hard.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-dark-medium.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-dark-pale.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-dark-soft.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-light-hard.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-light-medium.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/gruvbox-light-soft.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/hardcore.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/harmonic16-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/harmonic16-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/heetch-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/heetch-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/helios.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/hopscotch.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/horizon-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/horizon-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/humanoid-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/humanoid-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ia-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ia-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/icy-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ir-black.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/isotope.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/kimber.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/london-tube.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/macintosh.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/marrakesh.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/materia.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/material-darker.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/material-lighter.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/material-palenight.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/material-vivid.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/material.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/mellow-purple.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/mexico-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/mocha.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/monokai.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/nebula.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/nord.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/nova.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/ocean.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/oceanicnext.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/one-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/onedark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/outrun-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/papercolor-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/papercolor-light.min.css +95 -1
- package/dist/js/highlight.js/styles/base16/paraiso.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/pasque.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/phd.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/pico.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/pop.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/porple.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/qualia.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/railscasts.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/rebecca.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ros-pine-dawn.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ros-pine-moon.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/ros-pine.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/sagelight.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/sandcastle.min.css +93 -1
- package/dist/js/highlight.js/styles/base16/seti-ui.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/shapeshifter.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/silk-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/silk-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/snazzy.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/solar-flare-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/solar-flare.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/solarized-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/solarized-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/spacemacs.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/summercamp.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/summerfruit-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/summerfruit-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/synth-midnight-terminal-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/synth-midnight-terminal-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/tango.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/tender.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/tomorrow-night.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/tomorrow.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/twilight.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/unikitty-dark.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/unikitty-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/vulcan.min.css +93 -1
- package/dist/js/highlight.js/styles/base16/windows-10-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-10.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-95-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-95.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-high-contrast-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-high-contrast.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-nt-light.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/windows-nt.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/woodland.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/xcode-dusk.min.css +97 -1
- package/dist/js/highlight.js/styles/base16/zenburn.min.css +97 -1
- package/dist/js/highlight.js/styles/brown-paper.min.css +54 -1
- package/dist/js/highlight.js/styles/codepen-embed.min.css +53 -1
- package/dist/js/highlight.js/styles/color-brewer.min.css +56 -1
- package/dist/js/highlight.js/styles/dark.min.css +54 -1
- package/dist/js/highlight.js/styles/default.min.css +79 -1
- package/dist/js/highlight.js/styles/devibeans.min.css +80 -2
- package/dist/js/highlight.js/styles/docco.min.css +81 -1
- package/dist/js/highlight.js/styles/far.min.css +59 -1
- package/dist/js/highlight.js/styles/felipec.min.css +89 -2
- package/dist/js/highlight.js/styles/foundation.min.css +74 -1
- package/dist/js/highlight.js/styles/github-dark-dimmed.min.css +87 -2
- package/dist/js/highlight.js/styles/github-dark.min.css +87 -2
- package/dist/js/highlight.js/styles/github.min.css +87 -2
- package/dist/js/highlight.js/styles/gml.min.css +68 -1
- package/dist/js/highlight.js/styles/googlecode.min.css +75 -1
- package/dist/js/highlight.js/styles/gradient-dark.min.css +92 -1
- package/dist/js/highlight.js/styles/gradient-light.min.css +94 -1
- package/dist/js/highlight.js/styles/grayscale.min.css +85 -1
- package/dist/js/highlight.js/styles/hybrid.min.css +75 -1
- package/dist/js/highlight.js/styles/idea.min.css +82 -1
- package/dist/js/highlight.js/styles/intellij-light.min.css +91 -1
- package/dist/js/highlight.js/styles/ir-black.min.css +64 -1
- package/dist/js/highlight.js/styles/isbl-editor-dark.min.css +84 -1
- package/dist/js/highlight.js/styles/isbl-editor-light.min.css +84 -1
- package/dist/js/highlight.js/styles/kimbie-dark.min.css +58 -1
- package/dist/js/highlight.js/styles/kimbie-light.min.css +58 -1
- package/dist/js/highlight.js/styles/lightfair.min.css +73 -1
- package/dist/js/highlight.js/styles/lioshi.min.css +65 -1
- package/dist/js/highlight.js/styles/magula.min.css +59 -1
- package/dist/js/highlight.js/styles/mono-blue.min.css +54 -1
- package/dist/js/highlight.js/styles/monokai-sublime.min.css +72 -1
- package/dist/js/highlight.js/styles/monokai.min.css +66 -1
- package/dist/js/highlight.js/styles/night-owl.min.css +136 -1
- package/dist/js/highlight.js/styles/nnfx-dark.min.css +96 -2
- package/dist/js/highlight.js/styles/nnfx-light.min.css +96 -2
- package/dist/js/highlight.js/styles/nord.min.css +205 -1
- package/dist/js/highlight.js/styles/obsidian.min.css +76 -1
- package/dist/js/highlight.js/styles/panda-syntax-dark.min.css +88 -1
- package/dist/js/highlight.js/styles/panda-syntax-light.min.css +85 -1
- package/dist/js/highlight.js/styles/paraiso-dark.min.css +57 -1
- package/dist/js/highlight.js/styles/paraiso-light.min.css +57 -1
- package/dist/js/highlight.js/styles/pojoaque.min.css +70 -1
- package/dist/js/highlight.js/styles/purebasic.min.css +66 -1
- package/dist/js/highlight.js/styles/qtcreator-dark.min.css +71 -1
- package/dist/js/highlight.js/styles/qtcreator-light.min.css +69 -1
- package/dist/js/highlight.js/styles/rainbow.min.css +73 -1
- package/dist/js/highlight.js/styles/routeros.min.css +77 -1
- package/dist/js/highlight.js/styles/school-book.min.css +57 -1
- package/dist/js/highlight.js/styles/shades-of-purple.min.css +76 -1
- package/dist/js/highlight.js/styles/srcery.min.css +70 -1
- package/dist/js/highlight.js/styles/stackoverflow-dark.min.css +79 -2
- package/dist/js/highlight.js/styles/stackoverflow-light.min.css +79 -2
- package/dist/js/highlight.js/styles/sunburst.min.css +85 -1
- package/dist/js/highlight.js/styles/tokyo-night-dark.min.css +83 -2
- package/dist/js/highlight.js/styles/tokyo-night-light.min.css +83 -2
- package/dist/js/highlight.js/styles/tomorrow-night-blue.min.css +59 -1
- package/dist/js/highlight.js/styles/tomorrow-night-bright.min.css +59 -1
- package/dist/js/highlight.js/styles/vs.min.css +59 -1
- package/dist/js/highlight.js/styles/vs2015.min.css +94 -1
- package/dist/js/highlight.js/styles/xcode.min.css +85 -1
- package/dist/js/highlight.js/styles/xt256.min.css +74 -1
- package/dist/js/icons/material.js +8 -4
- package/dist/method.d.ts +4 -1
- package/dist/method.js +430 -121
- package/dist/method.min.js +1 -1
- package/dist/ts/markdown/codeRender.d.ts +9 -1
- package/dist/ts/util/attachLineNumbers.d.ts +6 -5
- package/dist/types/index.d.ts +8 -1
- package/package.json +2 -2
- package/src/assets/less/_line-number.less +24 -13
- package/src/assets/less/_reset.less +13 -7
- package/src/ts/markdown/codeRender.ts +152 -58
- package/src/ts/markdown/previewRender.ts +69 -25
- package/src/ts/util/attachLineNumbers.ts +382 -98
- package/src/ts/util/editorCommonEvent.ts +15 -8
- 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
|
-
|
|
234
|
-
display:
|
|
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:
|
|
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
|
-
|
|
362
|
+
&__item {
|
|
355
363
|
cursor: pointer;
|
|
356
|
-
position:
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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 {
|
|
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(
|
|
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:
|
|
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 (
|
|
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 (
|
|
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
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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(
|
|
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(
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
};
|