spec-up-t 1.0.55 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/compiled/body.js +3 -3
- package/gulpfile.js +7 -7
- package/index.js +60 -56
- package/package.json +11 -11
- package/src/create-term-index.js +2 -4
- package/templates/template.html +2 -2
- package/assets/test.json +0 -5
- package/assets/test.text +0 -1
- package/custom-assets/custom-body.js +0 -5
- package/custom-assets/custom-head.js +0 -1
- package/custom-assets/custom.css +0 -6
- package/custom-assets/module-test.js +0 -8
- package/term-index.json +0 -6
package/gulpfile.js
CHANGED
|
@@ -15,7 +15,7 @@ const assets = fs.readJsonSync('./src/asset-map.json');
|
|
|
15
15
|
|
|
16
16
|
let compileLocation = 'assets/compiled';
|
|
17
17
|
|
|
18
|
-
async function fetchSpecRefs(){
|
|
18
|
+
async function fetchSpecRefs() {
|
|
19
19
|
return Promise.all([
|
|
20
20
|
axios.get('https://raw.githubusercontent.com/tobie/specref/master/refs/ietf.json'),
|
|
21
21
|
axios.get('https://raw.githubusercontent.com/tobie/specref/master/refs/w3c.json'),
|
|
@@ -26,7 +26,7 @@ async function fetchSpecRefs(){
|
|
|
26
26
|
}).catch(e => console.log(e));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
async function compileAssets(){
|
|
29
|
+
async function compileAssets() {
|
|
30
30
|
await fs.ensureDir(compileLocation);
|
|
31
31
|
return new Promise(resolve => {
|
|
32
32
|
mergeStreams(
|
|
@@ -42,23 +42,23 @@ async function compileAssets(){
|
|
|
42
42
|
.pipe(terser())
|
|
43
43
|
.pipe(concat('body.js'))
|
|
44
44
|
.pipe(gulp.dest(compileLocation))
|
|
45
|
-
).on('finish', function() {
|
|
45
|
+
).on('finish', function () {
|
|
46
46
|
resolve();
|
|
47
47
|
})
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
function runCommand(cmd){
|
|
51
|
+
function runCommand(cmd) {
|
|
52
52
|
return new Promise((resolve, reject) => {
|
|
53
53
|
exec(cmd, {}, error => error ? reject() : resolve());
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
async function bumpVersion(){
|
|
58
|
-
return runCommand(`npm version --no-git-tag-version ${
|
|
57
|
+
async function bumpVersion() {
|
|
58
|
+
return runCommand(`npm version --no-git-tag-version ${argv.v || 'patch'}`);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
async function renderSpecs(){
|
|
61
|
+
async function renderSpecs() {
|
|
62
62
|
return runCommand('npm run render');
|
|
63
63
|
}
|
|
64
64
|
|
package/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
module.exports = function(options = {}) {
|
|
2
|
+
module.exports = function (options = {}) {
|
|
3
3
|
const fs = require('fs-extra');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
|
|
@@ -11,18 +11,21 @@ module.exports = function(options = {}) {
|
|
|
11
11
|
|
|
12
12
|
const { runJsonKeyValidatorSync } = require('./src/json-key-validator.js');
|
|
13
13
|
runJsonKeyValidatorSync();
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
const { createTermRelations } = require('./src/create-term-relations.js');
|
|
16
16
|
createTermRelations();
|
|
17
|
+
|
|
18
|
+
const { createTermIndex } = require('./src/create-term-index.js');
|
|
19
|
+
createTermIndex();
|
|
17
20
|
|
|
18
21
|
const { insertTermIndex } = require('./src/insert-term-index.js');
|
|
19
22
|
insertTermIndex();
|
|
20
|
-
|
|
23
|
+
|
|
21
24
|
const gulp = require('gulp');
|
|
22
25
|
const findPkgDir = require('find-pkg-dir');
|
|
23
26
|
const modulePath = findPkgDir(__dirname);
|
|
24
27
|
let config = fs.readJsonSync('./output/specs-generated.json');
|
|
25
|
-
|
|
28
|
+
|
|
26
29
|
const createVersionsIndex = require('./src/create-versions-index.js');
|
|
27
30
|
createVersionsIndex(config.specs[0].output_path);
|
|
28
31
|
|
|
@@ -38,7 +41,7 @@ module.exports = function(options = {}) {
|
|
|
38
41
|
const replacers = [
|
|
39
42
|
{
|
|
40
43
|
test: 'insert',
|
|
41
|
-
transform: function(path){
|
|
44
|
+
transform: function (path) {
|
|
42
45
|
if (!path) return '';
|
|
43
46
|
return fs.readFileSync(path, 'utf8');
|
|
44
47
|
}
|
|
@@ -46,7 +49,7 @@ module.exports = function(options = {}) {
|
|
|
46
49
|
];
|
|
47
50
|
|
|
48
51
|
const { processMarkdownFiles } = require('./src/fix-markdown-files.js');
|
|
49
|
-
|
|
52
|
+
|
|
50
53
|
// Synchonously process markdown files
|
|
51
54
|
processMarkdownFiles(path.join(config.specs[0].spec_directory, config.specs[0].spec_terms_directory));
|
|
52
55
|
|
|
@@ -64,11 +67,11 @@ module.exports = function(options = {}) {
|
|
|
64
67
|
});
|
|
65
68
|
}
|
|
66
69
|
|
|
67
|
-
function normalizePath(path){
|
|
70
|
+
function normalizePath(path) {
|
|
68
71
|
return path.trim().replace(/\/$/g, '') + '/';
|
|
69
72
|
}
|
|
70
73
|
|
|
71
|
-
function renderRefGroup(type){
|
|
74
|
+
function renderRefGroup(type) {
|
|
72
75
|
let group = specGroups[type];
|
|
73
76
|
if (!group) return '';
|
|
74
77
|
let html = Object.keys(group).sort().reduce((html, name) => {
|
|
@@ -84,14 +87,14 @@ module.exports = function(options = {}) {
|
|
|
84
87
|
return `\n${html}\n</dl>\n`;
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
function findKatexDist(){
|
|
90
|
+
function findKatexDist() {
|
|
88
91
|
const relpath = "node_modules/katex/dist";
|
|
89
92
|
const paths = [
|
|
90
93
|
path.join(process.cwd(), relpath),
|
|
91
94
|
path.join(__dirname, relpath),
|
|
92
95
|
];
|
|
93
|
-
for(const abspath of paths) {
|
|
94
|
-
if(fs.existsSync(abspath)) {
|
|
96
|
+
for (const abspath of paths) {
|
|
97
|
+
if (fs.existsSync(abspath)) {
|
|
95
98
|
return abspath
|
|
96
99
|
}
|
|
97
100
|
}
|
|
@@ -115,16 +118,16 @@ module.exports = function(options = {}) {
|
|
|
115
118
|
const specCorpus = fs.readJsonSync(modulePath + '/assets/compiled/refs.json');
|
|
116
119
|
const containers = require('markdown-it-container');
|
|
117
120
|
const md = require('markdown-it')({
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
html: true,
|
|
122
|
+
linkify: true,
|
|
123
|
+
typographer: true
|
|
124
|
+
})
|
|
122
125
|
.use(require('./src/markdown-it-extensions.js'), [
|
|
123
126
|
{
|
|
124
127
|
filter: type => type.match(terminologyRegex),
|
|
125
|
-
parse(token, type, primary){
|
|
128
|
+
parse(token, type, primary) {
|
|
126
129
|
if (!primary) return;
|
|
127
|
-
if (type === 'def'){
|
|
130
|
+
if (type === 'def') {
|
|
128
131
|
definitions.push(token.info.args);
|
|
129
132
|
return token.info.args.reduce((acc, syn) => {
|
|
130
133
|
return `<span id="term:${syn.replace(spaceRegex, '-').toLowerCase()}">${acc}</span>`;
|
|
@@ -144,13 +147,13 @@ module.exports = function(options = {}) {
|
|
|
144
147
|
},
|
|
145
148
|
{
|
|
146
149
|
filter: type => type.match(specNameRegex),
|
|
147
|
-
parse(token, type, name){
|
|
150
|
+
parse(token, type, name) {
|
|
148
151
|
if (name) {
|
|
149
152
|
let _name = name.replace(spaceRegex, '-').toUpperCase();
|
|
150
153
|
let spec = specCorpus[_name] ||
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
+
specCorpus[_name.toLowerCase()] ||
|
|
155
|
+
specCorpus[name.toLowerCase()] ||
|
|
156
|
+
specCorpus[name];
|
|
154
157
|
if (spec) {
|
|
155
158
|
spec._name = _name;
|
|
156
159
|
let group = specGroups[type] = specGroups[type] || {};
|
|
@@ -158,8 +161,8 @@ module.exports = function(options = {}) {
|
|
|
158
161
|
}
|
|
159
162
|
}
|
|
160
163
|
},
|
|
161
|
-
render(token, type, name){
|
|
162
|
-
if (name){
|
|
164
|
+
render(token, type, name) {
|
|
165
|
+
if (name) {
|
|
163
166
|
let spec = token.info.spec;
|
|
164
167
|
if (spec) return `[<a class="spec-reference" href="#ref:${spec._name}">${spec._name}</a>]`;
|
|
165
168
|
}
|
|
@@ -179,12 +182,12 @@ module.exports = function(options = {}) {
|
|
|
179
182
|
.use(require('markdown-it-sup'))
|
|
180
183
|
.use(require('markdown-it-task-lists'))
|
|
181
184
|
.use(require('markdown-it-multimd-table'), {
|
|
182
|
-
multiline:
|
|
183
|
-
rowspan:
|
|
185
|
+
multiline: true,
|
|
186
|
+
rowspan: true,
|
|
184
187
|
headerless: true
|
|
185
188
|
})
|
|
186
189
|
.use(containers, 'notice', {
|
|
187
|
-
validate: function(params) {
|
|
190
|
+
validate: function (params) {
|
|
188
191
|
let matches = params.match(/(\w+)\s?(.*)?/);
|
|
189
192
|
return matches && noticeTypes[matches[1]];
|
|
190
193
|
},
|
|
@@ -194,7 +197,7 @@ module.exports = function(options = {}) {
|
|
|
194
197
|
let id;
|
|
195
198
|
let type = matches[1];
|
|
196
199
|
if (matches[2]) {
|
|
197
|
-
id = matches[2].trim().replace(/\s+/g
|
|
200
|
+
id = matches[2].trim().replace(/\s+/g, '-').toLowerCase();
|
|
198
201
|
if (noticeTitles[id]) id += '-' + noticeTitles[id]++;
|
|
199
202
|
else noticeTitles[id] = 1;
|
|
200
203
|
}
|
|
@@ -214,7 +217,7 @@ module.exports = function(options = {}) {
|
|
|
214
217
|
anchorClassName: 'toc-anchor'
|
|
215
218
|
})
|
|
216
219
|
.use(require('@traptitech/markdown-it-katex'))
|
|
217
|
-
|
|
220
|
+
|
|
218
221
|
// Custom plugin to add class to <dl> and the last <dd> in each series after a <dt>
|
|
219
222
|
function addClassToDefinitionList(md) {
|
|
220
223
|
const originalRender = md.renderer.rules.dl_open || function (tokens, idx, options, env, self) {
|
|
@@ -272,11 +275,11 @@ module.exports = function(options = {}) {
|
|
|
272
275
|
noticeTitles = {};
|
|
273
276
|
specGroups = {};
|
|
274
277
|
console.log('\n SPEC-UP-T: Rendering: ' + spec.title + "\n");
|
|
275
|
-
|
|
278
|
+
|
|
276
279
|
function interpolate(template, variables) {
|
|
277
280
|
return template.replace(/\${(.*?)}/g, (match, p1) => variables[p1.trim()]);
|
|
278
281
|
}
|
|
279
|
-
|
|
282
|
+
|
|
280
283
|
return new Promise(async (resolve, reject) => {
|
|
281
284
|
Promise.all((spec.markdown_paths || ['spec.md']).map(_path => {
|
|
282
285
|
return fs.readFile(spec.spec_directory + _path, 'utf8').catch(e => reject(e))
|
|
@@ -301,34 +304,35 @@ module.exports = function(options = {}) {
|
|
|
301
304
|
externalReferences: JSON.stringify(externalReferences),
|
|
302
305
|
xrefsData: xrefsData,
|
|
303
306
|
specLogo: spec.logo,
|
|
307
|
+
specFavicon: spec.favicon,
|
|
304
308
|
specLogoLink: spec.logo_link,
|
|
305
309
|
spec: JSON.stringify(spec)
|
|
306
310
|
});
|
|
307
|
-
|
|
311
|
+
|
|
308
312
|
fs.writeFile(path.join(spec.destination, 'index.html'),
|
|
309
313
|
templateInterpolated, 'utf8'
|
|
310
314
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
315
|
+
, function (err, data) {
|
|
316
|
+
if (err) {
|
|
317
|
+
reject(err);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
resolve();
|
|
321
|
+
}
|
|
322
|
+
});
|
|
319
323
|
validateReferences(references, definitions, render);
|
|
320
324
|
references = [];
|
|
321
325
|
definitions = [];
|
|
322
326
|
});
|
|
323
327
|
});
|
|
324
328
|
}
|
|
325
|
-
catch(e) {
|
|
329
|
+
catch (e) {
|
|
326
330
|
console.error("\n SPEC-UP-T: " + e + "\n");
|
|
327
331
|
}
|
|
328
332
|
}
|
|
329
333
|
|
|
330
334
|
config.specs.forEach(spec => {
|
|
331
|
-
spec.spec_directory = normalizePath(spec.spec_directory);
|
|
335
|
+
spec.spec_directory = normalizePath(spec.spec_directory);
|
|
332
336
|
spec.destination = normalizePath(spec.output_path || spec.spec_directory);
|
|
333
337
|
|
|
334
338
|
fs.ensureDirSync(spec.destination);
|
|
@@ -343,40 +347,40 @@ module.exports = function(options = {}) {
|
|
|
343
347
|
assets.css += `<link href="${asset.path}" rel="stylesheet"/>`;
|
|
344
348
|
}
|
|
345
349
|
if (ext === 'js') {
|
|
346
|
-
assets.js[asset.inject || 'body'] += `<script src="${asset.path}" ${
|
|
350
|
+
assets.js[asset.inject || 'body'] += `<script src="${asset.path}" ${asset.module ? 'type="module"' : ''} ></script>`;
|
|
347
351
|
}
|
|
348
352
|
return assets;
|
|
349
353
|
}, {
|
|
350
354
|
css: '',
|
|
351
355
|
js: { head: '', body: '' }
|
|
352
|
-
});
|
|
356
|
+
});
|
|
353
357
|
|
|
354
358
|
if (options.dev) {
|
|
355
|
-
assetTags.head = assets.head.css.map(_path => `<link href="${_path}" rel="stylesheet"/>`).join('') +
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
assetTags.body = assets.body.js.map(_path => `<script src="${_path}" data-manual></script>`).join('') +
|
|
360
|
-
|
|
359
|
+
assetTags.head = assets.head.css.map(_path => `<link href="${_path}" rel="stylesheet"/>`).join('') +
|
|
360
|
+
customAssets.css +
|
|
361
|
+
assets.head.js.map(_path => `<script src="${_path}"></script>`).join('') +
|
|
362
|
+
customAssets.js.head;
|
|
363
|
+
assetTags.body = assets.body.js.map(_path => `<script src="${_path}" data-manual></script>`).join('') +
|
|
364
|
+
customAssets.js.body;
|
|
361
365
|
}
|
|
362
366
|
else {
|
|
363
367
|
assetTags.head = `
|
|
364
368
|
<style>${fs.readFileSync(modulePath + '/assets/compiled/head.css', 'utf8')}</style>
|
|
365
|
-
${
|
|
369
|
+
${customAssets.css}
|
|
366
370
|
<script>${fs.readFileSync(modulePath + '/assets/compiled/head.js', 'utf8')}</script>
|
|
367
|
-
${
|
|
371
|
+
${customAssets.js.head}
|
|
368
372
|
`;
|
|
369
373
|
assetTags.body = `<script>${fs.readFileSync(modulePath + '/assets/compiled/body.js', 'utf8')}</script>
|
|
370
|
-
|
|
374
|
+
${customAssets.js.body}`;
|
|
371
375
|
}
|
|
372
376
|
|
|
373
377
|
if (spec.katex) {
|
|
374
378
|
const katexDist = findKatexDist();
|
|
375
379
|
assetTags.body += `<script>/* katex */${fs.readFileSync(path.join(katexDist, 'katex.min.js'),
|
|
376
|
-
|
|
380
|
+
'utf8')}</script>`;
|
|
377
381
|
assetTags.body += `<style>/* katex */${fs.readFileSync(path.join(katexDist, 'katex.min.css'),
|
|
378
|
-
|
|
379
|
-
|
|
382
|
+
'utf8')}</style>`;
|
|
383
|
+
|
|
380
384
|
fs.copySync(path.join(katexDist, 'fonts'), path.join(spec.destination, 'fonts'));
|
|
381
385
|
}
|
|
382
386
|
|
|
@@ -394,7 +398,7 @@ module.exports = function(options = {}) {
|
|
|
394
398
|
});
|
|
395
399
|
|
|
396
400
|
}
|
|
397
|
-
catch(e) {
|
|
401
|
+
catch (e) {
|
|
398
402
|
console.error("\n SPEC-UP-T: " + e + "\n");
|
|
399
403
|
}
|
|
400
404
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-up-t",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.57",
|
|
4
4
|
"description": "Technical specification drafting tool that generates rich specification documents from markdown. Forked from https://github.com/decentralized-identity/spec-up by Daniel Buchner (https://github.com/csuwildcat)",
|
|
5
5
|
"main": "./index",
|
|
6
6
|
"repository": {
|
|
@@ -28,29 +28,29 @@
|
|
|
28
28
|
"diff": "^7.0.0",
|
|
29
29
|
"find-pkg-dir": "^2.0.0",
|
|
30
30
|
"fs-extra": "^11.2.0",
|
|
31
|
-
"gulp": "
|
|
32
|
-
"gulp-clean-css": "
|
|
33
|
-
"gulp-concat": "
|
|
34
|
-
"gulp-terser": "
|
|
31
|
+
"gulp": "4.0.2",
|
|
32
|
+
"gulp-clean-css": "4.3.0",
|
|
33
|
+
"gulp-concat": "2.6.1",
|
|
34
|
+
"gulp-terser": "1.2.0",
|
|
35
35
|
"jsdom": "^25.0.0",
|
|
36
36
|
"markdown-it": "^13.0.1",
|
|
37
|
-
"markdown-it-anchor": "
|
|
38
|
-
"markdown-it-attrs": "4.1.4",
|
|
37
|
+
"markdown-it-anchor": "^9.2.0",
|
|
38
|
+
"markdown-it-attrs": "^4.1.4",
|
|
39
39
|
"markdown-it-chart": "^0.2.0",
|
|
40
40
|
"markdown-it-container": "^2.0.0",
|
|
41
41
|
"markdown-it-deflist": "^2.1.0",
|
|
42
42
|
"markdown-it-icons": "^0.4.1",
|
|
43
43
|
"markdown-it-ins": "^2.0.0",
|
|
44
44
|
"markdown-it-mark": "^2.0.0",
|
|
45
|
-
"markdown-it-modify-token": "1.0.2",
|
|
45
|
+
"markdown-it-modify-token": "^1.0.2",
|
|
46
46
|
"markdown-it-multimd-table": "^4.1.3",
|
|
47
47
|
"markdown-it-prism": "^2.2.0",
|
|
48
48
|
"markdown-it-references": "1.0.0-alpha.10",
|
|
49
49
|
"markdown-it-sub": "^1.0.0",
|
|
50
50
|
"markdown-it-sup": "^1.0.0",
|
|
51
|
-
"markdown-it-task-lists": "2.1.1",
|
|
52
|
-
"markdown-it-textual-uml": "0.1.3",
|
|
53
|
-
"markdown-it-toc-and-anchor": "4.2.0",
|
|
51
|
+
"markdown-it-task-lists": "^2.1.1",
|
|
52
|
+
"markdown-it-textual-uml": "^0.1.3",
|
|
53
|
+
"markdown-it-toc-and-anchor": "^4.2.0",
|
|
54
54
|
"merge-stream": "^2.0.0",
|
|
55
55
|
"pdf-lib": "^1.17.1",
|
|
56
56
|
"pkg-dir": "^8.0.0",
|
package/src/create-term-index.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Creates a term index by reading specifications from a JSON file and generating a list of file paths.
|
|
3
|
-
* The list of file paths is then written to a JSON file in the project root directory.
|
|
4
|
-
*
|
|
5
2
|
* Steps:
|
|
6
3
|
* 1. Reads the configuration from 'specs.json'.
|
|
7
4
|
* 2. Extracts the directories containing the specifications and terms.
|
|
@@ -25,7 +22,8 @@ function createTermIndex() {
|
|
|
25
22
|
const specDirectories = config.specs.map(spec => spec.spec_directory);
|
|
26
23
|
const specTermDirectoryName = config.specs.map(spec => spec.spec_terms_directory);
|
|
27
24
|
const outputPathJSON = './term-index.json';
|
|
28
|
-
const files = fs.readdirSync(path.join(specDirectories[0], specTermDirectoryName[0]))
|
|
25
|
+
const files = fs.readdirSync(path.join(specDirectories[0], specTermDirectoryName[0]))
|
|
26
|
+
.filter(file => !file.startsWith('_'));
|
|
29
27
|
|
|
30
28
|
const filePaths = files.map(file => specTermDirectoryName[0] + '/' + file);
|
|
31
29
|
|
package/templates/template.html
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
8
|
-
|
|
8
|
+
<meta name="generator" content="Spec-Up-T" />
|
|
9
9
|
<title>${title}</title>
|
|
10
|
-
|
|
10
|
+
<link rel="icon" href="${specFavicon}" type="image/x-icon">
|
|
11
11
|
<link href="https://fonts.googleapis.com/css2?family=Heebo:wght@300;400&display=swap" rel="stylesheet">
|
|
12
12
|
|
|
13
13
|
${assetsHead}
|
package/assets/test.text
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Beam me in, Scotty!
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
console.log('Custom javascript in head')
|
package/custom-assets/custom.css
DELETED