bookish-press 0.4.1 → 0.4.16
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/README.md +3 -1
- package/components/Auth.svelte +19 -14
- package/components/Auth.svelte.d.ts +4 -4
- package/components/Authentication.d.ts +2 -2
- package/components/BookPreview.svelte +77 -59
- package/components/BookPreview.svelte.d.ts +5 -5
- package/components/External.svelte +1 -1
- package/components/External.svelte.d.ts +3 -3
- package/components/Link.svelte +49 -3
- package/components/Link.svelte.d.ts +3 -4
- package/components/app/BookList.svelte +19 -0
- package/components/app/BookList.svelte.d.ts +18 -0
- package/components/app/Button.svelte +49 -0
- package/components/app/Button.svelte.d.ts +22 -0
- package/components/app/Feedback.svelte +45 -0
- package/components/app/Feedback.svelte.d.ts +18 -0
- package/components/app/Head.svelte +12 -0
- package/components/app/Head.svelte.d.ts +27 -0
- package/components/app/Large.svelte +8 -0
- package/components/app/Large.svelte.d.ts +27 -0
- package/components/app/Lead.svelte +12 -0
- package/components/app/Lead.svelte.d.ts +27 -0
- package/components/app/Link.svelte +24 -0
- package/components/app/Link.svelte.d.ts +20 -0
- package/components/app/Options.svelte +24 -0
- package/components/app/Options.svelte.d.ts +19 -0
- package/components/app/Paragraph.svelte +19 -0
- package/components/app/Paragraph.svelte.d.ts +18 -0
- package/components/app/Table.svelte +32 -0
- package/components/app/Table.svelte.d.ts +27 -0
- package/components/app/TextInput.svelte +37 -0
- package/components/app/TextInput.svelte.d.ts +22 -0
- package/components/app/Writing.svelte +13 -0
- package/components/app/Writing.svelte.d.ts +27 -0
- package/components/chapter/Atom.svelte +20 -6
- package/components/chapter/Atom.svelte.d.ts +3 -3
- package/components/chapter/Block.svelte +23 -20
- package/components/chapter/Block.svelte.d.ts +4 -4
- package/components/chapter/Callout.svelte +38 -7
- package/components/chapter/Callout.svelte.d.ts +4 -4
- package/components/chapter/CaptionedCode.svelte +66 -23
- package/components/chapter/CaptionedCode.svelte.d.ts +4 -4
- package/components/chapter/ChapterBody.svelte +61 -9
- package/components/chapter/ChapterBody.svelte.d.ts +4 -4
- package/components/chapter/Citations.svelte +86 -20
- package/components/chapter/Citations.svelte.d.ts +4 -4
- package/components/chapter/Code.svelte +152 -21
- package/components/chapter/Code.svelte.d.ts +3 -3
- package/components/chapter/Comment.svelte +38 -16
- package/components/chapter/Comment.svelte.d.ts +3 -3
- package/components/chapter/Definition.svelte +52 -18
- package/components/chapter/Definition.svelte.d.ts +5 -8
- package/components/chapter/Embed.svelte +154 -66
- package/components/chapter/Embed.svelte.d.ts +5 -4
- package/components/chapter/ErrorMessage.svelte +7 -2
- package/components/chapter/ErrorMessage.svelte.d.ts +4 -4
- package/components/chapter/ExtendedPrism.d.ts +2 -0
- package/components/chapter/ExtendedPrism.js +69 -0
- package/components/chapter/Figure.svelte +90 -0
- package/components/chapter/Figure.svelte.d.ts +24 -0
- package/components/chapter/Footnote.svelte +75 -12
- package/components/chapter/Footnote.svelte.d.ts +4 -4
- package/components/chapter/Format.svelte +60 -37
- package/components/chapter/Format.svelte.d.ts +4 -4
- package/components/chapter/InlineCode.svelte +15 -5
- package/components/chapter/InlineCode.svelte.d.ts +4 -4
- package/components/chapter/Label.svelte +37 -8
- package/components/chapter/Label.svelte.d.ts +4 -4
- package/components/chapter/Link.svelte +23 -18
- package/components/chapter/Link.svelte.d.ts +4 -4
- package/components/chapter/List.svelte +75 -8
- package/components/chapter/List.svelte.d.ts +4 -4
- package/components/chapter/Marginal.svelte +169 -27
- package/components/chapter/Marginal.svelte.d.ts +6 -3
- package/components/chapter/Paragraph.svelte +74 -6
- package/components/chapter/Paragraph.svelte.d.ts +4 -4
- package/components/chapter/Positioned.svelte +33 -0
- package/components/chapter/Positioned.svelte.d.ts +19 -0
- package/components/chapter/Problem.svelte +15 -0
- package/components/chapter/Problem.svelte.d.ts +27 -0
- package/components/chapter/Python.svelte +68 -21
- package/components/chapter/Python.svelte.d.ts +4 -4
- package/components/chapter/Quote.svelte +64 -11
- package/components/chapter/Quote.svelte.d.ts +4 -4
- package/components/chapter/Rule.svelte +12 -1
- package/components/chapter/Rule.svelte.d.ts +4 -4
- package/components/chapter/Table.svelte +36 -25
- package/components/chapter/Table.svelte.d.ts +4 -4
- package/components/chapter/Text.svelte +61 -36
- package/components/chapter/Text.svelte.d.ts +5 -4
- package/components/editor/BookishEditor.svelte +343 -237
- package/components/editor/BookishEditor.svelte.d.ts +5 -5
- package/components/editor/CalloutEditor.svelte +5 -5
- package/components/editor/CalloutEditor.svelte.d.ts +4 -4
- package/components/editor/CaptionedCodeEditor.svelte +16 -12
- package/components/editor/CaptionedCodeEditor.svelte.d.ts +4 -4
- package/components/editor/CaretContext.d.ts +48 -16
- package/components/editor/CaretState.d.ts +16 -44
- package/components/editor/CaretUtilities.d.ts +2 -2
- package/components/editor/CaretView.svelte +80 -0
- package/components/editor/CaretView.svelte.d.ts +24 -0
- package/components/editor/CitationsEditor.svelte +36 -25
- package/components/editor/CitationsEditor.svelte.d.ts +4 -4
- package/components/editor/Clipboard.d.ts +2 -2
- package/components/editor/Command.d.ts +13 -12
- package/components/editor/Commands.d.ts +1 -1
- package/components/editor/Commands.js +1114 -571
- package/components/editor/ConfirmButton.svelte +18 -12
- package/components/editor/ConfirmButton.svelte.d.ts +5 -4
- package/components/editor/DefinitionEditor.svelte +29 -21
- package/components/editor/DefinitionEditor.svelte.d.ts +4 -4
- package/components/editor/EmbedEditor.svelte +93 -43
- package/components/editor/EmbedEditor.svelte.d.ts +3 -3
- package/components/editor/Icon.svelte +17 -0
- package/components/editor/Icon.svelte.d.ts +16 -0
- package/components/editor/ImageChooser.svelte +53 -34
- package/components/editor/ImageChooser.svelte.d.ts +3 -3
- package/components/editor/InlineCodeEditor.svelte +7 -4
- package/components/editor/InlineCodeEditor.svelte.d.ts +4 -4
- package/components/editor/LabelEditor.svelte +20 -11
- package/components/editor/LabelEditor.svelte.d.ts +4 -4
- package/components/editor/LanguageEditor.svelte +10 -7
- package/components/editor/LanguageEditor.svelte.d.ts +3 -3
- package/components/editor/LinkEditor.svelte +64 -39
- package/components/editor/LinkEditor.svelte.d.ts +4 -4
- package/components/editor/Note.svelte +3 -3
- package/components/editor/Note.svelte.d.ts +6 -2
- package/components/editor/PositionEditor.svelte +9 -6
- package/components/editor/PositionEditor.svelte.d.ts +4 -4
- package/components/editor/QuoteEditor.svelte +7 -2
- package/components/editor/QuoteEditor.svelte.d.ts +4 -4
- package/components/editor/Switch.svelte +55 -28
- package/components/editor/Switch.svelte.d.ts +4 -4
- package/components/editor/TableEditor.svelte +10 -0
- package/components/editor/TableEditor.svelte.d.ts +17 -0
- package/components/editor/TextEditor.svelte +83 -45
- package/components/editor/TextEditor.svelte.d.ts +5 -4
- package/components/editor/Toggle.svelte +11 -8
- package/components/editor/Toggle.svelte.d.ts +4 -4
- package/components/editor/Toolbar.svelte +192 -144
- package/components/editor/Toolbar.svelte.d.ts +5 -8
- package/components/editor/ToolbarGroup.svelte +18 -23
- package/components/editor/ToolbarGroup.svelte.d.ts +3 -4
- package/components/editor/ToolbarSpacer.svelte +8 -1
- package/components/editor/ToolbarSpacer.svelte.d.ts +6 -2
- package/components/editor/URLEditor.svelte +6 -8
- package/components/editor/URLEditor.svelte.d.ts +3 -3
- package/components/editor/UndoState.d.ts +3 -3
- package/components/editor/icons/annotate.svg +1 -0
- package/components/editor/icons/block.svg +1 -0
- package/components/editor/icons/bold.svg +1 -0
- package/components/editor/icons/bullets.svg +1 -0
- package/components/editor/icons/callout.svg +1 -0
- package/components/editor/icons/citation.svg +8 -0
- package/components/editor/icons/clear.svg +1 -0
- package/components/editor/icons/clipboard.svg +1 -0
- package/components/editor/icons/code.svg +1 -0
- package/components/editor/icons/columnafter.svg +1 -0
- package/components/editor/icons/columnbefore.svg +1 -0
- package/components/editor/icons/comment.svg +1 -0
- package/components/editor/icons/copy.svg +1 -0
- package/components/editor/icons/cut.svg +1 -0
- package/components/editor/icons/define.svg +7 -0
- package/components/editor/icons/deletecolumn.svg +1 -0
- package/components/editor/icons/deleterow.svg +1 -0
- package/components/editor/icons/footnote.svg +8 -0
- package/components/editor/icons/header1.svg +7 -0
- package/components/editor/icons/header2.svg +7 -0
- package/components/editor/icons/header3.svg +7 -0
- package/components/editor/icons/home.svg +1 -0
- package/components/editor/icons/indent.svg +1 -0
- package/components/editor/icons/italic.svg +1 -0
- package/components/editor/icons/label.svg +1 -0
- package/components/editor/icons/left.svg +1 -0
- package/components/editor/icons/level.svg +1 -0
- package/components/editor/icons/link.svg +1 -0
- package/components/editor/icons/list.svg +1 -0
- package/components/editor/icons/media.svg +1 -0
- package/components/editor/icons/middle.svg +1 -0
- package/components/editor/icons/numbers.svg +10 -0
- package/components/editor/icons/paragraph.svg +1 -0
- package/components/editor/icons/paste.svg +10 -0
- package/components/editor/icons/quote.svg +1 -0
- package/components/editor/icons/redo.svg +1 -0
- package/components/editor/icons/right.svg +1 -0
- package/components/editor/icons/rowabove.svg +1 -0
- package/components/editor/icons/rowbelow.svg +1 -0
- package/components/editor/icons/rule.svg +1 -0
- package/components/editor/icons/sub.svg +1 -0
- package/components/editor/icons/super.svg +1 -0
- package/components/editor/icons/table.svg +1 -0
- package/components/editor/icons/text.svg +1 -0
- package/components/editor/icons/time.svg +1 -0
- package/components/editor/icons/undo.svg +1 -0
- package/components/editor/icons/unindent.svg +1 -0
- package/components/editor/icons/unlink.svg +1 -0
- package/components/page/Acknowledgements.svelte +31 -22
- package/components/page/Acknowledgements.svelte.d.ts +4 -4
- package/components/page/Authors.svelte +34 -14
- package/components/page/Authors.svelte.d.ts +6 -6
- package/components/page/BulkReferenceEditor.svelte +53 -22
- package/components/page/BulkReferenceEditor.svelte.d.ts +4 -4
- package/components/page/Chapter.svelte +196 -141
- package/components/page/Chapter.svelte.d.ts +3 -3
- package/components/page/ChapterContext.d.ts +4 -4
- package/components/page/ChapterNumber.svelte +9 -0
- package/components/page/ChapterNumber.svelte.d.ts +27 -0
- package/components/page/ChapterTitle.svelte +16 -0
- package/components/page/ChapterTitle.svelte.d.ts +18 -0
- package/components/page/Contexts.d.ts +31 -20
- package/components/page/Contexts.js +47 -17
- package/components/page/DefinitionView.svelte +115 -86
- package/components/page/DefinitionView.svelte.d.ts +3 -3
- package/components/page/Description.svelte +27 -18
- package/components/page/Description.svelte.d.ts +4 -4
- package/components/page/Edition.svelte +127 -75
- package/components/page/Edition.svelte.d.ts +4 -4
- package/components/page/Editions.svelte +144 -0
- package/components/page/Editions.svelte.d.ts +14 -0
- package/components/page/Glossary.svelte +57 -48
- package/components/page/Glossary.svelte.d.ts +4 -4
- package/components/page/Header.svelte +129 -44
- package/components/page/Header.svelte.d.ts +6 -6
- package/components/page/Index.svelte +114 -80
- package/components/page/Index.svelte.d.ts +4 -4
- package/components/page/Instructions.svelte +18 -16
- package/components/page/Instructions.svelte.d.ts +4 -4
- package/components/page/License.svelte +29 -21
- package/components/page/License.svelte.d.ts +4 -4
- package/components/page/Loading.svelte +102 -12
- package/components/page/Loading.svelte.d.ts +6 -2
- package/components/page/Media.svelte +77 -51
- package/components/page/Media.svelte.d.ts +4 -4
- package/components/page/MediaPreview.svelte +26 -8
- package/components/page/MediaPreview.svelte.d.ts +3 -3
- package/components/page/Muted.svelte +10 -0
- package/components/page/Muted.svelte.d.ts +27 -0
- package/components/page/Outline.svelte +279 -59
- package/components/page/Outline.svelte.d.ts +3 -3
- package/components/page/Page.svelte +40 -9
- package/components/page/Page.svelte.d.ts +3 -3
- package/components/page/PageHeader.svelte +14 -0
- package/components/page/PageHeader.svelte.d.ts +18 -0
- package/components/page/PageParagraph.svelte +18 -0
- package/components/page/PageParagraph.svelte.d.ts +27 -0
- package/components/page/PossibleChapter.svelte +7 -7
- package/components/page/PossibleChapter.svelte.d.ts +4 -4
- package/components/page/PossibleReference.svelte +6 -11
- package/components/page/PossibleReference.svelte.d.ts +6 -7
- package/components/page/Print.svelte +27 -3
- package/components/page/Print.svelte.d.ts +4 -4
- package/components/page/Reference.svelte +256 -113
- package/components/page/Reference.svelte.d.ts +5 -5
- package/components/page/References.svelte +39 -47
- package/components/page/References.svelte.d.ts +4 -4
- package/components/page/Rows.svelte +54 -0
- package/components/page/Rows.svelte.d.ts +27 -0
- package/components/page/Search.svelte +86 -63
- package/components/page/Search.svelte.d.ts +4 -4
- package/components/page/Status.svelte +43 -35
- package/components/page/Status.svelte.d.ts +4 -9
- package/components/page/SubdomainEditor.svelte +40 -27
- package/components/page/SubdomainEditor.svelte.d.ts +4 -4
- package/components/page/TableOfContents.svelte +225 -190
- package/components/page/TableOfContents.svelte.d.ts +4 -4
- package/components/page/TableOfContentsImage.svelte +8 -8
- package/components/page/TableOfContentsImage.svelte.d.ts +3 -3
- package/components/page/TableOfContentsRow.svelte +96 -33
- package/components/page/TableOfContentsRow.svelte.d.ts +4 -4
- package/components/page/ThemeEditor.svelte +174 -39
- package/components/page/ThemeEditor.svelte.d.ts +4 -4
- package/components/page/ThemeEditorPreview.svelte +35 -23
- package/components/page/ThemeEditorPreview.svelte.d.ts +5 -5
- package/components/page/ThemeSetEditor.svelte +15 -13
- package/components/page/ThemeSetEditor.svelte.d.ts +4 -4
- package/components/page/ThemeVariableEditor.svelte +24 -15
- package/components/page/ThemeVariableEditor.svelte.d.ts +3 -3
- package/components/page/Title.svelte +12 -0
- package/components/page/Title.svelte.d.ts +27 -0
- package/components/page/Unknown.svelte +25 -21
- package/components/page/Unknown.svelte.d.ts +4 -4
- package/components/page/margins.js +50 -33
- package/index.d.ts +14 -0
- package/index.js +14 -0
- package/models/CRUD.d.ts +17 -0
- package/models/CRUD.js +194 -0
- package/models/Firebase.js +17 -15
- package/models/book/Book.d.ts +24 -28
- package/models/book/Book.js +120 -113
- package/models/book/BookMedia.d.ts +3 -3
- package/models/book/BookMedia.js +22 -16
- package/models/book/BookSaveStatus.d.ts +7 -0
- package/models/book/BookSaveStatus.js +8 -0
- package/models/book/Chapter.d.ts +46 -39
- package/models/book/Chapter.js +180 -198
- package/models/book/ChapterID.js +7 -7
- package/models/book/Definition.d.ts +1 -1
- package/models/book/Edition.d.ts +62 -60
- package/models/book/Edition.js +385 -303
- package/models/book/Reference.d.ts +24 -0
- package/models/book/Reference.js +78 -0
- package/models/book/Schema.d.ts +169 -0
- package/models/book/Schema.js +114 -0
- package/models/book/Theme.d.ts +44 -37
- package/models/book/Theme.js +452 -52
- package/models/book/ThemeColors.d.ts +1 -1
- package/models/book/Words.d.ts +2 -0
- package/models/book/Words.js +110 -0
- package/models/chapter/AtomNode.d.ts +4 -4
- package/models/chapter/AtomNode.js +20 -13
- package/models/chapter/BlockNode.d.ts +9 -10
- package/models/chapter/BlockNode.js +32 -13
- package/models/chapter/BlocksNode.d.ts +10 -10
- package/models/chapter/BlocksNode.js +315 -120
- package/models/chapter/BlocksNode.test.js +494 -228
- package/models/chapter/Bookkeeping.d.ts +1 -1
- package/models/chapter/CalloutNode.d.ts +3 -3
- package/models/chapter/CalloutNode.js +34 -12
- package/models/chapter/Caret.d.ts +9 -7
- package/models/chapter/Caret.js +11 -6
- package/models/chapter/ChapterNode.d.ts +11 -11
- package/models/chapter/ChapterNode.js +70 -33
- package/models/chapter/CitationsNode.d.ts +3 -3
- package/models/chapter/CitationsNode.js +31 -12
- package/models/chapter/CodeNode.d.ts +11 -6
- package/models/chapter/CodeNode.js +143 -34
- package/models/chapter/CommentNode.d.ts +5 -5
- package/models/chapter/CommentNode.js +29 -13
- package/models/chapter/DefinitionNode.d.ts +2 -2
- package/models/chapter/DefinitionNode.js +15 -7
- package/models/chapter/Edit.d.ts +3 -3
- package/models/chapter/EmbedNode.d.ts +9 -5
- package/models/chapter/EmbedNode.js +108 -35
- package/models/chapter/ErrorNode.d.ts +2 -2
- package/models/chapter/ErrorNode.js +34 -12
- package/models/chapter/FootnoteNode.d.ts +5 -5
- package/models/chapter/FootnoteNode.js +34 -16
- package/models/chapter/FormatNode.d.ts +10 -10
- package/models/chapter/FormatNode.js +237 -106
- package/models/chapter/FormatNode.test.js +87 -45
- package/models/chapter/InlineCodeNode.d.ts +2 -2
- package/models/chapter/InlineCodeNode.js +22 -9
- package/models/chapter/LabelNode.d.ts +4 -4
- package/models/chapter/LabelNode.js +31 -13
- package/models/chapter/LinkNode.d.ts +2 -2
- package/models/chapter/LinkNode.js +21 -9
- package/models/chapter/ListNode.d.ts +8 -8
- package/models/chapter/ListNode.js +99 -38
- package/models/chapter/ListNode.test.js +29 -24
- package/models/chapter/MetadataNode.d.ts +3 -3
- package/models/chapter/MetadataNode.js +13 -5
- package/models/chapter/Node.d.ts +5 -3
- package/models/chapter/Node.js +76 -29
- package/models/chapter/Node.test.js +20 -18
- package/models/chapter/ParagraphNode.d.ts +6 -6
- package/models/chapter/ParagraphNode.js +84 -29
- package/models/chapter/ParagraphNode.test.js +22 -13
- package/models/chapter/Parser.d.ts +25 -25
- package/models/chapter/Parser.js +201 -189
- package/models/chapter/Parser.test.js +16 -16
- package/models/chapter/Position.d.ts +1 -1
- package/models/chapter/QuoteNode.d.ts +6 -6
- package/models/chapter/QuoteNode.js +61 -23
- package/models/chapter/RootNode.d.ts +4 -4
- package/models/chapter/RuleNode.d.ts +2 -2
- package/models/chapter/RuleNode.js +31 -11
- package/models/chapter/TableNode.d.ts +8 -6
- package/models/chapter/TableNode.js +89 -34
- package/models/chapter/TableNode.test.js +22 -24
- package/models/chapter/TextNode.d.ts +6 -6
- package/models/chapter/TextNode.js +72 -32
- package/models/chapter/TextNode.test.js +4 -4
- package/models/loadEdition.d.ts +1 -1
- package/models/loadEdition.js +10 -6
- package/package.json +104 -25
- package/util/getSubdomain.js +8 -6
- package/util/isMobile.js +1 -1
- package/util/mineReference.d.ts +3 -2
- package/util/mineReference.js +67 -29
- package/util/scrollToEyeLevel.js +6 -1
- package/components/chapter/renderPosition.d.ts +0 -3
- package/components/chapter/renderPosition.js +0 -4
- package/components/editor/ToolbarIcon.svelte +0 -22
- package/components/editor/ToolbarIcon.svelte.d.ts +0 -16
- package/components/page/Alert.svelte +0 -11
- package/components/page/Alert.svelte.d.ts +0 -23
- package/components/page/Revisions.svelte +0 -124
- package/components/page/Revisions.svelte.d.ts +0 -14
- package/models/BookLoader.d.ts +0 -2
- package/models/BookLoader.js +0 -67
- package/models/Firestore.d.ts +0 -22
- package/models/Firestore.js +0 -194
- package/models/chapter/ReferenceNode.d.ts +0 -29
- package/models/chapter/ReferenceNode.js +0 -48
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import BlocksNode from
|
|
2
|
-
import type BlockNode from
|
|
3
|
-
import type Position from
|
|
1
|
+
import BlocksNode from './BlocksNode';
|
|
2
|
+
import type BlockNode from './BlockNode';
|
|
3
|
+
import type Position from './Position';
|
|
4
4
|
export default class CalloutNode extends BlocksNode {
|
|
5
5
|
#private;
|
|
6
6
|
constructor(elements: BlockNode[], position?: Position);
|
|
@@ -1,33 +1,55 @@
|
|
|
1
|
-
import BlocksNode from
|
|
1
|
+
import BlocksNode from './BlocksNode';
|
|
2
2
|
export default class CalloutNode extends BlocksNode {
|
|
3
3
|
#position;
|
|
4
|
-
constructor(elements, position =
|
|
4
|
+
constructor(elements, position = '|') {
|
|
5
5
|
super(elements);
|
|
6
6
|
this.#position = position;
|
|
7
7
|
}
|
|
8
|
-
getType() {
|
|
9
|
-
|
|
8
|
+
getType() {
|
|
9
|
+
return 'callout';
|
|
10
|
+
}
|
|
11
|
+
getPosition() {
|
|
12
|
+
return this.#position;
|
|
13
|
+
}
|
|
10
14
|
toText() {
|
|
11
|
-
return this.getBlocks()
|
|
15
|
+
return this.getBlocks()
|
|
16
|
+
.map((element) => element.toText())
|
|
17
|
+
.join(' ');
|
|
12
18
|
}
|
|
13
19
|
toHTML() {
|
|
14
20
|
return `<hr/>${super.toHTML()}<hr/>`;
|
|
15
21
|
}
|
|
16
22
|
toBookdown() {
|
|
17
|
-
return
|
|
23
|
+
return ('=\n' +
|
|
24
|
+
this.getBlocks()
|
|
25
|
+
.map((element) => element.toBookdown())
|
|
26
|
+
.join('\n\n') +
|
|
27
|
+
'\n=' +
|
|
28
|
+
(this.#position !== '|' ? this.#position : ''));
|
|
29
|
+
}
|
|
30
|
+
getChildren() {
|
|
31
|
+
return this.getBlocks();
|
|
18
32
|
}
|
|
19
|
-
getChildren() { return this.getBlocks(); }
|
|
20
33
|
copy() {
|
|
21
|
-
return new CalloutNode(this.getBlocks().map(e => e.copy()), this.#position);
|
|
34
|
+
return new CalloutNode(this.getBlocks().map((e) => e.copy()), this.#position);
|
|
35
|
+
}
|
|
36
|
+
withPosition(position) {
|
|
37
|
+
return new CalloutNode(this.getBlocks(), position);
|
|
22
38
|
}
|
|
23
|
-
withPosition(position) { return new CalloutNode(this.getBlocks(), position); }
|
|
24
39
|
withChildReplaced(node, replacement) {
|
|
25
40
|
const index = this.getBlocks().indexOf(node);
|
|
26
41
|
if (index < 0)
|
|
27
42
|
return;
|
|
28
|
-
const blocks = replacement === undefined
|
|
29
|
-
[
|
|
30
|
-
|
|
43
|
+
const blocks = replacement === undefined
|
|
44
|
+
? [
|
|
45
|
+
...this.getBlocks().slice(0, index),
|
|
46
|
+
...this.getBlocks().slice(index + 1),
|
|
47
|
+
]
|
|
48
|
+
: [
|
|
49
|
+
...this.getBlocks().slice(0, index),
|
|
50
|
+
replacement,
|
|
51
|
+
...this.getBlocks().slice(index + 1),
|
|
52
|
+
];
|
|
31
53
|
return new CalloutNode(blocks, this.#position);
|
|
32
54
|
}
|
|
33
55
|
create(blocks) {
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import type Node from
|
|
2
|
-
import AtomNode from
|
|
3
|
-
import TextNode from
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type Node from './Node';
|
|
2
|
+
import AtomNode from './AtomNode';
|
|
3
|
+
import TextNode from './TextNode';
|
|
4
|
+
import type EmbedNode from './EmbedNode';
|
|
5
|
+
export type SelectableNode = TextNode | AtomNode<any> | EmbedNode;
|
|
6
|
+
type Caret = {
|
|
7
|
+
node: SelectableNode;
|
|
6
8
|
index: number;
|
|
7
9
|
};
|
|
8
10
|
export default Caret;
|
|
9
|
-
export
|
|
11
|
+
export type CaretRange = {
|
|
10
12
|
start: Caret;
|
|
11
13
|
end: Caret;
|
|
12
14
|
};
|
|
13
|
-
export
|
|
15
|
+
export type IndexRange = {
|
|
14
16
|
start: number;
|
|
15
17
|
end: number;
|
|
16
18
|
};
|
package/models/chapter/Caret.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import AtomNode from
|
|
2
|
-
import TextNode from
|
|
3
|
-
import FormatNode from
|
|
1
|
+
import AtomNode from './AtomNode';
|
|
2
|
+
import TextNode from './TextNode';
|
|
3
|
+
import FormatNode from './FormatNode';
|
|
4
4
|
export function getTextAndAtomNodes(node) {
|
|
5
|
-
return node
|
|
5
|
+
return node
|
|
6
|
+
.getNodes()
|
|
7
|
+
.filter((n) => n instanceof TextNode || n instanceof AtomNode);
|
|
6
8
|
}
|
|
7
9
|
function getFormatRoots(node) {
|
|
8
10
|
const roots = [];
|
|
9
11
|
node.traverse((node, parents) => {
|
|
10
|
-
if (node instanceof FormatNode &&
|
|
12
|
+
if (node instanceof FormatNode &&
|
|
13
|
+
parents.length > 0 &&
|
|
14
|
+
!(parents[parents.length - 1] instanceof FormatNode))
|
|
11
15
|
roots.push(node);
|
|
12
16
|
});
|
|
13
17
|
return roots;
|
|
@@ -39,7 +43,8 @@ export function indexToCaret(node, index) {
|
|
|
39
43
|
const nodes = getTextAndAtomNodes(roots[n]);
|
|
40
44
|
for (let i = 0; i < nodes.length; i++) {
|
|
41
45
|
const t = nodes[i];
|
|
42
|
-
if (index >= currentIndex &&
|
|
46
|
+
if (index >= currentIndex &&
|
|
47
|
+
index <= currentIndex + t.getCaretPositionCount()) {
|
|
43
48
|
// Prefer empty nodes to enable zero width formats.
|
|
44
49
|
if (i < nodes.length - 1) {
|
|
45
50
|
const next = nodes[i + 1];
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type Bookkeeping from
|
|
2
|
-
import type BlockNode from
|
|
3
|
-
import ErrorNode from
|
|
4
|
-
import type TextNode from
|
|
5
|
-
import FootnoteNode from
|
|
6
|
-
import EmbedNode from
|
|
7
|
-
import ParagraphNode from
|
|
8
|
-
import type AtomNode from
|
|
9
|
-
import LabelNode from
|
|
10
|
-
import CommentNode from
|
|
11
|
-
import BlocksNode from
|
|
1
|
+
import type Bookkeeping from './Bookkeeping';
|
|
2
|
+
import type BlockNode from './BlockNode';
|
|
3
|
+
import ErrorNode from './ErrorNode';
|
|
4
|
+
import type TextNode from './TextNode';
|
|
5
|
+
import FootnoteNode from './FootnoteNode';
|
|
6
|
+
import EmbedNode from './EmbedNode';
|
|
7
|
+
import ParagraphNode from './ParagraphNode';
|
|
8
|
+
import type AtomNode from './AtomNode';
|
|
9
|
+
import LabelNode from './LabelNode';
|
|
10
|
+
import CommentNode from './CommentNode';
|
|
11
|
+
import BlocksNode from './BlocksNode';
|
|
12
12
|
export default class ChapterNode extends BlocksNode {
|
|
13
13
|
#private;
|
|
14
14
|
constructor(blocks: BlockNode[], metadata?: Bookkeeping);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import ErrorNode from
|
|
2
|
-
import FootnoteNode from
|
|
3
|
-
import EmbedNode from
|
|
4
|
-
import ParagraphNode from
|
|
5
|
-
import CitationsNode from
|
|
6
|
-
import LabelNode from
|
|
7
|
-
import CommentNode from
|
|
8
|
-
import BlocksNode from
|
|
1
|
+
import ErrorNode from './ErrorNode';
|
|
2
|
+
import FootnoteNode from './FootnoteNode';
|
|
3
|
+
import EmbedNode from './EmbedNode';
|
|
4
|
+
import ParagraphNode from './ParagraphNode';
|
|
5
|
+
import CitationsNode from './CitationsNode';
|
|
6
|
+
import LabelNode from './LabelNode';
|
|
7
|
+
import CommentNode from './CommentNode';
|
|
8
|
+
import BlocksNode from './BlocksNode';
|
|
9
9
|
export default class ChapterNode extends BlocksNode {
|
|
10
10
|
#metadata;
|
|
11
11
|
constructor(blocks, metadata) {
|
|
@@ -13,68 +13,105 @@ export default class ChapterNode extends BlocksNode {
|
|
|
13
13
|
// Content extracted during parsing.
|
|
14
14
|
this.#metadata = metadata === undefined ? { symbols: {} } : metadata;
|
|
15
15
|
}
|
|
16
|
-
getType() {
|
|
17
|
-
|
|
16
|
+
getType() {
|
|
17
|
+
return 'chapter';
|
|
18
|
+
}
|
|
19
|
+
getChapter() {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
18
22
|
create(blocks) {
|
|
19
23
|
return new ChapterNode(blocks, this.#metadata);
|
|
20
24
|
}
|
|
21
|
-
getErrors() {
|
|
25
|
+
getErrors() {
|
|
26
|
+
return this.getNodes().filter((n) => n instanceof ErrorNode);
|
|
27
|
+
}
|
|
22
28
|
getCitations() {
|
|
23
29
|
const citations = new Set();
|
|
24
|
-
this.getNodes().filter(n => n instanceof CitationsNode).forEach(cites => cites.getMeta().forEach(citationID => citations.add(citationID)));
|
|
30
|
+
this.getNodes().filter((n) => n instanceof CitationsNode).forEach((cites) => cites.getMeta().forEach((citationID) => citations.add(citationID)));
|
|
25
31
|
return citations;
|
|
26
32
|
}
|
|
27
|
-
getFootnotes() {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
getFootnotes() {
|
|
34
|
+
return this.getNodes().filter((n) => n instanceof FootnoteNode);
|
|
35
|
+
}
|
|
36
|
+
getHeaders() {
|
|
37
|
+
return this.getNodes().filter((n) => n instanceof ParagraphNode && n.getLevel() > 0);
|
|
38
|
+
}
|
|
39
|
+
getEmbeds() {
|
|
40
|
+
return this.getNodes().filter((n) => n instanceof EmbedNode);
|
|
41
|
+
}
|
|
42
|
+
getComments() {
|
|
43
|
+
return this.getNodes().filter((n) => n instanceof CommentNode);
|
|
44
|
+
}
|
|
31
45
|
getLabels() {
|
|
32
|
-
return this.getNodes().filter(n => n instanceof LabelNode);
|
|
46
|
+
return this.getNodes().filter((n) => n instanceof LabelNode);
|
|
33
47
|
}
|
|
34
48
|
hasLabel(labelID) {
|
|
35
|
-
return this.getLabels().find(label => label.getMeta() === labelID) !==
|
|
49
|
+
return (this.getLabels().find((label) => label.getMeta() === labelID) !==
|
|
50
|
+
undefined);
|
|
36
51
|
}
|
|
37
52
|
getCitationNumber(citationID) {
|
|
38
|
-
const index = Array.from(this.getCitations())
|
|
53
|
+
const index = Array.from(this.getCitations())
|
|
54
|
+
.sort()
|
|
55
|
+
.indexOf(citationID);
|
|
39
56
|
return index < 0 ? null : index + 1;
|
|
40
57
|
}
|
|
41
58
|
toText() {
|
|
42
|
-
return this.getBlocks()
|
|
59
|
+
return this.getBlocks()
|
|
60
|
+
.map((block) => block.toText())
|
|
61
|
+
.join(' ');
|
|
43
62
|
}
|
|
44
63
|
toBookdown() {
|
|
45
64
|
// Render the symbols then all the blocks
|
|
46
|
-
return Object.keys(this.#metadata.symbols)
|
|
47
|
-
|
|
65
|
+
return (Object.keys(this.#metadata.symbols)
|
|
66
|
+
.sort()
|
|
67
|
+
.map((name) => `@${name}: ${this.#metadata.symbols[name]}\n\n`)
|
|
68
|
+
.join('') +
|
|
69
|
+
this.getBlocks()
|
|
70
|
+
.map((b) => b.toBookdown())
|
|
71
|
+
.join('\n\n'));
|
|
48
72
|
}
|
|
49
73
|
getNextTextOrAtom(node) {
|
|
50
74
|
// Otherwise, find the next text node after this one.
|
|
51
75
|
const nodes = this.getTextAndAtomNodes();
|
|
52
76
|
const index = nodes.indexOf(node);
|
|
53
|
-
return index === undefined
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
return index === undefined
|
|
78
|
+
? undefined
|
|
79
|
+
: index < nodes.length - 1
|
|
80
|
+
? nodes[index + 1]
|
|
81
|
+
: undefined;
|
|
56
82
|
}
|
|
57
83
|
getPreviousTextOrAtom(node) {
|
|
58
84
|
// Otherwise, find the next text node after this one.
|
|
59
85
|
const nodes = this.getTextAndAtomNodes();
|
|
60
86
|
const index = nodes.indexOf(node);
|
|
61
|
-
return index === undefined
|
|
62
|
-
|
|
63
|
-
|
|
87
|
+
return index === undefined
|
|
88
|
+
? undefined
|
|
89
|
+
: index > 0
|
|
90
|
+
? nodes[index - 1]
|
|
91
|
+
: undefined;
|
|
92
|
+
}
|
|
93
|
+
getChildren() {
|
|
94
|
+
return this.getBlocks();
|
|
64
95
|
}
|
|
65
|
-
getChildren() { return this.getBlocks(); }
|
|
66
96
|
withChildReplaced(node, replacement) {
|
|
67
97
|
const index = this.getBlocks().indexOf(node);
|
|
68
98
|
/// If we couldn't find the requested node, don't change anything.
|
|
69
99
|
if (index < 0)
|
|
70
100
|
return undefined;
|
|
71
101
|
// Make a new blocks node, assigning and re-parenting the replacement.
|
|
72
|
-
const blocks = replacement === undefined
|
|
73
|
-
[
|
|
74
|
-
|
|
102
|
+
const blocks = replacement === undefined
|
|
103
|
+
? [
|
|
104
|
+
...this.getBlocks().slice(0, index),
|
|
105
|
+
...this.getBlocks().slice(index + 1),
|
|
106
|
+
]
|
|
107
|
+
: [
|
|
108
|
+
...this.getBlocks().slice(0, index),
|
|
109
|
+
replacement,
|
|
110
|
+
...this.getBlocks().slice(index + 1),
|
|
111
|
+
];
|
|
75
112
|
return new ChapterNode(blocks, this.#metadata);
|
|
76
113
|
}
|
|
77
114
|
copy() {
|
|
78
|
-
return new ChapterNode(this.getBlocks().map(b => b.copy()), this.#metadata);
|
|
115
|
+
return new ChapterNode(this.getBlocks().map((b) => b.copy()), this.#metadata);
|
|
79
116
|
}
|
|
80
117
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import AtomNode from
|
|
2
|
-
import type Caret from
|
|
3
|
-
import type Node from
|
|
1
|
+
import AtomNode from './AtomNode';
|
|
2
|
+
import type Caret from './Caret';
|
|
3
|
+
import type Node from './Node';
|
|
4
4
|
export default class CitationsNode extends AtomNode<string[]> {
|
|
5
5
|
constructor(citations: string[]);
|
|
6
6
|
getType(): string;
|
|
@@ -1,17 +1,36 @@
|
|
|
1
|
-
import AtomNode from
|
|
1
|
+
import AtomNode from './AtomNode';
|
|
2
2
|
export default class CitationsNode extends AtomNode {
|
|
3
3
|
constructor(citations) {
|
|
4
4
|
super(citations);
|
|
5
5
|
}
|
|
6
|
-
getType() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
getType() {
|
|
7
|
+
return 'citations';
|
|
8
|
+
}
|
|
9
|
+
getDefaultCaret() {
|
|
10
|
+
return { node: this, index: 0 };
|
|
11
|
+
}
|
|
12
|
+
toText() {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
toBookdown() {
|
|
16
|
+
return `<${this.getMeta().join(',')}>`;
|
|
17
|
+
}
|
|
18
|
+
toHTML() {
|
|
19
|
+
return `(${this.getMeta().join(',')})`;
|
|
20
|
+
}
|
|
21
|
+
getParentOf() {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
copy() {
|
|
25
|
+
return new CitationsNode([...this.getMeta()]);
|
|
26
|
+
}
|
|
27
|
+
withMeta(citations) {
|
|
28
|
+
return new CitationsNode(citations);
|
|
29
|
+
}
|
|
30
|
+
withChildReplaced() {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
withContentInRange() {
|
|
34
|
+
return this.copy();
|
|
35
|
+
}
|
|
17
36
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type Node from
|
|
2
|
-
import type Position from
|
|
3
|
-
import FormatNode from
|
|
4
|
-
import TextNode from
|
|
5
|
-
import BlockNode from
|
|
6
|
-
import type { CaretRange } from
|
|
1
|
+
import type Node from './Node';
|
|
2
|
+
import type Position from './Position';
|
|
3
|
+
import FormatNode, { type Format } from './FormatNode';
|
|
4
|
+
import TextNode from './TextNode';
|
|
5
|
+
import BlockNode from './BlockNode';
|
|
6
|
+
import type { CaretRange } from './Caret';
|
|
7
|
+
import type Edit from './Edit';
|
|
8
|
+
import type Caret from './Caret';
|
|
7
9
|
export default class CodeNode extends BlockNode {
|
|
8
10
|
#private;
|
|
9
11
|
constructor(code: TextNode, language: string, position: Position, caption?: FormatNode);
|
|
@@ -27,4 +29,7 @@ export default class CodeNode extends BlockNode {
|
|
|
27
29
|
withExecutable(executable: boolean): CodeNode;
|
|
28
30
|
withCaption(caption: FormatNode): CodeNode;
|
|
29
31
|
withContentInRange(range: CaretRange): this | undefined;
|
|
32
|
+
/** Overrides super, special casing TextNode, since super only handles formats. */
|
|
33
|
+
withRangeFormatted(range: CaretRange, format: Format | undefined): Edit;
|
|
34
|
+
withNodeInserted(caret: Caret, node: Node): Edit;
|
|
30
35
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import FormatNode from
|
|
2
|
-
import TextNode from
|
|
3
|
-
import BlockNode from
|
|
1
|
+
import FormatNode, {} from './FormatNode';
|
|
2
|
+
import TextNode from './TextNode';
|
|
3
|
+
import BlockNode from './BlockNode';
|
|
4
4
|
export default class CodeNode extends BlockNode {
|
|
5
5
|
#code;
|
|
6
6
|
#caption;
|
|
@@ -9,56 +9,165 @@ export default class CodeNode extends BlockNode {
|
|
|
9
9
|
#executable;
|
|
10
10
|
constructor(code, language, position, caption) {
|
|
11
11
|
super();
|
|
12
|
-
const executable = language.charAt(language.length - 1) ===
|
|
12
|
+
const executable = language.charAt(language.length - 1) === '!';
|
|
13
13
|
this.#code = code;
|
|
14
14
|
this.#position = position;
|
|
15
15
|
this.#language = executable ? language.slice(0, -1) : language;
|
|
16
16
|
this.#executable = executable;
|
|
17
|
-
this.#caption =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
17
|
+
this.#caption =
|
|
18
|
+
caption === undefined
|
|
19
|
+
? new FormatNode('', [new TextNode()])
|
|
20
|
+
: caption.withTextIfEmpty();
|
|
21
|
+
}
|
|
22
|
+
getType() {
|
|
23
|
+
return 'code';
|
|
24
|
+
}
|
|
25
|
+
getCodeNode() {
|
|
26
|
+
return this.#code;
|
|
27
|
+
}
|
|
28
|
+
getCode() {
|
|
29
|
+
return this.#code.getText();
|
|
30
|
+
}
|
|
31
|
+
getCaption() {
|
|
32
|
+
return this.#caption;
|
|
33
|
+
}
|
|
34
|
+
getPosition() {
|
|
35
|
+
return this.#position;
|
|
36
|
+
}
|
|
37
|
+
getLanguage() {
|
|
38
|
+
return this.#language;
|
|
39
|
+
}
|
|
40
|
+
isExecutable() {
|
|
41
|
+
return this.#executable;
|
|
42
|
+
}
|
|
43
|
+
getFormats() {
|
|
44
|
+
return [this.#caption];
|
|
45
|
+
}
|
|
46
|
+
toText() {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
toHTML() {
|
|
50
|
+
return `<pre><code>${this.#code.toHTML()}</code><pre><center>${this.#caption.toHTML()}</center>`;
|
|
51
|
+
}
|
|
29
52
|
toBookdown() {
|
|
30
53
|
// Remember to escape any back ticks.
|
|
31
|
-
return
|
|
32
|
-
(this.#language !==
|
|
33
|
-
|
|
54
|
+
return ('`' +
|
|
55
|
+
(this.#language !== 'plaintext' ? this.#language : '') +
|
|
56
|
+
(this.#executable ? '!' : '') +
|
|
57
|
+
'\n' +
|
|
34
58
|
this.#code.getText().replace(/`/g, '\\`') +
|
|
35
|
-
|
|
36
|
-
(this.#position !==
|
|
37
|
-
this.#caption.toBookdown();
|
|
59
|
+
'\n`' +
|
|
60
|
+
(this.#position !== '|' ? this.#position : '') +
|
|
61
|
+
this.#caption.toBookdown());
|
|
62
|
+
}
|
|
63
|
+
getChildren() {
|
|
64
|
+
return [this.#code, this.#caption];
|
|
38
65
|
}
|
|
39
|
-
getChildren() { return [this.#code, this.#caption]; }
|
|
40
66
|
copy() {
|
|
41
67
|
return new CodeNode(this.#code.copy(), this.#language, this.#position, this.#caption.copy());
|
|
42
68
|
}
|
|
43
69
|
getParentOf(node) {
|
|
44
|
-
return node == this.#code || node === this.#caption
|
|
70
|
+
return node == this.#code || node === this.#caption
|
|
71
|
+
? this
|
|
72
|
+
: this.#caption.getParentOf(node);
|
|
45
73
|
}
|
|
46
74
|
withChildReplaced(node, replacement) {
|
|
47
|
-
const newCode = node === this.#code && replacement instanceof TextNode
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
75
|
+
const newCode = node === this.#code && replacement instanceof TextNode
|
|
76
|
+
? replacement
|
|
77
|
+
: undefined;
|
|
78
|
+
const newCaption = node === this.#caption &&
|
|
79
|
+
(replacement instanceof FormatNode || replacement === undefined)
|
|
80
|
+
? replacement
|
|
81
|
+
: undefined;
|
|
82
|
+
return newCode || newCaption
|
|
83
|
+
? new CodeNode(newCode ? newCode : this.#code, this.#language, this.#position, newCaption ? newCaption : this.#caption)
|
|
84
|
+
: undefined;
|
|
85
|
+
}
|
|
86
|
+
withPosition(position) {
|
|
87
|
+
return new CodeNode(this.#code, this.#language, position, this.#caption);
|
|
88
|
+
}
|
|
89
|
+
withLanguage(language) {
|
|
90
|
+
return new CodeNode(this.#code, language, this.#position, this.#caption);
|
|
91
|
+
}
|
|
92
|
+
withExecutable(executable) {
|
|
93
|
+
return new CodeNode(this.#code, executable ? this.#language + '!' : this.#language, this.#position, this.#caption);
|
|
94
|
+
}
|
|
95
|
+
withCaption(caption) {
|
|
96
|
+
return new CodeNode(this.#code, this.#language, this.#position, caption);
|
|
97
|
+
}
|
|
55
98
|
withContentInRange(range) {
|
|
56
99
|
if (!this.contains(range.start.node) && !this.contains(range.end.node))
|
|
57
100
|
return this.copy();
|
|
58
|
-
const newCode = this.#caption.contains(range.start.node)
|
|
59
|
-
|
|
101
|
+
const newCode = this.#caption.contains(range.start.node)
|
|
102
|
+
? new TextNode()
|
|
103
|
+
: this.#code.withContentInRange(range);
|
|
104
|
+
const newCaption = range.end.node === this.#code
|
|
105
|
+
? new FormatNode('', [new TextNode()])
|
|
106
|
+
: this.#caption.withContentInRange(range);
|
|
60
107
|
if (newCode === undefined || newCaption === undefined)
|
|
61
108
|
return;
|
|
62
109
|
return new CodeNode(newCode, this.#language, this.#position, newCaption);
|
|
63
110
|
}
|
|
111
|
+
/** Overrides super, special casing TextNode, since super only handles formats. */
|
|
112
|
+
withRangeFormatted(range, format) {
|
|
113
|
+
let editedNode = this;
|
|
114
|
+
// First, handle the caption, if necessary.
|
|
115
|
+
let captionEdit = super.withRangeFormatted(range, format);
|
|
116
|
+
// If we're asking for format, skip it, code can't be formatted. Just return the caption edit.
|
|
117
|
+
if (format !== undefined)
|
|
118
|
+
return captionEdit;
|
|
119
|
+
// Grab the new CodeNode if the caption was edited.
|
|
120
|
+
if (captionEdit)
|
|
121
|
+
editedNode = captionEdit.root;
|
|
122
|
+
// Next, see if part of the range included this text node.
|
|
123
|
+
const sortedRange = this.sortRange(range);
|
|
124
|
+
const containsStart = sortedRange.start.node === this.#code;
|
|
125
|
+
const containsEnd = sortedRange.end.node === this.#code;
|
|
126
|
+
if (containsStart) {
|
|
127
|
+
const revisedCode = this.#code.withoutRange({
|
|
128
|
+
start: { node: this.#code, index: sortedRange.start.index },
|
|
129
|
+
end: {
|
|
130
|
+
node: this.#code,
|
|
131
|
+
index: containsEnd
|
|
132
|
+
? sortedRange.end.index
|
|
133
|
+
: this.#code.getLength(),
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
if (revisedCode === undefined)
|
|
137
|
+
return;
|
|
138
|
+
editedNode = editedNode.withChildReplaced(this.#code, revisedCode);
|
|
139
|
+
if (editedNode === undefined)
|
|
140
|
+
return;
|
|
141
|
+
const revisedCaret = {
|
|
142
|
+
node: revisedCode,
|
|
143
|
+
index: sortedRange.start.index,
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
root: editedNode,
|
|
147
|
+
range: { start: revisedCaret, end: revisedCaret },
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
return captionEdit;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
withNodeInserted(caret, node) {
|
|
155
|
+
// Only insert if the caret is in the code node.
|
|
156
|
+
if (caret.node !== this.#code)
|
|
157
|
+
return undefined;
|
|
158
|
+
// Convert the node to text, then insert it at the position.
|
|
159
|
+
const text = node
|
|
160
|
+
.getNodes()
|
|
161
|
+
.filter((n) => n instanceof TextNode)
|
|
162
|
+
.map((t) => t.getText())
|
|
163
|
+
.join('');
|
|
164
|
+
const newCode = this.#code.withCharacterAt(text, caret.index);
|
|
165
|
+
if (newCode === undefined)
|
|
166
|
+
return undefined;
|
|
167
|
+
const newNode = this.withChildReplaced(this.#code, newCode);
|
|
168
|
+
if (newNode === undefined)
|
|
169
|
+
return;
|
|
170
|
+
const newCaret = { node: newCode, index: caret.index + text.length };
|
|
171
|
+
return { root: newNode, range: { start: newCaret, end: newCaret } };
|
|
172
|
+
}
|
|
64
173
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import AtomNode from
|
|
2
|
-
import type Caret from
|
|
3
|
-
import type { CaretRange } from
|
|
4
|
-
import FormatNode from
|
|
5
|
-
import type Node from
|
|
1
|
+
import AtomNode from './AtomNode';
|
|
2
|
+
import type Caret from './Caret';
|
|
3
|
+
import type { CaretRange } from './Caret';
|
|
4
|
+
import FormatNode from './FormatNode';
|
|
5
|
+
import type Node from './Node';
|
|
6
6
|
export default class CommentNode extends AtomNode<FormatNode> {
|
|
7
7
|
constructor(comment: FormatNode);
|
|
8
8
|
getType(): string;
|