vue3-markdown-kit 0.1.0

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/lib/index.cjs ADDED
@@ -0,0 +1,363 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/index.js
30
+ var src_exports = {};
31
+ __export(src_exports, {
32
+ VMdPreview: () => preview_default,
33
+ VueMarkdownKit: () => VueMarkdownKit,
34
+ createGithubTheme: () => createGithubTheme,
35
+ createMarkdownRenderer: () => createMarkdownRenderer,
36
+ default: () => src_default,
37
+ githubTheme: () => github_default,
38
+ sanitizeHtml: () => sanitizeHtml,
39
+ sanitizer: () => sanitizer,
40
+ slugifyHeading: () => slugifyHeading
41
+ });
42
+ module.exports = __toCommonJS(src_exports);
43
+
44
+ // src/preview.js
45
+ var import_vue = require("vue");
46
+
47
+ // src/core/renderer.js
48
+ var import_markdown_it = __toESM(require("markdown-it"), 1);
49
+ var import_markdown_it_attrs = __toESM(require("markdown-it-attrs"), 1);
50
+ function escapeHtml(value) {
51
+ return String(value).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
52
+ }
53
+ function slugifyHeading(value) {
54
+ const slug = String(value || "").normalize("NFKC").trim().toLowerCase().replace(/\s+/g, "-").replace(/[^\p{Letter}\p{Number}_-]+/gu, "").replace(/-{2,}/g, "-").replace(/^-|-$/g, "");
55
+ return slug || "section";
56
+ }
57
+ function highlightCode(code, language, options) {
58
+ const {
59
+ Hljs,
60
+ codeHighlightExtensionMap = {},
61
+ codeBlockClass = (lang) => `v-md-hljs-${lang || ""}`
62
+ } = options;
63
+ const normalizedLanguage = codeHighlightExtensionMap[language] || language;
64
+ let highlighted = escapeHtml(code);
65
+ if (Hljs && normalizedLanguage && typeof Hljs.getLanguage === "function" && Hljs.getLanguage(normalizedLanguage)) {
66
+ try {
67
+ highlighted = Hljs.highlight(code, {
68
+ language: normalizedLanguage,
69
+ ignoreIllegals: true
70
+ }).value;
71
+ } catch {
72
+ highlighted = Hljs.highlight(normalizedLanguage, code, true).value;
73
+ }
74
+ }
75
+ return `<pre class="${escapeHtml(codeBlockClass(normalizedLanguage))}"><code>${highlighted}</code></pre>`;
76
+ }
77
+ function installHeadingAnchors(parser) {
78
+ parser.core.ruler.before("block", "vue_markdown_kit_heading_state", (state) => {
79
+ state.env.__vueMarkdownKitHeadingSlugs = /* @__PURE__ */ new Map();
80
+ });
81
+ const fallback = parser.renderer.rules.heading_open || ((tokens, index, options, _env, self) => self.renderToken(tokens, index, options));
82
+ parser.renderer.rules.heading_open = (tokens, index, options, env, self) => {
83
+ const inline = tokens[index + 1];
84
+ const baseSlug = slugifyHeading(inline && inline.content);
85
+ const slugs = env.__vueMarkdownKitHeadingSlugs || /* @__PURE__ */ new Map();
86
+ const count = slugs.get(baseSlug) || 0;
87
+ const slug = count === 0 ? baseSlug : `${baseSlug}-${count}`;
88
+ slugs.set(baseSlug, count + 1);
89
+ env.__vueMarkdownKitHeadingSlugs = slugs;
90
+ tokens[index].attrSet("id", slug);
91
+ tokens[index].attrSet("data-v-md-heading", slug);
92
+ return fallback(tokens, index, options, env, self);
93
+ };
94
+ }
95
+ function installSafeExternalLinks(parser) {
96
+ const fallback = parser.renderer.rules.link_open || ((tokens, index, options, _env, self) => self.renderToken(tokens, index, options));
97
+ parser.renderer.rules.link_open = (tokens, index, options, env, self) => {
98
+ const token = tokens[index];
99
+ const href = token.attrGet("href") || "";
100
+ if (/^https?:\/\//i.test(href)) {
101
+ token.attrSet("target", "_blank");
102
+ token.attrSet("rel", "noopener noreferrer");
103
+ }
104
+ return fallback(tokens, index, options, env, self);
105
+ };
106
+ }
107
+ function createMarkdownRenderer(options = {}) {
108
+ var _a, _b, _c, _d;
109
+ const parser = new import_markdown_it.default({
110
+ html: (_a = options.html) != null ? _a : true,
111
+ breaks: (_b = options.breaks) != null ? _b : true,
112
+ linkify: (_c = options.linkify) != null ? _c : false,
113
+ typographer: (_d = options.typographer) != null ? _d : true,
114
+ highlight: (code, language) => highlightCode(code, language, options)
115
+ });
116
+ if (options.attrs !== false) {
117
+ parser.use(import_markdown_it_attrs.default, {
118
+ leftDelimiter: "{{{",
119
+ rightDelimiter: "}}}",
120
+ allowedAttributes: [
121
+ "class",
122
+ "height",
123
+ "id",
124
+ "title",
125
+ "width",
126
+ ...options.allowedAttributes || []
127
+ ]
128
+ });
129
+ }
130
+ installHeadingAnchors(parser);
131
+ installSafeExternalLinks(parser);
132
+ return parser;
133
+ }
134
+
135
+ // src/core/sanitize.js
136
+ var import_dompurify = __toESM(require("dompurify"), 1);
137
+ var BASE_SANITIZE_OPTIONS = Object.freeze({
138
+ USE_PROFILES: {
139
+ html: true
140
+ },
141
+ ADD_ATTR: [
142
+ "data-mention-id",
143
+ "data-v-md-anchor",
144
+ "data-v-md-heading",
145
+ "data-v-md-line",
146
+ "rel",
147
+ "target"
148
+ ],
149
+ FORBID_TAGS: ["script"]
150
+ });
151
+ var sharedOptions = {};
152
+ function mergeOptions(base, extra) {
153
+ const merged = {
154
+ ...base,
155
+ ...extra
156
+ };
157
+ for (const key of ["ADD_ATTR", "ADD_TAGS", "FORBID_ATTR", "FORBID_TAGS"]) {
158
+ if (base[key] || extra[key]) {
159
+ merged[key] = [.../* @__PURE__ */ new Set([...base[key] || [], ...extra[key] || []])];
160
+ }
161
+ }
162
+ if (base.USE_PROFILES || extra.USE_PROFILES) {
163
+ merged.USE_PROFILES = {
164
+ ...base.USE_PROFILES || {},
165
+ ...extra.USE_PROFILES || {}
166
+ };
167
+ }
168
+ return merged;
169
+ }
170
+ function resolvePurifier(windowLike) {
171
+ if (typeof import_dompurify.default.sanitize === "function") {
172
+ return import_dompurify.default;
173
+ }
174
+ if (windowLike && typeof import_dompurify.default === "function") {
175
+ return (0, import_dompurify.default)(windowLike);
176
+ }
177
+ return null;
178
+ }
179
+ function escapeHtml2(value) {
180
+ return String(value).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
181
+ }
182
+ function sanitizeHtml(dirtyHtml, options = {}, windowLike = typeof window === "undefined" ? void 0 : window) {
183
+ const purifier = resolvePurifier(windowLike);
184
+ if (!purifier || typeof purifier.sanitize !== "function") {
185
+ return escapeHtml2(dirtyHtml || "");
186
+ }
187
+ return purifier.sanitize(
188
+ dirtyHtml || "",
189
+ mergeOptions(mergeOptions(BASE_SANITIZE_OPTIONS, sharedOptions), options)
190
+ );
191
+ }
192
+ var sanitizer = {
193
+ process(dirtyHtml, options) {
194
+ return sanitizeHtml(dirtyHtml, options);
195
+ },
196
+ extend(options = {}) {
197
+ sharedOptions = mergeOptions(sharedOptions, options);
198
+ return this;
199
+ },
200
+ reset() {
201
+ sharedOptions = {};
202
+ return this;
203
+ }
204
+ };
205
+
206
+ // src/version.js
207
+ var version = "0.1.0";
208
+
209
+ // src/preview.js
210
+ var defaultThemeConfig = {
211
+ name: "base",
212
+ previewClass: "vmk-markdown-body",
213
+ markdownParser: createMarkdownRenderer(),
214
+ extend(callback) {
215
+ callback(this.markdownParser);
216
+ }
217
+ };
218
+ var markdownExtenders = [];
219
+ var activeThemeConfig = defaultThemeConfig;
220
+ function installTheme(theme, options) {
221
+ if (!theme) return;
222
+ if (typeof theme === "function") {
223
+ theme(VMdPreview, options);
224
+ } else if (typeof theme.install === "function") {
225
+ theme.install(VMdPreview, options);
226
+ } else if (theme.markdownParser) {
227
+ VMdPreview.theme(theme);
228
+ }
229
+ }
230
+ var VMdPreview = (0, import_vue.defineComponent)({
231
+ name: "v-md-preview",
232
+ props: {
233
+ text: {
234
+ type: String,
235
+ default: ""
236
+ },
237
+ theme: {
238
+ type: Object,
239
+ default: void 0
240
+ },
241
+ tabSize: {
242
+ type: Number,
243
+ default: 2
244
+ },
245
+ scrollContainer: {
246
+ type: Function,
247
+ default: () => window
248
+ },
249
+ top: {
250
+ type: Number,
251
+ default: 0
252
+ },
253
+ sanitizeOptions: {
254
+ type: Object,
255
+ default: () => ({})
256
+ }
257
+ },
258
+ emits: {
259
+ change: (_text, _html) => true,
260
+ "image-click": (_images, _index) => true
261
+ },
262
+ setup(props, { emit }) {
263
+ const rootElement = (0, import_vue.shallowRef)(null);
264
+ const html = (0, import_vue.shallowRef)("");
265
+ if (props.theme) {
266
+ installTheme(props.theme);
267
+ }
268
+ for (const extender of markdownExtenders) {
269
+ extender(activeThemeConfig.markdownParser);
270
+ }
271
+ const renderMarkdown = () => {
272
+ const rawHtml = activeThemeConfig.markdownParser.render(props.text || "");
273
+ html.value = sanitizer.process(rawHtml, props.sanitizeOptions);
274
+ emit("change", props.text, html.value);
275
+ };
276
+ (0, import_vue.watch)([() => props.text, () => props.sanitizeOptions], renderMarkdown, {
277
+ deep: true,
278
+ immediate: true
279
+ });
280
+ const handlePreviewClick = (event) => {
281
+ const target = event.target;
282
+ const root = rootElement.value;
283
+ if (!root || !target || target.tagName !== "IMG") {
284
+ return;
285
+ }
286
+ const imageElements = Array.from(root.querySelectorAll("img"));
287
+ const images = imageElements.map((image) => image.getAttribute("src")).filter(Boolean);
288
+ const index = imageElements.indexOf(target);
289
+ emit("image-click", images, index);
290
+ };
291
+ return () => (0, import_vue.h)(
292
+ "div",
293
+ {
294
+ ref: rootElement,
295
+ class: "vue-markdown-kit-preview",
296
+ style: {
297
+ tabSize: props.tabSize,
298
+ MozTabSize: props.tabSize
299
+ },
300
+ onClick: handlePreviewClick
301
+ },
302
+ [
303
+ (0, import_vue.h)("div", {
304
+ class: activeThemeConfig.previewClass,
305
+ innerHTML: html.value
306
+ })
307
+ ]
308
+ );
309
+ }
310
+ });
311
+ VMdPreview.version = version;
312
+ VMdPreview.install = (app) => {
313
+ app.component(VMdPreview.name, VMdPreview);
314
+ };
315
+ VMdPreview.theme = (themeConfig) => {
316
+ activeThemeConfig = themeConfig || defaultThemeConfig;
317
+ return VMdPreview;
318
+ };
319
+ VMdPreview.use = (theme, options) => {
320
+ installTheme(theme, options);
321
+ return VMdPreview;
322
+ };
323
+ VMdPreview.extendMarkdown = (extender) => {
324
+ markdownExtenders.push(extender);
325
+ return VMdPreview;
326
+ };
327
+ VMdPreview.xss = sanitizer;
328
+ VMdPreview.lang = {
329
+ use() {
330
+ },
331
+ add() {
332
+ }
333
+ };
334
+ var preview_default = VMdPreview;
335
+
336
+ // src/theme/github.js
337
+ function createGithubTheme(options = {}) {
338
+ const markdownParser = createMarkdownRenderer(options);
339
+ return {
340
+ name: "github",
341
+ previewClass: "github-markdown-body",
342
+ markdownParser,
343
+ extend(callback) {
344
+ callback(markdownParser, options.Hljs);
345
+ }
346
+ };
347
+ }
348
+ var githubTheme = {
349
+ install(VMdPreview2, options = {}) {
350
+ VMdPreview2.theme(createGithubTheme(options));
351
+ }
352
+ };
353
+ var github_default = githubTheme;
354
+
355
+ // src/index.js
356
+ var VueMarkdownKit = {
357
+ version: preview_default.version,
358
+ install(Vue) {
359
+ preview_default.install(Vue);
360
+ }
361
+ };
362
+ var src_default = VueMarkdownKit;
363
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.js", "../src/preview.js", "../src/core/renderer.js", "../src/core/sanitize.js", "../src/version.js", "../src/theme/github.js"],
4
+ "sourcesContent": ["import VMdPreview from './preview.js'\nimport githubTheme, { createGithubTheme } from './theme/github.js'\n\nconst VueMarkdownKit = {\n version: VMdPreview.version,\n install(Vue) {\n VMdPreview.install(Vue)\n },\n}\n\nexport { VMdPreview, VueMarkdownKit, createGithubTheme, githubTheme }\nexport * from './core/index.js'\nexport default VueMarkdownKit\n", "import { defineComponent, h, shallowRef, watch } from 'vue'\nimport { createMarkdownRenderer } from './core/renderer.js'\nimport { sanitizer } from './core/sanitize.js'\nimport { version } from './version.js'\n\nconst defaultThemeConfig = {\n name: 'base',\n previewClass: 'vmk-markdown-body',\n markdownParser: createMarkdownRenderer(),\n extend(callback) {\n callback(this.markdownParser)\n },\n}\n\nconst markdownExtenders = []\nlet activeThemeConfig = defaultThemeConfig\n\nfunction installTheme(theme, options) {\n if (!theme) return\n\n if (typeof theme === 'function') {\n theme(VMdPreview, options)\n } else if (typeof theme.install === 'function') {\n theme.install(VMdPreview, options)\n } else if (theme.markdownParser) {\n VMdPreview.theme(theme)\n }\n}\n\nconst VMdPreview = defineComponent({\n name: 'v-md-preview',\n\n props: {\n text: {\n type: String,\n default: '',\n },\n theme: {\n type: Object,\n default: undefined,\n },\n tabSize: {\n type: Number,\n default: 2,\n },\n scrollContainer: {\n type: Function,\n default: () => window,\n },\n top: {\n type: Number,\n default: 0,\n },\n sanitizeOptions: {\n type: Object,\n default: () => ({}),\n },\n },\n\n emits: {\n change: (_text, _html) => true,\n 'image-click': (_images, _index) => true,\n },\n\n setup(props, { emit }) {\n const rootElement = shallowRef(null)\n const html = shallowRef('')\n\n if (props.theme) {\n installTheme(props.theme)\n }\n\n for (const extender of markdownExtenders) {\n extender(activeThemeConfig.markdownParser)\n }\n\n const renderMarkdown = () => {\n const rawHtml = activeThemeConfig.markdownParser.render(props.text || '')\n html.value = sanitizer.process(rawHtml, props.sanitizeOptions)\n emit('change', props.text, html.value)\n }\n\n watch([() => props.text, () => props.sanitizeOptions], renderMarkdown, {\n deep: true,\n immediate: true,\n })\n\n const handlePreviewClick = (event) => {\n const target = event.target\n const root = rootElement.value\n\n if (!root || !target || target.tagName !== 'IMG') {\n return\n }\n\n const imageElements = Array.from(root.querySelectorAll('img'))\n const images = imageElements\n .map((image) => image.getAttribute('src'))\n .filter(Boolean)\n const index = imageElements.indexOf(target)\n\n emit('image-click', images, index)\n }\n\n return () =>\n h(\n 'div',\n {\n ref: rootElement,\n class: 'vue-markdown-kit-preview',\n style: {\n tabSize: props.tabSize,\n MozTabSize: props.tabSize,\n },\n onClick: handlePreviewClick,\n },\n [\n h('div', {\n class: activeThemeConfig.previewClass,\n innerHTML: html.value,\n }),\n ],\n )\n },\n})\n\nVMdPreview.version = version\nVMdPreview.install = (app) => {\n app.component(VMdPreview.name, VMdPreview)\n}\nVMdPreview.theme = (themeConfig) => {\n activeThemeConfig = themeConfig || defaultThemeConfig\n return VMdPreview\n}\nVMdPreview.use = (theme, options) => {\n installTheme(theme, options)\n return VMdPreview\n}\nVMdPreview.extendMarkdown = (extender) => {\n markdownExtenders.push(extender)\n return VMdPreview\n}\nVMdPreview.xss = sanitizer\nVMdPreview.lang = {\n use() {},\n add() {},\n}\n\nexport default VMdPreview\n", "import MarkdownIt from 'markdown-it'\nimport markdownItAttrs from 'markdown-it-attrs'\n\nfunction escapeHtml(value) {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nexport function slugifyHeading(value) {\n const slug = String(value || '')\n .normalize('NFKC')\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^\\p{Letter}\\p{Number}_-]+/gu, '')\n .replace(/-{2,}/g, '-')\n .replace(/^-|-$/g, '')\n\n return slug || 'section'\n}\n\nfunction highlightCode(code, language, options) {\n const {\n Hljs,\n codeHighlightExtensionMap = {},\n codeBlockClass = (lang) => `v-md-hljs-${lang || ''}`,\n } = options\n\n const normalizedLanguage = codeHighlightExtensionMap[language] || language\n let highlighted = escapeHtml(code)\n\n if (\n Hljs &&\n normalizedLanguage &&\n typeof Hljs.getLanguage === 'function' &&\n Hljs.getLanguage(normalizedLanguage)\n ) {\n try {\n highlighted = Hljs.highlight(code, {\n language: normalizedLanguage,\n ignoreIllegals: true,\n }).value\n } catch {\n // highlight.js 10 compatibility.\n highlighted = Hljs.highlight(normalizedLanguage, code, true).value\n }\n }\n\n return `<pre class=\"${escapeHtml(codeBlockClass(normalizedLanguage))}\"><code>${highlighted}</code></pre>`\n}\n\nfunction installHeadingAnchors(parser) {\n parser.core.ruler.before('block', 'vue_markdown_kit_heading_state', (state) => {\n state.env.__vueMarkdownKitHeadingSlugs = new Map()\n })\n\n const fallback =\n parser.renderer.rules.heading_open ||\n ((tokens, index, options, _env, self) => self.renderToken(tokens, index, options))\n\n parser.renderer.rules.heading_open = (tokens, index, options, env, self) => {\n const inline = tokens[index + 1]\n const baseSlug = slugifyHeading(inline && inline.content)\n const slugs = env.__vueMarkdownKitHeadingSlugs || new Map()\n const count = slugs.get(baseSlug) || 0\n const slug = count === 0 ? baseSlug : `${baseSlug}-${count}`\n\n slugs.set(baseSlug, count + 1)\n env.__vueMarkdownKitHeadingSlugs = slugs\n\n tokens[index].attrSet('id', slug)\n tokens[index].attrSet('data-v-md-heading', slug)\n\n return fallback(tokens, index, options, env, self)\n }\n}\n\nfunction installSafeExternalLinks(parser) {\n const fallback =\n parser.renderer.rules.link_open ||\n ((tokens, index, options, _env, self) => self.renderToken(tokens, index, options))\n\n parser.renderer.rules.link_open = (tokens, index, options, env, self) => {\n const token = tokens[index]\n const href = token.attrGet('href') || ''\n\n if (/^https?:\\/\\//i.test(href)) {\n token.attrSet('target', '_blank')\n token.attrSet('rel', 'noopener noreferrer')\n }\n\n return fallback(tokens, index, options, env, self)\n }\n}\n\nexport function createMarkdownRenderer(options = {}) {\n const parser = new MarkdownIt({\n html: options.html ?? true,\n breaks: options.breaks ?? true,\n linkify: options.linkify ?? false,\n typographer: options.typographer ?? true,\n highlight: (code, language) => highlightCode(code, language, options),\n })\n\n if (options.attrs !== false) {\n parser.use(markdownItAttrs, {\n leftDelimiter: '{{{',\n rightDelimiter: '}}}',\n allowedAttributes: [\n 'class',\n 'height',\n 'id',\n 'title',\n 'width',\n ...(options.allowedAttributes || []),\n ],\n })\n }\n\n installHeadingAnchors(parser)\n installSafeExternalLinks(parser)\n\n return parser\n}\n", "import createDOMPurify from 'dompurify'\n\nconst BASE_SANITIZE_OPTIONS = Object.freeze({\n USE_PROFILES: {\n html: true,\n },\n ADD_ATTR: [\n 'data-mention-id',\n 'data-v-md-anchor',\n 'data-v-md-heading',\n 'data-v-md-line',\n 'rel',\n 'target',\n ],\n FORBID_TAGS: ['script'],\n})\n\nlet sharedOptions = {}\n\nfunction mergeOptions(base, extra) {\n const merged = {\n ...base,\n ...extra,\n }\n\n for (const key of ['ADD_ATTR', 'ADD_TAGS', 'FORBID_ATTR', 'FORBID_TAGS']) {\n if (base[key] || extra[key]) {\n merged[key] = [...new Set([...(base[key] || []), ...(extra[key] || [])])]\n }\n }\n\n if (base.USE_PROFILES || extra.USE_PROFILES) {\n merged.USE_PROFILES = {\n ...(base.USE_PROFILES || {}),\n ...(extra.USE_PROFILES || {}),\n }\n }\n\n return merged\n}\n\nfunction resolvePurifier(windowLike) {\n if (typeof createDOMPurify.sanitize === 'function') {\n return createDOMPurify\n }\n\n if (windowLike && typeof createDOMPurify === 'function') {\n return createDOMPurify(windowLike)\n }\n\n return null\n}\n\nfunction escapeHtml(value) {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\nexport function sanitizeHtml(\n dirtyHtml,\n options = {},\n windowLike = typeof window === 'undefined' ? undefined : window,\n) {\n const purifier = resolvePurifier(windowLike)\n\n // Fail closed in non-DOM environments rather than returning executable HTML.\n if (!purifier || typeof purifier.sanitize !== 'function') {\n return escapeHtml(dirtyHtml || '')\n }\n\n return purifier.sanitize(\n dirtyHtml || '',\n mergeOptions(mergeOptions(BASE_SANITIZE_OPTIONS, sharedOptions), options),\n )\n}\n\nexport const sanitizer = {\n process(dirtyHtml, options) {\n return sanitizeHtml(dirtyHtml, options)\n },\n\n extend(options = {}) {\n sharedOptions = mergeOptions(sharedOptions, options)\n return this\n },\n\n reset() {\n sharedOptions = {}\n return this\n },\n}\n", "export const version = '0.1.0'\n", "import { createMarkdownRenderer } from '../core/renderer.js'\n\nexport function createGithubTheme(options = {}) {\n const markdownParser = createMarkdownRenderer(options)\n\n return {\n name: 'github',\n previewClass: 'github-markdown-body',\n markdownParser,\n extend(callback) {\n callback(markdownParser, options.Hljs)\n },\n }\n}\n\nconst githubTheme = {\n install(VMdPreview, options = {}) {\n VMdPreview.theme(createGithubTheme(options))\n },\n}\n\nexport default githubTheme\n"],
5
+ "mappings": "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",
6
+ "names": ["MarkdownIt", "markdownItAttrs", "createDOMPurify", "escapeHtml", "VMdPreview"]
7
+ }