UNPKG

3.22 kBJavaScriptView Raw
1import remark from 'remark'
2import commentBlocks from 'remark-comment-blocks'
3import commentConfig from 'remark-comment-config'
4import remarkHtml from 'remark-html'
5import slug from 'remark-slug'
6import squeeze from 'remark-squeeze-paragraphs'
7import stringify from 'remark-stringify'
8import normalize from 'remark-normalize-headings'
9//import githubReferences from 'remark-github'
10import toc from 'remark-toc'
11import autolink from 'remark-autolink-headings'
12import contributors from 'remark-contributors'
13import stripBadges from 'remark-strip-badges'
14import parse from 'remark-parse'
15
16/**
17 * Run a remark parser profile with optional add-ons. Available profiles
18 * can be found @see profiles and addOns @see addOns
19 *
20 * @param {Object} options - the options object
21 * @param {String} options.profile - which parser profile to use?
22 * @param {Array} options.addOns - which addons to include?
23 */
24export default (options = {}, context = {}) => {
25 const { profile = 'parser', addOns = [] } = options
26 const unified = profiles[profile] || parser
27
28 return addOns.reduce((memo,addon) => (
29 addons[addOn] ? memo.use(addons[addOn]) : memo
30 ), unified(options))
31}
32
33export const applyTo = (input, options) => {
34 const { method = 'process', parser = 'github' } = options
35
36 return new Promise((resolve, reject) => {
37 profiles[parser](options)[method](input, (err, file) => {
38 err ? reject(err) : resolve(file)
39 })
40 })
41}
42
43export const standard = (options = {}) =>
44 remark()
45 .use(commentConfig)
46 .use(normalize)
47 .use(squeeze)
48 .use(slug)
49 .use(autolink)
50
51export const comments = (options = {}) =>
52 standard(options).use(commentBlocks)
53
54export const parser = (options = {}) =>
55 standard(options).use(parse)
56
57export const html = (options = {}) =>
58 standard(options).use(remarkHtml)
59
60export const stringifier = (options = {}) =>
61 standard(options).use(stringify)
62
63export const github = (options = {}) =>
64 standard(options)
65 .use(autolink)
66
67export const profiles = {
68 parser,
69 standard,
70 comments,
71 github,
72 html,
73 stringifier,
74}
75
76export const addons = {
77 contributors,
78 stripBadges,
79 toc
80}
81
82export const utilLoaders = () => {
83 return {
84 filter: () => require('unist-util-filter'),
85 findAfter: () => require('unist-util-find-after'),
86 findAllAfter: () => require('unist-util-find-all-after'),
87 findAllBefore: () => require('unist-util-find-all-before'),
88 index: () => require('unist-util-index'),
89 map: () => require('unist-util-map'),
90 parents: () => require('unist-util-parents'),
91 position: () => require('unist-util-position'),
92 removePosition: () => require('unist-util-remove-position'),
93 select: () => require('unist-util-select'),
94 source: () => require('unist-util-source'),
95 visit: () => require('unist-util-visit'),
96 reporter: () => require('vfile-reporter'),
97 docblockParser: () => require('docblock-parser'),
98 toString: () => require('mdast-util-to-string'),
99 headingRange: () => require('mdast-util-heading-range')
100 }
101}
102
103export const markdownUtils = () => {
104 const utils = utilLoaders()
105
106 return Object.keys(utils).map(k => utils[k]())
107}
108
109export const astInterface = require('./markdown-ast-interface').default
\No newline at end of file