bookish-press 0.4.46 → 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 -59
- 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} +110 -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
|
@@ -1,28 +1,41 @@
|
|
|
1
|
+
import type Node from './Node';
|
|
1
2
|
import FormatNode from './FormatNode';
|
|
2
|
-
import {
|
|
3
|
+
import type { Format } from './FormatNode';
|
|
4
|
+
import type Caret from './Caret';
|
|
5
|
+
import { caretToIndex, indexToCaret, type CaretRange } from './Caret';
|
|
3
6
|
import BlockNode from './BlockNode';
|
|
7
|
+
import type Edit from './Edit';
|
|
8
|
+
|
|
9
|
+
export type ListNodeType = FormatNode | ListNode;
|
|
10
|
+
|
|
4
11
|
export default class ListNode extends BlockNode {
|
|
5
|
-
#numbered;
|
|
6
|
-
#items;
|
|
7
|
-
|
|
12
|
+
readonly #numbered: boolean;
|
|
13
|
+
readonly #items: ListNodeType[];
|
|
14
|
+
|
|
15
|
+
constructor(items: Array<FormatNode | ListNode>, numbered: boolean) {
|
|
8
16
|
super();
|
|
9
17
|
this.#numbered = numbered;
|
|
18
|
+
|
|
10
19
|
let adjustedItems = items
|
|
11
20
|
// Make sure all format nodes have an empty text.
|
|
12
21
|
.map((i) => (i instanceof FormatNode ? i.withTextIfEmpty() : i))
|
|
13
22
|
// Strip all empty sublists.
|
|
14
23
|
.filter((i) => !i.isEmpty());
|
|
24
|
+
|
|
15
25
|
this.#items = adjustedItems;
|
|
16
26
|
}
|
|
27
|
+
|
|
17
28
|
getType() {
|
|
18
29
|
return 'list';
|
|
19
30
|
}
|
|
20
31
|
isNumbered() {
|
|
21
32
|
return this.#numbered;
|
|
22
33
|
}
|
|
23
|
-
isEmpty() {
|
|
24
|
-
return (
|
|
25
|
-
this.#items.
|
|
34
|
+
isEmpty(): boolean {
|
|
35
|
+
return (
|
|
36
|
+
this.#items.length === 0 ||
|
|
37
|
+
this.#items.every((i) => i instanceof ListNode && i.isEmpty())
|
|
38
|
+
);
|
|
26
39
|
}
|
|
27
40
|
getItems() {
|
|
28
41
|
return this.#items;
|
|
@@ -31,240 +44,278 @@ export default class ListNode extends BlockNode {
|
|
|
31
44
|
return this.#items;
|
|
32
45
|
}
|
|
33
46
|
getListItems() {
|
|
34
|
-
return this.#items.filter((i) => i instanceof ListNode);
|
|
47
|
+
return this.#items.filter((i) => i instanceof ListNode) as ListNode[];
|
|
35
48
|
}
|
|
36
49
|
getLength() {
|
|
37
50
|
return this.#items.length;
|
|
38
51
|
}
|
|
39
|
-
getLastItem() {
|
|
52
|
+
getLastItem(): FormatNode | undefined {
|
|
40
53
|
return this.getFirstLastItem(false);
|
|
41
54
|
}
|
|
42
|
-
getFirstItem() {
|
|
55
|
+
getFirstItem(): FormatNode | undefined {
|
|
43
56
|
return this.getFirstLastItem(true);
|
|
44
57
|
}
|
|
45
|
-
getFormats() {
|
|
46
|
-
return this.#items.reduce(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
getFormats(): FormatNode[] {
|
|
59
|
+
return this.#items.reduce(
|
|
60
|
+
(previous: FormatNode[], current: ListNodeType) =>
|
|
61
|
+
previous.concat(
|
|
62
|
+
current instanceof FormatNode
|
|
63
|
+
? [current]
|
|
64
|
+
: current.getFormats()
|
|
65
|
+
),
|
|
66
|
+
[]
|
|
67
|
+
) as FormatNode[];
|
|
68
|
+
}
|
|
69
|
+
getFirstLastItem(first: boolean): FormatNode | undefined {
|
|
70
|
+
if (this.#items.length === 0) return undefined;
|
|
71
|
+
|
|
53
72
|
// If it's a format, return it.
|
|
54
73
|
const last = this.#items[first ? 0 : this.getLength() - 1];
|
|
55
|
-
if (last instanceof FormatNode)
|
|
56
|
-
|
|
74
|
+
if (last instanceof FormatNode) return last;
|
|
75
|
+
|
|
57
76
|
// Otherwise, recurse into the last item's list.
|
|
58
77
|
return last.getFirstLastItem(first);
|
|
59
78
|
}
|
|
60
|
-
|
|
79
|
+
|
|
80
|
+
getLevel(root: Node): number {
|
|
61
81
|
const parent = root.getParentOf(this);
|
|
62
|
-
if (parent instanceof ListNode)
|
|
63
|
-
|
|
64
|
-
else
|
|
65
|
-
return 1;
|
|
82
|
+
if (parent instanceof ListNode) return parent.getLevel(root) + 1;
|
|
83
|
+
else return 1;
|
|
66
84
|
}
|
|
67
|
-
|
|
85
|
+
|
|
86
|
+
toText(): string {
|
|
68
87
|
return this.#items.map((item) => item.toText()).join(' ');
|
|
69
88
|
}
|
|
70
|
-
|
|
89
|
+
|
|
90
|
+
toBookdown(level: number = 1): string {
|
|
71
91
|
return this.isNumbered()
|
|
72
92
|
? this.#items
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
.map(
|
|
94
|
+
(item, number) =>
|
|
95
|
+
(item instanceof ListNode
|
|
96
|
+
? ''
|
|
97
|
+
: number + 1 + '.'.repeat(level) + ' ') +
|
|
98
|
+
item.toBookdown(level + 1)
|
|
99
|
+
)
|
|
100
|
+
.join('\n')
|
|
78
101
|
: this.#items
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
.map(
|
|
103
|
+
(item) =>
|
|
104
|
+
(item instanceof ListNode
|
|
105
|
+
? ''
|
|
106
|
+
: '*'.repeat(level) + ' ') +
|
|
107
|
+
item.toBookdown(level + 1)
|
|
108
|
+
)
|
|
109
|
+
.join('\n');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
toHTML(): string {
|
|
86
113
|
return this.isNumbered()
|
|
87
114
|
? `<ol>${this.#items
|
|
88
|
-
|
|
89
|
-
|
|
115
|
+
.map((i) => `<li>${i.toHTML()}</li>`)
|
|
116
|
+
.join('')}</ol>`
|
|
90
117
|
: `<ul>${this.#items
|
|
91
|
-
|
|
92
|
-
|
|
118
|
+
.map((i) => `<li>${i.toHTML()}</li>`)
|
|
119
|
+
.join('')}</ul>`;
|
|
93
120
|
}
|
|
94
|
-
|
|
121
|
+
|
|
122
|
+
getParentOf(node: Node): Node | undefined {
|
|
95
123
|
return this.#items
|
|
96
124
|
.map((b) => (b === node ? this : b.getParentOf(node)))
|
|
97
125
|
.find((b) => b !== undefined);
|
|
98
126
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
127
|
+
|
|
128
|
+
atBeginningOfItem(root: Node, caret: Caret) {
|
|
129
|
+
const format = caret.node.getFarthestParentMatching(
|
|
130
|
+
root,
|
|
131
|
+
(n) => n instanceof FormatNode
|
|
132
|
+
) as FormatNode;
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
format !== undefined &&
|
|
102
136
|
caret.node.hasAncestor(root, this) &&
|
|
103
137
|
caret.index === 0 &&
|
|
104
|
-
format.getTextNodes()[0] === caret.node
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
138
|
+
format.getTextNodes()[0] === caret.node
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
getItemContaining(caret: Caret): number | undefined {
|
|
143
|
+
const match = this.#items.find(
|
|
144
|
+
(n) => n.getParentOf(caret.node) !== undefined
|
|
145
|
+
);
|
|
146
|
+
if (match === undefined) return undefined;
|
|
110
147
|
const index = this.#items.indexOf(match);
|
|
111
|
-
if (index === undefined)
|
|
112
|
-
return undefined;
|
|
148
|
+
if (index === undefined) return undefined;
|
|
113
149
|
return index;
|
|
114
150
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
151
|
+
|
|
152
|
+
getItem(index: number): ListNodeType | undefined {
|
|
153
|
+
if (index < 0 || index >= this.#items.length) return;
|
|
118
154
|
return this.#items[index];
|
|
119
155
|
}
|
|
120
|
-
|
|
156
|
+
|
|
157
|
+
getFirstCaret(): Caret | undefined {
|
|
121
158
|
return this.#items.length === 0
|
|
122
159
|
? undefined
|
|
123
160
|
: this.#items[0].getFirstCaret();
|
|
124
161
|
}
|
|
125
|
-
|
|
126
|
-
|
|
162
|
+
|
|
163
|
+
copy(): this {
|
|
164
|
+
return new ListNode(
|
|
165
|
+
this.#items.map((i) => i.copy()),
|
|
166
|
+
this.#numbered
|
|
167
|
+
) as this;
|
|
127
168
|
}
|
|
128
|
-
|
|
169
|
+
|
|
170
|
+
withStyle(numbered: boolean) {
|
|
129
171
|
return new ListNode(this.#items, numbered);
|
|
130
172
|
}
|
|
131
|
-
|
|
173
|
+
|
|
174
|
+
withItemAppended(item: ListNodeType): ListNode {
|
|
132
175
|
return new ListNode([...this.#items, item], this.#numbered);
|
|
133
176
|
}
|
|
134
|
-
|
|
177
|
+
|
|
178
|
+
withItemPrepended(item: ListNodeType): ListNode {
|
|
135
179
|
return new ListNode([item, ...this.#items], this.#numbered);
|
|
136
180
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
181
|
+
|
|
182
|
+
withItemAt(item: ListNodeType, index: number): ListNode | undefined {
|
|
183
|
+
if (index < 0 || index > this.#items.length) return;
|
|
140
184
|
const newItems = this.#items.slice();
|
|
141
185
|
newItems.splice(index, 0, item);
|
|
142
186
|
return new ListNode(newItems, this.#numbered);
|
|
143
187
|
}
|
|
144
|
-
|
|
188
|
+
|
|
189
|
+
withItemAfter(
|
|
190
|
+
item: ListNodeType,
|
|
191
|
+
anchor: ListNodeType
|
|
192
|
+
): ListNode | undefined {
|
|
145
193
|
const index = this.#items.indexOf(anchor);
|
|
146
|
-
if (index < 0)
|
|
147
|
-
return;
|
|
194
|
+
if (index < 0) return;
|
|
148
195
|
return this.withItemAt(item, index + 1);
|
|
149
196
|
}
|
|
150
|
-
|
|
197
|
+
|
|
198
|
+
withItemBefore(item: ListNodeType, anchor: ListNodeType) {
|
|
151
199
|
const index = this.#items.indexOf(anchor);
|
|
152
|
-
if (index < 0)
|
|
153
|
-
return;
|
|
200
|
+
if (index < 0) return;
|
|
154
201
|
return this.withItemAt(item, index);
|
|
155
202
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
203
|
+
|
|
204
|
+
withItemReplaced(index: number, item: ListNodeType): ListNode | undefined {
|
|
205
|
+
if (index < 0 || index >= this.#items.length) return;
|
|
159
206
|
const newItems = this.#items.slice();
|
|
160
207
|
newItems[index] = item;
|
|
161
208
|
return new ListNode(newItems, this.#numbered);
|
|
162
209
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
210
|
+
|
|
211
|
+
withoutItemAt(index: number): ListNode | undefined {
|
|
212
|
+
if (index < 0 || index >= this.#items.length) return;
|
|
166
213
|
const newItems = this.#items.slice();
|
|
167
214
|
newItems.splice(index, 1);
|
|
168
215
|
return new ListNode(newItems, this.#numbered);
|
|
169
216
|
}
|
|
170
|
-
|
|
217
|
+
|
|
218
|
+
withoutItem(item: FormatNode): ListNode | undefined {
|
|
171
219
|
const index = this.#items.indexOf(item);
|
|
172
|
-
if (index < 0)
|
|
173
|
-
return;
|
|
220
|
+
if (index < 0) return;
|
|
174
221
|
return this.withoutItemAt(index);
|
|
175
222
|
}
|
|
176
|
-
|
|
223
|
+
|
|
224
|
+
withListAppended(list: ListNode): ListNode {
|
|
177
225
|
return new ListNode([...this.#items, ...list.#items], this.#numbered);
|
|
178
226
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
227
|
+
|
|
228
|
+
withItemMergedBackwards(index: number): [ListNode, Caret] | undefined {
|
|
229
|
+
if (index <= 0 || index >= this.#items.length) return;
|
|
230
|
+
|
|
182
231
|
const deletedItem = this.#items[index];
|
|
183
232
|
let previousItem = this.#items[index - 1];
|
|
233
|
+
|
|
184
234
|
// If we're merging a sublist back into this list, move its
|
|
185
235
|
// remaining format into the previous item.
|
|
186
236
|
if (deletedItem instanceof ListNode) {
|
|
187
|
-
if (previousItem instanceof ListNode)
|
|
188
|
-
return;
|
|
237
|
+
if (previousItem instanceof ListNode) return;
|
|
189
238
|
const itemToMerge = deletedItem.getFirstItem();
|
|
190
|
-
if (itemToMerge === undefined)
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
239
|
+
if (itemToMerge === undefined) return;
|
|
240
|
+
const newSubList = deletedItem.withChildReplaced(
|
|
241
|
+
itemToMerge,
|
|
242
|
+
undefined
|
|
243
|
+
);
|
|
244
|
+
if (newSubList === undefined) return;
|
|
245
|
+
const listWithRevisedSublist = this.withChildReplaced(
|
|
246
|
+
deletedItem,
|
|
247
|
+
newSubList
|
|
248
|
+
);
|
|
249
|
+
if (listWithRevisedSublist === undefined) return;
|
|
198
250
|
const lastCaret = previousItem.getLastCaret();
|
|
199
|
-
if (lastCaret === undefined)
|
|
200
|
-
return;
|
|
251
|
+
if (lastCaret === undefined) return;
|
|
201
252
|
const textIndex = caretToIndex(previousItem, lastCaret);
|
|
202
|
-
if (textIndex === undefined)
|
|
203
|
-
return;
|
|
253
|
+
if (textIndex === undefined) return;
|
|
204
254
|
const mergedItem = previousItem.withSegmentsAppended(itemToMerge);
|
|
205
|
-
const listWithMergedItem = listWithRevisedSublist.withChildReplaced(
|
|
206
|
-
|
|
207
|
-
|
|
255
|
+
const listWithMergedItem = listWithRevisedSublist.withChildReplaced(
|
|
256
|
+
previousItem,
|
|
257
|
+
mergedItem
|
|
258
|
+
);
|
|
259
|
+
if (listWithMergedItem === undefined) return;
|
|
208
260
|
const newCaret = indexToCaret(mergedItem, textIndex);
|
|
209
|
-
if (newCaret === undefined)
|
|
210
|
-
return;
|
|
261
|
+
if (newCaret === undefined) return;
|
|
211
262
|
return [listWithMergedItem, newCaret];
|
|
212
263
|
}
|
|
213
264
|
// If the previous item is a list, find it's last item.
|
|
214
265
|
else if (previousItem instanceof ListNode) {
|
|
215
266
|
const lastItem = previousItem.getLastItem();
|
|
216
|
-
if (lastItem === undefined)
|
|
217
|
-
return;
|
|
267
|
+
if (lastItem === undefined) return;
|
|
218
268
|
const lastCaret = lastItem.getLastCaret();
|
|
219
|
-
if (lastCaret === undefined)
|
|
220
|
-
return;
|
|
269
|
+
if (lastCaret === undefined) return;
|
|
221
270
|
const newCaretIndex = caretToIndex(lastItem, lastCaret);
|
|
222
|
-
if (newCaretIndex === undefined)
|
|
223
|
-
return;
|
|
271
|
+
if (newCaretIndex === undefined) return;
|
|
224
272
|
const mergedItem = lastItem.withSegmentsAppended(deletedItem);
|
|
225
|
-
const newSublist = previousItem.withChildReplaced(
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (
|
|
230
|
-
|
|
273
|
+
const newSublist = previousItem.withChildReplaced(
|
|
274
|
+
lastItem,
|
|
275
|
+
mergedItem
|
|
276
|
+
);
|
|
277
|
+
if (newSublist === undefined) return;
|
|
278
|
+
const newList = this.withChildReplaced(
|
|
279
|
+
previousItem,
|
|
280
|
+
newSublist
|
|
281
|
+
)?.withoutItemAt(index);
|
|
282
|
+
if (newList === undefined) return;
|
|
231
283
|
const newCaret = indexToCaret(mergedItem, newCaretIndex);
|
|
232
|
-
if (newCaret === undefined)
|
|
233
|
-
return;
|
|
284
|
+
if (newCaret === undefined) return;
|
|
234
285
|
return [newList, newCaret];
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
286
|
+
} else {
|
|
237
287
|
const lastCaret = previousItem.getLastCaret();
|
|
238
|
-
if (lastCaret === undefined)
|
|
239
|
-
return;
|
|
288
|
+
if (lastCaret === undefined) return;
|
|
240
289
|
const newCaretIndex = caretToIndex(previousItem, lastCaret);
|
|
241
|
-
if (newCaretIndex === undefined)
|
|
242
|
-
return;
|
|
290
|
+
if (newCaretIndex === undefined) return;
|
|
243
291
|
const mergedItem = previousItem.withSegmentsAppended(deletedItem);
|
|
244
|
-
const newList = this.withItemReplaced(
|
|
245
|
-
|
|
246
|
-
|
|
292
|
+
const newList = this.withItemReplaced(
|
|
293
|
+
index - 1,
|
|
294
|
+
mergedItem
|
|
295
|
+
)?.withoutItemAt(index);
|
|
296
|
+
if (newList === undefined) return;
|
|
247
297
|
const newCaret = indexToCaret(mergedItem, newCaretIndex);
|
|
248
|
-
if (newCaret === undefined)
|
|
249
|
-
return;
|
|
298
|
+
if (newCaret === undefined) return;
|
|
250
299
|
return [newList, newCaret];
|
|
251
300
|
}
|
|
252
301
|
}
|
|
253
|
-
|
|
302
|
+
|
|
303
|
+
withItemSplit(caret: Caret): ListNode | undefined {
|
|
254
304
|
// Which item contains the caret?
|
|
255
|
-
const item = this.#items.find(
|
|
256
|
-
|
|
257
|
-
|
|
305
|
+
const item = this.#items.find(
|
|
306
|
+
(i) => i instanceof FormatNode && i.contains(caret.node)
|
|
307
|
+
) as FormatNode | undefined;
|
|
308
|
+
if (item === undefined) return;
|
|
258
309
|
const parts = item.split(caret);
|
|
259
|
-
if (parts === undefined)
|
|
260
|
-
return;
|
|
310
|
+
if (parts === undefined) return;
|
|
261
311
|
const [first, second] = parts;
|
|
262
312
|
return this.withItemAfter(second, item)
|
|
263
313
|
?.withItemAfter(first, item)
|
|
264
314
|
?.withoutItem(item);
|
|
265
315
|
}
|
|
316
|
+
|
|
266
317
|
// Recursively search for the given item and indent it, constructing a new list.
|
|
267
|
-
withItemIndented(format) {
|
|
318
|
+
withItemIndented(format: FormatNode): ListNode | undefined {
|
|
268
319
|
// Check each item in the list to see if it matches...
|
|
269
320
|
for (let index = 0; index < this.#items.length; index++) {
|
|
270
321
|
const item = this.#items[index];
|
|
@@ -274,13 +325,22 @@ export default class ListNode extends BlockNode {
|
|
|
274
325
|
const afterList = this.#items[index + 1];
|
|
275
326
|
// If the format is just after a list, move the format to the end of the list.
|
|
276
327
|
if (beforeList instanceof ListNode)
|
|
277
|
-
return this.withItemReplaced(
|
|
328
|
+
return this.withItemReplaced(
|
|
329
|
+
index - 1,
|
|
330
|
+
beforeList.withItemAppended(format)
|
|
331
|
+
)?.withoutItemAt(index);
|
|
278
332
|
// If the format is just before a list, move the format to the beginning of the list.
|
|
279
333
|
else if (afterList instanceof ListNode)
|
|
280
|
-
return this.withItemReplaced(
|
|
334
|
+
return this.withItemReplaced(
|
|
335
|
+
index + 1,
|
|
336
|
+
afterList.withItemPrepended(format)
|
|
337
|
+
)?.withoutItemAt(index);
|
|
281
338
|
// Otherwise, make a new sub list node, add the format to it.
|
|
282
339
|
else
|
|
283
|
-
return this.withItemReplaced(
|
|
340
|
+
return this.withItemReplaced(
|
|
341
|
+
index,
|
|
342
|
+
new ListNode([format], this.#numbered)
|
|
343
|
+
);
|
|
284
344
|
}
|
|
285
345
|
// If this is a sublist, see if it contains the item, and if so,
|
|
286
346
|
// replace this list with list that has the item indented.
|
|
@@ -292,8 +352,9 @@ export default class ListNode extends BlockNode {
|
|
|
292
352
|
}
|
|
293
353
|
// Otherwise, return nothing.
|
|
294
354
|
}
|
|
355
|
+
|
|
295
356
|
// Recursively search for the item and unindent it, constructing a new list.
|
|
296
|
-
withItemUnindented(format) {
|
|
357
|
+
withItemUnindented(format: FormatNode): ListNode | undefined {
|
|
297
358
|
// Check each sublist in the list to see if any has the item so we can unindent it into this.
|
|
298
359
|
for (let index = 0; index < this.#items.length; index++) {
|
|
299
360
|
const list = this.#items[index];
|
|
@@ -301,14 +362,18 @@ export default class ListNode extends BlockNode {
|
|
|
301
362
|
const match = list.#items.indexOf(format);
|
|
302
363
|
// If we found it in this sublist, extract it here!
|
|
303
364
|
if (match >= 0) {
|
|
304
|
-
const before = new ListNode(
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
365
|
+
const before = new ListNode(
|
|
366
|
+
list.#items.slice(0, match),
|
|
367
|
+
this.#numbered
|
|
368
|
+
);
|
|
369
|
+
const after = new ListNode(
|
|
370
|
+
list.#items.slice(match + 1),
|
|
371
|
+
this.#numbered
|
|
372
|
+
);
|
|
373
|
+
let newItems: ListNodeType[] = this.#items.slice(0, index);
|
|
374
|
+
if (before.getLength() > 0) newItems.push(before);
|
|
309
375
|
newItems.push(format);
|
|
310
|
-
if (after.getLength() > 0)
|
|
311
|
-
newItems.push(after);
|
|
376
|
+
if (after.getLength() > 0) newItems.push(after);
|
|
312
377
|
newItems = newItems.concat(this.#items.slice(index + 1));
|
|
313
378
|
return new ListNode(newItems, this.#numbered);
|
|
314
379
|
}
|
|
@@ -322,60 +387,66 @@ export default class ListNode extends BlockNode {
|
|
|
322
387
|
}
|
|
323
388
|
// Otherwise, return nothing, indicating no match.
|
|
324
389
|
}
|
|
325
|
-
|
|
390
|
+
|
|
391
|
+
withChildReplaced(
|
|
392
|
+
node: ListNodeType,
|
|
393
|
+
replacement: ListNodeType | undefined
|
|
394
|
+
): this | undefined {
|
|
326
395
|
const index = this.#items.indexOf(node);
|
|
327
|
-
if (index < 0)
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
396
|
+
if (index < 0) return;
|
|
397
|
+
return new ListNode(
|
|
398
|
+
replacement === undefined
|
|
399
|
+
? [
|
|
400
|
+
...this.#items.slice(0, index),
|
|
401
|
+
...this.#items.slice(index + 1),
|
|
402
|
+
]
|
|
403
|
+
: [
|
|
404
|
+
...this.#items.slice(0, index),
|
|
405
|
+
replacement,
|
|
406
|
+
...this.#items.slice(index + 1),
|
|
407
|
+
],
|
|
408
|
+
this.#numbered
|
|
409
|
+
) as this;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
withContentInRange(range: CaretRange): this | undefined {
|
|
341
413
|
const containsStart = this.contains(range.start.node);
|
|
342
414
|
const containsEnd = this.contains(range.end.node);
|
|
343
|
-
if (!containsStart && !containsEnd)
|
|
344
|
-
|
|
415
|
+
if (!containsStart && !containsEnd) return this.copy();
|
|
416
|
+
|
|
345
417
|
const newItems = [];
|
|
346
418
|
let foundStart = false;
|
|
347
419
|
let foundEnd = false;
|
|
348
420
|
for (let i = 0; i < this.#items.length; i++) {
|
|
349
|
-
if (this.#items[i].contains(range.start.node))
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
((containsEnd && !foundEnd) || !containsEnd)
|
|
421
|
+
if (this.#items[i].contains(range.start.node)) foundStart = true;
|
|
422
|
+
if (
|
|
423
|
+
((containsStart && foundStart) || !containsStart) &&
|
|
424
|
+
((containsEnd && !foundEnd) || !containsEnd)
|
|
425
|
+
) {
|
|
353
426
|
const newItem = this.#items[i].withContentInRange(range);
|
|
354
|
-
if (newItem === undefined)
|
|
355
|
-
return;
|
|
427
|
+
if (newItem === undefined) return;
|
|
356
428
|
newItems.push(newItem);
|
|
357
429
|
}
|
|
358
|
-
if (this.#items[i].contains(range.end.node))
|
|
359
|
-
foundEnd = true;
|
|
430
|
+
if (this.#items[i].contains(range.end.node)) foundEnd = true;
|
|
360
431
|
}
|
|
361
|
-
return new ListNode(newItems, this.#numbered);
|
|
432
|
+
return new ListNode(newItems, this.#numbered) as this;
|
|
362
433
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
if (!(node instanceof ListNode))
|
|
367
|
-
|
|
434
|
+
|
|
435
|
+
withNodeInserted(caret: Caret, node: Node): Edit {
|
|
436
|
+
if (!this.contains(caret.node)) return;
|
|
437
|
+
if (!(node instanceof ListNode)) return;
|
|
438
|
+
|
|
368
439
|
// Find the anchor item.
|
|
369
440
|
const anchor = this.#items.find((i) => i.contains(caret.node));
|
|
370
|
-
if (anchor === undefined)
|
|
371
|
-
|
|
441
|
+
if (anchor === undefined) return;
|
|
442
|
+
|
|
372
443
|
const items = node.getItems();
|
|
444
|
+
|
|
373
445
|
let lastItem = anchor;
|
|
374
|
-
let newList = this;
|
|
446
|
+
let newList: ListNode | undefined = this;
|
|
375
447
|
while (items.length > 0) {
|
|
376
448
|
let item = items.shift();
|
|
377
|
-
if (item === undefined)
|
|
378
|
-
return;
|
|
449
|
+
if (item === undefined) return;
|
|
379
450
|
// Insert all of the node's items into this list, merging the first.
|
|
380
451
|
if (lastItem === anchor) {
|
|
381
452
|
const edit = anchor.withNodeInserted(caret, item);
|
|
@@ -383,49 +454,55 @@ export default class ListNode extends BlockNode {
|
|
|
383
454
|
return;
|
|
384
455
|
item = edit.root;
|
|
385
456
|
newList = newList.withChildReplaced(anchor, item);
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
457
|
+
} else {
|
|
388
458
|
newList = newList.withItemAfter(item, lastItem);
|
|
389
459
|
}
|
|
390
|
-
if (newList === undefined)
|
|
391
|
-
return;
|
|
460
|
+
if (newList === undefined) return;
|
|
392
461
|
// Remember where we inserted.
|
|
393
462
|
lastItem = item;
|
|
394
463
|
}
|
|
464
|
+
|
|
395
465
|
// The caret should be the last item inserted.
|
|
396
|
-
const newCaret =
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
466
|
+
const newCaret =
|
|
467
|
+
lastItem instanceof FormatNode
|
|
468
|
+
? lastItem.getLastCaret()
|
|
469
|
+
: lastItem.getLastItem()?.getLastCaret();
|
|
470
|
+
if (newCaret === undefined) return;
|
|
471
|
+
|
|
401
472
|
return { root: newList, range: { start: newCaret, end: newCaret } };
|
|
402
473
|
}
|
|
403
|
-
|
|
474
|
+
|
|
475
|
+
withRangeFormatted(range: CaretRange, format: Format | undefined): Edit {
|
|
404
476
|
const sortedRange = this.sortRange(range);
|
|
405
477
|
const itemStart = this.getItemContaining(sortedRange.start);
|
|
406
478
|
const itemEnd = this.getItemContaining(sortedRange.end);
|
|
479
|
+
|
|
407
480
|
// This edits all of the formats contained in the range in the list, since the BlockNode class doesn't care about
|
|
408
481
|
// what formats are stored in.
|
|
409
482
|
const edit = super.withRangeFormatted(sortedRange, format);
|
|
483
|
+
|
|
410
484
|
// If we were deleting and two list items were involved, merge them.
|
|
411
|
-
if (
|
|
485
|
+
if (
|
|
486
|
+
edit &&
|
|
412
487
|
format === undefined &&
|
|
413
488
|
itemStart !== undefined &&
|
|
414
489
|
itemEnd !== undefined &&
|
|
415
|
-
itemStart !== itemEnd
|
|
416
|
-
|
|
417
|
-
const
|
|
490
|
+
itemStart !== itemEnd
|
|
491
|
+
) {
|
|
492
|
+
const newList = edit.root as ListNode;
|
|
493
|
+
const itemIndex =
|
|
494
|
+
itemEnd - (this.#items.length - newList.#items.length);
|
|
418
495
|
if (itemIndex > 0 && newList.getLength() > 1) {
|
|
419
496
|
// Merge the items, accounting for the new index of the last item.
|
|
420
497
|
const mergedEdit = newList.withItemMergedBackwards(itemIndex);
|
|
421
|
-
if (mergedEdit === undefined)
|
|
422
|
-
return;
|
|
498
|
+
if (mergedEdit === undefined) return;
|
|
423
499
|
return {
|
|
424
500
|
root: mergedEdit[0],
|
|
425
501
|
range: { start: mergedEdit[1], end: mergedEdit[1] },
|
|
426
502
|
};
|
|
427
503
|
}
|
|
428
504
|
}
|
|
505
|
+
|
|
429
506
|
return edit;
|
|
430
507
|
}
|
|
431
508
|
}
|