1 | 'use strict'
|
2 | module.exports = mos
|
3 |
|
4 | const remark = require('@zkochan/remark')
|
5 | const remarkToc = require('@zkochan/remark-toc')
|
6 | const remarkMos = require('remark-mos')
|
7 | const visit = require('async-unist-util-visit')
|
8 | const getMarkdownMeta = require('./get-markdown-meta')
|
9 | const createMDScope = require('./create-md-scope')
|
10 |
|
11 | const defaultPlugins = [
|
12 | require('mos-plugin-package-json'),
|
13 | require('mos-plugin-installation'),
|
14 | require('mos-plugin-license'),
|
15 | require('mos-plugin-shields'),
|
16 | require('mos-plugin-example'),
|
17 | require('mos-plugin-dependencies'),
|
18 | require('mos-plugin-snippet'),
|
19 | require('mos-plugin-markdownscript'),
|
20 | ]
|
21 |
|
22 | const defaultRemarkPlugins = [[remarkToc]]
|
23 |
|
24 | function mos () {
|
25 | let mosPlugins = defaultPlugins
|
26 | const remarkPlugins = defaultRemarkPlugins
|
27 |
|
28 | const remarkSettings = {
|
29 | listItemIndent: '1',
|
30 | }
|
31 |
|
32 | const processor = {
|
33 | use (plugins) {
|
34 | mosPlugins = mosPlugins.concat(plugins)
|
35 | return processor
|
36 | },
|
37 | useRemarkPlugin () {
|
38 | remarkPlugins.push(arguments)
|
39 | return processor
|
40 | },
|
41 | process (md, opts) {
|
42 | return createRemark(opts)
|
43 | .then(remarkProcessor => {
|
44 | if (typeof md === 'object') {
|
45 | return visit(md, 'markdownScript', node =>
|
46 | remarkProcessor
|
47 | .createParser()
|
48 | .generateMarkdown(node.code)
|
49 | .then(children => {
|
50 | node.children = children
|
51 | })
|
52 | )
|
53 | .then(() => remarkProcessor.process(md, remarkSettings))
|
54 | }
|
55 | return remarkProcessor.process(md, remarkSettings)
|
56 | })
|
57 | .then(res => res.result)
|
58 | },
|
59 | }
|
60 |
|
61 | function createRemark (opts) {
|
62 | opts = opts || {}
|
63 | if (!opts.filePath) throw new Error('opts.filePath is required')
|
64 |
|
65 | return getMarkdownMeta(opts.filePath)
|
66 | .then(markdown => createMDScope(mosPlugins, markdown))
|
67 | .then(scope => {
|
68 | const remarkProcessor = remark().use(remarkMos, {scope, useStrict: true})
|
69 |
|
70 | remarkPlugins.forEach(useArgs => remarkProcessor.use.apply(remarkProcessor, useArgs))
|
71 |
|
72 | return remarkProcessor
|
73 | })
|
74 | }
|
75 |
|
76 | return processor
|
77 | }
|