From 8ccdb53a406df9939875415890e519f96290c1c2 Mon Sep 17 00:00:00 2001 From: vitrinekast Date: Sat, 15 Feb 2025 10:19:38 +0100 Subject: [PATCH] back on git! --- .gitignore | 3 + README.md | 59 + apa.csl | 2133 + app.py | 235 + get_events.py | 65 + include-files.lua | 125 + library.bib | 869 + pagedjs/IBMPlex/IBMPlexMono-Text.woff | Bin 0 -> 51256 bytes pagedjs/IBMPlex/IBMPlexMono-Text.woff2 | Bin 0 -> 36320 bytes pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff | Bin 0 -> 58240 bytes pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff2 | Bin 0 -> 41504 bytes pagedjs/icon-preview.svg | 2 + pagedjs/icon-printer.svg | 1 + pagedjs/interface-header.css | 373 + pagedjs/interface.css | 203 + pagedjs/interface.html | 42 + pagedjs/interface.js | 195 + pagedjs/paged.js | 33203 ++++++++++++++++ pagedjs/reload-in-place.js | 116 + requirements.txt | 11 + src/assets/app.js | 31 + src/assets/apple-touch-icon.png | Bin 0 -> 2486 bytes src/assets/chapters/2/trouble-shoot.png | Bin 0 -> 262173 bytes src/assets/chapters/chapter_1.pdf | Bin 0 -> 854621 bytes src/assets/components/salvaged-resistors.webp | Bin 0 -> 98760 bytes src/assets/devices/casette_recorder.jpeg | Bin 0 -> 160764 bytes src/assets/devices/mp3_front.jpeg | Bin 0 -> 139403 bytes src/assets/devices/scan_phone.jpg | Bin 0 -> 78675 bytes src/assets/favicon-16x16.png | Bin 0 -> 1115 bytes src/assets/favicon-32x32.png | Bin 0 -> 2129 bytes src/assets/favicon.ico | Bin 0 -> 5340 bytes src/assets/image.png | Bin 0 -> 21666 bytes src/assets/pwa-192x192.png | Bin 0 -> 2581 bytes src/assets/pwa-512x512.png | Bin 0 -> 6915 bytes src/assets/pwa-maskable-192x192.png | Bin 0 -> 3905 bytes src/assets/pwa-maskable-512x512.png | Bin 0 -> 5361 bytes src/assets/recipes/555-timer.png | Bin 0 -> 29709 bytes src/assets/recipes/schematic-relax-osc.png | Bin 0 -> 153178 bytes src/assets/reel-to-reel-recorder.jpeg | Bin 0 -> 216259 bytes src/assets/repair-logs/pokemon.jpeg | Bin 0 -> 64510 bytes src/assets/repair-logs/pokemon.webp | Bin 0 -> 15980 bytes src/assets/styles/layout.css | 91 + src/assets/styles/paged-interface.css | 180 + src/assets/styles/paged.css | 119 + src/assets/styles/print.css | 66 + src/assets/styles/screen.css | 5 + src/assets/styles/style.css | 46 + src/assets/styles/typography.css | 101 + src/content/chapters/-1-intro.md | 56 + src/content/chapters/0-gather.md | 45 + src/content/chapters/1-dismantling.md | 59 + src/content/chapters/2-component-salvaging.md | 20 + src/content/chapters/3-recipes.md | 18 + src/content/chapters/4-reflection.md | 11 + src/content/chapters/5-bib.md | 10 + src/content/component-inventory.csv | 248 + src/content/components/capacitor.md | 22 + src/content/components/chips.md | 19 + src/content/components/inputs.md | 8 + src/content/components/open.md | 8 + src/content/components/outputs.md | 10 + src/content/components/pcb.md | 15 + src/content/components/resistor.md | 21 + src/content/components/transistor.md | 17 + src/content/components/unidentified.md | 10 + src/content/devices/cassette-recorder.md | 14 + src/content/devices/hard-drive.md | 14 + src/content/devices/mp3-fm-radio.md | 22 + src/content/devices/reel-to-reel-recorder.md | 14 + src/content/devices/telephone.md | 11 + .../devices/v2s-metal-detector-thing.md | 11 + src/content/events/25-hour-radio-relay.md | 80 + .../events/3rd-klankschool-dagandavond.md | 46 + ...tonal-infrastructure-16-qoa-en-primeiro.md | 138 + ...e-with-jae-hyung-park-and-lucija-gregov.md | 161 + ...extratonal-special-3-sound-is-political.md | 126 + src/content/events/its-sonic-bath-daaaay.md | 78 + .../events/klankschool-performances.md | 139 + .../events/lets-un-repair-things-together.md | 35 + .../events/lets-unrepair-things-together-1.md | 41 + .../events/lets-unrepair-things-together-2.md | 41 + .../events/lets-unrepair-things-together-3.md | 46 + .../events/lets-unrepair-things-together-4.md | 48 + .../lets-unrepair-things-together-4x.md | 49 + .../events/lets-unrepair-things-together-6.md | 41 + .../events/lets-unrepair-things-together-7.md | 46 + .../events/lets-unrepair-things-together-8.md | 41 + ...ir-things-together-analog-video-edition.md | 45 + ...around-the-world-naila-and-the-uprising.md | 113 + src/content/events/server-introduction.md | 66 + ...ts-protocols-for-collective-performance.md | 115 + src/content/events/unrepair-cafe-1.md | 49 + src/content/events/unrepair-cafe-2.md | 49 + .../events/unrepair-cafe-server-tour.md | 48 + src/content/events/unrepair-cafe.md | 49 + src/content/events/water-of-love.md | 122 + src/content/index.md | 15 + src/content/newsletters/december.md | 100 + src/content/recipes/555.md | 8 + src/content/recipes/motor-synth.md | 24 + src/content/recipes/power-supply.md | 4 + src/content/recipes/rc-filters.md | 33 + src/content/recipes/relax-osc.md | 12 + src/content/recipes/sequencers.md | 7 + .../recipes/single-transistor-oscillator.md | 47 + .../using-pcb-s-as-expressive-touch-pads.md | 30 + src/content/repair-logs/20241031.md | 8 + src/content/repair-logs/28112024.md | 10 + src/content/thesis.md | 15 + src/templates/base.jinja | 102 + src/templates/components.jinja | 34 + src/templates/index.jinja | 11 + src/templates/newsletters.jinja | 57 + src/templates/post.jinja | 43 + src/templates/snippets/inventory.jinja | 48 + src/templates/snippets/list-documents.jinja | 32 + src/templates/snippets/list-events.jinja | 35 + src/templates/thesis.jinja | 101 + 118 files changed, 41545 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 apa.csl create mode 100644 app.py create mode 100644 get_events.py create mode 100644 include-files.lua create mode 100644 library.bib create mode 100644 pagedjs/IBMPlex/IBMPlexMono-Text.woff create mode 100644 pagedjs/IBMPlex/IBMPlexMono-Text.woff2 create mode 100644 pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff create mode 100644 pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff2 create mode 100644 pagedjs/icon-preview.svg create mode 100644 pagedjs/icon-printer.svg create mode 100644 pagedjs/interface-header.css create mode 100644 pagedjs/interface.css create mode 100644 pagedjs/interface.html create mode 100644 pagedjs/interface.js create mode 100644 pagedjs/paged.js create mode 100644 pagedjs/reload-in-place.js create mode 100644 requirements.txt create mode 100644 src/assets/app.js create mode 100644 src/assets/apple-touch-icon.png create mode 100644 src/assets/chapters/2/trouble-shoot.png create mode 100644 src/assets/chapters/chapter_1.pdf create mode 100644 src/assets/components/salvaged-resistors.webp create mode 100644 src/assets/devices/casette_recorder.jpeg create mode 100644 src/assets/devices/mp3_front.jpeg create mode 100644 src/assets/devices/scan_phone.jpg create mode 100644 src/assets/favicon-16x16.png create mode 100644 src/assets/favicon-32x32.png create mode 100644 src/assets/favicon.ico create mode 100644 src/assets/image.png create mode 100644 src/assets/pwa-192x192.png create mode 100644 src/assets/pwa-512x512.png create mode 100644 src/assets/pwa-maskable-192x192.png create mode 100644 src/assets/pwa-maskable-512x512.png create mode 100644 src/assets/recipes/555-timer.png create mode 100644 src/assets/recipes/schematic-relax-osc.png create mode 100644 src/assets/reel-to-reel-recorder.jpeg create mode 100644 src/assets/repair-logs/pokemon.jpeg create mode 100644 src/assets/repair-logs/pokemon.webp create mode 100644 src/assets/styles/layout.css create mode 100644 src/assets/styles/paged-interface.css create mode 100644 src/assets/styles/paged.css create mode 100644 src/assets/styles/print.css create mode 100644 src/assets/styles/screen.css create mode 100644 src/assets/styles/style.css create mode 100644 src/assets/styles/typography.css create mode 100644 src/content/chapters/-1-intro.md create mode 100644 src/content/chapters/0-gather.md create mode 100644 src/content/chapters/1-dismantling.md create mode 100644 src/content/chapters/2-component-salvaging.md create mode 100644 src/content/chapters/3-recipes.md create mode 100644 src/content/chapters/4-reflection.md create mode 100644 src/content/chapters/5-bib.md create mode 100644 src/content/component-inventory.csv create mode 100644 src/content/components/capacitor.md create mode 100644 src/content/components/chips.md create mode 100644 src/content/components/inputs.md create mode 100644 src/content/components/open.md create mode 100644 src/content/components/outputs.md create mode 100644 src/content/components/pcb.md create mode 100644 src/content/components/resistor.md create mode 100644 src/content/components/transistor.md create mode 100644 src/content/components/unidentified.md create mode 100644 src/content/devices/cassette-recorder.md create mode 100644 src/content/devices/hard-drive.md create mode 100644 src/content/devices/mp3-fm-radio.md create mode 100644 src/content/devices/reel-to-reel-recorder.md create mode 100644 src/content/devices/telephone.md create mode 100644 src/content/devices/v2s-metal-detector-thing.md create mode 100644 src/content/events/25-hour-radio-relay.md create mode 100644 src/content/events/3rd-klankschool-dagandavond.md create mode 100644 src/content/events/extratonal-infrastructure-16-qoa-en-primeiro.md create mode 100644 src/content/events/extratonal-infrastructure-17-dianaband-vegetable-wife-with-jae-hyung-park-and-lucija-gregov.md create mode 100644 src/content/events/extratonal-special-3-sound-is-political.md create mode 100644 src/content/events/its-sonic-bath-daaaay.md create mode 100644 src/content/events/klankschool-performances.md create mode 100644 src/content/events/lets-un-repair-things-together.md create mode 100644 src/content/events/lets-unrepair-things-together-1.md create mode 100644 src/content/events/lets-unrepair-things-together-2.md create mode 100644 src/content/events/lets-unrepair-things-together-3.md create mode 100644 src/content/events/lets-unrepair-things-together-4.md create mode 100644 src/content/events/lets-unrepair-things-together-4x.md create mode 100644 src/content/events/lets-unrepair-things-together-6.md create mode 100644 src/content/events/lets-unrepair-things-together-7.md create mode 100644 src/content/events/lets-unrepair-things-together-8.md create mode 100644 src/content/events/lets-unrepair-things-together-analog-video-edition.md create mode 100644 src/content/events/palestine-cinema-days-around-the-world-naila-and-the-uprising.md create mode 100644 src/content/events/server-introduction.md create mode 100644 src/content/events/sounds-of-making-xpub1-presents-protocols-for-collective-performance.md create mode 100644 src/content/events/unrepair-cafe-1.md create mode 100644 src/content/events/unrepair-cafe-2.md create mode 100644 src/content/events/unrepair-cafe-server-tour.md create mode 100644 src/content/events/unrepair-cafe.md create mode 100644 src/content/events/water-of-love.md create mode 100644 src/content/index.md create mode 100644 src/content/newsletters/december.md create mode 100644 src/content/recipes/555.md create mode 100644 src/content/recipes/motor-synth.md create mode 100644 src/content/recipes/power-supply.md create mode 100644 src/content/recipes/rc-filters.md create mode 100644 src/content/recipes/relax-osc.md create mode 100644 src/content/recipes/sequencers.md create mode 100644 src/content/recipes/single-transistor-oscillator.md create mode 100644 src/content/recipes/using-pcb-s-as-expressive-touch-pads.md create mode 100644 src/content/repair-logs/20241031.md create mode 100644 src/content/repair-logs/28112024.md create mode 100644 src/content/thesis.md create mode 100644 src/templates/base.jinja create mode 100644 src/templates/components.jinja create mode 100644 src/templates/index.jinja create mode 100644 src/templates/newsletters.jinja create mode 100644 src/templates/post.jinja create mode 100644 src/templates/snippets/inventory.jinja create mode 100644 src/templates/snippets/list-documents.jinja create mode 100644 src/templates/snippets/list-events.jinja create mode 100644 src/templates/thesis.jinja diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4875259 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +venv +dist +feedback \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0274fda --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# README.md + +### Installation +Create a virtual python environment using ` python -m venv venv` +Activate the virtual environment using `source venv/bin/activate` +Install the packages using `pip install -r requirements.txt` + + +### Running +Compile the content into a static site using +``` +python app.py +``` + +This creates the "dist" directory, with all of the HTML in there. +At the moment, `dist` is part of the `.gitignore`! + + +### Writing Content +Within the `content` directory, you can create/edit markdown files. When compiling the markdown content, `app.py` will look for jinja templates in the `templates` directory. If the markdown file is in the root of `content`, it will try to load a template with the same filename as the markdown file. For instance, `about.md` will look for `about.jinja`. +If the markdown file is in a subdirectory, it will look for a template with the same name as the subdirectory. At the moment, there is no functionality for deep nested folders. So, `recipes/tomato-soup.md` wants `recipes.jinja`. If the template does not exist, the default template is `post.jinja`. + +The project uses [Jinja](https://jinja.palletsprojects.com/), which allows for extending templates, using variables, looping trough variables, and other funky features! + +Additionally, `component-inventory.csv` is loaded as a dataset. + +### Transclusion +You'll be able to transclude one markdown file into another, by applying the following syntax: + +```MARKDOWN +{! path-to-file.md !} +``` + +The transclusion package also allows for transcluding specific lines: + +```MARKDOWN +{! path-to-file.md!lines=1 3 8-10 2} +``` +In the example above, it would read the file and include the lines 1, 3, 8, 9, 10, 2. + + + + +### Metadata +Metadata can be applied to markdown files using FrontMatters YAML. The metadata is accessable in the jinja tempaltes using `page.{metadata}`. In the example below, this could be, `page.title`. + +```MARKDOWN +--- + +title: Capacitors +type: Capacitor +valueSymbol: unf +description: This is the description +--- +``` + + +### Assets +At the moment, the `src/assets` directory is copied to the `dist` folder, to apply CSS. diff --git a/apa.csl b/apa.csl new file mode 100644 index 0000000..9d1dd72 --- /dev/null +++ b/apa.csl @@ -0,0 +1,2133 @@ + + diff --git a/app.py b/app.py new file mode 100644 index 0000000..b4e4fb3 --- /dev/null +++ b/app.py @@ -0,0 +1,235 @@ +import os +from pathlib import Path +import shutil +import csv +import re +from datetime import datetime + +from jinja2 import Environment, PackageLoader, select_autoescape +import frontmatter +from slugify import slugify +import pypandoc + +# TODO make newsletter URL's absolute to klank.school + +env = Environment( + loader=PackageLoader("src"), + autoescape=select_autoescape() +) + +CONTENT_D = os.path.abspath("src/content") +OUTPUT_D = "dist" +documents = {} + +def listDocuments(params): + param = params.split(" ") + + template = env.select_template([f"snippets/list-documents.jinja"]) + html = template.render(documents=documents, layout=param[0], type=param[1]) + + return html + + +def getParam(params, index): + if len(params) > index: + return params[index] + else: + return False + + +def listEvents(params): + param = params.split(" ") + tag=getParam(param, 1) + + if "events" not in documents: + return "" + + events = [] + if tag: + for event in documents["events"]: + if tag in event["tags"]: + events.append(event) + else: + events = documents["events"] + + template = env.select_template([f"snippets/list-events.jinja"]) + html = template.render(events=events, filter=param[0], tag=getParam(param, 1)) + + return html + + +def slugify_filter(value): + return slugify(value) + + +def prettydate(value, format='%d/%m/%Y'): + return datetime.fromtimestamp(int(value)).strftime(format) + + +def shortcode_filter(value): + + shortcode_callbacks = { + "show": listDocuments, + "events": listEvents + } + + def shortcode_replacer(match): + + shortcode_name = match.group(1).strip() + param = match.group(2).strip() + + if shortcode_name in shortcode_callbacks: + return shortcode_callbacks[shortcode_name](param) + + return match.group(0) + + pattern = re.compile(r"{{\s*(\w+)\s+([^{}]+?)\s*}}") + return pattern.sub(shortcode_replacer, value) + + +env.filters["shortcode"] = shortcode_filter +env.filters["slugify"] = slugify_filter +env.filters["prettydate"] = prettydate + + +def render_single_file(template, page, path, dist, name = False): + modifier = False + + print(f"rendering: {path}") + + html = template.render(documents=documents, page=page, name=name) + name = Path(path).stem + + if not os.path.exists(dist): + os.makedirs(dist) + + with open(f"{dist}/{name}.html", "w", encoding="utf-8") as output_file: + output_file.write(html) + + +def get_page_data(path, isPreload=False): + filename = Path(path).stem + + page = frontmatter.load(path) + page['slug'] = slugify(filename) + page.filename = filename + page.folder = os.path.basename(os.path.dirname(path)) + + if "start_datetime" in page: + now = datetime.now() + page["has_passed"] = datetime.fromtimestamp(page["start_datetime"]) < now + + + + + latex = pypandoc.convert_text( + page.content, + to='md', + format='md', + extra_args=[ + "-N", + "--section-divs", + "--lua-filter=include-files.lua" + ]) + + page.body = pypandoc.convert_text( + latex, + to="html", + format="md", + extra_args=[ + "-N", + "--section-divs", + "--citeproc", + "--bibliography=library.bib", + "--csl=apa.csl", + ]) + + return page + + +def render_posts(path): + name = Path(path).stem + template = env.select_template([f"{name}.jinja", "post.jinja"]) + + for filename in os.listdir(path): + if filename.endswith(".md"): + post_path = os.path.join(path, filename) + page = get_page_data(post_path) + render_single_file(template, page, post_path, f"{OUTPUT_D}/{name}", name) + + +def preload_documents(): + print("preload any needed data") + now = datetime.now() + documents["meta"] = {} + documents["meta"]["now"] = now.strftime("%d %B %Y") + + for subdir in os.listdir(CONTENT_D): + path = os.path.join(CONTENT_D, subdir) + + if os.path.isdir(path): + name = Path(path).stem + if name not in documents: + documents[name] = [] + + files = os.listdir(path) + files.sort() + for filename in files: + if filename.endswith(".md"): + post_path = os.path.join(path, filename) + + documents[name].append(get_page_data(post_path, isPreload=True)) + + elif Path(path).suffix == '.md': + documents[Path(path).stem] = get_page_data(path, isPreload=True) + + +def copy_assets(): + if os.path.exists("dist/assets"): + shutil.rmtree("dist/assets") + + shutil.copytree("src/assets", "dist/assets") + + +def get_inventory(): + + with open("src/content/component-inventory.csv") as f: + documents['inventory'] = [] + for line in csv.DictReader( + f, + fieldnames=( + 'ID', + 'Amount', + 'Name', + 'Value', + 'type', + 'Date', + 'Where', + 'Mounting type')): + documents['inventory'].append(line) + + +def main(): + get_inventory() + preload_documents() + + + + print("render the content") + for subdir in os.listdir(CONTENT_D): + path = os.path.join(CONTENT_D, subdir) + + if os.path.isdir(path): + render_posts(path) + elif Path(path).suffix == '.md': + template = env.select_template( + [f"{Path(path).stem}.jinja", "post.jinja"]) + page = get_page_data(path) + render_single_file(template, page, path, OUTPUT_D) + elif Path(path).suffix in [".csv"]: + print("not compiling this file!") + + copy_assets() + + +main() diff --git a/get_events.py b/get_events.py new file mode 100644 index 0000000..f19c4cf --- /dev/null +++ b/get_events.py @@ -0,0 +1,65 @@ +import os +from pathlib import Path +import requests +import frontmatter + +def get_API(URL): + + try: + response = requests.get(URL) + response.raise_for_status() + return response.json() + + except requests.exceptoins.RequestException as e: + raise Exception(f"Failed getting the API response: {e}") + + +def create_calendar_item(item, filepath): + print("i will create an item for", item) + + try: + details = get_API("https://calendar.klank.school/api/event/detail/" + item['slug']) + print(details) + post = frontmatter.Post(content=details["description"]) + + for key in details: + post[key] = details[key] + + + with open(filepath, 'wb') as f: + frontmatter.dump(post, f) + print(f"Created file: {filepath}") + + except Exception as e: + print(f"An error occurred while getting the calendar events: {str(e)}") + exit(1) + + +def get_calendar_events(): + Path("src/content/events").mkdir(parents=True, exist_ok=True) + + + # Also get non unrepair events. + try: + items = get_API("https://calendar.klank.school/api/events?start=-1") + + for item in items: + filename = f"{item['slug']}.md" + filepath = os.path.join("src/content/events", filename) + + if os.path.isfile(filepath): + print("oh it already exists") + else: + print("did not store this yet") + create_calendar_item(item, filepath) + + except Exception as e: + print(f"An error occurred while getting the calendar events: {str(e)}") + exit(1) + + +def main(): + get_calendar_events() + + +main() diff --git a/include-files.lua b/include-files.lua new file mode 100644 index 0000000..895e5a5 --- /dev/null +++ b/include-files.lua @@ -0,0 +1,125 @@ +--- include-files.lua – filter to include Markdown files +--- +--- Copyright: © 2019–2021 Albert Krewinkel +--- License: MIT – see LICENSE file for details + +-- Module pandoc.path is required and was added in version 2.12 +PANDOC_VERSION:must_be_at_least '2.12' + +local List = require 'pandoc.List' +local path = require 'pandoc.path' +local system = require 'pandoc.system' + +local warn = pcall(require, 'pandoc.log') + and (require 'pandoc.log').warn + or warn + or function (msg) io.stderr:write(msg .. '\n') end + +--- Get include auto mode +local include_auto = false +function get_vars (meta) + if meta['include-auto'] then + include_auto = true + end +end + +--- Keep last heading level found +local last_heading_level = 0 +function update_last_level(header) + last_heading_level = header.level +end + +--- Update contents of included file +local function update_contents(blocks, shift_by, include_path) + local update_contents_filter = { + -- Shift headings in block list by given number + Header = function (header) + if shift_by then + header.level = header.level + shift_by + end + return header + end, + -- If image paths are relative then prepend include file path + Image = function (image) + if path.is_relative(image.src) then + image.src = path.normalize(path.join({include_path, image.src})) + end + return image + end, + -- Update path for include-code-files.lua filter style CodeBlocks + CodeBlock = function (cb) + if cb.attributes.include and path.is_relative(cb.attributes.include) then + cb.attributes.include = + path.normalize(path.join({include_path, cb.attributes.include})) + end + return cb + end + } + + return pandoc.walk_block(pandoc.Div(blocks), update_contents_filter).content +end + +--- Filter function for code blocks +local transclude +function transclude (cb) + -- ignore code blocks which are not of class "include". + if not cb.classes:includes 'include' then + return + end + + -- Markdown is used if this is nil. + local format = cb.attributes['format'] + + -- Attributes shift headings + local shift_heading_level_by = 0 + local shift_input = cb.attributes['shift-heading-level-by'] + if shift_input then + shift_heading_level_by = tonumber(shift_input) + else + if include_auto then + -- Auto shift headings + shift_heading_level_by = last_heading_level + end + end + + --- keep track of level before recusion + local buffer_last_heading_level = last_heading_level + + local blocks = List:new() + for line in cb.text:gmatch('[^\n]+') do + if line:sub(1,2) ~= '//' then + local fh = io.open(line) + if not fh then + warn("Cannot open file " .. line .. " | Skipping includes") + else + -- read file as the given format with global reader options + local contents = pandoc.read( + fh:read '*a', + format, + PANDOC_READER_OPTIONS + ).blocks + last_heading_level = 0 + -- recursive transclusion + contents = system.with_working_directory( + path.directory(line), + function () + return pandoc.walk_block( + pandoc.Div(contents), + { Header = update_last_level, CodeBlock = transclude } + ) + end).content + --- reset to level before recursion + last_heading_level = buffer_last_heading_level + blocks:extend(update_contents(contents, shift_heading_level_by, + path.directory(line))) + fh:close() + end + end + end + return blocks +end + +return { + { Meta = get_vars }, + { Header = update_last_level, CodeBlock = transclude } +} \ No newline at end of file diff --git a/library.bib b/library.bib new file mode 100644 index 0000000..df409dc --- /dev/null +++ b/library.bib @@ -0,0 +1,869 @@ +@article{abalansaElectronicWasteEnvironmental2021, + title = {Electronic {{Waste}}, an {{Environmental Problem Exported}} to {{Developing Countries}}: {{The GOOD}}, the {{BAD}} and the {{UGLY}}}, + shorttitle = {Electronic {{Waste}}, an {{Environmental Problem Exported}} to {{Developing Countries}}}, + author = {Abalansa, Samuel and El Mahrad, Badr and Icely, John and Newton, Alice}, + year = {2021}, + month = may, + journal = {Sustainability}, + volume = {13}, + number = {9}, + pages = {5302}, + issn = {2071-1050}, + doi = {10.3390/su13095302}, + urldate = {2025-01-05}, + abstract = {Electronic waste (e-waste) is a rapidly developing environmental problem particularly for the most developed countries. There are technological solutions for processing it, but these are costly, and the cheaper option for most developed countries has been to export most of the waste to less developed countries. There are various laws and policies for regulating the processing of e-waste at different governance scales such as the international Basel Convention, the regional Bamoko Convention, and various national laws. However, many of the regulations are not fully implemented and there is substantial financial pressure to maintain the jobs created for processing e-waste. Mexico, Brazil, Ghana Nigeria, India, and China have been selected for a more detailed study of the transboundary movements of e-waste. This includes a systematic review of existing literature, the application of the Driver, Pressure, State, Impact, Response (DPSIR) framework for analysing complex problems associated with social ecological systems, and the application of the Life Cycle Assessment (LCA) for evaluating the environmental impact of electronic devices from their manufacture through to their final disposal. Japan, Italy, Switzerland, and Norway have been selected for the LCA to show how e-waste is diverted to developing countries, as there is not sufficient data available for the assessment from the selected developing countries. GOOD, BAD and UGLY outcomes have been identified from this study: the GOOD is the creation of jobs and the use of e-waste as a source of raw materials; the BAD is the exacerbation of the already poor environmental conditions in developing countries; the UGLY is the negative impact on the health of workers processing e-waste due to a wide range of toxic components in this waste. There are a number of management options that are available to reduce the impact of the BAD and the UGLY, such as adopting the concept of a circular economy, urban mining, reducing loopholes and improving existing policies and regulations, as well as reducing the disparity in income between the top and bottom of the management hierarchy for e-waste disposal. The overarching message is a request for developed countries to help developing countries in the fight against e-waste, rather than exporting their environmental problems to these poorer regions.}, + copyright = {https://creativecommons.org/licenses/by/4.0/}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/6P788A6M/Abalansa et al. - 2021 - Electronic Waste, an Environmental Problem Exported to Developing Countries The GOOD, the BAD and t.pdf} +} + +@article{AtariVideoGame2024, + title = {Atari Video Game Burial}, + year = {2024}, + month = nov, + journal = {Wikipedia}, + urldate = {2025-01-20}, + abstract = {The Atari video game burial was a mass burial of unsold video game cartridges, consoles, and computers in a New Mexico landfill site undertaken by the American video game and home computer company Atari, Inc. in 1983. Before 2014, the goods buried were rumored to be unsold copies of E.T. the Extra-Terrestrial (1982), one of the largest commercial video game failures and often cited as one of the worst video games ever released, and the 1982 Atari 2600 port of Pac-Man, which was commercially successful but critically maligned. Since the burial was first reported, there had been doubts as to its veracity and scope, and it was frequently dismissed as an urban legend. The event became a cultural icon and a reminder of the video game crash of 1983; it was the end result of a disastrous fiscal year which saw Atari, Inc. sold off by its parent company Warner Communications. Though it was believed that millions of copies of E.T. were buried, Atari officials later verified the numbers to be around 700,000 cartridges of various games, including E.T. In 2014, Fuel Industries, Microsoft, and others worked with the New Mexico government to excavate the site as part of a documentary, Atari: Game Over. On April 26, 2014, the excavation revealed discarded games and hardware. Only a small fraction, about 1,300 cartridges, were recovered, with a portion given for curation and the rest auctioned to raise money for a museum to commemorate the burial.}, + copyright = {Creative Commons Attribution-ShareAlike License}, + langid = {english}, + annotation = {Page Version ID: 1257211909}, + file = {/Users/Rosa/Zotero/storage/UIVT7W6T/Atari_video_game_burial.html} +} + +@article{blasserPrettyPaperRolls2007, + title = {Pretty {{Paper Rolls}}: {{Experiments}} in {{Woven Circuits}}}, + shorttitle = {Pretty {{Paper Rolls}}}, + author = {Blasser, Peter}, + year = {2007}, + month = dec, + journal = {Leonardo Music Journal}, + volume = {17}, + pages = {25--27}, + issn = {0961-1215, 1531-4812}, + doi = {10.1162/lmj.2007.17.25}, + urldate = {2025-01-09}, + abstract = {The author presents a history of his efforts to design sustainable and economical circuit construction on paper, which he finds more akin to craft than industry. He focuses on a collection of modules called Rollz-5, which creates organic rhythms out of geometrical forms. A future application of this work will be to create radio devices based on the Platonic solids.}, + langid = {english}, + keywords = {list,summarised}, + file = {/Users/Rosa/Zotero/storage/URY2LY2U/Blasser - 2007 - Pretty Paper Rolls Experiments in Woven Circuits.pdf} +} + +@phdthesis{blasserStoresMall2015, + type = {Master of {{Arts}}}, + title = {Stores at the {{Mall}}}, + author = {Blasser, Peter}, + year = {2015}, + address = {Middletown, CT}, + doi = {10.14418/wes01.2.84}, + urldate = {2025-01-31}, + langid = {english}, + school = {Wesleyan University}, + file = {/Users/Rosa/Zotero/storage/SQ7WZL4S/Blasser - 2015 - Stores at the Mall.pdf} +} + +@inproceedings{blevisLuxuryNewLuxury2007, + title = {Luxury \& New Luxury, Quality \& Equality}, + booktitle = {Proceedings of the 2007 Conference on {{Designing}} Pleasurable Products and Interfaces}, + author = {Blevis, Eli and Makice, Kevin and Odom, William and Roedl, David and Beck, Christian and Blevis, Shunying and Ashok, Arvind}, + year = {2007}, + month = aug, + pages = {296--311}, + publisher = {ACM}, + address = {Helsinki Finland}, + doi = {10.1145/1314161.1314188}, + urldate = {2025-01-05}, + isbn = {978-1-59593-942-5}, + langid = {english} +} + +@article{bowersAllNoisesHijacking, + title = {All the {{Noises}}: {{Hijacking Listening Machines}} for {{Performative Research}}}, + author = {Bowers, John and Green, Owen}, + abstract = {Research into machine listening has intensified in recent years creating a variety of techniques for recognising musical features suitable, for example, in musicological analysis or commercial application in song recognition. Within NIME, several projects exist seeking to make these techniques useful in real-time music making. However, we debate whether the functionally-oriented approaches inherited from engineering domains that much machine listening research manifests is fully suited to the exploratory, divergent, boundary-stretching, uncertainty-seeking, playful and irreverent orientations of many artists. To explore this, we engaged in a concerted collaborative design exercise in which many different listening algorithms were implemented and presented with input which challenged their customary range of application and the implicit norms of musicality which research can take for granted. An immersive 3D spatialised multichannel environment was created in which the algorithms could be explored in a hybrid installation/performance/lecture form of research presentation. The paper closes with reflections on the creative value of `hijacking' formal approaches into deviant contexts, the typically undocumented practical know-how required to make algorithms work, the productivity of a playfully irreverent relationship between engineering and artistic approaches to NIME, and a sketch of a sonocybernetic aesthetics for our work.}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/2ZLACHGS/Bowers and Green - All the Noises Hijacking Listening Machines for Performative Research.pdf} +} + +@misc{bowersNotHyperNot2005, + title = {Not {{Hyper}}, {{Not Meta}}, {{Not Cyber}} but {{Infra-Instruments}}}, + author = {Bowers, John and Archer, Phil}, + year = {2005}, + month = jun, + journal = {Proceedings of the International Conference on New Interfaces for Musical Expression}, + pages = {5--10}, + publisher = {Zenodo}, + doi = {10.5281/zenodo.1176713}, + urldate = {2025-01-05}, + abstract = {Description}, + file = {/Users/Rosa/Zotero/storage/77GB79E3/Bowers and Archer - 2005 - Not Hyper, Not Meta, Not Cyber but Infra-Instruments.pdf} +} + +@article{bowersRawDataRough, + title = {Raw {{Data}}, {{Rough Mix}}: {{Towards}} an {{Integrated Practice}} of {{Making}}, {{Performance}} and {{Pedagogy}}}, + author = {Bowers, John and Richards, John and Shaw, Tim and Foster, Robin and Kubota, Akihiro}, + abstract = {This paper describes an extended intercontinental collaboration between multiple artists, institutions, and their publics, to develop an integrated musical practice which combines experimental making, performance, and pedagogy. We build on contributions to NIME which work with art and design-led methods to explore alternatives to, for example, more engineering-oriented approaches, without loss of practical utility and theoretical potential. We describe two week-long workshop-residencies and three performance-installations done under the provocative title Raw Data, Rough Mix which was intended to encourage exploration of basic processes in physical, mechanical, electrical, electronic and computational domains to develop musical artefacts that were frugal in their resource-demands but enabled the interrogation of human/non-human relationships, performativity, musical ecologies, aesthetics, and other matters. We close by elaborating our contribution to NIME as offering an integrated practice combining making, playing and learning, which is critically informed and practically productive.}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/RHWZJBUD/Bowers et al. - Raw Data, Rough Mix Towards an Integrated Practice of Making, Performance and Pedagogy.pdf} +} + +@misc{byWhyResistorsHave2020, + title = {Why {{Do Resistors Have A Color Code}}?}, + author = {By}, + year = {2020}, + month = jan, + journal = {Hackaday}, + urldate = {2025-01-28}, + abstract = {One of the first things you learn in electronics is how to identify a resistor's value. Through-hole resistors have color codes, and that's generally where beginners begin. But why are {\dots}}, + langid = {american} +} + +@book{collinsHandmadeElectronicMusic2009, + title = {Handmade Electronic Music: The Art of Hardware Hacking}, + shorttitle = {Handmade Electronic Music}, + author = {Collins, Nicolas}, + year = {2009}, + edition = {Second edition}, + publisher = {Routledge}, + address = {New York}, + isbn = {978-0-415-99609-9 978-0-415-99873-4 978-0-203-87962-7}, + lccn = {ML1092 .C66 2009}, + keywords = {Construction,Electronic musical instruments,toppertje} +} + +@article{collinsIntroductionComposersElectronics2004, + title = {Introduction: {{Composers}} inside {{Electronics}}: {{Music}} after {{David Tudor}}}, + author = {Collins, Nicolas}, + year = {2004}, + journal = {Leonardo Music Journal}, + volume = {14}, + eprint = {1513497}, + eprinttype = {jstor}, + pages = {1--3}, + publisher = {The MIT Press}, + issn = {09611215, 15314812}, + urldate = {2025-01-14}, + keywords = {list,summarised} +} + +@misc{CooperativeExperimentalismSharing, + title = {Cooperative {{Experimentalism}}: {{Sharing}} to Enhance Electronic Media}, + urldate = {2025-01-27}, + howpublished = {https://research-repository.griffith.edu.au/items/b8fa545b-32c9-4d68-866f-8549ead9e3ef} +} + +@article{devalkRefusingBurdenComputation2021, + title = {Refusing the {{Burden}} of {{Computation}}: {{Edge Computing}} and {{Sustainable ICT}}}, + shorttitle = {Refusing the {{Burden}} of {{Computation}}}, + author = {De Valk, Marloes}, + year = {2021}, + month = aug, + journal = {A Peer-Reviewed Journal About}, + volume = {10}, + number = {1}, + pages = {14--29}, + issn = {2245-7755}, + doi = {10.7146/aprja.v10i1.128184}, + urldate = {2025-01-05}, + abstract = {This paper asks what we can learn from edge computing about the commitment of Big Tech to diminish its ecological footprint. The text starts with the COVID-19 pandemic being framed as opportunity for more sustainability and unpacks edge computing as one of the elements proposed as a solution, next to working from home. It interrogates the discourse behind these solutions, one of technological fixes that allow `business as usual' to continue, undisturbed by government regulations, outsourcing the burden of environmental responsibility to citizens. The paper draws parallels between edge computing, Big Tech's approach to sustainability and the history of the Sustainable ICT discourse and proposes that to truly diminish ICT's footprint, a refusal of the burden of computation and digital enclosure (vendor lock-in) is needed, by collectively building and financing network services.}, + copyright = {http://creativecommons.org/licenses/by-nc-sa/4.0}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/NFQC58VX/De Valk - 2021 - Refusing the Burden of Computation Edge Computing and Sustainable ICT.pdf} +} + +@misc{DirtyElectronicsPopup2020, + title = {Dirty {{Electronics Pop-up}} for {{Collaborative Music-making}}}, + year = {2020}, + month = jun, + journal = {Dirty Electronics Pop-up for Collaborative Music-making}, + urldate = {2025-01-16}, + howpublished = {https://popupforcollaborativemusicmaking.wordpress.com/}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/D6EBFKZU/popupforcollaborativemusicmaking.wordpress.com.html} +} + +@article{fennisOntologyElectronicWaste, + title = {Ontology {{Of Electronic Waste}}}, + author = {Fennis, Maurits}, + langid = {english}, + keywords = {list,prio:high,summarised}, + file = {/Users/Rosa/Zotero/storage/PZ45G9QF/Fennis - Ontology Of Electronic Waste.pdf} +} + +@article{fernandezCircuitBendingDIYCulture, + title = {Circuit-{{Bending}} and {{DIY Culture}}}, + author = {Fernandez, Alexandre Marino and Iazzetta, Fernando}, + abstract = {This article analyses Circuit-Bending and its relation to the Do-ityourself (DIY) culture. Circuit-bending is an experimental music practice which consists of opening up low voltage (battery powered) electronic devices (musical toys, radio devices, cd players, etc. -- mostly technological waste) and of changing (bend) the way electricity flows through their circuits in order to achieve an `interesting' result. After presenting the work of some artists who make use of this methodology we introduce the concept of proletarianisation by philosopher Bernard Stiegler and how such methodologies can act as de-proletarianisation tactics. Then, we present the Do-it-together (DIT) or Do-it-with-others (DIWO) discussion to bring into scene the notion of Relational Aesthetics.}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/4HTDFEDL/Fernandez and Iazzetta - Circuit-Bending and DIY Culture.pdf} +} + +@article{fullerIntroductionAutomaticInstruments1983, + title = {An Introduction to Automatic Instruments}, + author = {Fuller, David}, + year = {1983}, + month = apr, + journal = {Early Music}, + volume = {11}, + number = {2}, + pages = {164--166}, + issn = {0306-1078}, + doi = {10.1093/earlyj/11.2.164}, + urldate = {2025-01-05}, + file = {/Users/Rosa/Zotero/storage/IAGI7P47/334230.html} +} + +@book{gabrysDigitalRubbishNatural2011, + title = {Digital Rubbish: A Natural History of Electronics}, + shorttitle = {Digital Rubbish}, + author = {Gabrys, Jennifer}, + year = {2011}, + publisher = {University of Michigan press}, + address = {Ann Arbor}, + isbn = {978-0-472-11761-1}, + langid = {english}, + lccn = {363.728 8}, + keywords = {list,prio:high,reading atm,summarised,to summarise,toppertje}, + file = {/Users/Rosa/Zotero/storage/PZB4D642/Gabrys - 2011 - Digital rubbish a natural history of electronics.pdf} +} + +@book{heimsCyberneticsGroup1991, + title = {The Cybernetics Group}, + author = {Heims, Steve J.}, + year = {1991}, + publisher = {MIT Press}, + address = {Cambridge, Mass}, + isbn = {978-0-262-08200-6}, + langid = {english}, + lccn = {H62.5.U5 H45 1991}, + keywords = {Cybernetics,Josiah Macy Jr. Foundation,Philosophy,Research,Science,Social aspects,Social sciences,United States}, + file = {/Users/Rosa/Zotero/storage/F7GQ3EYL/Heims - 1991 - The cybernetics group.pdf} +} + +@book{hertzArtDIYElectronics2023, + title = {Art + {{DIY}} Electronics}, + author = {Hertz, Garnet}, + year = {2023}, + publisher = {The MIT Press}, + address = {Cambridge, Massachusetts}, + abstract = {"The first rigorous and systematic theory of Do-It-Yourself (DIY) electronic culture"--}, + isbn = {978-0-262-04493-6}, + langid = {english}, + lccn = {N72.E53 H47 2023}, + keywords = {Art and electronics,Arts,Experimental methods,list,Maker movement,prio:high,Social aspects,summarised,Technology}, + file = {/Users/Rosa/Zotero/storage/E8IXZVMU/Hertz - 2023 - Art + DIY electronics.pdf} +} + +@book{hertzDisobedientElectronics, + title = {Disobedient {{Electronics}}}, + author = {Hertz, Garnet}, + file = {/Users/Rosa/Zotero/storage/8I52Q9NN/Hertz-Disobedient-Electronics-Protest-201801081332c.pdf} +} + +@article{hertzZombieMediaCircuit2012, + title = {Zombie {{Media}}: {{Circuit Bending Media Archaeology}} into an {{Art Method}}}, + shorttitle = {Zombie {{Media}}}, + author = {Hertz, Garnet and Parikka, Jussi}, + year = {2012}, + month = oct, + journal = {Leonardo}, + volume = {45}, + number = {5}, + pages = {424--430}, + issn = {0024-094X, 1530-9282}, + doi = {10.1162/LEON_a_00438}, + urldate = {2025-01-05}, + abstract = {This text is an investigation into media culture, temporalities of media objects and planned obsolescence in the midst of ecological crisis and electronic waste. The authors approach the topic under the umbrella of media archaeology and aim to extend this historiographically oriented field of media theory into a methodology for contemporary artistic practice. Hence, media archaeology becomes not only a method for excavation of repressed and forgotten media discourses, but extends itself into an artistic method close to Do-It-Yourself (DIY) culture, circuit bending, hardware hacking and other hacktivist exercises that are closely related to the political economy of information technology. The concept of dead media is discussed as ``zombie media''---dead media revitalized, brought back to use, reworked.}, + langid = {english}, + keywords = {list,summarised,toppertje}, + file = {/Users/Rosa/Zotero/storage/K5SZIEPI/Hertz and Parikka - 2012 - Zombie Media Circuit Bending Media Archaeology into an Art Method.pdf} +} + +@book{holmesElectronicExperimentalMusic2012, + title = {Electronic and Experimental Music: Technology, Music, and Culture}, + shorttitle = {Electronic and Experimental Music}, + author = {Holmes, Thom and Pender, Terence M.}, + year = {2012}, + edition = {4th ed}, + publisher = {Routledge}, + address = {New York}, + isbn = {978-0-415-89646-7 978-0-415-89636-8 978-0-203-12842-8}, + lccn = {ML1380 .H64 2012}, + keywords = {Computer music,Electronic music,History and criticism}, + annotation = {OCLC: ocn703208713}, + file = {/Users/Rosa/Zotero/storage/HUAVMT2T/Electronic and Experimental Music.pdf} +} + +@book{horowitzArtElectronics2024, + title = {The Art of Electronics}, + author = {Horowitz, Paul and Hill, Winfield}, + year = {2024}, + edition = {Third edition, 20th printing with corrections}, + publisher = {Cambridge University Press}, + address = {Cambridge, New York}, + isbn = {978-0-521-80926-9}, + langid = {english} +} + +@article{ilesMappingEnvironmentalJustice2004, + title = {Mapping {{Environmental Justice}} in {{Technology Flows}}: {{Computer Waste Impacts}} in {{Asia}}}, + shorttitle = {Mapping {{Environmental Justice}} in {{Technology Flows}}}, + author = {Iles, Alastair}, + year = {2004}, + month = nov, + journal = {Global Environmental Politics}, + volume = {4}, + number = {4}, + pages = {76--107}, + issn = {1526-3800, 1536-0091}, + doi = {10.1162/glep.2004.4.4.76}, + urldate = {2025-01-17}, + abstract = {In the 21st century, technology and material flows constitute an ever-growing set of global environmental change. In particular, electronic wastes are emerging as a major transnational problem. Industrial nations are shipping millions of obsolete computers to Asia yearly; Asian countries are emerging as generators of e-waste in their own right. This article argues that an environmental justice approach can help illuminate the impacts of technology and material flows. To do so, however, environmental justice definitions and methodologies need to account for how and why such flows occur. Using the case of computers, the article analyses some factors shaping the e-waste recycling chain, shows how e-waste risks depend on design and manufacturing chains, and evaluates inequalities in the ecological and health impacts of e-wastes across Asia. It proposes a definition of environmental justice as obviating the production of risk, using a framework that brings together the global production system, development models, and regulatory action.}, + langid = {english} +} + +@book{illichToolsConviviality2009, + title = {Tools for Conviviality}, + author = {Illich, Ivan}, + year = {2009}, + publisher = {Marion Boyars}, + address = {London}, + isbn = {978-1-84230-011-4}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/2DJBTUR7/Illich - 2009 - Tools for conviviality.pdf;/Users/Rosa/Zotero/storage/ZJDVPEGI/LoRENZ - LORD KENNETH CLARK WERNER HEISENBERG Sm FRED HoYLE IvAN ILLICH.pdf} +} + +@book{instituteofnetworkculturesDepletionDesignGlossary2012, + title = {Depletion Design: A Glossary of Network Ecologies}, + shorttitle = {Depletion Design}, + author = {{Institute of Network Cultures}}, + year = {2012}, + series = {Theory on Demand}, + number = {8}, + publisher = {Institute of Network Cultures}, + address = {Amsterdam}, + collaborator = {Wiedemann, Carolin and Zehle, Soenke}, + isbn = {978-90-818575-1-2}, + langid = {american}, + keywords = {list,summarised}, + file = {/Users/Rosa/Zotero/storage/XAC25TL3/TOD8_DEPLETION_DESIGN.pdf} +} + +@article{InterchangeableParts2024, + title = {Interchangeable Parts}, + year = {2024}, + month = nov, + journal = {Wikipedia}, + urldate = {2025-01-27}, + abstract = {Interchangeable parts are parts (components) that are identical for practical purposes. They are made to specifications that ensure that they are so nearly identical that they will fit into any assembly of the same type. One such part can freely replace another, without any custom fitting, such as filing. This interchangeability allows easy assembly of new devices, and easier repair of existing devices, while minimizing both the time and skill required of the person doing the assembly or repair. The concept of interchangeability was crucial to the introduction of the assembly line at the beginning of the 20th century, and has become an important element of some modern manufacturing but is missing from other important industries. Interchangeability of parts was achieved by combining a number of innovations and improvements in machining operations and the invention of several machine tools, such as the slide rest lathe, screw-cutting lathe, turret lathe, milling machine and metal planer. Additional innovations included jigs for guiding the machine tools, fixtures for holding the workpiece in the proper position, and blocks and gauges to check the accuracy of the finished parts. Electrification allowed individual machine tools to be powered by electric motors, eliminating line shaft drives from steam engines or water power and allowing higher speeds, making modern large-scale manufacturing possible. Modern machine tools often have numerical control (NC) which evolved into CNC (computerized numeric control) when microprocessors became available. Methods for industrial production of interchangeable parts in the United States were first developed in the nineteenth century. The term American system of manufacturing was sometimes applied to them at the time, in distinction from earlier methods. Within a few decades such methods were in use in various countries, so American system is now a term of historical reference rather than current industrial nomenclature.}, + copyright = {Creative Commons Attribution-ShareAlike License}, + langid = {english}, + annotation = {Page Version ID: 1255830111}, + file = {/Users/Rosa/Zotero/storage/ILURMSC5/Interchangeable_parts.html} +} + +@inproceedings{jangUnplannedObsolescenceHardware2017, + title = {Unplanned {{Obsolescence}}: {{Hardware}} and {{Software After Collapse}}}, + shorttitle = {Unplanned {{Obsolescence}}}, + booktitle = {Proceedings of the 2017 {{Workshop}} on {{Computing Within Limits}}}, + author = {Jang, Esther and Johnson, Matthew and Burnell, Edward and Heimerl, Kurtis}, + year = {2017}, + month = jun, + pages = {93--101}, + publisher = {ACM}, + address = {Santa Barbara California USA}, + doi = {10.1145/3080556.3080566}, + urldate = {2025-01-05}, + isbn = {978-1-4503-4950-5}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/ZGWSKZXI/Jang et al. - 2017 - Unplanned Obsolescence Hardware and Software After Collapse.pdf} +} + +@article{jordanDIYElectronicsRevealing2015, + title = {{{DIY Electronics}}: {{Revealing}} the {{Material Systems}} of {{Computation}}}, + author = {JORDAN, {\relax RYAN}}, + year = {2015}, + journal = {Leonardo Music Journal}, + volume = {25}, + eprint = {43832529}, + eprinttype = {jstor}, + pages = {41--46}, + publisher = {The MIT Press}, + issn = {09611215, 15314812}, + urldate = {2025-01-14}, + abstract = {The author sets out an extension of do-it-yourself (DIY) electronics as a literal critical practice addressing the social, economic and geological systems shaping technologies we use, presenting several real-world examples and concluding with future directions.}, + keywords = {list,summarised} +} + +@article{kastnerDomesticationGarage2019, + title = {The {{Domestication}} of the {{Garage}}}, + author = {Kastner, Jeffrey}, + year = {2019}, + month = feb, + journal = {Places Journal}, + issn = {21647798}, + doi = {10.22269/190205}, + urldate = {2025-01-16}, + abstract = {J.B. Jackson's 1976 essay on the evolution of the American garage displays his rare ability to combine deep erudition with eloquent and plainspoken analysis.}, + langid = {american}, + file = {/Users/Rosa/Zotero/storage/Q9BZWJUI/j-b-jackson-the-domestication-of-the-garage.html} +} + +@article{kostakisProductionGovernanceHackerspaces2015, + title = {Production and Governance in Hackerspaces: {{A}} Manifestation of {{Commons-based}} Peer Production in the Physical Realm?}, + shorttitle = {Production and Governance in Hackerspaces}, + author = {Kostakis, Vasilis and Niaros, Vasilis and Giotitsas, Christos}, + year = {2015}, + month = sep, + journal = {International Journal of Cultural Studies}, + volume = {18}, + number = {5}, + pages = {555--573}, + issn = {1367-8779, 1460-356X}, + doi = {10.1177/1367877913519310}, + urldate = {2025-01-05}, + abstract = {This article deals with the phenomenon of hackerspaces and sheds light on the relationship of their underlying values, organizational structures and productive processes to those of the online communities of Commons-based peer production projects. While hackerspaces adopt hybrid modes of governance, this article attempts to identify patterns, trends and theory that can frame their production and governance mechanisms. Using a diverse amount of literature and case studies, it is argued that, in many cases, hackerspaces exemplify several aspects of peer production projects' principles and governance mechanisms.}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/K3379N2W/Kostakis et al. - 2015 - Production and governance in hackerspaces A manifestation of Commons-based peer production in the p.pdf} +} + +@article{lemmensInterviewBernardStiegler, + title = {Interview with {{Bernard Stiegler}}}, + author = {Lemmens, Pieter}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/VUJHFQ4Q/Lemmens - Interview with Bernard Stiegler.pdf} +} + +@inproceedings{lepawskyWorldFixersExamining2020, + title = {Towards a {{World}} of {{Fixers Examining}} Barriers and Enablers of Widely Deployed Third-Party Repair for Computing within Limits}, + booktitle = {Proceedings of the 7th {{International Conference}} on {{ICT}} for {{Sustainability}}}, + author = {Lepawsky, Josh}, + year = {2020}, + month = jun, + pages = {314--320}, + publisher = {ACM}, + address = {Bristol United Kingdom}, + doi = {10.1145/3401335.3401816}, + urldate = {2025-01-05}, + isbn = {978-1-4503-7595-5}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/NEBEZJ9M/Lepawsky - 2020 - Towards a World of Fixers Examining barriers and enablers of widely deployed third-party repair for.pdf} +} + +@inproceedings{lepri10000InstrumentsWorkshop2022, + title = {The 10,000 {{Instruments Workshop}} - ({{Im}})Practical {{Research}} for {{Critical Speculation}}}, + booktitle = {International {{Conference}} on {{New Interfaces}} for {{Musical Expression}}}, + author = {Lepri, Giacomo and Bowers, John and Topley, Samantha and Stapleton, Paul and Bennett, Peter and Andersen, Kristina and McPherson, Andrew}, + year = {2022}, + month = jun, + doi = {10.21428/92fbeb44.9e7c9ba3}, + urldate = {2025-01-16}, + abstract = {This paper describes the 10,000 Instruments workshop, a collaborative online event conceived to generate interface ideas and speculate on music technology through open-ended artefacts and playful design explorations. We first present the activity, setting its research and artistic scope. We then report on a selection of outcomes created by workshop attendees, and examine the critical design statements they convey. The paper concludes with reflections on the make-believe, whimsical and troublemaking approach to instrument design adopted in the workshop. In particular, we consider the ways this activity can support individuals' creativity, unlock shared musical visions and reveal unconventional perspectives on music technology development.}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/BQ8EBRU6/Lepri et al. - 2022 - The 10,000 Instruments Workshop - (Im)practical Research for Critical Speculation.pdf} +} + +@misc{LoudObjectsVague2014, + title = {Loud {{Objects}} {\textbar} {{Vague Terrain}}}, + year = {2014}, + month = jul, + urldate = {2025-01-26}, + howpublished = {https://web.archive.org/web/20140723160643/http://vagueterrain.net/journal19/loud-objects/01}, + file = {/Users/Rosa/Zotero/storage/F3MGCLPY/01.html} +} + +@misc{lovinkPrinciplesPermaHybridity, + title = {Principles of {{Perma-Hybridity}}}, + author = {Lovink, Geert}, + urldate = {2025-01-05}, + langid = {american}, + keywords = {list,summarised}, + file = {/Users/Rosa/Zotero/storage/XFGEV94M/Principles of Perma-Hybridity.pdf;/Users/Rosa/Zotero/storage/HYCEANK3/principles-of-perma-hybridity.html} +} + +@book{magielsRECYCLEAlsAfval, + title = {{{RECYCLE}}! {{Als}} Afval Grondstof Wordt}, + author = {Magiels, Geerdt}, + keywords = {list,summarised} +} + +@book{magnussonSonicWritingTechnologies2019, + title = {Sonic Writing: Technologies of Material, Symbolic and Signal Inscriptions}, + shorttitle = {Sonic Writing}, + author = {Magnusson, Thor}, + year = {2019}, + publisher = {Bloomsbury Academic}, + address = {New York, NY}, + isbn = {978-1-5013-1386-8 978-1-5013-1388-2 978-1-5013-1387-5}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/URF6ZN4I/Sonic Writing Technologies.pdf} +} + +@article{matternMaintenanceCare2018, + title = {Maintenance and {{Care}}}, + author = {Mattern, Shannon}, + year = {2018}, + month = nov, + journal = {Places Journal}, + issn = {21647798}, + doi = {10.22269/181120}, + urldate = {2025-01-20}, + abstract = {A working guide to the repair of rust, dust, cracks, and corrupted code in our cities, our homes, and our social relations.}, + langid = {american}, + file = {/Users/Rosa/Zotero/storage/R6T6XGMT/maintenance-and-care.html} +} + +@article{matternStepStepThinking2024, + title = {Step by {{Step Thinking}} through and beyond the Repair Manual}, + author = {Mattern, Shannon}, + year = {2024}, + month = feb, + journal = {Places Journal}, + issn = {21647798}, + doi = {10.22269/240227}, + urldate = {2025-01-05}, + abstract = {The best repair manuals present a vision of repair that is social, embodied, intuitive, and accessible. What if we extend these principles beyond material objects, to the scale of civic systems and spaces?}, + langid = {american}, + keywords = {list,manual,prio:high,repair,to summarise}, + file = {/Users/Rosa/Zotero/storage/CVR3A5FM/step-by-step-repair-manuals-political-ecology.html} +} + +@article{MediaArcheologyLab2017, + title = {Media {{Archeology Lab}}: {{Experimentation}}, {{Tinkering}}, {{Probing}}. {{Lori Emerson}} in Conversation with {{Piotr Marecki}}}, + shorttitle = {Media {{Archeology Lab}}}, + year = {2017}, + journal = {Przegl{\k a}d Kulturoznawczy}, + volume = {33}, + issn = {20843860}, + doi = {10.4467/20843860PK.17.030.7800}, + urldate = {2025-01-05}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/EHFWEG5S/2017 - Media Archeology Lab Experimentation, Tinkering, Probing. Lori Emerson in conversation with Piotr M.pdf} +} + +@misc{mersonSixDifficultInconvenient2021, + title = {Six ({{Difficult}} and {{Inconvenient}}) {{Values}} to {{Reclaim}} the {{Future}} with {{Old Media}}}, + author = {Merson, Lorie}, + year = {2021}, + month = nov, + journal = {loriemerson}, + urldate = {2025-01-05}, + abstract = {Below is the pre-print version of a book chapter I wrote for The Bloomsbury Handbook to the Digital Humanities, edited by James O'Sullivan and forthcoming in 2022. Gratitude to James for the {\dots}}, + langid = {english}, + keywords = {list,prio:high,to summarise}, + file = {/Users/Rosa/Zotero/storage/2PN2LXDW/loriemerson-net-20.pdf;/Users/Rosa/Zotero/storage/UULUI9MB/six-difficult-and-inconvenient-values-to-reclaim-the-future-with-old-media.html} +} + +@book{mindellHumanMachineFeedback2002, + title = {Between Human and Machine: Feedback, Control, and Computing before Cybernetics}, + shorttitle = {Between Human and Machine}, + author = {Mindell, David A.}, + year = {2002}, + series = {Johns {{Hopkins}} Studies in the History of Technology}, + publisher = {Johns Hopkins University Press}, + address = {Baltimore}, + isbn = {978-0-8018-6895-5 978-0-8018-7774-2}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/X5EIETEA/Mindell - 2002 - Between human and machine feedback, control, and computing before cybernetics.pdf} +} + +@article{moslangHowDoesBicycle2004, + title = {How {{Does}} a {{Bicycle Light Sound}}?: {{Cracked Everyday Electronics}}}, + author = {M{\"o}slang, Norbert and Br{\"a}uninger, Brigitte}, + year = {2004}, + journal = {Leonardo Music Journal}, + volume = {14}, + eprint = {1513511}, + eprinttype = {jstor}, + pages = {83--83}, + publisher = {The MIT Press}, + issn = {09611215, 15314812}, + urldate = {2025-01-14}, + abstract = {[Every electronic appliance contains a unique sonic potential, which the author "cracks" to create music.]}, + keywords = {list,summarised} +} + +@book{oliverosSoftwarePeopleCollected2015, + title = {Software for {{People}}: Collected Writings 1963-80}, + shorttitle = {Software for {{People}}}, + author = {Oliveros, Pauline}, + year = {2015}, + edition = {Second Edition}, + publisher = {Pauline Oliveros Publications}, + address = {Kingston, NY}, + isbn = {978-1-5175-2574-3}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/9F7HAMJ9/Oliveros_Pauline_Software_for_People_Collected_Writings_1963-80.pdf} +} + +@article{parksFallingApartElectronics, + title = {Falling {{Apart}}: {{Electronics Salvaging}} and the {{Global Media Economy}}}, + author = {Parks, Lisa}, + langid = {english}, + keywords = {list,prio:high,summarised,toppertje}, + file = {/Users/Rosa/Zotero/storage/CAIF3ZWR/Parks - Falling Apart Electronics Salvaging and the Global Media Economy.pdf} +} + +@book{pellowGarbageWarsStruggle2002, + title = {Garbage {{Wars}}: {{The Struggle}} for {{Environmental Justice}} in {{Chicago}}}, + shorttitle = {Garbage {{Wars}}}, + author = {Pellow, David Naguib}, + year = {2002}, + publisher = {The MIT Press}, + doi = {10.7551/mitpress/3195.001.0001}, + urldate = {2025-01-17}, + isbn = {978-0-262-28135-5}, + langid = {english} +} + +@book{postmaWeggooienMooiNiet, + title = {Weggooien, Mooi Niet!}, + author = {Postma, Martine}, + isbn = {978-94-90298-06-7}, + keywords = {list,summarised} +} + +@inproceedings{raghavanMacroscopicallySustainableNetworking2016, + title = {Macroscopically Sustainable Networking: On Internet Quines}, + shorttitle = {Macroscopically Sustainable Networking}, + booktitle = {Proceedings of the {{Second Workshop}} on {{Computing}} within {{Limits}}}, + author = {Raghavan, Barath and Hasan, Shaddi}, + year = {2016}, + month = jun, + pages = {1--6}, + publisher = {ACM}, + address = {Irvine California}, + doi = {10.1145/2926676.2926685}, + urldate = {2025-01-05}, + isbn = {978-1-4503-4260-5}, + langid = {english} +} + +@article{remyLimitsSustainableInteraction2015, + title = {Limits and Sustainable Interaction Design: Obsolescence in a Future of Collapse and Resource Scarcity}, + shorttitle = {Limits and Sustainable Interaction Design}, + author = {Remy, Christian and Huang, Elaine May}, + year = {2015}, + month = jun, + publisher = {s.n.}, + doi = {10.5167/UZH-110997}, + urldate = {2025-01-05}, + keywords = {list,prio:high} +} + +@article{richardsDIYElectronicMusic2013, + title = {Beyond {{DIY}} in {{Electronic Music}}}, + author = {Richards, John}, + year = {2013}, + month = dec, + journal = {Organised Sound}, + volume = {18}, + number = {3}, + pages = {274--281}, + issn = {1355-7718, 1469-8153}, + doi = {10.1017/S1355771813000241}, + urldate = {2025-01-05}, + abstract = {Do-it-yourself (DIY) in electronic music represents a new paradigm that is not just about DIY. Doing-it-together (DIT) and the idea of community and shared experiences are at the root of DIY practice. This article discusses how the workshop and the event have become central to practitioners working in the field of DIY. Collective instrument building, the concept of the living installation, and performance are viewed as a holistic event. Some specific examples of the author's work known as Dirty Electronics are considered, where emphasis is placed upon experience rather than the `something to take home' factor. These include the following works:ICA Solder a Score, Composing `outside' electronics is regarded as a method for revealing processes that can be represented in other areas of the work beyond sound-generating circuits. The article also looks at how building circuits and sound devices acts as a way to create a tabula rasa, and how the idea of delegated performance, where instruments are played by `non-experts', serves to establish a na{\"i}ve approach and authenticity in performance. Through the sharing of information online and in workshops, the DIY community has become knowledgeable, which has resulted in a community `full of experts' and the growth of custom-designed circuits. The rise of discrete hand-held music players, such as the Buddha Machine, and the boutique synthesiser are also discussed, and the physical artefact and sound object are seen as a vehicle for the dissemination of ideas. Finally, the question is asked: `In DIY practice, where does the authentic document of the work lie?'}, + copyright = {https://www.cambridge.org/core/terms}, + langid = {english}, + keywords = {list,summarised}, + file = {/Users/Rosa/Zotero/storage/PJMVSHEX/Richards - 2013 - Beyond DIY in Electronic Music.pdf} +} + +@inproceedings{richardsSpeculativeSoundCircuits2018, + title = {Speculative {{Sound Circuits}}}, + booktitle = {Politics of the {{Machines}} - {{Art}} and {{After}}}, + author = {Richards, John}, + year = {2018}, + doi = {10.14236/ewic/EVAC18.33}, + urldate = {2025-01-05}, + copyright = {http://creativecommons.org/licenses/by/4.0/}, + langid = {english}, + keywords = {list,prio:high,to summarise,toppertje}, + file = {/Users/Rosa/Zotero/storage/WJS3URT5/Richards - 2018 - Speculative Sound Circuits.pdf} +} + +@misc{RightRepairGiving, + title = {The {{Right To Repair}}: {{Giving Consumers}} the {{Ability}} to {{Fix}} Their {{Own Electronics}} - {{News}}}, + shorttitle = {The {{Right To Repair}}}, + urldate = {2025-01-28}, + abstract = {Many U.S. states are considering a bill to give consumers the protected right to repair their own electronics without fear of manufacturer retaliation.}, + howpublished = {https://www.allaboutcircuits.com/news/right-to-repair-laws-for-consumer-electronics/}, + langid = {english} +} + +@article{rodgersPinkNoisesWomen, + title = {Pink {{Noises}}: {{Women}} on {{Electronic Music}} and {{Sound}}}, + author = {Rodgers, Tara}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/MRR2KAEV/Rodgers - Pink Noises Women on Electronic Music and Sound.pdf} +} + +@misc{RoolzGeweiJagerspracheVague, + title = {Roolz-{{Gewei}} \& {{Jagersprache}} {\textbar} {{Vague Terrain}}}, + urldate = {2025-01-26}, + howpublished = {https://web.archive.org/web/20140723131951/http://vagueterrain.net/journal19/peter-blasser/01} +} + +@misc{RoolzGeweiJagerspracheVaguea, + title = {Roolz-{{Gewei}} \& {{Jagersprache}} {\textbar} {{Vague Terrain}}}, + urldate = {2025-01-26}, + howpublished = {https://web.archive.org/web/20140723131951/http://vagueterrain.net/journal19/peter-blasser/01} +} + +@inproceedings{rouraCircularDigitalDevices2021, + title = {Circular Digital Devices: Lessons about the Social and Planetary Boundaries}, + shorttitle = {Circular Digital Devices}, + booktitle = {Computing within {{Limits}}}, + author = {Roura, Mireia and Franquesa, David and Navarro, Leandro and Meseguer, Roc}, + year = {2021}, + month = jun, + publisher = {LIMITS}, + doi = {10.21428/bf6fb269.3881c46e}, + urldate = {2025-01-05}, + abstract = {LIMITS '21 Paper}, + langid = {english}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/EE6U37KD/Roura et al. - 2021 - Circular digital devices lessons about the social and planetary boundaries.pdf} +} + +@misc{selwynWhatMightDegrowth2022, + title = {What Might Degrowth Computing Look Like?}, + author = {Selwyn, Neil}, + year = {2022}, + month = apr, + journal = {Critical Studies of EDUCATION \& TECHNOLOGY}, + urldate = {2025-01-05}, + abstract = {The past few years have seen various attempts within computing, programming and hacker communities to apply `degrowth' principles to their work -- i.e. sketching out ways to de-couple digital techno{\dots}}, + langid = {english}, + keywords = {niet gebruiken}, + file = {/Users/Rosa/Zotero/storage/ABFRIUPV/PDF document.pdf;/Users/Rosa/Zotero/storage/9ZAFPFDB/2022 - What might degrowth computing look like.html} +} + +@book{sladeMadeBreakTechnology2006, + title = {Made to Break: Technology and Obsolescence in {{America}}}, + shorttitle = {Made to Break}, + author = {Slade, Giles}, + year = {2006}, + publisher = {Harvard university press}, + address = {Cambridge}, + isbn = {978-0-674-02203-4}, + langid = {english}, + lccn = {609.730 9}, + keywords = {list,prio:high}, + file = {/Users/Rosa/Zotero/storage/HC67UT6D/Slade - 2006 - Made to break technology and obsolescence in America.pdf} +} + +@incollection{sterneOutTrash, + title = {Out with the Trash}, + booktitle = {Residual {{Media}}}, + author = {Sterne}, + isbn = {0-8166-4471-3}, + keywords = {list,prio:high,summarised}, + file = {/Users/Rosa/Zotero/storage/334DAPWQ/OutwiththeTrash.pdf} +} + +@article{sutherlandDesignAspirationsEnergy2021, + title = {Design {{Aspirations}} for {{Energy Autarkic Information Systems}} in a {{Future}} with {{Limits}}}, + author = {Sutherland, Brian}, + year = {2021}, + month = jun, + journal = {LIMITS Workshop on Computing within Limits}, + doi = {10.21428/bf6fb269.8b56b095}, + urldate = {2025-01-05}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/ZSGCB24X/Sutherland - 2021 - Design Aspirations for Energy Autarkic Information Systems in a Future with Limits.pdf} +} + +@misc{SynthSchematicsWords, + title = {Synth Schematics--::-- {{Some}} Words}, + urldate = {2025-01-23}, + howpublished = {https://www.schmitzbits.de/w.html}, + file = {/Users/Rosa/Zotero/storage/6RN53QAS/w.html} +} + +@misc{VagueTerrain192014, + title = {Vague {{Terrain}} 19: {{Schematic}} as {{Score}} {\textbar} {{Vague Terrain}}}, + shorttitle = {Vague {{Terrain}} 19}, + year = {2014}, + month = jul, + urldate = {2025-01-26}, + howpublished = {https://web.archive.org/web/20140723013316/http://vagueterrain.net/journal19}, + file = {/Users/Rosa/Zotero/storage/4BKQP8SX/journal19.html} +} + +@article{vanbovenHaveThatQuestion2003, + title = {To {{Do}} or to {{Have}}? {{That Is}} the {{Question}}}, + shorttitle = {To {{Do}} or to {{Have}}? i}, + author = {Van Boven, Leaf and Gilovich, Thomas}, + year = {2003}, + month = dec, + journal = {Journal of personality and social psychology}, + volume = {85}, + pages = {1193--202}, + doi = {10.1037/0022-3514.85.6.1193}, + abstract = {Do experiences make people happier than material possessions? In two surveys, respondents from various demographic groups indicated that experiential purchases-those made with the primary intention of acquiring a life experience--made them happier than material purchases. In a follow-up laboratory experiment, participants experienced more positive feelings after pondering an experiential purchase than after pondering a material purchase. In another experiment, participants were more likely to anticipate that experiences would make them happier than material possessions after adopting a temporally distant, versus a temporally proximate, perspective. The discussion focuses on evidence that experiences make people happier because they are more open to positive reinterpretations, are a more meaningful part of one's identity, and contribute more to successful social relationships.}, + keywords = {niet gebruiken}, + file = {/Users/Rosa/Zotero/storage/GY7RMHVZ/Van Boven and Gilovich - 2003 - To Do or to Have That Is the Question.pdf} +} + +@misc{viznutPermacomputingUpdate2021, + title = {Permacomputing {{Update}} 2021 {\textbar}}, + author = {{viznut}}, + urldate = {2025-01-05}, + howpublished = {http://viznut.fi/texts-en/permacomputing\_update\_2021.html}, + file = {/Users/Rosa/Zotero/storage/AD776H64/permacomputing_update_2021.html} +} + +@book{vonfoersterMusicComputers1969, + title = {Music by Computers}, + editor = {Von Foerster, Heinz and Beauchamp, James W.}, + year = {1969}, + publisher = {J. Wiley}, + address = {New York}, + isbn = {978-0-471-91030-5}, + lccn = {ML55.V575 M9}, + keywords = {Computer music,niet gebruiken}, + file = {/Users/Rosa/Zotero/storage/YKUYA5BZ/Beauchamp - EDITORS HEINZ VON FOERSTER.pdf} +} + +@article{wallendorfMyFavoriteThings1988, + title = {"{{My Favorite Things}}": {{A Cross-Cultural Inquiry}} into {{Object Attachment}}, {{Possessiveness}}, and {{Social Linkage}}}, + shorttitle = {"{{My Favorite Things}}"}, + author = {Wallendorf, Melanie and Arnould, Eric J.}, + year = {1988}, + journal = {Journal of Consumer Research}, + volume = {14}, + number = {4}, + eprint = {2489159}, + eprinttype = {jstor}, + pages = {531--547}, + publisher = {Oxford University Press}, + issn = {0093-5301}, + urldate = {2025-01-14}, + abstract = {We explore the meaning and histories of favorite objects in two cultures using surveys and photographs. Favorite object attachment is differentiated from the possessiveness component of materialism and from attachment to other people. Meanings of favorite objects derive more from personal memories in the U.S. and from social status in Niger than from object characteristics. Since favorite objects serve as storehouses of personal meanings, gender, age, and culture reflect differences in object selected as well as reasons for selection. In the U.S., photographs show greater proximity to objects that are symbols of others or experiences than to objects enjoyed for their own attributes.}, + file = {/Users/Rosa/Zotero/storage/FHJBKZHZ/Wallendorf and Arnould - 1988 - My Favorite Things A Cross-Cultural Inquiry into Object Attachment, Possessiveness, and Social Li.pdf} +} + +@misc{What2017sPotential, + title = {What 2017's {{Potential Component Shortage Means}} for {{Design Engineers}} - {{News}}}, + urldate = {2025-01-28}, + abstract = {Veteran engineers and market forecasters alike have fears of an impending component shortage this year. What evidence is there to suggest such a claim and if true, how will engineers be affected?}, + howpublished = {https://www.allaboutcircuits.com/news/what-2017s-potential-component-shortage-means-for-design-engineers/}, + langid = {english}, + file = {/Users/Rosa/Zotero/storage/FKZVA9QW/what-2017s-potential-component-shortage-means-for-design-engineers.html} +} + +@misc{XXIIVVPermacomputing, + title = {{{XXIIVV}} --- Permacomputing}, + urldate = {2025-01-05}, + howpublished = {https://wiki.xxiivv.com/site/permacomputing.html?utm\_source=pocket\_shared}, + keywords = {list,summarised}, + file = {/Users/Rosa/Zotero/storage/QM25W9ZH/permacomputing.html} +} diff --git a/pagedjs/IBMPlex/IBMPlexMono-Text.woff b/pagedjs/IBMPlex/IBMPlexMono-Text.woff new file mode 100644 index 0000000000000000000000000000000000000000..22f4e424419febadcfbc2dfb5cb79d9d2b84e754 GIT binary patch literal 51256 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 literal 0 HcmV?d00001 diff --git a/pagedjs/IBMPlex/IBMPlexMono-Text.woff2 b/pagedjs/IBMPlex/IBMPlexMono-Text.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aedd1857a562c5fc5b5165391d392689817cff5b GIT binary patch literal 36320 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

