|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const fs = require('fs'); |
| 4 | +const path = require('path'); |
| 5 | +const util = require('util'); |
| 6 | +const jsdoc = require('./jsdocparser.js'); |
| 7 | +const ejs = require('ejs'); |
| 8 | +const template = require('./template.js'); |
| 9 | + |
| 10 | +const sets = {}; |
| 11 | + |
| 12 | +const generateMetadata = filename => { |
| 13 | + const obj = jsdoc.processFile(filename); |
| 14 | + obj.jsdocSourceFile = filename; |
| 15 | + |
| 16 | + const setName = path.basename(path.dirname(filename)); |
| 17 | + |
| 18 | + const hasDescriptions = !!obj.description || |
| 19 | + obj.constructors.some(constructor => !!constructor.description) || |
| 20 | + obj.instanceMembers.some(member => !!member.description) || |
| 21 | + obj.prototypeMembers.some(member => !!member.description); |
| 22 | + |
| 23 | + const metadata = { |
| 24 | + name: obj.name, |
| 25 | + setName: setName, |
| 26 | + hasDescriptions: hasDescriptions |
| 27 | + }; |
| 28 | + |
| 29 | + const addMembers = name => { |
| 30 | + metadata[name] = obj[name].map(member => ({ name: member.name, onname: member.onname })); |
| 31 | + }; |
| 32 | + |
| 33 | + addMembers('instanceProperties'); |
| 34 | + addMembers('instanceMethods'); |
| 35 | + addMembers('instanceEvents'); |
| 36 | + addMembers('properties'); |
| 37 | + addMembers('methods'); |
| 38 | + |
| 39 | + let set = sets[setName]; |
| 40 | + if (!set) { |
| 41 | + set = sets[setName] = []; |
| 42 | + } |
| 43 | + set.push(metadata); |
| 44 | + |
| 45 | + const pretty = false; |
| 46 | + const json = JSON.stringify(metadata, null, pretty ? ' ' : undefined); |
| 47 | + |
| 48 | + fs.writeFileSync(`./tmp/metadata/${obj.name}.json`, json, { flag: 'wx' }); |
| 49 | + |
| 50 | + obj.apiSet = { name: setName }; |
| 51 | + createPage(obj); |
| 52 | +}; |
| 53 | + |
| 54 | + |
| 55 | +const createPage = (obj) => { |
| 56 | + // Validation |
| 57 | + const errors = []; |
| 58 | + const all = [].concat(obj.overloads, obj.constructors, obj.instanceProperties, obj.instanceMethods, obj.properties, obj.methods); |
| 59 | + |
| 60 | + all.forEach(member => { |
| 61 | + if (!member) { |
| 62 | + errors.push('undefined member in ' + obj.name); |
| 63 | + return; |
| 64 | + } |
| 65 | + |
| 66 | + if (!member.spec) { |
| 67 | + errors.push('No spec for ' + obj.name + '.' + member.name); |
| 68 | + } |
| 69 | + |
| 70 | + if (!member.description) { |
| 71 | + errors.push('No description for ' + obj.name + '.' + member.name); |
| 72 | + } |
| 73 | + |
| 74 | + if (member.type === 'Function') { |
| 75 | + // TODO: check member.parameters |
| 76 | + } |
| 77 | + }); |
| 78 | + |
| 79 | + |
| 80 | + if (errors.length) { |
| 81 | + console.warn(errors.join('\n')); |
| 82 | + } |
| 83 | + |
| 84 | + const body = template.render('object', { obj }); |
| 85 | + |
| 86 | + const title = obj.name + ' JavaScript API'; |
| 87 | + const html = template.render('page', { title, body, obj }); |
| 88 | + |
| 89 | + fs.writeFileSync(`./docs/${obj.name}.html`, html); |
| 90 | +}; |
| 91 | + |
| 92 | + |
| 93 | +fs.rmdirSync('./tmp', { recursive: true }); |
| 94 | +fs.mkdirSync('./tmp/metadata', { recursive: true }); |
| 95 | + |
| 96 | +fs.readdirSync('./docs').map(doc => { |
| 97 | + fs.unlinkSync(`./docs/${doc}`); |
| 98 | + }); |
| 99 | + |
| 100 | +fs.readdirSync('./content').map(set => { |
| 101 | + fs.readdirSync(`./content/${set}/`).map(doc => { |
| 102 | + generateMetadata(`./content/${set}/${doc}`); |
| 103 | + }); |
| 104 | + }); |
| 105 | + |
| 106 | +fs.writeFileSync('./tmp/apisets.json', JSON.stringify(sets)); |
| 107 | + |
| 108 | +const makeCustomPage = (page, extension = 'html') => { |
| 109 | + const locals = { |
| 110 | + apiSets: sets, |
| 111 | + wrapInPageTemplate: true |
| 112 | + }; |
| 113 | + |
| 114 | + let output = template.render(page, locals); |
| 115 | + if (locals.wrapInPageTemplate) { |
| 116 | + locals.body = output; |
| 117 | + output = template.render('page', locals); |
| 118 | + } |
| 119 | + |
| 120 | + fs.writeFileSync(`./docs/${page}.${extension}`, output); |
| 121 | +}; |
| 122 | + |
| 123 | +makeCustomPage('feedback'); |
| 124 | +makeCustomPage('index'); |
| 125 | +makeCustomPage('license'); |
| 126 | +makeCustomPage('thankyou'); |
| 127 | +makeCustomPage('javascripture', 'js'); |
| 128 | + |
| 129 | +fs.readdirSync('./static').map(file => { |
| 130 | + fs.copyFile(`./static/${file}`, `./docs/${file}`, err => { if (err) { throw err } }); |
| 131 | + }); |
| 132 | + |
0 commit comments