sdocs-dev 1.15.0 → 1.19.2

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.
@@ -0,0 +1,109 @@
1
+ // slides-verify.js - headless validation for Markdown slide fences.
2
+ //
3
+ // `sdoc slides verify <file.md>` runs the same shape parser, template
4
+ // resolver, reference resolver, and grid-bounds check used by the browser.
5
+ // It does not render pixels, so visual overlap and contrast still require a
6
+ // browser review.
7
+
8
+ const io = require('./io');
9
+ const SDocShapes = require('../shared/sdocs-shapes.js');
10
+ const SDocSlideResolve = require('../shared/sdocs-slide-resolve.js');
11
+ const SDocSlideStdlib = require('../shared/sdocs-slide-stdlib.js');
12
+
13
+ function scanSlideBlocks(markdown) {
14
+ var re = /(?:^|\n)(```+|~~~+)slide[ \t]*[^\n]*\n([\s\S]*?)\n\1[ \t]*(?=\n|$)/g;
15
+ var blocks = [];
16
+ var match;
17
+ while ((match = re.exec(String(markdown == null ? '' : markdown)))) {
18
+ blocks.push(match[2]);
19
+ }
20
+ return blocks;
21
+ }
22
+
23
+ function verifySlides(markdown) {
24
+ var raw = scanSlideBlocks(markdown);
25
+ var resolved = SDocSlideResolve.resolveSlides(raw, SDocShapes, {
26
+ stdlib: SDocSlideStdlib.templates || {},
27
+ });
28
+ var slideNumber = 0;
29
+ var results = resolved.map(function (entry, index) {
30
+ if (!entry.skip) slideNumber++;
31
+ var parsed = SDocShapes.parseAndResolve(entry.dsl);
32
+ var errors = (entry.errors || []).concat(parsed.errors || []);
33
+ return {
34
+ source: index + 1,
35
+ slide: entry.skip ? null : slideNumber,
36
+ kind: entry.skip ? 'template' : 'slide',
37
+ ok: errors.length === 0,
38
+ errors: errors,
39
+ };
40
+ });
41
+ var allErrors = [];
42
+ results.forEach(function (result) {
43
+ result.errors.forEach(function (error) {
44
+ allErrors.push({
45
+ source: result.source,
46
+ slide: result.slide,
47
+ kind: result.kind,
48
+ line: error.line || null,
49
+ message: error.message,
50
+ });
51
+ });
52
+ });
53
+ return {
54
+ ok: allErrors.length === 0,
55
+ slideCount: slideNumber,
56
+ sourceCount: raw.length,
57
+ slides: results,
58
+ errors: allErrors,
59
+ };
60
+ }
61
+
62
+ function formatError(error) {
63
+ return (error.line ? 'line ' + error.line + ': ' : '') + error.message;
64
+ }
65
+
66
+ async function slidesVerifyCommand(opts) {
67
+ var file = opts.extra;
68
+ if (!file) {
69
+ console.error('sdoc: slides verify needs a file - usage: sdoc slides verify <file.md> [--json]');
70
+ process.exit(2);
71
+ }
72
+ var content = await io.readContent(file);
73
+ if (content == null) {
74
+ console.error('sdoc: nothing to read from ' + file);
75
+ process.exit(2);
76
+ }
77
+ var report = verifySlides(content);
78
+ if (!report.sourceCount) {
79
+ console.error('sdoc: no slide blocks found in ' + file);
80
+ process.exit(2);
81
+ }
82
+
83
+ if (opts.jsonFlag) {
84
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
85
+ } else {
86
+ report.slides.forEach(function (result) {
87
+ var label = result.kind === 'slide'
88
+ ? 'slide ' + result.slide
89
+ : 'template source ' + result.source;
90
+ if (result.ok) {
91
+ console.log(label + ': ok');
92
+ return;
93
+ }
94
+ console.log(label + ': ' + result.errors.length + ' error' + (result.errors.length === 1 ? '' : 's'));
95
+ result.errors.forEach(function (error) {
96
+ console.log(' ' + formatError(error));
97
+ });
98
+ });
99
+ console.log(report.slideCount + ' slide' + (report.slideCount === 1 ? '' : 's')
100
+ + ', ' + report.errors.length + ' error' + (report.errors.length === 1 ? '' : 's'));
101
+ }
102
+ process.exit(report.ok ? 0 : 1);
103
+ }
104
+
105
+ module.exports = {
106
+ scanSlideBlocks: scanSlideBlocks,
107
+ verifySlides: verifySlides,
108
+ slidesVerifyCommand: slidesVerifyCommand,
109
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdocs-dev",
3
- "version": "1.15.0",
3
+ "version": "1.19.2",
4
4
  "description": "Open, share, and style markdown files from the terminal",
5
5
  "main": "bin/sdocs-dev.js",
6
6
  "bin": {