postext-epub 0.26.0 → 0.27.0

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,2 @@
1
+ import './__tests__/page8';
2
+ //# sourceMappingURL=composedCrossChapterJump.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composedCrossChapterJump.test.d.ts","sourceRoot":"","sources":["../src/composedCrossChapterJump.test.ts"],"names":[],"mappings":"AAYA,OAAO,mBAAmB,CAAC"}
@@ -0,0 +1,58 @@
1
+ // A story that jumps from one chapter to a page of a later one (#943) in
2
+ // the reflowable EPUB: the rest is read where it stands, in the section of
3
+ // the chapter that has the page, and every word of the article is there
4
+ // once.
5
+ import { describe, it, expect, beforeAll } from 'vitest';
6
+ import { buildBundle } from 'postext/bundle';
7
+ import { renderToEpub, readEpub } from './index';
8
+ import { checkXml } from './reflowable/__tests__/xml';
9
+ // The measuring stub the engine's layout needs in node.
10
+ import './__tests__/page8';
11
+ const mm = (value) => ({ value, unit: 'mm' });
12
+ const top = { anchor: { to: 'container', edge: 'top-left' } };
13
+ const para = (word, n) => Array.from({ length: n }, (_, i) => `${word}${i}`).join(' ');
14
+ let book;
15
+ let docs;
16
+ beforeAll(async () => {
17
+ const fixtures = new URL('../../postext/src/__tests__/composed/fixtures/page8.ts', import.meta.url).href;
18
+ const { page8Fixture } = (await import(/* @vite-ignore */ fixtures));
19
+ const base = page8Fixture('es').config;
20
+ const config = {
21
+ ...base,
22
+ pageTemplates: [
23
+ { id: 'articulo', header: false, frames: [{ name: 'cuerpo', style: 'caja-azul', flow: true, width: mm(186), height: mm(90), placement: top, overflow: { continueIn: 'page:{attr.sigue}' }, fit: { shrinkText: false } }] },
24
+ { id: 'salto', header: false, frames: [{ name: 'breve', flow: true, width: mm(186), height: mm(40), placement: top }, { name: 'resto', style: 'caja-azul', width: mm(186), placement: { anchor: { to: '#breve', edge: 'below' }, offset: { y: mm(10) } } }] },
25
+ ],
26
+ };
27
+ const chapters = [
28
+ `::::page{template="articulo" sigue="p-salto"}\n${para('art', 900)}\n::::\n`,
29
+ '# Otro capítulo\n\nTexto del otro capítulo.\n',
30
+ `::::page{template="salto" id="p-salto"}\n${para('breve', 60)}\n::::\n`,
31
+ ];
32
+ docs = buildBundle({ chapters: chapters.map((markdown) => ({ markdown })), config, resources: [] });
33
+ book = readEpub(await renderToEpub(docs, { layout: 'reflowable', metadata: { title: 'Revista', language: 'es', modified: new Date(Date.UTC(2026, 9, 16)) } }));
34
+ }, 60_000);
35
+ const text = (path) => new TextDecoder().decode(book.files.get(path));
36
+ const chapterFiles = () => book.spine.map((s) => s.path).filter((p) => p.includes('chapter-'));
37
+ const words = (xml) => xml.split(/[^A-Za-z0-9]+/).filter((w) => /^art\d+$/.test(w));
38
+ describe('a story that jumps to a page of a later chapter, in the reflowable EPUB (#943)', () => {
39
+ it('reads the start in its chapter and the rest in the chapter that has the page, every word once', () => {
40
+ const files = chapterFiles();
41
+ expect(files.length).toBeGreaterThanOrEqual(3);
42
+ const all = files.flatMap((f) => words(text(f)));
43
+ expect(all).toEqual(Array.from({ length: 900 }, (_, i) => `art${i}`));
44
+ const first = words(text(files[0]));
45
+ const last = words(text(files[files.length - 1]));
46
+ expect(first.length).toBeGreaterThan(0);
47
+ expect(last.length).toBeGreaterThan(0);
48
+ expect(last[0]).toBe(`art${first.length}`);
49
+ for (const f of files)
50
+ expect(checkXml(text(f)).errors).toEqual([]);
51
+ });
52
+ it('keeps the page\'s own words before the rest', () => {
53
+ const xhtml = text(chapterFiles()[2]);
54
+ expect(xhtml.indexOf('breve0')).toBeGreaterThan(-1);
55
+ expect(xhtml.indexOf('breve0')).toBeLessThan(xhtml.indexOf(`art${words(text(chapterFiles()[0])).length}`));
56
+ });
57
+ });
58
+ //# sourceMappingURL=composedCrossChapterJump.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composedCrossChapterJump.test.js","sourceRoot":"","sources":["../src/composedCrossChapterJump.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "postext-epub",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "description": "Browser-native EPUB 3 writer for Postext documents: fixed-layout (pre-paginated) books that reproduce every printed page with real text, and reflowable books in semantic XHTML styled from the same configuration.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -42,7 +42,7 @@
42
42
  "./package.json": "./package.json"
43
43
  },
44
44
  "peerDependencies": {
45
- "postext": "^1.40.0"
45
+ "postext": "^1.41.0"
46
46
  },
47
47
  "dependencies": {
48
48
  "fflate": "^0.8.3"
@@ -51,7 +51,7 @@
51
51
  "@postext/typescript-config": "0.0.0",
52
52
  "@types/node": "^26.5.0",
53
53
  "eslint": "^9.39.4",
54
- "postext": "1.40.0",
54
+ "postext": "1.41.0",
55
55
  "typescript": "^6.0.3",
56
56
  "typescript-eslint": "^8.70.0",
57
57
  "vitest": "^5.0.0"