|
1 | | -import marked from 'marked' |
2 | | -import Prism from 'prismjs' |
3 | | -import { helper as helperTpl, tree as treeTpl } from './tpl' |
| 1 | +import { tree as treeTpl } from './tpl' |
4 | 2 | import { genTree } from './gen-tree' |
5 | 3 | import { slugify } from './slugify' |
6 | 4 | import { emojify } from './emojify' |
7 | 5 | import { isAbsolutePath, getPath, getParentPath } from '../router/util' |
8 | 6 | import { isFn, merge, cached, isPrimitive } from '../util/core' |
9 | | - |
10 | | -// See https://github.com/PrismJS/prism/pull/1367 |
11 | | -import 'prismjs/components/prism-markup-templating' |
| 7 | +import { imageCompiler } from './compiler/image' |
| 8 | +import { highlightCodeCompiler } from './compiler/code' |
| 9 | +import { paragraphCompiler } from './compiler/paragraph' |
| 10 | +import { taskListCompiler } from './compiler/taskList' |
| 11 | +import { taskListItemCompiler } from './compiler/taskListItem' |
| 12 | +import { linkCompiler } from './compiler/link' |
| 13 | +import marked from 'marked' |
12 | 14 |
|
13 | 15 | const cachedLinks = {} |
14 | 16 |
|
@@ -189,7 +191,7 @@ export class Compiler { |
189 | 191 |
|
190 | 192 | _initRenderer() { |
191 | 193 | const renderer = new marked.Renderer() |
192 | | - const { linkTarget, linkRel, router, contentBase } = this |
| 194 | + const { linkTarget, router, contentBase } = this |
193 | 195 | const _self = this |
194 | 196 | const origin = {} |
195 | 197 |
|
@@ -224,117 +226,12 @@ export class Compiler { |
224 | 226 | return `<h${level} id="${slug}"><a href="${url}" data-id="${slug}" class="anchor"><span>${str}</span></a></h${level}>` |
225 | 227 | } |
226 | 228 |
|
227 | | - // Highlight code |
228 | | - origin.code = renderer.code = function (code, lang = '') { |
229 | | - code = code.replace(/@DOCSIFY_QM@/g, '`') |
230 | | - const hl = Prism.highlight( |
231 | | - code, |
232 | | - Prism.languages[lang] || Prism.languages.markup |
233 | | - ) |
234 | | - |
235 | | - return `<pre v-pre data-lang="${lang}"><code class="lang-${lang}">${hl}</code></pre>` |
236 | | - } |
237 | | - |
238 | | - origin.link = renderer.link = function (href, title = '', text) { |
239 | | - let attrs = '' |
240 | | - |
241 | | - const { str, config } = getAndRemoveConfig(title) |
242 | | - title = str |
243 | | - |
244 | | - if ( |
245 | | - !isAbsolutePath(href) && |
246 | | - !_self._matchNotCompileLink(href) && |
247 | | - !config.ignore |
248 | | - ) { |
249 | | - if (href === _self.config.homepage) { |
250 | | - href = 'README' |
251 | | - } |
252 | | - |
253 | | - href = router.toURL(href, null, router.getCurrentPath()) |
254 | | - } else { |
255 | | - attrs += href.indexOf('mailto:') === 0 ? '' : ` target="${linkTarget}"` |
256 | | - attrs += href.indexOf('mailto:') === 0 ? '' : (linkRel !== '' ? ` rel="${linkRel}"` : '') |
257 | | - } |
258 | | - |
259 | | - if (config.target) { |
260 | | - attrs += ' target=' + config.target |
261 | | - } |
262 | | - |
263 | | - if (config.disabled) { |
264 | | - attrs += ' disabled' |
265 | | - href = 'javascript:void(0)' |
266 | | - } |
267 | | - |
268 | | - if (title) { |
269 | | - attrs += ` title="${title}"` |
270 | | - } |
271 | | - |
272 | | - return `<a href="${href}"${attrs}>${text}</a>` |
273 | | - } |
274 | | - |
275 | | - origin.paragraph = renderer.paragraph = function (text) { |
276 | | - let result |
277 | | - if (/^!>/.test(text)) { |
278 | | - result = helperTpl('tip', text) |
279 | | - } else if (/^\?>/.test(text)) { |
280 | | - result = helperTpl('warn', text) |
281 | | - } else { |
282 | | - result = `<p>${text}</p>` |
283 | | - } |
284 | | - |
285 | | - return result |
286 | | - } |
287 | | - |
288 | | - origin.image = renderer.image = function (href, title, text) { |
289 | | - let url = href |
290 | | - let attrs = '' |
291 | | - |
292 | | - const { str, config } = getAndRemoveConfig(title) |
293 | | - title = str |
294 | | - |
295 | | - if (config['no-zoom']) { |
296 | | - attrs += ' data-no-zoom' |
297 | | - } |
298 | | - |
299 | | - if (title) { |
300 | | - attrs += ` title="${title}"` |
301 | | - } |
302 | | - |
303 | | - const size = config.size |
304 | | - if (size) { |
305 | | - const sizes = size.split('x') |
306 | | - if (sizes[1]) { |
307 | | - attrs += 'width=' + sizes[0] + ' height=' + sizes[1] |
308 | | - } else { |
309 | | - attrs += 'width=' + sizes[0] |
310 | | - } |
311 | | - } |
312 | | - |
313 | | - if (!isAbsolutePath(href)) { |
314 | | - url = getPath(contentBase, getParentPath(router.getCurrentPath()), href) |
315 | | - } |
316 | | - |
317 | | - return `<img src="${url}"data-origin="${href}" alt="${text}"${attrs}>` |
318 | | - } |
319 | | - |
320 | | - origin.list = renderer.list = function (body, ordered, start) { |
321 | | - const isTaskList = /<li class="task-list-item">/.test(body.split('class="task-list"')[0]) |
322 | | - const isStartReq = start && start > 1 |
323 | | - const tag = ordered ? 'ol' : 'ul' |
324 | | - const tagAttrs = [ |
325 | | - (isTaskList ? 'class="task-list"' : ''), |
326 | | - (isStartReq ? `start="${start}"` : '') |
327 | | - ].join(' ').trim() |
328 | | - |
329 | | - return `<${tag} ${tagAttrs}>${body}</${tag}>` |
330 | | - } |
331 | | - |
332 | | - origin.listitem = renderer.listitem = function (text) { |
333 | | - const isTaskItem = /^(<input.*type="checkbox"[^>]*>)/.test(text) |
334 | | - const html = isTaskItem ? `<li class="task-list-item"><label>${text}</label></li>` : `<li>${text}</li>` |
335 | | - |
336 | | - return html |
337 | | - } |
| 229 | + origin.code = highlightCodeCompiler({ renderer }) |
| 230 | + origin.link = linkCompiler({ renderer, router, linkTarget, compilerClass: _self }) |
| 231 | + origin.paragraph = paragraphCompiler({ renderer }) |
| 232 | + origin.image = imageCompiler({ renderer, contentBase, router }) |
| 233 | + origin.list = taskListCompiler({ renderer }) |
| 234 | + origin.listitem = taskListItemCompiler({ renderer }) |
338 | 235 |
|
339 | 236 | renderer.origin = origin |
340 | 237 |
|
|
0 commit comments