L~y5(Wu^r* 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 literal 0 HcmV?d00001 diff --git a/pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff2 b/pagedjs/IBMPlex/IBMPlexMono-TextItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..47e594e9491b3f7a6352842a887b51bdd6b7c5e5 GIT binary patch literal 41504 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 + diff --git a/pagedjs/icon-printer.svg b/pagedjs/icon-printer.svg new file mode 100644 index 0000000..21026d8 --- /dev/null +++ b/pagedjs/icon-printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pagedjs/interface-header.css b/pagedjs/interface-header.css new file mode 100644 index 0000000..958cf33 --- /dev/null +++ b/pagedjs/interface-header.css @@ -0,0 +1,373 @@ +.reset-this { + animation: none; + animation-delay: 0; + animation-direction: normal; + animation-duration: 0; + animation-fill-mode: none; + animation-iteration-count: 1; + animation-name: none; + animation-play-state: running; + animation-timing-function: ease; + backface-visibility: visible; + background: 0; + background-attachment: scroll; + background-clip: border-box; + background-color: transparent; + background-image: none; + background-origin: padding-box; + background-position: 0 0; + background-position-x: 0; + background-position-y: 0; + background-repeat: repeat; + background-size: auto auto; + border: 0; + border-style: none; + border-width: medium; + border-color: inherit; + border-bottom: 0; + border-bottom-color: inherit; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-style: none; + border-bottom-width: medium; + border-collapse: separate; + border-image: none; + border-left: 0; + border-left-color: inherit; + border-left-style: none; + border-left-width: medium; + border-radius: 0; + border-right: 0; + border-right-color: inherit; + border-right-style: none; + border-right-width: medium; + border-spacing: 0; + border-top: 0; + border-top-color: inherit; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top-style: none; + border-top-width: medium; + bottom: auto; + box-shadow: none; + box-sizing: content-box; + caption-side: top; + clear: none; + clip: auto; + color: inherit; + columns: auto; + column-count: auto; + column-fill: balance; + column-gap: normal; + column-rule: medium none currentColor; + column-rule-color: currentColor; + column-rule-style: none; + column-rule-width: none; + column-span: 1; + column-width: auto; + content: normal; + counter-increment: none; + counter-reset: none; + cursor: auto; + direction: ltr; + display: inline; + empty-cells: show; + float: none; + font: normal; + font-family: inherit; + font-size: medium; + font-style: normal; + font-variant: normal; + font-weight: normal; + height: auto; + hyphens: none; + left: auto; + letter-spacing: normal; + line-height: normal; + list-style: none; + list-style-image: none; + list-style-position: outside; + list-style-type: disc; + margin: 0; + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + margin-top: 0; + max-height: none; + max-width: none; + min-height: 0; + min-width: 0; + opacity: 1; + orphans: 0; + outline: 0; + outline-color: invert; + outline-style: none; + outline-width: medium; + overflow: visible; + overflow-x: visible; + overflow-y: visible; + padding: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + page-break-after: auto; + page-break-before: auto; + page-break-inside: auto; + perspective: none; + perspective-origin: 50% 50%; + position: static; + /* May need to alter quotes for different locales (e.g fr) */ + quotes: "\201C""\201D""\2018""\2019"; + right: auto; + tab-size: 8; + table-layout: auto; + text-align: inherit; + text-align-last: auto; + text-decoration: none; + text-decoration-color: inherit; + text-decoration-line: none; + text-decoration-style: solid; + text-indent: 0; + text-shadow: none; + text-transform: none; + top: auto; + transform: none; + transform-style: flat; + transition: none; + transition-delay: 0s; + transition-duration: 0s; + transition-property: none; + transition-timing-function: ease; + unicode-bidi: normal; + vertical-align: baseline; + visibility: visible; + white-space: normal; + widows: 0; + width: auto; + word-spacing: normal; + z-index: auto; + /* basic modern patch */ + all: initial; + all: unset; +} + +/* basic modern patch */ + +#interface-header { + all: initial; +} +#interface-header * { + all: unset; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("IBMPlex/IBMPlexMono-Text.woff2") format("woff2"), + url("IBMPlex/IBMPlexMono-Text.woff") format("woff"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("IBMPlex/IBMPlexMono-TextItalic.woff2") format("woff2"), + url("IBMPlex/IBMPlexMono-TextItalic.woff") format("woff"); + font-weight: normal; + font-style: italic; +} + +.interface-bar-bottom #interface-header { + bottom: 0; + top: unset; +} +#interface-header { + width: 100vw; + height: var(--pagedjs-header-height); + box-sizing: border-box; + background-color: #cfcfcf; + --color-interface-header: #222; + --border-color: #999; + --backgroung-button: rgb(195, 195, 195); + color: var(--color-interface-header); + border-bottom: 1px solid var(--border-color); + position: fixed; + top: 0px; + left: 0px; + z-index: 999999999999999999; + font-size: 12px; + + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 20px; + + font-family: "IBM Plex Mono"; + + box-shadow: 22px 7px 13px 0px rgba(153, 153, 153, 0.57); +} + +#interface-header input[type="checkbox"] { + display: none; +} + +form { + margin-bottom: 0; +} + +/* GRID FORM --------------------------------------- */ + +#header-group-grid { + width: 700px; +} + +#interface-header .grid-form { + width: 100%; + display: flex; + align-items: center; + margin-bottom: 1ch; +} +#interface-header .grid-form h1 { + font-size: 14px; + + width: 14ch; + margin: 0; + margin-right: 3ch; +} + +#interface-header .grid-form-label { + display: inline-flex; + align-items: center; + justify-content: center; + width: 7ch; + padding: 3px 0; + border: 1px solid var(--color-interface-header); + border-radius: 2px; + cursor: pointer; + box-shadow: 1px 1px 0px 0px var(--color-interface-header); + margin-right: 5ch; +} + +#interface-header .grid-form-label:hover { + background-color: var(--backgroung-button); +} + +#interface-header .grid-form-header { + display: flex; + align-items: center; +} + +#interface-header .grid-form-values-group { + padding-top: 0.8ch; +} + +/* BASELINE GROUP --------------------------------------- */ + +#interface-header .grid-form input[type="number"] { + width: 50px; + background-color: transparent; + border: 1px solid var(--border-color); + border-radius: 2px; + cursor: pointer; + box-shadow: 1px 1px 0px 0px #9f9f9f; + outline: none; +} + +#size-baseline-form label { + margin-right: 1em; +} + +#label-position { + margin-left: 1.5em; +} + +/* BUTTONS GROUP */ + +#header-group-right { + display: flex; + align-items: center; +} + +#header-group-right > p { + margin-right: 5ch !important; + margin-top: 0 !important; + margin-left: 0 !important; + margin-bottom: 0 !important; + padding: 0 !important; + color: var(--color-interface-header) !important; + position: relative !important; + top: 0 !important; + left: 0 !important; + bottom: 0 !important; + right: 0 !important; + width: auto !important; + height: auto !important; + font-size: 12px !important; + line-height: 1em !important; +} + +#buttons { + display: flex; + justify-content: flex-end; + /* width: 300px; */ +} + +#button-print { + width: 60px; + opacity: 0.2; + background: none; + outline: none; +} + +#label-preview-toggle img { + width: 80%; + height: 80%; +} + +#label-preview-toggle, +#button-print { + --buttons-size: 36px; + display: flex; + align-items: center; + justify-content: center; + width: var(--buttons-size); + height: var(--buttons-size); + margin-right: 10px; + border: 1px solid var(--border-color); + border-radius: 2px; + cursor: pointer; + box-shadow: 1px 1px 0px 0px #9f9f9f; + padding: 0; + box-sizing: border-box; +} + +.interface-preview #label-preview-toggle { + border: 2px solid var(--color-interface-header); +} + +#button-print { + padding: 6px; +} + +#label-preview-toggle:hover, +#button-print:hover { + background-color: var(--backgroung-button); +} + +#button-print[data-ready="true"] { + opacity: 1; + cursor: pointer; +} + +@media print { + #interface-header { + display: none; + } +} + + +@media screen, pagedjs-ignore { + .pagedjs_pages{ + padding-bottom: 20vh; + } +} \ No newline at end of file diff --git a/pagedjs/interface.css b/pagedjs/interface.css new file mode 100644 index 0000000..5d5ea4d --- /dev/null +++ b/pagedjs/interface.css @@ -0,0 +1,203 @@ +/* CSS for Paged.js interface – v0.2 +Julie Blanc - 2020 +MIT License https://opensource.org/licenses/MIT +A simple stylesheet to see pages on screen (with baseline included) */ + + +/* Change the look */ +:root { + --color-background: whitesmoke; + --color-pageSheet: #cfcfcf; + --color-pageBox: violet; + --color-paper: white; + --color-marginBox: purple; + --pagedjs-crop-color: #000; + --pagedjs-crop-stroke: 1px; + + --pagedjs-baseline: 12px; + --pagedjs-baseline-position: 0px; + --pagedjs-baseline-color: cyan; + + --pagedjs-header-height: 80px; +} + +.pagedjs_marks-crop{ + z-index: 999999999999; +} + +/* To define how the book look on the screen: */ +@media screen, pagedjs-ignore { + body { + background-color: var(--color-background); + } + + .pagedjs_pages { + display: flex; + width: calc(var(--pagedjs-width) * 2); + flex: 0; + flex-wrap: wrap; + margin: 0 auto; + margin-top: var(--pagedjs-header-height); + } + + .pagedjs_page { + background-color: var(--color-paper); + box-shadow: 0 0 0 1px var(--color-pageSheet); + margin: 0; + flex-shrink: 0; + flex-grow: 0; + margin-top: 10mm; + } + + .pagedjs_first_page { + margin-left: calc(var(--pagedjs-width) - var(--pagedjs-bleed-left)); + } + + .pagedjs_page:last-of-type { + margin-bottom: 10mm; + } + + .pagedjs_pagebox{ + box-shadow: 0 0 0 1px var(--color-pageBox); + } + + .pagedjs_left_page{ + z-index: 20; + width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width))!important; + } + + .pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-crop { + border-color: transparent; + } + + .pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-middle{ + width: 0; + } + + .pagedjs_right_page{ + z-index: 10; + position: relative; + left: calc(var(--pagedjs-bleed-left)*-1); + } + + /* show the margin-box */ + + + + .pagedjs_margin-top-left-corner-holder, + .pagedjs_margin-top, + .pagedjs_margin-top-left, + .pagedjs_margin-top-center, + .pagedjs_margin-top-right, + .pagedjs_margin-top-right-corner-holder, + .pagedjs_margin-bottom-left-corner-holder, + .pagedjs_margin-bottom, + .pagedjs_margin-bottom-left, + .pagedjs_margin-bottom-center, + .pagedjs_margin-bottom-right, + .pagedjs_margin-bottom-right-corner-holder, + .pagedjs_margin-right, + .pagedjs_margin-right-top, + .pagedjs_margin-right-middle, + .pagedjs_margin-right-bottom, + .pagedjs_margin-left, + .pagedjs_margin-left-top, + .pagedjs_margin-left-middle, + .pagedjs_margin-left-bottom { + box-shadow: 0 0 0 1px inset var(--color-marginBox); + } + + /* uncomment this part for recto/verso book : ------------------------------------ */ + + /* + .pagedjs_pages { + flex-direction: column; + width: 100%; + } + + .pagedjs_first_page { + margin-left: 0; + } + + .pagedjs_page { + margin: 0 auto; + margin-top: 10mm; + } + + .pagedjs_left_page{ + width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width) + var(--pagedjs-bleed-left))!important; + } + + .pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-crop{ + border-color: var(--pagedjs-crop-color); + } + + .pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-middle{ + width: var(--pagedjs-cross-size)!important; + } + + .pagedjs_right_page{ + left: 0; + } + */ + + + /*--------------------------------------------------------------------------------------*/ + + + + /* PREVIEW MODE */ + + .interface-preview { + background-color: black; + --color-pageBox: #999; + } + + .interface-preview .pagedjs_page{ + box-shadow: none; + } + + .interface-preview .pagedjs_right_page .pagedjs_bleed, + .interface-preview .pagedjs_left_page .pagedjs_bleed-top, + .interface-preview .pagedjs_left_page .pagedjs_bleed-bottom, + .interface-preview .pagedjs_left_page .pagedjs_bleed-left{ + background-color: black; + z-index:999999; + } + + .interface-preview .pagedjs_marks-crop, + .interface-preview .pagedjs_marks-crop{ + opacity: 0; + } + + + /* BASLINE -------------------------------------------*/ + + + .pagedjs_pagebox { + + background: linear-gradient(transparent 0%, transparent calc(var(--pagedjs-baseline) - 1px), var(--pagedjs-baseline-color) calc(var(--pagedjs-baseline) - 1px), var(--pagedjs-baseline-color) var(--pagedjs-baseline)), transparent; + background-size: 100% var(--pagedjs-baseline); + background-repeat: repeat-y; + background-position-y: var(--pagedjs-baseline-position); + + } + + .no-baseline .pagedjs_pagebox, + .interface-preview .pagedjs_pagebox { + background: none; + } + + + .button-print{ display: none; } + + .interface-preview, + .no-marginboxes{ + --color-marginBox: transparent; + } + +} + + + + diff --git a/pagedjs/interface.html b/pagedjs/interface.html new file mode 100644 index 0000000..3107554 --- /dev/null +++ b/pagedjs/interface.html @@ -0,0 +1,42 @@ + +

+
+
+

Baseline grid

+ + +
+
+ + + + +
+
+
+
+

Margin boxes

+ + +
+
+
+
+

pages

+
+
+ + +
+ +
+
+ + diff --git a/pagedjs/interface.js b/pagedjs/interface.js new file mode 100644 index 0000000..f8bf048 --- /dev/null +++ b/pagedjs/interface.js @@ -0,0 +1,195 @@ +document.addEventListener('DOMContentLoaded', (event) => { + let p = includeHTML(); + p.then(() => { + interfaceEvents(); + }) + + + + + let flowBook = document.querySelector("#book-content"); + let book_content = flowBook.content; + let paged = new Paged.Previewer(); + paged.preview(book_content, ["style-print.css"], document.querySelector("#renderbook")).then((flow) => { + + }); + }); + + + + + + + function interfaceEvents(){ + + let body = document.getElementsByTagName("body")[0]; + + + // set a "unique" filename based on title element, in case several books are opened + var fileTitle = document.getElementsByTagName("title")[0].text; + + /* BASELINE ---------------------------------------------------------------------------------------------------- + ----------------------------------------------------------------------------------------------------------------*/ + + /* Set baseline onload */ + let baselineToggle = localStorage.getItem('baselineToggle' + fileTitle); + let baselineButton = document.querySelector('#label-baseline-toggle'); + let baselineSize = localStorage.getItem('baselineSize' + fileTitle); + let baselinePosition = localStorage.getItem('baselinePosition'); + let baselineSizeInput = document.querySelector('#size-baseline'); + let baselinePositionInput = document.querySelector('#position-baseline'); + + if(baselineToggle == "no-baseline"){ + body.classList.add('no-baseline'); + baselineButton.innerHTML = "see"; + }else if(baselineToggle == "baseline"){ + body.classList.remove('no-baseline'); + document.querySelector("#baseline-toggle").checked = "checked"; + baselineButton.innerHTML = "hide"; + }else{ + body.classList.add('no-baseline'); + localStorage.setItem('baselineToggle' + fileTitle, 'no-baseline'); + baselineButton.innerHTML = "see"; + } + + /* Get baseline size and position on load*/ + if(baselineSize){ + baselineSizeInput.value = baselineSize; + document.documentElement.style.setProperty('--pagedjs-baseline', baselineSize + 'px'); + }else{ + localStorage.setItem('baselineSize' + fileTitle, baselineSizeInput.value); + } + baselinePositionInput.addEventListener("input", (e) => { + }); + if(baselinePosition){ + baselinePositionInput.value = baselinePosition; + document.documentElement.style.setProperty('--pagedjs-baseline-position', baselinePosition + 'px'); + }else{ + localStorage.setItem('baselineSPosition', baselinePositionInput.value); + } + + + + + /* Toggle baseline */ + document.querySelector("#baseline-toggle").addEventListener("input", (e) => { + if(e.target.checked){ + /* see baseline */ + body.classList.remove('no-baseline'); + localStorage.setItem('baselineToggle' + fileTitle, 'baseline'); + baselineButton.innerHTML = "hide"; + }else{ + /* hide baseline */ + body.classList.add('no-baseline'); + localStorage.setItem('baselineToggle' + fileTitle, 'no-baseline'); + baselineButton.innerHTML = "see"; + } + }); + + + /* Change baseline size on input */ + document.querySelector("#size-baseline").addEventListener("input", (e) => { + document.documentElement.style.setProperty('--pagedjs-baseline', e.target.value + 'px'); + localStorage.setItem('baselineSize' + fileTitle, baselineSizeInput.value); + }); + + + /* Change baseline position on input */ + document.querySelector("#position-baseline").addEventListener("input", (e) => { + document.documentElement.style.setProperty('--pagedjs-baseline-position', e.target.value + 'px'); + localStorage.setItem('baselinePosition', baselinePositionInput.value); + }); + + + /* MARGIN BOXES ---------------------------------------------------------------------------------------------------- + ----------------------------------------------------------------------------------------------------------------*/ + let marginButton = document.querySelector('#label-marginbox-toggle'); + + body.classList.add('no-marginboxes'); + + document.querySelector("#marginbox-toggle").addEventListener("input", (e) => { + if(e.target.checked){ + /* see baseline */ + body.classList.remove('no-marginboxes'); + marginButton.innerHTML = "hide"; + }else{ + /* hide baseline */ + body.classList.add('no-marginboxes'); + marginButton.innerHTML = "see"; + } + }); + + + /* Preview ---------------------------------------------------------------------------------------------------- + ----------------------------------------------------------------------------------------------------------------*/ + + + document.querySelector("#preview-toggle").addEventListener("input", (e) => { + if(e.target.checked){ + /* preview mode */ + body.classList.add('interface-preview'); + }else{ + body.classList.remove('interface-preview'); + } + }); + +} + + + + +function includeHTML() { + var z, i, file, xhttp; + /* Loop through a collection of all HTML elements: */ + /*search for elements with a certain atrribute:*/ + let elmnt = document.getElementById("interface-header") + file = elmnt.getAttribute("w3-include-html"); + let a = new Promise((resolve, reject) => { + if (file) { + /* Make an HTTP request using the attribute value as the file name: */ + xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4) { + if (this.status == 200) {elmnt.innerHTML = this.responseText;} + if (this.status == 404) {elmnt.innerHTML = "Page not found.";} + /* Remove the attribute, and call this function once more: */ + elmnt.removeAttribute("w3-include-html"); + resolve(); + } + } + xhttp.open("GET", file, true); + xhttp.send(); + /* Exit the function: */ + return; + } + }); + return a; +} + + + + + + + + + +class interfacePaged extends Paged.Handler { + constructor(chunker, polisher, caller) { + super(chunker, polisher, caller); + } + + afterPageLayout(pageElement, page, breakToken){ + let nbr = page.id.replace('page-', ''); + let span = document.querySelector("#nrb-pages"); + span.innerHTML = nbr; + } + + + afterRendered(pages){ + let print = document.querySelector("#button-print"); + print.dataset.ready = 'true'; + } +} +Paged.registerHandlers(interfacePaged); + diff --git a/pagedjs/paged.js b/pagedjs/paged.js new file mode 100644 index 0000000..a04c7ce --- /dev/null +++ b/pagedjs/paged.js @@ -0,0 +1,33203 @@ +/** + * @license Paged.js v0.4.3 | MIT | https://gitlab.coko.foundation/pagedjs/pagedjs + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Paged = {})); +})(this, (function (exports) { 'use strict'; + + 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; + } + } + + function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + + var eventEmitter = {exports: {}}; + + var d$2 = {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; + var hasRequiredIsImplemented$1; + + function requireIsImplemented$1 () { + if (hasRequiredIsImplemented$1) return isImplemented$5; + hasRequiredIsImplemented$1 = 1; + + isImplemented$5 = function () { + try { + Object.keys("primitive"); + return true; + } catch (e) { + return false; + } + }; + return isImplemented$5; + } + + // eslint-disable-next-line no-empty-function + var noop$4 = function () {}; + + var _undefined = noop$4(); // Support ES3 engines + + var isValue$3 = function (val) { + return (val !== _undefined) && (val !== null); + }; + + var shim$5; + var hasRequiredShim$5; + + function requireShim$5 () { + if (hasRequiredShim$5) return shim$5; + hasRequiredShim$5 = 1; + + var isValue = isValue$3; + + var keys = Object.keys; + + shim$5 = function (object) { + return keys(isValue(object) ? Object(object) : object); + }; + return shim$5; + } + + var keys; + var hasRequiredKeys; + + function requireKeys () { + if (hasRequiredKeys) return keys; + hasRequiredKeys = 1; + + keys = requireIsImplemented$1()() + ? Object.keys + : requireShim$5(); + return keys; + } + + var isValue$2 = isValue$3; + + var validValue = function (value) { + if (!isValue$2(value)) throw new TypeError("Cannot use null or undefined"); + return value; + }; + + var shim$4; + var hasRequiredShim$4; + + function requireShim$4 () { + if (hasRequiredShim$4) return shim$4; + hasRequiredShim$4 = 1; + + var keys = requireKeys() + , value = validValue + , max = Math.max; + + shim$4 = function (dest, src /*, …srcn*/) { + var error, i, length = max(arguments.length, 2), assign; + dest = Object(value(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; + }; + return shim$4; + } + + var assign$2 = isImplemented$6() + ? Object.assign + : requireShim$4(); + + var isValue$1 = isValue$3; + + var forEach$1 = Array.prototype.forEach, create$5 = 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$5(null); + forEach$1.call(arguments, function (options) { + if (!isValue$1(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 shim$3; + var hasRequiredShim$3; + + function requireShim$3 () { + if (hasRequiredShim$3) return shim$3; + hasRequiredShim$3 = 1; + + var indexOf = String.prototype.indexOf; + + shim$3 = function (searchString/*, position*/) { + return indexOf.call(this, searchString, arguments[1]) > -1; + }; + return shim$3; + } + + var contains$1 = isImplemented$4() + ? String.prototype.contains + : requireShim$3(); + + var assign$1 = assign$2 + , normalizeOpts = normalizeOptions + , isCallable = isCallable$1 + , contains = contains$1 + + , d$1; + + d$1 = d$2.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$1.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 dExports = d$2.exports; + + var validCallable = function (fn) { + if (typeof fn !== "function") throw new TypeError(fn + " is not a function"); + return fn; + }; + + (function (module, exports) { + + var d = dExports + , 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 eventEmitterExports = eventEmitter.exports; + var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventEmitterExports); + + /** + * 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 = []; + } + } + + 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.onPageLayout = new Hook(); + 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.hooks.beforeRenderResult = 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); + + this.hooks && this.hooks.onPageLayout.trigger(wrapper, prevBreakToken, this); + + 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); + this.hooks && this.hooks.beforeRenderResult.trigger(undefined, wrapper, this); + return new RenderResult(undefined, new OverflowContentError("Unable to layout item", [prevNode])); + } + + this.rebuildTableFromBreakToken(newBreakToken, wrapper); + + this.hooks && this.hooks.beforeRenderResult.trigger(newBreakToken, wrapper, this); + 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 { + this.hooks && this.hooks.beforeRenderResult.trigger(undefined, wrapper, this); + return new RenderResult(undefined, new OverflowContentError("Unable to layout item", [node])); + } + } + } + + } + + this.hooks && this.hooks.beforeRenderResult.trigger(newBreakToken, wrapper, this); + 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 = ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
`; + + /** + * 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.onPageLayout = 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.beforeRenderResult = new Hook(this); + 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$4 = {}; + + // + // 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 , , ,