| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- const path = require('path');
- const fs = require('fs');
- const MarkdownIt = require('markdown-it')();
- const basePath = path.resolve(__dirname, './../src/packages/__VUE');
- const componentDirs = fs.readdirSync(basePath, 'utf8');
- const config = require('./../package.json');
- const TYPE_IDENTIFY_OPEN = 'tbody_open';
- const TYPE_IDENTIFY_CLOSE = 'tbody_close';
- const TR_TYPE_IDENTIFY_OPEN = 'tr_open';
- const TR_TYPE_IDENTIFY_CLOSE = 'tr_close';
- const getSubSources = (sources) => {
- let sourcesMap = [];
- const startIndex = sources.findIndex((source) => source.type === TYPE_IDENTIFY_OPEN);
- const endIndex = sources.findIndex((source) => source.type === TYPE_IDENTIFY_CLOSE);
- sources = sources.slice(startIndex, endIndex + 1);
- while (sources.filter((source) => source.type === TR_TYPE_IDENTIFY_OPEN).length) {
- let trStartIndex = sources.findIndex((source) => source.type === TR_TYPE_IDENTIFY_OPEN);
- let trEndIndex = sources.findIndex((source) => source.type === TR_TYPE_IDENTIFY_CLOSE);
- sourcesMap.push(sources.slice(trStartIndex, trEndIndex + 1));
- sources.splice(trStartIndex, trEndIndex - trStartIndex + 1);
- }
- return sourcesMap;
- };
- const genaratorTags = () => {
- let componentTags = {};
- if (!componentDirs.length) return;
- for (let componentDir of componentDirs) {
- let stat = fs.lstatSync(`${basePath}/${componentDir}`);
- if (stat.isDirectory()) {
- const absolutePath = path.join(`${basePath}/${componentDir}`, 'doc.md');
- if (!fs.existsSync(absolutePath)) continue;
- const data = fs.readFileSync(absolutePath, 'utf8');
- let sources = MarkdownIt.parse(data, {});
- let sourcesMap = getSubSources(sources);
- componentTags[`nut-${componentDir}`] = { attributes: [] };
- for (let sourceMap of sourcesMap) {
- let propItem = sourceMap.filter((source) => source.type === 'inline').length
- ? `${sourceMap.filter((source) => source.type === 'inline')[0].content}`
- : '';
- componentTags[`nut-${componentDir}`]['attributes'].push(propItem);
- }
- }
- }
- return componentTags;
- };
- const genaratorAttributes = () => {
- let componentTags = {};
- if (!componentDirs.length) return;
- for (let componentDir of componentDirs) {
- let stat = fs.lstatSync(`${basePath}/${componentDir}`);
- if (stat.isDirectory()) {
- const absolutePath = path.join(`${basePath}/${componentDir}`, 'doc.md');
- if (!fs.existsSync(absolutePath)) continue;
- const data = fs.readFileSync(absolutePath, 'utf8');
- let sources = MarkdownIt.parse(data, {});
- let sourcesMap = getSubSources(sources);
- for (let sourceMap of sourcesMap) {
- const inlineItem = sourceMap.filter((source) => source.type === 'inline').length
- ? sourceMap.filter((source) => source.type === 'inline')
- : [];
- const propItem = inlineItem.length ? `${inlineItem[0].content}` : '';
- const infoItem = inlineItem.length ? `${inlineItem[1].content}` : '';
- const typeItem = inlineItem.length ? `${inlineItem[2].content.toLowerCase()}` : '';
- const defaultItem = inlineItem.length ? `${inlineItem[3].content}` : '';
- componentTags[`nut-${componentDir}/${propItem}`] = {
- type: `${typeItem}`,
- description: `属性说明:${infoItem},默认值:${defaultItem}`
- };
- }
- }
- }
- return componentTags;
- };
- const genaratorWebTypes = () => {
- let typesData = {
- $schema: 'https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json',
- framework: 'vue',
- name: 'NutUI',
- version: config.version,
- contributions: {
- html: {
- tags: [],
- attributes: [],
- 'types-syntax': 'typescript'
- }
- }
- };
- if (!componentDirs.length) return;
- for (let componentDir of componentDirs) {
- let stat = fs.lstatSync(`${basePath}/${componentDir}`);
- if (stat.isDirectory()) {
- const absolutePath = path.join(`${basePath}/${componentDir}`, 'doc.md');
- let attributes = [];
- if (!fs.existsSync(absolutePath)) continue;
- const data = fs.readFileSync(absolutePath, 'utf8');
- let sources = MarkdownIt.parse(data, {});
- let sourcesMap = getSubSources(sources);
- for (let sourceMap of sourcesMap) {
- const inlineItem = sourceMap.filter((source) => source.type === 'inline').length
- ? sourceMap.filter((source) => source.type === 'inline')
- : [];
- const propItem = inlineItem.length ? `${inlineItem[0].content}` : '';
- const infoItem = inlineItem.length ? `${inlineItem[1].content}` : '';
- const typeItem = inlineItem.length ? `${inlineItem[2].content.toLowerCase()}` : '';
- const defaultItem = inlineItem.length ? `${inlineItem[3].content}` : '';
- attributes.push({
- name: propItem,
- default: defaultItem,
- description: infoItem,
- value: {
- type: typeItem,
- kind: 'expression'
- }
- });
- }
- typesData.contributions.html.tags.push({
- name: `nut-${componentDir}`,
- slots: [],
- events: [],
- attributes: attributes.slice()
- });
- }
- }
- return typesData;
- };
- const writeTags = () => {
- const componentTags = genaratorTags();
- let innerText = `${JSON.stringify(componentTags, null, 2)}`;
- const distPath = path.resolve(__dirname, './../dist');
- const componentTagsPath = path.resolve(__dirname, './../dist/smartips/tags.json');
- if (!fs.existsSync(path.join(distPath + '/smartips'))) {
- fs.mkdirSync(path.join(distPath + '/smartips'));
- }
- fs.writeFileSync(componentTagsPath, innerText);
- };
- const writeAttributes = () => {
- const componentAttributes = genaratorAttributes();
- let innerText = `${JSON.stringify(componentAttributes, null, 2)}`;
- const distPath = path.resolve(__dirname, './../dist');
- const componentAttributespPath = path.resolve(__dirname, './../dist/smartips/attributes.json');
- if (!fs.existsSync(path.join(distPath + '/smartips'))) {
- fs.mkdirSync(path.join(distPath + '/smartips'));
- }
- fs.writeFileSync(componentAttributespPath, innerText);
- };
- const writeWebTypes = () => {
- const typesData = genaratorWebTypes();
- let innerText = `${JSON.stringify(typesData, null, 2)}`;
- const distPath = path.resolve(__dirname, './../dist');
- const componentWebTypespPath = path.resolve(__dirname, './../dist/smartips/web-types.json');
- if (!fs.existsSync(path.join(distPath + '/smartips'))) {
- fs.mkdirSync(path.join(distPath + '/smartips'));
- }
- fs.writeFileSync(componentWebTypespPath, innerText);
- };
- writeTags();
- writeAttributes();
- writeWebTypes();
|