bookish-press 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/components/Auth.svelte +52 -0
- package/components/Auth.svelte.d.ts +16 -0
- package/components/Authentication.d.ts +8 -0
- package/components/Authentication.js +1 -0
- package/components/BookPreview.svelte +87 -0
- package/components/BookPreview.svelte.d.ts +18 -0
- package/components/External.svelte +4 -0
- package/components/External.svelte.d.ts +18 -0
- package/components/Link.svelte +5 -0
- package/components/Link.svelte.d.ts +19 -0
- package/components/chapter/Atom.svelte +36 -0
- package/components/chapter/Atom.svelte.d.ts +19 -0
- package/components/chapter/Block.svelte +32 -0
- package/components/chapter/Block.svelte.d.ts +17 -0
- package/components/chapter/Callout.svelte +10 -0
- package/components/chapter/Callout.svelte.d.ts +17 -0
- package/components/chapter/CaptionedCode.svelte +34 -0
- package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
- package/components/chapter/ChapterBody.svelte +23 -0
- package/components/chapter/ChapterBody.svelte.d.ts +18 -0
- package/components/chapter/Citations.svelte +66 -0
- package/components/chapter/Citations.svelte.d.ts +17 -0
- package/components/chapter/Code.svelte +35 -0
- package/components/chapter/Code.svelte.d.ts +22 -0
- package/components/chapter/Comment.svelte +46 -0
- package/components/chapter/Comment.svelte.d.ts +17 -0
- package/components/chapter/Definition.svelte +38 -0
- package/components/chapter/Definition.svelte.d.ts +20 -0
- package/components/chapter/Embed.svelte +122 -0
- package/components/chapter/Embed.svelte.d.ts +18 -0
- package/components/chapter/ErrorMessage.svelte +4 -0
- package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
- package/components/chapter/Footnote.svelte +37 -0
- package/components/chapter/Footnote.svelte.d.ts +19 -0
- package/components/chapter/Format.svelte +57 -0
- package/components/chapter/Format.svelte.d.ts +18 -0
- package/components/chapter/InlineCode.svelte +12 -0
- package/components/chapter/InlineCode.svelte.d.ts +17 -0
- package/components/chapter/Label.svelte +20 -0
- package/components/chapter/Label.svelte.d.ts +17 -0
- package/components/chapter/Link.svelte +51 -0
- package/components/chapter/Link.svelte.d.ts +17 -0
- package/components/chapter/List.svelte +14 -0
- package/components/chapter/List.svelte.d.ts +17 -0
- package/components/chapter/Marginal.svelte +48 -0
- package/components/chapter/Marginal.svelte.d.ts +19 -0
- package/components/chapter/Paragraph.svelte +15 -0
- package/components/chapter/Paragraph.svelte.d.ts +18 -0
- package/components/chapter/Python.svelte +81 -0
- package/components/chapter/Python.svelte.d.ts +18 -0
- package/components/chapter/Quote.svelte +16 -0
- package/components/chapter/Quote.svelte.d.ts +17 -0
- package/components/chapter/Rule.svelte +4 -0
- package/components/chapter/Rule.svelte.d.ts +17 -0
- package/components/chapter/Table.svelte +29 -0
- package/components/chapter/Table.svelte.d.ts +17 -0
- package/components/chapter/Text.svelte +62 -0
- package/components/chapter/Text.svelte.d.ts +17 -0
- package/components/chapter/renderPosition.d.ts +3 -0
- package/components/chapter/renderPosition.js +4 -0
- package/components/editor/BookishEditor.svelte +755 -0
- package/components/editor/BookishEditor.svelte.d.ts +22 -0
- package/components/editor/CalloutEditor.svelte +10 -0
- package/components/editor/CalloutEditor.svelte.d.ts +17 -0
- package/components/editor/CaptionedCodeEditor.svelte +22 -0
- package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
- package/components/editor/CaretContext.d.ts +18 -0
- package/components/editor/CaretContext.js +1 -0
- package/components/editor/CaretState.d.ts +47 -0
- package/components/editor/CaretState.js +1 -0
- package/components/editor/CaretUtilities.d.ts +5 -0
- package/components/editor/CaretUtilities.js +1 -0
- package/components/editor/CitationsEditor.svelte +42 -0
- package/components/editor/CitationsEditor.svelte.d.ts +17 -0
- package/components/editor/Clipboard.d.ts +3 -0
- package/components/editor/Clipboard.js +1 -0
- package/components/editor/Command.d.ts +18 -0
- package/components/editor/Command.js +1 -0
- package/components/editor/Commands.d.ts +3 -0
- package/components/editor/Commands.js +951 -0
- package/components/editor/ConfirmButton.svelte +43 -0
- package/components/editor/ConfirmButton.svelte.d.ts +18 -0
- package/components/editor/DefinitionEditor.svelte +28 -0
- package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
- package/components/editor/EmbedEditor.svelte +87 -0
- package/components/editor/EmbedEditor.svelte.d.ts +17 -0
- package/components/editor/ImageChooser.svelte +70 -0
- package/components/editor/ImageChooser.svelte.d.ts +18 -0
- package/components/editor/InlineCodeEditor.svelte +9 -0
- package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
- package/components/editor/LabelEditor.svelte +23 -0
- package/components/editor/LabelEditor.svelte.d.ts +17 -0
- package/components/editor/LanguageEditor.svelte +11 -0
- package/components/editor/LanguageEditor.svelte.d.ts +17 -0
- package/components/editor/LinkEditor.svelte +75 -0
- package/components/editor/LinkEditor.svelte.d.ts +17 -0
- package/components/editor/Note.svelte +9 -0
- package/components/editor/Note.svelte.d.ts +23 -0
- package/components/editor/PositionEditor.svelte +14 -0
- package/components/editor/PositionEditor.svelte.d.ts +18 -0
- package/components/editor/QuoteEditor.svelte +5 -0
- package/components/editor/QuoteEditor.svelte.d.ts +17 -0
- package/components/editor/Switch.svelte +56 -0
- package/components/editor/Switch.svelte.d.ts +20 -0
- package/components/editor/TextEditor.svelte +193 -0
- package/components/editor/TextEditor.svelte.d.ts +23 -0
- package/components/editor/Toggle.svelte +38 -0
- package/components/editor/Toggle.svelte.d.ts +19 -0
- package/components/editor/Toolbar.svelte +202 -0
- package/components/editor/Toolbar.svelte.d.ts +20 -0
- package/components/editor/ToolbarGroup.svelte +41 -0
- package/components/editor/ToolbarGroup.svelte.d.ts +19 -0
- package/components/editor/ToolbarIcon.svelte +22 -0
- package/components/editor/ToolbarIcon.svelte.d.ts +16 -0
- package/components/editor/ToolbarSpacer.svelte +1 -0
- package/components/editor/ToolbarSpacer.svelte.d.ts +19 -0
- package/components/editor/URLEditor.svelte +15 -0
- package/components/editor/URLEditor.svelte.d.ts +18 -0
- package/components/editor/UndoState.d.ts +8 -0
- package/components/editor/UndoState.js +1 -0
- package/components/page/Acknowledgements.svelte +29 -0
- package/components/page/Acknowledgements.svelte.d.ts +14 -0
- package/components/page/Alert.svelte +11 -0
- package/components/page/Alert.svelte.d.ts +23 -0
- package/components/page/Authors.svelte +62 -0
- package/components/page/Authors.svelte.d.ts +20 -0
- package/components/page/BulkReferenceEditor.svelte +32 -0
- package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
- package/components/page/Chapter.svelte +301 -0
- package/components/page/Chapter.svelte.d.ts +18 -0
- package/components/page/ChapterContext.d.ts +10 -0
- package/components/page/ChapterContext.js +1 -0
- package/components/page/Contexts.d.ts +27 -0
- package/components/page/Contexts.js +21 -0
- package/components/page/DefinitionView.svelte +129 -0
- package/components/page/DefinitionView.svelte.d.ts +18 -0
- package/components/page/Description.svelte +22 -0
- package/components/page/Description.svelte.d.ts +14 -0
- package/components/page/Edition.svelte +106 -0
- package/components/page/Edition.svelte.d.ts +21 -0
- package/components/page/Glossary.svelte +61 -0
- package/components/page/Glossary.svelte.d.ts +14 -0
- package/components/page/Header.svelte +105 -0
- package/components/page/Header.svelte.d.ts +27 -0
- package/components/page/Index.svelte +117 -0
- package/components/page/Index.svelte.d.ts +14 -0
- package/components/page/Instructions.svelte +30 -0
- package/components/page/Instructions.svelte.d.ts +16 -0
- package/components/page/License.svelte +29 -0
- package/components/page/License.svelte.d.ts +14 -0
- package/components/page/Loading.svelte +13 -0
- package/components/page/Loading.svelte.d.ts +19 -0
- package/components/page/Media.svelte +76 -0
- package/components/page/Media.svelte.d.ts +14 -0
- package/components/page/MediaPreview.svelte +11 -0
- package/components/page/MediaPreview.svelte.d.ts +19 -0
- package/components/page/Outline.svelte +173 -0
- package/components/page/Outline.svelte.d.ts +19 -0
- package/components/page/Page.svelte +53 -0
- package/components/page/Page.svelte.d.ts +19 -0
- package/components/page/PossibleChapter.svelte +14 -0
- package/components/page/PossibleChapter.svelte.d.ts +14 -0
- package/components/page/PossibleReference.svelte +16 -0
- package/components/page/PossibleReference.svelte.d.ts +19 -0
- package/components/page/Print.svelte +8 -0
- package/components/page/Print.svelte.d.ts +14 -0
- package/components/page/Reference.svelte +145 -0
- package/components/page/Reference.svelte.d.ts +17 -0
- package/components/page/References.svelte +58 -0
- package/components/page/References.svelte.d.ts +14 -0
- package/components/page/Revisions.svelte +124 -0
- package/components/page/Revisions.svelte.d.ts +14 -0
- package/components/page/Search.svelte +108 -0
- package/components/page/Search.svelte.d.ts +14 -0
- package/components/page/Status.svelte +49 -0
- package/components/page/Status.svelte.d.ts +19 -0
- package/components/page/SubdomainEditor.svelte +30 -0
- package/components/page/SubdomainEditor.svelte.d.ts +14 -0
- package/components/page/TableOfContents.svelte +234 -0
- package/components/page/TableOfContents.svelte.d.ts +14 -0
- package/components/page/TableOfContentsImage.svelte +15 -0
- package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
- package/components/page/TableOfContentsRow.svelte +57 -0
- package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
- package/components/page/ThemeEditor.svelte +52 -0
- package/components/page/ThemeEditor.svelte.d.ts +14 -0
- package/components/page/ThemeEditorPreview.svelte +37 -0
- package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
- package/components/page/ThemeSetEditor.svelte +17 -0
- package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
- package/components/page/ThemeVariableEditor.svelte +28 -0
- package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
- package/components/page/Unknown.svelte +29 -0
- package/components/page/Unknown.svelte.d.ts +16 -0
- package/components/page/margins.d.ts +2 -0
- package/components/page/margins.js +132 -0
- package/models/BookLoader.d.ts +2 -0
- package/models/BookLoader.js +67 -0
- package/models/Firebase.d.ts +4 -0
- package/models/Firebase.js +26 -0
- package/models/Firestore.d.ts +22 -0
- package/models/Firestore.js +194 -0
- package/models/book/Book.d.ts +60 -0
- package/models/book/Book.js +135 -0
- package/models/book/BookMedia.d.ts +23 -0
- package/models/book/BookMedia.js +102 -0
- package/models/book/Chapter.d.ts +70 -0
- package/models/book/Chapter.js +221 -0
- package/models/book/ChapterID.d.ts +10 -0
- package/models/book/ChapterID.js +10 -0
- package/models/book/Definition.d.ts +6 -0
- package/models/book/Definition.js +1 -0
- package/models/book/Edition.d.ts +111 -0
- package/models/book/Edition.js +466 -0
- package/models/book/Theme.d.ts +106 -0
- package/models/book/Theme.js +76 -0
- package/models/book/ThemeColors.d.ts +15 -0
- package/models/book/ThemeColors.js +1 -0
- package/models/chapter/AtomNode.d.ts +18 -0
- package/models/chapter/AtomNode.js +31 -0
- package/models/chapter/BlockNode.d.ts +21 -0
- package/models/chapter/BlockNode.js +117 -0
- package/models/chapter/BlocksNode.d.ts +50 -0
- package/models/chapter/BlocksNode.js +709 -0
- package/models/chapter/BlocksNode.test.d.ts +1 -0
- package/models/chapter/BlocksNode.test.js +302 -0
- package/models/chapter/Bookkeeping.d.ts +4 -0
- package/models/chapter/Bookkeeping.js +1 -0
- package/models/chapter/CalloutNode.d.ts +17 -0
- package/models/chapter/CalloutNode.js +36 -0
- package/models/chapter/Caret.d.ts +21 -0
- package/models/chapter/Caret.js +69 -0
- package/models/chapter/ChapterNode.d.ts +34 -0
- package/models/chapter/ChapterNode.js +80 -0
- package/models/chapter/CitationsNode.d.ts +16 -0
- package/models/chapter/CitationsNode.js +17 -0
- package/models/chapter/CodeNode.d.ts +30 -0
- package/models/chapter/CodeNode.js +64 -0
- package/models/chapter/CommentNode.d.ts +18 -0
- package/models/chapter/CommentNode.js +32 -0
- package/models/chapter/DefinitionNode.d.ts +12 -0
- package/models/chapter/DefinitionNode.js +20 -0
- package/models/chapter/Edit.d.ts +7 -0
- package/models/chapter/Edit.js +1 -0
- package/models/chapter/EmbedNode.d.ts +40 -0
- package/models/chapter/EmbedNode.js +89 -0
- package/models/chapter/ErrorNode.d.ts +17 -0
- package/models/chapter/ErrorNode.js +21 -0
- package/models/chapter/FootnoteNode.d.ts +18 -0
- package/models/chapter/FootnoteNode.js +29 -0
- package/models/chapter/FormatNode.d.ts +60 -0
- package/models/chapter/FormatNode.js +614 -0
- package/models/chapter/FormatNode.test.d.ts +1 -0
- package/models/chapter/FormatNode.test.js +54 -0
- package/models/chapter/InlineCodeNode.d.ts +12 -0
- package/models/chapter/InlineCodeNode.js +18 -0
- package/models/chapter/LabelNode.d.ts +17 -0
- package/models/chapter/LabelNode.js +22 -0
- package/models/chapter/LinkNode.d.ts +12 -0
- package/models/chapter/LinkNode.js +16 -0
- package/models/chapter/ListNode.d.ts +51 -0
- package/models/chapter/ListNode.js +370 -0
- package/models/chapter/ListNode.test.d.ts +1 -0
- package/models/chapter/ListNode.test.js +49 -0
- package/models/chapter/MetadataNode.d.ts +17 -0
- package/models/chapter/MetadataNode.js +24 -0
- package/models/chapter/Node.d.ts +36 -0
- package/models/chapter/Node.js +173 -0
- package/models/chapter/Node.test.d.ts +1 -0
- package/models/chapter/Node.test.js +27 -0
- package/models/chapter/ParagraphNode.d.ts +33 -0
- package/models/chapter/ParagraphNode.js +93 -0
- package/models/chapter/ParagraphNode.test.d.ts +1 -0
- package/models/chapter/ParagraphNode.test.js +21 -0
- package/models/chapter/Parser.d.ts +75 -0
- package/models/chapter/Parser.js +824 -0
- package/models/chapter/Parser.test.d.ts +1 -0
- package/models/chapter/Parser.test.js +25 -0
- package/models/chapter/Position.d.ts +2 -0
- package/models/chapter/Position.js +1 -0
- package/models/chapter/QuoteNode.d.ts +25 -0
- package/models/chapter/QuoteNode.js +61 -0
- package/models/chapter/ReferenceNode.d.ts +29 -0
- package/models/chapter/ReferenceNode.js +48 -0
- package/models/chapter/RootNode.d.ts +5 -0
- package/models/chapter/RootNode.js +1 -0
- package/models/chapter/RuleNode.d.ts +15 -0
- package/models/chapter/RuleNode.js +16 -0
- package/models/chapter/TableNode.d.ts +35 -0
- package/models/chapter/TableNode.js +176 -0
- package/models/chapter/TableNode.test.d.ts +1 -0
- package/models/chapter/TableNode.test.js +31 -0
- package/models/chapter/TextNode.d.ts +36 -0
- package/models/chapter/TextNode.js +136 -0
- package/models/chapter/TextNode.test.d.ts +1 -0
- package/models/chapter/TextNode.test.js +6 -0
- package/models/loadEdition.d.ts +5 -0
- package/models/loadEdition.js +16 -0
- package/package.json +189 -0
- package/util/getSubdomain.d.ts +3 -0
- package/util/getSubdomain.js +22 -0
- package/util/isMobile.d.ts +2 -0
- package/util/isMobile.js +6 -0
- package/util/mineReference.d.ts +3 -0
- package/util/mineReference.js +62 -0
- package/util/scrollToEyeLevel.d.ts +2 -0
- package/util/scrollToEyeLevel.js +5 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import FormatNode from "./FormatNode";
|
|
2
|
+
import TextNode from "./TextNode";
|
|
3
|
+
import BlockNode from "./BlockNode";
|
|
4
|
+
export default class CodeNode extends BlockNode {
|
|
5
|
+
#code;
|
|
6
|
+
#caption;
|
|
7
|
+
#position;
|
|
8
|
+
#language;
|
|
9
|
+
#executable;
|
|
10
|
+
constructor(code, language, position, caption) {
|
|
11
|
+
super();
|
|
12
|
+
const executable = language.charAt(language.length - 1) === "!";
|
|
13
|
+
this.#code = code;
|
|
14
|
+
this.#position = position;
|
|
15
|
+
this.#language = executable ? language.slice(0, -1) : language;
|
|
16
|
+
this.#executable = executable;
|
|
17
|
+
this.#caption = caption === undefined ? new FormatNode("", [new TextNode()]) : caption.withTextIfEmpty();
|
|
18
|
+
}
|
|
19
|
+
getType() { return "code"; }
|
|
20
|
+
getCodeNode() { return this.#code; }
|
|
21
|
+
getCode() { return this.#code.getText(); }
|
|
22
|
+
getCaption() { return this.#caption; }
|
|
23
|
+
getPosition() { return this.#position; }
|
|
24
|
+
getLanguage() { return this.#language; }
|
|
25
|
+
isExecutable() { return this.#executable; }
|
|
26
|
+
getFormats() { return [this.#caption]; }
|
|
27
|
+
toText() { return ""; }
|
|
28
|
+
toHTML() { return `<pre><code>${this.#code.toHTML()}</code><pre><center>${this.#caption.toHTML()}</center>`; }
|
|
29
|
+
toBookdown() {
|
|
30
|
+
// Remember to escape any back ticks.
|
|
31
|
+
return "`" +
|
|
32
|
+
(this.#language !== "plaintext" ? this.#language : "") +
|
|
33
|
+
"\n" +
|
|
34
|
+
this.#code.getText().replace(/`/g, '\\`') +
|
|
35
|
+
"\n`" +
|
|
36
|
+
(this.#position !== "|" ? this.#position : "") +
|
|
37
|
+
this.#caption.toBookdown();
|
|
38
|
+
}
|
|
39
|
+
getChildren() { return [this.#code, this.#caption]; }
|
|
40
|
+
copy() {
|
|
41
|
+
return new CodeNode(this.#code.copy(), this.#language, this.#position, this.#caption.copy());
|
|
42
|
+
}
|
|
43
|
+
getParentOf(node) {
|
|
44
|
+
return node == this.#code || node === this.#caption ? this : this.#caption.getParentOf(node);
|
|
45
|
+
}
|
|
46
|
+
withChildReplaced(node, replacement) {
|
|
47
|
+
const newCode = node === this.#code && replacement instanceof TextNode ? replacement : undefined;
|
|
48
|
+
const newCaption = node === this.#caption && (replacement instanceof FormatNode || replacement === undefined) ? replacement : undefined;
|
|
49
|
+
return newCode || newCaption ? new CodeNode(newCode ? newCode : this.#code, this.#language, this.#position, newCaption ? newCaption : this.#caption) : undefined;
|
|
50
|
+
}
|
|
51
|
+
withPosition(position) { return new CodeNode(this.#code, this.#language, position, this.#caption); }
|
|
52
|
+
withLanguage(language) { return new CodeNode(this.#code, language, this.#position, this.#caption); }
|
|
53
|
+
withExecutable(executable) { return new CodeNode(this.#code, executable ? this.#language + "!" : this.#language, this.#position, this.#caption); }
|
|
54
|
+
withCaption(caption) { return new CodeNode(this.#code, this.#language, this.#position, caption); }
|
|
55
|
+
withContentInRange(range) {
|
|
56
|
+
if (!this.contains(range.start.node) && !this.contains(range.end.node))
|
|
57
|
+
return this.copy();
|
|
58
|
+
const newCode = this.#caption.contains(range.start.node) ? new TextNode() : this.#code.withContentInRange(range);
|
|
59
|
+
const newCaption = range.end.node === this.#code ? new FormatNode("", [new TextNode()]) : this.#caption.withContentInRange(range);
|
|
60
|
+
if (newCode === undefined || newCaption === undefined)
|
|
61
|
+
return;
|
|
62
|
+
return new CodeNode(newCode, this.#language, this.#position, newCaption);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export default class CommentNode extends AtomNode<FormatNode> {
|
|
7
|
+
constructor(comment: FormatNode);
|
|
8
|
+
getType(): string;
|
|
9
|
+
toText(): string;
|
|
10
|
+
toHTML(): string;
|
|
11
|
+
getDefaultCaret(): Caret | undefined;
|
|
12
|
+
toBookdown(format?: FormatNode): string;
|
|
13
|
+
copy(): this;
|
|
14
|
+
withChildReplaced(node: Node, replacement: Node | undefined): this | undefined;
|
|
15
|
+
getParentOf(node: Node): Node | undefined;
|
|
16
|
+
withMeta(comment: FormatNode): CommentNode;
|
|
17
|
+
withContentInRange(range: CaretRange): this | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import AtomNode from "./AtomNode";
|
|
2
|
+
import FormatNode from "./FormatNode";
|
|
3
|
+
export default class CommentNode extends AtomNode {
|
|
4
|
+
constructor(comment) {
|
|
5
|
+
super(comment.withTextIfEmpty());
|
|
6
|
+
}
|
|
7
|
+
getType() { return "comment"; }
|
|
8
|
+
toText() { return ""; }
|
|
9
|
+
toHTML() { return `(${this.getMeta().toHTML()})`; }
|
|
10
|
+
getDefaultCaret() { return this.getMeta().getFirstCaret(); }
|
|
11
|
+
toBookdown(format) {
|
|
12
|
+
const previousText = format?.getPreviousTextOrAtom(this)?.toBookdown();
|
|
13
|
+
// Insert a space before the % if there isn't one before this.
|
|
14
|
+
return `${previousText?.endsWith(" ") ? "" : " "}%${this.getMeta().toBookdown()}%`;
|
|
15
|
+
}
|
|
16
|
+
copy() { return new CommentNode(this.getMeta().copy()); }
|
|
17
|
+
withChildReplaced(node, replacement) {
|
|
18
|
+
return node instanceof FormatNode && replacement instanceof FormatNode && node === this.getMeta() ?
|
|
19
|
+
new CommentNode(replacement) :
|
|
20
|
+
undefined;
|
|
21
|
+
}
|
|
22
|
+
getParentOf(node) {
|
|
23
|
+
return node === this.getMeta() ? this : this.getMeta().getParentOf(node);
|
|
24
|
+
}
|
|
25
|
+
withMeta(comment) { return new CommentNode(comment); }
|
|
26
|
+
withContentInRange(range) {
|
|
27
|
+
const newFormat = this.getMeta().withContentInRange(range);
|
|
28
|
+
if (newFormat === undefined)
|
|
29
|
+
return;
|
|
30
|
+
return this.withMeta(newFormat);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import MetadataNode from "./MetadataNode";
|
|
2
|
+
import TextNode from "./TextNode";
|
|
3
|
+
export default class DefinitionNode extends MetadataNode<string> {
|
|
4
|
+
constructor(phrase?: TextNode, glossaryID?: string);
|
|
5
|
+
getType(): string;
|
|
6
|
+
toText(): string;
|
|
7
|
+
toHTML(): string;
|
|
8
|
+
toBookdown(): string;
|
|
9
|
+
copy(): this;
|
|
10
|
+
withMeta(meta: string): MetadataNode<string>;
|
|
11
|
+
withText(text: TextNode): MetadataNode<string>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import MetadataNode from "./MetadataNode";
|
|
2
|
+
import TextNode from "./TextNode";
|
|
3
|
+
export default class DefinitionNode extends MetadataNode {
|
|
4
|
+
constructor(phrase, glossaryID = "") {
|
|
5
|
+
super(phrase === undefined ? new TextNode() : phrase, glossaryID);
|
|
6
|
+
}
|
|
7
|
+
getType() { return "definition"; }
|
|
8
|
+
toText() {
|
|
9
|
+
return this.getText().toText();
|
|
10
|
+
}
|
|
11
|
+
toHTML() { return `${this.getText().toHTML()}`; }
|
|
12
|
+
toBookdown() {
|
|
13
|
+
return `~${this.getText().toBookdown()}~${this.getMeta()}`;
|
|
14
|
+
}
|
|
15
|
+
copy() {
|
|
16
|
+
return new DefinitionNode(this.getText(), this.getMeta());
|
|
17
|
+
}
|
|
18
|
+
withMeta(meta) { return new DefinitionNode(this.getText(), meta); }
|
|
19
|
+
withText(text) { return new DefinitionNode(text, this.getMeta()); }
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type Node from "./Node";
|
|
2
|
+
import type Position from "./Position";
|
|
3
|
+
import FormatNode from "./FormatNode";
|
|
4
|
+
import BlockNode from "./BlockNode";
|
|
5
|
+
import type { CaretRange } from "./Caret";
|
|
6
|
+
export default class EmbedNode extends BlockNode {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(url: string, description: string, caption?: FormatNode, credit?: FormatNode, position?: Position);
|
|
9
|
+
getType(): string;
|
|
10
|
+
getURL(): string;
|
|
11
|
+
getSmallURL(): string;
|
|
12
|
+
hasSmallURL(): boolean;
|
|
13
|
+
isHosted(): boolean;
|
|
14
|
+
isLocal(): boolean;
|
|
15
|
+
getDescription(): string;
|
|
16
|
+
getCaption(): FormatNode;
|
|
17
|
+
getCredit(): FormatNode;
|
|
18
|
+
getPosition(): Position;
|
|
19
|
+
getFormats(): FormatNode[];
|
|
20
|
+
getChildren(): FormatNode[];
|
|
21
|
+
getParentOf(node: Node): Node | undefined;
|
|
22
|
+
toText(): string;
|
|
23
|
+
toHTML(): string;
|
|
24
|
+
toBookdown(): string;
|
|
25
|
+
toJSON(): {
|
|
26
|
+
url: string;
|
|
27
|
+
alt: string;
|
|
28
|
+
caption: string;
|
|
29
|
+
credit: string;
|
|
30
|
+
};
|
|
31
|
+
copy(): this;
|
|
32
|
+
withChildReplaced(node: Node, replacement: Node | undefined): this | undefined;
|
|
33
|
+
withURL(url: string): EmbedNode;
|
|
34
|
+
withURLs(url: string, thumbnail: string): EmbedNode;
|
|
35
|
+
withDescription(description: string): EmbedNode;
|
|
36
|
+
withCaption(caption: FormatNode): EmbedNode;
|
|
37
|
+
withCredit(credit: FormatNode): EmbedNode;
|
|
38
|
+
withPosition(position: Position): EmbedNode;
|
|
39
|
+
withContentInRange(range: CaretRange): this | undefined;
|
|
40
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import FormatNode from "./FormatNode";
|
|
2
|
+
import TextNode from "./TextNode";
|
|
3
|
+
import BlockNode from "./BlockNode";
|
|
4
|
+
// This is what we use to encode URLs in the URL field of the embed node.
|
|
5
|
+
const URL_SEPARATOR = "*";
|
|
6
|
+
export default class EmbedNode extends BlockNode {
|
|
7
|
+
/**
|
|
8
|
+
* The URL is actually a list of up to two URLs. The first is a full-size image URL, the second is a smaller image.
|
|
9
|
+
* These are used for responsive rendering and to limit bandwidth usage. Any image URLs after the second are ignored.
|
|
10
|
+
*/
|
|
11
|
+
#urls;
|
|
12
|
+
#description;
|
|
13
|
+
#caption;
|
|
14
|
+
#credit;
|
|
15
|
+
#position;
|
|
16
|
+
constructor(url, description, caption, credit, position = "|") {
|
|
17
|
+
super();
|
|
18
|
+
this.#urls = url;
|
|
19
|
+
this.#description = description;
|
|
20
|
+
this.#caption = caption === undefined ? new FormatNode("", [new TextNode()]) : caption.withTextIfEmpty();
|
|
21
|
+
this.#credit = credit == undefined ? new FormatNode("", [new TextNode()]) : credit.withTextIfEmpty();
|
|
22
|
+
this.#position = position;
|
|
23
|
+
}
|
|
24
|
+
getType() { return "embed"; }
|
|
25
|
+
getURL() { return this.#urls.split(URL_SEPARATOR)[0]; }
|
|
26
|
+
getSmallURL() { return this.isLocal() ? "images/small/" + this.getURL() : this.hasSmallURL() ? this.#urls.split(URL_SEPARATOR)[1] : this.getURL(); }
|
|
27
|
+
hasSmallURL() { return this.#urls.split(URL_SEPARATOR).length > 1 && this.#urls.split(URL_SEPARATOR)[1].trim().length > 0; }
|
|
28
|
+
isHosted() { return this.#urls.includes("bookish"); }
|
|
29
|
+
isLocal() { return !this.#urls.startsWith("http"); }
|
|
30
|
+
getDescription() { return this.#description; }
|
|
31
|
+
getCaption() { return this.#caption; }
|
|
32
|
+
getCredit() { return this.#credit; }
|
|
33
|
+
getPosition() { return this.#position; }
|
|
34
|
+
getFormats() { return [this.#credit, this.#caption]; }
|
|
35
|
+
getChildren() { return [this.#credit, this.#caption]; }
|
|
36
|
+
getParentOf(node) {
|
|
37
|
+
if (node === this.#caption || node === this.#credit)
|
|
38
|
+
return this;
|
|
39
|
+
const captionParent = this.#caption.getParentOf(node);
|
|
40
|
+
if (captionParent)
|
|
41
|
+
return captionParent;
|
|
42
|
+
const creditParent = this.#credit.getParentOf(node);
|
|
43
|
+
if (creditParent)
|
|
44
|
+
return creditParent;
|
|
45
|
+
}
|
|
46
|
+
toText() { return this.#caption.toText(); }
|
|
47
|
+
toHTML() { return `<img src="${this.getURL()}" alt="${this.getDescription()}" />`; }
|
|
48
|
+
toBookdown() {
|
|
49
|
+
return `|${this.#urls}|${this.#description}|${this.#caption.toBookdown()}|${this.#credit.toBookdown()}|`;
|
|
50
|
+
}
|
|
51
|
+
toJSON() {
|
|
52
|
+
return {
|
|
53
|
+
url: this.#urls,
|
|
54
|
+
alt: this.#description,
|
|
55
|
+
caption: this.#caption.toText(),
|
|
56
|
+
credit: this.#credit.toText()
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
copy() {
|
|
60
|
+
return new EmbedNode(this.#urls, this.#description, this.#caption.copy(), this.#credit.copy(), this.#position);
|
|
61
|
+
}
|
|
62
|
+
withChildReplaced(node, replacement) {
|
|
63
|
+
const newCaption = (node === this.#caption && (replacement === undefined || replacement instanceof FormatNode)) ? replacement : this.#caption;
|
|
64
|
+
const newCredit = (node === this.#credit && (replacement === undefined || replacement instanceof FormatNode)) ? replacement : this.#credit;
|
|
65
|
+
return newCaption || newCredit ?
|
|
66
|
+
new EmbedNode(this.#urls, this.#description, newCaption, newCredit, this.#position) :
|
|
67
|
+
undefined;
|
|
68
|
+
}
|
|
69
|
+
withURL(url) {
|
|
70
|
+
// If the URL is a YouTube URL, convert to an embed URL, since a raw YouTube URL is never valid for embedding.
|
|
71
|
+
if (url.includes("www.youtube.com/watch?v="))
|
|
72
|
+
url = url.replace('/watch?v=', '/embed/');
|
|
73
|
+
return new EmbedNode(url, this.#description, this.#caption, this.#credit, this.#position);
|
|
74
|
+
}
|
|
75
|
+
withURLs(url, thumbnail) { return new EmbedNode(url + URL_SEPARATOR + thumbnail, this.#description, this.#caption, this.#credit, this.#position); }
|
|
76
|
+
withDescription(description) { return new EmbedNode(this.#urls, description, this.#caption, this.#credit, this.#position); }
|
|
77
|
+
withCaption(caption) { return new EmbedNode(this.#urls, this.#description, caption, this.#credit, this.#position); }
|
|
78
|
+
withCredit(credit) { return new EmbedNode(this.#urls, this.#description, this.#caption, credit, this.#position); }
|
|
79
|
+
withPosition(position) { return new EmbedNode(this.#urls, this.#description, this.#caption, this.#credit, position); }
|
|
80
|
+
withContentInRange(range) {
|
|
81
|
+
if (!this.contains(range.start.node) && !this.contains(range.end.node))
|
|
82
|
+
return this.copy();
|
|
83
|
+
const newCredit = this.#caption.contains(range.start.node) ? new FormatNode("", [new TextNode()]) : this.#credit.withContentInRange(range);
|
|
84
|
+
const newCaption = this.#credit.contains(range.end.node) ? new FormatNode("", [new TextNode()]) : this.#caption.withContentInRange(range);
|
|
85
|
+
if (newCaption === undefined || newCredit === undefined)
|
|
86
|
+
return;
|
|
87
|
+
return new EmbedNode(this.#urls, this.#description, newCaption, newCredit, this.#position);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import BlockNode from "./BlockNode";
|
|
2
|
+
import type Node from "./Node";
|
|
3
|
+
export default class ErrorNode extends BlockNode {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(text: string | undefined, error: string);
|
|
6
|
+
getType(): string;
|
|
7
|
+
getError(): string;
|
|
8
|
+
getFormats(): never[];
|
|
9
|
+
toText(): string;
|
|
10
|
+
toBookdown(): string;
|
|
11
|
+
toHTML(): string;
|
|
12
|
+
getChildren(): never[];
|
|
13
|
+
getParentOf(): Node | undefined;
|
|
14
|
+
copy(): this;
|
|
15
|
+
withChildReplaced(): undefined;
|
|
16
|
+
withContentInRange(): this | undefined;
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import BlockNode from "./BlockNode";
|
|
2
|
+
export default class ErrorNode extends BlockNode {
|
|
3
|
+
#text;
|
|
4
|
+
#error;
|
|
5
|
+
constructor(text, error) {
|
|
6
|
+
super();
|
|
7
|
+
this.#text = text;
|
|
8
|
+
this.#error = error;
|
|
9
|
+
}
|
|
10
|
+
getType() { return "error"; }
|
|
11
|
+
getError() { return this.#error; }
|
|
12
|
+
getFormats() { return []; }
|
|
13
|
+
toText() { return ""; }
|
|
14
|
+
toBookdown() { return this.#text ?? ""; }
|
|
15
|
+
toHTML() { return this.#text ?? ""; }
|
|
16
|
+
getChildren() { return []; }
|
|
17
|
+
getParentOf() { return undefined; }
|
|
18
|
+
copy() { return new ErrorNode(this.#text, this.#error); }
|
|
19
|
+
withChildReplaced() { return undefined; }
|
|
20
|
+
withContentInRange() { return this.copy(); }
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import FormatNode from "./FormatNode";
|
|
2
|
+
import AtomNode from "./AtomNode";
|
|
3
|
+
import type Node from "./Node";
|
|
4
|
+
import type Caret from "./Caret";
|
|
5
|
+
import type { CaretRange } from "./Caret";
|
|
6
|
+
export default class FootnoteNode extends AtomNode<FormatNode> {
|
|
7
|
+
constructor(content?: FormatNode);
|
|
8
|
+
getType(): string;
|
|
9
|
+
getDefaultCaret(): Caret | undefined;
|
|
10
|
+
toText(): string;
|
|
11
|
+
toBookdown(): string;
|
|
12
|
+
toHTML(): string;
|
|
13
|
+
copy(): this;
|
|
14
|
+
getParentOf(node: Node): Node | undefined;
|
|
15
|
+
withChildReplaced(node: FormatNode, replacement: FormatNode | undefined): this | undefined;
|
|
16
|
+
withMeta(footnote: FormatNode): FootnoteNode;
|
|
17
|
+
withContentInRange(range: CaretRange): this | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import FormatNode from "./FormatNode";
|
|
2
|
+
import AtomNode from "./AtomNode";
|
|
3
|
+
import TextNode from "./TextNode";
|
|
4
|
+
export default class FootnoteNode extends AtomNode {
|
|
5
|
+
constructor(content) {
|
|
6
|
+
super(content === undefined ? new FormatNode("", [new TextNode()]) : content.withTextIfEmpty());
|
|
7
|
+
}
|
|
8
|
+
getType() { return "footnote"; }
|
|
9
|
+
getDefaultCaret() { return this.getMeta().getFirstCaret(); }
|
|
10
|
+
toText() { return this.getMeta().toText(); }
|
|
11
|
+
toBookdown() { return `{${this.getMeta().toBookdown()}}`; }
|
|
12
|
+
toHTML() { return `(${this.getMeta().toHTML()})`; }
|
|
13
|
+
copy() { return new FootnoteNode(this.getMeta().copy()); }
|
|
14
|
+
getParentOf(node) {
|
|
15
|
+
return node === this.getMeta() ? this : this.getMeta().getParentOf(node);
|
|
16
|
+
}
|
|
17
|
+
withChildReplaced(node, replacement) {
|
|
18
|
+
return node === this.getMeta() && replacement !== undefined ?
|
|
19
|
+
new FootnoteNode(replacement) :
|
|
20
|
+
undefined;
|
|
21
|
+
}
|
|
22
|
+
withMeta(footnote) { return new FootnoteNode(footnote); }
|
|
23
|
+
withContentInRange(range) {
|
|
24
|
+
const newFormat = this.getMeta().withContentInRange(range);
|
|
25
|
+
if (newFormat === undefined)
|
|
26
|
+
return;
|
|
27
|
+
return this.withMeta(newFormat);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Node from "./Node";
|
|
2
|
+
import type ErrorNode from "./ErrorNode";
|
|
3
|
+
import TextNode from "./TextNode";
|
|
4
|
+
import type Caret from "./Caret";
|
|
5
|
+
import { type CaretRange } from "./Caret";
|
|
6
|
+
import MetadataNode from "./MetadataNode";
|
|
7
|
+
import AtomNode from "./AtomNode";
|
|
8
|
+
import type Edit from "./Edit";
|
|
9
|
+
export declare type Format = "" | "*" | "_" | "^" | "v";
|
|
10
|
+
export declare type FormatNodeSegmentType = FormatNode | TextNode | ErrorNode | MetadataNode<any> | AtomNode<any>;
|
|
11
|
+
export default class FormatNode extends Node {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(format: Format, segments: FormatNodeSegmentType[]);
|
|
14
|
+
getType(): string;
|
|
15
|
+
getFormat(): Format;
|
|
16
|
+
getSegments(): FormatNodeSegmentType[];
|
|
17
|
+
isEmpty(): boolean;
|
|
18
|
+
isEmptyText(): boolean;
|
|
19
|
+
getLength(): number;
|
|
20
|
+
getParentOf(node: Node): Node | undefined;
|
|
21
|
+
toText(): string;
|
|
22
|
+
toHTML(): string;
|
|
23
|
+
toBookdown(): string;
|
|
24
|
+
getChildren(): FormatNodeSegmentType[];
|
|
25
|
+
getFirstTextNode(): TextNode;
|
|
26
|
+
getLastTextNode(): TextNode;
|
|
27
|
+
copy(): this;
|
|
28
|
+
getTextNodes(): TextNode[];
|
|
29
|
+
getTextAndAtomNodes(): (TextNode | AtomNode<any>)[];
|
|
30
|
+
getAdjacentTextOrAtom(node: TextNode | AtomNode<any>, next: boolean): TextNode | AtomNode<any> | undefined;
|
|
31
|
+
getNextTextOrAtom(node: TextNode | AtomNode<any>): TextNode | AtomNode<any> | undefined;
|
|
32
|
+
getPreviousTextOrAtom(node: TextNode | AtomNode<any>): TextNode | AtomNode<any> | undefined;
|
|
33
|
+
getAdjacentCaret(caret: Caret, next: boolean): Caret | undefined;
|
|
34
|
+
getFirstCaret(): Caret | undefined;
|
|
35
|
+
getLastCaret(): Caret | undefined;
|
|
36
|
+
getSelection(): CaretRange;
|
|
37
|
+
getIndexOfTextNode(node: TextNode): number | undefined;
|
|
38
|
+
getSelectedText(range: CaretRange): string | undefined;
|
|
39
|
+
withTextIfEmpty(): FormatNode;
|
|
40
|
+
withSegmentPrepended(segment: FormatNodeSegmentType): FormatNode;
|
|
41
|
+
withSegmentAppended(segment: FormatNodeSegmentType): FormatNode;
|
|
42
|
+
withSegmentReplaced(segment: FormatNodeSegmentType, replacement: FormatNodeSegmentType): this | undefined;
|
|
43
|
+
withoutSegment(segment: FormatNodeSegmentType): this | undefined;
|
|
44
|
+
withChildReplaced(node: FormatNodeSegmentType, replacement: FormatNodeSegmentType | undefined): this;
|
|
45
|
+
split(caret: Caret): [FormatNode, FormatNode] | undefined;
|
|
46
|
+
withoutRange(range: CaretRange): FormatNode | undefined;
|
|
47
|
+
withFormat(range: CaretRange, format: Format | undefined): FormatNode | undefined;
|
|
48
|
+
withRangeFormatted(range: CaretRange, format: Format | undefined): Edit;
|
|
49
|
+
getFormats(root: Node): Format[];
|
|
50
|
+
withSegmentAt(segment: FormatNodeSegmentType, caret: Caret): FormatNode | undefined;
|
|
51
|
+
withSegmentAtSelection(range: CaretRange, nodeCreator: (text: string) => FormatNodeSegmentType): Edit;
|
|
52
|
+
withoutContentBefore(caret: Caret): FormatNode | undefined;
|
|
53
|
+
withoutContentAfter(caret: Caret): FormatNode | undefined;
|
|
54
|
+
withContentAt(caret: Caret, before: boolean): FormatNode | undefined;
|
|
55
|
+
withContentInRange(range: CaretRange): this | undefined;
|
|
56
|
+
withSegmentsAppended(format: FormatNode): FormatNode;
|
|
57
|
+
withoutAdjacentContent(caret: Caret, next: boolean): Edit | undefined;
|
|
58
|
+
withoutCharacter(caret: Caret, next: boolean): Edit | undefined;
|
|
59
|
+
withNodeInserted(caret: Caret, node: Node): Edit;
|
|
60
|
+
}
|