bookish-press 0.4.45 → 0.4.47
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.
- package/.env.example +8 -0
- package/.firebaserc +8 -0
- package/.prettierignore +8 -0
- package/.prettierrc.json +5 -0
- package/_update-notifier-last-checked +0 -0
- package/firebase.json +46 -0
- package/firestore.indexes.json +4 -0
- package/firestore.rules +59 -0
- package/functions/.eslintrc.js +28 -0
- package/functions/package-lock.json +12595 -0
- package/functions/package.json +43 -0
- package/functions/src/index.ts +345 -0
- package/functions/tsconfig.dev.json +3 -0
- package/functions/tsconfig.json +15 -0
- package/package.json +53 -270
- package/scripts/claims.cjs +99 -0
- package/src/app.d.ts +9 -0
- package/src/app.html +24 -0
- package/src/lib/components/Auth.svelte +65 -0
- package/{components/Authentication.d.ts → src/lib/components/Authentication.ts} +2 -0
- package/{components → src/lib/components}/BookPreview.svelte +27 -22
- package/{components → src/lib/components}/External.svelte +2 -1
- package/src/lib/components/Link.svelte +58 -0
- package/{components → src/lib/components}/app/BookList.svelte +6 -3
- package/{components → src/lib/components}/app/Button.svelte +5 -4
- package/{components → src/lib/components}/app/Feedback.svelte +11 -7
- package/{components → src/lib/components}/app/Head.svelte +2 -1
- package/{components → src/lib/components}/app/Large.svelte +0 -0
- package/{components → src/lib/components}/app/Lead.svelte +0 -0
- package/{components → src/lib/components}/app/Link.svelte +4 -3
- package/{components → src/lib/components}/app/Options.svelte +5 -4
- package/{components → src/lib/components}/app/Paragraph.svelte +2 -1
- package/{components → src/lib/components}/app/Section.svelte +0 -0
- package/{components → src/lib/components}/app/Table.svelte +0 -0
- package/{components → src/lib/components}/app/TextInput.svelte +12 -9
- package/{components → src/lib/components}/chapter/Atom.svelte +18 -12
- package/src/lib/components/chapter/Block.svelte +42 -0
- package/{components → src/lib/components}/chapter/Callout.svelte +6 -3
- package/{components → src/lib/components}/chapter/CaptionedCode.svelte +21 -13
- package/{components → src/lib/components}/chapter/ChapterBody.svelte +13 -9
- package/{components → src/lib/components}/chapter/Citations.svelte +34 -33
- package/{components → src/lib/components}/chapter/Code.svelte +63 -58
- package/{components → src/lib/components}/chapter/Comment.svelte +30 -18
- package/{components → src/lib/components}/chapter/Definition.svelte +23 -17
- package/{components → src/lib/components}/chapter/Embed.svelte +97 -77
- package/src/lib/components/chapter/ErrorMessage.svelte +12 -0
- package/{components → src/lib/components}/chapter/ExtendedPrism.js +0 -0
- package/{components → src/lib/components}/chapter/Figure.svelte +34 -26
- package/{components → src/lib/components}/chapter/Footnote.svelte +32 -20
- package/{components → src/lib/components}/chapter/Format.svelte +39 -34
- package/{components → src/lib/components}/chapter/InlineCode.svelte +9 -5
- package/{components → src/lib/components}/chapter/Label.svelte +23 -14
- package/{components → src/lib/components}/chapter/Link.svelte +27 -21
- package/{components → src/lib/components}/chapter/List.svelte +5 -3
- package/{components → src/lib/components}/chapter/Marginal.svelte +54 -41
- package/{components → src/lib/components}/chapter/Paragraph.svelte +25 -20
- package/{components → src/lib/components}/chapter/Positioned.svelte +4 -1
- package/{components → src/lib/components}/chapter/Problem.svelte +0 -0
- package/src/lib/components/chapter/Python.svelte +144 -0
- package/{components → src/lib/components}/chapter/Quote.svelte +9 -5
- package/{components → src/lib/components}/chapter/Rule.svelte +4 -1
- package/{components → src/lib/components}/chapter/Table.svelte +11 -7
- package/src/lib/components/chapter/Text.svelte +109 -0
- package/src/lib/components/editor/BookishEditor.svelte +1101 -0
- package/src/lib/components/editor/CalloutEditor.svelte +14 -0
- package/{components → src/lib/components}/editor/CaptionedCodeEditor.svelte +10 -6
- package/src/lib/components/editor/CaretContext.ts +55 -0
- package/{components/editor/CaretState.d.ts → src/lib/components/editor/CaretState.ts} +6 -7
- package/{components/editor/CaretUtilities.d.ts → src/lib/components/editor/CaretUtilities.ts} +1 -0
- package/{components → src/lib/components}/editor/CaretView.svelte +25 -20
- package/src/lib/components/editor/CitationsEditor.svelte +64 -0
- package/{components/editor/Clipboard.d.ts → src/lib/components/editor/Clipboard.ts} +2 -1
- package/{components/editor/Command.d.ts → src/lib/components/editor/Command.ts} +8 -2
- package/{components/editor/Commands.js → src/lib/components/editor/Commands.ts} +730 -315
- package/src/lib/components/editor/ConfirmButton.svelte +51 -0
- package/src/lib/components/editor/DefinitionEditor.svelte +44 -0
- package/src/lib/components/editor/EmbedEditor.svelte +152 -0
- package/{components → src/lib/components}/editor/Icon.svelte +2 -1
- package/{components → src/lib/components}/editor/ImageChooser.svelte +24 -19
- package/src/lib/components/editor/InlineCodeEditor.svelte +16 -0
- package/{components → src/lib/components}/editor/LabelEditor.svelte +14 -9
- package/{components → src/lib/components}/editor/LanguageEditor.svelte +8 -5
- package/src/lib/components/editor/LinkEditor.svelte +110 -0
- package/{components → src/lib/components}/editor/Note.svelte +0 -0
- package/{components → src/lib/components}/editor/Permissions.svelte +43 -36
- package/src/lib/components/editor/PositionEditor.svelte +21 -0
- package/src/lib/components/editor/QuoteEditor.svelte +14 -0
- package/{components → src/lib/components}/editor/Switch.svelte +14 -11
- package/src/lib/components/editor/TableEditor.svelte +14 -0
- package/{components → src/lib/components}/editor/TextEditor.svelte +101 -89
- package/src/lib/components/editor/Toggle.svelte +47 -0
- package/src/lib/components/editor/Toolbar.svelte +297 -0
- package/{components → src/lib/components}/editor/ToolbarGroup.svelte +5 -3
- package/{components → src/lib/components}/editor/ToolbarSpacer.svelte +0 -0
- package/src/lib/components/editor/URLEditor.svelte +15 -0
- package/{components/editor/UndoState.d.ts → src/lib/components/editor/UndoState.ts} +3 -2
- package/{components → src/lib/components}/editor/icons/annotate.svg +0 -0
- package/{components → src/lib/components}/editor/icons/block.svg +0 -0
- package/{components → src/lib/components}/editor/icons/bold.svg +0 -0
- package/{components → src/lib/components}/editor/icons/bullets.svg +0 -0
- package/{components → src/lib/components}/editor/icons/callout.svg +0 -0
- package/{components → src/lib/components}/editor/icons/citation.svg +0 -0
- package/{components → src/lib/components}/editor/icons/clear.svg +0 -0
- package/{components → src/lib/components}/editor/icons/clipboard.svg +0 -0
- package/{components → src/lib/components}/editor/icons/code.svg +0 -0
- package/{components → src/lib/components}/editor/icons/columnafter.svg +0 -0
- package/{components → src/lib/components}/editor/icons/columnbefore.svg +0 -0
- package/{components → src/lib/components}/editor/icons/comment.svg +0 -0
- package/{components → src/lib/components}/editor/icons/copy.svg +0 -0
- package/{components → src/lib/components}/editor/icons/cut.svg +0 -0
- package/{components → src/lib/components}/editor/icons/define.svg +0 -0
- package/{components → src/lib/components}/editor/icons/deletecolumn.svg +0 -0
- package/{components → src/lib/components}/editor/icons/deleterow.svg +0 -0
- package/{components → src/lib/components}/editor/icons/footnote.svg +0 -0
- package/{components → src/lib/components}/editor/icons/header1.svg +0 -0
- package/{components → src/lib/components}/editor/icons/header2.svg +0 -0
- package/{components → src/lib/components}/editor/icons/header3.svg +0 -0
- package/{components → src/lib/components}/editor/icons/home.svg +0 -0
- package/{components → src/lib/components}/editor/icons/indent.svg +0 -0
- package/{components → src/lib/components}/editor/icons/italic.svg +0 -0
- package/{components → src/lib/components}/editor/icons/label.svg +0 -0
- package/{components → src/lib/components}/editor/icons/left.svg +0 -0
- package/{components → src/lib/components}/editor/icons/level.svg +0 -0
- package/{components → src/lib/components}/editor/icons/link.svg +0 -0
- package/{components → src/lib/components}/editor/icons/list.svg +0 -0
- package/{components → src/lib/components}/editor/icons/media.svg +0 -0
- package/{components → src/lib/components}/editor/icons/middle.svg +0 -0
- package/{components → src/lib/components}/editor/icons/numbers.svg +0 -0
- package/{components → src/lib/components}/editor/icons/paragraph.svg +0 -0
- package/{components → src/lib/components}/editor/icons/paste.svg +0 -0
- package/{components → src/lib/components}/editor/icons/quote.svg +0 -0
- package/{components → src/lib/components}/editor/icons/redo.svg +0 -0
- package/{components → src/lib/components}/editor/icons/right.svg +0 -0
- package/{components → src/lib/components}/editor/icons/rowabove.svg +0 -0
- package/{components → src/lib/components}/editor/icons/rowbelow.svg +0 -0
- package/{components → src/lib/components}/editor/icons/rule.svg +0 -0
- package/{components → src/lib/components}/editor/icons/sub.svg +0 -0
- package/{components → src/lib/components}/editor/icons/super.svg +0 -0
- package/{components → src/lib/components}/editor/icons/table.svg +0 -0
- package/{components → src/lib/components}/editor/icons/text.svg +0 -0
- package/{components → src/lib/components}/editor/icons/time.svg +0 -0
- package/{components → src/lib/components}/editor/icons/undo.svg +0 -0
- package/{components → src/lib/components}/editor/icons/unindent.svg +0 -0
- package/{components → src/lib/components}/editor/icons/unlink.svg +0 -0
- package/{components → src/lib/components}/page/Acknowledgements.svelte +19 -10
- package/src/lib/components/page/Authors.svelte +92 -0
- package/src/lib/components/page/BookLoader.svelte +77 -0
- package/src/lib/components/page/BulkReferenceEditor.svelte +86 -0
- package/src/lib/components/page/Chapter.svelte +449 -0
- package/src/lib/components/page/ChapterContext.ts +13 -0
- package/{components → src/lib/components}/page/ChapterNumber.svelte +0 -0
- package/{components → src/lib/components}/page/ChapterTitle.svelte +4 -2
- package/src/lib/components/page/Contexts.ts +176 -0
- package/{components → src/lib/components}/page/DefinitionView.svelte +52 -37
- package/{components → src/lib/components}/page/Description.svelte +15 -7
- package/src/lib/components/page/Edition.svelte +189 -0
- package/src/lib/components/page/EditionLoader.svelte +123 -0
- package/{components → src/lib/components}/page/Editions.svelte +22 -18
- package/{components → src/lib/components}/page/Glossary.svelte +33 -28
- package/{components → src/lib/components}/page/Header.svelte +59 -52
- package/{components → src/lib/components}/page/Index.svelte +48 -41
- package/{components → src/lib/components}/page/Instructions.svelte +2 -1
- package/{components → src/lib/components}/page/License.svelte +17 -9
- package/{components → src/lib/components}/page/Loading.svelte +0 -0
- package/{components → src/lib/components}/page/Media.svelte +44 -27
- package/{components → src/lib/components}/page/MediaPreview.svelte +3 -2
- package/{components → src/lib/components}/page/Muted.svelte +0 -0
- package/{components → src/lib/components}/page/Outline.svelte +140 -110
- package/src/lib/components/page/Page.svelte +94 -0
- package/{components → src/lib/components}/page/PageHeader.svelte +2 -1
- package/{components → src/lib/components}/page/PageParagraph.svelte +0 -0
- package/src/lib/components/page/PossibleChapter.svelte +16 -0
- package/src/lib/components/page/PossibleReference.svelte +14 -0
- package/{components → src/lib/components}/page/Print.svelte +5 -3
- package/{components → src/lib/components}/page/Publish.svelte +59 -52
- package/{components → src/lib/components}/page/Reference.svelte +39 -30
- package/{components → src/lib/components}/page/References.svelte +18 -14
- package/{components → src/lib/components}/page/Rows.svelte +0 -0
- package/src/lib/components/page/Search.svelte +153 -0
- package/{components → src/lib/components}/page/Status.svelte +5 -3
- package/{components → src/lib/components}/page/SubdomainEditor.svelte +16 -13
- package/{components → src/lib/components}/page/TableOfContents.svelte +79 -68
- package/src/lib/components/page/TableOfContentsImage.svelte +22 -0
- package/{components → src/lib/components}/page/TableOfContentsRow.svelte +34 -24
- package/{components → src/lib/components}/page/ThemeEditor.svelte +44 -33
- package/{components → src/lib/components}/page/ThemeEditorPreview.svelte +21 -12
- package/src/lib/components/page/ThemeSetEditor.svelte +21 -0
- package/{components → src/lib/components}/page/ThemeVariableEditor.svelte +18 -14
- package/{components → src/lib/components}/page/Title.svelte +0 -0
- package/{components → src/lib/components}/page/Unknown.svelte +10 -8
- package/{components/page/margins.js → src/lib/components/page/margins.ts} +79 -46
- package/{index.js → src/lib/index.js} +0 -0
- package/src/lib/models/CRUD.ts +469 -0
- package/{models/Firebase.js → src/lib/models/Firebase.ts} +26 -16
- package/src/lib/models/book/Book.ts +283 -0
- package/src/lib/models/book/BookMedia.ts +182 -0
- package/src/lib/models/book/BookSaveStatus.ts +8 -0
- package/src/lib/models/book/Chapter.ts +462 -0
- package/{models/book/ChapterID.js → src/lib/models/book/ChapterID.ts} +1 -0
- package/src/lib/models/book/Definition.ts +2 -0
- package/src/lib/models/book/Edition.ts +1216 -0
- package/src/lib/models/book/Reference.ts +171 -0
- package/{models/book/Schema.js → src/lib/models/book/Schema.ts} +1 -0
- package/{models/book/Theme.js → src/lib/models/book/Theme.ts} +111 -6
- package/{models/book/ThemeColors.d.ts → src/lib/models/book/ThemeColors.ts} +6 -0
- package/{models/book/Words.js → src/lib/models/book/Words.ts} +1 -0
- package/{models/chapter/AtomNode.js → src/lib/models/chapter/AtomNode.ts} +30 -10
- package/{models/chapter/BlockNode.js → src/lib/models/chapter/BlockNode.ts} +80 -47
- package/src/lib/models/chapter/BlocksNode.test.ts +867 -0
- package/{models/chapter/BlocksNode.js → src/lib/models/chapter/BlocksNode.ts} +571 -359
- package/{models/chapter/Bookkeeping.d.ts → src/lib/models/chapter/Bookkeeping.ts} +0 -0
- package/src/lib/models/chapter/CalloutNode.ts +79 -0
- package/{models/chapter/Caret.js → src/lib/models/chapter/Caret.ts} +50 -26
- package/src/lib/models/chapter/ChapterNode.ts +169 -0
- package/{models/chapter/CitationsNode.js → src/lib/models/chapter/CitationsNode.ts} +17 -10
- package/{models/chapter/CodeNode.js → src/lib/models/chapter/CodeNode.ts} +125 -62
- package/src/lib/models/chapter/CommentNode.ts +61 -0
- package/{models/chapter/DefinitionNode.js → src/lib/models/chapter/DefinitionNode.ts} +14 -8
- package/src/lib/models/chapter/Edit.ts +6 -0
- package/src/lib/models/chapter/EmbedNode.ts +257 -0
- package/{models/chapter/ErrorNode.js → src/lib/models/chapter/ErrorNode.ts} +15 -8
- package/src/lib/models/chapter/FootnoteNode.ts +59 -0
- package/src/lib/models/chapter/FormatNode.test.ts +137 -0
- package/{models/chapter/FormatNode.js → src/lib/models/chapter/FormatNode.ts} +443 -262
- package/{models/chapter/InlineCodeNode.js → src/lib/models/chapter/InlineCodeNode.ts} +17 -9
- package/{models/chapter/LabelNode.js → src/lib/models/chapter/LabelNode.ts} +26 -10
- package/{models/chapter/LinkNode.js → src/lib/models/chapter/LinkNode.ts} +12 -7
- package/{models/chapter/ListNode.test.js → src/lib/models/chapter/ListNode.test.ts} +57 -20
- package/{models/chapter/ListNode.js → src/lib/models/chapter/ListNode.ts} +277 -200
- package/src/lib/models/chapter/MetadataNode.ts +44 -0
- package/{models → src/lib/models}/chapter/Node.test.js +0 -0
- package/{models/chapter/Node.js → src/lib/models/chapter/Node.ts} +155 -71
- package/src/lib/models/chapter/ParagraphNode.test.ts +54 -0
- package/{models/chapter/ParagraphNode.js → src/lib/models/chapter/ParagraphNode.ts} +95 -58
- package/{models/chapter/Parser.test.js → src/lib/models/chapter/Parser.test.ts} +7 -0
- package/{models/chapter/Parser.js → src/lib/models/chapter/Parser.ts} +369 -184
- package/{models/chapter/Position.d.ts → src/lib/models/chapter/Position.ts} +0 -0
- package/src/lib/models/chapter/QuoteNode.ts +135 -0
- package/{models/chapter/RootNode.d.ts → src/lib/models/chapter/RootNode.ts} +2 -0
- package/{models/chapter/RuleNode.js → src/lib/models/chapter/RuleNode.ts} +9 -6
- package/{models/chapter/TableNode.test.js → src/lib/models/chapter/TableNode.test.ts} +27 -10
- package/{models/chapter/TableNode.js → src/lib/models/chapter/TableNode.ts} +141 -82
- package/{models/chapter/TextNode.test.js → src/lib/models/chapter/TextNode.test.ts} +2 -0
- package/{models/chapter/TextNode.js → src/lib/models/chapter/TextNode.ts} +117 -65
- package/{util/getSubdomain.js → src/lib/util/getSubdomain.ts} +14 -8
- package/{util/isMobile.js → src/lib/util/isMobile.ts} +1 -0
- package/{util/mineReference.js → src/lib/util/mineReference.ts} +45 -25
- package/{util/scrollToEyeLevel.js → src/lib/util/scrollToEyeLevel.ts} +4 -2
- package/src/params/edition.ts +3 -0
- package/src/routes/+error.svelte +12 -0
- package/src/routes/+layout.svelte +241 -0
- package/src/routes/+page.svelte +43 -0
- package/src/routes/Footer.svelte +0 -0
- package/src/routes/Header.svelte +112 -0
- package/src/routes/[bookid]/+layout.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +14 -0
- package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
- package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
- package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
- package/src/routes/[bookid]/editions/+page.svelte +20 -0
- package/src/routes/about/+page.svelte +102 -0
- package/src/routes/confirm/+page.svelte +62 -0
- package/src/routes/email/+page.svelte +99 -0
- package/src/routes/login/+page.svelte +66 -0
- package/src/routes/read/+page.svelte +38 -0
- package/src/routes/write/+error.svelte +10 -0
- package/src/routes/write/+layout.svelte +11 -0
- package/src/routes/write/+page.svelte +114 -0
- package/src/routes/write/[bookid]/+layout.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +5 -0
- package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +5 -0
- package/src/routes/write/[bookid]/editions/+page.svelte +20 -0
- package/src/vite-env.d.ts +1 -0
- package/static/icons/favicon.png +0 -0
- package/static/icons/icon.png +0 -0
- package/static/icons/ios-icon.png +0 -0
- package/storage.rules +9 -0
- package/svelte.config.js +19 -0
- package/tsconfig.json +18 -0
- package/tsconfig.node.json +9 -0
- package/vite.config.ts +8 -0
- package/vite.reader.config.ts +32 -0
- package/components/Auth.svelte +0 -55
- package/components/Auth.svelte.d.ts +0 -16
- package/components/Authentication.js +0 -1
- package/components/BookPreview.svelte.d.ts +0 -18
- package/components/External.svelte.d.ts +0 -18
- package/components/Link.svelte +0 -51
- package/components/Link.svelte.d.ts +0 -18
- package/components/app/BookList.svelte.d.ts +0 -18
- package/components/app/Button.svelte.d.ts +0 -22
- package/components/app/Feedback.svelte.d.ts +0 -18
- package/components/app/Head.svelte.d.ts +0 -18
- package/components/app/Large.svelte.d.ts +0 -27
- package/components/app/Lead.svelte.d.ts +0 -27
- package/components/app/Link.svelte.d.ts +0 -20
- package/components/app/Options.svelte.d.ts +0 -19
- package/components/app/Paragraph.svelte.d.ts +0 -18
- package/components/app/Section.svelte.d.ts +0 -27
- package/components/app/Table.svelte.d.ts +0 -27
- package/components/app/TextInput.svelte.d.ts +0 -22
- package/components/chapter/Atom.svelte.d.ts +0 -19
- package/components/chapter/Block.svelte +0 -37
- package/components/chapter/Block.svelte.d.ts +0 -17
- package/components/chapter/Callout.svelte.d.ts +0 -17
- package/components/chapter/CaptionedCode.svelte.d.ts +0 -17
- package/components/chapter/ChapterBody.svelte.d.ts +0 -19
- package/components/chapter/Citations.svelte.d.ts +0 -17
- package/components/chapter/Code.svelte.d.ts +0 -22
- package/components/chapter/Comment.svelte.d.ts +0 -17
- package/components/chapter/Definition.svelte.d.ts +0 -17
- package/components/chapter/Embed.svelte.d.ts +0 -20
- package/components/chapter/ErrorMessage.svelte +0 -9
- package/components/chapter/ErrorMessage.svelte.d.ts +0 -17
- package/components/chapter/ExtendedPrism.d.ts +0 -2
- package/components/chapter/Figure.svelte.d.ts +0 -24
- package/components/chapter/Footnote.svelte.d.ts +0 -19
- package/components/chapter/Format.svelte.d.ts +0 -19
- package/components/chapter/InlineCode.svelte.d.ts +0 -17
- package/components/chapter/Label.svelte.d.ts +0 -17
- package/components/chapter/Link.svelte.d.ts +0 -17
- package/components/chapter/List.svelte.d.ts +0 -17
- package/components/chapter/Marginal.svelte.d.ts +0 -22
- package/components/chapter/Paragraph.svelte.d.ts +0 -18
- package/components/chapter/Positioned.svelte.d.ts +0 -19
- package/components/chapter/Problem.svelte.d.ts +0 -27
- package/components/chapter/Python.svelte +0 -128
- package/components/chapter/Python.svelte.d.ts +0 -18
- package/components/chapter/Quote.svelte.d.ts +0 -17
- package/components/chapter/Rule.svelte.d.ts +0 -17
- package/components/chapter/Table.svelte.d.ts +0 -17
- package/components/chapter/Text.svelte +0 -87
- package/components/chapter/Text.svelte.d.ts +0 -18
- package/components/editor/BookishEditor.svelte +0 -884
- package/components/editor/BookishEditor.svelte.d.ts +0 -25
- package/components/editor/CalloutEditor.svelte +0 -10
- package/components/editor/CalloutEditor.svelte.d.ts +0 -17
- package/components/editor/CaptionedCodeEditor.svelte.d.ts +0 -17
- package/components/editor/CaretContext.d.ts +0 -50
- package/components/editor/CaretContext.js +0 -1
- package/components/editor/CaretState.js +0 -1
- package/components/editor/CaretUtilities.js +0 -1
- package/components/editor/CaretView.svelte.d.ts +0 -25
- package/components/editor/CitationsEditor.svelte +0 -53
- package/components/editor/CitationsEditor.svelte.d.ts +0 -17
- package/components/editor/Clipboard.js +0 -1
- package/components/editor/Command.js +0 -1
- package/components/editor/Commands.d.ts +0 -3
- package/components/editor/ConfirmButton.svelte +0 -49
- package/components/editor/ConfirmButton.svelte.d.ts +0 -19
- package/components/editor/DefinitionEditor.svelte +0 -36
- package/components/editor/DefinitionEditor.svelte.d.ts +0 -17
- package/components/editor/EmbedEditor.svelte +0 -137
- package/components/editor/EmbedEditor.svelte.d.ts +0 -17
- package/components/editor/Icon.svelte.d.ts +0 -16
- package/components/editor/ImageChooser.svelte.d.ts +0 -18
- package/components/editor/InlineCodeEditor.svelte +0 -12
- package/components/editor/InlineCodeEditor.svelte.d.ts +0 -17
- package/components/editor/LabelEditor.svelte.d.ts +0 -17
- package/components/editor/LanguageEditor.svelte.d.ts +0 -17
- package/components/editor/LinkEditor.svelte +0 -100
- package/components/editor/LinkEditor.svelte.d.ts +0 -17
- package/components/editor/Note.svelte.d.ts +0 -27
- package/components/editor/Permissions.svelte.d.ts +0 -20
- package/components/editor/PositionEditor.svelte +0 -17
- package/components/editor/PositionEditor.svelte.d.ts +0 -18
- package/components/editor/QuoteEditor.svelte +0 -10
- package/components/editor/QuoteEditor.svelte.d.ts +0 -17
- package/components/editor/Switch.svelte.d.ts +0 -20
- package/components/editor/TableEditor.svelte +0 -10
- package/components/editor/TableEditor.svelte.d.ts +0 -17
- package/components/editor/TextEditor.svelte.d.ts +0 -24
- package/components/editor/Toggle.svelte +0 -41
- package/components/editor/Toggle.svelte.d.ts +0 -19
- package/components/editor/Toolbar.svelte +0 -249
- package/components/editor/Toolbar.svelte.d.ts +0 -17
- package/components/editor/ToolbarGroup.svelte.d.ts +0 -18
- package/components/editor/ToolbarSpacer.svelte.d.ts +0 -23
- package/components/editor/URLEditor.svelte +0 -13
- package/components/editor/URLEditor.svelte.d.ts +0 -18
- package/components/editor/UndoState.js +0 -1
- package/components/page/Acknowledgements.svelte.d.ts +0 -14
- package/components/page/Authors.svelte +0 -85
- package/components/page/Authors.svelte.d.ts +0 -21
- package/components/page/BookLoader.svelte +0 -59
- package/components/page/BookLoader.svelte.d.ts +0 -16
- package/components/page/BulkReferenceEditor.svelte +0 -63
- package/components/page/BulkReferenceEditor.svelte.d.ts +0 -14
- package/components/page/Chapter.svelte +0 -392
- package/components/page/Chapter.svelte.d.ts +0 -18
- package/components/page/ChapterContext.d.ts +0 -10
- package/components/page/ChapterContext.js +0 -1
- package/components/page/ChapterNumber.svelte.d.ts +0 -27
- package/components/page/ChapterTitle.svelte.d.ts +0 -18
- package/components/page/Contexts.d.ts +0 -47
- package/components/page/Contexts.js +0 -133
- package/components/page/DefinitionView.svelte.d.ts +0 -18
- package/components/page/Description.svelte.d.ts +0 -14
- package/components/page/Edition.svelte +0 -161
- package/components/page/Edition.svelte.d.ts +0 -20
- package/components/page/EditionLoader.svelte +0 -99
- package/components/page/EditionLoader.svelte.d.ts +0 -18
- package/components/page/Editions.svelte.d.ts +0 -14
- package/components/page/Glossary.svelte.d.ts +0 -14
- package/components/page/Header.svelte.d.ts +0 -29
- package/components/page/Index.svelte.d.ts +0 -14
- package/components/page/Instructions.svelte.d.ts +0 -18
- package/components/page/License.svelte.d.ts +0 -14
- package/components/page/Loading.svelte.d.ts +0 -23
- package/components/page/Media.svelte.d.ts +0 -14
- package/components/page/MediaPreview.svelte.d.ts +0 -19
- package/components/page/Muted.svelte.d.ts +0 -27
- package/components/page/Outline.svelte.d.ts +0 -19
- package/components/page/Page.svelte +0 -84
- package/components/page/Page.svelte.d.ts +0 -19
- package/components/page/PageHeader.svelte.d.ts +0 -18
- package/components/page/PageParagraph.svelte.d.ts +0 -27
- package/components/page/PossibleChapter.svelte +0 -14
- package/components/page/PossibleChapter.svelte.d.ts +0 -14
- package/components/page/PossibleReference.svelte +0 -11
- package/components/page/PossibleReference.svelte.d.ts +0 -18
- package/components/page/Print.svelte.d.ts +0 -14
- package/components/page/Publish.svelte.d.ts +0 -14
- package/components/page/Reference.svelte.d.ts +0 -17
- package/components/page/References.svelte.d.ts +0 -14
- package/components/page/Rows.svelte.d.ts +0 -27
- package/components/page/Search.svelte +0 -133
- package/components/page/Search.svelte.d.ts +0 -14
- package/components/page/Status.svelte.d.ts +0 -14
- package/components/page/SubdomainEditor.svelte.d.ts +0 -14
- package/components/page/TableOfContents.svelte.d.ts +0 -14
- package/components/page/TableOfContentsImage.svelte +0 -18
- package/components/page/TableOfContentsImage.svelte.d.ts +0 -16
- package/components/page/TableOfContentsRow.svelte.d.ts +0 -24
- package/components/page/ThemeEditor.svelte.d.ts +0 -14
- package/components/page/ThemeEditorPreview.svelte.d.ts +0 -17
- package/components/page/ThemeSetEditor.svelte +0 -19
- package/components/page/ThemeSetEditor.svelte.d.ts +0 -18
- package/components/page/ThemeVariableEditor.svelte.d.ts +0 -18
- package/components/page/Title.svelte.d.ts +0 -27
- package/components/page/Unknown.svelte.d.ts +0 -16
- package/components/page/margins.d.ts +0 -2
- package/index.d.ts +0 -15
- package/models/CRUD.d.ts +0 -27
- package/models/CRUD.js +0 -262
- package/models/Firebase.d.ts +0 -5
- package/models/book/Book.d.ts +0 -61
- package/models/book/Book.js +0 -135
- package/models/book/BookMedia.d.ts +0 -23
- package/models/book/BookMedia.js +0 -108
- package/models/book/BookSaveStatus.d.ts +0 -7
- package/models/book/BookSaveStatus.js +0 -8
- package/models/book/Chapter.d.ts +0 -81
- package/models/book/Chapter.js +0 -212
- package/models/book/ChapterID.d.ts +0 -10
- package/models/book/Definition.d.ts +0 -6
- package/models/book/Definition.js +0 -1
- package/models/book/Edition.d.ts +0 -139
- package/models/book/Edition.js +0 -620
- package/models/book/Reference.d.ts +0 -24
- package/models/book/Reference.js +0 -78
- package/models/book/Schema.d.ts +0 -174
- package/models/book/Theme.d.ts +0 -113
- package/models/book/ThemeColors.js +0 -1
- package/models/book/Words.d.ts +0 -2
- package/models/chapter/AtomNode.d.ts +0 -18
- package/models/chapter/BlockNode.d.ts +0 -20
- package/models/chapter/BlocksNode.d.ts +0 -50
- package/models/chapter/BlocksNode.test.d.ts +0 -1
- package/models/chapter/BlocksNode.test.js +0 -568
- package/models/chapter/Bookkeeping.js +0 -1
- package/models/chapter/CalloutNode.d.ts +0 -17
- package/models/chapter/CalloutNode.js +0 -58
- package/models/chapter/Caret.d.ts +0 -23
- package/models/chapter/ChapterNode.d.ts +0 -34
- package/models/chapter/ChapterNode.js +0 -117
- package/models/chapter/CitationsNode.d.ts +0 -16
- package/models/chapter/CodeNode.d.ts +0 -35
- package/models/chapter/CommentNode.d.ts +0 -18
- package/models/chapter/CommentNode.js +0 -48
- package/models/chapter/DefinitionNode.d.ts +0 -12
- package/models/chapter/Edit.d.ts +0 -7
- package/models/chapter/Edit.js +0 -1
- package/models/chapter/EmbedNode.d.ts +0 -45
- package/models/chapter/EmbedNode.js +0 -168
- package/models/chapter/ErrorNode.d.ts +0 -17
- package/models/chapter/FootnoteNode.d.ts +0 -18
- package/models/chapter/FootnoteNode.js +0 -47
- package/models/chapter/FormatNode.d.ts +0 -60
- package/models/chapter/FormatNode.test.d.ts +0 -1
- package/models/chapter/FormatNode.test.js +0 -96
- package/models/chapter/InlineCodeNode.d.ts +0 -12
- package/models/chapter/LabelNode.d.ts +0 -17
- package/models/chapter/LinkNode.d.ts +0 -12
- package/models/chapter/ListNode.d.ts +0 -51
- package/models/chapter/ListNode.test.d.ts +0 -1
- package/models/chapter/MetadataNode.d.ts +0 -17
- package/models/chapter/MetadataNode.js +0 -32
- package/models/chapter/Node.d.ts +0 -38
- package/models/chapter/Node.test.d.ts +0 -1
- package/models/chapter/ParagraphNode.d.ts +0 -33
- package/models/chapter/ParagraphNode.test.d.ts +0 -1
- package/models/chapter/ParagraphNode.test.js +0 -30
- package/models/chapter/Parser.d.ts +0 -75
- package/models/chapter/Parser.test.d.ts +0 -1
- package/models/chapter/Position.js +0 -1
- package/models/chapter/QuoteNode.d.ts +0 -25
- package/models/chapter/QuoteNode.js +0 -99
- package/models/chapter/RootNode.js +0 -1
- package/models/chapter/RuleNode.d.ts +0 -15
- package/models/chapter/TableNode.d.ts +0 -37
- package/models/chapter/TableNode.test.d.ts +0 -1
- package/models/chapter/TextNode.d.ts +0 -36
- package/models/chapter/TextNode.test.d.ts +0 -1
- package/util/getSubdomain.d.ts +0 -3
- package/util/isMobile.d.ts +0 -2
- package/util/mineReference.d.ts +0 -4
- package/util/scrollToEyeLevel.d.ts +0 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { CaretRange } from './Caret';
|
|
2
|
+
import Node from './Node';
|
|
3
|
+
import type TextNode from './TextNode';
|
|
4
|
+
|
|
5
|
+
export default abstract class MetadataNode<MetaType> extends Node {
|
|
6
|
+
readonly #text: TextNode;
|
|
7
|
+
readonly #meta: MetaType;
|
|
8
|
+
|
|
9
|
+
constructor(text: TextNode, meta: MetaType) {
|
|
10
|
+
super();
|
|
11
|
+
this.#text = text;
|
|
12
|
+
this.#meta = meta;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
getMeta() {
|
|
16
|
+
return this.#meta;
|
|
17
|
+
}
|
|
18
|
+
getText() {
|
|
19
|
+
return this.#text;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
abstract withMeta(meta: MetaType): MetadataNode<MetaType>;
|
|
23
|
+
abstract withText(text: TextNode): MetadataNode<MetaType>;
|
|
24
|
+
abstract toText(): string;
|
|
25
|
+
abstract toBookdown(): string;
|
|
26
|
+
|
|
27
|
+
getChildren() {
|
|
28
|
+
return [this.#text];
|
|
29
|
+
}
|
|
30
|
+
getParentOf(node: Node): Node | undefined {
|
|
31
|
+
return this.#text === node ? this : undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
withChildReplaced(node: TextNode, replacement: TextNode | undefined) {
|
|
35
|
+
if (this.#text === node && replacement !== undefined)
|
|
36
|
+
return this.withText(replacement) as this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
withContentInRange(range: CaretRange): this | undefined {
|
|
40
|
+
const selectedText = this.#text.withContentInRange(range);
|
|
41
|
+
if (selectedText === undefined) return undefined;
|
|
42
|
+
return this.withText(selectedText) as this;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
File without changes
|
|
@@ -1,56 +1,106 @@
|
|
|
1
|
+
import type Caret from './Caret';
|
|
2
|
+
import type { CaretRange } from './Caret';
|
|
3
|
+
import type Edit from './Edit';
|
|
4
|
+
|
|
1
5
|
// A global node ID generator, for mapping views back to models.
|
|
2
6
|
let nodeID = 1;
|
|
3
|
-
|
|
7
|
+
|
|
8
|
+
export default abstract class Node {
|
|
4
9
|
// A globally unique identifier, helpful for mapping things back to nodes.
|
|
5
|
-
nodeID;
|
|
10
|
+
readonly nodeID: number;
|
|
11
|
+
|
|
6
12
|
constructor() {
|
|
7
13
|
this.nodeID = nodeID++;
|
|
8
14
|
}
|
|
15
|
+
|
|
16
|
+
// Returns space-separated text in the string, helpful for searching.
|
|
17
|
+
abstract toText(): string;
|
|
18
|
+
|
|
19
|
+
// Returns a syntactically valid Bookdown string representing the node and it's children.
|
|
20
|
+
abstract toBookdown(): string;
|
|
21
|
+
|
|
22
|
+
// Returns valid HTML representing the node and it's children.
|
|
23
|
+
abstract toHTML(): string;
|
|
24
|
+
|
|
25
|
+
// Returns a string represent the type of node this is.
|
|
26
|
+
abstract getType(): string;
|
|
27
|
+
|
|
28
|
+
// Returns an exact copy of this now.
|
|
29
|
+
abstract copy(): this;
|
|
30
|
+
|
|
31
|
+
// Returns a new node with the given child node replaced, or undefined if it didn't contain such a child.
|
|
32
|
+
abstract withChildReplaced(
|
|
33
|
+
node: Node,
|
|
34
|
+
replacement: Node | undefined
|
|
35
|
+
): this | undefined;
|
|
36
|
+
|
|
37
|
+
// Returns an ordered list of the child nodes.
|
|
38
|
+
abstract getChildren(): Node[];
|
|
39
|
+
|
|
40
|
+
// Recursively returns the parent of the given node.
|
|
41
|
+
abstract getParentOf(node: Node): Node | undefined;
|
|
42
|
+
|
|
9
43
|
getID() {
|
|
10
44
|
return this.nodeID;
|
|
11
45
|
}
|
|
12
|
-
|
|
46
|
+
|
|
47
|
+
traverse(
|
|
48
|
+
fn: (node: Node, parents: Node[]) => void,
|
|
49
|
+
parents?: Node[]
|
|
50
|
+
): void {
|
|
13
51
|
const path = parents === undefined ? [this] : [...parents, this];
|
|
14
52
|
this.traverseChildren(fn, path);
|
|
15
53
|
fn.call(undefined, this, path);
|
|
16
54
|
}
|
|
55
|
+
|
|
17
56
|
// Traverses each of the children of this node.
|
|
18
|
-
traverseChildren(
|
|
57
|
+
traverseChildren(
|
|
58
|
+
fn: (node: Node, parents: Node[]) => void,
|
|
59
|
+
parents: Node[]
|
|
60
|
+
): void {
|
|
19
61
|
const children = this.getChildren();
|
|
20
62
|
children.forEach((child) => child.traverse(fn, parents));
|
|
21
63
|
}
|
|
64
|
+
|
|
22
65
|
// Depth first sequence of all nodes in this tree.
|
|
23
|
-
getNodes() {
|
|
24
|
-
const nodes = [];
|
|
66
|
+
getNodes(): Node[] {
|
|
67
|
+
const nodes: Node[] = [];
|
|
25
68
|
this.traverse((node) => nodes.push(node));
|
|
26
69
|
return nodes;
|
|
27
70
|
}
|
|
28
|
-
|
|
71
|
+
|
|
72
|
+
getNodeBefore<Kind extends Node>(
|
|
73
|
+
node: Node,
|
|
74
|
+
matcher: (node: Kind) => boolean
|
|
75
|
+
): Kind | undefined {
|
|
29
76
|
const nodes = this.getNodes();
|
|
30
|
-
let previous = undefined;
|
|
77
|
+
let previous: Kind | undefined = undefined;
|
|
31
78
|
for (const currentNode of nodes) {
|
|
32
|
-
if (currentNode === node)
|
|
33
|
-
|
|
34
|
-
if (matcher(currentNode))
|
|
35
|
-
previous = currentNode;
|
|
79
|
+
if (currentNode === node) return previous;
|
|
80
|
+
if (matcher(currentNode as Kind)) previous = currentNode as Kind;
|
|
36
81
|
}
|
|
37
82
|
return undefined;
|
|
38
83
|
}
|
|
39
|
-
|
|
84
|
+
|
|
85
|
+
getNodeAfter<Kind extends Node>(
|
|
86
|
+
node: Node,
|
|
87
|
+
matcher: (node: Kind) => boolean
|
|
88
|
+
): Kind | undefined {
|
|
40
89
|
const nodes = this.getNodes();
|
|
41
|
-
let found = false;
|
|
90
|
+
let found: boolean = false;
|
|
42
91
|
for (const currentNode of nodes) {
|
|
43
|
-
if (found && matcher(currentNode))
|
|
44
|
-
return currentNode;
|
|
45
|
-
if (currentNode === node)
|
|
46
|
-
found = true;
|
|
92
|
+
if (found && matcher(currentNode as Kind))
|
|
93
|
+
return currentNode as Kind;
|
|
94
|
+
if (currentNode === node) found = true;
|
|
47
95
|
}
|
|
48
96
|
return undefined;
|
|
49
97
|
}
|
|
98
|
+
|
|
50
99
|
// Swap them order if this is two text nodes that are reversed.
|
|
51
|
-
sortRange(range) {
|
|
100
|
+
sortRange(range: CaretRange): CaretRange {
|
|
52
101
|
const start = range.start.node;
|
|
53
102
|
const end = range.end.node;
|
|
103
|
+
|
|
54
104
|
if (start === end)
|
|
55
105
|
return {
|
|
56
106
|
start: {
|
|
@@ -62,108 +112,128 @@ export default class Node {
|
|
|
62
112
|
index: Math.max(range.start.index, range.end.index),
|
|
63
113
|
},
|
|
64
114
|
};
|
|
115
|
+
|
|
65
116
|
// Find the common ancestor of the two nodes.
|
|
66
117
|
const ancestor = start.getCommonAncestor(this, end);
|
|
67
|
-
|
|
68
|
-
|
|
118
|
+
|
|
119
|
+
if (ancestor === undefined) return range;
|
|
120
|
+
|
|
69
121
|
// Where do these text nodes appear in the ancestor's node sequence?
|
|
70
122
|
let startIndex = ancestor.getNodes().indexOf(start);
|
|
71
123
|
let endIndex = ancestor.getNodes().indexOf(end);
|
|
124
|
+
|
|
72
125
|
// Defensively verify that we could find the given nodes in the document.
|
|
73
126
|
// If we can't, something is wrong upstream.
|
|
74
127
|
if (startIndex < 0 || endIndex < 0)
|
|
75
128
|
throw Error(`Couldn't find caret range node(s) in this tree.`);
|
|
129
|
+
|
|
76
130
|
// If we didn't find them, or the start is before the end, return the given range.
|
|
77
131
|
return startIndex === undefined ||
|
|
78
132
|
endIndex === undefined ||
|
|
79
133
|
startIndex < endIndex
|
|
80
134
|
? range
|
|
81
135
|
: // If they're the same node, order the index.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
136
|
+
startIndex === endIndex
|
|
137
|
+
? {
|
|
138
|
+
start: {
|
|
139
|
+
node: range.start.node,
|
|
140
|
+
index: Math.min(range.start.index, range.end.index),
|
|
141
|
+
},
|
|
142
|
+
end: {
|
|
143
|
+
node: range.end.node,
|
|
144
|
+
index: Math.max(range.start.index, range.end.index),
|
|
145
|
+
},
|
|
146
|
+
}
|
|
147
|
+
: // Otherwise, swap the caret positions
|
|
148
|
+
{ start: range.end, end: range.start };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
getNode(id: number) {
|
|
97
152
|
return this.getNodes().find((n) => n.getID() === id);
|
|
98
153
|
}
|
|
154
|
+
|
|
99
155
|
// An index of the given node in the depth-first traversal of the nodes.
|
|
100
|
-
getIndexOf(node) {
|
|
156
|
+
getIndexOf(node: Node): number | undefined {
|
|
101
157
|
const index = this.getNodes().indexOf(node);
|
|
102
158
|
return index >= 0 ? index : undefined;
|
|
103
159
|
}
|
|
160
|
+
|
|
104
161
|
// True if this tree contains the given node.
|
|
105
|
-
contains(node) {
|
|
162
|
+
contains(node: Node) {
|
|
106
163
|
let found = false;
|
|
107
164
|
this.traverse((n) => {
|
|
108
|
-
if (n === node)
|
|
109
|
-
found = true;
|
|
165
|
+
if (n === node) found = true;
|
|
110
166
|
});
|
|
111
167
|
return found;
|
|
112
168
|
}
|
|
169
|
+
|
|
113
170
|
// Returns a list of the given node's parents in this tree, from root to direct parent.
|
|
114
|
-
getParentsOf(node) {
|
|
171
|
+
getParentsOf(node: Node): Node[] | undefined {
|
|
115
172
|
let parents = undefined;
|
|
116
173
|
this.traverse((n, p) => {
|
|
117
|
-
if (n === node)
|
|
118
|
-
parents = p;
|
|
174
|
+
if (n === node) parents = p;
|
|
119
175
|
});
|
|
120
|
-
if (parents === undefined)
|
|
121
|
-
return;
|
|
176
|
+
if (parents === undefined) return;
|
|
122
177
|
const withoutNode = [...parents];
|
|
123
178
|
withoutNode.pop();
|
|
124
179
|
return withoutNode;
|
|
125
180
|
}
|
|
126
|
-
|
|
181
|
+
|
|
182
|
+
getParent(root: Node): Node | undefined {
|
|
127
183
|
return root.getParentOf(this);
|
|
128
184
|
}
|
|
129
|
-
|
|
185
|
+
|
|
186
|
+
hasAncestor(root: Node, node: Node): boolean {
|
|
130
187
|
let parent = root.getParentOf(this);
|
|
131
188
|
while (parent) {
|
|
132
|
-
if (parent === node)
|
|
133
|
-
return true;
|
|
189
|
+
if (parent === node) return true;
|
|
134
190
|
parent = root.getParentOf(parent);
|
|
135
191
|
}
|
|
136
192
|
return false;
|
|
137
193
|
}
|
|
138
|
-
|
|
194
|
+
|
|
195
|
+
getClosestParentOfType<T extends Node>(
|
|
196
|
+
root: Node,
|
|
197
|
+
type: Function
|
|
198
|
+
): T | undefined {
|
|
139
199
|
let parent = root.getParentOf(this);
|
|
140
200
|
while (parent) {
|
|
141
|
-
if (parent instanceof type)
|
|
142
|
-
return parent;
|
|
201
|
+
if (parent instanceof type) return parent as unknown as T;
|
|
143
202
|
parent = root.getParentOf(parent);
|
|
144
203
|
}
|
|
145
204
|
return undefined;
|
|
146
205
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
206
|
+
|
|
207
|
+
isInside(root: Node, type: Function) {
|
|
208
|
+
return (
|
|
209
|
+
this.getClosestParentMatching(root, (p) => p instanceof type) !==
|
|
210
|
+
undefined
|
|
211
|
+
);
|
|
150
212
|
}
|
|
151
|
-
|
|
213
|
+
|
|
214
|
+
getClosestParentMatching(
|
|
215
|
+
root: Node,
|
|
216
|
+
match: (node: Node) => boolean
|
|
217
|
+
): Node | undefined {
|
|
152
218
|
let parent = root.getParentOf(this);
|
|
153
219
|
while (parent) {
|
|
154
|
-
if (match.call(undefined, parent))
|
|
155
|
-
return parent;
|
|
220
|
+
if (match.call(undefined, parent)) return parent;
|
|
156
221
|
parent = root.getParentOf(parent);
|
|
157
222
|
}
|
|
158
223
|
return undefined;
|
|
159
224
|
}
|
|
160
|
-
|
|
225
|
+
|
|
226
|
+
getFarthestParentMatching(
|
|
227
|
+
root: Node,
|
|
228
|
+
match: (node: Node) => boolean
|
|
229
|
+
): Node | undefined {
|
|
161
230
|
const matchingParents = this.getAncestors(root).filter(match);
|
|
162
231
|
return matchingParents.length > 0
|
|
163
232
|
? matchingParents[matchingParents.length - 1]
|
|
164
233
|
: undefined;
|
|
165
234
|
}
|
|
166
|
-
|
|
235
|
+
|
|
236
|
+
getAncestors(root: Node) {
|
|
167
237
|
const ancestors = [];
|
|
168
238
|
let parent = root.getParentOf(this);
|
|
169
239
|
while (parent) {
|
|
@@ -172,22 +242,27 @@ export default class Node {
|
|
|
172
242
|
}
|
|
173
243
|
return ancestors;
|
|
174
244
|
}
|
|
175
|
-
|
|
245
|
+
|
|
246
|
+
getCommonAncestor(root: Node, node: Node): Node | undefined {
|
|
176
247
|
const thisParents = this.getAncestors(root);
|
|
177
248
|
const thatParents = node.getAncestors(root);
|
|
249
|
+
|
|
178
250
|
for (let i = 0; i < thisParents.length; i++) {
|
|
179
251
|
for (let j = 0; j < thatParents.length; j++) {
|
|
180
|
-
if (thisParents[i] === thatParents[j])
|
|
181
|
-
return thisParents[i];
|
|
252
|
+
if (thisParents[i] === thatParents[j]) return thisParents[i];
|
|
182
253
|
}
|
|
183
254
|
}
|
|
184
255
|
return undefined;
|
|
185
256
|
}
|
|
257
|
+
|
|
186
258
|
// Traverse this node's children, trying to replace the given node with the replacement node (or nothing, if allowed)
|
|
187
|
-
withNodeReplaced(
|
|
259
|
+
withNodeReplaced(
|
|
260
|
+
node: Node,
|
|
261
|
+
replacement: Node | undefined
|
|
262
|
+
): this | undefined {
|
|
188
263
|
// Is this the node we're replacing? Return the replacement.
|
|
189
|
-
if (node === this)
|
|
190
|
-
|
|
264
|
+
if (node === this) return replacement as this;
|
|
265
|
+
|
|
191
266
|
// Find all the children
|
|
192
267
|
const children = this.getChildren();
|
|
193
268
|
// Search each one for a match.
|
|
@@ -196,25 +271,34 @@ export default class Node {
|
|
|
196
271
|
// If we found the child, return a new version of this node with the child replaced.
|
|
197
272
|
if (child === node)
|
|
198
273
|
return this.withChildReplaced(node, replacement);
|
|
274
|
+
|
|
199
275
|
// Does this child have it? If so, return a version of this node with the revised child.
|
|
200
276
|
const revisedChild = child.withNodeReplaced(node, replacement);
|
|
201
277
|
if (revisedChild !== undefined)
|
|
202
278
|
return this.withChildReplaced(child, revisedChild);
|
|
203
279
|
}
|
|
204
280
|
}
|
|
281
|
+
|
|
282
|
+
// Given a range, return either a full copy of the node, or a partial copy if it contains the range.
|
|
283
|
+
// If there's a problem, it returns undefined. Assumes the range is sorted in parse order.
|
|
284
|
+
abstract withContentInRange(range: CaretRange): this | undefined;
|
|
285
|
+
|
|
205
286
|
// By default, a node doesn't know how to insert anything into itself. Subclasses
|
|
206
287
|
// are responsible for overriding this if they want to support specific insertions.
|
|
207
|
-
withNodeInserted(caret, node) {
|
|
288
|
+
withNodeInserted(caret: Caret, node: Node): Edit {
|
|
208
289
|
caret;
|
|
209
290
|
node;
|
|
210
291
|
return undefined;
|
|
211
292
|
}
|
|
212
|
-
|
|
293
|
+
|
|
294
|
+
copyRange(range: CaretRange): Node | undefined {
|
|
213
295
|
const sortedRange = this.sortRange(range);
|
|
214
296
|
// Find the common ancestor of the range, then ask it to copy the portion of it selected and produce a node.
|
|
215
|
-
const commonAncestor = sortedRange.start.node.getCommonAncestor(
|
|
216
|
-
|
|
217
|
-
|
|
297
|
+
const commonAncestor = sortedRange.start.node.getCommonAncestor(
|
|
298
|
+
this,
|
|
299
|
+
sortedRange.end.node
|
|
300
|
+
);
|
|
301
|
+
if (commonAncestor === undefined) return;
|
|
218
302
|
return commonAncestor.withContentInRange(sortedRange);
|
|
219
303
|
}
|
|
220
304
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { test, expect } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import FootnoteNode from './FootnoteNode';
|
|
4
|
+
import FormatNode from './FormatNode';
|
|
5
|
+
import ParagraphNode from './ParagraphNode';
|
|
6
|
+
import TextNode from './TextNode';
|
|
7
|
+
|
|
8
|
+
const firstText = new TextNode(
|
|
9
|
+
'This is the first paragraph. What do you think of it?'
|
|
10
|
+
);
|
|
11
|
+
const lastText = new TextNode(
|
|
12
|
+
"This is the second paragraph. I think it's redundant."
|
|
13
|
+
);
|
|
14
|
+
const combinedText = new TextNode(firstText.getText() + lastText.getText());
|
|
15
|
+
const footnote = new FootnoteNode(
|
|
16
|
+
new FormatNode('', [new TextNode('Side note!')])
|
|
17
|
+
);
|
|
18
|
+
const firstParagraph = new ParagraphNode(
|
|
19
|
+
0,
|
|
20
|
+
new FormatNode('', [firstText, footnote])
|
|
21
|
+
);
|
|
22
|
+
const lastParagraph = new ParagraphNode(0, new FormatNode('', [lastText]));
|
|
23
|
+
const combinedParagraph = new ParagraphNode(
|
|
24
|
+
0,
|
|
25
|
+
new FormatNode('', [combinedText, footnote])
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
test('Combine/split', () => {
|
|
29
|
+
expect(
|
|
30
|
+
firstParagraph.withParagraphAppended(lastParagraph).toBookdown()
|
|
31
|
+
).toBe(
|
|
32
|
+
`${firstText.getText()}${footnote.toBookdown()}${lastText.getText()}`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const split = combinedParagraph.split({
|
|
36
|
+
node: combinedText,
|
|
37
|
+
index: combinedText.getText().indexOf('.') + 1,
|
|
38
|
+
});
|
|
39
|
+
expect(split).not.toBeUndefined();
|
|
40
|
+
if (split) {
|
|
41
|
+
expect(split[0].toBookdown()).toBe(
|
|
42
|
+
firstText
|
|
43
|
+
.getText()
|
|
44
|
+
.substring(0, firstText.getText().indexOf('.') + 1)
|
|
45
|
+
);
|
|
46
|
+
expect(split[1].toBookdown()).toBe(
|
|
47
|
+
firstText
|
|
48
|
+
.getText()
|
|
49
|
+
.substring(firstText.getText().indexOf('.') + 1) +
|
|
50
|
+
lastText.getText() +
|
|
51
|
+
footnote.toBookdown()
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
});
|