| "use strict"; |
| |
| const remark = require("remark"); |
| const findAllAfter = require("unist-util-find-all-after"); |
| |
| function mdParser (source, opts, result) { |
| const htmlInMd = opts.syntax.config.htmlInMd; |
| if (!result && (htmlInMd == null || htmlInMd)) { |
| result = require("postcss-html/extract")(source, opts, []); |
| } |
| const ast = remark().parse(source); |
| const blocks = findAllAfter(ast, 0, (node) => ( |
| node.type === "code" |
| )).map((block) => { |
| if (result && (!block.lang || !/^(?:[sx]?html?|[sx]ht)$/i.test(block.lang))) { |
| result = result.filter(styleHtm => { |
| return styleHtm.startIndex >= block.position.end.offset || |
| styleHtm.startIndex + styleHtm.content.length <= block.position.start.offset; |
| }); |
| } |
| if (block.lang && /^(?:(?:\w*c)|le|wx|sa?|sugar)ss$/i.test(block.lang)) { |
| let startIndex = source.indexOf(block.lang, block.position.start.offset) + block.lang.length; |
| if (block.value) { |
| startIndex = source.indexOf(block.value, startIndex); |
| } else { |
| startIndex = source.indexOf("\n", startIndex) + 1; |
| } |
| return { |
| startIndex: startIndex, |
| lang: block.lang.toLowerCase(), |
| isMarkdown: true, |
| content: source.slice(startIndex, block.position.end.offset).replace(/[ \t]*`*$/, ""), |
| }; |
| } |
| }).filter(Boolean); |
| if (result) { |
| return result.concat(blocks); |
| } else { |
| return blocks; |
| } |
| }; |
| module.exports = mdParser; |