index.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* eslint-disable @typescript-eslint/no-var-requires */
  2. const { stripScript, stripTemplate, genInlineComponentText } = require('./util');
  3. const md = require('./config');
  4. module.exports = function(source) {
  5. const content = md.render(source); //得到来自.md的解析出来的数据
  6. const startTag = '<!--nutui-demo:';
  7. const startTagLen = startTag.length;
  8. const endTag = ':nutui-demo-->';
  9. const endTagLen = endTag.length;
  10. let componenetsString = '';
  11. let id = 0; // demo 的 id
  12. let output = []; // 输出的内容
  13. let start = 0; // 字符串开始位置
  14. let commentStart = content.indexOf(startTag);
  15. let commentEnd = content.indexOf(endTag, commentStart + startTagLen);
  16. while (commentStart !== -1 && commentEnd !== -1) {
  17. output.push(content.slice(start, commentStart));
  18. const commentContent = content.slice(commentStart + startTagLen, commentEnd);
  19. const html = stripTemplate(commentContent); //传入的是demo的代码部分,获取demo中的的html
  20. const script = stripScript(commentContent); //传入的是demo的代码部分,获取demo中的的script
  21. let demoComponentContent = genInlineComponentText(html, script);
  22. const demoComponentName = `nutui-demo${id}`;
  23. //output是一个数组,最终会拼接放入输出vue文件的template里面,也就是这一页的HTML
  24. output.push(`<template #source><${demoComponentName} /></template>`);
  25. componenetsString += `${JSON.stringify(demoComponentName)}: ${demoComponentContent},`;
  26. // 重新计算下一次的位置
  27. // demoComponentName 与id,命名每个demo组件名字用的,id会在while每一次循环+1,这样子组件从第一个到最后一个都不会重名。
  28. id++;
  29. start = commentEnd + endTagLen;
  30. commentStart = content.indexOf(startTag, start);
  31. commentEnd = content.indexOf(endTag, commentStart + startTagLen);
  32. }
  33. // 仅允许在 demo 不存在时,才可以在 Markdown 中写 script 标签
  34. // todo: 优化这段逻辑
  35. let pageScript = '';
  36. if (componenetsString) {
  37. pageScript = `<script lang="ts">
  38. import * as Vue from 'vue';
  39. export default {
  40. name: 'component-doc',
  41. components: {
  42. ${componenetsString}
  43. }
  44. }
  45. </script>`;
  46. } else if (content.indexOf('<script>') === 0) {
  47. // 硬编码,有待改善
  48. start = content.indexOf('</script>') + '</script>'.length;
  49. pageScript = content.slice(0, start);
  50. }
  51. output.push(content.slice(start));
  52. const result = `
  53. <template>
  54. <section class="content nutui-doc">
  55. ${output.join('')}
  56. </section>
  57. </template>
  58. ${pageScript}
  59. `;
  60. return result;
  61. };