diff --git a/packages/vant-markdown-loader/src/extract-demo.js b/packages/vant-markdown-loader/src/extract-demo.js new file mode 100644 index 000000000..58eaf4ef1 --- /dev/null +++ b/packages/vant-markdown-loader/src/extract-demo.js @@ -0,0 +1,24 @@ +const path = require('path'); + +module.exports = function extraDemo(content) { + const demoLinks = []; + + /* + * 提取 README 中的 demo 文件路径,例如下面的内容,就会提取为 ['./demo-link/index.vue'] + * ```demo + * ./demo-link/index.vue + * ``` + */ + content = content.replace( + /
([\s\S]*?)<\/code><\/pre>/g,
+ function (_, link) {
+ link = link.trim(); // 去换行符
+ demoLinks.push(link);
+ const demoFileName = path.basename(link, '.vue'); // 获取文件名
+ const tag = demoFileName.replace(/\B([A-Z])/g, '-$1').toLowerCase(); // 驼峰转连字符
+ return `<${tag} />`;
+ }
+ );
+
+ return [content, demoLinks];
+};
diff --git a/packages/vant-markdown-loader/src/index.js b/packages/vant-markdown-loader/src/index.js
index 824d70658..3b4f31a61 100644
--- a/packages/vant-markdown-loader/src/index.js
+++ b/packages/vant-markdown-loader/src/index.js
@@ -1,3 +1,4 @@
+const path = require('path');
const loaderUtils = require('loader-utils');
const MarkdownIt = require('markdown-it');
const markdownItAnchor = require('markdown-it-anchor');
@@ -5,18 +6,42 @@ const frontMatter = require('front-matter');
const highlight = require('./highlight');
const linkOpen = require('./link-open');
const cardWrapper = require('./card-wrapper');
+const extractDemo = require('./extract-demo');
+const sideEffectTags = require('./side-effect-tags');
const { slugify } = require('transliteration');
+function camelize(str) {
+ return str.replace(/-(\w)/g, (_, c) => (c ? c.toUpperCase() : ''));
+}
+
function wrapper(content) {
+ const markdownDir = path.dirname(this.resourcePath);
+ let demoLinks;
+ let styles;
+ [content, demoLinks] = extractDemo(content);
+ [content, styles] = sideEffectTags(content);
content = cardWrapper(content);
- content = escape(content);
-
return `
-import { h } from 'vue';
+
+
+ ${content}
+
+
-const content = unescape(\`${content}\`);
+
+
+${styles.join('\n')}
`;
}
@@ -72,5 +96,5 @@ module.exports = function (source) {
linkOpen(parser);
}
- return options.wrapper(parser.render(source), fm);
+ return options.wrapper.call(this, parser.render(source), fm);
};
diff --git a/packages/vant-markdown-loader/src/side-effect-tags.js b/packages/vant-markdown-loader/src/side-effect-tags.js
new file mode 100644
index 000000000..a7f99fd5b
--- /dev/null
+++ b/packages/vant-markdown-loader/src/side-effect-tags.js
@@ -0,0 +1,14 @@
+module.exports = function sideEffectTags(content) {
+ const styles = [];
+
+ // 从模版中移除 script 标签
+ content = content.replace(/