|
1 |
| -var loaderUtils = require('loader-utils') |
2 |
| -var hljs = require('highlight.js') |
3 |
| -var cheerio = require('cheerio') |
4 |
| -var markdown = require('markdown-it') |
5 |
| -var Token = require('markdown-it/lib/token'); |
| 1 | +var loaderUtils = require("loader-utils"); |
| 2 | +var hljs = require("highlight.js"); |
| 3 | +var cheerio = require("cheerio"); |
| 4 | +var markdown = require("markdown-it"); |
| 5 | +var Token = require("markdown-it/lib/token"); |
6 | 6 |
|
7 | 7 | /**
|
8 | 8 | * `<pre></pre>` => `<pre v-pre></pre>`
|
9 | 9 | * `<code></code>` => `<code v-pre></code>`
|
10 | 10 | * @param {string} str
|
11 | 11 | * @return {string}
|
12 | 12 | */
|
13 |
| -var addVuePreviewAttr = function (str) { |
14 |
| - return str.replace(/(<pre|<code)/g, '$1 v-pre') |
15 |
| -} |
| 13 | +var addVuePreviewAttr = function(str) { |
| 14 | + return str.replace(/(<pre|<code)/g, "$1 v-pre"); |
| 15 | +}; |
16 | 16 |
|
17 | 17 | /**
|
18 | 18 | * renderHighlight
|
19 | 19 | * @param {string} str
|
20 | 20 | * @param {string} lang
|
21 | 21 | */
|
22 |
| -var renderHighlight = function (str, lang) { |
| 22 | +var renderHighlight = function(str, lang) { |
23 | 23 | if (!(lang && hljs.getLanguage(lang))) {
|
24 |
| - return '' |
| 24 | + return ""; |
25 | 25 | }
|
26 | 26 |
|
27 |
| - return hljs.highlight(lang, str, true).value |
28 |
| -} |
| 27 | + return hljs.highlight(lang, str, true).value; |
| 28 | +}; |
29 | 29 |
|
30 | 30 | /**
|
31 | 31 | * html => vue file template
|
32 | 32 | * @param {[type]} html [description]
|
33 | 33 | * @return {[type]} [description]
|
34 | 34 | */
|
35 |
| -var renderVueTemplate = function (html) { |
| 35 | +var renderVueTemplate = function(html) { |
36 | 36 | var $ = cheerio.load(html, {
|
37 | 37 | decodeEntities: false,
|
38 | 38 | lowerCaseAttributeNames: false,
|
39 |
| - lowerCaseTags: false, |
40 |
| - }) |
| 39 | + lowerCaseTags: false |
| 40 | + }); |
41 | 41 |
|
42 | 42 | var output = {
|
43 |
| - style: $.html('style'), |
44 |
| - script: $.html('script'), |
| 43 | + style: $.html("style"), |
| 44 | + script: $.html("script") |
| 45 | + }; |
| 46 | + var result; |
| 47 | + |
| 48 | + $("style").remove(); |
| 49 | + $("script").remove(); |
| 50 | + |
| 51 | + result = |
| 52 | + "<template><section>" + |
| 53 | + $.html() + |
| 54 | + "</section></template>\n" + |
| 55 | + output.style + |
| 56 | + "\n" + |
| 57 | + output.script; |
| 58 | + |
| 59 | + return result; |
| 60 | +}; |
| 61 | + |
| 62 | +module.exports = function(source) { |
| 63 | + this.cacheable && this.cacheable(); |
| 64 | + var parser, preprocess; |
| 65 | + var params = loaderUtils.parseQuery(this.query) || {}; |
| 66 | + var vueMarkdownOptions = this.options.__vueMarkdownOptions__; |
| 67 | + var opts = Object.create(vueMarkdownOptions.__proto__); // inherit prototype |
| 68 | + var preventExtract = false; |
| 69 | + |
| 70 | + opts = Object.assign(opts, params, vueMarkdownOptions); // assign attributes |
| 71 | + |
| 72 | + if (opts.preventExtract) { |
| 73 | + delete opts.preventExtract; |
| 74 | + preventExtract = true; |
45 | 75 | }
|
46 |
| - var result |
47 | 76 |
|
48 |
| - $('style').remove() |
49 |
| - $('script').remove() |
50 |
| - |
51 |
| - result = '<template><section>' + $.html() + '</section></template>\n' + |
52 |
| - output.style + '\n' + |
53 |
| - output.script |
54 |
| - |
55 |
| - return result |
56 |
| -} |
57 |
| - |
58 |
| -module.exports = function (source) { |
59 |
| - this.cacheable && this.cacheable() |
60 |
| - var parser, preprocess |
61 |
| - var params = loaderUtils.parseQuery(this.query) || {} |
62 |
| - var vueMarkdownOptions = this.options.__vueMarkdownOptions__ |
63 |
| - var opts = Object.create(vueMarkdownOptions.__proto__) // inherit prototype |
64 |
| - opts = Object.assign(opts, params, vueMarkdownOptions) // assign attributes |
65 |
| - |
66 |
| - if (typeof opts.render === 'function') { |
67 |
| - parser = opts |
| 77 | + if (typeof opts.render === "function") { |
| 78 | + parser = opts; |
68 | 79 | } else {
|
69 |
| - opts = Object.assign({ |
70 |
| - preset: 'default', |
71 |
| - html: true, |
72 |
| - highlight: renderHighlight, |
73 |
| - }, opts) |
| 80 | + opts = Object.assign( |
| 81 | + { |
| 82 | + preset: "default", |
| 83 | + html: true, |
| 84 | + highlight: renderHighlight |
| 85 | + }, |
| 86 | + opts |
| 87 | + ); |
74 | 88 |
|
75 |
| - var plugins = opts.use |
76 |
| - preprocess = opts.preprocess |
| 89 | + var plugins = opts.use; |
| 90 | + preprocess = opts.preprocess; |
77 | 91 |
|
78 |
| - delete opts.use |
79 |
| - delete opts.preprocess |
| 92 | + delete opts.use; |
| 93 | + delete opts.preprocess; |
80 | 94 |
|
81 |
| - parser = markdown(opts.preset, opts) |
| 95 | + parser = markdown(opts.preset, opts); |
82 | 96 |
|
83 | 97 | //add ruler:extract script and style tags from html token content
|
84 |
| - parser.core.ruler.push('extract_script_or_style', function replace(state) { |
85 |
| - let tag_reg=new RegExp("<(script|style)(?:[^<]|<)+<\/\\1>",'g'); |
86 |
| - let newTokens=[]; |
87 |
| - state.tokens.filter(token=>token.type=='fence' && token.info=='html').forEach(token=>{ |
88 |
| - let tokens=(token.content.match(tag_reg)||[]).map(content=>{ |
89 |
| - let t=new Token('html_block', '', 0); |
90 |
| - t.content=content; |
91 |
| - return t; |
92 |
| - }); |
93 |
| - if(tokens.length>0){ |
94 |
| - newTokens.push.apply(newTokens, tokens); |
95 |
| - } |
96 |
| - }) |
97 |
| - state.tokens.push.apply(state.tokens, newTokens); |
98 |
| - }); |
| 98 | + !preventExtract && |
| 99 | + parser.core.ruler.push("extract_script_or_style", function replace( |
| 100 | + state |
| 101 | + ) { |
| 102 | + let tag_reg = new RegExp("<(script|style)(?:[^<]|<)+</\\1>", "g"); |
| 103 | + let newTokens = []; |
| 104 | + state.tokens |
| 105 | + .filter(token => token.type == "fence" && token.info == "html") |
| 106 | + .forEach(token => { |
| 107 | + let tokens = (token.content.match(tag_reg) || []).map(content => { |
| 108 | + let t = new Token("html_block", "", 0); |
| 109 | + t.content = content; |
| 110 | + return t; |
| 111 | + }); |
| 112 | + if (tokens.length > 0) { |
| 113 | + newTokens.push.apply(newTokens, tokens); |
| 114 | + } |
| 115 | + }); |
| 116 | + state.tokens.push.apply(state.tokens, newTokens); |
| 117 | + }); |
99 | 118 |
|
100 | 119 | if (plugins) {
|
101 |
| - plugins.forEach(function (plugin) { |
| 120 | + plugins.forEach(function(plugin) { |
102 | 121 | if (Array.isArray(plugin)) {
|
103 |
| - parser.use.apply(parser, plugin) |
| 122 | + parser.use.apply(parser, plugin); |
104 | 123 | } else {
|
105 |
| - parser.use(plugin) |
| 124 | + parser.use(plugin); |
106 | 125 | }
|
107 |
| - }) |
| 126 | + }); |
108 | 127 | }
|
109 | 128 | }
|
110 | 129 |
|
111 | 130 | /**
|
112 | 131 | * override default parser rules by adding v-pre attribute on 'code' and 'pre' tags
|
113 | 132 | * @param {Array<string>} rules rules to override
|
114 | 133 | */
|
115 |
| - function overrideParserRules (rules) { |
| 134 | + function overrideParserRules(rules) { |
116 | 135 | if (parser && parser.renderer && parser.renderer.rules) {
|
117 |
| - var parserRules = parser.renderer.rules |
118 |
| - rules.forEach(function (rule) { |
| 136 | + var parserRules = parser.renderer.rules; |
| 137 | + rules.forEach(function(rule) { |
119 | 138 | if (parserRules && parserRules[rule]) {
|
120 |
| - var defaultRule = parserRules[rule] |
121 |
| - parserRules[rule] = function () { |
122 |
| - return addVuePreviewAttr(defaultRule.apply(this, arguments)) |
123 |
| - } |
| 139 | + var defaultRule = parserRules[rule]; |
| 140 | + parserRules[rule] = function() { |
| 141 | + return addVuePreviewAttr(defaultRule.apply(this, arguments)); |
| 142 | + }; |
124 | 143 | }
|
125 |
| - }) |
| 144 | + }); |
126 | 145 | }
|
127 | 146 | }
|
128 | 147 |
|
129 |
| - overrideParserRules([ 'code_inline', 'code_block', 'fence' ]) |
| 148 | + overrideParserRules(["code_inline", "code_block", "fence"]); |
130 | 149 |
|
131 | 150 | if (preprocess) {
|
132 |
| - source = preprocess.call(this, parser, source) |
| 151 | + source = preprocess.call(this, parser, source); |
133 | 152 | }
|
134 | 153 |
|
135 |
| - source = source.replace(/@/g, '__at__') |
| 154 | + source = source.replace(/@/g, "__at__"); |
136 | 155 |
|
137 |
| - var content = parser.render(source).replace(/__at__/g, '@') |
138 |
| - var result = renderVueTemplate(content) |
| 156 | + var content = parser.render(source).replace(/__at__/g, "@"); |
| 157 | + var result = renderVueTemplate(content); |
139 | 158 |
|
140 | 159 | if (opts.raw) {
|
141 |
| - return result |
| 160 | + return result; |
142 | 161 | } else {
|
143 |
| - return 'module.exports = ' + JSON.stringify(result) |
| 162 | + return "module.exports = " + JSON.stringify(result); |
144 | 163 | }
|
145 |
| -} |
| 164 | +}; |
0 commit comments