@restless-dreams/orbit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +5 -2
  2. package/dist/bin/orbit.js +2972 -213
  3. package/dist/bin/orbit.js.map +25 -13
  4. package/dist/{chunk-mtrnm0yc.js → chunk-fkdfgtx9.js} +3156 -2854
  5. package/dist/chunk-fkdfgtx9.js.map +75 -0
  6. package/dist/{chunk-7n00wx0t.js → chunk-y748hzcr.js} +2 -2
  7. package/dist/{chunk-0gwh723s.js → chunk-zze4tc9n.js} +2 -2
  8. package/dist/core/branch-colors.d.ts +57 -0
  9. package/dist/core/document-source.d.ts +1 -1
  10. package/dist/core/editing.d.ts +8 -5
  11. package/dist/core/engine/scene.d.ts +5 -4
  12. package/dist/core/engine/views.d.ts +10 -2
  13. package/dist/core/index.d.ts +10 -0
  14. package/dist/core/input-controller.d.ts +7 -0
  15. package/dist/core/languages.d.ts +2 -0
  16. package/dist/core/node-attributes.d.ts +1 -1
  17. package/dist/core/other-apps/freemind.d.ts +8 -0
  18. package/dist/core/other-apps/icons.d.ts +16 -0
  19. package/dist/core/other-apps/ideas.d.ts +76 -0
  20. package/dist/core/other-apps/import.d.ts +28 -0
  21. package/dist/core/other-apps/inflate.d.ts +22 -0
  22. package/dist/core/other-apps/markup.d.ts +51 -0
  23. package/dist/core/other-apps/notes.d.ts +80 -0
  24. package/dist/core/other-apps/opml.d.ts +26 -0
  25. package/dist/core/other-apps/reading.d.ts +36 -0
  26. package/dist/core/other-apps/xmind.d.ts +14 -0
  27. package/dist/core/other-apps/zip.d.ts +37 -0
  28. package/dist/core/print-layout.d.ts +70 -0
  29. package/dist/core/renderer/content-painter.d.ts +30 -0
  30. package/dist/core/renderer/dom.d.ts +15 -0
  31. package/dist/core/renderer/families.d.ts +35 -0
  32. package/dist/core/renderer/label-painter.d.ts +93 -0
  33. package/dist/core/renderer/node-painter.d.ts +113 -0
  34. package/dist/core/renderer/numbers.d.ts +2 -0
  35. package/dist/core/renderer/options.d.ts +12 -0
  36. package/dist/core/renderer/rings-and-links.d.ts +23 -0
  37. package/dist/core/renderer/scene-helpers.d.ts +33 -0
  38. package/dist/core/renderer/trees.d.ts +22 -0
  39. package/dist/core/svg-renderer.d.ts +6 -109
  40. package/dist/core/types.d.ts +9 -1
  41. package/dist/core/web-page/page.d.ts +2 -1
  42. package/dist/core/web-page/runtime.d.ts +1 -1
  43. package/dist/index.js +2935 -26
  44. package/dist/index.js.map +18 -6
  45. package/dist/marked/index.js +2 -2
  46. package/dist/react/index.js +2 -2
  47. package/dist/web-page.js +79 -79
  48. package/llms-full.txt +205 -5
  49. package/llms.txt +2 -1
  50. package/package.json +1 -1
  51. package/skills/orbit/SKILL.md +1 -1
  52. package/skills/orbit/references/editing.md +2 -1
  53. package/skills/orbit/references/format.md +28 -0
  54. package/skills/orbit/references/guide.md +25 -1
  55. package/skills/orbit/references/import-export.md +115 -0
  56. package/skills/orbit/references/languages.md +1 -0
  57. package/skills/orbit/references/recipes.md +9 -0
  58. package/skills/orbit/references/theming.md +15 -0
  59. package/dist/chunk-mtrnm0yc.js.map +0 -63
  60. /package/dist/{chunk-7n00wx0t.js.map → chunk-y748hzcr.js.map} +0 -0
  61. /package/dist/{chunk-0gwh723s.js.map → chunk-zze4tc9n.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1,17 +1,29 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/core/serializer-yaml.ts", "../src/core/create.ts", "../src/core/web-page/page.ts", "../src/core/map-tools/input.ts", "../src/core/map-tools/definitions.ts", "../src/core/map-tools/reading.ts", "../src/core/map-tools/tools.ts", "../src/core/material.ts"],
3
+ "sources": ["../src/core/serializer-yaml.ts", "../src/core/create.ts", "../src/core/print-layout.ts", "../src/core/web-page/page.ts", "../src/core/map-tools/input.ts", "../src/core/map-tools/definitions.ts", "../src/core/map-tools/reading.ts", "../src/core/map-tools/tools.ts", "../src/core/other-apps/icons.ts", "../src/core/other-apps/markup.ts", "../src/core/other-apps/notes.ts", "../src/core/other-apps/ideas.ts", "../src/core/other-apps/reading.ts", "../src/core/other-apps/freemind.ts", "../src/core/other-apps/opml.ts", "../src/core/other-apps/inflate.ts", "../src/core/other-apps/zip.ts", "../src/core/other-apps/xmind.ts", "../src/core/other-apps/import.ts", "../src/core/material.ts"],
4
4
  "sourcesContent": [
5
- "import type { OrbitDocument, OrbitNode } from './types.js';\nimport { assignKey, emitYaml, type YamlValue } from './yaml-mini.js';\nimport { nodesWithExplicitIds } from './utils.js';\nimport { mediaExtras } from './node-attributes.js';\n\nexport const serializeOrbitYAML = (doc: OrbitDocument): string => {\n const out: Record<string, YamlValue> = {};\n const opts = doc.options;\n\n if (opts.title) {\n out.title = opts.title;\n }\n\n if (opts.theme) {\n out.theme = opts.theme;\n }\n\n if (opts.viewMode) {\n out.view = opts.viewMode;\n }\n\n if (opts.showRings !== undefined) {\n out.showRings = opts.showRings;\n }\n\n if (opts.interactive !== undefined) {\n out.interactive = opts.interactive;\n }\n\n if (opts.orbitAnimation !== undefined) {\n out.animation = opts.orbitAnimation;\n }\n\n if (opts.orbitSpeed !== undefined) {\n out.speed = opts.orbitSpeed;\n }\n\n if (opts.palette) {\n out.palette = opts.palette as YamlValue;\n }\n\n if (opts.height !== undefined) {\n out.height = opts.height;\n }\n\n if (opts.maxDepth !== undefined) {\n out.maxDepth = opts.maxDepth;\n }\n\n if (opts.className) {\n out.className = opts.className;\n }\n\n if (opts.baseUrl) {\n out.baseUrl = opts.baseUrl;\n }\n\n if (opts.schemaVersion !== undefined) {\n out.schemaVersion = opts.schemaVersion;\n }\n\n // Keys Orbit doesn't read, after its own: as they were written.\n for (const [key, value] of Object.entries(doc.extra ?? {})) {\n if (!Object.prototype.hasOwnProperty.call(out, key) && key !== 'nodes') {\n assignKey(out, key, value as YamlValue);\n }\n }\n\n out.nodes = [serializeNode(doc.root, nodesWithExplicitIds(doc.root))];\n return emitYaml(out);\n};\n\nconst serializeNode = (n: OrbitNode, explicitIds: ReadonlySet<OrbitNode>): YamlValue => {\n const obj: Record<string, YamlValue> = { text: n.text };\n\n if (explicitIds.has(n)) {\n obj.id = n.id;\n }\n\n if (n.icon) {\n obj.icon = n.icon;\n }\n\n if (n.color) {\n obj.color = n.color;\n }\n\n if (n.type) {\n obj.type = n.typeVersion === undefined ? n.type : `${n.type}@${n.typeVersion}`;\n }\n\n if (n.link) {\n obj.link = n.link;\n }\n\n if (n.tags) {\n obj.tags = n.tags;\n }\n\n if (n.status) {\n obj.status = n.status;\n }\n\n if (n.priority !== undefined) {\n obj.priority = n.priority;\n }\n\n if (n.collapsed !== undefined) {\n obj.collapsed = n.collapsed;\n }\n\n // A picture, video or embed keeps the fields Orbit doesn't read.\n if (n.image) {\n obj.image = { ...mediaExtras(n.image), ...n.image } as unknown as YamlValue;\n }\n\n if (n.video) {\n obj.video = { ...mediaExtras(n.video), ...n.video } as unknown as YamlValue;\n }\n\n if (n.embed) {\n obj.embed = { ...mediaExtras(n.embed), ...n.embed } as unknown as YamlValue;\n }\n\n if (n.note) {\n obj.note = n.note;\n\n if (n.noteFormat && n.noteFormat !== 'markdown') {\n obj.noteFormat = n.noteFormat;\n }\n }\n\n if (n.attrs) {\n for (const [k, v] of Object.entries(n.attrs)) {\n // A value Orbit couldn't read for one of its own attributes is written back, unless one was set since:\n // it reads back the same way. Keys a node map reads as structure (its\n // text, its children) are never written from attrs: they would reparse\n // as real structure.\n if (!RESERVED_NODE_KEYS.has(k) && !Object.prototype.hasOwnProperty.call(obj, k)) {\n assignKey(obj, k, v as YamlValue);\n }\n }\n }\n\n if (n.children.length) {\n obj.children = n.children.map((child) => serializeNode(child, explicitIds));\n }\n\n return obj;\n};\n\n/** Keys `buildNode` reads as the node's structure: a value under them would become a title or children. */\nconst RESERVED_NODE_KEYS = new Set(['text', 'children']);\n",
5
+ "import type { OrbitDocument, OrbitNode } from './types.js';\nimport { assignKey, emitYaml, type YamlValue } from './yaml-mini.js';\nimport { nodesWithExplicitIds } from './utils.js';\nimport { mediaExtras } from './node-attributes.js';\n\nexport const serializeOrbitYAML = (doc: OrbitDocument): string => {\n const out: Record<string, YamlValue> = {};\n const opts = doc.options;\n\n if (opts.title) {\n out.title = opts.title;\n }\n\n if (opts.theme) {\n out.theme = opts.theme;\n }\n\n if (opts.viewMode) {\n out.view = opts.viewMode;\n }\n\n if (opts.showRings !== undefined) {\n out.showRings = opts.showRings;\n }\n\n if (opts.interactive !== undefined) {\n out.interactive = opts.interactive;\n }\n\n if (opts.orbitAnimation !== undefined) {\n out.animation = opts.orbitAnimation;\n }\n\n if (opts.orbitSpeed !== undefined) {\n out.speed = opts.orbitSpeed;\n }\n\n if (opts.palette) {\n out.palette = opts.palette as YamlValue;\n }\n\n if (opts.height !== undefined) {\n out.height = opts.height;\n }\n\n if (opts.maxDepth !== undefined) {\n out.maxDepth = opts.maxDepth;\n }\n\n if (opts.className) {\n out.className = opts.className;\n }\n\n if (opts.baseUrl) {\n out.baseUrl = opts.baseUrl;\n }\n\n if (opts.schemaVersion !== undefined) {\n out.schemaVersion = opts.schemaVersion;\n }\n\n // Keys Orbit doesn't read, after its own: as they were written.\n for (const [key, value] of Object.entries(doc.extra ?? {})) {\n if (!Object.prototype.hasOwnProperty.call(out, key) && key !== 'nodes') {\n assignKey(out, key, value as YamlValue);\n }\n }\n\n out.nodes = [serializeNode(doc.root, nodesWithExplicitIds(doc.root))];\n return emitYaml(out);\n};\n\nconst serializeNode = (n: OrbitNode, explicitIds: ReadonlySet<OrbitNode>): YamlValue => {\n const obj: Record<string, YamlValue> = { text: n.text };\n\n if (explicitIds.has(n)) {\n obj.id = n.id;\n }\n\n if (n.icon) {\n obj.icon = n.icon;\n }\n\n if (n.color) {\n obj.color = n.color;\n }\n\n if (n.paletteColor !== undefined) {\n obj.paletteColor = n.paletteColor;\n }\n\n if (n.type) {\n obj.type = n.typeVersion === undefined ? n.type : `${n.type}@${n.typeVersion}`;\n }\n\n if (n.link) {\n obj.link = n.link;\n }\n\n if (n.tags) {\n obj.tags = n.tags;\n }\n\n if (n.status) {\n obj.status = n.status;\n }\n\n if (n.priority !== undefined) {\n obj.priority = n.priority;\n }\n\n if (n.collapsed !== undefined) {\n obj.collapsed = n.collapsed;\n }\n\n // A picture, video or embed keeps the fields Orbit doesn't read.\n if (n.image) {\n obj.image = { ...mediaExtras(n.image), ...n.image } as unknown as YamlValue;\n }\n\n if (n.video) {\n obj.video = { ...mediaExtras(n.video), ...n.video } as unknown as YamlValue;\n }\n\n if (n.embed) {\n obj.embed = { ...mediaExtras(n.embed), ...n.embed } as unknown as YamlValue;\n }\n\n if (n.note) {\n obj.note = n.note;\n\n if (n.noteFormat && n.noteFormat !== 'markdown') {\n obj.noteFormat = n.noteFormat;\n }\n }\n\n if (n.attrs) {\n for (const [k, v] of Object.entries(n.attrs)) {\n // A value Orbit couldn't read for one of its own attributes is written back, unless one was set since:\n // it reads back the same way. Keys a node map reads as structure (its\n // text, its children) are never written from attrs: they would reparse\n // as real structure.\n if (!RESERVED_NODE_KEYS.has(k) && !Object.prototype.hasOwnProperty.call(obj, k)) {\n assignKey(obj, k, v as YamlValue);\n }\n }\n }\n\n if (n.children.length) {\n obj.children = n.children.map((child) => serializeNode(child, explicitIds));\n }\n\n return obj;\n};\n\n/** Keys `buildNode` reads as the node's structure: a value under them would become a title or children. */\nconst RESERVED_NODE_KEYS = new Set(['text', 'children']);\n",
6
6
  "import { OrbitSVGRenderer } from './svg-renderer.js';\nimport { parseOrbit } from './dispatch.js';\nimport { reportParseDiagnostics } from './diagnostics.js';\nimport { wordsFor } from './languages.js';\nimport type { OrbitDocument, OrbitNode, RendererOptions } from './types.js';\n\nexport interface CreateOrbitMapOptions extends RendererOptions {\n /** Throw on the first problem in the source instead of working around it. */\n strict?: boolean;\n}\n\n/**\n * Draws a map into `target` in one call: markdown or YAML source, a parsed\n * document or a node tree. Returns the renderer, to listen for events\n * (`renderer.on('focus-change', …)`), draw new versions (`renderer.render(source)`)\n * and clean up (`renderer.destroy()`).\n *\n * The map fills `target`, so give it a height.\n *\n * @example\n * ```ts\n * import { createOrbitMap } from '@restless-dreams/orbit';\n *\n * const map = createOrbitMap(document.querySelector('#map')!, '# Launch\\n## Research\\n## Build', { theme: 'auto' });\n * map.on('focus-change', ({ node }) => console.log(node.text));\n * ```\n */\nexport const createOrbitMap = (\n target: HTMLElement,\n source: string | OrbitDocument | OrbitNode,\n options: CreateOrbitMapOptions = {},\n): OrbitSVGRenderer => {\n const { strict, ...rendererOptions } = options;\n const renderer = new OrbitSVGRenderer(target, rendererOptions);\n\n if (typeof source === 'string') {\n const doc = parseOrbit(source, { strict, untitled: wordsFor(rendererOptions.language, target, rendererOptions.strings).text('untitledMap') });\n reportParseDiagnostics(doc);\n renderer.render(doc);\n } else {\n renderer.render(source);\n }\n\n return renderer;\n};\n",
7
- "/**\n * A map as a web page: one HTML file with Orbit, the map and its pictures\n * inside, which opens in any browser, offline. Readers explore it with\n * Orbit's own controls, or present it: one idea at a time, in reading order,\n * with its note as a caption (see runtime.ts, the page's script).\n */\n\nimport { parseOrbit } from '../dispatch.js';\nimport { serializeOrbitMarkdown } from '../serializer-markdown.js';\nimport { OrbitWords, type OrbitStrings } from '../languages.js';\nimport { expandTheme, isOrbitThemePreset, themeTokens, type OrbitThemeTokens } from '../themes.js';\nimport type { OrbitDocument, OrbitRendererTheme, ViewMode } from '../types.js';\n\nexport interface OrbitWebPageOptions {\n /**\n * Orbit's web page script, the file `@restless-dreams/orbit/web-page.js`,\n * as text. It goes inside the page, so the page needs nothing else.\n */\n script: string;\n\n /** The page's title. Default: the map's `title`, or its root's text. */\n title?: string;\n\n /** The map's theme, instead of its frontmatter's: a theme name or `{ preset, tokens }`. */\n theme?: string | OrbitRendererTheme;\n\n /** How the map opens: `focus` (default) or `all`, the overview. */\n viewMode?: ViewMode;\n\n /** The node in focus when the map opens, by id. Default: the root. */\n focus?: string;\n\n /** The language of the page and the map's words: a tag like `es`. Default: English. */\n language?: string;\n\n /** Single words to change: `{ present: 'Show' }`. */\n strings?: Partial<OrbitStrings>;\n\n /**\n * Pictures to put inside the page, by the address the map gives them:\n * `{ 'photos/summit.jpg': 'data:image/jpeg;base64,…' }`. A node's picture,\n * a video's thumbnail and pictures in notes are swapped for them, so they\n * show wherever the page goes.\n */\n media?: Record<string, string>;\n}\n\n/** Orbit's logo, the page's icon. */\nconst ORBIT_ICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='18 18 72 72'%3E%3Cdefs%3E%3CradialGradient id='d' gradientUnits='userSpaceOnUse' cx='32.4' cy='23.76' r='102.6'%3E%3Cstop offset='0' stop-color='%234A35A8'/%3E%3Cstop offset='1' stop-color='%2318134A'/%3E%3C/radialGradient%3E%3C/defs%3E%3Crect x='18' y='18' width='72' height='72' rx='16' fill='url(%23d)'/%3E%3Cpath d='M67.53,35.36 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M69.84,37.38 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M71.86,39.69 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M76.52,57.07 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M75.92,60.08 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M74.93,62.99 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M62.21,75.71 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M59.3,76.7 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M56.29,77.3 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M38.91,72.64 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M36.6,70.62 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M34.58,68.31 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M29.92,50.93 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M30.52,47.92 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M31.51,45.01 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M44.23,32.29 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M47.14,31.3 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M50.15,30.7 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z' fill='%23E2E6FF' fill-opacity='.5'/%3E%3Ccircle cx='54' cy='54' r='11' fill='%23FAD86F'/%3E%3Ccircle cx='60.08' cy='31.3' r='6.4' fill='%23FF9E96'/%3E%3Ccircle cx='76.7' cy='47.92' r='6.4' fill='%23F8B478'/%3E%3Ccircle cx='70.62' cy='70.62' r='6.4' fill='%237FDAAB'/%3E%3Ccircle cx='47.92' cy='76.7' r='6.4' fill='%2386CDFF'/%3E%3Ccircle cx='31.3' cy='60.08' r='6.4' fill='%23C9B1FE'/%3E%3Ccircle cx='37.38' cy='37.38' r='6.4' fill='%23F7A3D4'/%3E%3C/svg%3E\";\n\n/** What a web page carries for its script, as JSON in `#orbit-page`. */\nexport interface WebPageData {\n /** The map, in markdown or YAML. */\n source: string;\n\n theme?: string | OrbitRendererTheme;\n viewMode?: ViewMode;\n focus?: string;\n language?: string;\n strings?: Partial<OrbitStrings>;\n media: Record<string, string>;\n}\n\n/**\n * The map as one HTML page, with Orbit inside (`options.script`): open it in\n * any browser, offline, to explore the map or present it.\n *\n * ```ts\n * import { readFileSync } from 'node:fs';\n * import { exportWebPage } from '@restless-dreams/orbit';\n *\n * const script = readFileSync(new URL(import.meta.resolve('@restless-dreams/orbit/web-page.js')), 'utf8');\n * const html = exportWebPage(markdown, { script, theme: 'night' });\n * ```\n */\nexport const exportWebPage = (input: string | OrbitDocument, options: OrbitWebPageOptions): string => {\n const document = typeof input === 'string' ? parseOrbit(input) : input;\n const source = typeof input === 'string' ? input : serializeOrbitMarkdown(input);\n const words = new OrbitWords(options.language, options.strings);\n const title = options.title ?? (document.options.title || document.root.text || 'Orbit');\n const data: WebPageData = {\n source,\n theme: options.theme,\n viewMode: options.viewMode,\n focus: options.focus,\n language: options.language,\n strings: options.strings,\n media: options.media ?? {},\n };\n const theme = options.theme ?? document.options.theme;\n return `<!doctype html>\n<html lang=\"${escapeAttribute(words.locale)}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<meta name=\"generator\" content=\"Orbit\">\n<link rel=\"icon\" href=\"${ORBIT_ICON}\">\n<title>${escapeText(title)}</title>\n<style>\n${pageStyles(theme)}\n</style>\n</head>\n<body>\n<div class=\"page\" id=\"page\">\n <div class=\"page__map\" id=\"page-map\" aria-label=\"${escapeAttribute(title)}\"></div>\n <button class=\"page__present\" type=\"button\" data-present><span aria-hidden=\"true\">▶</span> ${escapeText(words.text('present'))}</button>\n <section class=\"page__caption\" id=\"page-caption\" aria-live=\"polite\" hidden>\n <h1 class=\"page__title\" id=\"page-title\"></h1>\n <div class=\"page__note\" id=\"page-note\"></div>\n </section>\n <nav class=\"page__controls\" id=\"page-controls\" hidden>\n <button class=\"page__button\" type=\"button\" data-step=\"-1\" aria-label=\"${escapeAttribute(words.text('previous'))}\">‹</button>\n <span class=\"page__count\" id=\"page-count\"></span>\n <button class=\"page__button\" type=\"button\" data-step=\"1\" aria-label=\"${escapeAttribute(words.text('next'))}\">›</button>\n <button class=\"page__button\" type=\"button\" data-close aria-label=\"${escapeAttribute(words.text('close'))}\">✕</button>\n </nav>\n</div>\n<script type=\"application/json\" id=\"orbit-page\">${scriptJson(data)}</script>\n<script type=\"application/json\" id=\"orbit-script\">${scriptJson(options.script)}</script>\n<script>\n // Orbit runs from a script element made here: text inside one is never read as HTML.\n (function () {\n var script = document.createElement('script');\n script.textContent = JSON.parse(document.getElementById('orbit-script').textContent);\n document.body.appendChild(script);\n })();\n</script>\n</body>\n</html>\n`;\n};\n\n/** The colors the page takes from the theme: its background, and the caption's, from the detail sheet's. */\nconst pageColors = (tokens: OrbitThemeTokens): string => {\n const surface = tokens.surface === 'transparent' ? '#ffffff' : tokens.surface;\n return [\n `--page-background: ${surface};`,\n `--page-card: ${tokens['sheet-background']};`,\n `--page-text: ${tokens['sheet-text']};`,\n `--page-muted: ${tokens['sheet-muted-text']};`,\n `--page-border: ${tokens['sheet-border']};`,\n `--page-shadow: ${tokens['sheet-shadow']};`,\n ].join(' ');\n};\n\n/** The tokens a theme option stands for: a built-in theme's, with the option's own on top. */\nconst tokensOf = (theme: string | OrbitRendererTheme | undefined): OrbitThemeTokens => {\n const expanded = expandTheme(theme);\n const preset = typeof expanded === 'string' ? expanded : expanded?.preset;\n const base = themeTokens(isOrbitThemePreset(preset) ? preset : 'paper');\n return typeof expanded === 'object' && expanded?.tokens ? { ...base, ...expanded.tokens } as OrbitThemeTokens : base;\n};\n\nconst pageStyles = (theme: string | OrbitRendererTheme | undefined): string => {\n const automatic = (typeof theme === 'string' ? theme : theme?.preset) === 'auto';\n const colors = automatic\n ? `:root { ${pageColors(themeTokens('paper'))} }\\n@media (prefers-color-scheme: dark) { :root { ${pageColors(themeTokens('night'))} } }`\n : `:root { ${pageColors(tokensOf(theme))} }`;\n return `${colors}\nhtml, body { margin: 0; height: 100%; background: var(--page-background); }\nbody { font: 16px/1.5 system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: var(--page-text); }\n.page__map { position: fixed; inset: 0; }\n.page__present, .page__controls {\n position: fixed; left: 50%; bottom: max(16px, env(safe-area-inset-bottom)); transform: translateX(-50%);\n display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 18px; border: 1px solid var(--page-border);\n border-radius: 22px; background: var(--page-card); color: var(--page-text); box-shadow: var(--page-shadow); font: inherit; font-weight: 600;\n}\n.page__present { cursor: pointer; }\n.page__controls { padding: 0 6px; transition: opacity 200ms ease; }\n.page__button { min-width: 44px; min-height: 44px; border: 0; border-radius: 22px; background: none; color: inherit; font: inherit; font-size: 20px; cursor: pointer; }\n.page__button:focus-visible, .page__present:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }\n.page__count { min-width: 4em; text-align: center; color: var(--page-muted); font-variant-numeric: tabular-nums; }\n.page__caption {\n position: fixed; left: 50%; bottom: calc(max(16px, env(safe-area-inset-bottom)) + 60px); transform: translateX(-50%);\n box-sizing: border-box; width: min(720px, calc(100% - 32px)); max-height: 40vh; overflow: auto; padding: 16px 20px;\n border: 1px solid var(--page-border); border-radius: 16px; background: var(--page-card); color: var(--page-text); box-shadow: var(--page-shadow);\n}\n.page__title { margin: 0; font-size: 20px; line-height: 1.3; }\n.page__note:not(:empty) { margin-top: 8px; }\n.page__note p { margin: 0 0 8px; }\n.page__note img { max-width: 100%; border-radius: 8px; }\n.page__note a { color: inherit; }\n.page--presenting .page__present { display: none; }\n.page--presenting:not(.page--controls) .page__controls { opacity: 0; }\n.page--presenting:not(.page--controls) { cursor: none; }\n[hidden] { display: none !important; }`;\n};\n\n/** JSON inside a script element: `<` written as `\\\\u003c`, so nothing in it can end the element or open a comment. */\nconst scriptJson = (value: unknown): string => {\n return JSON.stringify(value).replace(/</g, '\\\\u003c').replace(/\\u2028/g, '\\\\u2028').replace(/\\u2029/g, '\\\\u2029');\n};\n\nconst escapeText = (text: string): string => {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n};\n\nconst escapeAttribute = (text: string): string => {\n return escapeText(text).replace(/\"/g, '&quot;');\n};\n",
7
+ "/**\n * A map laid out for paper: its title, the map as a picture that fits the\n * page, then every idea in reading order with its details, link, note and\n * media. Orbit's web pages print with it, and so can any page that shows a\n * map: lay it out in an element that only shows in print.\n */\n\nimport { parseOrbit } from './dispatch.js';\nimport { documentToRendererOptions } from './document-options.js';\nimport { MapExtensions, guarded, type OrbitNodeType, type OrbitStatusStyle } from './extensions.js';\nimport { OrbitWords, type OrbitStrings } from './languages.js';\nimport { hasMediaSource, videoPageUrl, youtubeThumbnailUrl } from './media.js';\nimport { findIndexedLinkedNode, indexNodes, isNodeLink } from './node-links.js';\nimport { renderToSVGString } from './render-to-svg.js';\nimport { ensureStyles } from './styles.js';\nimport { expandTheme, mergeThemes, resolvePalette, resolveThemeTokens, themeName, type OrbitThemeName } from './themes.js';\nimport { guardUrl, resolveUrl } from './url-guard.js';\nimport { resolveColor } from './engine/colors.js';\nimport { assignNodeColors } from './engine/scene.js';\nimport { renderNoteMarkdown } from './ui/note-markdown.js';\nimport type { OrbitDocument, OrbitNode, OrbitRendererTheme, OrbitThemePreset, ViewMode } from './types.js';\n\nexport interface OrbitPrintOptions {\n /** The heading at the top. Default: the map's `title`, or its root's text. */\n title?: string;\n\n /** Whether the map's picture comes before the outline. Default: true. */\n picture?: boolean;\n\n /** What the picture shows: `focus`, a node with its orbit, or `all`, the whole map. Default: the map's `view`, or `focus`. */\n viewMode?: ViewMode;\n\n /** The node in the middle of the picture in focus mode, by id. Default: the root. */\n focus?: string;\n\n /**\n * The map's theme: a theme name or `{ preset, tokens }`. Default: the\n * document's. Paper is light, so a dark theme prints as its light\n * counterpart (see `printTheme`), and nothing prints a background.\n */\n theme?: OrbitThemePreset | (string & {}) | OrbitRendererTheme;\n\n /** The map's colors: the root's, then one per top-level branch. Default: the document's, or the theme's. */\n palette?: string[];\n\n /** The language of the few words the layout has: a BCP 47 tag. Default: English. */\n language?: string;\n\n /** Words to change, over the language's. */\n strings?: Partial<OrbitStrings>;\n\n /** Resolves relative picture, video and link URLs. Default: the document's `baseUrl`. */\n baseUrl?: string;\n\n /** Node types by name, before the registered ones: their icons, colors, labels and details. */\n nodeTypes?: Record<string, OrbitNodeType>;\n\n /** Status words and how they look, before the registered ones. */\n statuses?: Record<string, OrbitStatusStyle>;\n\n /** The type a node that names none is laid out as (see `RendererOptions.nodeTypeFor`). */\n nodeTypeFor?: (node: OrbitNode) => string | undefined;\n\n /** Prefix for the picture's SVG ids; give each layout in one page its own. Default: `orbit-print`. */\n idPrefix?: string;\n}\n\n/** The light theme each dark built-in theme prints as. Light themes print as themselves. */\nexport const PRINT_THEMES: Readonly<Partial<Record<OrbitThemePreset, OrbitThemeName>>> = {\n auto: 'paper',\n night: 'paper',\n 'glass-night': 'glass',\n cosmos: 'paper',\n blueprint: 'ink',\n 'flat-night': 'flat',\n 'material-night': 'material',\n 'liquid-night': 'liquid',\n};\n\n/** The tokens a dark theme of your own keeps when it prints as its light counterpart: its colors, not what it set for a dark page. */\nconst PALETTE_TOKENS = ['color-root', 'color-1', 'color-2', 'color-3', 'color-4', 'color-5', 'color-6', 'color-7'];\n\n/** The picture's size before it's scaled to the page: a square, the shape of an orbit, about a tablet's width, so names print at the size they read on one. */\nconst PICTURE_SIZE = 720;\n\n/**\n * The theme a map prints in: the map's own when it's light, otherwise its\n * light counterpart (`PRINT_THEMES`), always without a background. A dark\n * theme of your own keeps only its colors (`color-root` to `color-7`).\n */\nexport const printTheme = (theme: string | OrbitRendererTheme | undefined): OrbitRendererTheme => {\n const expanded = expandTheme(theme);\n const preset = themeName(expanded);\n const light = PRINT_THEMES[preset] ?? (preset === 'auto' ? 'paper' : preset);\n const own = typeof expanded === 'object' ? expanded.tokens ?? {} : {};\n const kept = light === preset ? own : Object.fromEntries(Object.entries(own).filter(([token]) => PALETTE_TOKENS.includes(token)));\n return { preset: light, tokens: { ...kept, surface: 'transparent', 'surface-pattern': 'none' } };\n};\n\n/**\n * Lays a map out for print in `container`, replacing what it held, and\n * returns the layout: the title, the map as a picture that fits the page,\n * then every idea in reading order, nested by depth, with its icon, status,\n * priority, tags, link (its address printed), note, picture and video. An\n * idea stays whole across page breaks, and a heading stays with what\n * follows it.\n *\n * It's laid out on screen like any element: hide it there and show it in\n * print, as Orbit's web pages do.\n *\n * @example\n * ```ts\n * import { renderPrintLayout } from '@restless-dreams/orbit';\n *\n * renderPrintLayout(document.querySelector('#print'), markdown, { viewMode: 'all' });\n * // #print { display: none } @media print { #print { display: block } #app { display: none } }\n * ```\n */\nexport const renderPrintLayout = (container: HTMLElement, input: string | OrbitDocument, options: OrbitPrintOptions = {}): HTMLElement => {\n const words = new OrbitWords(options.language, options.strings);\n const map = typeof input === 'string' ? parseOrbit(input, { untitled: words.text('untitledMap') }) : input;\n const fromDocument = documentToRendererOptions(map.options);\n const theme = printTheme(mergeThemes(fromDocument.theme, options.theme));\n const tokens: Record<string, string> = resolveThemeTokens(themeName(theme), theme);\n const extensions = new MapExtensions({ nodeTypes: options.nodeTypes, statuses: options.statuses, nodeTypeFor: options.nodeTypeFor });\n const palette = options.palette ?? fromDocument.palette;\n const colors = assignNodeColors(map.root, resolvePalette(palette), (node) => extensions.color(node));\n const nodes = indexNodes(map.root);\n const layout: PrintContext = {\n words,\n tokens,\n extensions,\n colors,\n baseUrl: options.baseUrl ?? fromDocument.baseUrl,\n linked: (href) => findIndexedLinkedNode(nodes, href),\n };\n const title = options.title ?? (map.options.title || map.root.text || words.text('untitledMap'));\n const article = element('article', 'orbit-print');\n article.lang = words.locale;\n article.style.cssText = themeProperties(tokens);\n const heading = element('h1', 'orbit-print__title');\n appendName(heading, map.root, title, layout);\n article.append(heading, ...entryParts(map.root, layout));\n\n if (options.picture !== false) {\n const figure = element('figure', 'orbit-print__picture');\n const svg = renderToSVGString(map, {\n width: PICTURE_SIZE,\n height: PICTURE_SIZE,\n viewMode: options.viewMode,\n focus: options.focus,\n theme,\n palette,\n title,\n language: options.language,\n strings: options.strings,\n baseUrl: layout.baseUrl,\n idPrefix: options.idPrefix ?? 'orbit-print',\n nodeTypes: options.nodeTypes,\n statuses: options.statuses,\n nodeTypeFor: options.nodeTypeFor,\n });\n // Orbit's own SVG, read as SVG: every text and address in it is escaped.\n figure.appendChild(document.importNode(new DOMParser().parseFromString(svg, 'image/svg+xml').documentElement, true));\n article.appendChild(figure);\n }\n\n if (map.root.children.length > 0) {\n const outline = element('div', 'orbit-print__outline');\n outline.append(...map.root.children.map((child) => idea(child, 1, layout)));\n article.appendChild(outline);\n }\n\n container.replaceChildren(article);\n ensureStyles(article);\n return article;\n};\n\ninterface PrintContext {\n words: OrbitWords;\n tokens: Record<string, string>;\n extensions: MapExtensions;\n colors: Map<string, string>;\n baseUrl: string | undefined;\n linked: (href: string) => OrbitNode | null;\n}\n\n/** An idea and the ideas under it: a heading by depth, its details, then its children, indented. */\nconst idea = (node: OrbitNode, depth: number, layout: PrintContext): HTMLElement => {\n const section = element('section', 'orbit-print__idea');\n section.dataset.depth = String(depth);\n const entry = element('div', node.children.length > 0 ? 'orbit-print__entry orbit-print__entry--parent' : 'orbit-print__entry');\n // Top-level ideas and theirs get sizes of their own; deeper ones share the third.\n const level = `h${Math.min(depth + 1, 6)}` as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n const name = element(level, `orbit-print__name orbit-print__name--depth-${Math.min(depth, 3)}`);\n const dot = element('span', 'orbit-print__dot');\n dot.setAttribute('aria-hidden', 'true');\n dot.style.setProperty('--orbit-print-dot', resolveColor(layout.colors.get(node.id) ?? layout.tokens['color-1'] ?? '#888888', layout.tokens));\n name.appendChild(dot);\n appendName(name, node, node.text || layout.words.text('untitled'), layout);\n entry.append(name, ...entryParts(node, layout));\n section.appendChild(entry);\n\n if (node.children.length > 0) {\n const children = element('div', 'orbit-print__children');\n children.append(...node.children.map((child) => idea(child, depth + 1, layout)));\n section.appendChild(children);\n }\n\n return section;\n};\n\n/** A node's icon and name, in a heading. */\nconst appendName = (heading: HTMLElement, node: OrbitNode, text: string, layout: PrintContext): void => {\n const icon = layout.extensions.icon(node);\n\n if (icon) {\n const glyph = element('span', 'orbit-print__icon');\n glyph.textContent = icon;\n heading.append(glyph, document.createTextNode(' '));\n }\n\n heading.appendChild(document.createTextNode(text));\n};\n\n/** What an idea has besides its name: its chips, link, the type's details, note and media. */\nconst entryParts = (node: OrbitNode, layout: PrintContext): HTMLElement[] => {\n const parts: HTMLElement[] = [];\n const chips = chipsOf(node, layout);\n\n if (chips) {\n parts.push(chips);\n }\n\n const link = linkOf(node, layout);\n\n if (link) {\n parts.push(link);\n }\n\n const details = layout.extensions.nodeType(node)?.details;\n\n if (details) {\n const section = element('div', 'orbit-print__details');\n guarded('A node type’s details', undefined, () => details(node, section));\n\n if (section.childNodes.length > 0) {\n parts.push(section);\n }\n }\n\n if (node.note?.trim()) {\n const note = element('div', 'orbit-print__note');\n\n if (node.noteFormat === 'plain') {\n note.classList.add('orbit-print__note--plain');\n note.textContent = node.note;\n } else {\n note.appendChild(renderNoteMarkdown(node.note, { baseUrl: layout.baseUrl, resolveLink: layout.linked }));\n }\n\n parts.push(note);\n }\n\n parts.push(...mediaOf(node, layout));\n return parts;\n};\n\n/** The type, status, priority and tags, as the detail sheet shows them. */\nconst chipsOf = (node: OrbitNode, layout: PrintContext): HTMLElement | null => {\n const chips: HTMLElement[] = [];\n const typeLabel = layout.extensions.nodeType(node)?.label;\n\n if (typeLabel) {\n chips.push(chip(typeLabel));\n }\n\n if (node.status) {\n const status = chip(node.status, 'orbit-print__chip--status');\n const look = layout.extensions.status(node.status);\n status.style.setProperty('--orbit-print-status', resolveColor(look.color ?? `var(--_orbit-status-${look.tone})`, layout.tokens));\n chips.push(status);\n }\n\n if (node.priority !== undefined) {\n chips.push(chip(layout.words.text('priority', { priority: node.priority })));\n }\n\n for (const tag of node.tags ?? []) {\n chips.push(chip(`#${tag}`));\n }\n\n if (chips.length === 0) {\n return null;\n }\n\n const container = element('p', 'orbit-print__chips');\n container.append(...chips);\n return container;\n};\n\nconst chip = (text: string, modifier?: string): HTMLElement => {\n const span = element('span', modifier ? `orbit-print__chip ${modifier}` : 'orbit-print__chip');\n span.textContent = text;\n return span;\n};\n\n/** A link printed with its address, since paper can't be clicked; a link to another idea names it. */\nconst linkOf = (node: OrbitNode, layout: PrintContext): HTMLElement | null => {\n if (!node.link) {\n return null;\n }\n\n const paragraph = element('p', 'orbit-print__link');\n\n if (isNodeLink(node.link)) {\n const target = layout.linked(node.link);\n\n if (!target) {\n return null;\n }\n\n paragraph.textContent = `→ ${layout.words.text('seeIdea', { name: target.text || layout.words.text('theIdea') })}`;\n return paragraph;\n }\n\n const address = guardUrl(node.link, 'link');\n\n if (!address) {\n return null;\n }\n\n paragraph.appendChild(addressLink(resolveUrl(address, layout.baseUrl)));\n return paragraph;\n};\n\n/** An address as a link, written out: PDFs keep it clickable, and paper shows where it goes. */\nconst addressLink = (href: string): HTMLAnchorElement => {\n const anchor = element('a', 'orbit-print__address');\n anchor.href = href;\n anchor.textContent = href;\n return anchor;\n};\n\n/** The node's picture, its video as a thumbnail and its address, and an embed's address. */\nconst mediaOf = (node: OrbitNode, layout: PrintContext): HTMLElement[] => {\n const figures: HTMLElement[] = [];\n\n if (hasMediaSource(node.image)) {\n const source = guardUrl(node.image.src, 'image');\n\n if (source) {\n const figure = element('figure', 'orbit-print__media');\n const image = element('img', 'orbit-print__image');\n image.src = resolveUrl(source, layout.baseUrl);\n image.alt = node.image.alt ?? '';\n figure.appendChild(image);\n appendCaption(figure, node.image.caption ?? node.image.alt);\n figures.push(figure);\n }\n }\n\n if (hasMediaSource(node.video)) {\n const source = guardUrl(node.video.src, 'video');\n\n if (source) {\n const resolved = resolveUrl(source, layout.baseUrl);\n const figure = element('figure', 'orbit-print__media orbit-print__media--video');\n const thumbnail = node.video.thumbnail ? guardUrl(node.video.thumbnail, 'image') : youtubeThumbnailUrl(resolved);\n\n if (thumbnail) {\n const image = element('img', 'orbit-print__image');\n image.src = resolveUrl(thumbnail, layout.baseUrl);\n image.alt = '';\n figure.appendChild(image);\n }\n\n const caption = element('figcaption', 'orbit-print__caption');\n caption.append(document.createTextNode(`${node.video.caption ?? layout.words.text('video')}: `), addressLink(videoPageUrl(resolved, node.video.provider)));\n figure.appendChild(caption);\n figures.push(figure);\n }\n }\n\n if (hasMediaSource(node.embed) && !hasMediaSource(node.video)) {\n const source = guardUrl(node.embed.src, 'embed');\n\n if (source) {\n const figure = element('figure', 'orbit-print__media orbit-print__media--embed');\n const caption = element('figcaption', 'orbit-print__caption');\n\n if (node.embed.caption) {\n caption.append(document.createTextNode(`${node.embed.caption}: `));\n }\n\n caption.appendChild(addressLink(resolveUrl(source, layout.baseUrl)));\n figure.appendChild(caption);\n figures.push(figure);\n }\n }\n\n return figures;\n};\n\nconst appendCaption = (figure: HTMLElement, text: string | undefined): void => {\n if (text?.trim()) {\n const caption = element('figcaption', 'orbit-print__caption');\n caption.textContent = text;\n figure.appendChild(caption);\n }\n};\n\n/** The theme's text, fonts and chip colors for the layout, resolved to plain values. Page CSS can set the public ones. */\nconst themeProperties = (tokens: Record<string, string>): string => {\n const value = (token: string, fallback: string) => resolveColor(tokens[token] ?? fallback, tokens);\n const font = (token: string, fallback: string) => resolveFont(tokens[token] ?? fallback, tokens);\n return [\n `--_orbit-print-text: ${value('text', '#1F2733')};`,\n `--_orbit-print-muted-text: ${value('muted-text', '#5B6474')};`,\n `--_orbit-print-link-text: ${value('link-text', value('text', '#1F2733'))};`,\n `--_orbit-print-chip-background: ${value('chip-background', '#EEF0F4')};`,\n `--_orbit-print-chip-text: ${value('chip-text', value('text', '#1F2733'))};`,\n `--_orbit-print-border: ${value('sheet-border', '#D9DDE3')};`,\n `--_orbit-print-font: ${font('font-family', 'sans-serif')};`,\n `--_orbit-print-display-font: ${font('display-font', font('font-family', 'sans-serif'))};`,\n ].join(' ');\n};\n\n/** A font token with the tokens it refers to written out: `var(--_orbit-sans-font)` becomes the fonts it names. */\nconst resolveFont = (value: string, tokens: Record<string, string>): string => {\n let font = value;\n\n // Fonts refer to other font tokens a step or two deep.\n for (let depth = 0; depth < 4 && font.includes('var('); depth += 1) {\n font = font.replace(/var\\(--_?orbit-([a-z0-9-]+)(?:\\s*,\\s*([^()]+))?\\)/gi, (whole, token: string, fallback?: string) => tokens[token] ?? fallback?.trim() ?? whole);\n }\n\n // A value that still refers to something can't be written into a style: the browser's sans-serif instead.\n return font.includes('var(') || /[;{}]/.test(font) ? 'sans-serif' : font;\n};\n\nconst element = <Name extends keyof HTMLElementTagNameMap>(name: Name, className: string): HTMLElementTagNameMap[Name] => {\n const created = document.createElement(name);\n created.className = className;\n return created;\n};\n",
8
+ "/**\n * A map as a web page: one HTML file with Orbit, the map and its pictures\n * inside, which opens in any browser, offline. Readers explore it with\n * Orbit's own controls, or present it: one idea at a time, in reading order,\n * with its note as a caption (see runtime.ts, the page's script). Printed,\n * it's the map laid out for paper (print-layout.ts) instead.\n */\n\nimport { parseOrbit } from '../dispatch.js';\nimport { serializeOrbitMarkdown } from '../serializer-markdown.js';\nimport { OrbitWords, type OrbitStrings } from '../languages.js';\nimport { expandTheme, isOrbitThemePreset, themeTokens, type OrbitThemeTokens } from '../themes.js';\nimport type { OrbitDocument, OrbitRendererTheme, ViewMode } from '../types.js';\n\nexport interface OrbitWebPageOptions {\n /**\n * Orbit's web page script, the file `@restless-dreams/orbit/web-page.js`,\n * as text. It goes inside the page, so the page needs nothing else.\n */\n script: string;\n\n /** The page's title. Default: the map's `title`, or its root's text. */\n title?: string;\n\n /** The map's theme, instead of its frontmatter's: a theme name or `{ preset, tokens }`. */\n theme?: string | OrbitRendererTheme;\n\n /** How the map opens: `focus` (default) or `all`, the overview. */\n viewMode?: ViewMode;\n\n /** The node in focus when the map opens, by id. Default: the root. */\n focus?: string;\n\n /** The language of the page and the map's words: a tag like `es`. Default: English. */\n language?: string;\n\n /** Single words to change: `{ present: 'Show' }`. */\n strings?: Partial<OrbitStrings>;\n\n /**\n * Pictures to put inside the page, by the address the map gives them:\n * `{ 'photos/summit.jpg': 'data:image/jpeg;base64,…' }`. A node's picture,\n * a video's thumbnail and pictures in notes are swapped for them, so they\n * show wherever the page goes.\n */\n media?: Record<string, string>;\n}\n\n/** Orbit's logo, the page's icon. */\nconst ORBIT_ICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='18 18 72 72'%3E%3Cdefs%3E%3CradialGradient id='d' gradientUnits='userSpaceOnUse' cx='32.4' cy='23.76' r='102.6'%3E%3Cstop offset='0' stop-color='%234A35A8'/%3E%3Cstop offset='1' stop-color='%2318134A'/%3E%3C/radialGradient%3E%3C/defs%3E%3Crect x='18' y='18' width='72' height='72' rx='16' fill='url(%23d)'/%3E%3Cpath d='M67.53,35.36 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M69.84,37.38 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M71.86,39.69 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M76.52,57.07 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M75.92,60.08 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M74.93,62.99 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M62.21,75.71 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M59.3,76.7 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M56.29,77.3 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M38.91,72.64 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M36.6,70.62 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M34.58,68.31 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M29.92,50.93 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M30.52,47.92 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M31.51,45.01 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M44.23,32.29 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M47.14,31.3 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z M50.15,30.7 a0.78,0.78 0 1,0 1.56,0 a0.78,0.78 0 1,0 -1.56,0 Z' fill='%23E2E6FF' fill-opacity='.5'/%3E%3Ccircle cx='54' cy='54' r='11' fill='%23FAD86F'/%3E%3Ccircle cx='60.08' cy='31.3' r='6.4' fill='%23FF9E96'/%3E%3Ccircle cx='76.7' cy='47.92' r='6.4' fill='%23F8B478'/%3E%3Ccircle cx='70.62' cy='70.62' r='6.4' fill='%237FDAAB'/%3E%3Ccircle cx='47.92' cy='76.7' r='6.4' fill='%2386CDFF'/%3E%3Ccircle cx='31.3' cy='60.08' r='6.4' fill='%23C9B1FE'/%3E%3Ccircle cx='37.38' cy='37.38' r='6.4' fill='%23F7A3D4'/%3E%3C/svg%3E\";\n\n/** What a web page carries for its script, as JSON in `#orbit-page`. */\nexport interface WebPageData {\n /** The map, in markdown or YAML. */\n source: string;\n\n theme?: string | OrbitRendererTheme;\n viewMode?: ViewMode;\n focus?: string;\n language?: string;\n strings?: Partial<OrbitStrings>;\n media: Record<string, string>;\n}\n\n/**\n * The map as one HTML page, with Orbit inside (`options.script`): open it in\n * any browser, offline, to explore the map or present it.\n *\n * ```ts\n * import { readFileSync } from 'node:fs';\n * import { exportWebPage } from '@restless-dreams/orbit';\n *\n * const script = readFileSync(new URL(import.meta.resolve('@restless-dreams/orbit/web-page.js')), 'utf8');\n * const html = exportWebPage(markdown, { script, theme: 'night' });\n * ```\n */\nexport const exportWebPage = (input: string | OrbitDocument, options: OrbitWebPageOptions): string => {\n const document = typeof input === 'string' ? parseOrbit(input) : input;\n const source = typeof input === 'string' ? input : serializeOrbitMarkdown(input);\n const words = new OrbitWords(options.language, options.strings);\n const title = options.title ?? (document.options.title || document.root.text || 'Orbit');\n const data: WebPageData = {\n source,\n theme: options.theme,\n viewMode: options.viewMode,\n focus: options.focus,\n language: options.language,\n strings: options.strings,\n media: options.media ?? {},\n };\n const theme = options.theme ?? document.options.theme;\n return `<!doctype html>\n<html lang=\"${escapeAttribute(words.locale)}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<meta name=\"generator\" content=\"Orbit\">\n<link rel=\"icon\" href=\"${ORBIT_ICON}\">\n<title>${escapeText(title)}</title>\n<style>\n${pageStyles(theme)}\n</style>\n</head>\n<body>\n<div class=\"page\" id=\"page\">\n <div class=\"page__map\" id=\"page-map\" aria-label=\"${escapeAttribute(title)}\"></div>\n <button class=\"page__present\" type=\"button\" data-present><span aria-hidden=\"true\">▶</span> ${escapeText(words.text('present'))}</button>\n <section class=\"page__caption\" id=\"page-caption\" aria-live=\"polite\" hidden>\n <h1 class=\"page__title\" id=\"page-title\"></h1>\n <div class=\"page__note\" id=\"page-note\"></div>\n </section>\n <nav class=\"page__controls\" id=\"page-controls\" hidden>\n <button class=\"page__button\" type=\"button\" data-step=\"-1\" aria-label=\"${escapeAttribute(words.text('previous'))}\">‹</button>\n <span class=\"page__count\" id=\"page-count\"></span>\n <button class=\"page__button\" type=\"button\" data-step=\"1\" aria-label=\"${escapeAttribute(words.text('next'))}\">›</button>\n <button class=\"page__button\" type=\"button\" data-close aria-label=\"${escapeAttribute(words.text('close'))}\">✕</button>\n </nav>\n</div>\n<div class=\"page__print\" id=\"page-print\"></div>\n<script type=\"application/json\" id=\"orbit-page\">${scriptJson(data)}</script>\n<script type=\"application/json\" id=\"orbit-script\">${scriptJson(options.script)}</script>\n<script>\n // Orbit runs from a script element made here: text inside one is never read as HTML.\n (function () {\n var script = document.createElement('script');\n script.textContent = JSON.parse(document.getElementById('orbit-script').textContent);\n document.body.appendChild(script);\n })();\n</script>\n</body>\n</html>\n`;\n};\n\n/** The colors the page takes from the theme: its background, and the caption's, from the detail sheet's. */\nconst pageColors = (tokens: OrbitThemeTokens): string => {\n const surface = tokens.surface === 'transparent' ? '#ffffff' : tokens.surface;\n return [\n `--page-background: ${surface};`,\n `--page-card: ${tokens['sheet-background']};`,\n `--page-text: ${tokens['sheet-text']};`,\n `--page-muted: ${tokens['sheet-muted-text']};`,\n `--page-border: ${tokens['sheet-border']};`,\n `--page-shadow: ${tokens['sheet-shadow']};`,\n ].join(' ');\n};\n\n/** The tokens a theme option stands for: a built-in theme's, with the option's own on top. */\nconst tokensOf = (theme: string | OrbitRendererTheme | undefined): OrbitThemeTokens => {\n const expanded = expandTheme(theme);\n const preset = typeof expanded === 'string' ? expanded : expanded?.preset;\n const base = themeTokens(isOrbitThemePreset(preset) ? preset : 'paper');\n return typeof expanded === 'object' && expanded?.tokens ? { ...base, ...expanded.tokens } as OrbitThemeTokens : base;\n};\n\nconst pageStyles = (theme: string | OrbitRendererTheme | undefined): string => {\n const automatic = (typeof theme === 'string' ? theme : theme?.preset) === 'auto';\n const colors = automatic\n ? `:root { ${pageColors(themeTokens('paper'))} }\\n@media (prefers-color-scheme: dark) { :root { ${pageColors(themeTokens('night'))} } }`\n : `:root { ${pageColors(tokensOf(theme))} }`;\n return `${colors}\nhtml, body { margin: 0; height: 100%; background: var(--page-background); }\nbody { font: 16px/1.5 system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: var(--page-text); }\n.page__map { position: fixed; inset: 0; }\n.page__present, .page__controls {\n position: fixed; left: 50%; bottom: max(16px, env(safe-area-inset-bottom)); transform: translateX(-50%);\n display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 18px; border: 1px solid var(--page-border);\n border-radius: 22px; background: var(--page-card); color: var(--page-text); box-shadow: var(--page-shadow); font: inherit; font-weight: 600;\n}\n.page__present { cursor: pointer; }\n.page__controls { padding: 0 6px; transition: opacity 200ms ease; }\n.page__button { min-width: 44px; min-height: 44px; border: 0; border-radius: 22px; background: none; color: inherit; font: inherit; font-size: 20px; cursor: pointer; }\n.page__button:focus-visible, .page__present:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }\n.page__count { min-width: 4em; text-align: center; color: var(--page-muted); font-variant-numeric: tabular-nums; }\n.page__caption {\n position: fixed; left: 50%; bottom: calc(max(16px, env(safe-area-inset-bottom)) + 60px); transform: translateX(-50%);\n box-sizing: border-box; width: min(720px, calc(100% - 32px)); max-height: 40vh; overflow: auto; padding: 16px 20px;\n border: 1px solid var(--page-border); border-radius: 16px; background: var(--page-card); color: var(--page-text); box-shadow: var(--page-shadow);\n}\n.page__title { margin: 0; font-size: 20px; line-height: 1.3; }\n.page__note:not(:empty) { margin-top: 8px; }\n.page__note p { margin: 0 0 8px; }\n.page__note img { max-width: 100%; border-radius: 8px; }\n.page__note a { color: inherit; }\n.page--presenting .page__present { display: none; }\n.page--presenting:not(.page--controls) .page__controls { opacity: 0; }\n.page--presenting:not(.page--controls) { cursor: none; }\n[hidden] { display: none !important; }\n.page__print { display: none; }\n@media print {\n @page { margin: 16mm 14mm; }\n html, body { height: auto; background: #ffffff; }\n .page { display: none; }\n .page__print { display: block; }\n}`;\n};\n\n/** JSON inside a script element: `<` written as `\\\\u003c`, so nothing in it can end the element or open a comment. */\nconst scriptJson = (value: unknown): string => {\n return JSON.stringify(value).replace(/</g, '\\\\u003c').replace(/\\u2028/g, '\\\\u2028').replace(/\\u2029/g, '\\\\u2029');\n};\n\nconst escapeText = (text: string): string => {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n};\n\nconst escapeAttribute = (text: string): string => {\n return escapeText(text).replace(/\"/g, '&quot;');\n};\n",
8
9
  "/**\n * What each map tool takes, written once: as the JSON Schema a model reads,\n * and as the checks a call goes through before anything changes. The checks\n * forgive what models often send (a number as text, a list as words\n * separated by commas, null for a field they leave out, a field's usual\n * other name) and explain the rest in words a model can act on.\n */\n\nimport { suggest } from '../suggest.js';\n\nexport type FieldType = 'string' | 'integer' | 'number' | 'boolean' | 'list' | 'record';\n\nexport interface Field {\n type: FieldType;\n description: string;\n required?: boolean;\n\n /** The words a list takes. */\n values?: readonly string[];\n\n /** The smallest number it takes. */\n minimum?: number;\n\n /** A record's own fields. Text alone stands for the first one: a picture's address for `{ src }`. */\n fields?: Fields;\n}\n\nexport type Fields = Record<string, Field>;\n\n/** A property of a tool's input, as JSON Schema. */\nexport type MapToolProperty = {\n type: 'string' | 'integer' | 'number' | 'boolean' | 'array' | 'object';\n description: string;\n minimum?: number;\n items?: { type: 'string'; enum?: string[] };\n properties?: Record<string, MapToolProperty>;\n required?: string[];\n};\n\n/** A tool's input, as JSON Schema: an object with the tool's fields. */\nexport type MapToolSchema = {\n type: 'object';\n properties: Record<string, MapToolProperty>;\n required?: string[];\n};\n\n/** The JSON Schema for an object with `fields`. */\nexport const schemaOf = (fields: Fields): MapToolSchema => {\n const required = Object.keys(fields).filter((name) => fields[name].required);\n return {\n type: 'object',\n properties: Object.fromEntries(Object.entries(fields).map(([name, field]) => [name, propertyOf(field)])),\n ...(required.length > 0 ? { required } : {}),\n };\n};\n\nconst propertyOf = (field: Field): MapToolProperty => {\n if (field.type === 'list') {\n return { type: 'array', description: field.description, items: field.values ? { type: 'string', enum: [...field.values] } : { type: 'string' } };\n }\n\n if (field.type === 'record') {\n return { ...schemaOf(field.fields ?? {}), description: field.description };\n }\n\n return { type: field.type, description: field.description, ...(field.minimum === undefined ? {} : { minimum: field.minimum }) };\n};\n\n/** A call's input, read: its values, and the fields it gave that the tool doesn't take, which were left out. */\nexport interface ReadInput {\n values: Record<string, unknown>;\n ignored: string[];\n}\n\n/** Thrown with a message for the model when a call's input can't be used. */\nexport class InputError extends Error {}\n\n/**\n * Reads a call's input for `tool`: an object, or the JSON text of one, as\n * OpenAI sends it. Null stands for a field left out. A field under another\n * name it often goes by (`synonyms`) counts as that field; one that looks\n * like a misspelled field is an error, so nothing changes by mistake; any\n * other is left out, and reported.\n */\nexport const readInput = (tool: string, fields: Fields, input: unknown, synonyms: Readonly<Record<string, string>> = {}): ReadInput => {\n const record = inputRecord(tool, fields, input);\n const values: Record<string, unknown> = {};\n const ignored: string[] = [];\n const names = Object.keys(fields);\n\n for (const [given, value] of Object.entries(record)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n const name = owns(fields, given) ? given : synonymOf(given, names, synonyms);\n\n if (name === undefined) {\n const near = suggest(given, names);\n\n if (near !== undefined) {\n throw new InputError(`${tool} has no field \"${given}\". Did you mean \"${near}\"? It takes ${list(names)}.`);\n }\n\n ignored.push(given);\n continue;\n }\n\n if (owns(values, name)) {\n throw new InputError(`${tool} got ${name} twice, as \"${name}\" and as \"${given}\": give it once.`);\n }\n\n values[name] = readValue(name, fields[name], value);\n }\n\n for (const name of names) {\n if (fields[name].required && !owns(values, name)) {\n throw new InputError(`${tool} needs ${name}: ${lowerFirst(fields[name].description)}`);\n }\n }\n\n return { values, ignored };\n};\n\nconst inputRecord = (tool: string, fields: Fields, input: unknown): Record<string, unknown> => {\n let value = input;\n\n if (typeof value === 'string') {\n if (value.trim() === '') {\n return {};\n }\n\n try {\n value = JSON.parse(value);\n } catch (error) {\n throw new InputError(`${tool}'s input isn't valid JSON (${(error as Error).message}). Send an object, like ${example(fields)}.`);\n }\n }\n\n if (value === null || value === undefined) {\n return {};\n }\n\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new InputError(`${tool} takes an object, like ${example(fields)}, not ${describe(value)}.`);\n }\n\n return value as Record<string, unknown>;\n};\n\n/** The field `given` names in another case, or under another name it often goes by. */\nconst synonymOf = (given: string, names: readonly string[], synonyms: Readonly<Record<string, string>>): string | undefined => {\n const lowered = given.toLowerCase();\n return names.find((name) => name.toLowerCase() === lowered) ?? (owns(synonyms, lowered) ? synonyms[lowered] : undefined);\n};\n\n/** Whether `record` has `key` of its own, not one every object inherits, such as `constructor`. */\nexport const owns = (record: object, key: string): boolean => {\n return Object.prototype.hasOwnProperty.call(record, key);\n};\n\nconst readValue = (name: string, field: Field, value: unknown): unknown => {\n switch (field.type) {\n case 'string':\n if (typeof value === 'string') {\n return value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n throw new InputError(`${name} takes text, not ${describe(value)}.`);\n case 'integer':\n case 'number': {\n const number = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : Number.NaN;\n\n if (!Number.isFinite(number) || (field.type === 'integer' && !Number.isInteger(number))) {\n throw new InputError(`${name} takes ${field.type === 'integer' ? 'a whole number' : 'a number'}, like ${field.minimum ?? 1}, not ${describe(value)}.`);\n }\n\n if (field.minimum !== undefined && number < field.minimum) {\n throw new InputError(`${name} takes ${field.minimum} or more, not ${number}. ${field.description}`);\n }\n\n return number;\n }\n case 'boolean': {\n const word = typeof value === 'string' ? value.trim().toLowerCase() : value;\n\n if (word === true || word === 'true' || word === 'yes') {\n return true;\n }\n\n if (word === false || word === 'false' || word === 'no') {\n return false;\n }\n\n throw new InputError(`${name} takes true or false, not ${describe(value)}.`);\n }\n case 'list': {\n const items = Array.isArray(value) ? value : typeof value === 'string' ? (value.trim() === '' ? [] : value.split(',')) : null;\n\n if (!items || items.some((item) => typeof item !== 'string' && typeof item !== 'number')) {\n throw new InputError(`${name} takes a list of words, like [\"${field.values?.[0] ?? 'design'}\"], not ${describe(value)}.`);\n }\n\n const words = items.map((item) => String(item).trim()).filter((item) => item !== '');\n\n for (const word of words) {\n if (field.values && !field.values.includes(word)) {\n const near = suggest(word, field.values);\n throw new InputError(`${name} can't take \"${word}\".${near === undefined ? '' : ` Did you mean \"${near}\"?`} It takes ${list(field.values)}.`);\n }\n }\n\n return words;\n }\n case 'record': {\n const fields = field.fields ?? {};\n const first = Object.keys(fields)[0];\n\n if (typeof value === 'string') {\n return { [first]: value };\n }\n\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new InputError(`${name} takes an object, like {\"${first}\": \"…\"}, not ${describe(value)}.`);\n }\n\n return readInput(name, fields, value).values;\n }\n }\n};\n\n/** A value, as an error message names it. */\nexport const describe = (value: unknown): string => {\n if (value === null) {\n return 'null';\n }\n\n if (Array.isArray(value)) {\n return 'a list';\n }\n\n if (typeof value === 'string') {\n return JSON.stringify(value.length > 40 ? `${value.slice(0, 40)}…` : value);\n }\n\n if (typeof value === 'object') {\n return 'an object';\n }\n\n return String(value);\n};\n\n/** \"a, b and c\" */\nexport const list = (words: readonly string[]): string => {\n return words.length <= 1 ? words.join('') : `${words.slice(0, -1).join(', ')} and ${words[words.length - 1]}`;\n};\n\nconst example = (fields: Fields): string => {\n const name = Object.keys(fields).find((key) => fields[key].required) ?? Object.keys(fields)[0];\n return name === undefined ? '{}' : `{\"${name}\": \"…\"}`;\n};\n\nconst lowerFirst = (text: string): string => {\n return text.charAt(0).toLowerCase() + text.slice(1);\n};\n",
9
10
  "/**\n * The map tools as a model sees them: names, descriptions and inputs, and\n * the shapes each provider's API takes them in.\n */\n\nimport { schemaOf, type Fields, type MapToolSchema } from './input.js';\n\nexport type MapToolName =\n | 'read_map'\n | 'find_nodes'\n | 'read_node'\n | 'add_nodes'\n | 'update_node'\n | 'move_node'\n | 'reorder_children'\n | 'remove_node'\n | 'show_node';\n\n/** A tool as `MapTools.definitions` lists it: the shape MCP uses, and the data to build any other. */\nexport type MapToolDefinition = {\n name: MapToolName;\n description: string;\n\n /** The tool's input, as JSON Schema. */\n inputSchema: MapToolSchema;\n\n /** Hints for clients that ask before running some tools: whether it only reads, and whether it can remove or overwrite what's there. */\n annotations: { readOnlyHint: boolean; destructiveHint: boolean };\n};\n\n/** The tools in the shape each provider's API takes them. */\nexport type MapToolFormats = {\n /** Anthropic's Messages API (`tools`). */\n anthropic: { name: string; description: string; input_schema: MapToolSchema }[];\n\n /** OpenAI's Responses API (`tools`). */\n openai: { type: 'function'; name: string; description: string; parameters: MapToolSchema; strict: false }[];\n\n /** OpenAI's Chat Completions API (`tools`), which most other providers and local servers take too. */\n 'openai-chat': { type: 'function'; function: { name: string; description: string; parameters: MapToolSchema } }[];\n\n /** Google's Gemini API (`config.tools` in `@google/genai`). */\n gemini: { functionDeclarations: { name: string; description: string; parametersJsonSchema: MapToolSchema }[] }[];\n};\n\nexport type MapToolProvider = keyof MapToolFormats;\n\nconst PROVIDERS: readonly MapToolProvider[] = ['anthropic', 'openai', 'openai-chat', 'gemini'];\n\n/** A tool, before it's written as a definition. */\nexport interface ToolSpec {\n name: MapToolName;\n description: string;\n fields: Fields;\n\n /** Other names models give its fields, lowercase. */\n synonyms?: Record<string, string>;\n\n readOnly: boolean;\n destructive: boolean;\n}\n\n/** The attributes `update_node` sets and `clear` removes. */\nexport const ATTRIBUTES = ['note', 'status', 'priority', 'tags', 'icon', 'color', 'link', 'image', 'video', 'embed', 'collapsed'] as const;\n\nexport type ToolAttribute = (typeof ATTRIBUTES)[number];\n\nconst NODE_ID = 'node_id';\nconst NODE_SYNONYMS = { id: NODE_ID, node: NODE_ID, nodeid: NODE_ID };\n\n/** Every tool, in the order they're offered. `show_node` is only for a map on screen. */\nexport const TOOL_SPECS: readonly ToolSpec[] = [\n {\n name: 'read_map',\n description: 'Read the mind map as an outline: a line for each node (an idea), indented under its parent, with its id after a #, its attributes in parentheses, and the start of its note on the next line after >. Read it before changing the map: the other tools take these ids. A big map is cut short: read a branch with node_id, or search with find_nodes.',\n fields: {\n node_id: { type: 'string', description: 'Read only this node and the nodes under it. Leave out to read the whole map.' },\n depth: { type: 'integer', minimum: 1, description: 'How many levels under it to read: 1 for its children only. Leave out to read them all.' },\n },\n synonyms: NODE_SYNONYMS,\n readOnly: true,\n destructive: false,\n },\n {\n name: 'find_nodes',\n description: 'Search the map for nodes by the words in their titles, notes and tags, by status or by tag. Returns each match with its id and where it is in the map.',\n fields: {\n query: { type: 'string', description: 'Words to look for, in any case, with or without accents. A node matches when it has every word.' },\n status: { type: 'string', description: 'Only nodes with this status. todo, active, done and blocked also find the words that mean the same, such as planned, in progress, shipped or stuck.' },\n tag: { type: 'string', description: 'Only nodes with this tag.' },\n },\n synonyms: { text: 'query', search: 'query', words: 'query', tags: 'tag' },\n readOnly: true,\n destructive: false,\n },\n {\n name: 'read_node',\n description: 'Read everything about one node: its title, its whole note, its attributes, its picture, video or embedded page, where it is in the map, its children, and the nodes that link to it.',\n fields: {\n node_id: { type: 'string', required: true, description: 'The node to read, by the id read_map or find_nodes gave.' },\n },\n synonyms: NODE_SYNONYMS,\n readOnly: true,\n destructive: false,\n },\n {\n name: 'add_nodes',\n description: 'Add nodes under a node: one, several, or whole branches at once, written as a markdown list. Each item is a node, items indented under it are its children, at any depth, and indented lines under an item that aren\\'t items are its note. On an item\\'s line, [ ], [/] or [x] first sets its status to todo, active or done, an emoji first sets its icon, words after a # at the end are its tags, and <!-- orbit color: tomato, priority: 1 --> at the end sets other attributes. Returns the new nodes with their ids.',\n fields: {\n parent_id: { type: 'string', required: true, description: 'The node to add them under.' },\n outline: { type: 'string', required: true, description: 'The nodes, as a markdown list: \"- Social media\\\\n - Instagram\\\\n- Newsletter\".' },\n index: { type: 'integer', minimum: 0, description: 'Where they go among the children of parent_id: 0 puts them first. Leave out to put them last.' },\n },\n synonyms: { parent: 'parent_id', parentid: 'parent_id', under: 'parent_id', markdown: 'outline', nodes: 'outline', items: 'outline', children: 'outline', text: 'outline', position: 'index' },\n readOnly: false,\n destructive: false,\n },\n {\n name: 'update_node',\n description: 'Change a node\\'s title or attributes. Only the fields you give change; to remove an attribute, name it in clear. A new title can give the node a new id, which the result says.',\n fields: {\n node_id: { type: 'string', required: true, description: 'The node to change.' },\n text: { type: 'string', description: 'Its title: plain text, a few words.' },\n note: { type: 'string', description: 'Its note, in markdown, for details and longer text. Replaces the note it has.' },\n status: { type: 'string', description: 'todo, active, done or blocked, which show a colored dot, or any other word.' },\n priority: { type: 'number', description: 'A number, such as 1 for the most important.' },\n tags: { type: 'list', description: 'All its tags, as words: they replace the ones it has.' },\n icon: { type: 'string', description: 'An emoji shown before its title.' },\n color: { type: 'string', description: 'A CSS color, such as #E8A33D or tomato: its children take shades of it. Nodes without one take the theme\\'s colors, so set it only when asked.' },\n link: { type: 'string', description: 'A web address it links to, or #id to link to another node of the map.' },\n image: {\n type: 'record',\n description: 'A picture shown in the node.',\n fields: {\n src: { type: 'string', required: true, description: 'The picture\\'s address.' },\n alt: { type: 'string', description: 'What the picture shows, for people who can\\'t see it.' },\n caption: { type: 'string', description: 'A caption.' },\n },\n },\n video: {\n type: 'record',\n description: 'A video the node plays.',\n fields: {\n src: { type: 'string', required: true, description: 'The video\\'s address: YouTube, Vimeo or a video file.' },\n caption: { type: 'string', description: 'A caption.' },\n },\n },\n embed: {\n type: 'record',\n description: 'A web page shown in a frame in the node\\'s details.',\n fields: {\n src: { type: 'string', required: true, description: 'The page\\'s address.' },\n caption: { type: 'string', description: 'A caption.' },\n },\n },\n collapsed: { type: 'boolean', description: 'true hides its children until the reader opens it.' },\n clear: { type: 'list', values: ATTRIBUTES, description: 'Attributes to remove, such as [\"status\", \"color\"].' },\n },\n synonyms: {\n ...NODE_SYNONYMS, title: 'text', name: 'text', label: 'text', notes: 'note', description: 'note', details: 'note', state: 'status',\n tag: 'tags', labels: 'tags', emoji: 'icon', colour: 'color', url: 'link', href: 'link', picture: 'image', photo: 'image',\n remove: 'clear', unset: 'clear', delete: 'clear',\n },\n readOnly: false,\n destructive: true,\n },\n {\n name: 'move_node',\n description: 'Move a node, with everything under it, under another node, or to another place among its siblings.',\n fields: {\n node_id: { type: 'string', required: true, description: 'The node to move.' },\n parent_id: { type: 'string', description: 'The node to move it under. Leave out to keep its parent and change only its place.' },\n index: { type: 'integer', minimum: 0, description: 'Its place among the children of its new parent: 0 puts it first. Leave out to put it last.' },\n },\n synonyms: { ...NODE_SYNONYMS, parent: 'parent_id', parentid: 'parent_id', under: 'parent_id', to: 'parent_id', position: 'index' },\n readOnly: false,\n destructive: false,\n },\n {\n name: 'reorder_children',\n description: 'Put the children of a node in a new order, all at once: to sort them, or to group the ones that go together.',\n fields: {\n parent_id: { type: 'string', required: true, description: 'The node whose children to reorder.' },\n order: { type: 'list', required: true, description: 'The ids of all its children, in their new order.' },\n },\n synonyms: { parent: 'parent_id', parentid: 'parent_id', node_id: 'parent_id', id: 'parent_id', ids: 'order', children: 'order', child_ids: 'order' },\n readOnly: false,\n destructive: false,\n },\n {\n name: 'remove_node',\n description: 'Remove a node and everything under it. Remove nodes only when asked to.',\n fields: {\n node_id: { type: 'string', required: true, description: 'The node to remove. The root can\\'t be removed.' },\n },\n synonyms: NODE_SYNONYMS,\n readOnly: false,\n destructive: true,\n },\n {\n name: 'show_node',\n description: 'Show the reader a node: the map flies to it, with its children around it. Use it when they ask to see or go to something, or to show them what you changed.',\n fields: {\n node_id: { type: 'string', required: true, description: 'The node to show.' },\n },\n synonyms: NODE_SYNONYMS,\n readOnly: true,\n destructive: false,\n },\n];\n\nexport const definitionOf = (spec: ToolSpec): MapToolDefinition => {\n return {\n name: spec.name,\n description: spec.description,\n inputSchema: schemaOf(spec.fields),\n annotations: { readOnlyHint: spec.readOnly, destructiveHint: spec.destructive },\n };\n};\n\n/** The definitions in the shape `provider`'s API takes. */\nexport const formatDefinitions = <Provider extends MapToolProvider>(definitions: readonly MapToolDefinition[], provider: Provider): MapToolFormats[Provider] => {\n const tools = definitions.map(({ name, description, inputSchema }) => ({ name, description, schema: structuredCopy(inputSchema) }));\n\n switch (provider as MapToolProvider) {\n case 'anthropic':\n return tools.map(({ name, description, schema }) => ({ name, description, input_schema: schema })) as MapToolFormats[Provider];\n case 'openai':\n // Strict mode would make every field required: models would send each one, and couldn't leave any out.\n return tools.map(({ name, description, schema }) => ({ type: 'function', name, description, parameters: schema, strict: false })) as MapToolFormats[Provider];\n case 'openai-chat':\n return tools.map(({ name, description, schema }) => ({ type: 'function', function: { name, description, parameters: schema } })) as MapToolFormats[Provider];\n case 'gemini':\n return [{ functionDeclarations: tools.map(({ name, description, schema }) => ({ name, description, parametersJsonSchema: schema })) }] as MapToolFormats[Provider];\n default:\n throw new TypeError(`Map tools come in the shapes of ${PROVIDERS.map((name) => `\"${name}\"`).join(', ')}, not ${JSON.stringify(provider)}. For any other, build them from tools.definitions: each has a name, a description and an inputSchema (JSON Schema).`);\n }\n};\n\n/** A copy a caller can change without changing the definitions. */\nconst structuredCopy = <Value>(value: Value): Value => {\n return JSON.parse(JSON.stringify(value)) as Value;\n};\n",
10
11
  "/**\n * The map as the tools describe it to a model: an outline with each node's\n * id, everything about one node, and search results. Plain text, short on\n * tokens: a line a node, with what an edit needs to know.\n */\n\nimport type { OrbitNode } from '../types.js';\nimport { findIndexedLinkedNode, indexNodes, nodeLinksOf } from '../node-links.js';\nimport { statusTone } from '../ui/detail-sheet.js';\n\n/** How much of a note an outline shows. */\nconst NOTE_PREVIEW = 100;\n/** How many matches find_nodes lists. */\nconst MATCH_LIMIT = 50;\n\n/** A node as the tools name it in a sentence: its title and id. */\nexport const nameOf = (node: OrbitNode): string => {\n return `\"${node.text}\" #${node.id}`;\n};\n\n/** A node's line in an outline: its title, its id, and its attributes. */\nexport const outlineLine = (node: OrbitNode, depth: number): string => {\n const details = attributesOf(node);\n return `${' '.repeat(depth)}- ${node.text} #${node.id}${details.length > 0 ? ` (${details.join('; ')})` : ''}`;\n};\n\nconst attributesOf = (node: OrbitNode): string[] => {\n const details: string[] = [];\n\n if (node.icon) {\n details.push(`icon: ${node.icon}`);\n }\n\n if (node.status) {\n details.push(`status: ${node.status}`);\n }\n\n if (node.priority !== undefined) {\n details.push(`priority: ${node.priority}`);\n }\n\n if (node.tags && node.tags.length > 0) {\n details.push(`tags: ${node.tags.join(', ')}`);\n }\n\n if (node.color) {\n details.push(`color: ${node.color}`);\n }\n\n if (node.link) {\n details.push(`link: ${node.link}`);\n }\n\n for (const media of ['image', 'video', 'embed'] as const) {\n if (node[media]) {\n details.push(media);\n }\n }\n\n if (node.type) {\n details.push(`type: ${node.type}`);\n }\n\n if (node.collapsed) {\n details.push('collapsed');\n }\n\n return details;\n};\n\n/** The first line of a note, cut short. */\nconst notePreview = (note: string): string => {\n const text = note.trim().replace(/\\s+/g, ' ');\n return text.length > NOTE_PREVIEW ? `${text.slice(0, NOTE_PREVIEW - 1).trimEnd()}…` : text;\n};\n\n/** A node's line, and its note's start under it. */\nconst headOf = (node: OrbitNode, depth: number): string[] => {\n const lines = [outlineLine(node, depth)];\n\n if (node.note?.trim()) {\n lines.push(`${' '.repeat(depth + 1)}> ${notePreview(node.note)}`);\n }\n\n return lines;\n};\n\n/** A node and `levels` levels under it as outline lines; what's further down is counted. */\nexport const outlineOf = (node: OrbitNode, depth = 0, levels = Infinity): string[] => {\n const lines = headOf(node, depth);\n\n if (levels > 0) {\n for (const child of node.children) {\n lines.push(...outlineOf(child, depth + 1, levels - 1));\n }\n } else if (node.children.length > 0) {\n lines.push(`${' '.repeat(depth + 1)}- … ${count(node.children.length, 'child', 'children')}, ${count(descendants(node), 'node')} in all under it`);\n }\n\n return lines;\n};\n\n/**\n * The outline read_map gives: `start` and up to `levels` levels under it,\n * as many whole levels as fit in `limit` nodes, so the shape of a big map\n * shows, with what's left out counted. `complete` when nothing asked for\n * was left out.\n */\nexport const readOutline = (start: OrbitNode, levels: number, limit: number): { lines: string[]; complete: boolean } => {\n let shown = 0;\n let total = 1;\n let level: OrbitNode[] = [start];\n\n while (shown < levels) {\n const next = level.flatMap((node) => node.children);\n\n if (next.length === 0 || total + next.length > limit) {\n break;\n }\n\n total += next.length;\n level = next;\n shown += 1;\n }\n\n const complete = shown === levels || level.every((node) => node.children.length === 0);\n\n if (shown === 0 && !complete) {\n // More children than the limit: as many of them as fit.\n const children = start.children.slice(0, Math.max(1, limit - 1));\n return {\n lines: [\n ...headOf(start, 0),\n ...children.flatMap((child) => outlineOf(child, 1, 0)),\n ` - … ${count(start.children.length - children.length, 'more child', 'more children')} of ${nameOf(start)}`,\n ],\n complete,\n };\n }\n\n return { lines: outlineOf(start, 0, shown), complete };\n};\n\n/** How many nodes are under a node, at any depth. */\nexport const descendants = (node: OrbitNode): number => {\n return node.children.reduce((sum, child) => sum + 1 + descendants(child), 0);\n};\n\n/** \"1 node\", \"3 nodes\" */\nexport const count = (amount: number, one: string, many = `${one}s`): string => {\n return `${amount} ${amount === 1 ? one : many}`;\n};\n\n/** Everything about a node, for read_node. */\nexport const nodeDetails = (root: OrbitNode, node: OrbitNode, path: OrbitNode[]): string => {\n const lines = [nameOf(node)];\n lines.push(path.length > 1 ? `Where: ${path.map((step) => step.text).join(' › ')}` : 'Where: the root of the map');\n const fields: [string, unknown][] = [\n ['Icon', node.icon],\n ['Status', node.status],\n ['Priority', node.priority],\n ['Tags', node.tags && node.tags.length > 0 ? node.tags.join(', ') : undefined],\n ['Color', node.color],\n ['Link', node.link],\n ['Picture', node.image && mediaLine(node.image.src, { alt: node.image.alt, caption: node.image.caption })],\n ['Video', node.video && mediaLine(node.video.src, { caption: node.video.caption })],\n ['Embedded page', node.embed && mediaLine(node.embed.src, { caption: node.embed.caption })],\n ['Type', node.type],\n ['Collapsed', node.collapsed ? 'yes: its children are hidden until the reader opens it' : undefined],\n ];\n\n for (const [label, value] of fields) {\n if (value !== undefined && value !== '') {\n lines.push(`${label}: ${String(value)}`);\n }\n }\n\n const custom = Object.entries(node.attrs ?? {});\n\n if (custom.length > 0) {\n lines.push(`Other attributes: ${custom.map(([key, value]) => `${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`).join('; ')}`);\n }\n\n lines.push(node.note?.trim() ? `Note${node.noteFormat === 'plain' ? ' (plain text)' : ''}:\\n${node.note.trim()}` : 'Note: none');\n lines.push(node.children.length > 0 ? `Children (${node.children.length}): ${node.children.map(nameOf).join(', ')}` : 'Children: none');\n const linking = nodesLinkingTo(root, node);\n\n if (linking.length > 0) {\n lines.push(`Linked from: ${linking.map(nameOf).join(', ')}`);\n }\n\n return lines.join('\\n');\n};\n\nconst mediaLine = (src: string, extras: Record<string, string | undefined>): string => {\n const described = Object.entries(extras).filter(([, value]) => value).map(([key, value]) => `${key}: ${value}`);\n return described.length > 0 ? `${src} (${described.join('; ')})` : src;\n};\n\n/** The nodes whose link, or a link in whose note, points at `target`. */\nexport const nodesLinkingTo = (root: OrbitNode, target: OrbitNode): OrbitNode[] => {\n const nodes = indexNodes(root);\n const linking: OrbitNode[] = [];\n\n const visit = (node: OrbitNode): void => {\n if (nodeLinksOf(node).some((href) => findIndexedLinkedNode(nodes, href) === target)) {\n linking.push(node);\n }\n\n node.children.forEach(visit);\n };\n\n visit(root);\n return linking;\n};\n\n/** Text as search compares it: lowercase, without accents. */\nexport const searchable = (text: string): string => {\n return text.normalize('NFKD').replace(/\\p{M}+/gu, '').toLowerCase();\n};\n\n/** What find_nodes looks for. */\nexport interface Search {\n query?: string;\n status?: string;\n tag?: string;\n}\n\n/** The nodes that match, titles matching first, as find_nodes lists them. */\nexport const findNodes = (root: OrbitNode, search: Search): string => {\n const words = searchable(search.query ?? '').split(/\\s+/).filter((word) => word !== '');\n const status = search.status === undefined ? undefined : searchable(search.status.trim());\n const tag = search.tag === undefined ? undefined : searchable(search.tag.trim().replace(/^#/, ''));\n\n const statusMatches = (node: OrbitNode): boolean => {\n if (status === undefined) {\n return true;\n }\n\n if (!node.status) {\n return false;\n }\n\n const own = searchable(node.status.trim());\n const tone = statusTone(status);\n return own === status || (tone !== 'neutral' && statusTone(own) === tone);\n };\n\n const matches: { node: OrbitNode; path: OrbitNode[]; inTitle: boolean }[] = [];\n\n const visit = (node: OrbitNode, path: OrbitNode[]): void => {\n const title = searchable([node.text, ...(node.tags ?? [])].join(' '));\n const everything = `${title} ${searchable(node.note ?? '')}`;\n\n if (words.every((word) => everything.includes(word))\n && statusMatches(node)\n && (tag === undefined || (node.tags ?? []).some((own) => searchable(own) === tag))) {\n matches.push({ node, path, inTitle: words.every((word) => title.includes(word)) });\n }\n\n node.children.forEach((child) => visit(child, [...path, node]));\n };\n\n visit(root, []);\n\n if (matches.length === 0) {\n return 'No node matches. Try fewer or other words, or read the map with read_map.';\n }\n\n matches.sort((first, second) => Number(second.inTitle) - Number(first.inTitle));\n const shown = matches.slice(0, MATCH_LIMIT);\n const lines = [`${count(matches.length, 'node matches', 'nodes match')}${matches.length > shown.length ? `; the first ${shown.length}` : ''}:`];\n\n for (const { node, path } of shown) {\n lines.push(`${outlineLine(node, 0)}${path.length > 0 ? ` in ${path.map((step) => step.text).join(' › ')}` : ' (the root)'}`);\n }\n\n if (matches.length > shown.length) {\n lines.push('Narrow the search to see the others.');\n }\n\n return lines.join('\\n');\n};\n",
11
- "/**\n * Map tools: what a language model needs to read a map and change it, from\n * any provider. The definitions come in each provider's shape, and `run`\n * carries out a call on a map on screen, where each change animates into\n * place and fires `edit` as anyone's would, or on a document without one,\n * on a server. A call that can't be carried out changes nothing and says\n * why, in words a model can act on: the id it meant, a move that can't be\n * made, a value the map can't use.\n */\n\nimport type { OrbitDocument, OrbitNewNode, OrbitNode, OrbitNodeInput } from '../types.js';\nimport type { OrbitSVGRenderer } from '../svg-renderer.js';\nimport { parseOrbit } from '../dispatch.js';\nimport { leadingEmoji, parseOrbitMarkdown } from '../parser-markdown.js';\nimport { formatDiagnostic } from '../diagnostics.js';\nimport { addToTree, moveInTree, newNodeFrom, removeFromTree, updateInTree } from '../editing.js';\nimport { findIndexedLinkedNode, findLinkedNode, indexNodes, isNodeLink, nodeLinksOf } from '../node-links.js';\nimport { findNodeById, getNodePath, nodeSlug } from '../utils.js';\nimport { suggest } from '../suggest.js';\nimport { guardUrl } from '../url-guard.js';\nimport { ATTRIBUTES, definitionOf, formatDefinitions, TOOL_SPECS, type MapToolDefinition, type MapToolFormats, type MapToolName, type MapToolProvider, type ToolAttribute, type ToolSpec } from './definitions.js';\nimport { InputError, list, readInput } from './input.js';\nimport { count, descendants, findNodes, nameOf, nodeDetails, outlineOf, readOutline, searchable, type Search } from './reading.js';\n\n/** How many nodes read_map shows at once, unless `readLimit` says otherwise. */\nconst READ_LIMIT = 250;\n/** Titles longer than this, in characters, get a hint to keep them short. */\nconst LONG_TITLE = 60;\n/** What a CSS color looks like: a hex code, a name, or a color function. Browsers check the rest. */\nconst COLOR_SYNTAX = /^(?:#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})|[a-z]+|(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark|var)\\(.+\\))$/i;\n/** Diagnostics an outline of new nodes always has, or can't judge alone. */\nconst OUTLINE_CODES_LEFT_OUT = new Set(['synthetic-root', 'no-structure', 'unknown-link-target']);\n\nexport interface MapToolsOptions {\n /** Offer only the tools that read the map, for an assistant that answers questions about it. Default false. */\n readOnly?: boolean;\n\n /** The most nodes `read_map` shows at once; a bigger map is cut short, whole levels first. Default 250. */\n readLimit?: number;\n}\n\n/** What a tool call did, to send back to the model. */\nexport interface MapToolResult {\n /** False when the call couldn't be carried out: nothing changed, and `text` says why and what to send instead. */\n ok: boolean;\n\n /** What happened, for the model, with the ids to use next. */\n text: string;\n\n /** Whether the map changed. */\n changed: boolean;\n}\n\n/** Map tools for one map (see `createMapTools`). */\nexport interface MapTools {\n /** The tools: name, description, input as JSON Schema, and hints. The shape MCP takes, and the data for any other. */\n readonly definitions: MapToolDefinition[];\n\n /** How to use the tools, to add to the model's system prompt. */\n readonly instructions: string;\n\n /** The tools in the shape a provider's API takes: `anthropic`, `openai` (Responses), `openai-chat` (Chat Completions, and most other providers) or `gemini`. */\n for<Provider extends MapToolProvider>(provider: Provider): MapToolFormats[Provider];\n\n /**\n * Carries out a tool call: its name, and its input as an object or as\n * the JSON text OpenAI sends. Never throws for a call a model gets wrong:\n * the result says what went wrong instead.\n */\n run(name: string, input?: unknown): MapToolResult;\n\n /** The map as it is now. Edits change it in place. */\n readonly document: OrbitDocument | null;\n}\n\n/** What a map on screen offers the tools: an `OrbitSVGRenderer` has it all. */\ntype LiveMap = Pick<OrbitSVGRenderer, 'getDocument' | 'addNode' | 'updateNode' | 'moveNode' | 'removeNode' | 'flyTo' | 'getFocusedNode' | 'getViewMode'>;\n\n/** What the tools change: a map on screen, through its methods, or a document. */\ninterface Target {\n document(): OrbitDocument | null;\n add(parentId: string, input: OrbitNewNode, index?: number): OrbitNode | null;\n update(id: string, changes: OrbitNodeInput): OrbitNode | null;\n move(id: string, parentId: string, index?: number): OrbitNode | null;\n remove(id: string): OrbitNode | null;\n\n /** A map on screen. */\n live: LiveMap | null;\n\n /** Written for a newer version of the format, so this one could lose what it doesn't read by changing it. */\n newer: boolean;\n}\n\n/** A call that can't be carried out, with what to do instead. */\nclass CallError extends Error {}\n\n/** What a tool did, and what's worth knowing besides. */\ninterface Outcome {\n text: string;\n changed: boolean;\n}\n\n/**\n * Tools a language model calls to read and edit a map: on screen (an\n * `OrbitSVGRenderer`, such as `createOrbitMap` returns or `<orbit-map>`'s\n * `renderer`), where each change animates and fires `edit`, or a document\n * (or its markdown or YAML), which they change in place.\n */\nexport const createMapTools = (map: OrbitSVGRenderer | OrbitDocument | string, options: MapToolsOptions = {}): MapTools => {\n const target = targetOf(map);\n const readLimit = typeof options.readLimit === 'number' && Number.isFinite(options.readLimit) ? Math.max(10, Math.trunc(options.readLimit)) : READ_LIMIT;\n const specs = TOOL_SPECS.filter((spec) => (spec.name !== 'show_node' || target.live !== null) && (spec.readOnly || !options.readOnly));\n const definitions = specs.map(definitionOf);\n // Ids this session changed or removed, so a call with an id from before still finds its node, or says what happened to it.\n const renamed = new Map<string, string>();\n const removed = new Map<string, string>();\n const notes: string[] = [];\n\n /** The node an id names: a node's id, with or without its #, an id from before a rename, or a title only one node has. */\n const resolve = (root: OrbitNode, given: string, field: string): OrbitNode => {\n const id = given.trim().replace(/^#/, '');\n const direct = findNodeById(root, id);\n\n if (direct) {\n return direct;\n }\n\n let current = id;\n const seen = new Set<string>();\n\n while (renamed.has(current) && !seen.has(current)) {\n seen.add(current);\n current = renamed.get(current)!;\n }\n\n const followed = current === id ? null : findNodeById(root, current);\n\n if (followed) {\n notes.push(`#${id} is ${nameOf(followed)} now.`);\n return followed;\n }\n\n if (removed.has(id)) {\n throw new CallError(`${field} names #${id}, but \"${removed.get(id)}\" was removed.`);\n }\n\n const wanted = searchable(id);\n const titled = allNodes(root).filter((node) => searchable(node.text.trim()) === wanted || node.id === nodeSlug(id));\n\n if (titled.length === 1) {\n notes.push(`${field} takes ids: the id of \"${titled[0].text}\" is #${titled[0].id}.`);\n return titled[0];\n }\n\n if (titled.length > 1) {\n throw new CallError(`${titled.length} nodes are called \"${given}\": ${titled.map((node) => `${nameOf(node)}${node.parent ? ` under \"${node.parent.text}\"` : ''}`).join(', ')}. Give ${field} one of their ids.`);\n }\n\n const near = suggest(id, allNodes(root).map((node) => node.id));\n const nearNode = near === undefined ? null : findNodeById(root, near);\n throw new CallError(`No node has the id \"${id}\".${nearNode ? ` Did you mean ${nameOf(nearNode)}?` : ''} read_map and find_nodes give every node's id.`);\n };\n\n const calls: Record<MapToolName, (values: Record<string, unknown>, root: OrbitNode, document: OrbitDocument) => Outcome> = {\n read_map: (values, root, document) => {\n const start = typeof values.node_id === 'string' ? resolve(root, values.node_id, 'node_id') : root;\n const levels = typeof values.depth === 'number' ? values.depth : Infinity;\n const { lines, complete } = readOutline(start, levels, readLimit);\n const header: string[] = [];\n\n if (start === root) {\n const title = document.options.title ?? root.text;\n header.push(`The map \"${title}\" has ${count(1 + descendants(root), 'node')}.`);\n } else {\n const path = getNodePath(root, start.id);\n header.push(`${nameOf(start)}, in ${path.slice(0, -1).map((node) => node.text).join(' › ')}, has ${count(descendants(start), 'node')} under it.`);\n }\n\n const live = target.live;\n\n if (live) {\n const focused = live.getFocusedNode();\n header.push(live.getViewMode() === 'all' || !focused ? 'The reader is looking at the whole map.' : `The reader is looking at ${nameOf(focused)}.`);\n }\n\n const footer = complete ? [] : ['Nodes further down aren\\'t shown: read a branch with read_map and its node_id, or search with find_nodes.'];\n return { text: [header.join(' '), ...lines, ...footer].join('\\n'), changed: false };\n },\n\n find_nodes: (values, root) => {\n if (values.query === undefined && values.status === undefined && values.tag === undefined) {\n throw new CallError('find_nodes needs something to look for: query, status, tag, or more than one.');\n }\n\n return { text: findNodes(root, values as Search), changed: false };\n },\n\n read_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n return { text: nodeDetails(root, node, getNodePath(root, node.id)), changed: false };\n },\n\n add_nodes: (values, root) => {\n const parent = resolve(root, values.parent_id as string, 'parent_id');\n const nodes = readNewNodes(values.outline as string);\n const index = values.index as number | undefined;\n const added: OrbitNode[] = [];\n\n nodes.forEach((input, offset) => {\n const node = target.add(parent.id, input, index === undefined ? undefined : index + offset);\n\n if (node) {\n added.push(node);\n }\n });\n\n if (added.length === 0) {\n throw new CallError(`Nothing could be added under ${nameOf(parent)}.`);\n }\n\n for (const node of added) {\n const twin = parent.children.find((sibling) => sibling !== node && !added.includes(sibling) && searchable(sibling.text) === searchable(node.text));\n\n if (twin) {\n notes.push(`${nameOf(node)} has the same title as ${nameOf(twin)} beside it. If it's there twice by mistake, remove one with remove_node.`);\n }\n }\n\n const all = added.flatMap(allNodes);\n const long = all.filter((node) => node.text.length > LONG_TITLE);\n\n if (long.length > 0) {\n notes.push(`${long.map(nameOf).join(', ')} ${long.length === 1 ? 'has a long title' : 'have long titles'}: a few words read best on the map, with the rest in the note.`);\n }\n\n notes.push(...brokenLinks(target.document()?.root ?? root, all));\n return {\n text: [`Added ${count(all.length, 'node')} under ${nameOf(parent)}${placeOf(added, parent)}:`, ...added.flatMap((node) => outlineOf(node))].join('\\n'),\n changed: added.length > 0,\n };\n },\n\n update_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n const previousId = node.id;\n const { changes, set, cleared, absent } = readChanges(values, root, node);\n\n if (set.length === 0 && cleared.length === 0) {\n if (absent.length === 0) {\n throw new CallError(`update_node needs something to change: ${list(['text', ...ATTRIBUTES])}, or clear to remove attributes.`);\n }\n\n return { text: `${nameOf(node)} has no ${list(absent)} to remove: nothing changed.`, changed: false };\n }\n\n const updated = target.update(node.id, changes);\n\n if (!updated) {\n throw new CallError(`${nameOf(node)} couldn't be changed.`);\n }\n\n if (changes.note !== undefined) {\n notes.push(...brokenLinks(root, [updated]));\n }\n\n const described = [set.length > 0 ? `set its ${list(set)}` : '', cleared.length > 0 ? `removed its ${list(cleared)}` : ''].filter((part) => part !== '').join('; ');\n let text = `Changed ${nameOf(updated)}: ${described}.`;\n\n if (updated.id !== previousId) {\n renamed.set(previousId, updated.id);\n text += ` Its id is #${updated.id} now: it was #${previousId}.`;\n }\n\n return { text, changed: true };\n },\n\n move_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n\n if (values.parent_id === undefined && values.index === undefined) {\n throw new CallError('move_node needs where to move the node: parent_id, index, or both.');\n }\n\n const path = getNodePath(root, node.id);\n\n if (path.length < 2) {\n throw new CallError(`${nameOf(node)} is the root: it can't move, as every other node is under it.`);\n }\n\n const parent = values.parent_id === undefined ? path[path.length - 2] : resolve(root, values.parent_id as string, 'parent_id');\n\n if (parent === node) {\n throw new CallError(`${nameOf(node)} can't go under itself. Give parent_id another node.`);\n }\n\n if (getNodePath(root, parent.id).includes(node)) {\n throw new CallError(`${nameOf(node)} can't go under ${nameOf(parent)}, which is inside it. Move ${nameOf(parent)} out of it first, or choose another parent.`);\n }\n\n const under = descendants(node);\n const moved = target.move(node.id, parent.id, values.index as number | undefined);\n\n if (!moved) {\n throw new CallError(`${nameOf(node)} couldn't be moved.`);\n }\n\n return { text: `Moved ${nameOf(moved)}${under > 0 ? `, with the ${count(under, 'node')} under it,` : ''} under ${nameOf(parent)}${placeOf([moved], parent)}.`, changed: true };\n },\n\n reorder_children: (values, root) => {\n const parent = resolve(root, values.parent_id as string, 'parent_id');\n const children = [...parent.children];\n\n if (children.length === 0) {\n throw new CallError(`${nameOf(parent)} has no children to reorder.`);\n }\n\n const order = (values.order as string[]).map((given) => childNamed(parent, given));\n const twice = order.find((child, position) => order.indexOf(child) !== position);\n\n if (twice) {\n throw new CallError(`order lists ${nameOf(twice)} twice: list each child once.`);\n }\n\n const missing = children.filter((child) => !order.includes(child));\n\n if (missing.length > 0) {\n throw new CallError(`order needs all ${children.length} children of ${nameOf(parent)}, and leaves out ${missing.map(nameOf).join(', ')}.`);\n }\n\n if (order.every((child, position) => children[position] === child)) {\n return { text: `The children of ${nameOf(parent)} are in that order already.`, changed: false };\n }\n\n order.forEach((child, position) => {\n const current = findNodeById(target.document()?.root ?? root, parent.id) ?? parent;\n\n if (current.children[position]?.id !== child.id) {\n target.move(child.id, parent.id, position);\n }\n });\n\n return { text: `The children of ${nameOf(parent)} are in this order now: ${order.map(nameOf).join(', ')}.`, changed: true };\n },\n\n remove_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n\n if (node === root) {\n throw new CallError(`${nameOf(node)} is the root, and the map is all under it: it can't be removed. Remove the nodes under it one by one, or give it a new title with update_node.`);\n }\n\n const gone = allNodes(node);\n\n if (!target.remove(node.id)) {\n throw new CallError(`${nameOf(node)} couldn't be removed.`);\n }\n\n for (const each of gone) {\n removed.set(each.id, each.text);\n }\n\n return { text: `Removed ${nameOf(node)}${gone.length > 1 ? ` and the ${count(gone.length - 1, 'node')} under it` : ''}.`, changed: true };\n },\n\n show_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n target.live?.flyTo(node.id);\n return { text: `The map shows ${nameOf(node)} now, with its children around it.`, changed: false };\n },\n };\n\n /** The child of `parent` that `given` names. */\n const childNamed = (parent: OrbitNode, given: string): OrbitNode => {\n const id = given.trim().replace(/^#/, '');\n const child = parent.children.find((each) => each.id === id || each.id === renamed.get(id))\n ?? parent.children.find((each) => searchable(each.text.trim()) === searchable(id));\n\n if (!child) {\n throw new CallError(`${given} isn't a child of ${nameOf(parent)}. Its children: ${parent.children.map(nameOf).join(', ')}.`);\n }\n\n return child;\n };\n\n const run = (name: string, input?: unknown): MapToolResult => {\n notes.length = 0;\n const spec = TOOL_SPECS.find((each) => each.name === name);\n const offered = specs.find((each) => each.name === name);\n\n if (!offered) {\n if (spec?.name === 'show_node') {\n return failure('show_node only works on a map on screen.');\n }\n\n if (spec) {\n return failure(`${name} isn't available: this map can only be read.`);\n }\n\n const near = suggest(String(name), specs.map((each) => each.name));\n return failure(`There's no tool \"${String(name)}\".${near === undefined ? '' : ` Did you mean ${near}?`} The tools are ${list(specs.map((each) => each.name))}.`);\n }\n\n const document = target.document();\n\n if (!document) {\n return failure('There\\'s no map to read yet: it hasn\\'t been drawn.');\n }\n\n if (!offered.readOnly && target.newer) {\n return failure('This map was written for a newer version of Orbit, and changing it here could lose what this version doesn\\'t read. It can be read, but not changed.');\n }\n\n try {\n const { values, ignored } = readInput(offered.name, offered.fields, input, offered.synonyms);\n const outcome = calls[offered.name](values, document.root, document);\n\n if (ignored.length > 0) {\n notes.push(`${offered.name} doesn't take ${list(ignored.map((key) => `\"${key}\"`))}, so ${ignored.length === 1 ? 'it was' : 'they were'} left out. It takes ${list(Object.keys(offered.fields))}.`);\n }\n\n return { ok: true, text: [outcome.text, ...notes.map((note) => `Note: ${note}`)].join('\\n'), changed: outcome.changed };\n } catch (error) {\n if (error instanceof CallError || error instanceof InputError) {\n return failure(error.message, offered);\n }\n\n throw error;\n }\n };\n\n return {\n definitions,\n instructions: instructionsFor(target.live !== null, options.readOnly === true),\n for: (provider) => formatDefinitions(definitions, provider),\n run,\n get document() {\n return target.document();\n },\n };\n};\n\nconst failure = (message: string, spec?: ToolSpec): MapToolResult => {\n return { ok: false, text: spec && !spec.readOnly ? `${message} Nothing changed.` : message, changed: false };\n};\n\nconst targetOf = (map: OrbitSVGRenderer | OrbitDocument | string): Target => {\n if (isLiveMap(map)) {\n return {\n document: () => map.getDocument(),\n add: (parentId, input, index) => map.addNode(parentId, input, index),\n update: (id, changes) => map.updateNode(id, changes),\n move: (id, parentId, index) => map.moveNode(id, parentId, index),\n remove: (id) => map.removeNode(id),\n live: map,\n newer: false,\n };\n }\n\n const document = typeof map === 'string' ? parseOrbit(map) : map;\n\n if (!document || typeof document !== 'object' || !document.root || !Array.isArray(document.root.children)) {\n throw new TypeError(`createMapTools() takes a map on screen (createOrbitMap's result, or <orbit-map>'s renderer), a parsed document, or a map's markdown or YAML, but got ${map === null ? 'null' : typeof map}.`);\n }\n\n return {\n document: () => document,\n add: (parentId, input, index) => addToTree(document.root, parentId, input, index)?.node ?? null,\n update: (id, changes) => updateInTree(document.root, id, changes)?.node ?? null,\n move: (id, parentId, index) => moveInTree(document.root, id, parentId, index)?.node ?? null,\n remove: (id) => removeFromTree(document.root, id)?.node ?? null,\n live: null,\n newer: (document.diagnostics ?? []).some((diagnostic) => diagnostic.code === 'unsupported-schema-version'),\n };\n};\n\nconst isLiveMap = (map: unknown): map is LiveMap => {\n const candidate = map as Partial<LiveMap> | null;\n return typeof candidate === 'object' && candidate !== null && typeof candidate.getDocument === 'function' && typeof candidate.addNode === 'function';\n};\n\n/** The text for the system prompt. */\nconst instructionsFor = (live: boolean, readOnly: boolean): string => {\n const lines = readOnly\n ? [\n 'You can read the mind map with the map tools. Each node is an idea, with an id.',\n '- read_map shows the map as an outline, with every node\\'s id; find_nodes searches a big one, and read_node shows everything about one node, its whole note included.',\n '- Answer from what the map says, and say when it doesn\\'t say.',\n ]\n : [\n 'You can read and change the mind map with the map tools. Each node is an idea, with an id.',\n '- Read the map before you change it: read_map shows it as an outline with every node\\'s id, and find_nodes searches a big one. The other tools take those ids.',\n '- Keep titles to a few words, and put details and longer text in the note.',\n '- Write in the language the map is written in.',\n '- Add several nodes, or whole branches, with one add_nodes call.',\n '- A new title can give a node a new id: use the ids the latest results give.',\n '- Remove nodes only when asked to.',\n ];\n\n if (live) {\n lines.push(readOnly ? '- show_node takes the reader to a node.' : '- The reader sees each change on the map as you make it, and show_node takes them to a node.');\n }\n\n return lines.join('\\n');\n};\n\n/** Every node from `root` down, in reading order. */\nconst allNodes = (root: OrbitNode): OrbitNode[] => {\n return [root, ...root.children.flatMap(allNodes)];\n};\n\n/** Where `nodes`, siblings in a row, are among their parent's children, as a result says it: after the one before them, or first. */\nconst placeOf = (nodes: OrbitNode[], parent: OrbitNode): string => {\n const first = parent.children.indexOf(nodes[0]);\n const last = parent.children.indexOf(nodes[nodes.length - 1]);\n\n if (first > 0) {\n return `, after ${nameOf(parent.children[first - 1])}`;\n }\n\n if (first === 0 && last < parent.children.length - 1) {\n return `, first, before ${nameOf(parent.children[last + 1])}`;\n }\n\n return '';\n};\n\n/** The `#id` links of `nodes` that point at no node, with the id they probably meant. */\nconst brokenLinks = (root: OrbitNode, nodes: OrbitNode[]): string[] => {\n const index = indexNodes(root);\n const ids = [...index.keys()];\n\n return nodes.flatMap((node) => nodeLinksOf(node)\n .filter((href) => !findIndexedLinkedNode(index, href))\n .map((href) => {\n const near = suggest(href.slice(1), ids);\n return `${nameOf(node)} links to ${href}, but no node has that id.${near === undefined ? '' : ` Did you mean #${near}?`}`;\n }));\n};\n\n/**\n * The nodes an outline lists, read as orbit-md: a list, headings, or lines\n * of plain text, a node each. An outline that doesn't read cleanly, such as\n * a misspelled attribute, adds nothing: the error says what to fix.\n */\nconst readNewNodes = (outline: string): OrbitNewNode[] => {\n let source = outline.replace(/\\r\\n?/g, '\\n');\n\n if (/^\\s*---\\s*\\n/.test(source)) {\n throw new CallError('outline takes the nodes to add as a markdown list, without frontmatter.');\n }\n\n let document = parseOrbitMarkdown(source);\n\n if (document.diagnostics.some((diagnostic) => diagnostic.code === 'no-structure')) {\n source = source.split('\\n').map((line) => line.trim()).filter((line) => line !== '').map((line) => `- ${line}`).join('\\n');\n document = parseOrbitMarkdown(source);\n }\n\n const roots = document.diagnostics.some((diagnostic) => diagnostic.code === 'synthetic-root') ? document.root.children : [document.root];\n const untitled = roots.flatMap(allNodes).find((node) => node.text.trim() === '');\n\n if (roots.length === 0 || untitled) {\n throw new CallError(untitled?.source\n ? `Line ${untitled.source.line} of outline has an item without a title.`\n : 'outline has no nodes: write them as a markdown list, like \"- Social media\\\\n- Newsletter\".');\n }\n\n // Nothing is kept from an outline with problems, so the parser's \"kept as written\" doesn't apply.\n const problems = document.diagnostics\n .filter((diagnostic) => !OUTLINE_CODES_LEFT_OUT.has(diagnostic.code))\n .map((diagnostic) => formatDiagnostic(diagnostic).replace(/[,;] kept as (?:a custom attribute|written)(?:, but not used)?/, ''));\n\n if (problems.length > 0) {\n throw new CallError(`outline doesn't read cleanly. Fix ${problems.length === 1 ? 'this' : 'these'}, and send it again:\\n${problems.map((problem) => `- ${problem}`).join('\\n')}\\nLines count from the outline's first line.`);\n }\n\n return roots.map(newNodeFrom);\n};\n\n/** What update_node changes: the changes, checked; what they set and remove; and what they'd remove that isn't there. */\ninterface Changes {\n changes: OrbitNodeInput;\n set: string[];\n cleared: string[];\n absent: string[];\n}\n\n/** The changes update_node asks for, checked. */\nconst readChanges = (values: Record<string, unknown>, root: OrbitNode, node: OrbitNode): Changes => {\n const changes: OrbitNodeInput = {};\n const set: string[] = [];\n const clear = new Set((values.clear as ToolAttribute[] | undefined) ?? []);\n const cleared: string[] = [];\n const absent: string[] = [];\n\n const remove = (name: ToolAttribute) => {\n if (node[name] === undefined) {\n absent.push(name);\n return;\n }\n\n (changes as Record<string, unknown>)[name] = undefined;\n cleared.push(name);\n };\n\n for (const name of clear) {\n if (values[name] !== undefined) {\n throw new CallError(`${name} is both given and in clear: give it a value, or clear it.`);\n }\n\n remove(name);\n }\n\n if (values.text !== undefined) {\n let text = String(values.text).replace(/\\s+/g, ' ').trim();\n\n if (text === '') {\n throw new CallError('text can\\'t be empty: every node has a title. To take the node out of the map, use remove_node.');\n }\n\n const emoji = leadingEmoji(text);\n\n if (emoji && values.icon === undefined && !clear.has('icon')) {\n // Saved, the map would read the emoji back as the node's icon.\n changes.icon = emoji.icon;\n text = emoji.text;\n set.push('icon');\n }\n\n changes.text = text;\n set.push('title');\n }\n\n const text = (name: 'note' | 'status' | 'icon' | 'color' | 'link'): string | undefined => {\n const value = values[name];\n\n if (value === undefined) {\n return undefined;\n }\n\n const written = name === 'note' ? String(value).trim() : String(value).replace(/\\s+/g, ' ').trim();\n\n if (written === '') {\n remove(name);\n return undefined;\n }\n\n set.push(name);\n return written;\n };\n\n const note = text('note');\n\n if (note !== undefined) {\n changes.note = note;\n }\n\n const status = text('status');\n\n if (status !== undefined) {\n changes.status = status;\n }\n\n if (values.priority !== undefined) {\n changes.priority = values.priority as number;\n set.push('priority');\n }\n\n if (values.tags !== undefined) {\n const tags = [...new Set((values.tags as string[]).map((tag) => tag.replace(/^#/, '').trim()).filter((tag) => tag !== ''))];\n\n if (tags.length === 0) {\n remove('tags');\n } else {\n changes.tags = tags;\n set.push('tags');\n }\n }\n\n const icon = text('icon');\n\n if (icon !== undefined) {\n if (/^[\\p{L}\\p{N}][\\p{L}\\p{N}\\s'-]+$/u.test(icon) || Array.from(icon).length > 8) {\n throw new CallError(`icon takes an emoji, such as 🚀, not ${JSON.stringify(icon)}.`);\n }\n\n changes.icon = icon;\n }\n\n const color = text('color');\n\n if (color !== undefined) {\n const supports = typeof CSS !== 'undefined' && typeof CSS.supports === 'function' ? CSS.supports('color', color) : true;\n\n if (!COLOR_SYNTAX.test(color) || !supports) {\n throw new CallError(`\"${color}\" isn't a CSS color. Use a color name, such as tomato, or a code, such as #E8A33D.`);\n }\n\n changes.color = color;\n }\n\n const link = text('link');\n\n if (link !== undefined) {\n if (isNodeLink(link)) {\n if (!findLinkedNode(root, link)) {\n const near = suggest(link.slice(1), allNodes(root).map((each) => each.id));\n throw new CallError(`link ${link} points at no node.${near === undefined ? '' : ` Did you mean #${near}?`} Node links are # and a node's id.`);\n }\n } else if (guardUrl(link, 'link', false) === null) {\n throw new CallError(`\"${link}\" isn't an address the map can open: use a web address, such as https://example.com.`);\n }\n\n changes.link = link;\n }\n\n for (const name of ['image', 'video', 'embed'] as const) {\n const media = values[name] as Record<string, string> | undefined;\n\n if (media === undefined) {\n continue;\n }\n\n const src = media.src.trim();\n\n if (src === '') {\n remove(name);\n continue;\n }\n\n if (guardUrl(src, name, false) === null) {\n throw new CallError(`${name} can't show \"${src}\": use a web address, such as https://example.com/${name === 'image' ? 'photo.jpg' : name === 'video' ? 'video.mp4' : 'page'}.`);\n }\n\n const extras = Object.fromEntries(Object.entries(media).filter(([key, value]) => key !== 'src' && value.trim() !== '').map(([key, value]) => [key, value.trim()]));\n (changes as Record<string, unknown>)[name] = { src, ...extras };\n set.push(name === 'image' ? 'picture' : name === 'embed' ? 'embedded page' : 'video');\n }\n\n if (values.collapsed !== undefined) {\n if (values.collapsed === true) {\n changes.collapsed = true;\n set.push('collapsed');\n } else {\n remove('collapsed');\n }\n }\n\n return { changes, set, cleared, absent };\n};\n",
12
+ "/**\n * Map tools: what a language model needs to read a map and change it, from\n * any provider. The definitions come in each provider's shape, and `run`\n * carries out a call on a map on screen, where each change animates into\n * place and fires `edit` as anyone's would, or on a document without one,\n * on a server. A call that can't be carried out changes nothing and says\n * why, in words a model can act on: the id it meant, a move that can't be\n * made, a value the map can't use.\n */\n\nimport type { OrbitDocument, OrbitNewNode, OrbitNode, OrbitNodeInput } from '../types.js';\nimport type { OrbitSVGRenderer } from '../svg-renderer.js';\nimport { parseOrbit } from '../dispatch.js';\nimport { leadingEmoji, parseOrbitMarkdown } from '../parser-markdown.js';\nimport { formatDiagnostic } from '../diagnostics.js';\nimport { addToTree, moveInTree, newNodeFrom, removeFromTree, updateInTree } from '../editing.js';\nimport { branchPalette, type BranchColorRules } from '../branch-colors.js';\nimport { MapExtensions } from '../extensions.js';\nimport { resolvePalette } from '../themes.js';\nimport { findIndexedLinkedNode, findLinkedNode, indexNodes, isNodeLink, nodeLinksOf } from '../node-links.js';\nimport { findNodeById, getNodePath, nodeSlug } from '../utils.js';\nimport { suggest } from '../suggest.js';\nimport { guardUrl } from '../url-guard.js';\nimport { ATTRIBUTES, definitionOf, formatDefinitions, TOOL_SPECS, type MapToolDefinition, type MapToolFormats, type MapToolName, type MapToolProvider, type ToolAttribute, type ToolSpec } from './definitions.js';\nimport { InputError, list, readInput } from './input.js';\nimport { count, descendants, findNodes, nameOf, nodeDetails, outlineOf, readOutline, searchable, type Search } from './reading.js';\n\n/** How many nodes read_map shows at once, unless `readLimit` says otherwise. */\nconst READ_LIMIT = 250;\n/** Titles longer than this, in characters, get a hint to keep them short. */\nconst LONG_TITLE = 60;\n/** What a CSS color looks like: a hex code, a name, or a color function. Browsers check the rest. */\nconst COLOR_SYNTAX = /^(?:#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})|[a-z]+|(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark|var)\\(.+\\))$/i;\n/** Diagnostics an outline of new nodes always has, or can't judge alone. */\nconst OUTLINE_CODES_LEFT_OUT = new Set(['synthetic-root', 'no-structure', 'unknown-link-target']);\n\nexport interface MapToolsOptions {\n /** Offer only the tools that read the map, for an assistant that answers questions about it. Default false. */\n readOnly?: boolean;\n\n /** The most nodes `read_map` shows at once; a bigger map is cut short, whole levels first. Default 250. */\n readLimit?: number;\n}\n\n/** What a tool call did, to send back to the model. */\nexport interface MapToolResult {\n /** False when the call couldn't be carried out: nothing changed, and `text` says why and what to send instead. */\n ok: boolean;\n\n /** What happened, for the model, with the ids to use next. */\n text: string;\n\n /** Whether the map changed. */\n changed: boolean;\n}\n\n/** Map tools for one map (see `createMapTools`). */\nexport interface MapTools {\n /** The tools: name, description, input as JSON Schema, and hints. The shape MCP takes, and the data for any other. */\n readonly definitions: MapToolDefinition[];\n\n /** How to use the tools, to add to the model's system prompt. */\n readonly instructions: string;\n\n /** The tools in the shape a provider's API takes: `anthropic`, `openai` (Responses), `openai-chat` (Chat Completions, and most other providers) or `gemini`. */\n for<Provider extends MapToolProvider>(provider: Provider): MapToolFormats[Provider];\n\n /**\n * Carries out a tool call: its name, and its input as an object or as\n * the JSON text OpenAI sends. Never throws for a call a model gets wrong:\n * the result says what went wrong instead.\n */\n run(name: string, input?: unknown): MapToolResult;\n\n /** The map as it is now. Edits change it in place. */\n readonly document: OrbitDocument | null;\n}\n\n/** What a map on screen offers the tools: an `OrbitSVGRenderer` has it all. */\ntype LiveMap = Pick<OrbitSVGRenderer, 'getDocument' | 'addNode' | 'updateNode' | 'moveNode' | 'removeNode' | 'flyTo' | 'getFocusedNode' | 'getViewMode'>;\n\n/** What the tools change: a map on screen, through its methods, or a document. */\ninterface Target {\n document(): OrbitDocument | null;\n add(parentId: string, input: OrbitNewNode, index?: number): OrbitNode | null;\n update(id: string, changes: OrbitNodeInput): OrbitNode | null;\n move(id: string, parentId: string, index?: number): OrbitNode | null;\n remove(id: string): OrbitNode | null;\n\n /** A map on screen. */\n live: LiveMap | null;\n\n /** Written for a newer version of the format, so this one could lose what it doesn't read by changing it. */\n newer: boolean;\n}\n\n/** A call that can't be carried out, with what to do instead. */\nclass CallError extends Error {}\n\n/** What a tool did, and what's worth knowing besides. */\ninterface Outcome {\n text: string;\n changed: boolean;\n}\n\n/**\n * Tools a language model calls to read and edit a map: on screen (an\n * `OrbitSVGRenderer`, such as `createOrbitMap` returns or `<orbit-map>`'s\n * `renderer`), where each change animates and fires `edit`, or a document\n * (or its markdown or YAML), which they change in place.\n */\nexport const createMapTools = (map: OrbitSVGRenderer | OrbitDocument | string, options: MapToolsOptions = {}): MapTools => {\n const target = targetOf(map);\n const readLimit = typeof options.readLimit === 'number' && Number.isFinite(options.readLimit) ? Math.max(10, Math.trunc(options.readLimit)) : READ_LIMIT;\n const specs = TOOL_SPECS.filter((spec) => (spec.name !== 'show_node' || target.live !== null) && (spec.readOnly || !options.readOnly));\n const definitions = specs.map(definitionOf);\n // Ids this session changed or removed, so a call with an id from before still finds its node, or says what happened to it.\n const renamed = new Map<string, string>();\n const removed = new Map<string, string>();\n const notes: string[] = [];\n\n /** The node an id names: a node's id, with or without its #, an id from before a rename, or a title only one node has. */\n const resolve = (root: OrbitNode, given: string, field: string): OrbitNode => {\n const id = given.trim().replace(/^#/, '');\n const direct = findNodeById(root, id);\n\n if (direct) {\n return direct;\n }\n\n let current = id;\n const seen = new Set<string>();\n\n while (renamed.has(current) && !seen.has(current)) {\n seen.add(current);\n current = renamed.get(current)!;\n }\n\n const followed = current === id ? null : findNodeById(root, current);\n\n if (followed) {\n notes.push(`#${id} is ${nameOf(followed)} now.`);\n return followed;\n }\n\n if (removed.has(id)) {\n throw new CallError(`${field} names #${id}, but \"${removed.get(id)}\" was removed.`);\n }\n\n const wanted = searchable(id);\n const titled = allNodes(root).filter((node) => searchable(node.text.trim()) === wanted || node.id === nodeSlug(id));\n\n if (titled.length === 1) {\n notes.push(`${field} takes ids: the id of \"${titled[0].text}\" is #${titled[0].id}.`);\n return titled[0];\n }\n\n if (titled.length > 1) {\n throw new CallError(`${titled.length} nodes are called \"${given}\": ${titled.map((node) => `${nameOf(node)}${node.parent ? ` under \"${node.parent.text}\"` : ''}`).join(', ')}. Give ${field} one of their ids.`);\n }\n\n const near = suggest(id, allNodes(root).map((node) => node.id));\n const nearNode = near === undefined ? null : findNodeById(root, near);\n throw new CallError(`No node has the id \"${id}\".${nearNode ? ` Did you mean ${nameOf(nearNode)}?` : ''} read_map and find_nodes give every node's id.`);\n };\n\n const calls: Record<MapToolName, (values: Record<string, unknown>, root: OrbitNode, document: OrbitDocument) => Outcome> = {\n read_map: (values, root, document) => {\n const start = typeof values.node_id === 'string' ? resolve(root, values.node_id, 'node_id') : root;\n const levels = typeof values.depth === 'number' ? values.depth : Infinity;\n const { lines, complete } = readOutline(start, levels, readLimit);\n const header: string[] = [];\n\n if (start === root) {\n const title = document.options.title ?? root.text;\n header.push(`The map \"${title}\" has ${count(1 + descendants(root), 'node')}.`);\n } else {\n const path = getNodePath(root, start.id);\n header.push(`${nameOf(start)}, in ${path.slice(0, -1).map((node) => node.text).join(' › ')}, has ${count(descendants(start), 'node')} under it.`);\n }\n\n const live = target.live;\n\n if (live) {\n const focused = live.getFocusedNode();\n header.push(live.getViewMode() === 'all' || !focused ? 'The reader is looking at the whole map.' : `The reader is looking at ${nameOf(focused)}.`);\n }\n\n const footer = complete ? [] : ['Nodes further down aren\\'t shown: read a branch with read_map and its node_id, or search with find_nodes.'];\n return { text: [header.join(' '), ...lines, ...footer].join('\\n'), changed: false };\n },\n\n find_nodes: (values, root) => {\n if (values.query === undefined && values.status === undefined && values.tag === undefined) {\n throw new CallError('find_nodes needs something to look for: query, status, tag, or more than one.');\n }\n\n return { text: findNodes(root, values as Search), changed: false };\n },\n\n read_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n return { text: nodeDetails(root, node, getNodePath(root, node.id)), changed: false };\n },\n\n add_nodes: (values, root) => {\n const parent = resolve(root, values.parent_id as string, 'parent_id');\n const nodes = readNewNodes(values.outline as string);\n const index = values.index as number | undefined;\n const added: OrbitNode[] = [];\n\n nodes.forEach((input, offset) => {\n const node = target.add(parent.id, input, index === undefined ? undefined : index + offset);\n\n if (node) {\n added.push(node);\n }\n });\n\n if (added.length === 0) {\n throw new CallError(`Nothing could be added under ${nameOf(parent)}.`);\n }\n\n for (const node of added) {\n const twin = parent.children.find((sibling) => sibling !== node && !added.includes(sibling) && searchable(sibling.text) === searchable(node.text));\n\n if (twin) {\n notes.push(`${nameOf(node)} has the same title as ${nameOf(twin)} beside it. If it's there twice by mistake, remove one with remove_node.`);\n }\n }\n\n const all = added.flatMap(allNodes);\n const long = all.filter((node) => node.text.length > LONG_TITLE);\n\n if (long.length > 0) {\n notes.push(`${long.map(nameOf).join(', ')} ${long.length === 1 ? 'has a long title' : 'have long titles'}: a few words read best on the map, with the rest in the note.`);\n }\n\n notes.push(...brokenLinks(target.document()?.root ?? root, all));\n return {\n text: [`Added ${count(all.length, 'node')} under ${nameOf(parent)}${placeOf(added, parent)}:`, ...added.flatMap((node) => outlineOf(node))].join('\\n'),\n changed: added.length > 0,\n };\n },\n\n update_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n const previousId = node.id;\n const { changes, set, cleared, absent } = readChanges(values, root, node);\n\n if (set.length === 0 && cleared.length === 0) {\n if (absent.length === 0) {\n throw new CallError(`update_node needs something to change: ${list(['text', ...ATTRIBUTES])}, or clear to remove attributes.`);\n }\n\n return { text: `${nameOf(node)} has no ${list(absent)} to remove: nothing changed.`, changed: false };\n }\n\n const updated = target.update(node.id, changes);\n\n if (!updated) {\n throw new CallError(`${nameOf(node)} couldn't be changed.`);\n }\n\n if (changes.note !== undefined) {\n notes.push(...brokenLinks(root, [updated]));\n }\n\n const described = [set.length > 0 ? `set its ${list(set)}` : '', cleared.length > 0 ? `removed its ${list(cleared)}` : ''].filter((part) => part !== '').join('; ');\n let text = `Changed ${nameOf(updated)}: ${described}.`;\n\n if (updated.id !== previousId) {\n renamed.set(previousId, updated.id);\n text += ` Its id is #${updated.id} now: it was #${previousId}.`;\n }\n\n return { text, changed: true };\n },\n\n move_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n\n if (values.parent_id === undefined && values.index === undefined) {\n throw new CallError('move_node needs where to move the node: parent_id, index, or both.');\n }\n\n const path = getNodePath(root, node.id);\n\n if (path.length < 2) {\n throw new CallError(`${nameOf(node)} is the root: it can't move, as every other node is under it.`);\n }\n\n const parent = values.parent_id === undefined ? path[path.length - 2] : resolve(root, values.parent_id as string, 'parent_id');\n\n if (parent === node) {\n throw new CallError(`${nameOf(node)} can't go under itself. Give parent_id another node.`);\n }\n\n if (getNodePath(root, parent.id).includes(node)) {\n throw new CallError(`${nameOf(node)} can't go under ${nameOf(parent)}, which is inside it. Move ${nameOf(parent)} out of it first, or choose another parent.`);\n }\n\n const under = descendants(node);\n const moved = target.move(node.id, parent.id, values.index as number | undefined);\n\n if (!moved) {\n throw new CallError(`${nameOf(node)} couldn't be moved.`);\n }\n\n return { text: `Moved ${nameOf(moved)}${under > 0 ? `, with the ${count(under, 'node')} under it,` : ''} under ${nameOf(parent)}${placeOf([moved], parent)}.`, changed: true };\n },\n\n reorder_children: (values, root) => {\n const parent = resolve(root, values.parent_id as string, 'parent_id');\n const children = [...parent.children];\n\n if (children.length === 0) {\n throw new CallError(`${nameOf(parent)} has no children to reorder.`);\n }\n\n const order = (values.order as string[]).map((given) => childNamed(parent, given));\n const twice = order.find((child, position) => order.indexOf(child) !== position);\n\n if (twice) {\n throw new CallError(`order lists ${nameOf(twice)} twice: list each child once.`);\n }\n\n const missing = children.filter((child) => !order.includes(child));\n\n if (missing.length > 0) {\n throw new CallError(`order needs all ${children.length} children of ${nameOf(parent)}, and leaves out ${missing.map(nameOf).join(', ')}.`);\n }\n\n if (order.every((child, position) => children[position] === child)) {\n return { text: `The children of ${nameOf(parent)} are in that order already.`, changed: false };\n }\n\n order.forEach((child, position) => {\n const current = findNodeById(target.document()?.root ?? root, parent.id) ?? parent;\n\n if (current.children[position]?.id !== child.id) {\n target.move(child.id, parent.id, position);\n }\n });\n\n return { text: `The children of ${nameOf(parent)} are in this order now: ${order.map(nameOf).join(', ')}.`, changed: true };\n },\n\n remove_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n\n if (node === root) {\n throw new CallError(`${nameOf(node)} is the root, and the map is all under it: it can't be removed. Remove the nodes under it one by one, or give it a new title with update_node.`);\n }\n\n const gone = allNodes(node);\n\n if (!target.remove(node.id)) {\n throw new CallError(`${nameOf(node)} couldn't be removed.`);\n }\n\n for (const each of gone) {\n removed.set(each.id, each.text);\n }\n\n return { text: `Removed ${nameOf(node)}${gone.length > 1 ? ` and the ${count(gone.length - 1, 'node')} under it` : ''}.`, changed: true };\n },\n\n show_node: (values, root) => {\n const node = resolve(root, values.node_id as string, 'node_id');\n target.live?.flyTo(node.id);\n return { text: `The map shows ${nameOf(node)} now, with its children around it.`, changed: false };\n },\n };\n\n /** The child of `parent` that `given` names. */\n const childNamed = (parent: OrbitNode, given: string): OrbitNode => {\n const id = given.trim().replace(/^#/, '');\n const child = parent.children.find((each) => each.id === id || each.id === renamed.get(id))\n ?? parent.children.find((each) => searchable(each.text.trim()) === searchable(id));\n\n if (!child) {\n throw new CallError(`${given} isn't a child of ${nameOf(parent)}. Its children: ${parent.children.map(nameOf).join(', ')}.`);\n }\n\n return child;\n };\n\n const run = (name: string, input?: unknown): MapToolResult => {\n notes.length = 0;\n const spec = TOOL_SPECS.find((each) => each.name === name);\n const offered = specs.find((each) => each.name === name);\n\n if (!offered) {\n if (spec?.name === 'show_node') {\n return failure('show_node only works on a map on screen.');\n }\n\n if (spec) {\n return failure(`${name} isn't available: this map can only be read.`);\n }\n\n const near = suggest(String(name), specs.map((each) => each.name));\n return failure(`There's no tool \"${String(name)}\".${near === undefined ? '' : ` Did you mean ${near}?`} The tools are ${list(specs.map((each) => each.name))}.`);\n }\n\n const document = target.document();\n\n if (!document) {\n return failure('There\\'s no map to read yet: it hasn\\'t been drawn.');\n }\n\n if (!offered.readOnly && target.newer) {\n return failure('This map was written for a newer version of Orbit, and changing it here could lose what this version doesn\\'t read. It can be read, but not changed.');\n }\n\n try {\n const { values, ignored } = readInput(offered.name, offered.fields, input, offered.synonyms);\n const outcome = calls[offered.name](values, document.root, document);\n\n if (ignored.length > 0) {\n notes.push(`${offered.name} doesn't take ${list(ignored.map((key) => `\"${key}\"`))}, so ${ignored.length === 1 ? 'it was' : 'they were'} left out. It takes ${list(Object.keys(offered.fields))}.`);\n }\n\n return { ok: true, text: [outcome.text, ...notes.map((note) => `Note: ${note}`)].join('\\n'), changed: outcome.changed };\n } catch (error) {\n if (error instanceof CallError || error instanceof InputError) {\n return failure(error.message, offered);\n }\n\n throw error;\n }\n };\n\n return {\n definitions,\n instructions: instructionsFor(target.live !== null, options.readOnly === true),\n for: (provider) => formatDefinitions(definitions, provider),\n run,\n get document() {\n return target.document();\n },\n };\n};\n\nconst failure = (message: string, spec?: ToolSpec): MapToolResult => {\n return { ok: false, text: spec && !spec.readOnly ? `${message} Nothing changed.` : message, changed: false };\n};\n\nconst targetOf = (map: OrbitSVGRenderer | OrbitDocument | string): Target => {\n if (isLiveMap(map)) {\n return {\n document: () => map.getDocument(),\n add: (parentId, input, index) => map.addNode(parentId, input, index),\n update: (id, changes) => map.updateNode(id, changes),\n move: (id, parentId, index) => map.moveNode(id, parentId, index),\n remove: (id) => map.removeNode(id),\n live: map,\n newer: false,\n };\n }\n\n const document = typeof map === 'string' ? parseOrbit(map) : map;\n\n if (!document || typeof document !== 'object' || !document.root || !Array.isArray(document.root.children)) {\n throw new TypeError(`createMapTools() takes a map on screen (createOrbitMap's result, or <orbit-map>'s renderer), a parsed document, or a map's markdown or YAML, but got ${map === null ? 'null' : typeof map}.`);\n }\n\n // Edits keep top-level nodes' colors, as they do on a map on screen.\n const extensions = new MapExtensions();\n const colors = (): BranchColorRules => ({ count: branchPalette(resolvePalette(document.options?.palette)).length, ownColor: (node) => extensions.color(node) });\n\n return {\n document: () => document,\n add: (parentId, input, index) => addToTree(document.root, parentId, input, index, colors())?.node ?? null,\n update: (id, changes) => updateInTree(document.root, id, changes, colors())?.node ?? null,\n move: (id, parentId, index) => moveInTree(document.root, id, parentId, index, colors())?.node ?? null,\n remove: (id) => removeFromTree(document.root, id, colors())?.node ?? null,\n live: null,\n newer: (document.diagnostics ?? []).some((diagnostic) => diagnostic.code === 'unsupported-schema-version'),\n };\n};\n\nconst isLiveMap = (map: unknown): map is LiveMap => {\n const candidate = map as Partial<LiveMap> | null;\n return typeof candidate === 'object' && candidate !== null && typeof candidate.getDocument === 'function' && typeof candidate.addNode === 'function';\n};\n\n/** The text for the system prompt. */\nconst instructionsFor = (live: boolean, readOnly: boolean): string => {\n const lines = readOnly\n ? [\n 'You can read the mind map with the map tools. Each node is an idea, with an id.',\n '- read_map shows the map as an outline, with every node\\'s id; find_nodes searches a big one, and read_node shows everything about one node, its whole note included.',\n '- Answer from what the map says, and say when it doesn\\'t say.',\n ]\n : [\n 'You can read and change the mind map with the map tools. Each node is an idea, with an id.',\n '- Read the map before you change it: read_map shows it as an outline with every node\\'s id, and find_nodes searches a big one. The other tools take those ids.',\n '- Keep titles to a few words, and put details and longer text in the note.',\n '- Write in the language the map is written in.',\n '- Add several nodes, or whole branches, with one add_nodes call.',\n '- A new title can give a node a new id: use the ids the latest results give.',\n '- Remove nodes only when asked to.',\n ];\n\n if (live) {\n lines.push(readOnly ? '- show_node takes the reader to a node.' : '- The reader sees each change on the map as you make it, and show_node takes them to a node.');\n }\n\n return lines.join('\\n');\n};\n\n/** Every node from `root` down, in reading order. */\nconst allNodes = (root: OrbitNode): OrbitNode[] => {\n return [root, ...root.children.flatMap(allNodes)];\n};\n\n/** Where `nodes`, siblings in a row, are among their parent's children, as a result says it: after the one before them, or first. */\nconst placeOf = (nodes: OrbitNode[], parent: OrbitNode): string => {\n const first = parent.children.indexOf(nodes[0]);\n const last = parent.children.indexOf(nodes[nodes.length - 1]);\n\n if (first > 0) {\n return `, after ${nameOf(parent.children[first - 1])}`;\n }\n\n if (first === 0 && last < parent.children.length - 1) {\n return `, first, before ${nameOf(parent.children[last + 1])}`;\n }\n\n return '';\n};\n\n/** The `#id` links of `nodes` that point at no node, with the id they probably meant. */\nconst brokenLinks = (root: OrbitNode, nodes: OrbitNode[]): string[] => {\n const index = indexNodes(root);\n const ids = [...index.keys()];\n\n return nodes.flatMap((node) => nodeLinksOf(node)\n .filter((href) => !findIndexedLinkedNode(index, href))\n .map((href) => {\n const near = suggest(href.slice(1), ids);\n return `${nameOf(node)} links to ${href}, but no node has that id.${near === undefined ? '' : ` Did you mean #${near}?`}`;\n }));\n};\n\n/**\n * The nodes an outline lists, read as orbit-md: a list, headings, or lines\n * of plain text, a node each. An outline that doesn't read cleanly, such as\n * a misspelled attribute, adds nothing: the error says what to fix.\n */\nconst readNewNodes = (outline: string): OrbitNewNode[] => {\n let source = outline.replace(/\\r\\n?/g, '\\n');\n\n if (/^\\s*---\\s*\\n/.test(source)) {\n throw new CallError('outline takes the nodes to add as a markdown list, without frontmatter.');\n }\n\n let document = parseOrbitMarkdown(source);\n\n if (document.diagnostics.some((diagnostic) => diagnostic.code === 'no-structure')) {\n source = source.split('\\n').map((line) => line.trim()).filter((line) => line !== '').map((line) => `- ${line}`).join('\\n');\n document = parseOrbitMarkdown(source);\n }\n\n const roots = document.diagnostics.some((diagnostic) => diagnostic.code === 'synthetic-root') ? document.root.children : [document.root];\n const untitled = roots.flatMap(allNodes).find((node) => node.text.trim() === '');\n\n if (roots.length === 0 || untitled) {\n throw new CallError(untitled?.source\n ? `Line ${untitled.source.line} of outline has an item without a title.`\n : 'outline has no nodes: write them as a markdown list, like \"- Social media\\\\n- Newsletter\".');\n }\n\n // Nothing is kept from an outline with problems, so the parser's \"kept as written\" doesn't apply.\n const problems = document.diagnostics\n .filter((diagnostic) => !OUTLINE_CODES_LEFT_OUT.has(diagnostic.code))\n .map((diagnostic) => formatDiagnostic(diagnostic).replace(/[,;] kept as (?:a custom attribute|written)(?:, but not used)?/, ''));\n\n if (problems.length > 0) {\n throw new CallError(`outline doesn't read cleanly. Fix ${problems.length === 1 ? 'this' : 'these'}, and send it again:\\n${problems.map((problem) => `- ${problem}`).join('\\n')}\\nLines count from the outline's first line.`);\n }\n\n return roots.map(newNodeFrom);\n};\n\n/** What update_node changes: the changes, checked; what they set and remove; and what they'd remove that isn't there. */\ninterface Changes {\n changes: OrbitNodeInput;\n set: string[];\n cleared: string[];\n absent: string[];\n}\n\n/** The changes update_node asks for, checked. */\nconst readChanges = (values: Record<string, unknown>, root: OrbitNode, node: OrbitNode): Changes => {\n const changes: OrbitNodeInput = {};\n const set: string[] = [];\n const clear = new Set((values.clear as ToolAttribute[] | undefined) ?? []);\n const cleared: string[] = [];\n const absent: string[] = [];\n\n const remove = (name: ToolAttribute) => {\n if (node[name] === undefined) {\n absent.push(name);\n return;\n }\n\n (changes as Record<string, unknown>)[name] = undefined;\n cleared.push(name);\n };\n\n for (const name of clear) {\n if (values[name] !== undefined) {\n throw new CallError(`${name} is both given and in clear: give it a value, or clear it.`);\n }\n\n remove(name);\n }\n\n if (values.text !== undefined) {\n let text = String(values.text).replace(/\\s+/g, ' ').trim();\n\n if (text === '') {\n throw new CallError('text can\\'t be empty: every node has a title. To take the node out of the map, use remove_node.');\n }\n\n const emoji = leadingEmoji(text);\n\n if (emoji && values.icon === undefined && !clear.has('icon')) {\n // Saved, the map would read the emoji back as the node's icon.\n changes.icon = emoji.icon;\n text = emoji.text;\n set.push('icon');\n }\n\n changes.text = text;\n set.push('title');\n }\n\n const text = (name: 'note' | 'status' | 'icon' | 'color' | 'link'): string | undefined => {\n const value = values[name];\n\n if (value === undefined) {\n return undefined;\n }\n\n const written = name === 'note' ? String(value).trim() : String(value).replace(/\\s+/g, ' ').trim();\n\n if (written === '') {\n remove(name);\n return undefined;\n }\n\n set.push(name);\n return written;\n };\n\n const note = text('note');\n\n if (note !== undefined) {\n changes.note = note;\n }\n\n const status = text('status');\n\n if (status !== undefined) {\n changes.status = status;\n }\n\n if (values.priority !== undefined) {\n changes.priority = values.priority as number;\n set.push('priority');\n }\n\n if (values.tags !== undefined) {\n const tags = [...new Set((values.tags as string[]).map((tag) => tag.replace(/^#/, '').trim()).filter((tag) => tag !== ''))];\n\n if (tags.length === 0) {\n remove('tags');\n } else {\n changes.tags = tags;\n set.push('tags');\n }\n }\n\n const icon = text('icon');\n\n if (icon !== undefined) {\n if (/^[\\p{L}\\p{N}][\\p{L}\\p{N}\\s'-]+$/u.test(icon) || Array.from(icon).length > 8) {\n throw new CallError(`icon takes an emoji, such as 🚀, not ${JSON.stringify(icon)}.`);\n }\n\n changes.icon = icon;\n }\n\n const color = text('color');\n\n if (color !== undefined) {\n const supports = typeof CSS !== 'undefined' && typeof CSS.supports === 'function' ? CSS.supports('color', color) : true;\n\n if (!COLOR_SYNTAX.test(color) || !supports) {\n throw new CallError(`\"${color}\" isn't a CSS color. Use a color name, such as tomato, or a code, such as #E8A33D.`);\n }\n\n changes.color = color;\n }\n\n const link = text('link');\n\n if (link !== undefined) {\n if (isNodeLink(link)) {\n if (!findLinkedNode(root, link)) {\n const near = suggest(link.slice(1), allNodes(root).map((each) => each.id));\n throw new CallError(`link ${link} points at no node.${near === undefined ? '' : ` Did you mean #${near}?`} Node links are # and a node's id.`);\n }\n } else if (guardUrl(link, 'link', false) === null) {\n throw new CallError(`\"${link}\" isn't an address the map can open: use a web address, such as https://example.com.`);\n }\n\n changes.link = link;\n }\n\n for (const name of ['image', 'video', 'embed'] as const) {\n const media = values[name] as Record<string, string> | undefined;\n\n if (media === undefined) {\n continue;\n }\n\n const src = media.src.trim();\n\n if (src === '') {\n remove(name);\n continue;\n }\n\n if (guardUrl(src, name, false) === null) {\n throw new CallError(`${name} can't show \"${src}\": use a web address, such as https://example.com/${name === 'image' ? 'photo.jpg' : name === 'video' ? 'video.mp4' : 'page'}.`);\n }\n\n const extras = Object.fromEntries(Object.entries(media).filter(([key, value]) => key !== 'src' && value.trim() !== '').map(([key, value]) => [key, value.trim()]));\n (changes as Record<string, unknown>)[name] = { src, ...extras };\n set.push(name === 'image' ? 'picture' : name === 'embed' ? 'embedded page' : 'video');\n }\n\n if (values.collapsed !== undefined) {\n if (values.collapsed === true) {\n changes.collapsed = true;\n set.push('collapsed');\n } else {\n remove('collapsed');\n }\n }\n\n return { changes, set, cleared, absent };\n};\n",
13
+ "/**\n * Other apps' icons and markers, as Orbit says the same thing: an emoji for\n * the idea's icon, a priority, or a status. An icon with no meaning here\n * returns null, and the reader warns that it was left out.\n */\n\nexport type IconMeaning = { icon: string } | { priority: number } | { status: string };\n\n/** FreeMind's and Freeplane's built-in icons, by name. */\nconst FREEMIND_ICONS = new Map<string, string>(Object.entries({\n idea: '💡', help: '❓', yes: '❗', messagebox_warning: '⚠️', info: 'ℹ️', 'stop-sign': '🛑', closed: '⛔',\n button_ok: '✅', button_cancel: '❌', stop: '🔴', prepare: '🟡', go: '🟢',\n back: '⬅️', forward: '➡️', up: '⬆️', down: '⬇️', attach: '📎', ksmiletris: '🙂', 'smiley-neutral': '😐', 'smiley-oh': '😮',\n 'smiley-angry': '😠', smily_bad: '😞', clanbomber: '💣', desktop_new: '📌', flag: '🚩', 'flag-black': '🏴', 'flag-blue': '🚩',\n 'flag-green': '🚩', 'flag-orange': '🚩', 'flag-pink': '🚩', 'flag-yellow': '🚩', gohome: '🏠', folder: '📁', korn: '📫', Mail: '✉️',\n kmail: '📧', list: '📋', edit: '✏️', pencil: '✏️', kaddressbook: '☎️', knotify: '🎵', password: '🔑', encrypted: '🔒', decrypted: '🔓',\n wizard: '🪄', xmag: '🔍', bell: '🔔', bookmark: '🔖', penguin: '🐧', licq: '🌸', freemind_butterfly: '🦋', 'broken-line': '💔',\n calendar: '📅', clock: '⏰', hourglass: '⏳', launch: '🚀', family: '👪', female1: '👩', female2: '👩', male1: '👨', male2: '👨',\n fema: '👫', group: '👥', bee: '🐝', mindmap: '🗺️', unchecked: '⬜', checked: '✅',\n}));\n\n/** Freeplane's progress icons, as statuses. */\nconst FREEMIND_PROGRESS = new Map<string, string>(Object.entries({ '0%': 'todo', '25%': 'active', '50%': 'active', '75%': 'active', '100%': 'done', checked: 'done', unchecked: 'todo' }));\n\n/** A FreeMind or Freeplane icon's meaning: `full-3` is priority 3, `100%` done, `emoji-1F680` 🚀. */\nexport const freeMindIcon = (name: string): IconMeaning | null => {\n const priority = /^full-(\\d)$/.exec(name);\n\n if (priority) {\n return { priority: Number(priority[1]) };\n }\n\n const progress = FREEMIND_PROGRESS.get(name);\n\n if (progress) {\n return { status: progress };\n }\n\n const emoji = /^emoji-([0-9A-Fa-f]{2,6}(?:-[0-9A-Fa-f]{2,6})*)$/.exec(name);\n\n if (emoji) {\n const codes = emoji[1].split('-').map((code) => parseInt(code, 16));\n\n if (codes.every((code) => code > 0 && code <= 0x10ffff)) {\n return { icon: String.fromCodePoint(...codes) };\n }\n }\n\n const icon = FREEMIND_ICONS.get(name);\n return icon ? { icon } : null;\n};\n\n/** XMind's markers, by the name after their family: `smiley-laugh`, `arrow-up`. */\nconst XMIND_MARKERS = new Map<string, string>(Object.entries({\n 'smiley-smile': '🙂', 'smiley-laugh': '😄', 'smiley-angry': '😠', 'smiley-cry': '😢', 'smiley-surprise': '😮', 'smiley-boring': '😐',\n 'arrow-up': '⬆️', 'arrow-down': '⬇️', 'arrow-left': '⬅️', 'arrow-right': '➡️', 'arrow-up-right': '↗️', 'arrow-down-right': '↘️',\n 'arrow-down-left': '↙️', 'arrow-up-left': '↖️', 'arrow-refresh': '🔄',\n 'symbol-plus': '➕', 'symbol-minus': '➖', 'symbol-question': '❓', 'symbol-exclam': '❗', 'symbol-info': 'ℹ️', 'symbol-wrong': '❌',\n 'symbol-right': '✅', 'symbol-attention': '⚠️', 'symbol-code': '💻', 'symbol-pin': '📌', 'symbol-heart': '❤️', 'symbol-star': '⭐',\n 'other-calendar': '📅', 'other-email': '✉️', 'other-phone': '☎️', 'other-question': '❓', 'other-exclam': '❗', 'other-lightbulb': '💡',\n 'other-clock': '⏰', 'other-people': '👥', 'other-money': '💰', 'other-books': '📚', 'other-music': '🎵', 'other-yes': '👍', 'other-no': '👎',\n 'other-hourglass': '⏳', 'other-flag': '🚩', 'other-star': '⭐', 'other-coffee-cup': '☕', 'other-bomb': '💣', 'other-mic': '🎤',\n 'other-phone-call': '📞', 'other-map': '🗺️', 'other-code': '💻', 'other-search': '🔍', 'other-dollar': '💵', 'other-heart': '❤️',\n c_symbol_like: '👍', c_symbol_dislike: '👎', c_symbol_heart: '❤️', c_symbol_star: '⭐', c_symbol_question: '❓', c_symbol_exclam: '❗',\n c_symbol_pin: '📌', c_symbol_idea: '💡', c_symbol_check: '✅', c_symbol_cross: '❌', c_symbol_fire: '🔥', c_symbol_trophy: '🏆',\n}));\n\n/** Marker families whose every color shows the same emoji. */\nconst XMIND_FAMILIES = new Map<string, string>(Object.entries({\n flag: '🚩', star: '⭐', people: '👤', tag: '🏷️', month: '📅', week: '📅', 'half-star': '⭐',\n}));\n\nconst XMIND_TASKS = new Map<string, string>(Object.entries({\n 'task-start': 'todo', 'task-oct': 'active', 'task-quarter': 'active', 'task-3oct': 'active', 'task-half': 'active', 'task-5oct': 'active',\n 'task-3quar': 'active', 'task-7oct': 'active', 'task-done': 'done', 'task-pause': 'paused',\n}));\n\n/** An XMind marker's meaning: `priority-2` is priority 2, `task-done` done, `flag-red` 🚩. */\nexport const xmindMarker = (markerId: string): IconMeaning | null => {\n const priority = /^priority-(\\d)$/.exec(markerId);\n\n if (priority) {\n return { priority: Number(priority[1]) };\n }\n\n const status = XMIND_TASKS.get(markerId);\n\n if (status) {\n return { status };\n }\n\n const icon = XMIND_MARKERS.get(markerId);\n\n if (icon) {\n return { icon };\n }\n\n const family = [...XMIND_FAMILIES.keys()].sort((first, second) => second.length - first.length).find((name) => markerId.startsWith(`${name}-`));\n return family ? { icon: XMIND_FAMILIES.get(family) as string } : null;\n};\n",
14
+ "/**\n * A small XML reader for other apps' map files, and a forgiving reader for\n * the HTML in their notes. Neither loads anything a file points to: XML\n * reads its five entities and numeric references only, HTML adds a fixed\n * table of common named ones, a DOCTYPE is skipped without reading what it\n * declares, and the size of the input and the depth of nesting are capped.\n */\n\nexport interface MarkupElement {\n /** The element's name as written, with its prefix: `xhtml:p`. */\n name: string;\n\n /** The name without a prefix, lowercased in HTML: `p`. */\n localName: string;\n\n /** Attributes by name as written, values decoded. */\n attributes: Record<string, string>;\n\n children: MarkupNode[];\n}\n\n/** An element, or text. */\nexport type MarkupNode = MarkupElement | string;\n\n/** A file that isn't well-formed XML, or too big or too deep to read. */\nexport class MarkupError extends Error {\n /** The 1-based line of the problem. */\n readonly line: number;\n\n constructor(message: string, line: number) {\n super(`${message} (line ${line})`);\n this.name = 'MarkupError';\n this.line = line;\n }\n}\n\n/** The most characters a file may have: far beyond any map, short of exhausting memory. */\nexport const MAX_MARKUP_LENGTH = 64 * 1024 * 1024;\n\n/** The deepest nesting read: deeper files are refused rather than risking the stack. */\nexport const MAX_MARKUP_DEPTH = 1000;\n\nconst XML_ENTITIES: Record<string, string> = { lt: '<', gt: '>', amp: '&', quot: '\"', apos: \"'\" };\n\n/** Named character references HTML notes use beyond XML's five. */\nconst HTML_ENTITIES: Record<string, string> = {\n ...XML_ENTITIES,\n nbsp: '\\u00a0', copy: '©', reg: '®', trade: '™', hellip: '…', mdash: '—', ndash: '–', lsquo: '‘', rsquo: '’', ldquo: '“', rdquo: '”',\n laquo: '«', raquo: '»', bull: '•', middot: '·', deg: '°', plusmn: '±', times: '×', divide: '÷', euro: '€', pound: '£', yen: '¥', cent: '¢',\n sect: '§', para: '¶', iexcl: '¡', iquest: '¿', ordf: 'ª', ordm: 'º', acute: '´', uml: '¨', shy: '\\u00ad', frac12: '½', frac14: '¼', frac34: '¾',\n sup1: '¹', sup2: '²', sup3: '³', micro: 'µ', larr: '←', rarr: '→', uarr: '↑', darr: '↓', harr: '↔', rArr: '⇒', lArr: '⇐', hArr: '⇔',\n aacute: 'á', eacute: 'é', iacute: 'í', oacute: 'ó', uacute: 'ú', yacute: 'ý', Aacute: 'Á', Eacute: 'É', Iacute: 'Í', Oacute: 'Ó', Uacute: 'Ú', Yacute: 'Ý',\n agrave: 'à', egrave: 'è', igrave: 'ì', ograve: 'ò', ugrave: 'ù', Agrave: 'À', Egrave: 'È', Igrave: 'Ì', Ograve: 'Ò', Ugrave: 'Ù',\n acirc: 'â', ecirc: 'ê', icirc: 'î', ocirc: 'ô', ucirc: 'û', Acirc: 'Â', Ecirc: 'Ê', Icirc: 'Î', Ocirc: 'Ô', Ucirc: 'Û',\n auml: 'ä', euml: 'ë', iuml: 'ï', ouml: 'ö', uuml: 'ü', yuml: 'ÿ', Auml: 'Ä', Euml: 'Ë', Iuml: 'Ï', Ouml: 'Ö', Uuml: 'Ü',\n atilde: 'ã', otilde: 'õ', ntilde: 'ñ', Atilde: 'Ã', Otilde: 'Õ', Ntilde: 'Ñ', ccedil: 'ç', Ccedil: 'Ç', aring: 'å', Aring: 'Å',\n aelig: 'æ', AElig: 'Æ', oslash: 'ø', Oslash: 'Ø', szlig: 'ß', thorn: 'þ', THORN: 'Þ', eth: 'ð', ETH: 'Ð', oelig: 'œ', OElig: 'Œ',\n};\n\n/** Elements HTML never closes. */\nconst VOID_ELEMENTS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);\n\n/** Elements whose content is code to run or styles, not text to keep. */\nconst RAW_TEXT_ELEMENTS = new Set(['script', 'style']);\n\nconst NAME = /^[^\\s/>=]+/;\nconst ATTRIBUTE = /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/y;\n\ninterface ReadingMode {\n html: boolean;\n}\n\n/**\n * An XML file's bytes as text, in the encoding its byte order mark or its\n * declaration names (UTF-8 when neither does). Old OPML files are often\n * ISO-8859-1. A file that isn't valid UTF-8 and names no encoding is read as\n * Windows-1252, which every byte is.\n */\nexport const decodeMarkup = (bytes: Uint8Array): string => {\n if (bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n return new TextDecoder('utf-8').decode(bytes.subarray(3));\n }\n\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n return new TextDecoder('utf-16le').decode(bytes.subarray(2));\n }\n\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n return new TextDecoder('utf-16be').decode(bytes.subarray(2));\n }\n\n // UTF-16 without a byte order mark still starts \"<?xml\": every other byte is zero.\n if (bytes[0] === 0x3c && bytes[1] === 0x00) {\n return new TextDecoder('utf-16le').decode(bytes);\n }\n\n if (bytes[0] === 0x00 && bytes[1] === 0x3c) {\n return new TextDecoder('utf-16be').decode(bytes);\n }\n\n const start = String.fromCharCode(...bytes.subarray(0, 200));\n const declared = /^\\s*<\\?xml[^>]*\\bencoding\\s*=\\s*[\"']([A-Za-z0-9._:-]+)[\"']/.exec(start)?.[1];\n\n if (declared && !/^utf-?8$/i.test(declared)) {\n try {\n return new TextDecoder(declared).decode(bytes);\n } catch {\n // An encoding this browser can't decode: read the file as UTF-8 below.\n }\n }\n\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n return new TextDecoder(declared ? 'utf-8' : 'windows-1252').decode(bytes);\n }\n};\n\n/**\n * The document element of an XML file. Throws a `MarkupError` for a file\n * that isn't well-formed, so a damaged map is refused rather than read in part.\n */\nexport const parseXml = (text: string): MarkupElement => {\n const root = readMarkup(text, { html: false });\n const elements = root.children.filter(isElement);\n\n if (elements.length !== 1) {\n throw new MarkupError(elements.length === 0 ? 'No element in the file' : 'More than one top element', 1);\n }\n\n return elements[0];\n};\n\n/** A piece of HTML, as the children of an element named `#fragment`. Never throws for markup it can read some way. */\nexport const parseHtml = (text: string): MarkupElement => {\n return readMarkup(text, { html: true });\n};\n\nexport const isElement = (node: MarkupNode): node is MarkupElement => {\n return typeof node !== 'string';\n};\n\n/** The element's child elements, all of them or those with one local name. */\nexport const childElements = (element: MarkupElement, localName?: string): MarkupElement[] => {\n return element.children.filter((child): child is MarkupElement => isElement(child) && (localName === undefined || child.localName === localName));\n};\n\n/** The element's first child element with this local name. */\nexport const childElement = (element: MarkupElement, localName: string): MarkupElement | undefined => {\n return element.children.find((child): child is MarkupElement => isElement(child) && child.localName === localName);\n};\n\n/** An attribute by its name without a prefix: `href` finds `xlink:href`. */\nexport const attributeOf = (element: MarkupElement, localName: string): string | undefined => {\n if (Object.prototype.hasOwnProperty.call(element.attributes, localName)) {\n return element.attributes[localName];\n }\n\n for (const [name, value] of Object.entries(element.attributes)) {\n if (localPart(name) === localName) {\n return value;\n }\n }\n\n return undefined;\n};\n\n/** All the text inside an element, as written. */\nexport const textContent = (node: MarkupNode): string => {\n if (!isElement(node)) {\n return node;\n }\n\n let text = '';\n const pending: MarkupNode[] = [node];\n\n while (pending.length > 0) {\n const next = pending.pop() as MarkupNode;\n\n if (isElement(next)) {\n for (let index = next.children.length - 1; index >= 0; index--) {\n pending.push(next.children[index]);\n }\n } else {\n text += next;\n }\n }\n\n return text;\n};\n\nconst localPart = (name: string): string => {\n const colon = name.indexOf(':');\n return colon === -1 ? name : name.slice(colon + 1);\n};\n\nconst lineAt = (text: string, index: number): number => {\n let line = 1;\n\n for (let position = text.indexOf('\\n'); position !== -1 && position < index; position = text.indexOf('\\n', position + 1)) {\n line += 1;\n }\n\n return line;\n};\n\nconst readMarkup = (input: string, mode: ReadingMode): MarkupElement => {\n if (input.length > MAX_MARKUP_LENGTH) {\n throw new MarkupError(`The file is larger than ${MAX_MARKUP_LENGTH / 1024 / 1024} MB of text`, 1);\n }\n\n // XML reads every line break as a line feed.\n const text = input.replace(/^\\ufeff/, '').replace(/\\r\\n?/g, '\\n');\n const fragment: MarkupElement = { name: '#fragment', localName: '#fragment', attributes: {}, children: [] };\n const open: MarkupElement[] = [fragment];\n const entities = mode.html ? HTML_ENTITIES : XML_ENTITIES;\n let index = 0;\n\n const fail = (message: string, at: number): never => {\n throw new MarkupError(message, lineAt(text, at));\n };\n\n const current = (): MarkupElement => open[open.length - 1];\n\n const addText = (value: string): void => {\n if (value === '') {\n return;\n }\n\n const children = current().children;\n const last = children.length - 1;\n\n if (last >= 0 && typeof children[last] === 'string') {\n children[last] = (children[last] as string) + value;\n } else {\n children.push(value);\n }\n };\n\n while (index < text.length) {\n const tag = text.indexOf('<', index);\n\n if (tag === -1) {\n addText(decodeEntities(text.slice(index), entities));\n break;\n }\n\n if (tag > index) {\n addText(decodeEntities(text.slice(index, tag), entities));\n }\n\n index = tag;\n\n if (text.startsWith('<!--', index)) {\n const end = text.indexOf('-->', index + 4);\n\n if (end === -1) {\n if (mode.html) {\n break;\n }\n\n fail('A comment that never ends', index);\n }\n\n index = end + 3;\n continue;\n }\n\n if (text.startsWith('<![CDATA[', index)) {\n const end = text.indexOf(']]>', index + 9);\n\n if (end === -1) {\n fail('A CDATA section that never ends', index);\n }\n\n addText(text.slice(index + 9, end));\n index = end + 3;\n continue;\n }\n\n if (text.startsWith('<?', index)) {\n const end = text.indexOf('?>', index + 2);\n\n if (end === -1) {\n fail('A processing instruction that never ends', index);\n }\n\n index = end + 2;\n continue;\n }\n\n if (text.startsWith('<!', index)) {\n // A DOCTYPE, its internal subset included: skipped, never read.\n index = skipDeclaration(text, index, fail);\n continue;\n }\n\n if (text.startsWith('</', index)) {\n const end = text.indexOf('>', index + 2);\n\n if (end === -1) {\n fail('An end tag that never closes', index);\n }\n\n const name = text.slice(index + 2, end).trim();\n closeElement(open, name, mode, () => fail(`</${name}> doesn't match <${current().name}>`, index));\n index = end + 1;\n continue;\n }\n\n const nameMatch = NAME.exec(text.slice(index + 1, index + 257));\n\n if (!nameMatch || !/^[\\p{L}_:]/u.test(nameMatch[0])) {\n if (mode.html) {\n // A lone \"<\" in HTML is text.\n addText('<');\n index += 1;\n continue;\n }\n\n fail('A \"<\" that starts no tag', index);\n }\n\n const name = (nameMatch as RegExpExecArray)[0];\n const [attributes, afterAttributes, selfClosing] = readAttributes(text, index + 1 + name.length, entities, mode, fail);\n const localName = mode.html ? localPart(name).toLowerCase() : localPart(name);\n const element: MarkupElement = { name, localName, attributes, children: [] };\n current().children.push(element);\n index = afterAttributes;\n\n if (mode.html && RAW_TEXT_ELEMENTS.has(localName)) {\n // Code and styles are left out, up to their end tag.\n const end = text.toLowerCase().indexOf(`</${localName}`, index);\n index = end === -1 ? text.length : text.indexOf('>', end) + 1 || text.length;\n continue;\n }\n\n if (selfClosing || (mode.html && VOID_ELEMENTS.has(localName))) {\n continue;\n }\n\n if (open.length > MAX_MARKUP_DEPTH) {\n fail(`Elements nested more than ${MAX_MARKUP_DEPTH} deep`, index);\n }\n\n open.push(element);\n }\n\n if (!mode.html && open.length > 1) {\n fail(`<${current().name}> is never closed`, text.length);\n }\n\n return fragment;\n};\n\n/** Reads a tag's attributes up to its `>`: the attributes, where the tag ends, and whether it closed itself. */\nconst readAttributes = (\n text: string,\n start: number,\n entities: Record<string, string>,\n mode: ReadingMode,\n fail: (message: string, at: number) => never,\n): [Record<string, string>, number, boolean] => {\n const attributes: Record<string, string> = {};\n let index = start;\n\n while (index < text.length) {\n while (index < text.length && /\\s/.test(text[index])) {\n index += 1;\n }\n\n if (text[index] === '>') {\n return [attributes, index + 1, false];\n }\n\n if (text.startsWith('/>', index)) {\n return [attributes, index + 2, true];\n }\n\n if (text[index] === '/') {\n index += 1;\n continue;\n }\n\n ATTRIBUTE.lastIndex = index;\n const match = ATTRIBUTE.exec(text);\n\n if (!match || match[0].length === 0) {\n fail('A tag that never closes', start);\n }\n\n const [whole, name, doubleQuoted, singleQuoted, unquoted] = match as RegExpExecArray;\n\n if (unquoted !== undefined && !mode.html) {\n fail(`The value of ${name} has no quotes`, index);\n }\n\n const raw = doubleQuoted ?? singleQuoted ?? unquoted ?? '';\n // XML reads tabs and line breaks written in a value as spaces; &#10; stays a line break.\n attributes[name] = decodeEntities(mode.html ? raw : raw.replace(/[\\t\\n]/g, ' '), entities);\n index += whole.length;\n }\n\n return fail('A tag that never closes', start);\n};\n\nconst skipDeclaration = (text: string, start: number, fail: (message: string, at: number) => never): number => {\n let depth = 0;\n let quote: string | null = null;\n\n for (let index = start + 2; index < text.length; index++) {\n const character = text[index];\n\n if (quote) {\n if (character === quote) {\n quote = null;\n }\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '[') {\n depth += 1;\n } else if (character === ']') {\n depth -= 1;\n } else if (character === '>' && depth <= 0) {\n return index + 1;\n }\n }\n\n return fail('A declaration that never ends', start);\n};\n\nconst closeElement = (open: MarkupElement[], name: string, mode: ReadingMode, mismatch: () => never): void => {\n const top = open[open.length - 1];\n\n if (open.length > 1 && (top.name === name || (mode.html && top.localName === localPart(name).toLowerCase()))) {\n open.pop();\n return;\n }\n\n if (!mode.html) {\n mismatch();\n }\n\n // HTML closes what's open up to the element the end tag names, and ignores one that names none.\n const wanted = localPart(name).toLowerCase();\n\n for (let depth = open.length - 1; depth > 0; depth--) {\n if (open[depth].localName === wanted) {\n open.length = depth;\n return;\n }\n }\n};\n\n/** Text with its character references read: numeric ones, and the named ones in `entities`; any other stays as written. */\nconst decodeEntities = (text: string, entities: Record<string, string>): string => {\n if (!text.includes('&')) {\n return text;\n }\n\n return text.replace(/&(#[xX][0-9a-fA-F]{1,6}|#[0-9]{1,7}|[A-Za-z][A-Za-z0-9]{1,31});/g, (whole, reference: string) => {\n if (reference.startsWith('#')) {\n const code = reference[1] === 'x' || reference[1] === 'X' ? parseInt(reference.slice(2), 16) : parseInt(reference.slice(1), 10);\n return code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff) ? String.fromCodePoint(code) : whole;\n }\n\n return Object.prototype.hasOwnProperty.call(entities, reference) ? entities[reference] : whole;\n });\n};\n",
15
+ "/**\n * Notes and titles from other apps. HTML notes become markdown (paragraphs,\n * headings, lists, quotes, code, bold, italic, strikethrough, links and\n * pictures), never HTML. When markdown would show the note's text any other\n * way (a `*` or `_` in it, a line that starts like a list), the note is kept\n * as plain text instead, exactly as written: formatting can be lost, words\n * never are.\n */\n\nimport { childElements, isElement, parseHtml, textContent, type MarkupElement, type MarkupNode } from './markup.js';\n\n/** A note as Orbit keeps it. */\nexport interface ImportedNote {\n text: string;\n format: 'markdown' | 'plain';\n}\n\n/** Inline content, as the note's reader shows it. */\nexport type NoteInline =\n | { kind: 'text'; text: string }\n | { kind: 'break' }\n | { kind: 'strong' | 'emphasis' | 'strike'; children: NoteInline[] }\n | { kind: 'code'; text: string }\n | { kind: 'link'; href: string; children: NoteInline[] }\n | { kind: 'image'; src: string; alt: string };\n\n/** A block of a note. */\nexport type NoteBlock =\n | { kind: 'paragraph'; inline: NoteInline[] }\n | { kind: 'heading'; level: number; inline: NoteInline[] }\n | { kind: 'list'; ordered: boolean; items: NoteBlock[][] }\n | { kind: 'quote'; blocks: NoteBlock[] }\n | { kind: 'code'; text: string };\n\n/** How addresses in a note are kept. */\nexport interface NoteAddresses {\n /** The address a link keeps, or null for its text alone. Default: web and mail addresses, and `#` links. */\n link?: (href: string) => string | null;\n\n /** The address a picture keeps, or null for its description alone. Default: web addresses. */\n picture?: (src: string) => string | null;\n}\n\nconst BLOCK_CONTAINERS = new Set([\n 'html', 'body', 'div', 'p', 'section', 'article', 'header', 'footer', 'main', 'aside', 'nav', 'center', 'figure', 'figcaption',\n 'address', 'details', 'summary', 'dl', 'dt', 'dd', 'form', 'fieldset', 'tbody', 'thead', 'tfoot', 'caption', '#fragment',\n]);\nconst SKIPPED = new Set(['head', 'title', 'script', 'style', 'meta', 'link', 'template', 'object', 'iframe', 'svg', 'math']);\nconst HEADINGS = new Map<string, number>([['h1', 1], ['h2', 2], ['h3', 3], ['h4', 4], ['h5', 5], ['h6', 6]]);\nconst INLINE_KINDS = new Map<string, 'strong' | 'emphasis' | 'strike'>([\n ['strong', 'strong'], ['b', 'strong'], ['em', 'emphasis'], ['i', 'emphasis'], ['cite', 'emphasis'], ['s', 'strike'], ['strike', 'strike'], ['del', 'strike'],\n]);\nconst CODE_ELEMENTS = new Set(['code', 'tt', 'kbd', 'samp', 'var']);\n\n/** Web and mail addresses, and links within the map. */\nexport const isKeptLink = (href: string): boolean => {\n return /^(https?:\\/\\/|mailto:)\\S+$/i.test(href) || /^#\\S+$/.test(href);\n};\n\n/** An address as a link keeps it: `www.example.com` is a web address; a file or anything else is null. */\nexport const keptAddress = (href: string): string | null => {\n const address = href.trim();\n\n if (/^www\\.[^\\s/]+\\.\\S+$/i.test(address)) {\n return `https://${address}`;\n }\n\n return isKeptLink(address) ? address : null;\n};\n\nconst isWebAddress = (src: string): boolean => {\n return /^https?:\\/\\/\\S+$/i.test(src);\n};\n\n/** An HTML note (an element, or HTML as text) as an Orbit note; undefined when it holds no text. */\nexport const noteFromHtml = (html: MarkupElement | string, addresses: NoteAddresses = {}): ImportedNote | undefined => {\n const element = typeof html === 'string' ? parseHtml(html) : html;\n return noteFromBlocks(readBlocks(element.children, addresses), addresses);\n};\n\n/** A plain text note: markdown when it reads the same as markdown, otherwise plain, as written. */\nexport const noteFromPlainText = (text: string | undefined): ImportedNote | undefined => {\n const cleaned = (text ?? '')\n .replace(/\\r\\n?/g, '\\n')\n .split('\\n')\n .map((line) => line.replace(/[ \\t]+$/, ''))\n .join('\\n')\n .replace(/^\\n+|\\n+$/g, '');\n\n if (cleaned.trim() === '') {\n return undefined;\n }\n\n const paragraphs = cleaned.split(/\\n{2,}/);\n const readsTheSame = paragraphs.every((paragraph) => !paragraph.includes('\\n') && isInertText(paragraph) && isInertLineStart(paragraph));\n return { text: cleaned, format: readsTheSame ? 'markdown' : 'plain' };\n};\n\n/** Blocks as a note: markdown when every word reads back as written, otherwise plain text. */\nexport const noteFromBlocks = (blocks: NoteBlock[], addresses: NoteAddresses = {}): ImportedNote | undefined => {\n const kept = blocks.filter((block) => !isEmptyBlock(block));\n\n if (kept.length === 0) {\n return undefined;\n }\n\n const writer = new MarkdownWriter(addresses);\n const markdown = writer.blocks(kept);\n\n if (writer.inert && markdown.trim() !== '') {\n return { text: markdown, format: 'markdown' };\n }\n\n const plain = plainBlocks(kept).trim();\n return plain === '' ? undefined : { text: plain, format: 'plain' };\n};\n\n/** Two or more notes as one: markdown if all are, otherwise plain text, separated by blank lines. */\nexport const joinNotes = (notes: (ImportedNote | undefined)[]): ImportedNote | undefined => {\n const present = notes.filter((note): note is ImportedNote => note !== undefined && note.text.trim() !== '');\n\n if (present.length <= 1) {\n return present[0];\n }\n\n return {\n text: present.map((note) => note.text).join('\\n\\n'),\n format: present.every((note) => note.format === 'markdown') ? 'markdown' : 'plain',\n };\n};\n\n/** A title from HTML: what a reader sees, on one line, and the address of its first link. */\nexport const titleFromHtml = (html: MarkupElement | string): { text: string; link?: string } => {\n const element = typeof html === 'string' ? parseHtml(html) : html;\n const pieces = inlineFrom(element.children, {});\n const link = firstLink(pieces);\n return { text: plainInline(pieces, false, false).replace(/\\s+/g, ' ').trim(), ...(link ? { link } : {}) };\n};\n\nconst firstLink = (pieces: NoteInline[]): string | undefined => {\n for (const piece of pieces) {\n if (piece.kind === 'link') {\n return piece.href;\n }\n\n if (piece.kind === 'strong' || piece.kind === 'emphasis' || piece.kind === 'strike') {\n const inner = firstLink(piece.children);\n\n if (inner) {\n return inner;\n }\n }\n }\n\n return undefined;\n};\n\n/** The note's blocks, from HTML nodes. */\nexport const readBlocks = (nodes: MarkupNode[], addresses: NoteAddresses): NoteBlock[] => {\n const blocks: NoteBlock[] = [];\n let inline: NoteInline[] = [];\n\n const flush = (): void => {\n const trimmed = trimInline(inline);\n\n if (trimmed.length > 0) {\n blocks.push({ kind: 'paragraph', inline: trimmed });\n }\n\n inline = [];\n };\n\n for (const node of nodes) {\n if (!isElement(node)) {\n inline.push(...inlineFrom([node], addresses));\n continue;\n }\n\n const name = node.localName.toLowerCase();\n\n if (SKIPPED.has(name)) {\n continue;\n }\n\n const headingLevel = HEADINGS.get(name);\n\n if (headingLevel !== undefined) {\n flush();\n const content = trimInline(inlineFrom(node.children, addresses).map((piece) => (piece.kind === 'break' ? { kind: 'text', text: ' ' } as NoteInline : piece)));\n\n if (content.length > 0) {\n blocks.push({ kind: 'heading', level: headingLevel, inline: content });\n }\n } else if (name === 'ul' || name === 'ol' || name === 'menu' || name === 'dir') {\n flush();\n const items = node.children\n .filter((child) => isElement(child) || child.trim() !== '')\n .map((child) => readBlocks(isElement(child) && child.localName.toLowerCase() === 'li' ? child.children : [child], addresses))\n .filter((item) => item.some((block) => !isEmptyBlock(block)));\n\n if (items.length > 0) {\n blocks.push({ kind: 'list', ordered: name === 'ol', items });\n }\n } else if (name === 'li') {\n flush();\n blocks.push({ kind: 'list', ordered: false, items: [readBlocks(node.children, addresses)] });\n } else if (name === 'blockquote') {\n flush();\n const quoted = readBlocks(node.children, addresses);\n\n if (quoted.length > 0) {\n blocks.push({ kind: 'quote', blocks: quoted });\n }\n } else if (name === 'pre') {\n flush();\n const code = textContent(node).replace(/^\\n/, '').replace(/\\s+$/, '');\n\n if (code !== '') {\n blocks.push({ kind: 'code', text: code });\n }\n } else if (name === 'table') {\n flush();\n blocks.push(...tableRows(node, addresses));\n } else if (name === 'hr') {\n flush();\n } else if (BLOCK_CONTAINERS.has(name)) {\n flush();\n blocks.push(...readBlocks(node.children, addresses));\n } else {\n inline.push(...inlineFrom([node], addresses));\n }\n }\n\n flush();\n return blocks;\n};\n\n/** Each row of a table as a paragraph, its cells' text between middle dots. */\nconst tableRows = (table: MarkupElement, addresses: NoteAddresses): NoteBlock[] => {\n const rows: NoteBlock[] = [];\n const pending: MarkupElement[] = [table];\n\n while (pending.length > 0) {\n const element = pending.shift() as MarkupElement;\n\n for (const child of childElements(element)) {\n const name = child.localName.toLowerCase();\n\n if (name === 'tr') {\n const cells = childElements(child).filter((cell) => /^t[dh]$/.test(cell.localName.toLowerCase()));\n const inline: NoteInline[] = [];\n\n for (const cell of cells) {\n const content = trimInline(inlineFrom(cell.children, addresses).map((piece) => (piece.kind === 'break' ? { kind: 'text', text: ' ' } as NoteInline : piece)));\n\n if (content.length > 0) {\n if (inline.length > 0) {\n inline.push({ kind: 'text', text: ' · ' });\n }\n\n inline.push(...content);\n }\n }\n\n if (inline.length > 0) {\n rows.push({ kind: 'paragraph', inline });\n }\n } else if (name !== 'td' && name !== 'th') {\n pending.push(child);\n }\n }\n }\n\n return rows;\n};\n\n/** Inline content from HTML nodes; block elements inside it read as their text. */\nconst inlineFrom = (nodes: MarkupNode[], addresses: NoteAddresses): NoteInline[] => {\n const pieces: NoteInline[] = [];\n\n for (const node of nodes) {\n if (!isElement(node)) {\n const text = node.replace(/[ \\t\\n\\r\\f]+/g, ' ');\n\n if (text !== '') {\n pieces.push({ kind: 'text', text });\n }\n\n continue;\n }\n\n const name = node.localName.toLowerCase();\n\n if (SKIPPED.has(name)) {\n continue;\n }\n\n if (name === 'br') {\n pieces.push({ kind: 'break' });\n } else if (name === 'img') {\n const src = node.attributes.src ?? Object.entries(node.attributes).find(([key]) => key.endsWith(':src'))?.[1] ?? '';\n pieces.push({ kind: 'image', src, alt: (node.attributes.alt ?? node.attributes.title ?? '').trim() });\n } else if (INLINE_KINDS.has(name)) {\n pieces.push({ kind: INLINE_KINDS.get(name) as 'strong' | 'emphasis' | 'strike', children: inlineFrom(node.children, addresses) });\n } else if (CODE_ELEMENTS.has(name)) {\n pieces.push({ kind: 'code', text: textContent(node).replace(/\\s+/g, ' ') });\n } else if (name === 'a') {\n const href = (node.attributes.href ?? Object.entries(node.attributes).find(([key]) => key.endsWith(':href'))?.[1] ?? '').trim();\n const children = inlineFrom(node.children, addresses);\n\n if (href) {\n pieces.push({ kind: 'link', href, children });\n } else {\n pieces.push(...children);\n }\n } else {\n // A block inside a line, or an element HTML only uses for looks: its content, between spaces where blocks part.\n const block = BLOCK_CONTAINERS.has(name) || HEADINGS.has(name) || name === 'li' || name === 'tr';\n const content = inlineFrom(node.children, addresses);\n\n if (block && pieces.length > 0) {\n pieces.push({ kind: 'break' });\n }\n\n pieces.push(...content);\n }\n }\n\n return pieces;\n};\n\n/** Inline content without the spaces and line breaks at its ends. */\nconst trimInline = (pieces: NoteInline[]): NoteInline[] => {\n const result = [...pieces];\n\n while (result.length > 0 && isBlankPiece(result[0])) {\n result.shift();\n }\n\n while (result.length > 0 && isBlankPiece(result[result.length - 1])) {\n result.pop();\n }\n\n if (result.length > 0 && result[0].kind === 'text') {\n result[0] = { kind: 'text', text: result[0].text.replace(/^ +/, '') };\n }\n\n const last = result.length - 1;\n\n if (last >= 0 && result[last].kind === 'text') {\n result[last] = { kind: 'text', text: (result[last] as { text: string }).text.replace(/ +$/, '') };\n }\n\n return result;\n};\n\nconst isBlankPiece = (piece: NoteInline): boolean => {\n return piece.kind === 'break' || (piece.kind === 'text' && piece.text.trim() === '');\n};\n\nconst isEmptyBlock = (block: NoteBlock): boolean => {\n switch (block.kind) {\n case 'paragraph':\n case 'heading':\n return plainInline(block.inline, false).trim() === '' && !block.inline.some((piece) => piece.kind === 'image' && piece.src !== '');\n case 'list':\n return block.items.every((item) => item.every(isEmptyBlock));\n case 'quote':\n return block.blocks.every(isEmptyBlock);\n case 'code':\n return block.text.trim() === '';\n }\n};\n\n// Text markdown would read as something else: emphasis, code, links, pictures, escapes, HTML and character references.\nconst ACTIVE_CHARACTERS = /[`*_~[\\]<\\\\]|&#?[A-Za-z0-9]+;/;\n// Lines markdown reads as headings, quotes, lists, rules, fences or code.\nconst ACTIVE_LINE_START = /^(\\s{4,}|\\s*(#{1,6}(\\s|$)|>|[-*+](\\s|$)|\\d{1,9}[.)](\\s|$)|```|~~~|[-=_]{3,}\\s*$))/;\n\nconst isInertText = (text: string): boolean => {\n return !ACTIVE_CHARACTERS.test(text);\n};\n\nconst isInertLineStart = (line: string): boolean => {\n return !ACTIVE_LINE_START.test(line);\n};\n\n/** Writes blocks as markdown, and notes whether any text would read back differently (`inert` turns false). */\nclass MarkdownWriter {\n inert = true;\n private readonly addresses: NoteAddresses;\n\n constructor(addresses: NoteAddresses) {\n this.addresses = addresses;\n }\n\n blocks(blocks: NoteBlock[]): string {\n return blocks.map((block) => this.block(block)).filter((text) => text !== '').join('\\n\\n');\n }\n\n private block(block: NoteBlock): string {\n switch (block.kind) {\n case 'paragraph': {\n // Markdown in notes has no line breaks inside a paragraph: each line becomes a paragraph of its own.\n const lines = this.inlineLines(block.inline);\n return lines.map((line) => this.lineStart(line)).filter((line) => line !== '').join('\\n\\n');\n }\n case 'heading': {\n const text = this.inlineLines(block.inline).join(' ').trim();\n return text === '' ? '' : `${'#'.repeat(block.level)} ${text}`;\n }\n case 'list':\n return this.list(block, 0);\n case 'quote': {\n const inner = this.blocks(block.blocks);\n return inner.split('\\n').map((line) => (line === '' ? '>' : `> ${line}`)).join('\\n');\n }\n case 'code': {\n if (/^\\s*(```|~~~)/m.test(block.text)) {\n this.inert = false;\n }\n\n return `\\`\\`\\`\\n${block.text}\\n\\`\\`\\``;\n }\n }\n }\n\n private list(list: Extract<NoteBlock, { kind: 'list' }>, indent: number): string {\n const lines: string[] = [];\n\n list.items.forEach((item, index) => {\n const marker = list.ordered ? `${index + 1}.` : '-';\n const nested: string[] = [];\n const words: string[] = [];\n\n for (const block of item) {\n if (block.kind === 'list') {\n nested.push(this.list(block, indent + marker.length + 1));\n } else {\n words.push(this.flatText(block));\n }\n }\n\n const text = words.filter((word) => word !== '').join(' ');\n lines.push(`${' '.repeat(indent)}${marker} ${text}`.trimEnd());\n lines.push(...nested);\n });\n\n return lines.join('\\n');\n }\n\n /** A block inside a list item, on the item's line. */\n private flatText(block: NoteBlock): string {\n switch (block.kind) {\n case 'paragraph':\n case 'heading':\n return this.inlineLines(block.inline).join(' ').trim();\n case 'quote':\n return block.blocks.map((inner) => this.flatText(inner)).join(' ');\n case 'code':\n return this.code(block.text.replace(/\\s+/g, ' '));\n case 'list':\n return this.list(block, 0);\n }\n }\n\n /** A paragraph's first characters, checked: a line that starts like a list or a heading would read as one. */\n private lineStart(line: string): string {\n if (!isInertLineStart(line)) {\n this.inert = false;\n }\n\n return line.trim();\n }\n\n /** Inline content as markdown lines, split where it breaks. */\n private inlineLines(pieces: NoteInline[]): string[] {\n return this.inlineText(pieces).split('\\n').map((line) => line.replace(/ {2,}/g, ' ').trim());\n }\n\n /** Inline content as markdown, breaks as line feeds, spaces where the note had them. */\n private inlineText(pieces: NoteInline[]): string {\n return mergeNeighbors(pieces).map((piece) => (piece.kind === 'break' ? '\\n' : this.inline(piece))).join('');\n }\n\n private inline(piece: NoteInline): string {\n switch (piece.kind) {\n case 'text':\n if (!isInertText(piece.text)) {\n this.inert = false;\n }\n\n return piece.text;\n case 'break':\n return ' ';\n case 'strong':\n case 'emphasis':\n case 'strike': {\n const inner = this.inlineText(piece.children).replace(/\\n/g, ' ').replace(/ {2,}/g, ' ');\n // Spaces at the ends go outside the marks: markdown doesn't read \"** bold**\" as bold.\n const [, before, middle, after] = /^(\\s*)([\\s\\S]*?)(\\s*)$/.exec(inner) as RegExpExecArray;\n\n if (middle === '') {\n return inner;\n }\n\n const mark = piece.kind === 'strong' ? '**' : piece.kind === 'emphasis' ? '*' : '~~';\n return `${before}${mark}${middle}${mark}${after}`;\n }\n case 'code':\n return this.code(piece.text);\n case 'link': {\n const label = this.inlineLines(piece.children).join(' ').trim();\n const href = (this.addresses.link ?? defaultLink)(piece.href);\n\n if (!href) {\n return label;\n }\n\n return label === '' || label === href ? `<${encodeAddress(href)}>` : `[${label}](${encodeAddress(href)})`;\n }\n case 'image': {\n const src = piece.src ? (this.addresses.picture ?? defaultPicture)(piece.src) : null;\n\n if (!src) {\n if (!isInertText(piece.alt)) {\n this.inert = false;\n }\n\n return piece.alt;\n }\n\n if (!isInertText(piece.alt)) {\n this.inert = false;\n }\n\n return `![${piece.alt}](${encodeAddress(src)})`;\n }\n }\n }\n\n private code(text: string): string {\n const trimmed = text.trim();\n\n if (trimmed === '') {\n return '';\n }\n\n if (trimmed.includes('`')) {\n this.inert = false;\n }\n\n return `\\`${trimmed}\\``;\n }\n}\n\n/** Neighbors of the same kind as one: two italic runs side by side would close and reopen their marks, which markdown misreads. */\nconst mergeNeighbors = (pieces: NoteInline[]): NoteInline[] => {\n const merged: NoteInline[] = [];\n\n for (const piece of pieces) {\n const last = merged[merged.length - 1];\n\n if (last && last.kind === piece.kind && (piece.kind === 'strong' || piece.kind === 'emphasis' || piece.kind === 'strike')) {\n merged[merged.length - 1] = { kind: piece.kind, children: [...(last as { children: NoteInline[] }).children, ...piece.children] };\n } else {\n merged.push(piece);\n }\n }\n\n return merged;\n};\n\nconst defaultLink = (href: string): string | null => {\n return keptAddress(href);\n};\n\nconst defaultPicture = (src: string): string | null => {\n return isWebAddress(src) ? src : null;\n};\n\n/** An address as a markdown link takes it: spaces and parentheses escaped. */\nconst encodeAddress = (address: string): string => {\n return address.replace(/ /g, '%20').replace(/\\(/g, '%28').replace(/\\)/g, '%29').replace(/</g, '%3C').replace(/>/g, '%3E');\n};\n\n/** Blocks as plain text: lists keep their markers, links their addresses. */\nconst plainBlocks = (blocks: NoteBlock[], indent = ''): string => {\n return blocks.map((block) => plainBlock(block, indent)).filter((text) => text.trim() !== '').join('\\n\\n');\n};\n\nconst plainBlock = (block: NoteBlock, indent: string): string => {\n switch (block.kind) {\n case 'paragraph':\n return prefixLines(plainInline(block.inline, true), indent);\n case 'heading':\n return prefixLines(plainInline(block.inline, false).trim(), indent);\n case 'list':\n return block.items.map((item, index) => {\n const marker = block.ordered ? `${index + 1}. ` : '- ';\n const text = plainBlocks(item.filter((inner) => inner.kind !== 'list'), '').replace(/\\n+/g, ' ').trim();\n const nested = item.filter((inner) => inner.kind === 'list').map((inner) => plainBlock(inner, `${indent}${' '.repeat(marker.length)}`));\n return [`${indent}${marker}${text}`.trimEnd(), ...nested].join('\\n');\n }).join('\\n');\n case 'quote':\n return prefixLines(plainBlocks(block.blocks), `${indent}> `);\n case 'code':\n return prefixLines(block.text, indent);\n }\n};\n\nconst prefixLines = (text: string, prefix: string): string => {\n return prefix === '' ? text : text.split('\\n').map((line) => `${prefix}${line}`).join('\\n');\n};\n\n/** Inline content as plain text; `breaks` keeps line breaks, otherwise they're spaces, and `addresses` writes a link's address after its text. */\nconst plainInline = (pieces: NoteInline[], breaks: boolean, addresses = true): string => {\n let text = '';\n\n for (const piece of pieces) {\n switch (piece.kind) {\n case 'text':\n text += piece.text;\n break;\n case 'break':\n text += breaks ? '\\n' : ' ';\n break;\n case 'strong':\n case 'emphasis':\n case 'strike':\n text += plainInline(piece.children, breaks, addresses);\n break;\n case 'code':\n text += piece.text;\n break;\n case 'link': {\n const label = plainInline(piece.children, breaks, addresses).trim();\n const href = addresses && isKeptLink(piece.href) && !piece.href.startsWith('#') ? piece.href : '';\n text += href && label && label !== href ? `${label} (${href})` : label || href;\n break;\n }\n case 'image':\n text += piece.alt;\n break;\n }\n }\n\n return text.split('\\n').map((line) => line.replace(/ {2,}/g, ' ').trim()).join('\\n');\n};\n",
16
+ "/**\n * What every reader of another app's file builds: a tree of ideas with what\n * Orbit can show of each, the warnings for what it can't, and the step that\n * turns the tree into an Orbit document, with ids the parsers would give it\n * and links between ideas pointing at those ids.\n */\n\nimport { leadingEmoji } from '../parser-markdown.js';\nimport { findIndexedLinkedNode, indexNodes, isNodeLink } from '../node-links.js';\nimport { ensureUniqueNodeIds, nodeSlug, setParent } from '../utils.js';\nimport type { OrbitDocument, OrbitNode } from '../types.js';\nimport { joinNotes, type ImportedNote } from './notes.js';\n\n/** Every kind of warning reading another app's map gives. */\nexport const IMPORT_WARNING_CODES = [\n 'floating-ideas-moved',\n 'summaries-moved',\n 'callouts-moved',\n 'boundaries-in-notes',\n 'links-in-notes',\n 'missing-link-targets',\n 'icons-not-kept',\n 'pictures-not-kept',\n 'attachments-not-kept',\n 'local-links-not-kept',\n 'encrypted-branches-not-read',\n 'formatting-not-kept',\n] as const;\n\nexport type OrbitImportWarningCode = (typeof IMPORT_WARNING_CODES)[number];\n\n/** Something the other app's map had that Orbit keeps another way, or can't keep. */\nexport interface OrbitImportWarning {\n code: OrbitImportWarningCode;\n message: string;\n\n /** How many places in the map it's about. */\n count: number;\n}\n\n/** Every reason a file can't be read as a map. */\nexport const IMPORT_ERROR_CODES = ['unknown-format', 'unreadable', 'empty', 'password-protected', 'too-large'] as const;\n\nexport type OrbitImportErrorCode = (typeof IMPORT_ERROR_CODES)[number];\n\n/** A file that can't be read as a map at all. */\nexport class OrbitImportError extends Error {\n readonly code: OrbitImportErrorCode;\n\n constructor(code: OrbitImportErrorCode, message: string) {\n super(message);\n this.name = 'OrbitImportError';\n this.code = code;\n }\n}\n\n/** The most ideas a map read from another app may have. */\nexport const MAX_IMPORTED_IDEAS = 100_000;\n\n/** The deepest a map read from another app may go. */\nexport const MAX_IMPORTED_DEPTH = 500;\n\n/** A link from one idea to another, by the other app's id for it. */\nexport interface IdeaLink {\n target: string;\n\n /** What the other app calls the link, if anything. */\n label?: string;\n}\n\n/** An idea as a reader finds it, before it becomes a node. */\nexport interface ImportedIdea {\n text: string;\n\n /** The other app's id for it, which links between ideas point at. */\n sourceId?: string;\n\n /** Its note, in parts: they're joined in order. */\n notes: ImportedNote[];\n\n /** A web or mail address. */\n link?: string;\n\n /** Links to other ideas: the first one becomes the idea's link when it has none, the others go in its note. */\n ideaLinks: IdeaLink[];\n\n collapsed?: boolean;\n status?: string;\n priority?: number;\n tags: string[];\n\n /** Emoji for its icons, in order: Orbit shows the first. */\n icons: string[];\n\n color?: string;\n\n /** Its picture: a web address, or a file in the map's `media`. */\n image?: string;\n\n children: ImportedIdea[];\n}\n\nexport const newIdea = (text: string): ImportedIdea => {\n return { text, notes: [], ideaLinks: [], tags: [], icons: [], children: [] };\n};\n\nconst MESSAGES: Record<OrbitImportWarningCode, (count: number, examples: string) => string> = {\n 'floating-ideas-moved': (count, examples) => `${plural(count, 'floating topic')}${examples} had no place in the tree: ${count === 1 ? \"it's\" : \"they're\"} now under the center.`,\n 'summaries-moved': (count, examples) => `${plural(count, 'summary')}${examples} became ${count === 1 ? 'an idea' : 'ideas'} beside the ideas ${count === 1 ? 'it sums' : 'they sum'} up.`,\n 'callouts-moved': (count, examples) => `${plural(count, 'callout')}${examples} became ${count === 1 ? 'an idea' : 'ideas'} under the topic ${count === 1 ? 'it points' : 'they point'} at.`,\n 'boundaries-in-notes': (count, examples) => `${plural(count, 'boundary title')}${examples} ${count === 1 ? 'is' : 'are'} now in the note of the idea whose ideas ${count === 1 ? 'it surrounds' : 'they surround'}.`,\n 'links-in-notes': (count, examples) => `${plural(count, 'link')}${examples} beyond an idea's first ${count === 1 ? 'is' : 'are'} now in its note.`,\n 'missing-link-targets': (count, examples) => `${plural(count, 'link')}${examples} ${count === 1 ? 'points' : 'point'} at an idea that isn't in this map, so ${count === 1 ? 'it was' : 'they were'} left out.`,\n 'icons-not-kept': (count, examples) => `${plural(count, 'icon')}${examples} ${count === 1 ? 'was' : 'were'} left out: an idea in Orbit has one icon, an emoji.`,\n 'pictures-not-kept': (count, examples) => `${plural(count, 'picture')}${examples} ${count === 1 ? \"isn't\" : \"aren't\"} in the file, so ${count === 1 ? 'it was' : 'they were'} left out.`,\n 'attachments-not-kept': (count, examples) => `${plural(count, 'attached file')}${examples} ${count === 1 ? 'was' : 'were'} left out; the ideas keep their names.`,\n 'local-links-not-kept': (count, examples) => `${plural(count, 'link')}${examples} to files on the computer the map was made on ${count === 1 ? 'was' : 'were'} left out.`,\n 'encrypted-branches-not-read': (count, examples) => `${plural(count, 'encrypted branch')}${examples} couldn't be read: the ideas in ${count === 1 ? 'it' : 'them'} were left out.`,\n 'formatting-not-kept': (count, examples) => `${plural(count, 'note')}${examples} ${count === 1 ? 'is' : 'are'} kept as plain text, without bold, italics or lists: markdown would have shown ${count === 1 ? 'it' : 'them'} differently.`,\n};\n\nconst plural = (count: number, noun: string): string => {\n const word = count === 1 ? noun : noun.endsWith('y') ? `${noun.slice(0, -1)}ies` : /(ch|sh|s|x)$/.test(noun) ? `${noun}es` : `${noun}s`;\n return `${count === 1 ? 'One' : count} ${word}`;\n};\n\n/** The warnings for one map, each kind counted once with a few examples. */\nexport class ImportReport {\n private readonly found = new Map<OrbitImportWarningCode, { count: number; examples: string[] }>();\n\n add(code: OrbitImportWarningCode, example?: string): void {\n const entry = this.found.get(code) ?? { count: 0, examples: [] };\n const shown = example === undefined ? '' : oneLine(example);\n entry.count += 1;\n\n if (shown !== '' && entry.examples.length < 3 && !entry.examples.includes(shown)) {\n entry.examples.push(shown);\n }\n\n this.found.set(code, entry);\n }\n\n /** The warnings in the order of `IMPORT_WARNING_CODES`. */\n get warnings(): OrbitImportWarning[] {\n const order = (code: OrbitImportWarningCode): number => IMPORT_WARNING_CODES.indexOf(code);\n\n return [...this.found.entries()].sort(([first], [second]) => order(first) - order(second)).map(([code, { count, examples }]) => {\n const shown = examples.map((example) => `“${example.length > 40 ? `${example.slice(0, 39)}…` : example}”`);\n const more = count > examples.length && examples.length > 0 ? ', …' : '';\n return { code, count, message: MESSAGES[code](count, shown.length > 0 ? ` (${shown.join(', ')}${more})` : '') };\n });\n }\n}\n\n/** A title on one line, as Orbit keeps titles: line breaks, tabs and runs of spaces become one space; other spaces stay as they are. */\nexport const oneLine = (text: string): string => {\n return text.replace(/[\\t\\n\\v\\f\\r\\u2028\\u2029 ]+/g, ' ').replace(/^ | $/g, '');\n};\n\n/** Placeholder for links to ideas until the ideas have Orbit's ids. */\nconst SOURCE_LINK = '#orbit-source:';\n\n/** A link in a note to the idea with this id in the other app: it points at the idea's Orbit id once the map is built. */\nexport const sourceLink = (sourceId: string): string => {\n return `${SOURCE_LINK}${encodeURIComponent(sourceId)}`;\n};\n\n/**\n * The tree as an Orbit document: titles on one line, an emoji at the start\n * of a title as the idea's icon (as Orbit's markdown reads it), ids from the\n * titles as the parsers give them, and links between ideas pointing at them.\n */\nexport const buildDocument = (rootIdea: ImportedIdea, report: ImportReport): OrbitDocument => {\n let count = 0;\n const bySource = new Map<string, OrbitNode>();\n const pending: [ImportedIdea, OrbitNode][] = [];\n\n const build = (idea: ImportedIdea, level: number): OrbitNode => {\n count += 1;\n\n if (count > MAX_IMPORTED_IDEAS) {\n throw new OrbitImportError('too-large', `The map has more than ${MAX_IMPORTED_IDEAS.toLocaleString('en')} ideas.`);\n }\n\n if (level > MAX_IMPORTED_DEPTH) {\n throw new OrbitImportError('too-large', `The map goes more than ${MAX_IMPORTED_DEPTH} levels deep.`);\n }\n\n let text = oneLine(idea.text);\n const icons = idea.icons.filter((icon) => icon !== '');\n let icon = icons[0];\n const emoji = icon === undefined ? leadingEmoji(text) : null;\n\n if (emoji) {\n icon = emoji.icon;\n text = emoji.text;\n }\n\n for (const extra of icons.slice(1)) {\n report.add('icons-not-kept', extra);\n }\n\n const node: OrbitNode = { id: nodeSlug(text), text, level, children: [] };\n\n if (icon) {\n node.icon = icon;\n }\n\n if (idea.collapsed && idea.children.length > 0) {\n node.collapsed = true;\n }\n\n if (idea.status) {\n node.status = idea.status;\n }\n\n if (idea.priority !== undefined && Number.isFinite(idea.priority)) {\n node.priority = idea.priority;\n }\n\n const tags = [...new Set(idea.tags.map((tag) => oneLine(tag)).filter((tag) => tag !== ''))];\n\n if (tags.length > 0) {\n node.tags = tags;\n }\n\n if (idea.color) {\n node.color = idea.color;\n }\n\n if (idea.link) {\n node.link = idea.link;\n }\n\n if (idea.image) {\n node.image = { src: idea.image };\n }\n\n if (idea.sourceId !== undefined && !bySource.has(idea.sourceId)) {\n bySource.set(idea.sourceId, node);\n }\n\n pending.push([idea, node]);\n\n for (const child of idea.children) {\n const childNode = build(child, level + 1);\n setParent(childNode, node);\n node.children.push(childNode);\n }\n\n return node;\n };\n\n const root = build(rootIdea, 0);\n ensureUniqueNodeIds(root);\n\n for (const [idea, node] of pending) {\n const extraLines: { label: string; target: OrbitNode }[] = [];\n\n for (const link of idea.ideaLinks) {\n const target = bySource.get(link.target);\n\n if (!target) {\n report.add('missing-link-targets', link.label ?? node.text);\n continue;\n }\n\n if (!node.link && !link.label) {\n node.link = `#${target.id}`;\n } else {\n report.add('links-in-notes', link.label ?? target.text);\n extraLines.push({ label: link.label ?? target.text, target });\n }\n }\n\n const note = joinNotes([...idea.notes, linkNote(extraLines, idea.notes)]);\n\n if (note) {\n node.note = resolveSourceLinks(note.text, bySource, note.format);\n\n if (note.format === 'plain') {\n node.noteFormat = 'plain';\n }\n }\n }\n\n // A file's own `#id` links (an OPML file Orbit wrote) point at the ids the titles give, or nowhere.\n const nodes = indexNodes(root);\n\n for (const [, node] of pending) {\n if (isNodeLink(node.link) && !findIndexedLinkedNode(nodes, node.link)) {\n report.add('missing-link-targets', node.link);\n delete node.link;\n }\n }\n\n return { root, options: {}, warnings: [], diagnostics: [] };\n};\n\n/** Links to other ideas as lines of a note: markdown links, or their names in a plain note. */\nconst linkNote = (lines: { label: string; target: OrbitNode }[], notes: ImportedNote[]): ImportedNote | undefined => {\n if (lines.length === 0) {\n return undefined;\n }\n\n const plain = notes.some((note) => note.format === 'plain') || lines.some(({ label }) => /[[\\]`*_~<\\\\]/.test(label));\n\n if (plain) {\n return { text: lines.map(({ label, target }) => (label === target.text ? `→ ${label}` : `→ ${label}: ${target.text}`)).join('\\n'), format: 'plain' };\n }\n\n return { text: lines.map(({ label, target }) => `→ [${label || target.text}](#${target.id})`).join('\\n\\n'), format: 'markdown' };\n};\n\n/** Links in a markdown note to the other app's ids, pointed at Orbit's ids; links to ideas that aren't in the map keep their text. */\nconst resolveSourceLinks = (text: string, bySource: Map<string, OrbitNode>, format: 'markdown' | 'plain'): string => {\n if (format !== 'markdown' || !text.includes(SOURCE_LINK)) {\n return text;\n }\n\n const target = (encoded: string): OrbitNode | undefined => {\n try {\n return bySource.get(decodeURIComponent(encoded));\n } catch {\n return undefined;\n }\n };\n\n return text\n .replace(/\\[([^\\]]*)\\]\\(#orbit-source:([^)\\s]+)\\)/g, (_, label: string, encoded: string) => {\n const node = target(encoded);\n return node ? `[${label || node.text}](#${node.id})` : label;\n })\n .replace(/<#orbit-source:([^>\\s]+)>/g, (_, encoded: string) => {\n const node = target(encoded);\n return node ? `[${node.text}](#${node.id})` : '';\n });\n};\n",
17
+ "/**\n * What reading another app's map gives back, and the first steps every\n * reader shares: a file's bytes as text, and its XML read, with problems\n * reported as `OrbitImportError`s.\n */\n\nimport type { OrbitDocument } from '../types.js';\nimport { OrbitImportError, type OrbitImportWarning } from './ideas.js';\nimport { decodeMarkup, MarkupError, parseXml, type MarkupElement } from './markup.js';\n\n/** The other apps' formats Orbit reads. */\nexport type OrbitImportFormat = 'opml' | 'freemind' | 'xmind';\n\nexport interface OrbitImportOptions {\n /** The file's name: its extension tells the format, and a map with no single center is named after it. */\n name?: string;\n\n /** The file's format, when you know it. Default: from the name, then from what the file holds. */\n format?: OrbitImportFormat;\n\n /** The name of the center Orbit adds to a map with several top ideas and nothing to name it after. Default \"Untitled map\". */\n untitled?: string;\n}\n\n/** One map read from another app's file. */\nexport interface OrbitImportedMap {\n document: OrbitDocument;\n\n /** Pictures from inside the file, by the address the map gives them: `media/sunrise.png`. Save them next to the map. */\n media: Record<string, Uint8Array>;\n\n /** What the other app had that Orbit keeps another way, or couldn't keep. */\n warnings: OrbitImportWarning[];\n}\n\n/** What reading another app's file gives. */\nexport interface OrbitImport {\n format: OrbitImportFormat;\n\n /** The file's maps: one, or one for each sheet of an XMind workbook. */\n maps: OrbitImportedMap[];\n}\n\n/** An XML file's top element, which must be `rootName`; `what` names the file in errors (\"an OPML file\"). */\nexport const readXmlFile = (data: Uint8Array | string, rootName: string, what: string): MarkupElement => {\n const text = typeof data === 'string' ? data : decodeMarkup(data);\n let root: MarkupElement;\n\n try {\n root = parseXml(text);\n } catch (error) {\n if (error instanceof MarkupError) {\n throw new OrbitImportError('unreadable', `The file isn't ${what} Orbit can read: ${error.message}.`);\n }\n\n throw error;\n }\n\n if (root.localName !== rootName) {\n throw new OrbitImportError('unreadable', `The file isn't ${what}: it starts with <${root.name}>, not <${rootName}>.`);\n }\n\n return root;\n};\n\n/** A file's name without its folder or a map's extension: `notes/Trip.opml` is `Trip`. */\nexport const baseName = (name: string | undefined): string => {\n return (name ?? '').replace(/^.*[/\\\\]/, '').replace(/\\.(opml|xml|mm|xmind|txt|md)$/i, '').trim();\n};\n",
18
+ "/**\n * FreeMind and Freeplane maps (`.mm`): nodes with their text (plain, or\n * HTML), notes and Freeplane's details, links and arrow links, folds, icons,\n * background colors, attributes and pictures.\n */\n\nimport { freeMindIcon } from './icons.js';\nimport { buildDocument, ImportReport, newIdea, oneLine, OrbitImportError, sourceLink, type ImportedIdea } from './ideas.js';\nimport { attributeOf, childElement, childElements, textContent, type MarkupElement } from './markup.js';\nimport { keptAddress, noteFromBlocks, noteFromHtml, noteFromPlainText, titleFromHtml, type ImportedNote, type NoteAddresses, type NoteBlock } from './notes.js';\nimport { baseName, readXmlFile, type OrbitImport, type OrbitImportOptions } from './reading.js';\n\n/** A FreeMind or Freeplane map, from its file's bytes or text. */\nexport const importFreeMind = (data: Uint8Array | string, options: OrbitImportOptions = {}): OrbitImport => {\n const map = readXmlFile(data, 'map', 'a FreeMind or Freeplane map');\n const nodes = childElements(map, 'node');\n\n if (nodes.length === 0) {\n throw new OrbitImportError('empty', 'The map has no nodes.');\n }\n\n const report = new ImportReport();\n let root: ImportedIdea;\n\n if (nodes.length === 1) {\n root = readNode(nodes[0], report);\n } else {\n root = newIdea(baseName(options.name) || options.untitled || 'Untitled map');\n root.children = nodes.map((node) => readNode(node, report));\n }\n\n return { format: 'freemind', maps: [{ document: buildDocument(root, report), media: {}, warnings: report.warnings }] };\n};\n\nconst readNode = (node: MarkupElement, report: ImportReport): ImportedIdea => {\n const idea = newIdea('');\n const id = node.attributes.ID;\n\n if (id) {\n idea.sourceId = id;\n }\n\n readTitle(node, idea, report);\n const addresses = noteAddresses(report);\n const details: ImportedNote[] = [];\n const notes: ImportedNote[] = [];\n\n for (const content of childElements(node, 'richcontent')) {\n const type = (content.attributes.TYPE ?? '').toUpperCase();\n\n if (type === 'NOTE' || type === 'DETAILS') {\n const note = richContentNote(content, addresses, report, idea.text);\n\n if (note) {\n (type === 'DETAILS' ? details : notes).push(note);\n }\n }\n }\n\n // FreeMind before 0.9 kept notes in a hook.\n for (const hook of childElements(node, 'hook')) {\n if (/NodeNote/.test(hook.attributes.NAME ?? '')) {\n const text = childElement(hook, 'text');\n const note = noteFromPlainText(text ? textContent(text) : undefined);\n\n if (note) {\n notes.push(note);\n }\n }\n }\n\n idea.notes.push(...details, ...notes);\n const attributes = attributeNote(node);\n\n if (attributes) {\n idea.notes.push(attributes);\n }\n\n readLink(node.attributes.LINK, idea, report);\n\n for (const arrow of childElements(node, 'arrowlink')) {\n const target = arrow.attributes.DESTINATION;\n\n if (target) {\n const label = oneLine(arrow.attributes.MIDDLE_LABEL || arrow.attributes.SOURCE_LABEL || arrow.attributes.TARGET_LABEL || '');\n idea.ideaLinks.push(label ? { target, label } : { target });\n }\n }\n\n if (node.attributes.FOLDED === 'true') {\n idea.collapsed = true;\n }\n\n const background = node.attributes.BACKGROUND_COLOR;\n\n if (background && /^#[0-9A-Fa-f]{6}$/.test(background)) {\n idea.color = background.toUpperCase();\n }\n\n for (const icon of childElements(node, 'icon')) {\n const name = icon.attributes.BUILTIN ?? '';\n const meaning = freeMindIcon(name);\n\n if (!meaning) {\n report.add('icons-not-kept', name.replace(/^.*\\//, ''));\n } else if ('icon' in meaning) {\n idea.icons.push(meaning.icon);\n } else if ('priority' in meaning) {\n idea.priority ??= meaning.priority;\n } else {\n idea.status ??= meaning.status;\n }\n }\n\n for (const hook of childElements(node, 'hook')) {\n if (hook.attributes.NAME === 'ExternalObject' && hook.attributes.URI) {\n readPicture(hook.attributes.URI, idea, report);\n }\n }\n\n if (node.attributes.ENCRYPTED_CONTENT) {\n report.add('encrypted-branches-not-read', idea.text || undefined);\n }\n\n idea.children = childElements(node, 'node').map((child) => readNode(child, report));\n return idea;\n};\n\n/** The node's text: its `TEXT`, or its rich content as a reader sees it, whose first link becomes the node's link. */\nconst readTitle = (node: MarkupElement, idea: ImportedIdea, report: ImportReport): void => {\n const rich = childElements(node, 'richcontent').find((content) => (content.attributes.TYPE ?? '').toUpperCase() === 'NODE');\n const text = node.attributes.TEXT ?? node.attributes.LOCALIZED_TEXT;\n\n if (rich) {\n const html = childElement(rich, 'html');\n const plain = childElement(rich, 'text');\n\n if (html) {\n const title = titleFromHtml(html);\n idea.text = title.text;\n readLink(title.link, idea, report);\n\n for (const image of findElements(html, 'img')) {\n readPicture(image.attributes.src ?? '', idea, report);\n }\n } else {\n idea.text = plain ? textContent(plain) : textContent(rich);\n }\n\n return;\n }\n\n if (text !== undefined && /^\\s*<html>/i.test(text)) {\n // FreeMind before 0.9 wrote HTML titles into the attribute.\n const title = titleFromHtml(text);\n idea.text = title.text;\n readLink(title.link, idea, report);\n return;\n }\n\n idea.text = text ?? '';\n};\n\nconst readLink = (link: string | undefined, idea: ImportedIdea, report: ImportReport): void => {\n const address = link?.trim();\n\n if (!address || idea.link) {\n return;\n }\n\n const kept = keptAddress(address);\n\n if (address.startsWith('#') || /^(ID_\\d+|_?Freemind_Link_\\d+)$/.test(address)) {\n // Freeplane sometimes writes a link to another node without its \"#\".\n idea.ideaLinks.push({ target: address.replace(/^#/, '') });\n } else if (kept) {\n idea.link = kept;\n } else {\n report.add('local-links-not-kept', address);\n }\n};\n\nconst readPicture = (address: string, idea: ImportedIdea, report: ImportReport): void => {\n if (/^https?:\\/\\/\\S+$/i.test(address)) {\n idea.image ??= address;\n } else if (address !== '') {\n report.add('pictures-not-kept', address.replace(/^.*[/\\\\]/, ''));\n }\n};\n\n/** Links and pictures in a note: other nodes by their ids, web addresses as they are; files on the author's computer can't come along. */\nconst noteAddresses = (report: ImportReport): NoteAddresses => {\n return {\n link: (href) => {\n if (href.startsWith('#')) {\n return sourceLink(href.slice(1));\n }\n\n const kept = keptAddress(href);\n\n if (kept) {\n return kept;\n }\n\n report.add('local-links-not-kept', href);\n return null;\n },\n picture: (src) => {\n if (/^https?:\\/\\/\\S+$/i.test(src)) {\n return src;\n }\n\n report.add('pictures-not-kept', src.replace(/^.*[/\\\\]/, ''));\n return null;\n },\n };\n};\n\n/** A note or details: HTML, or Freeplane's plain text (markdown when it says so). */\nconst richContentNote = (content: MarkupElement, addresses: NoteAddresses, report: ImportReport, title: string): ImportedNote | undefined => {\n const html = childElement(content, 'html');\n\n if (html) {\n const note = noteFromHtml(html, addresses);\n\n if (note?.format === 'plain') {\n report.add('formatting-not-kept', title || undefined);\n }\n\n return note;\n }\n\n const plain = childElement(content, 'text');\n const text = plain ? textContent(plain) : textContent(content);\n\n if (/\\/markdown$/i.test(content.attributes['CONTENT-TYPE'] ?? '') && text.trim() !== '') {\n return { text: text.replace(/\\r\\n?/g, '\\n').trim(), format: 'markdown' };\n }\n\n return noteFromPlainText(text);\n};\n\n/** Freeplane's attributes, as a list in the note: name, then value. */\nconst attributeNote = (node: MarkupElement): ImportedNote | undefined => {\n const items: NoteBlock[][] = [];\n\n for (const attribute of childElements(node, 'attribute')) {\n const name = (attributeOf(attribute, 'NAME') ?? '').trim();\n const value = (attributeOf(attribute, 'VALUE') ?? '').trim();\n\n if (name !== '' || value !== '') {\n items.push([{ kind: 'paragraph', inline: name === '' ? [{ kind: 'text', text: value }] : [{ kind: 'strong', children: [{ kind: 'text', text: `${name}:` }] }, { kind: 'text', text: ` ${value}` }] }]);\n }\n }\n\n return items.length === 0 ? undefined : noteFromBlocks([{ kind: 'list', ordered: false, items }]);\n};\n\n/** Every element with this local name inside `element`. */\nconst findElements = (element: MarkupElement, localName: string): MarkupElement[] => {\n const found: MarkupElement[] = [];\n const pending = [element];\n\n while (pending.length > 0) {\n const next = pending.pop() as MarkupElement;\n\n for (const child of childElements(next)) {\n if (child.localName.toLowerCase() === localName) {\n found.push(child);\n }\n\n pending.push(child);\n }\n }\n\n return found;\n};\n",
19
+ "/**\n * OPML, the outline format outliners and most mind map apps read and write.\n * Reading keeps each outline's text, its note (`_note`, the convention\n * OmniOutliner started and Workflowy, Dynalist and MindNode follow), its\n * done or todo state (`_status`, `_complete`, `complete`), its link\n * (`type=\"link\"`'s `url`, a feed's `htmlUrl` or `xmlUrl`) and its categories\n * as tags. Writing gives the same back, so a map Orbit writes reads back the\n * same, and other apps read its text, notes, links and checkboxes.\n */\n\nimport { parseOrbit } from '../dispatch.js';\nimport { isNodeLink } from '../node-links.js';\nimport type { OrbitDocument, OrbitNode } from '../types.js';\nimport { buildDocument, ImportReport, newIdea, OrbitImportError, type ImportedIdea } from './ideas.js';\nimport { attributeOf, childElement, childElements, textContent, type MarkupElement } from './markup.js';\nimport { isKeptLink, keptAddress, noteFromHtml, noteFromPlainText, titleFromHtml, type ImportedNote } from './notes.js';\nimport { baseName, readXmlFile, type OrbitImport, type OrbitImportOptions } from './reading.js';\n\n/** Tags that make an outline's text or note HTML, as Workflowy writes its formatting. */\nconst HTML_TAGS = /<\\/?(b|i|u|s|em|strong|a|span|br|code|mark|strike|del|sup|sub|font|p|div|ul|ol|li)\\b[^>]*>/i;\n\n/** An OPML file, from its bytes or text. */\nexport const importOPML = (data: Uint8Array | string, options: OrbitImportOptions = {}): OrbitImport => {\n const opml = readXmlFile(data, 'opml', 'an OPML file');\n const head = childElement(opml, 'head');\n const titleElement = head ? childElement(head, 'title') : undefined;\n const title = titleElement ? baseName(textContent(titleElement).replace(/\\s+/g, ' ').trim()) : '';\n const body = childElement(opml, 'body');\n const outlines = body ? childElements(body, 'outline') : [];\n\n if (outlines.length === 0) {\n throw new OrbitImportError('empty', 'The OPML file has no outlines.');\n }\n\n const report = new ImportReport();\n let root: ImportedIdea;\n\n if (outlines.length === 1) {\n root = readOutline(outlines[0], report);\n } else {\n root = newIdea(title || baseName(options.name) || options.untitled || 'Untitled map');\n root.children = outlines.map((outline) => readOutline(outline, report));\n }\n\n return { format: 'opml', maps: [{ document: buildDocument(root, report), media: {}, warnings: report.warnings }] };\n};\n\nconst readOutline = (outline: MarkupElement, report: ImportReport): ImportedIdea => {\n const text = attributeOf(outline, 'text') ?? attributeOf(outline, 'title') ?? '';\n const idea = newIdea(text);\n\n // Orbit says when a title that looks like HTML is plain text.\n if (HTML_TAGS.test(text) && outline.attributes._textFormat !== 'plain') {\n const title = titleFromHtml(text);\n idea.text = title.text;\n\n if (title.link && isKeptLink(title.link) && !title.link.startsWith('#')) {\n idea.link = title.link;\n }\n }\n\n const note = readNote(outline, idea, report);\n\n if (note) {\n idea.notes.push(note);\n }\n\n idea.status = readStatus(outline);\n const link = readLink(outline);\n const kept = link ? keptAddress(link) : null;\n\n if (kept) {\n idea.link = kept;\n } else if (link) {\n report.add('local-links-not-kept', link);\n }\n\n const categories = attributeOf(outline, 'category');\n\n if (categories) {\n idea.tags.push(...categories.split(',').map((category) => category.trim().replace(/^\\/+/, '')).filter((category) => category !== ''));\n }\n\n idea.children = childElements(outline, 'outline').map((child) => readOutline(child, report));\n return idea;\n};\n\n/** The outline's note: `_note`, an older app's `note`, or a feed's description. */\nconst readNote = (outline: MarkupElement, idea: ImportedIdea, report: ImportReport): ImportedNote | undefined => {\n const text = attributeOf(outline, '_note') ?? outline.attributes.note ?? attributeOf(outline, 'description');\n\n if (text === undefined || text.trim() === '') {\n return undefined;\n }\n\n // Orbit says how to read a note when its text alone wouldn't.\n const format = outline.attributes._noteFormat;\n\n if (format === 'markdown' || format === 'plain') {\n return { text: text.replace(/\\r\\n?/g, '\\n').trim(), format };\n }\n\n if (HTML_TAGS.test(text)) {\n const note = noteFromHtml(text.replace(/\\r\\n?|\\n/g, '<br>'));\n\n if (note?.format === 'plain') {\n report.add('formatting-not-kept', idea.text || undefined);\n }\n\n return note;\n }\n\n return noteFromPlainText(text);\n};\n\n/** OmniOutliner's `_status`, Workflowy's `_complete` and Dynalist's `complete`, as Orbit's statuses. */\nconst readStatus = (outline: MarkupElement): string | undefined => {\n const status = attributeOf(outline, '_status')?.trim();\n\n if (status) {\n return CHECKBOX_STATUSES.get(status.toLowerCase()) ?? status;\n }\n\n const complete = (outline.attributes._complete ?? outline.attributes.complete ?? outline.attributes.checked ?? outline.attributes._checked)?.trim().toLowerCase();\n\n if (complete === 'true') {\n return 'done';\n }\n\n return outline.attributes.checkbox === 'true' ? 'todo' : undefined;\n};\n\n/** The outline's address: a link's or an include's `url`, a feed's site or the feed itself. */\nconst readLink = (outline: MarkupElement): string | undefined => {\n const url = outline.attributes.url ?? outline.attributes.htmlUrl ?? outline.attributes.xmlUrl;\n return url?.trim() || undefined;\n};\n\nexport interface OrbitOPMLOptions {\n /** The outline's title, in its head. Default: the map's `title`, or its root's text. */\n title?: string;\n}\n\n/** Orbit's statuses that are checkboxes in OPML, the others written as they are. */\nconst STATUS_CHECKBOXES = new Map([['done', 'checked'], ['todo', 'unchecked'], ['active', 'indeterminate']]);\nconst CHECKBOX_STATUSES = new Map([...STATUS_CHECKBOXES].map(([status, checkbox]) => [checkbox, status]));\n\n/** Statuses Workflowy should show crossed out. */\nconst DONE_WORDS = new Set(['done', 'complete', 'completed', 'shipped']);\n\n/**\n * A map as OPML: the root is the one top outline, each node an outline\n * with its icon and text, its note in `_note`, its link as `type=\"link\"`\n * with a `url`, its status in `_status` (`checked`, `unchecked` and\n * `indeterminate` for done, todo and active; any other word as it is) and\n * `_complete`, and its tags as `category`. Pictures, videos, colors and\n * priorities have no place in OPML: a zip or the map's own file keeps them.\n */\nexport const exportOPML = (input: string | OrbitDocument, options: OrbitOPMLOptions = {}): string => {\n const document = typeof input === 'string' ? parseOrbit(input) : input;\n const title = options.title ?? (document.options.title || document.root.text);\n const lines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<opml version=\"2.0\">',\n ' <head>',\n ` <title>${escapeXml(title)}</title>`,\n ' </head>',\n ' <body>',\n ];\n\n const write = (node: OrbitNode, depth: number): void => {\n const indent = ' '.repeat(depth + 2);\n const attributes = outlineAttributes(node).map(([name, value]) => ` ${name}=\"${escapeXml(value, true)}\"`).join('');\n\n if (node.children.length === 0) {\n lines.push(`${indent}<outline${attributes}/>`);\n return;\n }\n\n lines.push(`${indent}<outline${attributes}>`);\n\n for (const child of node.children) {\n write(child, depth + 1);\n }\n\n lines.push(`${indent}</outline>`);\n };\n\n write(document.root, 0);\n lines.push(' </body>', '</opml>', '');\n return lines.join('\\n');\n};\n\nconst outlineAttributes = (node: OrbitNode): [string, string][] => {\n const text = node.icon ? `${node.icon} ${node.text}` : node.text;\n const attributes: [string, string][] = [['text', text]];\n\n if (HTML_TAGS.test(text)) {\n attributes.push(['_textFormat', 'plain']);\n }\n\n if (node.note) {\n attributes.push(['_note', node.note]);\n const format = node.noteFormat ?? 'markdown';\n\n // Said only when the note's text alone would read the other way.\n if (noteFromPlainText(node.note)?.format !== format) {\n attributes.push(['_noteFormat', format]);\n }\n }\n\n const status = node.status?.trim();\n\n if (status) {\n attributes.push(['_status', STATUS_CHECKBOXES.get(status) ?? status]);\n\n if (DONE_WORDS.has(status.toLowerCase())) {\n attributes.push(['_complete', 'true']);\n }\n }\n\n if (node.link && (isKeptLink(node.link) || isNodeLink(node.link))) {\n attributes.push(['type', 'link'], ['url', node.link]);\n }\n\n if (node.tags && node.tags.length > 0) {\n attributes.push(['category', node.tags.map((tag) => tag.replace(/,/g, ' ')).join(',')]);\n }\n\n return attributes;\n};\n\n/** Text for XML; in an attribute, line breaks and tabs are written as references, so readers keep them. */\nconst escapeXml = (text: string, attribute = false): string => {\n const escaped = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n return attribute ? escaped.replace(/\"/g, '&quot;').replace(/\\n/g, '&#10;').replace(/\\r/g, '&#13;').replace(/\\t/g, '&#9;') : escaped;\n};\n",
20
+ "/**\n * Inflate (RFC 1951), the compression inside zip files, read synchronously\n * and without `DecompressionStream`: the oldest browsers Orbit draws in\n * can't decompress raw deflate data, and a command line has no need to wait.\n * Codes are decoded the canonical way, a bit at a time, which is plenty fast\n * for the few megabytes a map holds.\n */\n\n/** Data that isn't valid deflate data, or holds more than it said it would. */\nexport class InflateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InflateError';\n }\n}\n\nconst LENGTH_BASES = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];\nconst LENGTH_EXTRA_BITS = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\nconst DISTANCE_BASES = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];\nconst DISTANCE_EXTRA_BITS = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\nconst CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\nconst MAX_BITS = 15;\n\n/** A canonical Huffman code: how many codes have each length, and the symbols in code order. */\ninterface HuffmanCode {\n counts: Uint16Array;\n symbols: Uint16Array;\n}\n\nconst buildCode = (lengths: Uint8Array): HuffmanCode => {\n const counts = new Uint16Array(MAX_BITS + 1);\n\n for (const length of lengths) {\n counts[length] += 1;\n }\n\n counts[0] = 0;\n let left = 1;\n\n for (let length = 1; length <= MAX_BITS; length++) {\n left = left * 2 - counts[length];\n\n if (left < 0) {\n throw new InflateError('A Huffman code with more codes than its lengths allow');\n }\n }\n\n const offsets = new Uint16Array(MAX_BITS + 2);\n\n for (let length = 1; length <= MAX_BITS; length++) {\n offsets[length + 1] = offsets[length] + counts[length];\n }\n\n const symbols = new Uint16Array(lengths.length);\n\n for (let symbol = 0; symbol < lengths.length; symbol++) {\n if (lengths[symbol] !== 0) {\n symbols[offsets[lengths[symbol]]++] = symbol;\n }\n }\n\n return { counts, symbols };\n};\n\nconst fixedLengths = new Uint8Array(288);\nfixedLengths.fill(8, 0, 144);\nfixedLengths.fill(9, 144, 256);\nfixedLengths.fill(7, 256, 280);\nfixedLengths.fill(8, 280, 288);\nconst FIXED_LITERALS = buildCode(fixedLengths);\nconst FIXED_DISTANCES = buildCode(new Uint8Array(30).fill(5));\n\nclass BitReader {\n private readonly data: Uint8Array;\n private position: number;\n private buffer = 0;\n private count = 0;\n\n constructor(data: Uint8Array, start: number) {\n this.data = data;\n this.position = start;\n }\n\n bits(needed: number): number {\n while (this.count < needed) {\n if (this.position >= this.data.length) {\n throw new InflateError('The data ends in the middle of a block');\n }\n\n this.buffer |= this.data[this.position++] << this.count;\n this.count += 8;\n }\n\n const value = this.buffer & ((1 << needed) - 1);\n this.buffer >>>= needed;\n this.count -= needed;\n return value;\n }\n\n /** Skips to the next whole byte and reads `length` bytes from there. */\n bytes(length: number): Uint8Array {\n this.buffer = 0;\n this.count = 0;\n\n if (this.position + length > this.data.length) {\n throw new InflateError('The data ends in the middle of a stored block');\n }\n\n const bytes = this.data.subarray(this.position, this.position + length);\n this.position += length;\n return bytes;\n }\n\n /** Skips to the next whole byte and reads a 16-bit little-endian number. */\n word(): number {\n const [low, high] = this.bytes(2);\n return low | (high << 8);\n }\n\n decode(code: HuffmanCode): number {\n let value = 0;\n let first = 0;\n let index = 0;\n\n for (let length = 1; length <= MAX_BITS; length++) {\n value |= this.bits(1);\n const count = code.counts[length];\n\n if (value - first < count) {\n return code.symbols[index + value - first];\n }\n\n index += count;\n first = (first + count) << 1;\n value <<= 1;\n }\n\n throw new InflateError('A code that no Huffman table has');\n }\n}\n\n/** Grows as it's written, never past its limit. */\nclass Output {\n bytes: Uint8Array;\n length = 0;\n private readonly limit: number;\n\n constructor(expected: number | undefined, limit: number) {\n this.limit = limit;\n this.bytes = new Uint8Array(Math.max(16, Math.min(expected ?? 65536, limit)));\n }\n\n private room(extra: number): void {\n const needed = this.length + extra;\n\n if (needed > this.limit) {\n throw new InflateError(`The data holds more than the ${this.limit} bytes it may`);\n }\n\n if (needed > this.bytes.length) {\n const grown = new Uint8Array(Math.min(this.limit, Math.max(needed, this.bytes.length * 2)));\n grown.set(this.bytes.subarray(0, this.length));\n this.bytes = grown;\n }\n }\n\n push(byte: number): void {\n this.room(1);\n this.bytes[this.length++] = byte;\n }\n\n append(bytes: Uint8Array): void {\n this.room(bytes.length);\n this.bytes.set(bytes, this.length);\n this.length += bytes.length;\n }\n\n copy(distance: number, length: number): void {\n if (distance > this.length) {\n throw new InflateError('A back reference to before the start of the data');\n }\n\n this.room(length);\n\n for (let index = 0; index < length; index++) {\n this.bytes[this.length] = this.bytes[this.length - distance];\n this.length += 1;\n }\n }\n}\n\n/**\n * Raw deflate data, inflated. `expected` sizes the output when it's known\n * (a zip entry says so); the output never grows past `limit`, so a small\n * file can't unpack into an enormous one.\n */\nexport const inflate = (data: Uint8Array, options: { expected?: number; limit?: number } = {}): Uint8Array => {\n const limit = options.limit ?? Math.max(options.expected ?? 0, 64 * 1024 * 1024);\n const reader = new BitReader(data, 0);\n const output = new Output(options.expected, limit);\n let last = 0;\n\n while (last === 0) {\n last = reader.bits(1);\n const type = reader.bits(2);\n\n if (type === 0) {\n const length = reader.word();\n const complement = reader.word();\n\n if ((length ^ 0xffff) !== complement) {\n throw new InflateError(\"A stored block whose length doesn't match its complement\");\n }\n\n output.append(reader.bytes(length));\n } else if (type === 1) {\n inflateBlock(reader, output, FIXED_LITERALS, FIXED_DISTANCES);\n } else if (type === 2) {\n const [literals, distances] = readDynamicCodes(reader);\n inflateBlock(reader, output, literals, distances);\n } else {\n throw new InflateError('A block of an unknown type');\n }\n }\n\n return output.bytes.subarray(0, output.length);\n};\n\nconst readDynamicCodes = (reader: BitReader): [HuffmanCode, HuffmanCode] => {\n const literalCount = reader.bits(5) + 257;\n const distanceCount = reader.bits(5) + 1;\n const codeLengthCount = reader.bits(4) + 4;\n\n if (literalCount > 286 || distanceCount > 30) {\n throw new InflateError('A block with more codes than deflate has');\n }\n\n const codeLengths = new Uint8Array(19);\n\n for (let index = 0; index < codeLengthCount; index++) {\n codeLengths[CODE_LENGTH_ORDER[index]] = reader.bits(3);\n }\n\n const codeLengthCode = buildCode(codeLengths);\n const lengths = new Uint8Array(literalCount + distanceCount);\n let index = 0;\n\n while (index < lengths.length) {\n const symbol = reader.decode(codeLengthCode);\n\n if (symbol < 16) {\n lengths[index++] = symbol;\n continue;\n }\n\n let repeat: number;\n let value = 0;\n\n if (symbol === 16) {\n if (index === 0) {\n throw new InflateError('A repeat with nothing before it');\n }\n\n value = lengths[index - 1];\n repeat = 3 + reader.bits(2);\n } else if (symbol === 17) {\n repeat = 3 + reader.bits(3);\n } else {\n repeat = 11 + reader.bits(7);\n }\n\n if (index + repeat > lengths.length) {\n throw new InflateError('Code lengths that run past their table');\n }\n\n lengths.fill(value, index, index + repeat);\n index += repeat;\n }\n\n if (lengths[256] === 0) {\n throw new InflateError('A block with no code for its end');\n }\n\n return [buildCode(lengths.subarray(0, literalCount)), buildCode(lengths.subarray(literalCount))];\n};\n\nconst inflateBlock = (reader: BitReader, output: Output, literals: HuffmanCode, distances: HuffmanCode): void => {\n for (;;) {\n const symbol = reader.decode(literals);\n\n if (symbol < 256) {\n output.push(symbol);\n } else if (symbol === 256) {\n return;\n } else {\n const lengthIndex = symbol - 257;\n\n if (lengthIndex >= LENGTH_BASES.length) {\n throw new InflateError('A length code deflate has no length for');\n }\n\n const length = LENGTH_BASES[lengthIndex] + reader.bits(LENGTH_EXTRA_BITS[lengthIndex]);\n const distanceSymbol = reader.decode(distances);\n\n if (distanceSymbol >= DISTANCE_BASES.length) {\n throw new InflateError('A distance code deflate has no distance for');\n }\n\n output.copy(DISTANCE_BASES[distanceSymbol] + reader.bits(DISTANCE_EXTRA_BITS[distanceSymbol]), length);\n }\n }\n};\n\nlet crcTable: Uint32Array | null = null;\n\n/** The CRC-32 zip files check their entries with. */\nexport const crc32 = (bytes: Uint8Array): number => {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n\n for (let index = 0; index < 256; index++) {\n let value = index;\n\n for (let bit = 0; bit < 8; bit++) {\n value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;\n }\n\n crcTable[index] = value >>> 0;\n }\n }\n\n let crc = 0xffffffff;\n\n for (const byte of bytes) {\n crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n }\n\n return (crc ^ 0xffffffff) >>> 0;\n};\n",
21
+ "/**\n * Reads files out of a zip archive, such as an XMind map: its directory,\n * then each entry on request, stored or deflated, checked against its\n * CRC-32. Archives that span disks, need ZIP64 or are encrypted are refused,\n * and so is an entry that would unpack past the archive's limits.\n */\n\nimport { crc32, inflate, InflateError } from './inflate.js';\n\n/** An archive that can't be read, or an entry that can't be unpacked. */\nexport class ZipError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZipError';\n }\n}\n\nexport interface ZipLimits {\n /** The most entries an archive may list. */\n entries: number;\n\n /** The most bytes one entry may unpack to. */\n entrySize: number;\n\n /** The most bytes all the entries read may unpack to, together. */\n totalSize: number;\n}\n\nexport const DEFAULT_ZIP_LIMITS: ZipLimits = {\n entries: 20000,\n entrySize: 64 * 1024 * 1024,\n totalSize: 256 * 1024 * 1024,\n};\n\ninterface ZipEntry {\n name: string;\n flags: number;\n method: number;\n crc: number;\n compressedSize: number;\n size: number;\n headerOffset: number;\n}\n\nconst END_OF_DIRECTORY = 0x06054b50;\nconst DIRECTORY_ENTRY = 0x02014b50;\nconst LOCAL_HEADER = 0x04034b50;\n\n/** Whether bytes start the way every zip archive does. */\nexport const isZip = (bytes: Uint8Array): boolean => {\n return bytes.length >= 4 && bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04;\n};\n\nexport class ZipArchive {\n private readonly bytes: Uint8Array;\n private readonly view: DataView;\n private readonly limits: ZipLimits;\n private readonly entries = new Map<string, ZipEntry>();\n private unpacked = 0;\n\n constructor(bytes: Uint8Array, limits: Partial<ZipLimits> = {}) {\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n this.limits = { ...DEFAULT_ZIP_LIMITS, ...limits };\n this.readDirectory();\n }\n\n /** The names of the files in the archive, folders left out. */\n get names(): string[] {\n return [...this.entries.keys()].filter((name) => !name.endsWith('/'));\n }\n\n has(name: string): boolean {\n return this.entries.has(name);\n }\n\n /** An entry's bytes, or null when the archive has no such file. */\n read(name: string): Uint8Array | null {\n const entry = this.entries.get(name);\n\n if (!entry) {\n return null;\n }\n\n if (entry.flags & 1) {\n throw new ZipError(`${name} is encrypted`);\n }\n\n if (entry.size > this.limits.entrySize || this.unpacked + entry.size > this.limits.totalSize) {\n throw new ZipError(`${name} is too large to unpack`);\n }\n\n const offset = entry.headerOffset;\n\n if (offset + 30 > this.bytes.length || this.view.getUint32(offset, true) !== LOCAL_HEADER) {\n throw new ZipError(`The archive has no data where ${name} should start`);\n }\n\n const start = offset + 30 + this.view.getUint16(offset + 26, true) + this.view.getUint16(offset + 28, true);\n const end = start + entry.compressedSize;\n\n if (end > this.bytes.length) {\n throw new ZipError(`${name} runs past the end of the archive`);\n }\n\n const stored = this.bytes.subarray(start, end);\n let data: Uint8Array;\n\n if (entry.method === 0) {\n data = stored;\n } else if (entry.method === 8) {\n try {\n data = inflate(stored, { expected: entry.size, limit: entry.size });\n } catch (error) {\n throw new ZipError(`${name} can't be unpacked: ${error instanceof InflateError ? error.message : String(error)}`);\n }\n } else {\n throw new ZipError(`${name} is compressed a way Orbit can't read (method ${entry.method})`);\n }\n\n if (data.length !== entry.size || crc32(data) !== entry.crc) {\n throw new ZipError(`${name} is damaged: its contents don't match its checksum`);\n }\n\n this.unpacked += data.length;\n return data;\n }\n\n /** An entry as UTF-8 text, or null when the archive has no such file. */\n text(name: string): string | null {\n const data = this.read(name);\n return data === null ? null : new TextDecoder('utf-8').decode(data);\n }\n\n private readDirectory(): void {\n const bytes = this.bytes;\n const view = this.view;\n let end = -1;\n\n // The directory's end record sits in the last 22 bytes, or before a comment of up to 64 KB.\n for (let index = bytes.length - 22; index >= Math.max(0, bytes.length - 22 - 65535); index--) {\n if (view.getUint32(index, true) === END_OF_DIRECTORY) {\n end = index;\n break;\n }\n }\n\n if (end === -1) {\n throw new ZipError('The file is not a zip archive, or its end is missing');\n }\n\n const disk = view.getUint16(end + 4, true);\n const count = view.getUint16(end + 10, true);\n const size = view.getUint32(end + 12, true);\n const offset = view.getUint32(end + 16, true);\n\n if (disk !== 0) {\n throw new ZipError('The archive spans several disks');\n }\n\n if (count === 0xffff || size === 0xffffffff || offset === 0xffffffff) {\n throw new ZipError('The archive needs ZIP64, which Orbit reads no map from');\n }\n\n if (count > this.limits.entries) {\n throw new ZipError(`The archive lists more than ${this.limits.entries} files`);\n }\n\n if (offset + size > end) {\n throw new ZipError(\"The archive's directory runs past its end\");\n }\n\n const decoder = new TextDecoder('utf-8');\n let position = offset;\n\n for (let index = 0; index < count; index++) {\n if (position + 46 > end || view.getUint32(position, true) !== DIRECTORY_ENTRY) {\n throw new ZipError(\"The archive's directory is damaged\");\n }\n\n const nameLength = view.getUint16(position + 28, true);\n const extraLength = view.getUint16(position + 30, true);\n const commentLength = view.getUint16(position + 32, true);\n\n if (position + 46 + nameLength > end) {\n throw new ZipError(\"The archive's directory is damaged\");\n }\n\n const name = decoder.decode(bytes.subarray(position + 46, position + 46 + nameLength));\n const entry: ZipEntry = {\n name,\n flags: view.getUint16(position + 8, true),\n method: view.getUint16(position + 10, true),\n crc: view.getUint32(position + 16, true),\n compressedSize: view.getUint32(position + 20, true),\n size: view.getUint32(position + 24, true),\n headerOffset: view.getUint32(position + 42, true),\n };\n\n if (!this.entries.has(name)) {\n this.entries.set(name, entry);\n }\n\n position += 46 + nameLength + extraLength + commentLength;\n }\n }\n}\n",
22
+ "/**\n * XMind workbooks (`.xmind`): zip archives holding `content.json` (XMind\n * 2020 and later, and XMind Zen) or `content.xml` (XMind 8 and earlier),\n * with their pictures. Each sheet becomes a map: its topics with their notes,\n * labels, markers, links, folds, fill colors and pictures, floating topics,\n * summaries and callouts under the topics they belong with, and\n * relationships as links.\n */\n\nimport { xmindMarker } from './icons.js';\nimport { buildDocument, ImportReport, newIdea, OrbitImportError, sourceLink, type ImportedIdea } from './ideas.js';\nimport { attributeOf, childElement, childElements, isElement, MarkupError, parseXml, textContent, type MarkupElement } from './markup.js';\nimport { keptAddress, noteFromBlocks, noteFromHtml, noteFromPlainText, type ImportedNote, type NoteAddresses, type NoteBlock, type NoteInline } from './notes.js';\nimport type { OrbitImportedMap, OrbitImport, OrbitImportOptions } from './reading.js';\nimport { isZip, ZipArchive, ZipError } from './zip.js';\n\n/** The extensions of the pictures a map keeps. */\nconst PICTURE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'avif', 'heic', 'heif']);\n\n/**\n * An XMind workbook, from its bytes; or its `content.json` or `content.xml`\n * as text, which reads without pictures.\n */\nexport const importXMind = (data: Uint8Array | string, options: OrbitImportOptions = {}): OrbitImport => {\n const workbook = openWorkbook(data);\n const maps: OrbitImportedMap[] = [];\n\n if (workbook.json !== undefined) {\n for (const sheet of workbook.json) {\n if (isObject(sheet) && isObject(sheet.rootTopic)) {\n maps.push(new JsonSheetReader(workbook.archive).read(sheet));\n }\n }\n } else if (workbook.xml) {\n const styles = workbook.archive ? readStyles(workbook.archive) : new Map<string, string>();\n const comments = workbook.archive ? readComments(workbook.archive) : new Map<string, string[]>();\n\n for (const sheet of childElements(workbook.xml, 'sheet')) {\n const topic = childElement(sheet, 'topic');\n\n if (topic) {\n maps.push(new XmlSheetReader(workbook.archive, styles, comments).read(sheet, topic));\n }\n }\n }\n\n if (maps.length === 0) {\n throw new OrbitImportError('empty', `The workbook${options.name ? ` ${options.name}` : ''} has no sheet with a topic.`);\n }\n\n return { format: 'xmind', maps };\n};\n\ninterface Workbook {\n archive: ZipArchive | null;\n json?: unknown[];\n xml?: MarkupElement;\n}\n\nconst openWorkbook = (data: Uint8Array | string): Workbook => {\n if (typeof data === 'string') {\n return readContent(data, null, data.trimStart().startsWith('[') ? 'json' : 'xml');\n }\n\n if (!isZip(data)) {\n return readContent(new TextDecoder('utf-8').decode(data), null, 'xml');\n }\n\n let archive: ZipArchive;\n\n try {\n archive = new ZipArchive(data);\n } catch (error) {\n throw unreadable(error);\n }\n\n if (isEncrypted(archive)) {\n throw new OrbitImportError('password-protected', 'The workbook is protected with a password: open it in XMind and save it without one first.');\n }\n\n try {\n // XMind 2020 and later also write a content.xml that only says to open the file in a newer XMind.\n if (archive.has('content.json')) {\n return readContent(archive.text('content.json') ?? '', archive, 'json');\n }\n\n if (archive.has('content.xml')) {\n return readContent(archive.text('content.xml') ?? '', archive, 'xml');\n }\n } catch (error) {\n throw unreadable(error);\n }\n\n throw new OrbitImportError('unreadable', \"The file is a zip archive, but not an XMind workbook: it has no content.json or content.xml.\");\n};\n\nconst readContent = (text: string, archive: ZipArchive | null, kind: 'json' | 'xml'): Workbook => {\n if (kind === 'json') {\n let json: unknown;\n\n try {\n json = JSON.parse(text);\n } catch (error) {\n throw new OrbitImportError('unreadable', `The workbook's content.json can't be read: ${(error as Error).message}.`);\n }\n\n if (!Array.isArray(json)) {\n throw new OrbitImportError('unreadable', \"The workbook's content.json isn't a list of sheets.\");\n }\n\n return { archive, json };\n }\n\n let xml: MarkupElement;\n\n try {\n xml = parseXml(text);\n } catch (error) {\n throw unreadable(error);\n }\n\n if (xml.localName !== 'xmap-content') {\n throw new OrbitImportError('unreadable', `The file isn't an XMind workbook: it starts with <${xml.name}>, not <xmap-content>.`);\n }\n\n return { archive, xml };\n};\n\nconst unreadable = (error: unknown): OrbitImportError => {\n if (error instanceof ZipError && /encrypted/.test(error.message)) {\n return new OrbitImportError('password-protected', 'The workbook is protected with a password: open it in XMind and save it without one first.');\n }\n\n if (error instanceof ZipError || error instanceof MarkupError) {\n return new OrbitImportError('unreadable', `The workbook can't be read: ${error.message}.`);\n }\n\n return error instanceof OrbitImportError ? error : new OrbitImportError('unreadable', `The workbook can't be read: ${(error as Error).message}.`);\n};\n\n/** Whether XMind encrypted the workbook's content with a password. */\nconst isEncrypted = (archive: ZipArchive): boolean => {\n try {\n const manifest = archive.has('META-INF/manifest.xml') ? archive.text('META-INF/manifest.xml') ?? '' : '';\n const json = archive.has('manifest.json') ? archive.text('manifest.json') ?? '' : '';\n return /<encryption-data/.test(manifest) || /\"encryption/.test(json);\n } catch {\n return false;\n }\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nconst asString = (value: unknown): string | undefined => {\n return typeof value === 'string' ? value : undefined;\n};\n\n/** What reading one sheet shares: its warnings, its pictures, and its topics by id for relationships. */\nabstract class SheetReader {\n protected readonly archive: ZipArchive | null;\n protected readonly report = new ImportReport();\n protected readonly media: Record<string, Uint8Array> = {};\n protected readonly topics = new Map<string, ImportedIdea>();\n private readonly pictureNames = new Map<string, string | null>();\n\n constructor(archive: ZipArchive | null) {\n this.archive = archive;\n }\n\n protected finish(root: ImportedIdea): OrbitImportedMap {\n return { document: buildDocument(root, this.report), media: this.media, warnings: this.report.warnings };\n }\n\n /** A topic's link: to another topic, a web or mail address; an attached file or a file elsewhere can't come along. */\n protected readLink(href: string | undefined, idea: ImportedIdea): void {\n const address = href?.trim();\n\n if (!address) {\n return;\n }\n\n const topic = /^xmind:#(.+)$/.exec(address);\n\n const kept = address.startsWith('#') ? null : keptAddress(address);\n\n if (topic) {\n idea.ideaLinks.push({ target: topic[1] });\n } else if (kept) {\n idea.link = kept;\n } else if (/^xap:/.test(address)) {\n if (PICTURE_EXTENSIONS.has(extensionOf(address)) && !idea.image) {\n idea.image = this.picture(address, idea.text) ?? undefined;\n } else {\n this.report.add('attachments-not-kept', idea.text || address.replace(/^.*\\//, ''));\n }\n } else {\n this.report.add('local-links-not-kept', address);\n }\n }\n\n /** A picture's address in the map: a web address as it is, a picture inside the workbook as a file of the map's `media`. */\n protected picture(src: string, example: string): string | null {\n if (/^https?:\\/\\/\\S+$/i.test(src)) {\n return src;\n }\n\n const inside = /^xap:(.+)$/.exec(src)?.[1];\n\n if (!inside || !this.archive) {\n this.report.add('pictures-not-kept', example || src.replace(/^.*[/\\\\]/, ''));\n return null;\n }\n\n if (!this.pictureNames.has(inside)) {\n this.pictureNames.set(inside, this.unpackPicture(inside));\n }\n\n const name = this.pictureNames.get(inside) ?? null;\n\n if (!name) {\n this.report.add('pictures-not-kept', example || inside.replace(/^.*\\//, ''));\n }\n\n return name;\n }\n\n private unpackPicture(path: string): string | null {\n const extension = extensionOf(path);\n\n if (!PICTURE_EXTENSIONS.has(extension)) {\n return null;\n }\n\n let bytes: Uint8Array | null;\n\n try {\n bytes = this.archive?.read(path) ?? null;\n } catch {\n bytes = null;\n }\n\n if (!bytes) {\n return null;\n }\n\n const base = path.replace(/^.*\\//, '').replace(/\\.[^.]*$/, '').replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^[^A-Za-z0-9]+/, '') || 'picture';\n let name = `media/${base}.${extension}`;\n\n for (let suffix = 2; this.media[name] !== undefined; suffix++) {\n name = `media/${base}-${suffix}.${extension}`;\n }\n\n this.media[name] = bytes;\n return name;\n }\n\n protected noteAddresses(example: string): NoteAddresses {\n return {\n link: (href) => {\n const topic = /^xmind:#(.+)$/.exec(href);\n\n if (topic) {\n return sourceLink(topic[1]);\n }\n\n const kept = href.startsWith('#') ? null : keptAddress(href);\n\n if (kept) {\n return kept;\n }\n\n this.report.add('local-links-not-kept', href);\n return null;\n },\n picture: (src) => this.picture(src, example),\n };\n }\n\n protected htmlNote(html: MarkupElement | string, idea: ImportedIdea): ImportedNote | undefined {\n const note = noteFromHtml(html, this.noteAddresses(idea.text));\n\n if (note?.format === 'plain') {\n this.report.add('formatting-not-kept', idea.text || undefined);\n }\n\n return note;\n }\n\n protected readMarker(markerId: string, idea: ImportedIdea): void {\n const meaning = xmindMarker(markerId);\n\n if (!meaning) {\n this.report.add('icons-not-kept', markerId);\n } else if ('icon' in meaning) {\n idea.icons.push(meaning.icon);\n } else if ('priority' in meaning) {\n idea.priority ??= meaning.priority;\n } else {\n idea.status ??= meaning.status;\n }\n }\n\n /** Relationships between topics, as links from the first topic to the second. */\n protected relate(fromId: string | undefined, toId: string | undefined, title: string | undefined): void {\n const from = fromId ? this.topics.get(fromId) : undefined;\n\n if (!from || !toId) {\n this.report.add('missing-link-targets', title || undefined);\n return;\n }\n\n const label = title?.trim();\n from.ideaLinks.push(label ? { target: toId, label } : { target: toId });\n }\n\n /** Topics XMind places beside the tree, under the topic they belong with, warned about by kind. */\n protected adopt(idea: ImportedIdea, children: ImportedIdea[], code: 'floating-ideas-moved' | 'summaries-moved' | 'callouts-moved'): void {\n for (const child of children) {\n this.report.add(code, child.text || undefined);\n idea.children.push(child);\n }\n }\n\n /** A titled boundary's title, as a line of the note of the topic whose subtopics it surrounds. */\n protected boundaryNote(titles: string[], idea: ImportedIdea): void {\n for (const title of titles) {\n const text = title.trim();\n\n if (text !== '') {\n this.report.add('boundaries-in-notes', text);\n const note = noteFromPlainText(text);\n\n if (note) {\n idea.notes.push(note);\n }\n }\n }\n }\n}\n\nconst extensionOf = (path: string): string => {\n return /\\.([A-Za-z0-9]+)$/.exec(path)?.[1].toLowerCase() ?? '';\n};\n\n/** A sheet of `content.json`. */\nclass JsonSheetReader extends SheetReader {\n read(sheet: Record<string, unknown>): OrbitImportedMap {\n const root = this.topic(sheet.rootTopic as Record<string, unknown>, 0);\n\n for (const relationship of Array.isArray(sheet.relationships) ? sheet.relationships : []) {\n if (isObject(relationship)) {\n this.relate(asString(relationship.end1Id), asString(relationship.end2Id), asString(relationship.title));\n }\n }\n\n return this.finish(root);\n }\n\n private topic(topic: Record<string, unknown>, depth: number): ImportedIdea {\n if (depth > 500) {\n throw new OrbitImportError('too-large', 'The sheet goes more than 500 levels deep.');\n }\n\n const idea = newIdea(asString(topic.title) ?? '');\n const id = asString(topic.id);\n\n if (id) {\n idea.sourceId = id;\n this.topics.set(id, idea);\n }\n\n const note = this.note(topic.notes, idea);\n\n if (note) {\n idea.notes.push(note);\n }\n\n if (Array.isArray(topic.labels)) {\n idea.tags.push(...topic.labels.filter((label): label is string => typeof label === 'string'));\n }\n\n for (const marker of Array.isArray(topic.markers) ? topic.markers : []) {\n const markerId = isObject(marker) ? asString(marker.markerId) : undefined;\n\n if (markerId) {\n this.readMarker(markerId, idea);\n }\n }\n\n this.readLink(asString(topic.href), idea);\n\n if (isObject(topic.image)) {\n const src = asString(topic.image.src);\n\n if (src) {\n idea.image ??= this.picture(src, idea.text) ?? undefined;\n }\n }\n\n if (topic.branch === 'folded') {\n idea.collapsed = true;\n }\n\n const style = isObject(topic.style) && isObject(topic.style.properties) ? topic.style.properties : {};\n const fill = asString(style['svg:fill']);\n\n if (fill && /^#[0-9A-Fa-f]{6}$/.test(fill)) {\n idea.color = fill.toUpperCase();\n }\n\n const children = isObject(topic.children) ? topic.children : {};\n const kind = (name: string): ImportedIdea[] => (Array.isArray(children[name]) ? children[name] as unknown[] : [])\n .filter(isObject)\n .map((child) => this.topic(child, depth + 1));\n\n idea.children.push(...kind('attached'));\n this.adopt(idea, kind('summary'), 'summaries-moved');\n this.adopt(idea, kind('callout'), 'callouts-moved');\n this.adopt(idea, kind('detached'), 'floating-ideas-moved');\n\n const boundaries = Array.isArray(topic.boundaries) ? topic.boundaries.filter(isObject).map((boundary) => asString(boundary.title) ?? '') : [];\n this.boundaryNote(boundaries, idea);\n return idea;\n }\n\n /** A topic's note: its HTML (XMind 2020 and later), its paragraphs (XMind Zen), or its plain text. */\n private note(notes: unknown, idea: ImportedIdea): ImportedNote | undefined {\n if (!isObject(notes)) {\n return undefined;\n }\n\n const html = isObject(notes.realHTML) ? asString(notes.realHTML.content) : undefined;\n\n if (html) {\n return this.htmlNote(html, idea);\n }\n\n const paragraphs = isObject(notes.html) && isObject(notes.html.content) && Array.isArray(notes.html.content.paragraphs) ? notes.html.content.paragraphs : null;\n\n if (paragraphs) {\n const blocks: NoteBlock[] = paragraphs.filter(isObject).map((paragraph) => ({\n kind: 'paragraph',\n inline: (Array.isArray(paragraph.spans) ? paragraph.spans : []).filter(isObject).map((span) => styledSpan(span)),\n }));\n const note = noteFromBlocks(blocks);\n\n if (note?.format === 'plain') {\n this.report.add('formatting-not-kept', idea.text || undefined);\n }\n\n return note;\n }\n\n return noteFromPlainText(isObject(notes.plain) ? asString(notes.plain.content) : undefined);\n }\n}\n\n/** A span of an XMind Zen note, with its bold, italics and strikethrough. */\nconst styledSpan = (span: Record<string, unknown>): NoteInline => {\n const properties = isObject(span.style) && isObject(span.style.properties) ? span.style.properties : {};\n let piece: NoteInline = { kind: 'text', text: (asString(span.text) ?? '').replace(/\\s+/g, ' ') };\n\n if (/line-through/.test(asString(properties['fo:text-decoration']) ?? '')) {\n piece = { kind: 'strike', children: [piece] };\n }\n\n if (asString(properties['fo:font-style']) === 'italic') {\n piece = { kind: 'emphasis', children: [piece] };\n }\n\n if (/^(bold|[6-9]00)$/.test(asString(properties['fo:font-weight']) ?? '')) {\n piece = { kind: 'strong', children: [piece] };\n }\n\n return piece;\n};\n\n/** A sheet of `content.xml`. */\nclass XmlSheetReader extends SheetReader {\n private readonly styles: Map<string, string>;\n private readonly comments: Map<string, string[]>;\n\n constructor(archive: ZipArchive | null, styles: Map<string, string>, comments: Map<string, string[]>) {\n super(archive);\n this.styles = styles;\n this.comments = comments;\n }\n\n read(sheet: MarkupElement, topic: MarkupElement): OrbitImportedMap {\n const root = this.topic(topic);\n\n for (const relationships of childElements(sheet, 'relationships')) {\n for (const relationship of childElements(relationships, 'relationship')) {\n const title = childElement(relationship, 'title');\n this.relate(relationship.attributes.end1, relationship.attributes.end2, title ? textContent(title) : undefined);\n }\n }\n\n return this.finish(root);\n }\n\n private topic(topic: MarkupElement): ImportedIdea {\n const title = childElement(topic, 'title');\n const idea = newIdea(title ? textContent(title) : '');\n const id = topic.attributes.id;\n\n if (id) {\n idea.sourceId = id;\n this.topics.set(id, idea);\n }\n\n const notes = childElement(topic, 'notes');\n\n if (notes) {\n const html = childElement(notes, 'html');\n const plain = childElement(notes, 'plain');\n const note = html ? this.htmlNote(html, idea) : noteFromPlainText(plain ? textContent(plain) : undefined);\n\n if (note) {\n idea.notes.push(note);\n }\n }\n\n for (const comment of id ? this.comments.get(id) ?? [] : []) {\n const note = noteFromPlainText(comment);\n\n if (note) {\n idea.notes.push(note);\n }\n }\n\n for (const labels of childElements(topic, 'labels')) {\n idea.tags.push(...childElements(labels, 'label').map((label) => textContent(label)));\n }\n\n for (const markers of childElements(topic, 'marker-refs')) {\n for (const marker of childElements(markers, 'marker-ref')) {\n const markerId = marker.attributes['marker-id'];\n\n if (markerId) {\n this.readMarker(markerId, idea);\n }\n }\n }\n\n this.readLink(attributeOf(topic, 'href'), idea);\n const image = childElement(topic, 'img');\n const src = image ? attributeOf(image, 'src') : undefined;\n\n if (src) {\n idea.image ??= this.picture(src, idea.text) ?? undefined;\n }\n\n if (topic.attributes.branch === 'folded') {\n idea.collapsed = true;\n }\n\n const fill = this.styles.get(topic.attributes['style-id'] ?? '');\n\n if (fill) {\n idea.color = fill;\n }\n\n const children = childElement(topic, 'children');\n const kind = (type: string): ImportedIdea[] => (children ? childElements(children, 'topics') : [])\n .filter((topics) => (topics.attributes.type ?? 'attached') === type)\n .flatMap((topics) => childElements(topics, 'topic').map((child) => this.topic(child)));\n\n idea.children.push(...kind('attached'));\n this.adopt(idea, kind('summary'), 'summaries-moved');\n this.adopt(idea, kind('callout'), 'callouts-moved');\n this.adopt(idea, kind('detached'), 'floating-ideas-moved');\n\n const boundaries = childElements(topic, 'boundaries').flatMap((list) => childElements(list, 'boundary')).map((boundary) => {\n const boundaryTitle = childElement(boundary, 'title');\n return boundaryTitle ? textContent(boundaryTitle) : '';\n });\n\n this.boundaryNote(boundaries, idea);\n return idea;\n }\n}\n\n/** Topic fill colors by style id, from `styles.xml`. */\nconst readStyles = (archive: ZipArchive): Map<string, string> => {\n const fills = new Map<string, string>();\n\n try {\n const text = archive.has('styles.xml') ? archive.text('styles.xml') : null;\n\n if (!text) {\n return fills;\n }\n\n const pending = [parseXml(text)];\n\n while (pending.length > 0) {\n const element = pending.pop() as MarkupElement;\n\n for (const child of element.children) {\n if (!isElement(child)) {\n continue;\n }\n\n if (child.localName === 'style' && child.attributes.type === 'topic' && child.attributes.id) {\n const properties = childElement(child, 'topic-properties');\n const fill = properties ? attributeOf(properties, 'fill') : undefined;\n\n if (fill && /^#[0-9A-Fa-f]{6}$/.test(fill)) {\n fills.set(child.attributes.id, fill.toUpperCase());\n }\n }\n\n pending.push(child);\n }\n }\n } catch {\n // Styles only color topics: a map without them still reads.\n }\n\n return fills;\n};\n\n/** Comments by topic id, from `comments.xml`: \"author: text\". */\nconst readComments = (archive: ZipArchive): Map<string, string[]> => {\n const comments = new Map<string, string[]>();\n\n try {\n const text = archive.has('comments.xml') ? archive.text('comments.xml') : null;\n\n if (!text) {\n return comments;\n }\n\n for (const comment of childElements(parseXml(text), 'comment')) {\n const topic = comment.attributes['object-id'];\n const content = childElement(comment, 'content');\n const words = content ? textContent(content).replace(/\\r\\n?/g, '\\n').trim() : '';\n\n if (topic && words !== '') {\n const author = (comment.attributes.author ?? '').trim();\n comments.set(topic, [...(comments.get(topic) ?? []), author ? `${author}: ${words}` : words]);\n }\n }\n } catch {\n // Comments are extra: a map without them still reads.\n }\n\n return comments;\n};\n",
23
+ "/**\n * Maps from other apps: OPML from outliners and most mind map apps,\n * FreeMind and Freeplane's `.mm`, and XMind's `.xmind`. `importMap` tells\n * the format from the file's name or what it holds and reads it into Orbit\n * maps, with the pictures inside the file and warnings for what Orbit keeps\n * another way or couldn't keep.\n */\n\nimport { importFreeMind } from './freemind.js';\nimport { OrbitImportError } from './ideas.js';\nimport { decodeMarkup } from './markup.js';\nimport { importOPML } from './opml.js';\nimport type { OrbitImport, OrbitImportFormat, OrbitImportOptions } from './reading.js';\nimport { importXMind } from './xmind.js';\nimport { isZip, ZipArchive } from './zip.js';\n\nconst EXTENSIONS: Record<string, OrbitImportFormat> = { opml: 'opml', mm: 'freemind', xmind: 'xmind' };\n\n/**\n * The format of another app's map, from what the file holds, then from its\n * name; null when it's none Orbit reads. Orbit's own markdown and YAML, and\n * its zips, are null too: read those with `parseOrbit`.\n */\nexport const detectImportFormat = (data: Uint8Array | string, name?: string): OrbitImportFormat | null => {\n const extension = /\\.([A-Za-z0-9]+)$/.exec(name ?? '')?.[1].toLowerCase() ?? '';\n return formatInside(data) ?? (Object.prototype.hasOwnProperty.call(EXTENSIONS, extension) ? EXTENSIONS[extension] : null);\n};\n\n/** The format a file's content shows: an XMind archive, or XML whose top element is OPML's, FreeMind's or XMind's. */\nconst formatInside = (data: Uint8Array | string): OrbitImportFormat | null => {\n if (typeof data !== 'string' && isZip(data)) {\n try {\n const archive = new ZipArchive(data);\n return archive.has('content.json') || archive.has('content.xml') ? 'xmind' : null;\n } catch {\n return null;\n }\n }\n\n const text = typeof data === 'string' ? data.slice(0, 4096) : decodeMarkup(data.subarray(0, 4096));\n const root = /^(?:\\s|<\\?[\\s\\S]*?\\?>|<!--[\\s\\S]*?-->|<!DOCTYPE[^>]*>)*<([A-Za-z_][\\w.:-]*)/.exec(text.replace(/^\\ufeff/, ''))?.[1];\n const formats: Record<string, OrbitImportFormat> = { opml: 'opml', map: 'freemind', 'xmap-content': 'xmind' };\n return root && Object.prototype.hasOwnProperty.call(formats, root) ? formats[root] : null;\n};\n\n/**\n * Another app's map as Orbit maps: OPML, FreeMind and Freeplane, or XMind.\n * Pass the file's bytes (its text works for OPML and `.mm`) and its name.\n * Throws an `OrbitImportError` for a file it can't read: one in no format it\n * knows (`unknown-format`), a damaged one (`unreadable`), one with no ideas\n * (`empty`), an XMind workbook with a password (`password-protected`), or one\n * past its limits (`too-large`).\n *\n * ```ts\n * const { maps } = importMap(bytes, { name: 'Trip.xmind' });\n * const markdown = serializeOrbitMarkdown(maps[0].document);\n * ```\n */\nexport const importMap = (data: Uint8Array | string, options: OrbitImportOptions = {}): OrbitImport => {\n const format = options.format ?? detectImportFormat(data, options.name);\n\n switch (format) {\n case 'opml':\n return importOPML(data, options);\n case 'freemind':\n return importFreeMind(data, options);\n case 'xmind':\n return importXMind(data, options);\n default:\n throw new OrbitImportError('unknown-format', `${options.name ? `${options.name} isn't` : \"The file isn't\"} a map Orbit can bring in from another app: it reads OPML, FreeMind and Freeplane (.mm), and XMind (.xmind).`);\n }\n};\n",
12
24
  "import { parseColor, toHex, toneColor, toOklch } from './engine/colors.js';\nimport type { OrbitRendererTheme } from './types.js';\n\n/**\n * Material 3 themes from one color, the way Material You colors an app from\n * its wallpaper: tonal palettes in the color's hue, surfaces and containers\n * picked by tone, and branches in hues spread evenly around the color wheel\n * from it. Picking colors by tone is what keeps text readable: two tones 50\n * apart always have at least 4.5:1 contrast.\n */\n\n/** Material's baseline color: the `material` and `material-night` themes are built from it. */\nexport const MATERIAL_SEED = '#6750A4';\n\nexport interface MaterialThemeOptions {\n /** Dark surfaces with light text, like `material-night`, instead of light ones. */\n dark?: boolean;\n}\n\n/** The tokens a Material theme takes from its color: everything else comes from `material` or `material-night`. */\nexport const MATERIAL_COLOR_TOKENS = [\n 'surface', 'text', 'muted-text', 'root-text', 'node-text', 'node-text-inverse',\n 'color-root', 'color-1', 'color-2', 'color-3', 'color-4', 'color-5', 'color-6', 'color-7',\n 'shade-light', 'shade-dark', 'node-stroke', 'badge-stroke', 'sun-halo', 'ring-stroke', 'link-stroke',\n 'focus-ring', 'note-indicator',\n 'control-background', 'control-text', 'control-muted-text', 'control-active-background', 'control-active-text',\n 'tooltip-background', 'tooltip-text', 'action-background', 'action-text',\n 'sheet-background', 'sheet-text', 'sheet-muted-text', 'sheet-border', 'chip-background', 'chip-text', 'link-text',\n 'status-active', 'status-done', 'status-blocked', 'status-todo', 'status-neutral',\n 'error-background', 'error-border', 'error-text',\n] as const;\n\nexport type MaterialColorToken = (typeof MATERIAL_COLOR_TOKENS)[number];\n\n/** How far around the wheel each branch's hue is from the seed's: a seventh of a turn apart, three sevenths between neighbors. */\nconst BRANCH_HUES = [0, 3, 6, 2, 5, 1, 4].map((step) => (step * 360) / 7);\n/** The most chroma any palette keeps: more, and containers would stop looking like Material's. */\nconst MOST_CHROMA = 0.16;\n/** Branch containers: colorful whatever the seed, as categories need to be told apart. */\nconst BRANCH_CHROMA = 0.11;\nconst ERROR = { hue: 25, chroma: 0.19 };\nconst SUCCESS = { hue: 145, chroma: 0.13 };\n\n/**\n * A Material 3 theme built from `seed`, any CSS color Orbit reads (hex,\n * `rgb()`, `oklch()`…). Use it as the `theme` option, or name it for every\n * map: `registerTheme('brand', materialTheme('#0B57D0'))`.\n */\nexport const materialTheme = (seed: string, options: MaterialThemeOptions = {}): OrbitRendererTheme => {\n const dark = options.dark === true;\n return { preset: dark ? 'material-night' : 'material', tokens: materialColors(seed, dark) };\n};\n\n/** Every color token of a Material theme built from `seed`. */\nexport const materialColors = (seed: string, dark: boolean): Record<MaterialColorToken, string> => {\n const parsed = parseColor(seed);\n\n if (!parsed) {\n throw new Error(`A Material theme needs a color Orbit can read, such as \"#0B57D0\" or \"oklch(0.55 0.15 260)\": got \"${seed}\".`);\n }\n\n const { hue, chroma } = toOklch(parsed);\n const primaryChroma = Math.min(chroma, MOST_CHROMA);\n const palette = (paletteHue: number, paletteChroma: number) => (tone: number) => toHex(toneColor(paletteHue, paletteChroma, tone));\n const primary = palette(hue, primaryChroma);\n const secondary = palette(hue, Math.min(primaryChroma / 3, 0.05));\n const neutral = palette(hue, Math.min(primaryChroma / 10, 0.012));\n const neutralVariant = palette(hue, Math.min(primaryChroma / 5, 0.024));\n const error = palette(ERROR.hue, ERROR.chroma);\n const success = palette(SUCCESS.hue, SUCCESS.chroma);\n const branches = BRANCH_HUES.map((offset) => palette((hue + offset) % 360, BRANCH_CHROMA));\n // Light themes use tone 40 for what stands out, 90 for containers and 10 on them; dark ones 80, 30 and 90.\n const [accent, container, onContainer] = dark ? [80, 30, 90] : [40, 90, 10];\n // Branches a little deeper than Material's containers, so a small moon still shows on the surface.\n const branchTone = dark ? 32 : 88;\n const [colorRoot, ...colors] = [primary(accent), ...branches.map((branch) => branch(branchTone))];\n return {\n surface: neutral(dark ? 6 : 98),\n text: neutral(dark ? 90 : 10),\n 'muted-text': neutralVariant(dark ? 80 : 30),\n 'root-text': neutral(10),\n 'node-text': neutral(10),\n 'node-text-inverse': neutral(dark ? 90 : 100),\n 'color-root': colorRoot,\n 'color-1': colors[0],\n 'color-2': colors[1],\n 'color-3': colors[2],\n 'color-4': colors[3],\n 'color-5': colors[4],\n 'color-6': colors[5],\n 'color-7': colors[6],\n // Siblings step a few tones lighter or darker, staying on their side of the text's contrast\n // and clear of the surface.\n 'shade-light': dark ? neutral(40) : neutralVariant(80),\n 'shade-dark': dark ? neutral(12) : neutralVariant(50),\n 'node-stroke': neutralVariant(dark ? 30 : 80),\n 'badge-stroke': neutral(dark ? 6 : 98),\n 'sun-halo': primary(accent),\n 'ring-stroke': neutralVariant(dark ? 30 : 80),\n 'link-stroke': neutralVariant(dark ? 60 : 50),\n 'focus-ring': primary(accent),\n 'note-indicator': primary(accent),\n 'control-background': neutral(dark ? 12 : 94),\n 'control-text': neutral(dark ? 90 : 10),\n 'control-muted-text': neutralVariant(dark ? 80 : 30),\n 'control-active-background': secondary(container),\n 'control-active-text': secondary(onContainer),\n 'tooltip-background': neutral(dark ? 90 : 20),\n 'tooltip-text': neutral(dark ? 20 : 95),\n 'action-background': neutral(dark ? 17 : 92),\n 'action-text': neutral(dark ? 90 : 10),\n 'sheet-background': neutral(dark ? 10 : 96),\n 'sheet-text': neutral(dark ? 90 : 10),\n 'sheet-muted-text': neutralVariant(dark ? 80 : 30),\n 'sheet-border': neutralVariant(dark ? 30 : 80),\n 'chip-background': secondary(container),\n 'chip-text': secondary(onContainer),\n 'link-text': primary(accent),\n 'status-active': primary(accent),\n 'status-done': success(accent),\n 'status-blocked': error(accent),\n 'status-todo': neutralVariant(60),\n 'status-neutral': neutralVariant(dark ? 70 : 50),\n 'error-background': error(container),\n 'error-border': error(accent),\n 'error-text': error(onContainer),\n };\n};\n"
13
25
  ],
14
- "mappings": "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",
15
- "debugId": "DE40EE65BFF35E2264756E2164756E21",
26
+ "mappings": "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",
27
+ "debugId": "0EF60DBE164EC11364756E2164756E21",
16
28
  "names": []
17
29
  }