|
1 | | -marked.setOptions({ |
2 | | - highlight: (code, lang) => { |
3 | | - const language = Prism.languages[lang]; |
4 | | - if (language) { |
5 | | - return Prism.highlight(code, language, lang); |
6 | | - } |
7 | | - return code; |
8 | | - }, |
9 | | -}); |
| 1 | +// marked.setOptions({ |
| 2 | +// highlight: (code, lang) => { |
| 3 | +// const language = Prism.languages[lang]; |
| 4 | +// if (language) { |
| 5 | +// return Prism.highlight(code, language, lang); |
| 6 | +// } |
| 7 | +// return code; |
| 8 | +// }, |
| 9 | +// }); |
10 | 10 |
|
11 | | -const renderer = { |
12 | | - listitem: (text, task, checked) => { |
13 | | - const input = typeof checked == "boolean" ? `<input type="checkbox" disabled=""${checked ? ' checked=""' : ''} class="task-list-item-checkbox">`: ''; |
14 | | - const cls = typeof checked == "boolean" && typeof task === "boolean" ? 'class="task-list-item"' : "" |
15 | | - return `<li ${cls}>${input} ${(text || '').replace(/^<.*?>\s/, '')}</li>`; |
| 11 | +marked.use({ |
| 12 | + renderer: { |
| 13 | + code: (code, infostring, escaped) => { |
| 14 | + const language = Prism.languages[infostring]; |
| 15 | + const codeHTML = language ? Prism.highlight(code, language, infostring) : code; |
| 16 | + const codeId = randomid(); |
| 17 | + codeData[codeId] = code; |
| 18 | + const buttonElm = `<button type="button" class="icon copy-icon copied" onclick="copied(this, '${codeId}')">${copyElm}</button>`; |
| 19 | + return `<pre class="highlight"><code ${infostring ? `class="language-${infostring}"`: ''}>${codeHTML}</code>${buttonElm}</pre>` |
| 20 | + }, |
| 21 | + listitem: (text, task, checked) => { |
| 22 | + const input = typeof checked == "boolean" ? `<input type="checkbox" disabled=""${checked ? ' checked=""' : ''} class="task-list-item-checkbox">`: ''; |
| 23 | + const cls = typeof checked == "boolean" && typeof task === "boolean" ? 'class="task-list-item"' : "" |
| 24 | + return `<li ${cls}>${input} ${(text || '').replace(/^<.*?>\s/, '')}</li>`; |
| 25 | + } |
16 | 26 | } |
17 | | -} |
| 27 | +}); |
18 | 28 |
|
19 | | -marked.use({ renderer }); |
| 29 | +const copyElm = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" height="30" width="30" role="img"> |
| 30 | +<title>Copy to Clipboard</title> |
| 31 | +<path d="M704 896H64V320h640v192h64V192c0-35-29-64-64-64H512C512 57 455 0 384 0S256 57 256 128H64c-35 0-64 29-64 64v704c0 35 29 64 64 64h640c35 0 64-29 64-64V768h-64v128zM192 192h64s64-29 64-64 29-64 64-64 64 29 64 64 32 64 64 64h64s64 29 64 64H128c0-39 28-64 64-64zm-64 512h128v-64H128v64zm448-128V448L320 640l256 192V704h320V576H576zM128 832h192v-64H128v64zm320-448H128v64h320v-64zM256 512H128v64h128v-64z"/> |
| 32 | +</svg> |
| 33 | +`; |
20 | 34 |
|
21 | 35 | window.__markdown_preview_dom__ = document.getElementById('__markdown_preview__'); |
22 | | - |
23 | | -function markdownPreview(content) { |
| 36 | +const randomid = () => parseInt(String(Math.random() * 1e15), 10).toString(36); |
| 37 | +const codeData = {}; |
| 38 | +const copied = (target, id) => { |
| 39 | + target.classList.add('active'); |
| 40 | + copyTextToClipboard(codeData[id] || '', function() { |
| 41 | + var timer = setTimeout(() => { |
| 42 | + target.classList.remove('active'); |
| 43 | + clearTimeout(timer); |
| 44 | + }, 2000); |
| 45 | + }); |
| 46 | +} |
| 47 | +const markdownPreview = (content) => { |
24 | 48 | __markdown_preview_dom__.innerHTML = marked.parse(content); |
25 | 49 | } |
26 | 50 |
|
| 51 | + |
27 | 52 | if (window.webkit) { |
28 | 53 | window.webkit.messageHandlers.mdPreviewDidReady.postMessage(null); |
29 | 54 | // __markdown_preview_dom__.innerHTML = JSON.stringify(typeof window.webkit.messageHandlers.mdPreviewDidReady) |
|
0 commit comments