@slidev/parser 0.48.0-beta.0 → 0.48.0-beta.10

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.
@@ -35,6 +35,9 @@ function isTruthy(v) {
35
35
  }
36
36
  var isNumber = (val) => typeof val === "number";
37
37
  var isObject = (val) => toString(val) === "[object Object]";
38
+ function slash(str) {
39
+ return str.replace(/\\/g, "/");
40
+ }
38
41
  function objectMap(obj, fn) {
39
42
  return Object.fromEntries(
40
43
  Object.entries(obj).map(([k, v]) => fn(k, v)).filter(notNullish)
@@ -243,16 +246,10 @@ function resolveDrawings(options = {}, filepath) {
243
246
 
244
247
  // src/core.ts
245
248
  function stringify(data) {
246
- return `${data.slides.filter((slide) => slide.source === void 0 || slide.inline !== void 0).map((slide, idx) => stringifySlide(slide.inline || slide, idx)).join("\n").trim()}
249
+ return `${data.slides.map(stringifySlide).join("\n").trim()}
247
250
  `;
248
251
  }
249
- function filterDisabled(data) {
250
- data.slides = data.slides.filter((i) => !i.frontmatter?.disabled);
251
- return data;
252
- }
253
252
  function stringifySlide(data, idx = 0) {
254
- if (data.raw == null)
255
- prettifySlide(data);
256
253
  return data.raw.startsWith("---") || idx === 0 ? data.raw : `---
257
254
  ${data.raw.startsWith("\n") ? data.raw : `
258
255
  ${data.raw}`}`;
@@ -354,7 +351,7 @@ function parseSlide(raw) {
354
351
  note
355
352
  };
356
353
  }
357
- async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
354
+ async function parse(markdown, filepath, extensions) {
358
355
  const lines = markdown.split(/\r?\n/g);
359
356
  const slides = [];
360
357
  let start = 0;
@@ -364,6 +361,7 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
364
361
  const raw = lines.slice(start, end).join("\n");
365
362
  const slide = {
366
363
  ...parseSlide(raw),
364
+ filepath,
367
365
  index: slides.length,
368
366
  start,
369
367
  end
@@ -380,19 +378,6 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
380
378
  slides.push(slide);
381
379
  start = end + 1;
382
380
  }
383
- {
384
- let hm = "";
385
- if (lines[0].match(/^---([^-].*)?$/) && !lines[1]?.match(/^\s*$/)) {
386
- let hEnd = 1;
387
- while (hEnd < lines.length && !lines[hEnd].trimEnd().match(/^---$/))
388
- hEnd++;
389
- hm = lines.slice(1, hEnd).join("\n");
390
- }
391
- if (onHeadmatter) {
392
- const o = YAML.load(hm) ?? {};
393
- extensions = await onHeadmatter(o, extensions ?? [], filepath);
394
- }
395
- }
396
381
  if (extensions) {
397
382
  for (const e of extensions) {
398
383
  if (e.transformRawLines)
@@ -420,18 +405,10 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
420
405
  }
421
406
  if (start <= lines.length - 1)
422
407
  await slice(lines.length);
423
- const headmatter = slides[0]?.frontmatter || {};
424
- headmatter.title = headmatter.title || slides[0]?.title;
425
- const config = resolveConfig(headmatter, themeMeta, filepath);
426
- const features = detectFeatures(markdown);
427
408
  return {
428
- raw: markdown,
429
409
  filepath,
430
- slides,
431
- config,
432
- features,
433
- headmatter,
434
- themeMeta
410
+ raw: markdown,
411
+ slides
435
412
  };
436
413
  }
437
414
  function mergeFeatureFlags(a, b) {
@@ -451,6 +428,7 @@ function scanMonacoModules(md) {
451
428
  }
452
429
 
453
430
  export {
431
+ slash,
454
432
  parseRangeString,
455
433
  parseAspectRatio,
456
434
  getDefaultConfig,
@@ -458,7 +436,6 @@ export {
458
436
  verifyConfig,
459
437
  resolveFonts,
460
438
  stringify,
461
- filterDisabled,
462
439
  stringifySlide,
463
440
  prettifySlide,
464
441
  prettify,
package/dist/core.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { SlidevConfig, SlidevThemeMeta, FontOptions, ResolvedFontOptions, SlidevMarkdown, SlideInfoBase, SlidevFeatureFlags, SlidevPreparserExtension, PreparserExtensionFromHeadmatter } from '@slidev/types';
1
+ import { SlidevConfig, SlidevThemeMeta, FontOptions, ResolvedFontOptions, SlidevMarkdown, SourceSlideInfo, SlidevFeatureFlags, SlidevPreparserExtension } from '@slidev/types';
2
2
 
3
3
  /**
4
4
  * 1,3-5,8 => [1, 3, 4, 5, 8]
@@ -15,14 +15,13 @@ declare function verifyConfig(config: SlidevConfig, themeMeta?: SlidevThemeMeta,
15
15
  declare function resolveFonts(fonts?: FontOptions): ResolvedFontOptions;
16
16
 
17
17
  declare function stringify(data: SlidevMarkdown): string;
18
- declare function filterDisabled(data: SlidevMarkdown): SlidevMarkdown;
19
- declare function stringifySlide(data: SlideInfoBase, idx?: number): string;
20
- declare function prettifySlide(data: SlideInfoBase): SlideInfoBase;
18
+ declare function stringifySlide(data: SourceSlideInfo, idx?: number): string;
19
+ declare function prettifySlide(data: SourceSlideInfo): SourceSlideInfo;
21
20
  declare function prettify(data: SlidevMarkdown): SlidevMarkdown;
22
21
  declare function detectFeatures(code: string): SlidevFeatureFlags;
23
- declare function parseSlide(raw: string): SlideInfoBase;
24
- declare function parse(markdown: string, filepath?: string, themeMeta?: SlidevThemeMeta, extensions?: SlidevPreparserExtension[], onHeadmatter?: PreparserExtensionFromHeadmatter): Promise<SlidevMarkdown>;
22
+ declare function parseSlide(raw: string): Omit<SourceSlideInfo, 'filepath' | 'index' | 'start' | 'end'>;
23
+ declare function parse(markdown: string, filepath: string, extensions?: SlidevPreparserExtension[]): Promise<SlidevMarkdown>;
25
24
  declare function mergeFeatureFlags(a: SlidevFeatureFlags, b: SlidevFeatureFlags): SlidevFeatureFlags;
26
25
  declare function scanMonacoModules(md: string): string[];
27
26
 
28
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig };
27
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig };
package/dist/core.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -15,10 +14,9 @@ import {
15
14
  stringify,
16
15
  stringifySlide,
17
16
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
17
+ } from "./chunk-TPG7RJUH.mjs";
19
18
  export {
20
19
  detectFeatures,
21
- filterDisabled,
22
20
  getDefaultConfig,
23
21
  mergeFeatureFlags,
24
22
  parse,
package/dist/fs.d.mts CHANGED
@@ -1,9 +1,13 @@
1
- import { PreparserExtensionLoader, SlidevThemeMeta, SlidevMarkdown, SlideInfoWithPath } from '@slidev/types';
2
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
1
+ import { PreparserExtensionLoader, SlidevData, SlidevMarkdown } from '@slidev/types';
2
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
3
3
 
4
4
  declare function injectPreparserExtensionLoader(fn: PreparserExtensionLoader): void;
5
- declare function load(filepath: string, themeMeta?: SlidevThemeMeta, content?: string): Promise<SlidevMarkdown>;
6
- declare function save(data: SlidevMarkdown, filepath?: string): Promise<void>;
7
- declare function saveExternalSlide(slide: SlideInfoWithPath): Promise<void>;
5
+ /**
6
+ * Slidev data without config and themeMeta,
7
+ * because config and themeMeta depends on the theme to be loaded.
8
+ */
9
+ type LoadedSlidevData = Omit<SlidevData, 'config' | 'themeMeta'>;
10
+ declare function load(userRoot: string, filepath: string, content?: string): Promise<LoadedSlidevData>;
11
+ declare function save(markdown: SlidevMarkdown): Promise<void>;
8
12
 
9
- export { injectPreparserExtensionLoader, load, save, saveExternalSlide };
13
+ export { type LoadedSlidevData, injectPreparserExtensionLoader, load, save };
package/dist/fs.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -12,93 +11,91 @@ import {
12
11
  resolveConfig,
13
12
  resolveFonts,
14
13
  scanMonacoModules,
14
+ slash,
15
15
  stringify,
16
16
  stringifySlide,
17
17
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
18
+ } from "./chunk-TPG7RJUH.mjs";
19
19
 
20
20
  // src/fs.ts
21
21
  import { promises as fs } from "node:fs";
22
22
  import { dirname, resolve } from "node:path";
23
+ import YAML from "js-yaml";
23
24
  var preparserExtensionLoader = null;
24
25
  function injectPreparserExtensionLoader(fn) {
25
26
  preparserExtensionLoader = fn;
26
27
  }
27
- async function load(filepath, themeMeta, content) {
28
- const dir = dirname(filepath);
28
+ async function load(userRoot, filepath, content) {
29
29
  const markdown = content ?? await fs.readFile(filepath, "utf-8");
30
- const preparserExtensions = [];
31
- const data = await parse(markdown, filepath, themeMeta, [], async (headmatter, exts, filepath2) => {
32
- preparserExtensions.splice(
33
- 0,
34
- preparserExtensions.length,
35
- ...exts,
36
- ...preparserExtensionLoader ? await preparserExtensionLoader(headmatter, filepath2) : []
37
- );
38
- return preparserExtensions;
39
- });
40
- const entries = /* @__PURE__ */ new Set([
41
- filepath
42
- ]);
43
- for (let iSlide = 0; iSlide < data.slides.length; ) {
44
- const baseSlide = data.slides[iSlide];
45
- if (!baseSlide.frontmatter.src) {
46
- iSlide++;
47
- continue;
30
+ let extensions;
31
+ if (preparserExtensionLoader) {
32
+ const lines = markdown.split(/\r?\n/g);
33
+ let hm = "";
34
+ if (lines[0].match(/^---([^-].*)?$/) && !lines[1]?.match(/^\s*$/)) {
35
+ let hEnd = 1;
36
+ while (hEnd < lines.length && !lines[hEnd].trimEnd().match(/^---$/))
37
+ hEnd++;
38
+ hm = lines.slice(1, hEnd).join("\n");
48
39
  }
49
- data.slides.splice(iSlide, 1);
50
- if (baseSlide.frontmatter.hide)
51
- continue;
52
- const srcExpression = baseSlide.frontmatter.src;
53
- let path;
54
- if (srcExpression.startsWith("/"))
55
- path = resolve(dir, srcExpression.substring(1));
56
- else if (baseSlide.source?.filepath)
57
- path = resolve(dirname(baseSlide.source.filepath), srcExpression);
58
- else
59
- path = resolve(dir, srcExpression);
60
- const raw = await fs.readFile(path, "utf-8");
61
- const subSlides = await parse(raw, path, themeMeta, preparserExtensions);
62
- for (const [offset, subSlide] of subSlides.slides.entries()) {
63
- const slide = { ...baseSlide };
64
- slide.source = {
65
- filepath: path,
66
- ...subSlide
67
- };
68
- if (offset === 0 && !baseSlide.frontmatter.srcSequence) {
69
- slide.inline = { ...baseSlide };
70
- delete slide.inline.frontmatter.src;
71
- Object.assign(slide, slide.source, { raw: null });
72
- } else {
73
- Object.assign(slide, slide.source);
74
- }
75
- const baseSlideFrontMatterWithoutSrc = { ...baseSlide.frontmatter };
76
- delete baseSlideFrontMatterWithoutSrc.src;
77
- slide.frontmatter = {
78
- ...subSlide.frontmatter,
79
- ...baseSlideFrontMatterWithoutSrc,
80
- srcSequence: `${baseSlide.frontmatter.srcSequence ? `${baseSlide.frontmatter.srcSequence},` : ""}${srcExpression}`
40
+ const o = YAML.load(hm) ?? {};
41
+ extensions = await preparserExtensionLoader(o, filepath);
42
+ }
43
+ const markdownFiles = {};
44
+ const slides = [];
45
+ async function loadMarkdown(path, range, frontmatterOverride) {
46
+ let md = markdownFiles[path];
47
+ if (!md) {
48
+ const raw = await fs.readFile(path, "utf-8");
49
+ md = await parse(raw, path, extensions);
50
+ markdownFiles[path] = md;
51
+ }
52
+ for (const index of parseRangeString(md.slides.length, range))
53
+ await loadSlide(md.slides[index - 1], frontmatterOverride);
54
+ return md;
55
+ }
56
+ async function loadSlide(slide, frontmatterOverride) {
57
+ if (slide.frontmatter.disabled || slide.frontmatter.hide)
58
+ return;
59
+ if (slide.frontmatter.src) {
60
+ const [rawPath, rangeRaw] = slide.frontmatter.src.split("#");
61
+ const path = rawPath.startsWith("/") ? resolve(userRoot, rawPath.substring(1)) : resolve(dirname(slide.filepath), rawPath);
62
+ frontmatterOverride = {
63
+ ...slide.frontmatter,
64
+ ...frontmatterOverride
81
65
  };
82
- data.features = mergeFeatureFlags(data.features, detectFeatures(raw));
83
- entries.add(path);
84
- data.slides.splice(iSlide + offset, 0, slide);
66
+ delete frontmatterOverride.src;
67
+ await loadMarkdown(path, rangeRaw, frontmatterOverride);
68
+ } else {
69
+ slides.push({
70
+ index: slides.length,
71
+ source: slide,
72
+ frontmatter: { ...slide.frontmatter, ...frontmatterOverride },
73
+ content: slide.content,
74
+ note: slide.note,
75
+ title: slide.title,
76
+ level: slide.level
77
+ });
85
78
  }
86
79
  }
87
- for (let iSlide = 0; iSlide < data.slides.length; iSlide++)
88
- data.slides[iSlide].index = iSlide === 0 ? 0 : 1 + data.slides[iSlide - 1].index;
89
- data.entries = Array.from(entries);
90
- return data;
91
- }
92
- async function save(data, filepath) {
93
- filepath = filepath || data.filepath;
94
- await fs.writeFile(filepath, stringify(data), "utf-8");
80
+ const entry = await loadMarkdown(filepath);
81
+ const headmatter = {
82
+ title: slides[0]?.title,
83
+ ...entry.slides[0]?.frontmatter
84
+ };
85
+ return {
86
+ slides,
87
+ entry,
88
+ headmatter,
89
+ features: detectFeatures(slides.map((s) => s.source.raw).join("")),
90
+ markdownFiles,
91
+ watchFiles: Object.keys(markdownFiles).map(slash)
92
+ };
95
93
  }
96
- async function saveExternalSlide(slide) {
97
- await fs.writeFile(slide.filepath, stringifySlide(slide), "utf-8");
94
+ async function save(markdown) {
95
+ await fs.writeFile(markdown.filepath, stringify(markdown), "utf-8");
98
96
  }
99
97
  export {
100
98
  detectFeatures,
101
- filterDisabled,
102
99
  getDefaultConfig,
103
100
  injectPreparserExtensionLoader,
104
101
  load,
@@ -112,7 +109,6 @@ export {
112
109
  resolveConfig,
113
110
  resolveFonts,
114
111
  save,
115
- saveExternalSlide,
116
112
  scanMonacoModules,
117
113
  stringify,
118
114
  stringifySlide,
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
1
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
2
2
  import '@slidev/types';
package/dist/index.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -15,10 +14,9 @@ import {
15
14
  stringify,
16
15
  stringifySlide,
17
16
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
17
+ } from "./chunk-TPG7RJUH.mjs";
19
18
  export {
20
19
  detectFeatures,
21
- filterDisabled,
22
20
  getDefaultConfig,
23
21
  mergeFeatureFlags,
24
22
  parse,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slidev/parser",
3
- "version": "0.48.0-beta.0",
3
+ "version": "0.48.0-beta.10",
4
4
  "description": "Markdown parser for Slidev",
5
5
  "author": "antfu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "js-yaml": "^4.1.0",
43
- "@slidev/types": "0.48.0-beta.0"
43
+ "@slidev/types": "0.48.0-beta.10"
44
44
  },
45
45
  "scripts": {
46
46
  "build": "rimraf dist && tsup src/index.ts src/core.ts src/fs.ts",