From c1eb1e6bec4ee026f29f0acd51125640caf53c89 Mon Sep 17 00:00:00 2001 From: mb Date: Tue, 21 Mar 2023 19:59:23 +0100 Subject: [PATCH] adding the files for printing the envelopes --- envelopes/LibreBaskerville-Italic.ttf | Bin 0 -> 175480 bytes envelopes/addresses.csv | 24 + envelopes/addresses.html | 246 + envelopes/addresses.pdf | Bin 0 -> 95639 bytes envelopes/generate-addresses.py | 44 + envelopes/komika.woff | Bin 0 -> 35744 bytes envelopes/paged.js/paged.polyfill.js | 33047 ++++++++++++++++++++++++ envelopes/paged.js/pagedjs.css | 180 + envelopes/print.css | 35 + envelopes/template.html | 24 + 10 files changed, 33600 insertions(+) create mode 100644 envelopes/LibreBaskerville-Italic.ttf create mode 100644 envelopes/addresses.csv create mode 100644 envelopes/addresses.html create mode 100644 envelopes/addresses.pdf create mode 100644 envelopes/generate-addresses.py create mode 100644 envelopes/komika.woff create mode 100644 envelopes/paged.js/paged.polyfill.js create mode 100644 envelopes/paged.js/pagedjs.css create mode 100644 envelopes/print.css create mode 100644 envelopes/template.html diff --git a/envelopes/LibreBaskerville-Italic.ttf b/envelopes/LibreBaskerville-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a922ca9c40478f76c542a539e51814cdfd9bf725 GIT binary patch literal 175480 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 BDT@FA literal 0 HcmV?d00001 diff --git a/envelopes/addresses.csv b/envelopes/addresses.csv new file mode 100644 index 0000000..a41bd90 --- /dev/null +++ b/envelopes/addresses.csv @@ -0,0 +1,24 @@ +friends, ArtEZ - Graphic Design, , Onderlangs 9, 6812 CE, Arnhem, NL +friends, ArtEZ - Design Art Technology, , Onderlangs 9, 6812 CE, Arnhem, NL +Ruben Pater, KABK, Ruben Pater, Prinsessegracht 4, 2514 AN, Den Haag, NL +friends, Gerrit Rietveld Academie - Graphic Design, , Frederik Roeskestraat 96, 1076 ED, Amsterdam, NL +friends, Gerrit Rietveld Academie - Graphic Design, the Rietveld library, Frederik Roeskestraat 96, 1076 ED, Amsterdam, NL +David Bennewith, Gerrit Rietveld Academie - Graphic Design, David Bennewith, Frederik Roeskestraat 96, 1076 ED, Amsterdam, NL +friends, Minerva Academie, , Gedempte Zuiderdiep 158, 9711 HN, Groningen, NL +Davide Bevilacqua, servus.at, Davide Bevilacqua, Kirchengasse 4, 4040, Linz, AT +Andreas Zingerle, mur.at, Andreas Zingerle, Leitnergasse 7, 8010, Graz, AT +Ruth Schnell, die Angewandte - Digitale Kunst, zH. Ruth Schnell, Georg-Coch-Platz 2 od. Rosenbursenstraße 3, A-1010, Wien, AT +Holunder Heiss, UFG Linz - Zeitbasierte und Interaktive Medienkunst, zH. Holunder Heiss, Hauptplatz 8/III, 4020, Linz, AT +Anja Kaiser, HGB Leipzig, Anja Kaiser, Wächterstraße 11, 04107, Leipzig, DE +Ivan Weiss & Michael Kryenbühl, HfG Karlsruhe, Ivan Weiss & Michael Kryenbühl, Lorenzstr. 15, 76135, Karlsruhe, DE +Marco Cadioli, Accademia di Belle Arti di Brera, Marco Cadioli, Via Brera 28, 20121, Milano MI, IT +Winnie Soon, London South Bank University, CSNI Winnie Soon, 103 Borough Rd, SE1 0AA, London , UK +David Young, Royal Holloway - University of London Egham Hill, David Young, Egham Surrey, TW20 0EX, London, UK +Anne Laforet, Haute école des arts du Rhin, Anne Laforet, 1 rue de l’Académie CS 10032, 67082, Strasbourg cedex, FR +Alexia De Visscher & Stéphanie Vilayphiou & Ludivine Loiseau, ERG (école de recherche graphique), Alexia De Visscher & Stéphanie Vilayphiou & Ludivine Loiseau, 87 rue du Page, 1050, Bruxelles, BE +Peter Westenberg, KASK, Peter Westenberg, Louis Pasteurlaan 2, 9000, Gent, BE +Ricardo Lafuente, ESAP-Escola Superior Artística do Porto, Ricardo Lafuente, Largo S. Domingos n. 80, 4050-545, Porto, PT +Birgit Bachler, FH JOANNEUM, Design & Kommunikation, zH. Birgit Bachler, Alte Poststraße 152, 8020 Graz, AT +Julien Bidoret, Ésad Pyrénées, Julien Bidoret, 2 rue Mathieu Lalanne, 64000, Pau, FR +Quentin Juhel, École supérieure d'Art et Design, Quentin Juhel, Place des Beaux-Arts CS 40 074, 26 903, Valence (cedex 9), FR +Matthias Görlich, University of Art and Design Halle, Matthias Görlich, P.O. Box 200252, D-06003, Halle (Saale), DE \ No newline at end of file diff --git a/envelopes/addresses.html b/envelopes/addresses.html new file mode 100644 index 0000000..b460fa4 --- /dev/null +++ b/envelopes/addresses.html @@ -0,0 +1,246 @@ + + + + + + + + + + + +
+
XPUB.NL
+
ArtEZ - Graphic Design
+ +
Onderlangs 9
+
6812 CE Arnhem (NL)
+
+ +
+
XPUB.NL
+
ArtEZ - Design Art Technology
+ +
Onderlangs 9
+
6812 CE Arnhem (NL)
+
+ +
+
XPUB.NL
+
KABK
+ +
for Ruben Pater
+ +
Prinsessegracht 4
+
2514 AN Den Haag (NL)
+
+ +
+
XPUB.NL
+
Gerrit Rietveld Academie - Graphic Design
+ +
Frederik Roeskestraat 96
+
1076 ED Amsterdam (NL)
+
+ +
+
XPUB.NL
+
Gerrit Rietveld Academie - Graphic Design
+ +
for the Rietveld library
+ +
Frederik Roeskestraat 96
+
1076 ED Amsterdam (NL)
+
+ +
+
XPUB.NL
+
Gerrit Rietveld Academie - Graphic Design
+ +
for David Bennewith
+ +
Frederik Roeskestraat 96
+
1076 ED Amsterdam (NL)
+
+ +
+
XPUB.NL
+
Minerva Academie
+ +
Gedempte Zuiderdiep 158
+
9711 HN Groningen (NL)
+
+ +
+
XPUB.NL
+
servus.at
+ +
for Davide Bevilacqua
+ +
Kirchengasse 4
+
4040 Linz (AT)
+
+ +
+
XPUB.NL
+
mur.at
+ +
for Andreas Zingerle
+ +
Leitnergasse 7
+
8010 Graz (AT)
+
+ +
+
XPUB.NL
+
die Angewandte - Digitale Kunst
+ +
for zH. Ruth Schnell
+ +
Georg-Coch-Platz 2 od. Rosenbursenstraße 3
+
A-1010 Wien (AT)
+
+ +
+
XPUB.NL
+
UFG Linz - Zeitbasierte und Interaktive Medienkunst
+ +
for zH. Holunder Heiss
+ +
Hauptplatz 8/III
+
4020 Linz (AT)
+
+ +
+
XPUB.NL
+
HGB Leipzig
+ +
for Anja Kaiser
+ +
Wächterstraße 11
+
04107 Leipzig (DE)
+
+ +
+
XPUB.NL
+
HfG Karlsruhe
+ +
for Ivan Weiss & Michael Kryenbühl
+ +
Lorenzstr. 15
+
76135 Karlsruhe (DE)
+
+ +
+
XPUB.NL
+
Accademia di Belle Arti di Brera
+ +
for Marco Cadioli
+ +
Via Brera 28
+
20121 Milano MI (IT)
+
+ +
+
XPUB.NL
+
London South Bank University
+ +
for CSNI Winnie Soon
+ +
103 Borough Rd
+
SE1 0AA London (UK)
+
+ +
+
XPUB.NL
+
Royal Holloway - University of London Egham Hill
+ +
for David Young
+ +
Egham Surrey
+
TW20 0EX London (UK)
+
+ +
+
XPUB.NL
+
Haute école des arts du Rhin
+ +
for Anne Laforet
+ +
1 rue de l’Académie CS 10032
+
67082 Strasbourg cedex (FR)
+
+ +
+
XPUB.NL
+
ERG (école de recherche graphique)
+ +
for Alexia De Visscher & Stéphanie Vilayphiou & Ludivine Loiseau
+ +
87 rue du Page
+
1050 Bruxelles (BE)
+
+ +
+
XPUB.NL
+
KASK
+ +
for Peter Westenberg
+ +
Louis Pasteurlaan 2
+
9000 Gent (BE)
+
+ +
+
XPUB.NL
+
ESAP-Escola Superior Artística do Porto
+ +
for Ricardo Lafuente
+ +
Largo S. Domingos n. 80
+
4050-545 Porto (PT)
+
+ +
+
XPUB.NL
+
FH JOANNEUM
+ +
for Design & Kommunikation
+ +
zH. Birgit Bachler
+
Alte Poststraße 152 8020 Graz (AT)
+
+ +
+
XPUB.NL
+
Ésad Pyrénées
+ +
for Julien Bidoret
+ +
2 rue Mathieu Lalanne
+
64000 Pau (FR)
+
+ +
+
XPUB.NL
+
École supérieure d'Art et Design
+ +
for Quentin Juhel
+ +
Place des Beaux-Arts CS 40 074
+
26 903 Valence (cedex 9) (FR)
+
+ +
+
XPUB.NL
+
University of Art and Design Halle
+ +
for Matthias Görlich
+ +
P.O. Box 200252
+
D-06003 Halle (Saale) (DE)
+
+ + + + \ No newline at end of file diff --git a/envelopes/addresses.pdf b/envelopes/addresses.pdf new file mode 100644 index 0000000000000000000000000000000000000000..227fff18553bd005c3747d7cff75c52398ea2759 GIT binary patch literal 95639 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 + + /** + * Chop up text into flows + * @class + */ + class Chunker { + constructor(content, renderTo, options) { + // this.preview = preview; + + this.settings = options || {}; + + this.hooks = {}; + this.hooks.beforeParsed = new Hook(this); + this.hooks.filter = new Hook(this); + this.hooks.afterParsed = new Hook(this); + this.hooks.beforePageLayout = new Hook(this); + this.hooks.layout = new Hook(this); + this.hooks.renderNode = new Hook(this); + this.hooks.layoutNode = new Hook(this); + this.hooks.onOverflow = new Hook(this); + this.hooks.afterOverflowRemoved = new Hook(this); + this.hooks.onBreakToken = new Hook(); + this.hooks.afterPageLayout = new Hook(this); + this.hooks.finalizePage = new Hook(this); + this.hooks.afterRendered = new Hook(this); + + this.pages = []; + this.total = 0; + + this.q = new Queue(this); + this.stopped = false; + this.rendered = false; + + this.content = content; + + this.charsPerBreak = []; + this.maxChars; + + if (content) { + this.flow(content, renderTo); + } + } + + setup(renderTo) { + this.pagesArea = document.createElement("div"); + this.pagesArea.classList.add("pagedjs_pages"); + + if (renderTo) { + renderTo.appendChild(this.pagesArea); + } else { + document.querySelector("body").appendChild(this.pagesArea); + } + + this.pageTemplate = document.createElement("template"); + this.pageTemplate.innerHTML = TEMPLATE; + + } + + async flow(content, renderTo) { + let parsed; + + await this.hooks.beforeParsed.trigger(content, this); + + parsed = new ContentParser(content); + + this.hooks.filter.triggerSync(parsed); + + this.source = parsed; + this.breakToken = undefined; + + if (this.pagesArea && this.pageTemplate) { + this.q.clear(); + this.removePages(); + } else { + this.setup(renderTo); + } + + this.emit("rendering", parsed); + + await this.hooks.afterParsed.trigger(parsed, this); + + await this.loadFonts(); + + let rendered = await this.render(parsed, this.breakToken); + while (rendered.canceled) { + this.start(); + rendered = await this.render(parsed, this.breakToken); + } + + this.rendered = true; + this.pagesArea.style.setProperty("--pagedjs-page-count", this.total); + + await this.hooks.afterRendered.trigger(this.pages, this); + + this.emit("rendered", this.pages); + + + + return this; + } + + // oversetPages() { + // let overset = []; + // for (let i = 0; i < this.pages.length; i++) { + // let page = this.pages[i]; + // if (page.overset) { + // overset.push(page); + // // page.overset = false; + // } + // } + // return overset; + // } + // + // async handleOverset(parsed) { + // let overset = this.oversetPages(); + // if (overset.length) { + // console.log("overset", overset); + // let index = this.pages.indexOf(overset[0]) + 1; + // console.log("INDEX", index); + // + // // Remove pages + // // this.removePages(index); + // + // // await this.render(parsed, overset[0].overset); + // + // // return this.handleOverset(parsed); + // } + // } + + async render(parsed, startAt) { + let renderer = this.layout(parsed, startAt); + + let done = false; + let result; + while (!done) { + result = await this.q.enqueue(() => { return this.renderAsync(renderer); }); + done = result.done; + } + + return result; + } + + start() { + this.rendered = false; + this.stopped = false; + } + + stop() { + this.stopped = true; + // this.q.clear(); + } + + renderOnIdle(renderer) { + return new Promise(resolve => { + requestIdleCallback(async () => { + if (this.stopped) { + return resolve({ done: true, canceled: true }); + } + let result = await renderer.next(); + if (this.stopped) { + resolve({ done: true, canceled: true }); + } else { + resolve(result); + } + }); + }); + } + + async renderAsync(renderer) { + if (this.stopped) { + return { done: true, canceled: true }; + } + let result = await renderer.next(); + if (this.stopped) { + return { done: true, canceled: true }; + } else { + return result; + } + } + + async handleBreaks(node, force) { + let currentPage = this.total + 1; + let currentPosition = currentPage % 2 === 0 ? "left" : "right"; + // TODO: Recto and Verso should reverse for rtl languages + let currentSide = currentPage % 2 === 0 ? "verso" : "recto"; + let previousBreakAfter; + let breakBefore; + let page; + + if (currentPage === 1) { + return; + } + + if (node && + typeof node.dataset !== "undefined" && + typeof node.dataset.previousBreakAfter !== "undefined") { + previousBreakAfter = node.dataset.previousBreakAfter; + } + + if (node && + typeof node.dataset !== "undefined" && + typeof node.dataset.breakBefore !== "undefined") { + breakBefore = node.dataset.breakBefore; + } + + if (force) { + page = this.addPage(true); + } else if( previousBreakAfter && + (previousBreakAfter === "left" || previousBreakAfter === "right") && + previousBreakAfter !== currentPosition) { + page = this.addPage(true); + } else if( previousBreakAfter && + (previousBreakAfter === "verso" || previousBreakAfter === "recto") && + previousBreakAfter !== currentSide) { + page = this.addPage(true); + } else if( breakBefore && + (breakBefore === "left" || breakBefore === "right") && + breakBefore !== currentPosition) { + page = this.addPage(true); + } else if( breakBefore && + (breakBefore === "verso" || breakBefore === "recto") && + breakBefore !== currentSide) { + page = this.addPage(true); + } + + if (page) { + await this.hooks.beforePageLayout.trigger(page, undefined, undefined, this); + this.emit("page", page); + // await this.hooks.layout.trigger(page.element, page, undefined, this); + await this.hooks.afterPageLayout.trigger(page.element, page, undefined, this); + await this.hooks.finalizePage.trigger(page.element, page, undefined, this); + this.emit("renderedPage", page); + } + } + + async *layout(content, startAt) { + let breakToken = startAt || false; + let tokens = []; + + while (breakToken !== undefined && (true)) { + + if (breakToken && breakToken.node) { + await this.handleBreaks(breakToken.node); + } else { + await this.handleBreaks(content.firstChild); + } + + let page = this.addPage(); + + await this.hooks.beforePageLayout.trigger(page, content, breakToken, this); + this.emit("page", page); + + // Layout content in the page, starting from the breakToken + breakToken = await page.layout(content, breakToken, this.maxChars); + + if (breakToken) { + let newToken = breakToken.toJSON(true); + if (tokens.lastIndexOf(newToken) > -1) { + // loop + let err = new OverflowContentError("Layout repeated", [breakToken.node]); + console.error("Layout repeated at: ", breakToken.node); + return err; + } else { + tokens.push(newToken); + } + } + + await this.hooks.afterPageLayout.trigger(page.element, page, breakToken, this); + await this.hooks.finalizePage.trigger(page.element, page, undefined, this); + this.emit("renderedPage", page); + + this.recoredCharLength(page.wrapper.textContent.length); + + yield breakToken; + + // Stop if we get undefined, showing we have reached the end of the content + } + + + } + + recoredCharLength(length) { + if (length === 0) { + return; + } + + this.charsPerBreak.push(length); + + // Keep the length of the last few breaks + if (this.charsPerBreak.length > 4) { + this.charsPerBreak.shift(); + } + + this.maxChars = this.charsPerBreak.reduce((a, b) => a + b, 0) / (this.charsPerBreak.length); + } + + removePages(fromIndex=0) { + + if (fromIndex >= this.pages.length) { + return; + } + + // Remove pages + for (let i = fromIndex; i < this.pages.length; i++) { + this.pages[i].destroy(); + } + + if (fromIndex > 0) { + this.pages.splice(fromIndex); + } else { + this.pages = []; + } + + this.total = this.pages.length; + } + + addPage(blank) { + let lastPage = this.pages[this.pages.length - 1]; + // Create a new page from the template + let page = new Page(this.pagesArea, this.pageTemplate, blank, this.hooks, this.settings); + + this.pages.push(page); + + // Create the pages + page.create(undefined, lastPage && lastPage.element); + + page.index(this.total); + + if (!blank) { + // Listen for page overflow + page.onOverflow((overflowToken) => { + console.warn("overflow on", page.id, overflowToken); + + // Only reflow while rendering + if (this.rendered) { + return; + } + + let index = this.pages.indexOf(page) + 1; + + // Stop the rendering + this.stop(); + + // Set the breakToken to resume at + this.breakToken = overflowToken; + + // Remove pages + this.removePages(index); + + if (this.rendered === true) { + this.rendered = false; + + this.q.enqueue(async () => { + + this.start(); + + await this.render(this.source, this.breakToken); + + this.rendered = true; + + }); + } + + + }); + + page.onUnderflow((overflowToken) => { + // console.log("underflow on", page.id, overflowToken); + + // page.append(this.source, overflowToken); + + }); + } + + this.total = this.pages.length; + + return page; + } + /* + insertPage(index, blank) { + let lastPage = this.pages[index]; + // Create a new page from the template + let page = new Page(this.pagesArea, this.pageTemplate, blank, this.hooks); + + let total = this.pages.splice(index, 0, page); + + // Create the pages + page.create(undefined, lastPage && lastPage.element); + + page.index(index + 1); + + for (let i = index + 2; i < this.pages.length; i++) { + this.pages[i].index(i); + } + + if (!blank) { + // Listen for page overflow + page.onOverflow((overflowToken) => { + if (total < this.pages.length) { + this.pages[total].layout(this.source, overflowToken); + } else { + let newPage = this.addPage(); + newPage.layout(this.source, overflowToken); + } + }); + + page.onUnderflow(() => { + // console.log("underflow on", page.id); + }); + } + + this.total += 1; + + return page; + } + */ + + async clonePage(originalPage) { + let lastPage = this.pages[this.pages.length - 1]; + + let page = new Page(this.pagesArea, this.pageTemplate, false, this.hooks); + + this.pages.push(page); + + // Create the pages + page.create(undefined, lastPage && lastPage.element); + + page.index(this.total); + + await this.hooks.beforePageLayout.trigger(page, undefined, undefined, this); + this.emit("page", page); + + for (const className of originalPage.element.classList) { + if (className !== "pagedjs_left_page" && className !== "pagedjs_right_page") { + page.element.classList.add(className); + } + } + + await this.hooks.afterPageLayout.trigger(page.element, page, undefined, this); + await this.hooks.finalizePage.trigger(page.element, page, undefined, this); + this.emit("renderedPage", page); + } + + loadFonts() { + let fontPromises = []; + (document.fonts || []).forEach((fontFace) => { + if (fontFace.status !== "loaded") { + let fontLoaded = fontFace.load().then((r) => { + return fontFace.family; + }, (r) => { + console.warn("Failed to preload font-family:", fontFace.family); + return fontFace.family; + }); + fontPromises.push(fontLoaded); + } + }); + return Promise.all(fontPromises).catch((err) => { + console.warn(err); + }); + } + + destroy() { + this.pagesArea.remove(); + this.pageTemplate.remove(); + } + + } + + EventEmitter(Chunker.prototype); + + var syntax = {exports: {}}; + + var create$5 = {}; + + // + // list + // ┌──────┐ + // ┌──────────────┼─head │ + // │ │ tail─┼──────────────┐ + // │ └──────┘ │ + // ▼ ▼ + // item item item item + // ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ + // null ◀──┼─prev │◀───┼─prev │◀───┼─prev │◀───┼─prev │ + // │ next─┼───▶│ next─┼───▶│ next─┼───▶│ next─┼──▶ null + // ├──────┤ ├──────┤ ├──────┤ ├──────┤ + // │ data │ │ data │ │ data │ │ data │ + // └──────┘ └──────┘ └──────┘ └──────┘ + // + + function createItem(data) { + return { + prev: null, + next: null, + data: data + }; + } + + function allocateCursor(node, prev, next) { + var cursor; + + if (cursors !== null) { + cursor = cursors; + cursors = cursors.cursor; + cursor.prev = prev; + cursor.next = next; + cursor.cursor = node.cursor; + } else { + cursor = { + prev: prev, + next: next, + cursor: node.cursor + }; + } + + node.cursor = cursor; + + return cursor; + } + + function releaseCursor(node) { + var cursor = node.cursor; + + node.cursor = cursor.cursor; + cursor.prev = null; + cursor.next = null; + cursor.cursor = cursors; + cursors = cursor; + } + + var cursors = null; + var List$6 = function() { + this.cursor = null; + this.head = null; + this.tail = null; + }; + + List$6.createItem = createItem; + List$6.prototype.createItem = createItem; + + List$6.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) { + var cursor = this.cursor; + + while (cursor !== null) { + if (cursor.prev === prevOld) { + cursor.prev = prevNew; + } + + if (cursor.next === nextOld) { + cursor.next = nextNew; + } + + cursor = cursor.cursor; + } + }; + + List$6.prototype.getSize = function() { + var size = 0; + var cursor = this.head; + + while (cursor) { + size++; + cursor = cursor.next; + } + + return size; + }; + + List$6.prototype.fromArray = function(array) { + var cursor = null; + + this.head = null; + + for (var i = 0; i < array.length; i++) { + var item = createItem(array[i]); + + if (cursor !== null) { + cursor.next = item; + } else { + this.head = item; + } + + item.prev = cursor; + cursor = item; + } + + this.tail = cursor; + + return this; + }; + + List$6.prototype.toArray = function() { + var cursor = this.head; + var result = []; + + while (cursor) { + result.push(cursor.data); + cursor = cursor.next; + } + + return result; + }; + + List$6.prototype.toJSON = List$6.prototype.toArray; + + List$6.prototype.isEmpty = function() { + return this.head === null; + }; + + List$6.prototype.first = function() { + return this.head && this.head.data; + }; + + List$6.prototype.last = function() { + return this.tail && this.tail.data; + }; + + List$6.prototype.each = function(fn, context) { + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, null, this.head); + + while (cursor.next !== null) { + item = cursor.next; + cursor.next = item.next; + + fn.call(context, item.data, item, this); + } + + // pop cursor + releaseCursor(this); + }; + + List$6.prototype.forEach = List$6.prototype.each; + + List$6.prototype.eachRight = function(fn, context) { + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, this.tail, null); + + while (cursor.prev !== null) { + item = cursor.prev; + cursor.prev = item.prev; + + fn.call(context, item.data, item, this); + } + + // pop cursor + releaseCursor(this); + }; + + List$6.prototype.forEachRight = List$6.prototype.eachRight; + + List$6.prototype.reduce = function(fn, initialValue, context) { + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, null, this.head); + var acc = initialValue; + + while (cursor.next !== null) { + item = cursor.next; + cursor.next = item.next; + + acc = fn.call(context, acc, item.data, item, this); + } + + // pop cursor + releaseCursor(this); + + return acc; + }; + + List$6.prototype.reduceRight = function(fn, initialValue, context) { + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, this.tail, null); + var acc = initialValue; + + while (cursor.prev !== null) { + item = cursor.prev; + cursor.prev = item.prev; + + acc = fn.call(context, acc, item.data, item, this); + } + + // pop cursor + releaseCursor(this); + + return acc; + }; + + List$6.prototype.nextUntil = function(start, fn, context) { + if (start === null) { + return; + } + + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, null, start); + + while (cursor.next !== null) { + item = cursor.next; + cursor.next = item.next; + + if (fn.call(context, item.data, item, this)) { + break; + } + } + + // pop cursor + releaseCursor(this); + }; + + List$6.prototype.prevUntil = function(start, fn, context) { + if (start === null) { + return; + } + + var item; + + if (context === undefined) { + context = this; + } + + // push cursor + var cursor = allocateCursor(this, start, null); + + while (cursor.prev !== null) { + item = cursor.prev; + cursor.prev = item.prev; + + if (fn.call(context, item.data, item, this)) { + break; + } + } + + // pop cursor + releaseCursor(this); + }; + + List$6.prototype.some = function(fn, context) { + var cursor = this.head; + + if (context === undefined) { + context = this; + } + + while (cursor !== null) { + if (fn.call(context, cursor.data, cursor, this)) { + return true; + } + + cursor = cursor.next; + } + + return false; + }; + + List$6.prototype.map = function(fn, context) { + var result = new List$6(); + var cursor = this.head; + + if (context === undefined) { + context = this; + } + + while (cursor !== null) { + result.appendData(fn.call(context, cursor.data, cursor, this)); + cursor = cursor.next; + } + + return result; + }; + + List$6.prototype.filter = function(fn, context) { + var result = new List$6(); + var cursor = this.head; + + if (context === undefined) { + context = this; + } + + while (cursor !== null) { + if (fn.call(context, cursor.data, cursor, this)) { + result.appendData(cursor.data); + } + cursor = cursor.next; + } + + return result; + }; + + List$6.prototype.clear = function() { + this.head = null; + this.tail = null; + }; + + List$6.prototype.copy = function() { + var result = new List$6(); + var cursor = this.head; + + while (cursor !== null) { + result.insert(createItem(cursor.data)); + cursor = cursor.next; + } + + return result; + }; + + List$6.prototype.prepend = function(item) { + // head + // ^ + // item + this.updateCursors(null, item, this.head, item); + + // insert to the beginning of the list + if (this.head !== null) { + // new item <- first item + this.head.prev = item; + + // new item -> first item + item.next = this.head; + } else { + // if list has no head, then it also has no tail + // in this case tail points to the new item + this.tail = item; + } + + // head always points to new item + this.head = item; + + return this; + }; + + List$6.prototype.prependData = function(data) { + return this.prepend(createItem(data)); + }; + + List$6.prototype.append = function(item) { + return this.insert(item); + }; + + List$6.prototype.appendData = function(data) { + return this.insert(createItem(data)); + }; + + List$6.prototype.insert = function(item, before) { + if (before !== undefined && before !== null) { + // prev before + // ^ + // item + this.updateCursors(before.prev, item, before, item); + + if (before.prev === null) { + // insert to the beginning of list + if (this.head !== before) { + throw new Error('before doesn\'t belong to list'); + } + + // since head points to before therefore list doesn't empty + // no need to check tail + this.head = item; + before.prev = item; + item.next = before; + + this.updateCursors(null, item); + } else { + + // insert between two items + before.prev.next = item; + item.prev = before.prev; + + before.prev = item; + item.next = before; + } + } else { + // tail + // ^ + // item + this.updateCursors(this.tail, item, null, item); + + // insert to the ending of the list + if (this.tail !== null) { + // last item -> new item + this.tail.next = item; + + // last item <- new item + item.prev = this.tail; + } else { + // if list has no tail, then it also has no head + // in this case head points to new item + this.head = item; + } + + // tail always points to new item + this.tail = item; + } + + return this; + }; + + List$6.prototype.insertData = function(data, before) { + return this.insert(createItem(data), before); + }; + + List$6.prototype.remove = function(item) { + // item + // ^ + // prev next + this.updateCursors(item, item.prev, item, item.next); + + if (item.prev !== null) { + item.prev.next = item.next; + } else { + if (this.head !== item) { + throw new Error('item doesn\'t belong to list'); + } + + this.head = item.next; + } + + if (item.next !== null) { + item.next.prev = item.prev; + } else { + if (this.tail !== item) { + throw new Error('item doesn\'t belong to list'); + } + + this.tail = item.prev; + } + + item.prev = null; + item.next = null; + + return item; + }; + + List$6.prototype.push = function(data) { + this.insert(createItem(data)); + }; + + List$6.prototype.pop = function() { + if (this.tail !== null) { + return this.remove(this.tail); + } + }; + + List$6.prototype.unshift = function(data) { + this.prepend(createItem(data)); + }; + + List$6.prototype.shift = function() { + if (this.head !== null) { + return this.remove(this.head); + } + }; + + List$6.prototype.prependList = function(list) { + return this.insertList(list, this.head); + }; + + List$6.prototype.appendList = function(list) { + return this.insertList(list); + }; + + List$6.prototype.insertList = function(list, before) { + // ignore empty lists + if (list.head === null) { + return this; + } + + if (before !== undefined && before !== null) { + this.updateCursors(before.prev, list.tail, before, list.head); + + // insert in the middle of dist list + if (before.prev !== null) { + // before.prev <-> list.head + before.prev.next = list.head; + list.head.prev = before.prev; + } else { + this.head = list.head; + } + + before.prev = list.tail; + list.tail.next = before; + } else { + this.updateCursors(this.tail, list.tail, null, list.head); + + // insert to end of the list + if (this.tail !== null) { + // if destination list has a tail, then it also has a head, + // but head doesn't change + + // dest tail -> source head + this.tail.next = list.head; + + // dest tail <- source head + list.head.prev = this.tail; + } else { + // if list has no a tail, then it also has no a head + // in this case points head to new item + this.head = list.head; + } + + // tail always start point to new item + this.tail = list.tail; + } + + list.head = null; + list.tail = null; + + return this; + }; + + List$6.prototype.replace = function(oldItem, newItemOrList) { + if ('head' in newItemOrList) { + this.insertList(newItemOrList, oldItem); + } else { + this.insert(newItemOrList, oldItem); + } + + this.remove(oldItem); + }; + + var List_1 = List$6; + + var createCustomError$3 = function createCustomError(name, message) { + // use Object.create(), because some VMs prevent setting line/column otherwise + // (iOS Safari 10 even throws an exception) + var error = Object.create(SyntaxError.prototype); + var errorStack = new Error(); + + error.name = name; + error.message = message; + + Object.defineProperty(error, 'stack', { + get: function() { + return (errorStack.stack || '').replace(/^(.+\n){1,3}/, name + ': ' + message + '\n'); + } + }); + + return error; + }; + + var createCustomError$2 = createCustomError$3; + var MAX_LINE_LENGTH = 100; + var OFFSET_CORRECTION = 60; + var TAB_REPLACEMENT = ' '; + + function sourceFragment(error, extraLines) { + function processLines(start, end) { + return lines.slice(start, end).map(function(line, idx) { + var num = String(start + idx + 1); + + while (num.length < maxNumLength) { + num = ' ' + num; + } + + return num + ' |' + line; + }).join('\n'); + } + + var lines = error.source.split(/\r\n?|\n|\f/); + var line = error.line; + var column = error.column; + var startLine = Math.max(1, line - extraLines) - 1; + var endLine = Math.min(line + extraLines, lines.length + 1); + var maxNumLength = Math.max(4, String(endLine).length) + 1; + var cutLeft = 0; + + // column correction according to replaced tab before column + column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length; + + if (column > MAX_LINE_LENGTH) { + cutLeft = column - OFFSET_CORRECTION + 3; + column = OFFSET_CORRECTION - 2; + } + + for (var i = startLine; i <= endLine; i++) { + if (i >= 0 && i < lines.length) { + lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT); + lines[i] = + (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') + + lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) + + (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : ''); + } + } + + return [ + processLines(startLine, line), + new Array(column + maxNumLength + 2).join('-') + '^', + processLines(line, endLine) + ].filter(Boolean).join('\n'); + } + + var SyntaxError$4 = function(message, source, offset, line, column) { + var error = createCustomError$2('SyntaxError', message); + + error.source = source; + error.offset = offset; + error.line = line; + error.column = column; + + error.sourceFragment = function(extraLines) { + return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines); + }; + Object.defineProperty(error, 'formattedMessage', { + get: function() { + return ( + 'Parse error: ' + error.message + '\n' + + sourceFragment(error, 2) + ); + } + }); + + // for backward capability + error.parseError = { + offset: offset, + line: line, + column: column + }; + + return error; + }; + + var _SyntaxError$1 = SyntaxError$4; + + // CSS Syntax Module Level 3 + // https://www.w3.org/TR/css-syntax-3/ + var TYPE$H = { + EOF: 0, // + Ident: 1, // + Function: 2, // + AtKeyword: 3, // + Hash: 4, // + String: 5, // + BadString: 6, // + Url: 7, // + BadUrl: 8, // + Delim: 9, // + Number: 10, // + Percentage: 11, // + Dimension: 12, // + WhiteSpace: 13, // + CDO: 14, // + CDC: 15, // + Colon: 16, // : + Semicolon: 17, // ; + Comma: 18, // , + LeftSquareBracket: 19, // <[-token> + RightSquareBracket: 20, // <]-token> + LeftParenthesis: 21, // <(-token> + RightParenthesis: 22, // <)-token> + LeftCurlyBracket: 23, // <{-token> + RightCurlyBracket: 24, // <}-token> + Comment: 25 + }; + + var NAME$3 = Object.keys(TYPE$H).reduce(function(result, key) { + result[TYPE$H[key]] = key; + return result; + }, {}); + + var _const = { + TYPE: TYPE$H, + NAME: NAME$3 + }; + + var EOF$1 = 0; + + // https://drafts.csswg.org/css-syntax-3/ + // § 4.2. Definitions + + // digit + // A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9). + function isDigit$5(code) { + return code >= 0x0030 && code <= 0x0039; + } + + // hex digit + // A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F), + // or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f). + function isHexDigit$4(code) { + return ( + isDigit$5(code) || // 0 .. 9 + (code >= 0x0041 && code <= 0x0046) || // A .. F + (code >= 0x0061 && code <= 0x0066) // a .. f + ); + } + + // uppercase letter + // A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z). + function isUppercaseLetter$1(code) { + return code >= 0x0041 && code <= 0x005A; + } + + // lowercase letter + // A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z). + function isLowercaseLetter(code) { + return code >= 0x0061 && code <= 0x007A; + } + + // letter + // An uppercase letter or a lowercase letter. + function isLetter(code) { + return isUppercaseLetter$1(code) || isLowercaseLetter(code); + } + + // non-ASCII code point + // A code point with a value equal to or greater than U+0080 . + function isNonAscii(code) { + return code >= 0x0080; + } + + // name-start code point + // A letter, a non-ASCII code point, or U+005F LOW LINE (_). + function isNameStart(code) { + return isLetter(code) || isNonAscii(code) || code === 0x005F; + } + + // name code point + // A name-start code point, a digit, or U+002D HYPHEN-MINUS (-). + function isName$2(code) { + return isNameStart(code) || isDigit$5(code) || code === 0x002D; + } + + // non-printable code point + // A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION, + // or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE. + function isNonPrintable(code) { + return ( + (code >= 0x0000 && code <= 0x0008) || + (code === 0x000B) || + (code >= 0x000E && code <= 0x001F) || + (code === 0x007F) + ); + } + + // newline + // U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition, + // as they are converted to U+000A LINE FEED during preprocessing. + // TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED + function isNewline$1(code) { + return code === 0x000A || code === 0x000D || code === 0x000C; + } + + // whitespace + // A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE. + function isWhiteSpace$2(code) { + return isNewline$1(code) || code === 0x0020 || code === 0x0009; + } + + // § 4.3.8. Check if two code points are a valid escape + function isValidEscape$2(first, second) { + // If the first code point is not U+005C REVERSE SOLIDUS (\), return false. + if (first !== 0x005C) { + return false; + } + + // Otherwise, if the second code point is a newline or EOF, return false. + if (isNewline$1(second) || second === EOF$1) { + return false; + } + + // Otherwise, return true. + return true; + } + + // § 4.3.9. Check if three code points would start an identifier + function isIdentifierStart$2(first, second, third) { + // Look at the first code point: + + // U+002D HYPHEN-MINUS + if (first === 0x002D) { + // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS, + // or the second and third code points are a valid escape, return true. Otherwise, return false. + return ( + isNameStart(second) || + second === 0x002D || + isValidEscape$2(second, third) + ); + } + + // name-start code point + if (isNameStart(first)) { + // Return true. + return true; + } + + // U+005C REVERSE SOLIDUS (\) + if (first === 0x005C) { + // If the first and second code points are a valid escape, return true. Otherwise, return false. + return isValidEscape$2(first, second); + } + + // anything else + // Return false. + return false; + } + + // § 4.3.10. Check if three code points would start a number + function isNumberStart$1(first, second, third) { + // Look at the first code point: + + // U+002B PLUS SIGN (+) + // U+002D HYPHEN-MINUS (-) + if (first === 0x002B || first === 0x002D) { + // If the second code point is a digit, return true. + if (isDigit$5(second)) { + return 2; + } + + // Otherwise, if the second code point is a U+002E FULL STOP (.) + // and the third code point is a digit, return true. + // Otherwise, return false. + return second === 0x002E && isDigit$5(third) ? 3 : 0; + } + + // U+002E FULL STOP (.) + if (first === 0x002E) { + // If the second code point is a digit, return true. Otherwise, return false. + return isDigit$5(second) ? 2 : 0; + } + + // digit + if (isDigit$5(first)) { + // Return true. + return 1; + } + + // anything else + // Return false. + return 0; + } + + // + // Misc + // + + // detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark) + function isBOM$2(code) { + // UTF-16BE + if (code === 0xFEFF) { + return 1; + } + + // UTF-16LE + if (code === 0xFFFE) { + return 1; + } + + return 0; + } + + // Fast code category + // + // https://drafts.csswg.org/css-syntax/#tokenizer-definitions + // > non-ASCII code point + // > A code point with a value equal to or greater than U+0080 + // > name-start code point + // > A letter, a non-ASCII code point, or U+005F LOW LINE (_). + // > name code point + // > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-) + // That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only + var CATEGORY = new Array(0x80); + charCodeCategory$1.Eof = 0x80; + charCodeCategory$1.WhiteSpace = 0x82; + charCodeCategory$1.Digit = 0x83; + charCodeCategory$1.NameStart = 0x84; + charCodeCategory$1.NonPrintable = 0x85; + + for (var i = 0; i < CATEGORY.length; i++) { + switch (true) { + case isWhiteSpace$2(i): + CATEGORY[i] = charCodeCategory$1.WhiteSpace; + break; + + case isDigit$5(i): + CATEGORY[i] = charCodeCategory$1.Digit; + break; + + case isNameStart(i): + CATEGORY[i] = charCodeCategory$1.NameStart; + break; + + case isNonPrintable(i): + CATEGORY[i] = charCodeCategory$1.NonPrintable; + break; + + default: + CATEGORY[i] = i || charCodeCategory$1.Eof; + } + } + + function charCodeCategory$1(code) { + return code < 0x80 ? CATEGORY[code] : charCodeCategory$1.NameStart; + } + var charCodeDefinitions$1 = { + isDigit: isDigit$5, + isHexDigit: isHexDigit$4, + isUppercaseLetter: isUppercaseLetter$1, + isLowercaseLetter: isLowercaseLetter, + isLetter: isLetter, + isNonAscii: isNonAscii, + isNameStart: isNameStart, + isName: isName$2, + isNonPrintable: isNonPrintable, + isNewline: isNewline$1, + isWhiteSpace: isWhiteSpace$2, + isValidEscape: isValidEscape$2, + isIdentifierStart: isIdentifierStart$2, + isNumberStart: isNumberStart$1, + + isBOM: isBOM$2, + charCodeCategory: charCodeCategory$1 + }; + + var charCodeDef = charCodeDefinitions$1; + var isDigit$4 = charCodeDef.isDigit; + var isHexDigit$3 = charCodeDef.isHexDigit; + var isUppercaseLetter = charCodeDef.isUppercaseLetter; + var isName$1 = charCodeDef.isName; + var isWhiteSpace$1 = charCodeDef.isWhiteSpace; + var isValidEscape$1 = charCodeDef.isValidEscape; + + function getCharCode(source, offset) { + return offset < source.length ? source.charCodeAt(offset) : 0; + } + + function getNewlineLength$1(source, offset, code) { + if (code === 13 /* \r */ && getCharCode(source, offset + 1) === 10 /* \n */) { + return 2; + } + + return 1; + } + + function cmpChar$5(testStr, offset, referenceCode) { + var code = testStr.charCodeAt(offset); + + // code.toLowerCase() for A..Z + if (isUppercaseLetter(code)) { + code = code | 32; + } + + return code === referenceCode; + } + + function cmpStr$6(testStr, start, end, referenceStr) { + if (end - start !== referenceStr.length) { + return false; + } + + if (start < 0 || end > testStr.length) { + return false; + } + + for (var i = start; i < end; i++) { + var testCode = testStr.charCodeAt(i); + var referenceCode = referenceStr.charCodeAt(i - start); + + // testCode.toLowerCase() for A..Z + if (isUppercaseLetter(testCode)) { + testCode = testCode | 32; + } + + if (testCode !== referenceCode) { + return false; + } + } + + return true; + } + + function findWhiteSpaceStart$1(source, offset) { + for (; offset >= 0; offset--) { + if (!isWhiteSpace$1(source.charCodeAt(offset))) { + break; + } + } + + return offset + 1; + } + + function findWhiteSpaceEnd$1(source, offset) { + for (; offset < source.length; offset++) { + if (!isWhiteSpace$1(source.charCodeAt(offset))) { + break; + } + } + + return offset; + } + + function findDecimalNumberEnd(source, offset) { + for (; offset < source.length; offset++) { + if (!isDigit$4(source.charCodeAt(offset))) { + break; + } + } + + return offset; + } + + // § 4.3.7. Consume an escaped code point + function consumeEscaped$1(source, offset) { + // It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and + // that the next input code point has already been verified to be part of a valid escape. + offset += 2; + + // hex digit + if (isHexDigit$3(getCharCode(source, offset - 1))) { + // Consume as many hex digits as possible, but no more than 5. + // Note that this means 1-6 hex digits have been consumed in total. + for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) { + if (!isHexDigit$3(getCharCode(source, offset))) { + break; + } + } + + // If the next input code point is whitespace, consume it as well. + var code = getCharCode(source, offset); + if (isWhiteSpace$1(code)) { + offset += getNewlineLength$1(source, offset, code); + } + } + + return offset; + } + + // §4.3.11. Consume a name + // Note: This algorithm does not do the verification of the first few code points that are necessary + // to ensure the returned code points would constitute an . If that is the intended use, + // ensure that the stream starts with an identifier before calling this algorithm. + function consumeName$1(source, offset) { + // Let result initially be an empty string. + // Repeatedly consume the next input code point from the stream: + for (; offset < source.length; offset++) { + var code = source.charCodeAt(offset); + + // name code point + if (isName$1(code)) { + // Append the code point to result. + continue; + } + + // the stream starts with a valid escape + if (isValidEscape$1(code, getCharCode(source, offset + 1))) { + // Consume an escaped code point. Append the returned code point to result. + offset = consumeEscaped$1(source, offset) - 1; + continue; + } + + // anything else + // Reconsume the current input code point. Return result. + break; + } + + return offset; + } + + // §4.3.12. Consume a number + function consumeNumber$5(source, offset) { + var code = source.charCodeAt(offset); + + // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-), + // consume it and append it to repr. + if (code === 0x002B || code === 0x002D) { + code = source.charCodeAt(offset += 1); + } + + // 3. While the next input code point is a digit, consume it and append it to repr. + if (isDigit$4(code)) { + offset = findDecimalNumberEnd(source, offset + 1); + code = source.charCodeAt(offset); + } + + // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then: + if (code === 0x002E && isDigit$4(source.charCodeAt(offset + 1))) { + // 4.1 Consume them. + // 4.2 Append them to repr. + code = source.charCodeAt(offset += 2); + + // 4.3 Set type to "number". + // TODO + + // 4.4 While the next input code point is a digit, consume it and append it to repr. + + offset = findDecimalNumberEnd(source, offset); + } + + // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E) + // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then: + if (cmpChar$5(source, offset, 101 /* e */)) { + var sign = 0; + code = source.charCodeAt(offset + 1); + + // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ... + if (code === 0x002D || code === 0x002B) { + sign = 1; + code = source.charCodeAt(offset + 2); + } + + // ... followed by a digit + if (isDigit$4(code)) { + // 5.1 Consume them. + // 5.2 Append them to repr. + + // 5.3 Set type to "number". + // TODO + + // 5.4 While the next input code point is a digit, consume it and append it to repr. + offset = findDecimalNumberEnd(source, offset + 1 + sign + 1); + } + } + + return offset; + } + + // § 4.3.14. Consume the remnants of a bad url + // ... its sole use is to consume enough of the input stream to reach a recovery point + // where normal tokenizing can resume. + function consumeBadUrlRemnants$1(source, offset) { + // Repeatedly consume the next input code point from the stream: + for (; offset < source.length; offset++) { + var code = source.charCodeAt(offset); + + // U+0029 RIGHT PARENTHESIS ()) + // EOF + if (code === 0x0029) { + // Return. + offset++; + break; + } + + if (isValidEscape$1(code, getCharCode(source, offset + 1))) { + // Consume an escaped code point. + // Note: This allows an escaped right parenthesis ("\)") to be encountered + // without ending the . This is otherwise identical to + // the "anything else" clause. + offset = consumeEscaped$1(source, offset); + } + } + + return offset; + } + + var utils$2 = { + consumeEscaped: consumeEscaped$1, + consumeName: consumeName$1, + consumeNumber: consumeNumber$5, + consumeBadUrlRemnants: consumeBadUrlRemnants$1, + + cmpChar: cmpChar$5, + cmpStr: cmpStr$6, + + getNewlineLength: getNewlineLength$1, + findWhiteSpaceStart: findWhiteSpaceStart$1, + findWhiteSpaceEnd: findWhiteSpaceEnd$1 + }; + + var constants$2 = _const; + var TYPE$G = constants$2.TYPE; + var NAME$2 = constants$2.NAME; + + var utils$1 = utils$2; + var cmpStr$5 = utils$1.cmpStr; + + var EOF = TYPE$G.EOF; + var WHITESPACE$c = TYPE$G.WhiteSpace; + var COMMENT$a = TYPE$G.Comment; + + var OFFSET_MASK$1 = 0x00FFFFFF; + var TYPE_SHIFT$1 = 24; + + var TokenStream$4 = function() { + this.offsetAndType = null; + this.balance = null; + + this.reset(); + }; + + TokenStream$4.prototype = { + reset: function() { + this.eof = false; + this.tokenIndex = -1; + this.tokenType = 0; + this.tokenStart = this.firstCharOffset; + this.tokenEnd = this.firstCharOffset; + }, + + lookupType: function(offset) { + offset += this.tokenIndex; + + if (offset < this.tokenCount) { + return this.offsetAndType[offset] >> TYPE_SHIFT$1; + } + + return EOF; + }, + lookupOffset: function(offset) { + offset += this.tokenIndex; + + if (offset < this.tokenCount) { + return this.offsetAndType[offset - 1] & OFFSET_MASK$1; + } + + return this.source.length; + }, + lookupValue: function(offset, referenceStr) { + offset += this.tokenIndex; + + if (offset < this.tokenCount) { + return cmpStr$5( + this.source, + this.offsetAndType[offset - 1] & OFFSET_MASK$1, + this.offsetAndType[offset] & OFFSET_MASK$1, + referenceStr + ); + } + + return false; + }, + getTokenStart: function(tokenIndex) { + if (tokenIndex === this.tokenIndex) { + return this.tokenStart; + } + + if (tokenIndex > 0) { + return tokenIndex < this.tokenCount + ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK$1 + : this.offsetAndType[this.tokenCount] & OFFSET_MASK$1; + } + + return this.firstCharOffset; + }, + + // TODO: -> skipUntilBalanced + getRawLength: function(startToken, mode) { + var cursor = startToken; + var balanceEnd; + var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK$1; + var type; + + loop: + for (; cursor < this.tokenCount; cursor++) { + balanceEnd = this.balance[cursor]; + + // stop scanning on balance edge that points to offset before start token + if (balanceEnd < startToken) { + break loop; + } + + type = this.offsetAndType[cursor] >> TYPE_SHIFT$1; + + // check token is stop type + switch (mode(type, this.source, offset)) { + case 1: + break loop; + + case 2: + cursor++; + break loop; + + default: + // fast forward to the end of balanced block + if (this.balance[balanceEnd] === cursor) { + cursor = balanceEnd; + } + + offset = this.offsetAndType[cursor] & OFFSET_MASK$1; + } + } + + return cursor - this.tokenIndex; + }, + isBalanceEdge: function(pos) { + return this.balance[this.tokenIndex] < pos; + }, + isDelim: function(code, offset) { + if (offset) { + return ( + this.lookupType(offset) === TYPE$G.Delim && + this.source.charCodeAt(this.lookupOffset(offset)) === code + ); + } + + return ( + this.tokenType === TYPE$G.Delim && + this.source.charCodeAt(this.tokenStart) === code + ); + }, + + getTokenValue: function() { + return this.source.substring(this.tokenStart, this.tokenEnd); + }, + getTokenLength: function() { + return this.tokenEnd - this.tokenStart; + }, + substrToCursor: function(start) { + return this.source.substring(start, this.tokenStart); + }, + + skipWS: function() { + for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) { + if ((this.offsetAndType[i] >> TYPE_SHIFT$1) !== WHITESPACE$c) { + break; + } + } + + if (skipTokenCount > 0) { + this.skip(skipTokenCount); + } + }, + skipSC: function() { + while (this.tokenType === WHITESPACE$c || this.tokenType === COMMENT$a) { + this.next(); + } + }, + skip: function(tokenCount) { + var next = this.tokenIndex + tokenCount; + + if (next < this.tokenCount) { + this.tokenIndex = next; + this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK$1; + next = this.offsetAndType[next]; + this.tokenType = next >> TYPE_SHIFT$1; + this.tokenEnd = next & OFFSET_MASK$1; + } else { + this.tokenIndex = this.tokenCount; + this.next(); + } + }, + next: function() { + var next = this.tokenIndex + 1; + + if (next < this.tokenCount) { + this.tokenIndex = next; + this.tokenStart = this.tokenEnd; + next = this.offsetAndType[next]; + this.tokenType = next >> TYPE_SHIFT$1; + this.tokenEnd = next & OFFSET_MASK$1; + } else { + this.tokenIndex = this.tokenCount; + this.eof = true; + this.tokenType = EOF; + this.tokenStart = this.tokenEnd = this.source.length; + } + }, + + forEachToken(fn) { + for (var i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) { + var start = offset; + var item = this.offsetAndType[i]; + var end = item & OFFSET_MASK$1; + var type = item >> TYPE_SHIFT$1; + + offset = end; + + fn(type, start, end, i); + } + }, + + dump() { + var tokens = new Array(this.tokenCount); + + this.forEachToken((type, start, end, index) => { + tokens[index] = { + idx: index, + type: NAME$2[type], + chunk: this.source.substring(start, end), + balance: this.balance[index] + }; + }); + + return tokens; + } + }; + + var TokenStream_1 = TokenStream$4; + + function noop$3(value) { + return value; + } + + function generateMultiplier(multiplier) { + if (multiplier.min === 0 && multiplier.max === 0) { + return '*'; + } + + if (multiplier.min === 0 && multiplier.max === 1) { + return '?'; + } + + if (multiplier.min === 1 && multiplier.max === 0) { + return multiplier.comma ? '#' : '+'; + } + + if (multiplier.min === 1 && multiplier.max === 1) { + return ''; + } + + return ( + (multiplier.comma ? '#' : '') + + (multiplier.min === multiplier.max + ? '{' + multiplier.min + '}' + : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}' + ) + ); + } + + function generateTypeOpts(node) { + switch (node.type) { + case 'Range': + return ( + ' [' + + (node.min === null ? '-∞' : node.min) + + ',' + + (node.max === null ? '∞' : node.max) + + ']' + ); + + default: + throw new Error('Unknown node type `' + node.type + '`'); + } + } + + function generateSequence(node, decorate, forceBraces, compact) { + var combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' '; + var result = node.terms.map(function(term) { + return generate$2(term, decorate, forceBraces, compact); + }).join(combinator); + + if (node.explicit || forceBraces) { + result = (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]'); + } + + return result; + } + + function generate$2(node, decorate, forceBraces, compact) { + var result; + + switch (node.type) { + case 'Group': + result = + generateSequence(node, decorate, forceBraces, compact) + + (node.disallowEmpty ? '!' : ''); + break; + + case 'Multiplier': + // return since node is a composition + return ( + generate$2(node.term, decorate, forceBraces, compact) + + decorate(generateMultiplier(node), node) + ); + + case 'Type': + result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>'; + break; + + case 'Property': + result = '<\'' + node.name + '\'>'; + break; + + case 'Keyword': + result = node.name; + break; + + case 'AtKeyword': + result = '@' + node.name; + break; + + case 'Function': + result = node.name + '('; + break; + + case 'String': + case 'Token': + result = node.value; + break; + + case 'Comma': + result = ','; + break; + + default: + throw new Error('Unknown node type `' + node.type + '`'); + } + + return decorate(result, node); + } + + var generate_1 = function(node, options) { + var decorate = noop$3; + var forceBraces = false; + var compact = false; + + if (typeof options === 'function') { + decorate = options; + } else if (options) { + forceBraces = Boolean(options.forceBraces); + compact = Boolean(options.compact); + if (typeof options.decorate === 'function') { + decorate = options.decorate; + } + } + + return generate$2(node, decorate, forceBraces, compact); + }; + + const createCustomError$1 = createCustomError$3; + const generate$1 = generate_1; + const defaultLoc = { offset: 0, line: 1, column: 1 }; + + function locateMismatch(matchResult, node) { + const tokens = matchResult.tokens; + const longestMatch = matchResult.longestMatch; + const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null; + const badNode = mismatchNode !== node ? mismatchNode : null; + let mismatchOffset = 0; + let mismatchLength = 0; + let entries = 0; + let css = ''; + let start; + let end; + + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i].value; + + if (i === longestMatch) { + mismatchLength = token.length; + mismatchOffset = css.length; + } + + if (badNode !== null && tokens[i].node === badNode) { + if (i <= longestMatch) { + entries++; + } else { + entries = 0; + } + } + + css += token; + } + + if (longestMatch === tokens.length || entries > 1) { // last + start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css); + end = buildLoc(start); + } else { + start = fromLoc(badNode, 'start') || + buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset)); + end = fromLoc(badNode, 'end') || + buildLoc(start, css.substr(mismatchOffset, mismatchLength)); + } + + return { + css, + mismatchOffset, + mismatchLength, + start, + end + }; + } + + function fromLoc(node, point) { + const value = node && node.loc && node.loc[point]; + + if (value) { + return 'line' in value ? buildLoc(value) : value; + } + + return null; + } + + function buildLoc({ offset, line, column }, extra) { + const loc = { + offset, + line, + column + }; + + if (extra) { + const lines = extra.split(/\n|\r\n?|\f/); + + loc.offset += extra.length; + loc.line += lines.length - 1; + loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1; + } + + return loc; + } + + const SyntaxReferenceError$1 = function(type, referenceName) { + const error = createCustomError$1( + 'SyntaxReferenceError', + type + (referenceName ? ' `' + referenceName + '`' : '') + ); + + error.reference = referenceName; + + return error; + }; + + const SyntaxMatchError$1 = function(message, syntax, node, matchResult) { + const error = createCustomError$1('SyntaxMatchError', message); + const { + css, + mismatchOffset, + mismatchLength, + start, + end + } = locateMismatch(matchResult, node); + + error.rawMessage = message; + error.syntax = syntax ? generate$1(syntax) : ''; + error.css = css; + error.mismatchOffset = mismatchOffset; + error.mismatchLength = mismatchLength; + error.message = message + '\n' + + ' syntax: ' + error.syntax + '\n' + + ' value: ' + (css || '') + '\n' + + ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^'; + + Object.assign(error, start); + error.loc = { + source: (node && node.loc && node.loc.source) || '', + start, + end + }; + + return error; + }; + + var error = { + SyntaxReferenceError: SyntaxReferenceError$1, + SyntaxMatchError: SyntaxMatchError$1 + }; + + var hasOwnProperty$7 = Object.prototype.hasOwnProperty; + var keywords$1 = Object.create(null); + var properties$1 = Object.create(null); + var HYPHENMINUS$5 = 45; // '-'.charCodeAt() + + function isCustomProperty$1(str, offset) { + offset = offset || 0; + + return str.length - offset >= 2 && + str.charCodeAt(offset) === HYPHENMINUS$5 && + str.charCodeAt(offset + 1) === HYPHENMINUS$5; + } + + function getVendorPrefix(str, offset) { + offset = offset || 0; + + // verdor prefix should be at least 3 chars length + if (str.length - offset >= 3) { + // vendor prefix starts with hyper minus following non-hyper minus + if (str.charCodeAt(offset) === HYPHENMINUS$5 && + str.charCodeAt(offset + 1) !== HYPHENMINUS$5) { + // vendor prefix should contain a hyper minus at the ending + var secondDashIndex = str.indexOf('-', offset + 2); + + if (secondDashIndex !== -1) { + return str.substring(offset, secondDashIndex + 1); + } + } + } + + return ''; + } + + function getKeywordDescriptor(keyword) { + if (hasOwnProperty$7.call(keywords$1, keyword)) { + return keywords$1[keyword]; + } + + var name = keyword.toLowerCase(); + + if (hasOwnProperty$7.call(keywords$1, name)) { + return keywords$1[keyword] = keywords$1[name]; + } + + var custom = isCustomProperty$1(name, 0); + var vendor = !custom ? getVendorPrefix(name, 0) : ''; + + return keywords$1[keyword] = Object.freeze({ + basename: name.substr(vendor.length), + name: name, + vendor: vendor, + prefix: vendor, + custom: custom + }); + } + + function getPropertyDescriptor(property) { + if (hasOwnProperty$7.call(properties$1, property)) { + return properties$1[property]; + } + + var name = property; + var hack = property[0]; + + if (hack === '/') { + hack = property[1] === '/' ? '//' : '/'; + } else if (hack !== '_' && + hack !== '*' && + hack !== '$' && + hack !== '#' && + hack !== '+' && + hack !== '&') { + hack = ''; + } + + var custom = isCustomProperty$1(name, hack.length); + + // re-use result when possible (the same as for lower case) + if (!custom) { + name = name.toLowerCase(); + if (hasOwnProperty$7.call(properties$1, name)) { + return properties$1[property] = properties$1[name]; + } + } + + var vendor = !custom ? getVendorPrefix(name, hack.length) : ''; + var prefix = name.substr(0, hack.length + vendor.length); + + return properties$1[property] = Object.freeze({ + basename: name.substr(prefix.length), + name: name.substr(hack.length), + hack: hack, + vendor: vendor, + prefix: prefix, + custom: custom + }); + } + + var names$2 = { + keyword: getKeywordDescriptor, + property: getPropertyDescriptor, + isCustomProperty: isCustomProperty$1, + vendorPrefix: getVendorPrefix + }; + + var MIN_SIZE = 16 * 1024; + var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported + + var adoptBuffer$2 = function adoptBuffer(buffer, size) { + if (buffer === null || buffer.length < size) { + return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE)); + } + + return buffer; + }; + + var TokenStream$3 = TokenStream_1; + var adoptBuffer$1 = adoptBuffer$2; + + var constants$1 = _const; + var TYPE$F = constants$1.TYPE; + + var charCodeDefinitions = charCodeDefinitions$1; + var isNewline = charCodeDefinitions.isNewline; + var isName = charCodeDefinitions.isName; + var isValidEscape = charCodeDefinitions.isValidEscape; + var isNumberStart = charCodeDefinitions.isNumberStart; + var isIdentifierStart$1 = charCodeDefinitions.isIdentifierStart; + var charCodeCategory = charCodeDefinitions.charCodeCategory; + var isBOM$1 = charCodeDefinitions.isBOM; + + var utils = utils$2; + var cmpStr$4 = utils.cmpStr; + var getNewlineLength = utils.getNewlineLength; + var findWhiteSpaceEnd = utils.findWhiteSpaceEnd; + var consumeEscaped = utils.consumeEscaped; + var consumeName = utils.consumeName; + var consumeNumber$4 = utils.consumeNumber; + var consumeBadUrlRemnants = utils.consumeBadUrlRemnants; + + var OFFSET_MASK = 0x00FFFFFF; + var TYPE_SHIFT = 24; + + function tokenize$3(source, stream) { + function getCharCode(offset) { + return offset < sourceLength ? source.charCodeAt(offset) : 0; + } + + // § 4.3.3. Consume a numeric token + function consumeNumericToken() { + // Consume a number and let number be the result. + offset = consumeNumber$4(source, offset); + + // If the next 3 input code points would start an identifier, then: + if (isIdentifierStart$1(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) { + // Create a with the same value and type flag as number, and a unit set initially to the empty string. + // Consume a name. Set the ’s unit to the returned value. + // Return the . + type = TYPE$F.Dimension; + offset = consumeName(source, offset); + return; + } + + // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it. + if (getCharCode(offset) === 0x0025) { + // Create a with the same value as number, and return it. + type = TYPE$F.Percentage; + offset++; + return; + } + + // Otherwise, create a with the same value and type flag as number, and return it. + type = TYPE$F.Number; + } + + // § 4.3.4. Consume an ident-like token + function consumeIdentLikeToken() { + const nameStartOffset = offset; + + // Consume a name, and let string be the result. + offset = consumeName(source, offset); + + // If string’s value is an ASCII case-insensitive match for "url", + // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it. + if (cmpStr$4(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) { + // While the next two input code points are whitespace, consume the next input code point. + offset = findWhiteSpaceEnd(source, offset + 1); + + // If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('), + // or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('), + // then create a with its value set to string and return it. + if (getCharCode(offset) === 0x0022 || + getCharCode(offset) === 0x0027) { + type = TYPE$F.Function; + offset = nameStartOffset + 4; + return; + } + + // Otherwise, consume a url token, and return it. + consumeUrlToken(); + return; + } + + // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it. + // Create a with its value set to string and return it. + if (getCharCode(offset) === 0x0028) { + type = TYPE$F.Function; + offset++; + return; + } + + // Otherwise, create an with its value set to string and return it. + type = TYPE$F.Ident; + } + + // § 4.3.5. Consume a string token + function consumeStringToken(endingCodePoint) { + // This algorithm may be called with an ending code point, which denotes the code point + // that ends the string. If an ending code point is not specified, + // the current input code point is used. + if (!endingCodePoint) { + endingCodePoint = getCharCode(offset++); + } + + // Initially create a with its value set to the empty string. + type = TYPE$F.String; + + // Repeatedly consume the next input code point from the stream: + for (; offset < source.length; offset++) { + var code = source.charCodeAt(offset); + + switch (charCodeCategory(code)) { + // ending code point + case endingCodePoint: + // Return the . + offset++; + return; + + // EOF + case charCodeCategory.Eof: + // This is a parse error. Return the . + return; + + // newline + case charCodeCategory.WhiteSpace: + if (isNewline(code)) { + // This is a parse error. Reconsume the current input code point, + // create a , and return it. + offset += getNewlineLength(source, offset, code); + type = TYPE$F.BadString; + return; + } + break; + + // U+005C REVERSE SOLIDUS (\) + case 0x005C: + // If the next input code point is EOF, do nothing. + if (offset === source.length - 1) { + break; + } + + var nextCode = getCharCode(offset + 1); + + // Otherwise, if the next input code point is a newline, consume it. + if (isNewline(nextCode)) { + offset += getNewlineLength(source, offset + 1, nextCode); + } else if (isValidEscape(code, nextCode)) { + // Otherwise, (the stream starts with a valid escape) consume + // an escaped code point and append the returned code point to + // the ’s value. + offset = consumeEscaped(source, offset) - 1; + } + break; + + // anything else + // Append the current input code point to the ’s value. + } + } + } + + // § 4.3.6. Consume a url token + // Note: This algorithm assumes that the initial "url(" has already been consumed. + // This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo). + // A quoted value, like url("foo"), is parsed as a . Consume an ident-like token + // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise. + function consumeUrlToken() { + // Initially create a with its value set to the empty string. + type = TYPE$F.Url; + + // Consume as much whitespace as possible. + offset = findWhiteSpaceEnd(source, offset); + + // Repeatedly consume the next input code point from the stream: + for (; offset < source.length; offset++) { + var code = source.charCodeAt(offset); + + switch (charCodeCategory(code)) { + // U+0029 RIGHT PARENTHESIS ()) + case 0x0029: + // Return the . + offset++; + return; + + // EOF + case charCodeCategory.Eof: + // This is a parse error. Return the . + return; + + // whitespace + case charCodeCategory.WhiteSpace: + // Consume as much whitespace as possible. + offset = findWhiteSpaceEnd(source, offset); + + // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF, + // consume it and return the + // (if EOF was encountered, this is a parse error); + if (getCharCode(offset) === 0x0029 || offset >= source.length) { + if (offset < source.length) { + offset++; + } + return; + } + + // otherwise, consume the remnants of a bad url, create a , + // and return it. + offset = consumeBadUrlRemnants(source, offset); + type = TYPE$F.BadUrl; + return; + + // U+0022 QUOTATION MARK (") + // U+0027 APOSTROPHE (') + // U+0028 LEFT PARENTHESIS (() + // non-printable code point + case 0x0022: + case 0x0027: + case 0x0028: + case charCodeCategory.NonPrintable: + // This is a parse error. Consume the remnants of a bad url, + // create a , and return it. + offset = consumeBadUrlRemnants(source, offset); + type = TYPE$F.BadUrl; + return; + + // U+005C REVERSE SOLIDUS (\) + case 0x005C: + // If the stream starts with a valid escape, consume an escaped code point and + // append the returned code point to the ’s value. + if (isValidEscape(code, getCharCode(offset + 1))) { + offset = consumeEscaped(source, offset) - 1; + break; + } + + // Otherwise, this is a parse error. Consume the remnants of a bad url, + // create a , and return it. + offset = consumeBadUrlRemnants(source, offset); + type = TYPE$F.BadUrl; + return; + + // anything else + // Append the current input code point to the ’s value. + } + } + } + + if (!stream) { + stream = new TokenStream$3(); + } + + // ensure source is a string + source = String(source || ''); + + var sourceLength = source.length; + var offsetAndType = adoptBuffer$1(stream.offsetAndType, sourceLength + 1); // +1 because of eof-token + var balance = adoptBuffer$1(stream.balance, sourceLength + 1); + var tokenCount = 0; + var start = isBOM$1(getCharCode(0)); + var offset = start; + var balanceCloseType = 0; + var balanceStart = 0; + var balancePrev = 0; + + // https://drafts.csswg.org/css-syntax-3/#consume-token + // § 4.3.1. Consume a token + while (offset < sourceLength) { + var code = source.charCodeAt(offset); + var type = 0; + + balance[tokenCount] = sourceLength; + + switch (charCodeCategory(code)) { + // whitespace + case charCodeCategory.WhiteSpace: + // Consume as much whitespace as possible. Return a . + type = TYPE$F.WhiteSpace; + offset = findWhiteSpaceEnd(source, offset + 1); + break; + + // U+0022 QUOTATION MARK (") + case 0x0022: + // Consume a string token and return it. + consumeStringToken(); + break; + + // U+0023 NUMBER SIGN (#) + case 0x0023: + // If the next input code point is a name code point or the next two input code points are a valid escape, then: + if (isName(getCharCode(offset + 1)) || isValidEscape(getCharCode(offset + 1), getCharCode(offset + 2))) { + // Create a . + type = TYPE$F.Hash; + + // If the next 3 input code points would start an identifier, set the ’s type flag to "id". + // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) { + // // TODO: set id flag + // } + + // Consume a name, and set the ’s value to the returned string. + offset = consumeName(source, offset + 1); + + // Return the . + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + + break; + + // U+0027 APOSTROPHE (') + case 0x0027: + // Consume a string token and return it. + consumeStringToken(); + break; + + // U+0028 LEFT PARENTHESIS (() + case 0x0028: + // Return a <(-token>. + type = TYPE$F.LeftParenthesis; + offset++; + break; + + // U+0029 RIGHT PARENTHESIS ()) + case 0x0029: + // Return a <)-token>. + type = TYPE$F.RightParenthesis; + offset++; + break; + + // U+002B PLUS SIGN (+) + case 0x002B: + // If the input stream starts with a number, ... + if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) { + // ... reconsume the current input code point, consume a numeric token, and return it. + consumeNumericToken(); + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + break; + + // U+002C COMMA (,) + case 0x002C: + // Return a . + type = TYPE$F.Comma; + offset++; + break; + + // U+002D HYPHEN-MINUS (-) + case 0x002D: + // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it. + if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) { + consumeNumericToken(); + } else { + // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a . + if (getCharCode(offset + 1) === 0x002D && + getCharCode(offset + 2) === 0x003E) { + type = TYPE$F.CDC; + offset = offset + 3; + } else { + // Otherwise, if the input stream starts with an identifier, ... + if (isIdentifierStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) { + // ... reconsume the current input code point, consume an ident-like token, and return it. + consumeIdentLikeToken(); + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + } + } + break; + + // U+002E FULL STOP (.) + case 0x002E: + // If the input stream starts with a number, ... + if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) { + // ... reconsume the current input code point, consume a numeric token, and return it. + consumeNumericToken(); + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + + break; + + // U+002F SOLIDUS (/) + case 0x002F: + // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*), + if (getCharCode(offset + 1) === 0x002A) { + // ... consume them and all following code points up to and including the first U+002A ASTERISK (*) + // followed by a U+002F SOLIDUS (/), or up to an EOF code point. + type = TYPE$F.Comment; + offset = source.indexOf('*/', offset + 2) + 2; + if (offset === 1) { + offset = source.length; + } + } else { + type = TYPE$F.Delim; + offset++; + } + break; + + // U+003A COLON (:) + case 0x003A: + // Return a . + type = TYPE$F.Colon; + offset++; + break; + + // U+003B SEMICOLON (;) + case 0x003B: + // Return a . + type = TYPE$F.Semicolon; + offset++; + break; + + // U+003C LESS-THAN SIGN (<) + case 0x003C: + // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ... + if (getCharCode(offset + 1) === 0x0021 && + getCharCode(offset + 2) === 0x002D && + getCharCode(offset + 3) === 0x002D) { + // ... consume them and return a . + type = TYPE$F.CDO; + offset = offset + 4; + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + + break; + + // U+0040 COMMERCIAL AT (@) + case 0x0040: + // If the next 3 input code points would start an identifier, ... + if (isIdentifierStart$1(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) { + // ... consume a name, create an with its value set to the returned value, and return it. + type = TYPE$F.AtKeyword; + offset = consumeName(source, offset + 1); + } else { + // Otherwise, return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + + break; + + // U+005B LEFT SQUARE BRACKET ([) + case 0x005B: + // Return a <[-token>. + type = TYPE$F.LeftSquareBracket; + offset++; + break; + + // U+005C REVERSE SOLIDUS (\) + case 0x005C: + // If the input stream starts with a valid escape, ... + if (isValidEscape(code, getCharCode(offset + 1))) { + // ... reconsume the current input code point, consume an ident-like token, and return it. + consumeIdentLikeToken(); + } else { + // Otherwise, this is a parse error. Return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + break; + + // U+005D RIGHT SQUARE BRACKET (]) + case 0x005D: + // Return a <]-token>. + type = TYPE$F.RightSquareBracket; + offset++; + break; + + // U+007B LEFT CURLY BRACKET ({) + case 0x007B: + // Return a <{-token>. + type = TYPE$F.LeftCurlyBracket; + offset++; + break; + + // U+007D RIGHT CURLY BRACKET (}) + case 0x007D: + // Return a <}-token>. + type = TYPE$F.RightCurlyBracket; + offset++; + break; + + // digit + case charCodeCategory.Digit: + // Reconsume the current input code point, consume a numeric token, and return it. + consumeNumericToken(); + break; + + // name-start code point + case charCodeCategory.NameStart: + // Reconsume the current input code point, consume an ident-like token, and return it. + consumeIdentLikeToken(); + break; + + // EOF + case charCodeCategory.Eof: + // Return an . + break; + + // anything else + default: + // Return a with its value set to the current input code point. + type = TYPE$F.Delim; + offset++; + } + + switch (type) { + case balanceCloseType: + balancePrev = balanceStart & OFFSET_MASK; + balanceStart = balance[balancePrev]; + balanceCloseType = balanceStart >> TYPE_SHIFT; + balance[tokenCount] = balancePrev; + balance[balancePrev++] = tokenCount; + for (; balancePrev < tokenCount; balancePrev++) { + if (balance[balancePrev] === sourceLength) { + balance[balancePrev] = tokenCount; + } + } + break; + + case TYPE$F.LeftParenthesis: + case TYPE$F.Function: + balance[tokenCount] = balanceStart; + balanceCloseType = TYPE$F.RightParenthesis; + balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount; + break; + + case TYPE$F.LeftSquareBracket: + balance[tokenCount] = balanceStart; + balanceCloseType = TYPE$F.RightSquareBracket; + balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount; + break; + + case TYPE$F.LeftCurlyBracket: + balance[tokenCount] = balanceStart; + balanceCloseType = TYPE$F.RightCurlyBracket; + balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount; + break; + } + + offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | offset; + } + + // finalize buffers + offsetAndType[tokenCount] = (TYPE$F.EOF << TYPE_SHIFT) | offset; // + balance[tokenCount] = sourceLength; + balance[sourceLength] = sourceLength; // prevents false positive balance match with any token + while (balanceStart !== 0) { + balancePrev = balanceStart & OFFSET_MASK; + balanceStart = balance[balancePrev]; + balance[balancePrev] = sourceLength; + } + + // update stream + stream.source = source; + stream.firstCharOffset = start; + stream.offsetAndType = offsetAndType; + stream.tokenCount = tokenCount; + stream.balance = balance; + stream.reset(); + stream.next(); + + return stream; + } + + // extend tokenizer with constants + Object.keys(constants$1).forEach(function(key) { + tokenize$3[key] = constants$1[key]; + }); + + // extend tokenizer with static methods from utils + Object.keys(charCodeDefinitions).forEach(function(key) { + tokenize$3[key] = charCodeDefinitions[key]; + }); + Object.keys(utils).forEach(function(key) { + tokenize$3[key] = utils[key]; + }); + + var tokenizer$3 = tokenize$3; + + var isDigit$3 = tokenizer$3.isDigit; + var cmpChar$4 = tokenizer$3.cmpChar; + var TYPE$E = tokenizer$3.TYPE; + + var DELIM$6 = TYPE$E.Delim; + var WHITESPACE$b = TYPE$E.WhiteSpace; + var COMMENT$9 = TYPE$E.Comment; + var IDENT$i = TYPE$E.Ident; + var NUMBER$9 = TYPE$E.Number; + var DIMENSION$7 = TYPE$E.Dimension; + var PLUSSIGN$8 = 0x002B; // U+002B PLUS SIGN (+) + var HYPHENMINUS$4 = 0x002D; // U+002D HYPHEN-MINUS (-) + var N$4 = 0x006E; // U+006E LATIN SMALL LETTER N (n) + var DISALLOW_SIGN$1 = true; + var ALLOW_SIGN$1 = false; + + function isDelim$1(token, code) { + return token !== null && token.type === DELIM$6 && token.value.charCodeAt(0) === code; + } + + function skipSC(token, offset, getNextToken) { + while (token !== null && (token.type === WHITESPACE$b || token.type === COMMENT$9)) { + token = getNextToken(++offset); + } + + return offset; + } + + function checkInteger$1(token, valueOffset, disallowSign, offset) { + if (!token) { + return 0; + } + + var code = token.value.charCodeAt(valueOffset); + + if (code === PLUSSIGN$8 || code === HYPHENMINUS$4) { + if (disallowSign) { + // Number sign is not allowed + return 0; + } + valueOffset++; + } + + for (; valueOffset < token.value.length; valueOffset++) { + if (!isDigit$3(token.value.charCodeAt(valueOffset))) { + // Integer is expected + return 0; + } + } + + return offset + 1; + } + + // ... + // ... ['+' | '-'] + function consumeB$1(token, offset_, getNextToken) { + var sign = false; + var offset = skipSC(token, offset_, getNextToken); + + token = getNextToken(offset); + + if (token === null) { + return offset_; + } + + if (token.type !== NUMBER$9) { + if (isDelim$1(token, PLUSSIGN$8) || isDelim$1(token, HYPHENMINUS$4)) { + sign = true; + offset = skipSC(getNextToken(++offset), offset, getNextToken); + token = getNextToken(offset); + + if (token === null && token.type !== NUMBER$9) { + return 0; + } + } else { + return offset_; + } + } + + if (!sign) { + var code = token.value.charCodeAt(0); + if (code !== PLUSSIGN$8 && code !== HYPHENMINUS$4) { + // Number sign is expected + return 0; + } + } + + return checkInteger$1(token, sign ? 0 : 1, sign, offset); + } + + // An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb + var genericAnPlusB = function anPlusB(token, getNextToken) { + /* eslint-disable brace-style*/ + var offset = 0; + + if (!token) { + return 0; + } + + // + if (token.type === NUMBER$9) { + return checkInteger$1(token, 0, ALLOW_SIGN$1, offset); // b + } + + // -n + // -n + // -n ['+' | '-'] + // -n- + // + else if (token.type === IDENT$i && token.value.charCodeAt(0) === HYPHENMINUS$4) { + // expect 1st char is N + if (!cmpChar$4(token.value, 1, N$4)) { + return 0; + } + + switch (token.value.length) { + // -n + // -n + // -n ['+' | '-'] + case 2: + return consumeB$1(getNextToken(++offset), offset, getNextToken); + + // -n- + case 3: + if (token.value.charCodeAt(2) !== HYPHENMINUS$4) { + return 0; + } + + offset = skipSC(getNextToken(++offset), offset, getNextToken); + token = getNextToken(offset); + + return checkInteger$1(token, 0, DISALLOW_SIGN$1, offset); + + // + default: + if (token.value.charCodeAt(2) !== HYPHENMINUS$4) { + return 0; + } + + return checkInteger$1(token, 3, DISALLOW_SIGN$1, offset); + } + } + + // '+'? n + // '+'? n + // '+'? n ['+' | '-'] + // '+'? n- + // '+'? + else if (token.type === IDENT$i || (isDelim$1(token, PLUSSIGN$8) && getNextToken(offset + 1).type === IDENT$i)) { + // just ignore a plus + if (token.type !== IDENT$i) { + token = getNextToken(++offset); + } + + if (token === null || !cmpChar$4(token.value, 0, N$4)) { + return 0; + } + + switch (token.value.length) { + // '+'? n + // '+'? n + // '+'? n ['+' | '-'] + case 1: + return consumeB$1(getNextToken(++offset), offset, getNextToken); + + // '+'? n- + case 2: + if (token.value.charCodeAt(1) !== HYPHENMINUS$4) { + return 0; + } + + offset = skipSC(getNextToken(++offset), offset, getNextToken); + token = getNextToken(offset); + + return checkInteger$1(token, 0, DISALLOW_SIGN$1, offset); + + // '+'? + default: + if (token.value.charCodeAt(1) !== HYPHENMINUS$4) { + return 0; + } + + return checkInteger$1(token, 2, DISALLOW_SIGN$1, offset); + } + } + + // + // + // + // + // ['+' | '-'] + else if (token.type === DIMENSION$7) { + var code = token.value.charCodeAt(0); + var sign = code === PLUSSIGN$8 || code === HYPHENMINUS$4 ? 1 : 0; + + for (var i = sign; i < token.value.length; i++) { + if (!isDigit$3(token.value.charCodeAt(i))) { + break; + } + } + + if (i === sign) { + // Integer is expected + return 0; + } + + if (!cmpChar$4(token.value, i, N$4)) { + return 0; + } + + // + // + // ['+' | '-'] + if (i + 1 === token.value.length) { + return consumeB$1(getNextToken(++offset), offset, getNextToken); + } else { + if (token.value.charCodeAt(i + 1) !== HYPHENMINUS$4) { + return 0; + } + + // + if (i + 2 === token.value.length) { + offset = skipSC(getNextToken(++offset), offset, getNextToken); + token = getNextToken(offset); + + return checkInteger$1(token, 0, DISALLOW_SIGN$1, offset); + } + // + else { + return checkInteger$1(token, i + 2, DISALLOW_SIGN$1, offset); + } + } + } + + return 0; + }; + + var isHexDigit$2 = tokenizer$3.isHexDigit; + var cmpChar$3 = tokenizer$3.cmpChar; + var TYPE$D = tokenizer$3.TYPE; + + var IDENT$h = TYPE$D.Ident; + var DELIM$5 = TYPE$D.Delim; + var NUMBER$8 = TYPE$D.Number; + var DIMENSION$6 = TYPE$D.Dimension; + var PLUSSIGN$7 = 0x002B; // U+002B PLUS SIGN (+) + var HYPHENMINUS$3 = 0x002D; // U+002D HYPHEN-MINUS (-) + var QUESTIONMARK$2 = 0x003F; // U+003F QUESTION MARK (?) + var U$2 = 0x0075; // U+0075 LATIN SMALL LETTER U (u) + + function isDelim(token, code) { + return token !== null && token.type === DELIM$5 && token.value.charCodeAt(0) === code; + } + + function startsWith$1(token, code) { + return token.value.charCodeAt(0) === code; + } + + function hexSequence(token, offset, allowDash) { + for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) { + var code = token.value.charCodeAt(pos); + + if (code === HYPHENMINUS$3 && allowDash && hexlen !== 0) { + if (hexSequence(token, offset + hexlen + 1, false) > 0) { + return 6; // dissallow following question marks + } + + return 0; // dash at the ending of a hex sequence is not allowed + } + + if (!isHexDigit$2(code)) { + return 0; // not a hex digit + } + + if (++hexlen > 6) { + return 0; // too many hex digits + } } + + return hexlen; + } + + function withQuestionMarkSequence(consumed, length, getNextToken) { + if (!consumed) { + return 0; // nothing consumed + } + + while (isDelim(getNextToken(length), QUESTIONMARK$2)) { + if (++consumed > 6) { + return 0; // too many question marks + } + + length++; + } + + return length; + } + + // https://drafts.csswg.org/css-syntax/#urange + // Informally, the production has three forms: + // U+0001 + // Defines a range consisting of a single code point, in this case the code point "1". + // U+0001-00ff + // Defines a range of codepoints between the first and the second value, in this case + // the range between "1" and "ff" (255 in decimal) inclusive. + // U+00?? + // Defines a range of codepoints where the "?" characters range over all hex digits, + // in this case defining the same as the value U+0000-00ff. + // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit). + // + // = + // u '+' '?'* | + // u '?'* | + // u '?'* | + // u | + // u | + // u '+' '?'+ + var genericUrange = function urange(token, getNextToken) { + var length = 0; + + // should start with `u` or `U` + if (token === null || token.type !== IDENT$h || !cmpChar$3(token.value, 0, U$2)) { + return 0; + } + + token = getNextToken(++length); + if (token === null) { + return 0; + } + + // u '+' '?'* + // u '+' '?'+ + if (isDelim(token, PLUSSIGN$7)) { + token = getNextToken(++length); + if (token === null) { + return 0; + } + + if (token.type === IDENT$h) { + // u '+' '?'* + return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken); + } + + if (isDelim(token, QUESTIONMARK$2)) { + // u '+' '?'+ + return withQuestionMarkSequence(1, ++length, getNextToken); + } + + // Hex digit or question mark is expected + return 0; + } + + // u '?'* + // u + // u + if (token.type === NUMBER$8) { + if (!startsWith$1(token, PLUSSIGN$7)) { + return 0; + } + + var consumedHexLength = hexSequence(token, 1, true); + if (consumedHexLength === 0) { + return 0; + } + + token = getNextToken(++length); + if (token === null) { + // u + return length; + } + + if (token.type === DIMENSION$6 || token.type === NUMBER$8) { + // u + // u + if (!startsWith$1(token, HYPHENMINUS$3) || !hexSequence(token, 1, false)) { + return 0; + } + + return length + 1; + } + + // u '?'* + return withQuestionMarkSequence(consumedHexLength, length, getNextToken); + } + + // u '?'* + if (token.type === DIMENSION$6) { + if (!startsWith$1(token, PLUSSIGN$7)) { + return 0; + } + + return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken); + } + + return 0; + }; + + var tokenizer$2 = tokenizer$3; + var isIdentifierStart = tokenizer$2.isIdentifierStart; + var isHexDigit$1 = tokenizer$2.isHexDigit; + var isDigit$2 = tokenizer$2.isDigit; + var cmpStr$3 = tokenizer$2.cmpStr; + var consumeNumber$3 = tokenizer$2.consumeNumber; + var TYPE$C = tokenizer$2.TYPE; + var anPlusB = genericAnPlusB; + var urange = genericUrange; + + var cssWideKeywords$1 = ['unset', 'initial', 'inherit']; + var calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc(']; + + // https://www.w3.org/TR/css-values-3/#lengths + var LENGTH = { + // absolute length units + 'px': true, + 'mm': true, + 'cm': true, + 'in': true, + 'pt': true, + 'pc': true, + 'q': true, + + // relative length units + 'em': true, + 'ex': true, + 'ch': true, + 'rem': true, + + // viewport-percentage lengths + 'vh': true, + 'vw': true, + 'vmin': true, + 'vmax': true, + 'vm': true + }; + + var ANGLE = { + 'deg': true, + 'grad': true, + 'rad': true, + 'turn': true + }; + + var TIME = { + 's': true, + 'ms': true + }; + + var FREQUENCY = { + 'hz': true, + 'khz': true + }; + + // https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution) + var RESOLUTION = { + 'dpi': true, + 'dpcm': true, + 'dppx': true, + 'x': true // https://github.com/w3c/csswg-drafts/issues/461 + }; + + // https://drafts.csswg.org/css-grid/#fr-unit + var FLEX = { + 'fr': true + }; + + // https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume + var DECIBEL = { + 'db': true + }; + + // https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch + var SEMITONES = { + 'st': true + }; + + // safe char code getter + function charCode(str, index) { + return index < str.length ? str.charCodeAt(index) : 0; + } + + function eqStr(actual, expected) { + return cmpStr$3(actual, 0, actual.length, expected); + } + + function eqStrAny(actual, expected) { + for (var i = 0; i < expected.length; i++) { + if (eqStr(actual, expected[i])) { + return true; + } + } + + return false; + } + + // IE postfix hack, i.e. 123\0 or 123px\9 + function isPostfixIeHack(str, offset) { + if (offset !== str.length - 2) { + return false; + } + + return ( + str.charCodeAt(offset) === 0x005C && // U+005C REVERSE SOLIDUS (\) + isDigit$2(str.charCodeAt(offset + 1)) + ); + } + + function outOfRange(opts, value, numEnd) { + if (opts && opts.type === 'Range') { + var num = Number( + numEnd !== undefined && numEnd !== value.length + ? value.substr(0, numEnd) + : value + ); + + if (isNaN(num)) { + return true; + } + + if (opts.min !== null && num < opts.min) { + return true; + } + + if (opts.max !== null && num > opts.max) { + return true; + } + } + + return false; + } + + function consumeFunction(token, getNextToken) { + var startIdx = token.index; + var length = 0; + + // balanced token consuming + do { + length++; + + if (token.balance <= startIdx) { + break; + } + } while (token = getNextToken(length)); + + return length; + } + + // TODO: implement + // can be used wherever , , ,

+3*h@X^o_yruPl1N$gucEv=k{9iwHu`sV%DN%=S0 z{+p=$kI?!rT-N_F8vn29tbZtF{x>@7A7ZC}oh|<&;Q4nti=O@a$*KP{pY`pHW?=c( z5x?|;NWnIB-uYTy)m~J6@OD*J-G171d~7&M5OF+Diyc~;FcV3#8jT~-b@*Ld3xSUq z6%ar|09@a`8pGE#j0O*G*@ayLoJ32I9s^wG1*OyX(@Q*QfGTve{;K*<7RD%|OBC(u zW^~nQ)st%H>-px@M{oe0z(@eDAd^NqZyaqW$x{#-eBZUOr72C7F6w7cHx$8{x|#3m zg#Xj{LVG0G?k7WoqbcpS^G!PYnRq}2Xuv&|Yo%@{^fLAJ2h{V~pEkS8ime;XuO9?> zTC`nGHkRIZiL#q-P}lF8yFQoLS~H#5+JP=0Yq5@KSH91)vR7Vc1iQ)bd#tot9QB{N zZ{44);P%&r*_|z)*T%0oGhi(gU)a_w?x8)Lw2iud?!~*N zc^w{9WzvH`QD07YiQs&8Eu&8w?y{Rcv9}%=-WWdIbJXCrr-FyFhpz;vYHrBSI2wFA z9EWs&tbM^=<~=;Gy=is198z@1i_p5dLrzM1lRRk!sh~n9J+nBp!?YmZZ2?RTx zL~Qh(wQS@qj#Iw{P~q96qQW(|5RoQpqUciA*14#3`B=3I3omQB?M1ZB<}KWq0{a=y zO^2Y~QnK&59-9BmO;^JVw#1I#I=X�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 Z006e--`xNJ007m!D^UOeS(kdz008>)B+&o> literal 0 HcmV?d00001 diff --git a/envelopes/paged.js/paged.polyfill.js b/envelopes/paged.js/paged.polyfill.js new file mode 100644 index 0000000..3e06680 --- /dev/null +++ b/envelopes/paged.js/paged.polyfill.js @@ -0,0 +1,33047 @@ +/** + * @license Paged.js v0.4.1 | MIT | https://gitlab.pagedmedia.org/tools/pagedjs + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.PagedPolyfill = factory()); +})(this, (function () { 'use strict'; + + var eventEmitter = {exports: {}}; + + var d$3 = {exports: {}}; + + var isImplemented$6 = function () { + var assign = Object.assign, obj; + if (typeof assign !== "function") return false; + obj = { foo: "raz" }; + assign(obj, { bar: "dwa" }, { trzy: "trzy" }); + return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy"; + }; + + var isImplemented$5 = function () { + try { + Object.keys("primitive"); + return true; + } catch (e) { + return false; + } + }; + + // eslint-disable-next-line no-empty-function + var noop$4 = function () {}; + + var _undefined = noop$4(); // Support ES3 engines + + var isValue$5 = function (val) { + return (val !== _undefined) && (val !== null); + }; + + var isValue$4 = isValue$5; + + var keys$2 = Object.keys; + + var shim$5 = function (object) { + return keys$2(isValue$4(object) ? Object(object) : object); + }; + + var keys$1 = isImplemented$5() + ? Object.keys + : shim$5; + + var isValue$3 = isValue$5; + + var validValue$1 = function (value) { + if (!isValue$3(value)) throw new TypeError("Cannot use null or undefined"); + return value; + }; + + var keys = keys$1 + , value$3 = validValue$1 + , max$1 = Math.max; + + var shim$4 = function (dest, src /*, …srcn*/) { + var error, i, length = max$1(arguments.length, 2), assign; + dest = Object(value$3(dest)); + assign = function (key) { + try { + dest[key] = src[key]; + } catch (e) { + if (!error) error = e; + } + }; + for (i = 1; i < length; ++i) { + src = arguments[i]; + keys(src).forEach(assign); + } + if (error !== undefined) throw error; + return dest; + }; + + var assign$2 = isImplemented$6() + ? Object.assign + : shim$4; + + var isValue$2 = isValue$5; + + var forEach$1 = Array.prototype.forEach, create$6 = Object.create; + + var process = function (src, obj) { + var key; + for (key in src) obj[key] = src[key]; + }; + + // eslint-disable-next-line no-unused-vars + var normalizeOptions = function (opts1 /*, …options*/) { + var result = create$6(null); + forEach$1.call(arguments, function (options) { + if (!isValue$2(options)) return; + process(Object(options), result); + }); + return result; + }; + + var isCallable$1 = function (obj) { + return typeof obj === "function"; + }; + + var str = "razdwatrzy"; + + var isImplemented$4 = function () { + if (typeof str.contains !== "function") return false; + return (str.contains("dwa") === true) && (str.contains("foo") === false); + }; + + var indexOf$3 = String.prototype.indexOf; + + var shim$3 = function (searchString/*, position*/) { + return indexOf$3.call(this, searchString, arguments[1]) > -1; + }; + + var contains$1 = isImplemented$4() + ? String.prototype.contains + : shim$3; + + var assign$1 = assign$2 + , normalizeOpts = normalizeOptions + , isCallable = isCallable$1 + , contains = contains$1 + + , d$2; + + d$2 = d$3.exports = function (dscr, value/*, options*/) { + var c, e, w, options, desc; + if ((arguments.length < 2) || (typeof dscr !== 'string')) { + options = value; + value = dscr; + dscr = null; + } else { + options = arguments[2]; + } + if (dscr == null) { + c = w = true; + e = false; + } else { + c = contains.call(dscr, 'c'); + e = contains.call(dscr, 'e'); + w = contains.call(dscr, 'w'); + } + + desc = { value: value, configurable: c, enumerable: e, writable: w }; + return !options ? desc : assign$1(normalizeOpts(options), desc); + }; + + d$2.gs = function (dscr, get, set/*, options*/) { + var c, e, options, desc; + if (typeof dscr !== 'string') { + options = set; + set = get; + get = dscr; + dscr = null; + } else { + options = arguments[3]; + } + if (get == null) { + get = undefined; + } else if (!isCallable(get)) { + options = get; + get = set = undefined; + } else if (set == null) { + set = undefined; + } else if (!isCallable(set)) { + options = set; + set = undefined; + } + if (dscr == null) { + c = true; + e = false; + } else { + c = contains.call(dscr, 'c'); + e = contains.call(dscr, 'e'); + } + + desc = { get: get, set: set, configurable: c, enumerable: e }; + return !options ? desc : assign$1(normalizeOpts(options), desc); + }; + + var validCallable = function (fn) { + if (typeof fn !== "function") throw new TypeError(fn + " is not a function"); + return fn; + }; + + (function (module, exports) { + + var d = d$3.exports + , callable = validCallable + + , apply = Function.prototype.apply, call = Function.prototype.call + , create = Object.create, defineProperty = Object.defineProperty + , defineProperties = Object.defineProperties + , hasOwnProperty = Object.prototype.hasOwnProperty + , descriptor = { configurable: true, enumerable: false, writable: true } + + , on, once, off, emit, methods, descriptors, base; + + on = function (type, listener) { + var data; + + callable(listener); + + if (!hasOwnProperty.call(this, '__ee__')) { + data = descriptor.value = create(null); + defineProperty(this, '__ee__', descriptor); + descriptor.value = null; + } else { + data = this.__ee__; + } + if (!data[type]) data[type] = listener; + else if (typeof data[type] === 'object') data[type].push(listener); + else data[type] = [data[type], listener]; + + return this; + }; + + once = function (type, listener) { + var once, self; + + callable(listener); + self = this; + on.call(this, type, once = function () { + off.call(self, type, once); + apply.call(listener, this, arguments); + }); + + once.__eeOnceListener__ = listener; + return this; + }; + + off = function (type, listener) { + var data, listeners, candidate, i; + + callable(listener); + + if (!hasOwnProperty.call(this, '__ee__')) return this; + data = this.__ee__; + if (!data[type]) return this; + listeners = data[type]; + + if (typeof listeners === 'object') { + for (i = 0; (candidate = listeners[i]); ++i) { + if ((candidate === listener) || + (candidate.__eeOnceListener__ === listener)) { + if (listeners.length === 2) data[type] = listeners[i ? 0 : 1]; + else listeners.splice(i, 1); + } + } + } else { + if ((listeners === listener) || + (listeners.__eeOnceListener__ === listener)) { + delete data[type]; + } + } + + return this; + }; + + emit = function (type) { + var i, l, listener, listeners, args; + + if (!hasOwnProperty.call(this, '__ee__')) return; + listeners = this.__ee__[type]; + if (!listeners) return; + + if (typeof listeners === 'object') { + l = arguments.length; + args = new Array(l - 1); + for (i = 1; i < l; ++i) args[i - 1] = arguments[i]; + + listeners = listeners.slice(); + for (i = 0; (listener = listeners[i]); ++i) { + apply.call(listener, this, args); + } + } else { + switch (arguments.length) { + case 1: + call.call(listeners, this); + break; + case 2: + call.call(listeners, this, arguments[1]); + break; + case 3: + call.call(listeners, this, arguments[1], arguments[2]); + break; + default: + l = arguments.length; + args = new Array(l - 1); + for (i = 1; i < l; ++i) { + args[i - 1] = arguments[i]; + } + apply.call(listeners, this, args); + } + } + }; + + methods = { + on: on, + once: once, + off: off, + emit: emit + }; + + descriptors = { + on: d(on), + once: d(once), + off: d(off), + emit: d(emit) + }; + + base = defineProperties({}, descriptors); + + module.exports = exports = function (o) { + return (o == null) ? create(base) : defineProperties(Object(o), descriptors); + }; + exports.methods = methods; + }(eventEmitter, eventEmitter.exports)); + + var EventEmitter = eventEmitter.exports; + + /** + * Hooks allow for injecting functions that must all complete in order before finishing + * They will execute in parallel but all must finish before continuing + * Functions may return a promise if they are asycn. + * From epubjs/src/utils/hooks + * @param {any} context scope of this + * @example this.content = new Hook(this); + */ + class Hook { + constructor(context){ + this.context = context || this; + this.hooks = []; + } + + /** + * Adds a function to be run before a hook completes + * @example this.content.register(function(){...}); + * @return {undefined} void + */ + register(){ + for(var i = 0; i < arguments.length; ++i) { + if (typeof arguments[i] === "function") { + this.hooks.push(arguments[i]); + } else { + // unpack array + for(var j = 0; j < arguments[i].length; ++j) { + this.hooks.push(arguments[i][j]); + } + } + } + } + + /** + * Triggers a hook to run all functions + * @example this.content.trigger(args).then(function(){...}); + * @return {Promise} results + */ + trigger(){ + var args = arguments; + var context = this.context; + var promises = []; + + this.hooks.forEach(function(task) { + var executing = task.apply(context, args); + + if(executing && typeof executing["then"] === "function") { + // Task is a function that returns a promise + promises.push(executing); + } else { + // Otherwise Task resolves immediately, add resolved promise with result + promises.push(new Promise((resolve, reject) => { + resolve(executing); + })); + } + }); + + + return Promise.all(promises); + } + + /** + * Triggers a hook to run all functions synchronously + * @example this.content.trigger(args).then(function(){...}); + * @return {Array} results + */ + triggerSync(){ + var args = arguments; + var context = this.context; + var results = []; + + this.hooks.forEach(function(task) { + var executing = task.apply(context, args); + + results.push(executing); + }); + + + return results; + } + + // Adds a function to be run before a hook completes + list(){ + return this.hooks; + } + + clear(){ + return this.hooks = []; + } + } + + function getBoundingClientRect(element) { + if (!element) { + return; + } + let rect; + if (typeof element.getBoundingClientRect !== "undefined") { + rect = element.getBoundingClientRect(); + } else { + let range = document.createRange(); + range.selectNode(element); + rect = range.getBoundingClientRect(); + } + return rect; + } + + function getClientRects(element) { + if (!element) { + return; + } + let rect; + if (typeof element.getClientRects !== "undefined") { + rect = element.getClientRects(); + } else { + let range = document.createRange(); + range.selectNode(element); + rect = range.getClientRects(); + } + return rect; + } + + /** + * Generates a UUID + * based on: http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript + * @returns {string} uuid + */ + function UUID() { + var d = new Date().getTime(); + if (typeof performance !== "undefined" && typeof performance.now === "function") { + d += performance.now(); //use high-precision timer if available + } + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c === "x" ? r : (r & 0x3 | 0x8)).toString(16); + }); + } + + function attr(element, attributes) { + for (var i = 0; i < attributes.length; i++) { + if (element.hasAttribute(attributes[i])) { + return element.getAttribute(attributes[i]); + } + } + } + + /* Based on by https://mths.be/cssescape v1.5.1 by @mathias | MIT license + * Allows # and . + */ + function querySelectorEscape(value) { + if (arguments.length == 0) { + throw new TypeError("`CSS.escape` requires an argument."); + } + var string = String(value); + + var length = string.length; + var index = -1; + var codeUnit; + var result = ""; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + + + + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER + // (U+FFFD). + if (codeUnit == 0x0000) { + result += "\uFFFD"; + continue; + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index == 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit == 0x002D + ) + ) { + // https://drafts.csswg.org/cssom/#escape-a-character-as-code-point + result += "\\" + codeUnit.toString(16) + " "; + continue; + } + + if ( + // If the character is the first character and is a `-` (U+002D), and + // there is no second character, […] + index == 0 && + length == 1 && + codeUnit == 0x002D + ) { + result += "\\" + string.charAt(index); + continue; + } + + // support for period character in id + if (codeUnit == 0x002E) { + if (string.charAt(0) == "#") { + result += "\\."; + continue; + } + } + + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit == 0x002D || + codeUnit == 0x005F || + codeUnit == 35 || // Allow # + codeUnit == 46 || // Allow . + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // https://drafts.csswg.org/cssom/#escape-a-character + result += "\\" + string.charAt(index); + + } + return result; + } + + /** + * Creates a new pending promise and provides methods to resolve or reject it. + * From: https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred#backwards_forwards_compatible + * @returns {object} defered + */ + function defer() { + this.resolve = null; + + this.reject = null; + + this.id = UUID(); + + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + Object.freeze(this); + } + + const requestIdleCallback = typeof window !== "undefined" && ("requestIdleCallback" in window ? window.requestIdleCallback : window.requestAnimationFrame); + + function CSSValueToString(obj) { + return obj.value + (obj.unit || ""); + } + + function isElement(node) { + return node && node.nodeType === 1; + } + + function isText(node) { + return node && node.nodeType === 3; + } + + function* walk$2(start, limiter) { + let node = start; + + while (node) { + + yield node; + + if (node.childNodes.length) { + node = node.firstChild; + } else if (node.nextSibling) { + if (limiter && node === limiter) { + node = undefined; + break; + } + node = node.nextSibling; + } else { + while (node) { + node = node.parentNode; + if (limiter && node === limiter) { + node = undefined; + break; + } + if (node && node.nextSibling) { + node = node.nextSibling; + break; + } + + } + } + } + } + + function nodeAfter(node, limiter) { + if (limiter && node === limiter) { + return; + } + let significantNode = nextSignificantNode(node); + if (significantNode) { + return significantNode; + } + if (node.parentNode) { + while ((node = node.parentNode)) { + if (limiter && node === limiter) { + return; + } + significantNode = nextSignificantNode(node); + if (significantNode) { + return significantNode; + } + } + } + } + + function nodeBefore(node, limiter) { + if (limiter && node === limiter) { + return; + } + let significantNode = previousSignificantNode(node); + if (significantNode) { + return significantNode; + } + if (node.parentNode) { + while ((node = node.parentNode)) { + if (limiter && node === limiter) { + return; + } + significantNode = previousSignificantNode(node); + if (significantNode) { + return significantNode; + } + } + } + } + + function elementAfter(node, limiter) { + let after = nodeAfter(node, limiter); + + while (after && after.nodeType !== 1) { + after = nodeAfter(after, limiter); + } + + return after; + } + + function elementBefore(node, limiter) { + let before = nodeBefore(node, limiter); + + while (before && before.nodeType !== 1) { + before = nodeBefore(before, limiter); + } + + return before; + } + + function displayedElementAfter(node, limiter) { + let after = elementAfter(node, limiter); + + while (after && after.dataset.undisplayed) { + after = elementAfter(after, limiter); + } + + return after; + } + + function displayedElementBefore(node, limiter) { + let before = elementBefore(node, limiter); + + while (before && before.dataset.undisplayed) { + before = elementBefore(before, limiter); + } + + return before; + } + + function rebuildAncestors(node) { + let parent, ancestor; + let ancestors = []; + let added = []; + + let fragment = document.createDocumentFragment(); + + // Handle rowspan on table + if (node.nodeName === "TR") { + let previousRow = node.previousElementSibling; + let previousRowDistance = 1; + while (previousRow) { + // previous row has more columns, might indicate a rowspan. + if (previousRow.childElementCount > node.childElementCount) { + const initialColumns = Array.from(node.children); + while (node.firstChild) { + node.firstChild.remove(); + } + let k = 0; + for (let j = 0; j < previousRow.children.length; j++) { + let column = previousRow.children[j]; + if (column.rowSpan && column.rowSpan > previousRowDistance) { + const duplicatedColumn = column.cloneNode(true); + // Adjust rowspan value + duplicatedColumn.rowSpan = column.rowSpan - previousRowDistance; + // Add the column to the row + node.appendChild(duplicatedColumn); + } else { + // Fill the gap with the initial columns (if exists) + const initialColumn = initialColumns[k++]; + // The initial column can be undefined if the newly created table has less columns than the original table + if (initialColumn) { + node.appendChild(initialColumn); + } + } + } + } + previousRow = previousRow.previousElementSibling; + previousRowDistance++; + } + } + + // Gather all ancestors + let element = node; + while(element.parentNode && element.parentNode.nodeType === 1) { + ancestors.unshift(element.parentNode); + element = element.parentNode; + } + + for (var i = 0; i < ancestors.length; i++) { + ancestor = ancestors[i]; + parent = ancestor.cloneNode(false); + + parent.setAttribute("data-split-from", parent.getAttribute("data-ref")); + // ancestor.setAttribute("data-split-to", parent.getAttribute("data-ref")); + + if (parent.hasAttribute("id")) { + let dataID = parent.getAttribute("id"); + parent.setAttribute("data-id", dataID); + parent.removeAttribute("id"); + } + + // This is handled by css :not, but also tidied up here + if (parent.hasAttribute("data-break-before")) { + parent.removeAttribute("data-break-before"); + } + + if (parent.hasAttribute("data-previous-break-after")) { + parent.removeAttribute("data-previous-break-after"); + } + + if (added.length) { + let container = added[added.length-1]; + container.appendChild(parent); + } else { + fragment.appendChild(parent); + } + added.push(parent); + + // rebuild table rows + if (parent.nodeName === "TD" && ancestor.parentElement.contains(ancestor)) { + let td = ancestor; + let prev = parent; + while ((td = td.previousElementSibling)) { + let sib = td.cloneNode(false); + parent.parentElement.insertBefore(sib, prev); + prev = sib; + } + + } + } + + added = undefined; + return fragment; + } + /* + export function split(bound, cutElement, breakAfter) { + let needsRemoval = []; + let index = indexOf(cutElement); + + if (!breakAfter && index === 0) { + return; + } + + if (breakAfter && index === (cutElement.parentNode.children.length - 1)) { + return; + } + + // Create a fragment with rebuilt ancestors + let fragment = rebuildAncestors(cutElement); + + // Clone cut + if (!breakAfter) { + let clone = cutElement.cloneNode(true); + let ref = cutElement.parentNode.getAttribute('data-ref'); + let parent = fragment.querySelector("[data-ref='" + ref + "']"); + parent.appendChild(clone); + needsRemoval.push(cutElement); + } + + // Remove all after cut + let next = nodeAfter(cutElement, bound); + while (next) { + let clone = next.cloneNode(true); + let ref = next.parentNode.getAttribute('data-ref'); + let parent = fragment.querySelector("[data-ref='" + ref + "']"); + parent.appendChild(clone); + needsRemoval.push(next); + next = nodeAfter(next, bound); + } + + // Remove originals + needsRemoval.forEach((node) => { + if (node) { + node.remove(); + } + }); + + // Insert after bounds + bound.parentNode.insertBefore(fragment, bound.nextSibling); + return [bound, bound.nextSibling]; + } + */ + + function needsBreakBefore(node) { + if( typeof node !== "undefined" && + typeof node.dataset !== "undefined" && + typeof node.dataset.breakBefore !== "undefined" && + (node.dataset.breakBefore === "always" || + node.dataset.breakBefore === "page" || + node.dataset.breakBefore === "left" || + node.dataset.breakBefore === "right" || + node.dataset.breakBefore === "recto" || + node.dataset.breakBefore === "verso") + ) { + return true; + } + + return false; + } + + function needsPreviousBreakAfter(node) { + if( typeof node !== "undefined" && + typeof node.dataset !== "undefined" && + typeof node.dataset.previousBreakAfter !== "undefined" && + (node.dataset.previousBreakAfter === "always" || + node.dataset.previousBreakAfter === "page" || + node.dataset.previousBreakAfter === "left" || + node.dataset.previousBreakAfter === "right" || + node.dataset.previousBreakAfter === "recto" || + node.dataset.previousBreakAfter === "verso") + ) { + return true; + } + + return false; + } + + function needsPageBreak(node, previousSignificantNode) { + if (typeof node === "undefined" || !previousSignificantNode || isIgnorable(node)) { + return false; + } + if (node.dataset && node.dataset.undisplayed) { + return false; + } + let previousSignificantNodePage = previousSignificantNode.dataset ? previousSignificantNode.dataset.page : undefined; + if (typeof previousSignificantNodePage === "undefined") { + const nodeWithNamedPage = getNodeWithNamedPage(previousSignificantNode); + if (nodeWithNamedPage) { + previousSignificantNodePage = nodeWithNamedPage.dataset.page; + } + } + let currentNodePage = node.dataset ? node.dataset.page : undefined; + if (typeof currentNodePage === "undefined") { + const nodeWithNamedPage = getNodeWithNamedPage(node, previousSignificantNode); + if (nodeWithNamedPage) { + currentNodePage = nodeWithNamedPage.dataset.page; + } + } + return currentNodePage !== previousSignificantNodePage; + } + + function *words(node) { + let currentText = node.nodeValue; + let max = currentText.length; + let currentOffset = 0; + let currentLetter; + + let range; + const significantWhitespaces = node.parentElement && node.parentElement.nodeName === "PRE"; + + while (currentOffset < max) { + currentLetter = currentText[currentOffset]; + if (/^[\S\u202F\u00A0]$/.test(currentLetter) || significantWhitespaces) { + if (!range) { + range = document.createRange(); + range.setStart(node, currentOffset); + } + } else { + if (range) { + range.setEnd(node, currentOffset); + yield range; + range = undefined; + } + } + + currentOffset += 1; + } + + if (range) { + range.setEnd(node, currentOffset); + yield range; + } + } + + function *letters(wordRange) { + let currentText = wordRange.startContainer; + let max = currentText.length; + let currentOffset = wordRange.startOffset; + // let currentLetter; + + let range; + + while(currentOffset < max) { + // currentLetter = currentText[currentOffset]; + range = document.createRange(); + range.setStart(currentText, currentOffset); + range.setEnd(currentText, currentOffset+1); + + yield range; + + currentOffset += 1; + } + } + + function isContainer(node) { + let container; + + if (typeof node.tagName === "undefined") { + return true; + } + + if (node.style && node.style.display === "none") { + return false; + } + + switch (node.tagName) { + // Inline + case "A": + case "ABBR": + case "ACRONYM": + case "B": + case "BDO": + case "BIG": + case "BR": + case "BUTTON": + case "CITE": + case "CODE": + case "DFN": + case "EM": + case "I": + case "IMG": + case "INPUT": + case "KBD": + case "LABEL": + case "MAP": + case "OBJECT": + case "Q": + case "SAMP": + case "SCRIPT": + case "SELECT": + case "SMALL": + case "SPAN": + case "STRONG": + case "SUB": + case "SUP": + case "TEXTAREA": + case "TIME": + case "TT": + case "VAR": + case "P": + case "H1": + case "H2": + case "H3": + case "H4": + case "H5": + case "H6": + case "FIGCAPTION": + case "BLOCKQUOTE": + case "PRE": + case "LI": + case "TD": + case "DT": + case "DD": + case "VIDEO": + case "CANVAS": + container = false; + break; + default: + container = true; + } + + return container; + } + + function cloneNode(n, deep=false) { + return n.cloneNode(deep); + } + + function findElement(node, doc, forceQuery) { + const ref = node.getAttribute("data-ref"); + return findRef(ref, doc, forceQuery); + } + + function findRef(ref, doc, forceQuery) { + if (!forceQuery && doc.indexOfRefs && doc.indexOfRefs[ref]) { + return doc.indexOfRefs[ref]; + } else { + return doc.querySelector(`[data-ref='${ref}']`); + } + } + + function validNode(node) { + if (isText(node)) { + return true; + } + + if (isElement(node) && node.dataset.ref) { + return true; + } + + return false; + } + + function prevValidNode(node) { + while (!validNode(node)) { + if (node.previousSibling) { + node = node.previousSibling; + } else { + node = node.parentNode; + } + + if (!node) { + break; + } + } + + return node; + } + + + function indexOf$2(node) { + let parent = node.parentNode; + if (!parent) { + return 0; + } + return Array.prototype.indexOf.call(parent.childNodes, node); + } + + function child(node, index) { + return node.childNodes[index]; + } + + function hasContent(node) { + if (isElement(node)) { + return true; + } else if (isText(node) && + node.textContent.trim().length) { + return true; + } + return false; + } + + function indexOfTextNode(node, parent) { + if (!isText(node)) { + return -1; + } + let nodeTextContent = node.textContent; + let child; + let index = -1; + for (var i = 0; i < parent.childNodes.length; i++) { + child = parent.childNodes[i]; + if (child.nodeType === 3) { + let text = parent.childNodes[i].textContent; + if (text.includes(nodeTextContent)) { + index = i; + break; + } + } + } + + return index; + } + + + /** + * Throughout, whitespace is defined as one of the characters + * "\t" TAB \u0009 + * "\n" LF \u000A + * "\r" CR \u000D + * " " SPC \u0020 + * + * This does not use Javascript's "\s" because that includes non-breaking + * spaces (and also some other characters). + */ + + /** + * Determine if a node should be ignored by the iterator functions. + * taken from https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace#Whitespace_helper_functions + * + * @param {Node} node An object implementing the DOM1 |Node| interface. + * @return {boolean} true if the node is: + * 1) A |Text| node that is all whitespace + * 2) A |Comment| node + * and otherwise false. + */ + function isIgnorable(node) { + return (node.nodeType === 8) || // A comment node + ((node.nodeType === 3) && isAllWhitespace(node)); // a text node, all whitespace + } + + /** + * Determine whether a node's text content is entirely whitespace. + * + * @param {Node} node A node implementing the |CharacterData| interface (i.e., a |Text|, |Comment|, or |CDATASection| node + * @return {boolean} true if all of the text content of |nod| is whitespace, otherwise false. + */ + function isAllWhitespace(node) { + return !(/[^\t\n\r ]/.test(node.textContent)); + } + + /** + * Version of |previousSibling| that skips nodes that are entirely + * whitespace or comments. (Normally |previousSibling| is a property + * of all DOM nodes that gives the sibling node, the node that is + * a child of the same parent, that occurs immediately before the + * reference node.) + * + * @param {ChildNode} sib The reference node. + * @return {Node|null} Either: + * 1) The closest previous sibling to |sib| that is not ignorable according to |is_ignorable|, or + * 2) null if no such node exists. + */ + function previousSignificantNode(sib) { + while ((sib = sib.previousSibling)) { + if (!isIgnorable(sib)) return sib; + } + return null; + } + + function getNodeWithNamedPage(node, limiter) { + if (node && node.dataset && node.dataset.page) { + return node; + } + if (node.parentNode) { + while ((node = node.parentNode)) { + if (limiter && node === limiter) { + return; + } + if (node.dataset && node.dataset.page) { + return node; + } + } + } + return null; + } + + function breakInsideAvoidParentNode(node) { + while ((node = node.parentNode)) { + if (node && node.dataset && node.dataset.breakInside === "avoid") { + return node; + } + } + return null; + } + + /** + * Find a parent with a given node name. + * @param {Node} node - initial Node + * @param {string} nodeName - node name (eg. "TD", "TABLE", "STRONG"...) + * @param {Node} limiter - go up to the parent until there's no more parent or the current node is equals to the limiter + * @returns {Node|undefined} - Either: + * 1) The closest parent for a the given node name, or + * 2) undefined if no such node exists. + */ + function parentOf(node, nodeName, limiter) { + if (limiter && node === limiter) { + return; + } + if (node.parentNode) { + while ((node = node.parentNode)) { + if (limiter && node === limiter) { + return; + } + if (node.nodeName === nodeName) { + return node; + } + } + } + } + + /** + * Version of |nextSibling| that skips nodes that are entirely + * whitespace or comments. + * + * @param {ChildNode} sib The reference node. + * @return {Node|null} Either: + * 1) The closest next sibling to |sib| that is not ignorable according to |is_ignorable|, or + * 2) null if no such node exists. + */ + function nextSignificantNode(sib) { + while ((sib = sib.nextSibling)) { + if (!isIgnorable(sib)) return sib; + } + return null; + } + + function filterTree(content, func, what) { + const treeWalker = document.createTreeWalker( + content || this.dom, + what || NodeFilter.SHOW_ALL, + func ? { acceptNode: func } : null, + false + ); + + let node; + let current; + node = treeWalker.nextNode(); + while(node) { + current = node; + node = treeWalker.nextNode(); + current.parentNode.removeChild(current); + } + } + + /** + * BreakToken + * @class + */ + class BreakToken { + + constructor(node, offset) { + this.node = node; + this.offset = offset; + } + + equals(otherBreakToken) { + if (!otherBreakToken) { + return false; + } + if (this["node"] && otherBreakToken["node"] && + this["node"] !== otherBreakToken["node"]) { + return false; + } + if (this["offset"] && otherBreakToken["offset"] && + this["offset"] !== otherBreakToken["offset"]) { + return false; + } + return true; + } + + toJSON(hash) { + let node; + let index = 0; + if (!this.node) { + return {}; + } + if (isElement(this.node) && this.node.dataset.ref) { + node = this.node.dataset.ref; + } else if (hash) { + node = this.node.parentElement.dataset.ref; + } + + if (this.node.parentElement) { + const children = Array.from(this.node.parentElement.childNodes); + index = children.indexOf(this.node); + } + + return JSON.stringify({ + "node": node, + "index" : index, + "offset": this.offset + }); + } + + } + + /** + * Render result. + * @class + */ + class RenderResult { + + constructor(breakToken, error) { + this.breakToken = breakToken; + this.error = error; + } + } + + class OverflowContentError extends Error { + constructor(message, items) { + super(message); + this.items = items; + } + } + + const MAX_CHARS_PER_BREAK = 1500; + + /** + * Layout + * @class + */ + class Layout { + + constructor(element, hooks, options) { + this.element = element; + + this.bounds = this.element.getBoundingClientRect(); + this.parentBounds = this.element.offsetParent.getBoundingClientRect(); + let gap = parseFloat(window.getComputedStyle(this.element).columnGap); + + if (gap) { + let leftMargin = this.bounds.left - this.parentBounds.left; + this.gap = gap - leftMargin; + } else { + this.gap = 0; + } + + if (hooks) { + this.hooks = hooks; + } else { + this.hooks = {}; + this.hooks.layout = new Hook(); + this.hooks.renderNode = new Hook(); + this.hooks.layoutNode = new Hook(); + this.hooks.beforeOverflow = new Hook(); + this.hooks.onOverflow = new Hook(); + this.hooks.afterOverflowRemoved = new Hook(); + this.hooks.onBreakToken = new Hook(); + } + + this.settings = options || {}; + + this.maxChars = this.settings.maxChars || MAX_CHARS_PER_BREAK; + this.forceRenderBreak = false; + } + + async renderTo(wrapper, source, breakToken, bounds = this.bounds) { + let start = this.getStart(source, breakToken); + let walker = walk$2(start, source); + + let node; + let prevNode; + let done; + let next; + + let hasRenderedContent = false; + let newBreakToken; + + let length = 0; + + let prevBreakToken = breakToken || new BreakToken(start); + + while (!done && !newBreakToken) { + next = walker.next(); + prevNode = node; + node = next.value; + done = next.done; + + if (!node) { + this.hooks && this.hooks.layout.trigger(wrapper, this); + + let imgs = wrapper.querySelectorAll("img"); + if (imgs.length) { + await this.waitForImages(imgs); + } + + newBreakToken = this.findBreakToken(wrapper, source, bounds, prevBreakToken); + + if (newBreakToken && newBreakToken.equals(prevBreakToken)) { + console.warn("Unable to layout item: ", prevNode); + return new RenderResult(undefined, new OverflowContentError("Unable to layout item", [prevNode])); + } + + this.rebuildTableFromBreakToken(newBreakToken, wrapper); + + return new RenderResult(newBreakToken); + } + + this.hooks && this.hooks.layoutNode.trigger(node); + + // Check if the rendered element has a break set + if (hasRenderedContent && this.shouldBreak(node, start)) { + this.hooks && this.hooks.layout.trigger(wrapper, this); + + let imgs = wrapper.querySelectorAll("img"); + if (imgs.length) { + await this.waitForImages(imgs); + } + + newBreakToken = this.findBreakToken(wrapper, source, bounds, prevBreakToken); + + if (!newBreakToken) { + newBreakToken = this.breakAt(node); + } else { + this.rebuildTableFromBreakToken(newBreakToken, wrapper); + } + + if (newBreakToken && newBreakToken.equals(prevBreakToken)) { + console.warn("Unable to layout item: ", node); + let after = newBreakToken.node && nodeAfter(newBreakToken.node); + if (after) { + newBreakToken = new BreakToken(after); + } else { + return new RenderResult(undefined, new OverflowContentError("Unable to layout item", [node])); + } + } + + length = 0; + + break; + } + + if (node.dataset && node.dataset.page) { + let named = node.dataset.page; + let page = this.element.closest(".pagedjs_page"); + page.classList.add("pagedjs_named_page"); + page.classList.add("pagedjs_" + named + "_page"); + + if (!node.dataset.splitFrom) { + page.classList.add("pagedjs_" + named + "_first_page"); + } + } + + // Should the Node be a shallow or deep clone + let shallow = isContainer(node); + + let rendered = this.append(node, wrapper, breakToken, shallow); + + length += rendered.textContent.length; + + // Check if layout has content yet + if (!hasRenderedContent) { + hasRenderedContent = hasContent(node); + } + + // Skip to the next node if a deep clone was rendered + if (!shallow) { + walker = walk$2(nodeAfter(node, source), source); + } + + if (this.forceRenderBreak) { + this.hooks && this.hooks.layout.trigger(wrapper, this); + + newBreakToken = this.findBreakToken(wrapper, source, bounds, prevBreakToken); + + if (!newBreakToken) { + newBreakToken = this.breakAt(node); + } else { + this.rebuildTableFromBreakToken(newBreakToken, wrapper); + } + + length = 0; + this.forceRenderBreak = false; + + break; + } + + // Only check x characters + if (length >= this.maxChars) { + + this.hooks && this.hooks.layout.trigger(wrapper, this); + + let imgs = wrapper.querySelectorAll("img"); + if (imgs.length) { + await this.waitForImages(imgs); + } + + newBreakToken = this.findBreakToken(wrapper, source, bounds, prevBreakToken); + + if (newBreakToken) { + length = 0; + this.rebuildTableFromBreakToken(newBreakToken, wrapper); + } + + if (newBreakToken && newBreakToken.equals(prevBreakToken)) { + console.warn("Unable to layout item: ", node); + let after = newBreakToken.node && nodeAfter(newBreakToken.node); + if (after) { + newBreakToken = new BreakToken(after); + } else { + return new RenderResult(undefined, new OverflowContentError("Unable to layout item", [node])); + } + } + } + + } + + return new RenderResult(newBreakToken); + } + + breakAt(node, offset = 0) { + let newBreakToken = new BreakToken( + node, + offset + ); + let breakHooks = this.hooks.onBreakToken.triggerSync(newBreakToken, undefined, node, this); + breakHooks.forEach((newToken) => { + if (typeof newToken != "undefined") { + newBreakToken = newToken; + } + }); + + return newBreakToken; + } + + shouldBreak(node, limiter) { + let previousNode = nodeBefore(node, limiter); + let parentNode = node.parentNode; + let parentBreakBefore = needsBreakBefore(node) && parentNode && !previousNode && needsBreakBefore(parentNode); + let doubleBreakBefore; + + if (parentBreakBefore) { + doubleBreakBefore = node.dataset.breakBefore === parentNode.dataset.breakBefore; + } + + return !doubleBreakBefore && needsBreakBefore(node) || needsPreviousBreakAfter(node) || needsPageBreak(node, previousNode); + } + + forceBreak() { + this.forceRenderBreak = true; + } + + getStart(source, breakToken) { + let start; + let node = breakToken && breakToken.node; + + if (node) { + start = node; + } else { + start = source.firstChild; + } + + return start; + } + + append(node, dest, breakToken, shallow = true, rebuild = true) { + + let clone = cloneNode(node, !shallow); + + if (node.parentNode && isElement(node.parentNode)) { + let parent = findElement(node.parentNode, dest); + // Rebuild chain + if (parent) { + parent.appendChild(clone); + } else if (rebuild) { + let fragment = rebuildAncestors(node); + parent = findElement(node.parentNode, fragment); + if (!parent) { + dest.appendChild(clone); + } else if (breakToken && isText(breakToken.node) && breakToken.offset > 0) { + clone.textContent = clone.textContent.substring(breakToken.offset); + parent.appendChild(clone); + } else { + parent.appendChild(clone); + } + + dest.appendChild(fragment); + } else { + dest.appendChild(clone); + } + + + } else { + dest.appendChild(clone); + } + + if (clone.dataset && clone.dataset.ref) { + if (!dest.indexOfRefs) { + dest.indexOfRefs = {}; + } + dest.indexOfRefs[clone.dataset.ref] = clone; + } + + let nodeHooks = this.hooks.renderNode.triggerSync(clone, node, this); + nodeHooks.forEach((newNode) => { + if (typeof newNode != "undefined") { + clone = newNode; + } + }); + + return clone; + } + + rebuildTableFromBreakToken(breakToken, dest) { + if (!breakToken || !breakToken.node) { + return; + } + let node = breakToken.node; + let td = isElement(node) ? node.closest("td") : node.parentElement.closest("td"); + if (td) { + let rendered = findElement(td, dest, true); + if (!rendered) { + return; + } + while ((td = td.nextElementSibling)) { + this.append(td, dest, null, true); + } + } + } + + async waitForImages(imgs) { + let results = Array.from(imgs).map(async (img) => { + return this.awaitImageLoaded(img); + }); + await Promise.all(results); + } + + async awaitImageLoaded(image) { + return new Promise(resolve => { + if (image.complete !== true) { + image.onload = function () { + let {width, height} = window.getComputedStyle(image); + resolve(width, height); + }; + image.onerror = function (e) { + let {width, height} = window.getComputedStyle(image); + resolve(width, height, e); + }; + } else { + let {width, height} = window.getComputedStyle(image); + resolve(width, height); + } + }); + } + + avoidBreakInside(node, limiter) { + let breakNode; + + if (node === limiter) { + return; + } + + while (node.parentNode) { + node = node.parentNode; + + if (node === limiter) { + break; + } + + if (window.getComputedStyle(node)["break-inside"] === "avoid") { + breakNode = node; + break; + } + + } + return breakNode; + } + + createBreakToken(overflow, rendered, source) { + let container = overflow.startContainer; + let offset = overflow.startOffset; + let node, renderedNode, parent, index, temp; + + if (isElement(container)) { + temp = child(container, offset); + + if (isElement(temp)) { + renderedNode = findElement(temp, rendered); + + if (!renderedNode) { + // Find closest element with data-ref + let prevNode = prevValidNode(temp); + if (!isElement(prevNode)) { + prevNode = prevNode.parentElement; + } + renderedNode = findElement(prevNode, rendered); + // Check if temp is the last rendered node at its level. + if (!temp.nextSibling) { + // We need to ensure that the previous sibling of temp is fully rendered. + const renderedNodeFromSource = findElement(renderedNode, source); + const walker = document.createTreeWalker(renderedNodeFromSource, NodeFilter.SHOW_ELEMENT); + const lastChildOfRenderedNodeFromSource = walker.lastChild(); + const lastChildOfRenderedNodeMatchingFromRendered = findElement(lastChildOfRenderedNodeFromSource, rendered); + // Check if we found that the last child in source + if (!lastChildOfRenderedNodeMatchingFromRendered) { + // Pending content to be rendered before virtual break token + return; + } + // Otherwise we will return a break token as per below + } + // renderedNode is actually the last unbroken box that does not overflow. + // Break Token is therefore the next sibling of renderedNode within source node. + node = findElement(renderedNode, source).nextSibling; + offset = 0; + } else { + node = findElement(renderedNode, source); + offset = 0; + } + } else { + renderedNode = findElement(container, rendered); + + if (!renderedNode) { + renderedNode = findElement(prevValidNode(container), rendered); + } + + parent = findElement(renderedNode, source); + index = indexOfTextNode(temp, parent); + // No seperatation for the first textNode of an element + if(index === 0) { + node = parent; + offset = 0; + } else { + node = child(parent, index); + offset = 0; + } + } + } else { + renderedNode = findElement(container.parentNode, rendered); + + if (!renderedNode) { + renderedNode = findElement(prevValidNode(container.parentNode), rendered); + } + + parent = findElement(renderedNode, source); + index = indexOfTextNode(container, parent); + + if (index === -1) { + return; + } + + node = child(parent, index); + + offset += node.textContent.indexOf(container.textContent); + } + + if (!node) { + return; + } + + return new BreakToken( + node, + offset + ); + + } + + findBreakToken(rendered, source, bounds = this.bounds, prevBreakToken, extract = true) { + let overflow = this.findOverflow(rendered, bounds); + let breakToken, breakLetter; + + let overflowHooks = this.hooks.onOverflow.triggerSync(overflow, rendered, bounds, this); + overflowHooks.forEach((newOverflow) => { + if (typeof newOverflow != "undefined") { + overflow = newOverflow; + } + }); + + if (overflow) { + breakToken = this.createBreakToken(overflow, rendered, source); + // breakToken is nullable + let breakHooks = this.hooks.onBreakToken.triggerSync(breakToken, overflow, rendered, this); + breakHooks.forEach((newToken) => { + if (typeof newToken != "undefined") { + breakToken = newToken; + } + }); + + // Stop removal if we are in a loop + if (breakToken && breakToken.equals(prevBreakToken)) { + return breakToken; + } + + if (breakToken && breakToken["node"] && breakToken["offset"] && breakToken["node"].textContent) { + breakLetter = breakToken["node"].textContent.charAt(breakToken["offset"]); + } else { + breakLetter = undefined; + } + + if (breakToken && breakToken.node && extract) { + let removed = this.removeOverflow(overflow, breakLetter); + this.hooks && this.hooks.afterOverflowRemoved.trigger(removed, rendered, this); + } + + } + return breakToken; + } + + hasOverflow(element, bounds = this.bounds) { + let constrainingElement = element && element.parentNode; // this gets the element, instead of the wrapper for the width workaround + let {width, height} = element.getBoundingClientRect(); + let scrollWidth = constrainingElement ? constrainingElement.scrollWidth : 0; + let scrollHeight = constrainingElement ? constrainingElement.scrollHeight : 0; + return Math.max(Math.floor(width), scrollWidth) > Math.round(bounds.width) || + Math.max(Math.floor(height), scrollHeight) > Math.round(bounds.height); + } + + findOverflow(rendered, bounds = this.bounds, gap = this.gap) { + if (!this.hasOverflow(rendered, bounds)) return; + + let start = Math.floor(bounds.left); + let end = Math.round(bounds.right + gap); + let vStart = Math.round(bounds.top); + let vEnd = Math.round(bounds.bottom); + let range; + + let walker = walk$2(rendered.firstChild, rendered); + + // Find Start + let next, done, node, offset, skip, breakAvoid, prev, br; + while (!done) { + next = walker.next(); + done = next.done; + node = next.value; + skip = false; + breakAvoid = false; + prev = undefined; + br = undefined; + + if (node) { + let pos = getBoundingClientRect(node); + let left = Math.round(pos.left); + let right = Math.floor(pos.right); + let top = Math.round(pos.top); + let bottom = Math.floor(pos.bottom); + + if (!range && (left >= end || top >= vEnd)) { + // Check if it is a float + let isFloat = false; + + // Check if the node is inside a break-inside: avoid table cell + const insideTableCell = parentOf(node, "TD", rendered); + if (insideTableCell && window.getComputedStyle(insideTableCell)["break-inside"] === "avoid") { + // breaking inside a table cell produces unexpected result, as a workaround, we forcibly avoid break inside in a cell. + // But we take the whole row, not just the cell that is causing the break. + prev = insideTableCell.parentElement; + } else if (isElement(node)) { + let styles = window.getComputedStyle(node); + isFloat = styles.getPropertyValue("float") !== "none"; + skip = styles.getPropertyValue("break-inside") === "avoid"; + breakAvoid = node.dataset.breakBefore === "avoid" || node.dataset.previousBreakAfter === "avoid"; + prev = breakAvoid && nodeBefore(node, rendered); + br = node.tagName === "BR" || node.tagName === "WBR"; + } + + let tableRow; + if (node.nodeName === "TR") { + tableRow = node; + } else { + tableRow = parentOf(node, "TR", rendered); + } + if (tableRow) { + // honor break-inside="avoid" in parent tbody/thead + let container = tableRow.parentElement; + if (["TBODY", "THEAD"].includes(container.nodeName)) { + let styles = window.getComputedStyle(container); + if (styles.getPropertyValue("break-inside") === "avoid") prev = container; + } + + // Check if the node is inside a row with a rowspan + const table = parentOf(tableRow, "TABLE", rendered); + const rowspan = table.querySelector("[colspan]"); + if (table && rowspan) { + let columnCount = 0; + for (const cell of Array.from(table.rows[0].cells)) { + columnCount += parseInt(cell.getAttribute("colspan") || "1"); + } + if (tableRow.cells.length !== columnCount) { + let previousRow = tableRow.previousElementSibling; + let previousRowColumnCount; + while (previousRow !== null) { + previousRowColumnCount = 0; + for (const cell of Array.from(previousRow.cells)) { + previousRowColumnCount += parseInt(cell.getAttribute("colspan") || "1"); + } + if (previousRowColumnCount === columnCount) { + break; + } + previousRow = previousRow.previousElementSibling; + } + if (previousRowColumnCount === columnCount) { + prev = previousRow; + } + } + } + } + + if (prev) { + range = document.createRange(); + range.selectNode(prev); + break; + } + + if (!br && !isFloat && isElement(node)) { + range = document.createRange(); + range.selectNode(node); + break; + } + + if (isText(node) && node.textContent.trim().length) { + range = document.createRange(); + range.selectNode(node); + break; + } + + } + + if (!range && isText(node) && + node.textContent.trim().length && + !breakInsideAvoidParentNode(node.parentNode)) { + + let rects = getClientRects(node); + let rect; + left = 0; + top = 0; + for (var i = 0; i != rects.length; i++) { + rect = rects[i]; + if (rect.width > 0 && (!left || rect.left > left)) { + left = rect.left; + } + if (rect.height > 0 && (!top || rect.top > top)) { + top = rect.top; + } + } + + if (left >= end || top >= vEnd) { + range = document.createRange(); + offset = this.textBreak(node, start, end, vStart, vEnd); + if (!offset) { + range = undefined; + } else { + range.setStart(node, offset); + } + break; + } + } + + // Skip children + if (skip || (right <= end && bottom <= vEnd)) { + next = nodeAfter(node, rendered); + if (next) { + walker = walk$2(next, rendered); + } + + } + + } + } + + // Find End + if (range) { + range.setEndAfter(rendered.lastChild); + return range; + } + + } + + findEndToken(rendered, source) { + if (rendered.childNodes.length === 0) { + return; + } + + let lastChild = rendered.lastChild; + + let lastNodeIndex; + while (lastChild && lastChild.lastChild) { + if (!validNode(lastChild)) { + // Only get elements with refs + lastChild = lastChild.previousSibling; + } else if (!validNode(lastChild.lastChild)) { + // Deal with invalid dom items + lastChild = prevValidNode(lastChild.lastChild); + break; + } else { + lastChild = lastChild.lastChild; + } + } + + if (isText(lastChild)) { + + if (lastChild.parentNode.dataset.ref) { + lastNodeIndex = indexOf$2(lastChild); + lastChild = lastChild.parentNode; + } else { + lastChild = lastChild.previousSibling; + } + } + + let original = findElement(lastChild, source); + + if (lastNodeIndex) { + original = original.childNodes[lastNodeIndex]; + } + + let after = nodeAfter(original); + + return this.breakAt(after); + } + + textBreak(node, start, end, vStart, vEnd) { + let wordwalker = words(node); + let left = 0; + let right = 0; + let top = 0; + let bottom = 0; + let word, next, done, pos; + let offset; + while (!done) { + next = wordwalker.next(); + word = next.value; + done = next.done; + + if (!word) { + break; + } + + pos = getBoundingClientRect(word); + + left = Math.floor(pos.left); + right = Math.floor(pos.right); + top = Math.floor(pos.top); + bottom = Math.floor(pos.bottom); + + if (left >= end || top >= vEnd) { + offset = word.startOffset; + break; + } + + if (right > end || bottom > vEnd) { + let letterwalker = letters(word); + let letter, nextLetter, doneLetter; + + while (!doneLetter) { + nextLetter = letterwalker.next(); + letter = nextLetter.value; + doneLetter = nextLetter.done; + + if (!letter) { + break; + } + + pos = getBoundingClientRect(letter); + left = Math.floor(pos.left); + top = Math.floor(pos.top); + + if (left >= end || top >= vEnd) { + offset = letter.startOffset; + done = true; + + break; + } + } + } + + } + + return offset; + } + + removeOverflow(overflow, breakLetter) { + let {startContainer} = overflow; + let extracted = overflow.extractContents(); + + this.hyphenateAtBreak(startContainer, breakLetter); + + return extracted; + } + + hyphenateAtBreak(startContainer, breakLetter) { + if (isText(startContainer)) { + let startText = startContainer.textContent; + let prevLetter = startText[startText.length - 1]; + + // Add a hyphen if previous character is a letter or soft hyphen + if ( + (breakLetter && /^\w|\u00AD$/.test(prevLetter) && /^\w|\u00AD$/.test(breakLetter)) || + (!breakLetter && /^\w|\u00AD$/.test(prevLetter)) + ) { + startContainer.parentNode.classList.add("pagedjs_hyphen"); + startContainer.textContent += this.settings.hyphenGlyph || "\u2011"; + } + } + } + + equalTokens(a, b) { + if (!a || !b) { + return false; + } + if (a["node"] && b["node"] && a["node"] !== b["node"]) { + return false; + } + if (a["offset"] && b["offset"] && a["offset"] !== b["offset"]) { + return false; + } + return true; + } + } + + EventEmitter(Layout.prototype); + + /** + * Render a page + * @class + */ + class Page { + constructor(pagesArea, pageTemplate, blank, hooks, options) { + this.pagesArea = pagesArea; + this.pageTemplate = pageTemplate; + this.blank = blank; + + this.width = undefined; + this.height = undefined; + + this.hooks = hooks; + + this.settings = options || {}; + + // this.element = this.create(this.pageTemplate); + } + + create(template, after) { + //let documentFragment = document.createRange().createContextualFragment( TEMPLATE ); + //let page = documentFragment.children[0]; + let clone = document.importNode(this.pageTemplate.content, true); + + let page, index; + if (after) { + this.pagesArea.insertBefore(clone, after.nextElementSibling); + index = Array.prototype.indexOf.call(this.pagesArea.children, after.nextElementSibling); + page = this.pagesArea.children[index]; + } else { + this.pagesArea.appendChild(clone); + page = this.pagesArea.lastChild; + } + + let pagebox = page.querySelector(".pagedjs_pagebox"); + let area = page.querySelector(".pagedjs_page_content"); + let footnotesArea = page.querySelector(".pagedjs_footnote_area"); + + + let size = area.getBoundingClientRect(); + + + area.style.columnWidth = Math.round(size.width) + "px"; + area.style.columnGap = "calc(var(--pagedjs-margin-right) + var(--pagedjs-margin-left) + var(--pagedjs-bleed-right) + var(--pagedjs-bleed-left) + var(--pagedjs-column-gap-offset))"; + // area.style.overflow = "scroll"; + + this.width = Math.round(size.width); + this.height = Math.round(size.height); + + this.element = page; + this.pagebox = pagebox; + this.area = area; + this.footnotesArea = footnotesArea; + + return page; + } + + createWrapper() { + let wrapper = document.createElement("div"); + + this.area.appendChild(wrapper); + + this.wrapper = wrapper; + + return wrapper; + } + + index(pgnum) { + this.position = pgnum; + + let page = this.element; + // let pagebox = this.pagebox; + + let index = pgnum + 1; + + let id = `page-${index}`; + + this.id = id; + + // page.dataset.pageNumber = index; + + page.dataset.pageNumber = index; + page.setAttribute("id", id); + + if (this.name) { + page.classList.add("pagedjs_" + this.name + "_page"); + } + + if (this.blank) { + page.classList.add("pagedjs_blank_page"); + } + + if (pgnum === 0) { + page.classList.add("pagedjs_first_page"); + } + + if (pgnum % 2 !== 1) { + page.classList.remove("pagedjs_left_page"); + page.classList.add("pagedjs_right_page"); + } else { + page.classList.remove("pagedjs_right_page"); + page.classList.add("pagedjs_left_page"); + } + } + + /* + size(width, height) { + if (width === this.width && height === this.height) { + return; + } + this.width = width; + this.height = height; + + this.element.style.width = Math.round(width) + "px"; + this.element.style.height = Math.round(height) + "px"; + this.element.style.columnWidth = Math.round(width) + "px"; + } + */ + + async layout(contents, breakToken, maxChars) { + + this.clear(); + + this.startToken = breakToken; + + let settings = this.settings; + if (!settings.maxChars && maxChars) { + settings.maxChars = maxChars; + } + + this.layoutMethod = new Layout(this.area, this.hooks, settings); + + let renderResult = await this.layoutMethod.renderTo(this.wrapper, contents, breakToken); + let newBreakToken = renderResult.breakToken; + + this.addListeners(contents); + + this.endToken = newBreakToken; + + return newBreakToken; + } + + async append(contents, breakToken) { + + if (!this.layoutMethod) { + return this.layout(contents, breakToken); + } + + let renderResult = await this.layoutMethod.renderTo(this.wrapper, contents, breakToken); + let newBreakToken = renderResult.breakToken; + + this.endToken = newBreakToken; + + return newBreakToken; + } + + getByParent(ref, entries) { + let e; + for (var i = 0; i < entries.length; i++) { + e = entries[i]; + if (e.dataset.ref === ref) { + return e; + } + } + } + + onOverflow(func) { + this._onOverflow = func; + } + + onUnderflow(func) { + this._onUnderflow = func; + } + + clear() { + this.removeListeners(); + this.wrapper && this.wrapper.remove(); + this.createWrapper(); + } + + addListeners(contents) { + if (typeof ResizeObserver !== "undefined") { + this.addResizeObserver(contents); + } else { + this._checkOverflowAfterResize = this.checkOverflowAfterResize.bind(this, contents); + this.element.addEventListener("overflow", this._checkOverflowAfterResize, false); + this.element.addEventListener("underflow", this._checkOverflowAfterResize, false); + } + // TODO: fall back to mutation observer? + + this._onScroll = function () { + if (this.listening) { + this.element.scrollLeft = 0; + } + }.bind(this); + + // Keep scroll left from changing + this.element.addEventListener("scroll", this._onScroll); + + this.listening = true; + + return true; + } + + removeListeners() { + this.listening = false; + + if (typeof ResizeObserver !== "undefined" && this.ro) { + this.ro.disconnect(); + } else if (this.element) { + this.element.removeEventListener("overflow", this._checkOverflowAfterResize, false); + this.element.removeEventListener("underflow", this._checkOverflowAfterResize, false); + } + + this.element && this.element.removeEventListener("scroll", this._onScroll); + + } + + addResizeObserver(contents) { + let wrapper = this.wrapper; + let prevHeight = wrapper.getBoundingClientRect().height; + this.ro = new ResizeObserver(entries => { + + if (!this.listening) { + return; + } + requestAnimationFrame(() => { + for (let entry of entries) { + const cr = entry.contentRect; + + if (cr.height > prevHeight) { + this.checkOverflowAfterResize(contents); + prevHeight = wrapper.getBoundingClientRect().height; + } else if (cr.height < prevHeight) { // TODO: calc line height && (prevHeight - cr.height) >= 22 + this.checkUnderflowAfterResize(contents); + prevHeight = cr.height; + } + } + }); + }); + + this.ro.observe(wrapper); + } + + checkOverflowAfterResize(contents) { + if (!this.listening || !this.layoutMethod) { + return; + } + + let newBreakToken = this.layoutMethod.findBreakToken(this.wrapper, contents, this.startToken); + + if (newBreakToken) { + this.endToken = newBreakToken; + this._onOverflow && this._onOverflow(newBreakToken); + } + } + + checkUnderflowAfterResize(contents) { + if (!this.listening || !this.layoutMethod) { + return; + } + + let endToken = this.layoutMethod.findEndToken(this.wrapper, contents); + + if (endToken) { + this._onUnderflow && this._onUnderflow(endToken); + } + } + + + destroy() { + this.removeListeners(); + + this.element.remove(); + + this.element = undefined; + this.wrapper = undefined; + } + } + + EventEmitter(Page.prototype); + + /** + * Render a flow of text offscreen + * @class + */ + class ContentParser { + + constructor(content, cb) { + if (content && content.nodeType) { + // handle dom + this.dom = this.add(content); + } else if (typeof content === "string") { + this.dom = this.parse(content); + } + + return this.dom; + } + + parse(markup, mime) { + let range = document.createRange(); + let fragment = range.createContextualFragment(markup); + + this.addRefs(fragment); + + return fragment; + } + + add(contents) { + // let fragment = document.createDocumentFragment(); + // + // let children = [...contents.childNodes]; + // for (let child of children) { + // let clone = child.cloneNode(true); + // fragment.appendChild(clone); + // } + + this.addRefs(contents); + + return contents; + } + + addRefs(content) { + var treeWalker = document.createTreeWalker( + content, + NodeFilter.SHOW_ELEMENT, + null, + false + ); + + let node = treeWalker.nextNode(); + while(node) { + + if (!node.hasAttribute("data-ref")) { + let uuid = UUID(); + node.setAttribute("data-ref", uuid); + } + + if (node.id) { + node.setAttribute("data-id", node.id); + } + + // node.setAttribute("data-children", node.childNodes.length); + + // node.setAttribute("data-text", node.textContent.trim().length); + node = treeWalker.nextNode(); + } + } + + find(ref) { + return this.refs[ref]; + } + + destroy() { + this.refs = undefined; + this.dom = undefined; + } + } + + /** + * Queue for handling tasks one at a time + * @class + * @param {scope} context what this will resolve to in the tasks + */ + class Queue { + constructor(context){ + this._q = []; + this.context = context; + this.tick = requestAnimationFrame; + this.running = false; + this.paused = false; + } + + /** + * Add an item to the queue + * @return {Promise} enqueued + */ + enqueue() { + var deferred, promise; + var queued; + var task = [].shift.call(arguments); + var args = arguments; + + // Handle single args without context + // if(args && !Array.isArray(args)) { + // args = [args]; + // } + if(!task) { + throw new Error("No Task Provided"); + } + + if(typeof task === "function"){ + + deferred = new defer(); + promise = deferred.promise; + + queued = { + "task" : task, + "args" : args, + //"context" : context, + "deferred" : deferred, + "promise" : promise + }; + + } else { + // Task is a promise + queued = { + "promise" : task + }; + + } + + this._q.push(queued); + + // Wait to start queue flush + if (this.paused == false && !this.running) { + this.run(); + } + + return queued.promise; + } + + /** + * Run one item + * @return {Promise} dequeued + */ + dequeue(){ + var inwait, task, result; + + if(this._q.length && !this.paused) { + inwait = this._q.shift(); + task = inwait.task; + if(task){ + // console.log(task) + + result = task.apply(this.context, inwait.args); + + if(result && typeof result["then"] === "function") { + // Task is a function that returns a promise + return result.then(function(){ + inwait.deferred.resolve.apply(this.context, arguments); + }.bind(this), function() { + inwait.deferred.reject.apply(this.context, arguments); + }.bind(this)); + } else { + // Task resolves immediately + inwait.deferred.resolve.apply(this.context, result); + return inwait.promise; + } + + + + } else if(inwait.promise) { + // Task is a promise + return inwait.promise; + } + + } else { + inwait = new defer(); + inwait.deferred.resolve(); + return inwait.promise; + } + + } + + // Run All Immediately + dump(){ + while(this._q.length) { + this.dequeue(); + } + } + + /** + * Run all tasks sequentially, at convince + * @return {Promise} all run + */ + run(){ + + if(!this.running){ + this.running = true; + this.defered = new defer(); + } + + this.tick.call(window, () => { + + if(this._q.length) { + + this.dequeue() + .then(function(){ + this.run(); + }.bind(this)); + + } else { + this.defered.resolve(); + this.running = undefined; + } + + }); + + // Unpause + if(this.paused == true) { + this.paused = false; + } + + return this.defered.promise; + } + + /** + * Flush all, as quickly as possible + * @return {Promise} ran + */ + flush(){ + + if(this.running){ + return this.running; + } + + if(this._q.length) { + this.running = this.dequeue() + .then(function(){ + this.running = undefined; + return this.flush(); + }.bind(this)); + + return this.running; + } + + } + + /** + * Clear all items in wait + * @return {void} + */ + clear(){ + this._q = []; + } + + /** + * Get the number of tasks in the queue + * @return {number} tasks + */ + length(){ + return this._q.length; + } + + /** + * Pause a running queue + * @return {void} + */ + pause(){ + this.paused = true; + } + + /** + * End the queue + * @return {void} + */ + stop(){ + this._q = []; + this.running = false; + this.paused = true; + } + } + + const TEMPLATE = ` +