| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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 cfg = require('./../src/config.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 argv = process.argv[2];
- let packages = [];
- const kebabCase = (str) => {
- str = str.replace(str.charAt(0), str.charAt(0).toLocaleLowerCase());
- return str.replace(/([a-z])([A-Z])/g, (_, p1, p2) => p1 + '-' + p2.toLowerCase());
- };
- const getCompName = (name) => {
- if(!packages.length) {
- cfg.nav.forEach((item, index) => {
- packages = packages.concat(item.packages);
- });
- }
- const packageName = packages.find((item) => item.name.toLowerCase() === name.toLowerCase());
- return packageName.name
- }
- 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 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()) {
- let absolutePath = path.join(`${basePath}/${componentDir}`, `doc.md`);
- if(argv === 'taro') {
- absolutePath = path.join(`${basePath}/${componentDir}`, `doc.taro.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.replace(/`.*?`/g, '')}` : '';
- 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'
- }
- });
- }
- let compoName = kebabCase(getCompName(componentDir));
- typesData.contributions.html.tags.push({
- name: `nut-${compoName}`,
- slots: [],
- events: [],
- attributes: attributes.slice()
- });
- }
- }
- return typesData;
- };
- 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);
- };
- writeWebTypes();
|