UNPKG

2.14 kBJavaScriptView Raw
1'use strict'
2module.exports = mos
3
4const remark = require('@zkochan/remark')
5const remarkToc = require('@zkochan/remark-toc')
6const remarkMos = require('remark-mos')
7const visit = require('async-unist-util-visit')
8const getMarkdownMeta = require('./get-markdown-meta')
9const createMDScope = require('./create-md-scope')
10
11const 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
22const defaultRemarkPlugins = [[remarkToc]]
23
24function 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}