| 
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