diff --git a/packages/vant-markdown-loader/src/extract-demo.js b/packages/vant-markdown-loader/src/extract-demo.js index 58eaf4ef1..b142fce78 100644 --- a/packages/vant-markdown-loader/src/extract-demo.js +++ b/packages/vant-markdown-loader/src/extract-demo.js @@ -1,22 +1,33 @@ const path = require('path'); +const fs = require('fs'); +const parser = require('./md-parser'); + +function hyphenate(str) { + return str.replace(/\B([A-Z])/g, '-$1').toLowerCase(); +} module.exports = function extraDemo(content) { + const markdownDir = path.dirname(this.resourcePath); const demoLinks = []; - /* - * 提取 README 中的 demo 文件路径,例如下面的内容,就会提取为 ['./demo-link/index.vue'] - * ```demo - * ./demo-link/index.vue - * ``` - */ content = content.replace( - /
([\s\S]*?)<\/code><\/pre>/g,
-    function (_, link) {
+    /([\s\S]*?)<\/demo-code>/g,
+    function (_, attrs, 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} />`;
+      const tag = hyphenate(path.basename(link, '.vue'));
+      const fullLink = path.join(markdownDir, link);
+      demoLinks.indexOf(fullLink) === -1 && demoLinks.push(fullLink);
+      const demoContent = fs.readFileSync(fullLink, { encoding: 'utf8' });
+      const demoParseredContent = parser.render(
+        '```html\n' + demoContent + '\n```'
+      );
+      return `
+        
+          <${tag} />
+        
+      `;
     }
   );
 
diff --git a/packages/vant-markdown-loader/src/index.js b/packages/vant-markdown-loader/src/index.js
index 3b4f31a61..849b166bc 100644
--- a/packages/vant-markdown-loader/src/index.js
+++ b/packages/vant-markdown-loader/src/index.js
@@ -1,24 +1,20 @@
 const path = require('path');
 const loaderUtils = require('loader-utils');
-const MarkdownIt = require('markdown-it');
-const markdownItAnchor = require('markdown-it-anchor');
 const frontMatter = require('front-matter');
-const highlight = require('./highlight');
+const parser = require('./md-parser');
 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, demoLinks] = extractDemo.call(this, content);
   [content, styles] = sideEffectTags(content);
   content = cardWrapper(content);
   return `
@@ -31,9 +27,7 @@ function wrapper(content) {