bookish-press 0.4.1 → 0.4.3
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 +27 -24
- package/components/Auth.svelte.d.ts +4 -4
- package/components/Authentication.d.ts +2 -2
- package/components/BookPreview.svelte +75 -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 +47 -0
- package/components/app/Feedback.svelte.d.ts +18 -0
- package/components/app/Head.svelte +15 -0
- package/components/app/Head.svelte.d.ts +18 -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 +20 -0
- package/components/app/Paragraph.svelte.d.ts +18 -0
- package/components/app/Section.svelte +12 -0
- package/components/app/Section.svelte.d.ts +27 -0
- package/components/app/Table.svelte +32 -0
- package/components/app/Table.svelte.d.ts +27 -0
- package/components/app/TextInput.svelte +38 -0
- package/components/app/TextInput.svelte.d.ts +22 -0
- package/components/chapter/Atom.svelte +20 -6
- package/components/chapter/Atom.svelte.d.ts +3 -3
- package/components/chapter/Block.svelte +26 -21
- 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 +67 -24
- package/components/chapter/CaptionedCode.svelte.d.ts +4 -4
- package/components/chapter/ChapterBody.svelte +62 -9
- package/components/chapter/ChapterBody.svelte.d.ts +5 -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 +39 -17
- 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 +155 -67
- package/components/chapter/Embed.svelte.d.ts +6 -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 +63 -38
- package/components/chapter/Format.svelte.d.ts +5 -4
- package/components/chapter/InlineCode.svelte +16 -6
- package/components/chapter/InlineCode.svelte.d.ts +4 -4
- package/components/chapter/Label.svelte +38 -9
- package/components/chapter/Label.svelte.d.ts +4 -4
- package/components/chapter/Link.svelte +24 -19
- 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 +79 -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 +373 -244
- package/components/editor/BookishEditor.svelte.d.ts +9 -6
- 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 +82 -0
- package/components/editor/CaretView.svelte.d.ts +25 -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 +4 -3
- package/components/editor/Note.svelte.d.ts +6 -2
- package/components/editor/Permissions.svelte +95 -0
- package/components/editor/Permissions.svelte.d.ts +20 -0
- 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 +191 -144
- package/components/editor/Toolbar.svelte.d.ts +5 -8
- package/components/editor/ToolbarGroup.svelte +17 -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 +35 -24
- package/components/page/Acknowledgements.svelte.d.ts +4 -4
- package/components/page/Authors.svelte +34 -17
- package/components/page/Authors.svelte.d.ts +7 -6
- package/components/page/BookLoader.svelte +59 -0
- package/components/page/BookLoader.svelte.d.ts +16 -0
- package/components/page/BulkReferenceEditor.svelte +54 -23
- package/components/page/BulkReferenceEditor.svelte.d.ts +4 -4
- package/components/page/Chapter.svelte +234 -143
- 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 +42 -22
- package/components/page/Contexts.js +129 -17
- package/components/page/DefinitionView.svelte +129 -90
- package/components/page/DefinitionView.svelte.d.ts +3 -3
- package/components/page/Description.svelte +31 -19
- package/components/page/Description.svelte.d.ts +4 -4
- package/components/page/Edition.svelte +135 -81
- package/components/page/Edition.svelte.d.ts +5 -6
- package/components/page/EditionLoader.svelte +99 -0
- package/components/page/EditionLoader.svelte.d.ts +18 -0
- package/components/page/Editions.svelte +106 -0
- package/components/page/Editions.svelte.d.ts +14 -0
- package/components/page/Glossary.svelte +65 -49
- package/components/page/Glossary.svelte.d.ts +4 -4
- package/components/page/Header.svelte +143 -56
- package/components/page/Header.svelte.d.ts +8 -6
- package/components/page/Index.svelte +116 -80
- package/components/page/Index.svelte.d.ts +4 -4
- package/components/page/Instructions.svelte +18 -17
- package/components/page/Instructions.svelte.d.ts +6 -4
- package/components/page/License.svelte +39 -23
- 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 +81 -53
- 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/Publish.svelte +134 -0
- package/components/page/Publish.svelte.d.ts +14 -0
- package/components/page/Reference.svelte +259 -117
- package/components/page/Reference.svelte.d.ts +5 -5
- package/components/page/References.svelte +45 -48
- 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 +88 -63
- package/components/page/Search.svelte.d.ts +4 -4
- package/components/page/Status.svelte +46 -39
- package/components/page/Status.svelte.d.ts +4 -9
- package/components/page/SubdomainEditor.svelte +41 -27
- package/components/page/SubdomainEditor.svelte.d.ts +4 -4
- package/components/page/TableOfContents.svelte +264 -191
- 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 +97 -34
- package/components/page/TableOfContentsRow.svelte.d.ts +4 -4
- package/components/page/ThemeEditor.svelte +177 -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 +28 -21
- package/components/page/Unknown.svelte.d.ts +4 -4
- package/components/page/margins.js +50 -33
- package/index.d.ts +13 -0
- package/index.js +14 -0
- package/models/CRUD.d.ts +27 -0
- package/models/CRUD.js +262 -0
- package/models/Firebase.d.ts +1 -0
- package/models/Firebase.js +26 -16
- package/models/book/Book.d.ts +40 -39
- package/models/book/Book.js +121 -121
- 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 +50 -39
- package/models/book/Chapter.js +189 -198
- package/models/book/ChapterID.js +7 -7
- package/models/book/Definition.d.ts +1 -1
- package/models/book/Edition.d.ts +87 -61
- package/models/book/Edition.js +460 -309
- package/models/book/Reference.d.ts +24 -0
- package/models/book/Reference.js +78 -0
- package/models/book/Schema.d.ts +168 -0
- package/models/book/Schema.js +115 -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 +27 -27
- package/models/chapter/Parser.js +220 -206
- 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/package.json +108 -26
- 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
- package/models/loadEdition.d.ts +0 -5
- package/models/loadEdition.js +0 -16
|
@@ -1,107 +1,161 @@
|
|
|
1
1
|
<script>import smoothscroll from 'smoothscroll-polyfill';
|
|
2
2
|
import { goto } from '$app/navigation';
|
|
3
|
-
import Status from "./Status.svelte";
|
|
4
3
|
import { onMount, setContext } from 'svelte';
|
|
5
|
-
import { writable } from
|
|
6
|
-
import { BASE,
|
|
4
|
+
import { writable } from 'svelte/store';
|
|
5
|
+
import { BASE, DARK_MODE, } from './Contexts';
|
|
6
|
+
import { BookishTheme } from '../../models/book/Theme';
|
|
7
7
|
// Poly fill smooth scrolling for Safari.
|
|
8
|
-
smoothscroll.polyfill();
|
|
9
|
-
//
|
|
10
|
-
export let
|
|
11
|
-
// When editable changes, update the context.
|
|
12
|
-
$: setContext(EDITABLE, editable);
|
|
8
|
+
onMount(() => smoothscroll.polyfill());
|
|
9
|
+
// The book edition to render.
|
|
10
|
+
export let edition;
|
|
13
11
|
// The base path allows links to adjust to different routing contexts in which a book is placed.
|
|
14
|
-
// For example, when the book is hosted alone, all routes might start with the bare root "/",
|
|
12
|
+
// For example, when the book is hosted alone, all routes might start with the bare root "/",
|
|
15
13
|
// but when the book is being viewed or edited in the Bookish app, it needs a prefix for the
|
|
16
14
|
// route in the app.
|
|
17
|
-
export let base =
|
|
15
|
+
export let base = '/';
|
|
18
16
|
// When the base changes, update the context.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Expose the edition to descendents in a store and update the context when the edition changes.
|
|
23
|
-
let currentEdition = writable(edition);
|
|
24
|
-
setContext(EDITION, currentEdition);
|
|
25
|
-
// Expose the book to descendents in a store and update the context when the edition changes.
|
|
26
|
-
$: setContext(BOOK, edition.getBook());
|
|
27
|
-
// When edition changes, unsubscribe to the previous edition and subscribe to the new one.
|
|
28
|
-
// We use a simple assignment to tell Svelte about the change.
|
|
29
|
-
let editionChanged = () => currentEdition.set(edition);
|
|
30
|
-
$: {
|
|
31
|
-
// Remove the listeners from the old edition
|
|
32
|
-
$currentEdition.removeListener(editionChanged);
|
|
33
|
-
$currentEdition.getBook()?.removeListener(editionChanged);
|
|
34
|
-
// Update the current edition.
|
|
35
|
-
currentEdition.set(edition);
|
|
36
|
-
// Listen to the new edition
|
|
37
|
-
$currentEdition.getBook()?.addListener(editionChanged);
|
|
38
|
-
$currentEdition.addListener(editionChanged);
|
|
39
|
-
}
|
|
40
|
-
// Create a timer that saves the current edition periodically and stops when unmounted.
|
|
41
|
-
onMount(() => {
|
|
42
|
-
const saveListener = setInterval(() => {
|
|
43
|
-
$currentEdition.saveEdits();
|
|
44
|
-
$currentEdition.getBook()?.saveEdits();
|
|
45
|
-
}, 500);
|
|
46
|
-
// On unmount, stop listening.
|
|
47
|
-
return () => clearInterval(saveListener);
|
|
48
|
-
});
|
|
17
|
+
let baseStore = writable(base);
|
|
18
|
+
$: setContext(BASE, baseStore);
|
|
19
|
+
$: baseStore.set(base);
|
|
49
20
|
// Default dark mode to whatever's stored in local storage, if anything.
|
|
50
21
|
// respect user choice on the website despite the system theme
|
|
51
|
-
let darkMode = writable(typeof localStorage !==
|
|
52
|
-
localStorage.getItem(
|
|
53
|
-
|
|
54
|
-
))
|
|
22
|
+
let darkMode = writable(typeof localStorage !== 'undefined' &&
|
|
23
|
+
localStorage.getItem('dark') !== 'false' &&
|
|
24
|
+
(localStorage.getItem('dark') === 'true' || // A previous setting
|
|
25
|
+
window.matchMedia('(prefers-color-scheme: dark)').matches) // Operating system is set to dark
|
|
26
|
+
);
|
|
55
27
|
// Expose dark mode to descendants
|
|
56
28
|
setContext(DARK_MODE, darkMode);
|
|
57
29
|
// When dark mode changes, update the body's class list.
|
|
58
30
|
$: {
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (typeof localStorage !==
|
|
65
|
-
localStorage.setItem(
|
|
31
|
+
if (typeof document !== 'undefined') {
|
|
32
|
+
if ($darkMode)
|
|
33
|
+
document.body.classList.add('dark');
|
|
34
|
+
else
|
|
35
|
+
document.body.classList.remove('dark');
|
|
36
|
+
if (typeof localStorage !== 'undefined')
|
|
37
|
+
localStorage.setItem('dark', $darkMode ? 'true' : 'false');
|
|
38
|
+
// Set the theme, whatever it is, and change it when the edition changes
|
|
39
|
+
setTheme(edition.getTheme() ?? BookishTheme);
|
|
66
40
|
}
|
|
67
41
|
}
|
|
42
|
+
// Set the theme on mount.
|
|
43
|
+
onMount(() => {
|
|
44
|
+
setTheme(edition.getTheme() ?? BookishTheme);
|
|
45
|
+
});
|
|
68
46
|
// Redirect old hash routes by simply replacing their hash before routing.
|
|
69
|
-
if (typeof window !==
|
|
47
|
+
if (typeof window !== 'undefined' && window.location.hash.startsWith('#/'))
|
|
70
48
|
goto(location.hash.replace('#', ''));
|
|
71
|
-
|
|
72
|
-
$: setTheme(edition.getTheme());
|
|
49
|
+
/** Given a theme, sets the appropriate CSS rules in the browser to apply the theme.*/
|
|
73
50
|
function setTheme(theme) {
|
|
74
|
-
// Remove any existing theme.
|
|
75
|
-
document.getElementById("bookish-theme")?.remove();
|
|
76
51
|
// If the theme is being unset, make sure we've removed any overrding style declaration.
|
|
77
52
|
// This let's the default theme kick in.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
53
|
+
let themeTagImports = document.getElementById('bookish-theme-imports');
|
|
54
|
+
let themeTagCSS = document.getElementById('bookish-theme');
|
|
55
|
+
// We only want to set it if it's actually different than what's currently set.
|
|
56
|
+
// Otherwise during editing we get lots of jittery changes on each edit, because the
|
|
57
|
+
// whole edition is rerendering. To check this, we set a data attribute on the style tag containing
|
|
58
|
+
// a stringify of the theme set. We do this separately for the imports, since they can have more
|
|
59
|
+
// major changes than the spacing and color sizes, changing fonts especially.
|
|
60
|
+
const themeTagCSSValue = themeTagCSS?.dataset.css;
|
|
61
|
+
const themeTagImportsValue = themeTagImports?.dataset.imports;
|
|
62
|
+
const newThemeTagCSSValue = JSON.stringify(theme);
|
|
63
|
+
const newThemeTagImportsValue = JSON.stringify(theme?.imports);
|
|
64
|
+
if (theme !== null) {
|
|
65
|
+
// If the imports changed, update theme.
|
|
66
|
+
if (themeTagImportsValue !== newThemeTagImportsValue) {
|
|
67
|
+
// If it's being set, create a new style tag.
|
|
68
|
+
const newThemeImportsTag = document.createElement('style');
|
|
69
|
+
// Give it an ID so we can remove it later.
|
|
70
|
+
newThemeImportsTag.setAttribute('id', 'bookish-theme-imports');
|
|
71
|
+
newThemeImportsTag.dataset.imports = newThemeTagImportsValue;
|
|
72
|
+
// Insert any import statements, then any rules.
|
|
73
|
+
const css = `${(theme.imports ?? [])
|
|
74
|
+
.map((url) => `@import url(${url});`)
|
|
75
|
+
.join('\n')}`;
|
|
76
|
+
newThemeImportsTag.appendChild(document.createTextNode(css));
|
|
77
|
+
document.head.appendChild(newThemeImportsTag);
|
|
78
|
+
// Remove the old tag
|
|
79
|
+
themeTagImports?.remove();
|
|
80
|
+
}
|
|
81
|
+
// If the rules changed, update them.
|
|
82
|
+
if (themeTagCSSValue !== newThemeTagCSSValue) {
|
|
83
|
+
// If it's being set, create a new style tag.
|
|
84
|
+
const newThemeCSSTag = document.createElement('style');
|
|
85
|
+
// Give it an ID so we can remove it later.
|
|
86
|
+
newThemeCSSTag.setAttribute('id', 'bookish-theme');
|
|
87
|
+
newThemeCSSTag.dataset.css = newThemeTagCSSValue;
|
|
88
|
+
// Insert any import statements, then any rules.
|
|
89
|
+
const css = `
|
|
90
|
+
${(theme.imports ?? [])
|
|
91
|
+
.map((url) => `@import url(${url});`)
|
|
92
|
+
.join('\n')}
|
|
93
|
+
.bookish {
|
|
94
|
+
${theme.light ? toRules(theme.light) : ''}
|
|
95
|
+
${theme.fonts ? toRules(theme.fonts) : ''}
|
|
96
|
+
${theme.sizes ? toRules(theme.sizes) : ''}
|
|
97
|
+
${theme.weights ? toRules(theme.weights) : ''}
|
|
98
|
+
${theme.spacing ? toRules(theme.spacing) : ''}
|
|
99
|
+
}
|
|
100
|
+
.dark {
|
|
101
|
+
${theme.dark ? toRules(theme.dark) : ''}
|
|
102
|
+
}`;
|
|
103
|
+
newThemeCSSTag.appendChild(document.createTextNode(css));
|
|
104
|
+
document.head.appendChild(newThemeCSSTag);
|
|
105
|
+
// Remove the old tag
|
|
106
|
+
themeTagCSS?.remove();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Remove the old tags, unsetting the theme.
|
|
111
|
+
themeTagImports?.remove();
|
|
112
|
+
themeTagCSS?.remove();
|
|
113
|
+
}
|
|
95
114
|
}
|
|
96
115
|
function toRules(set) {
|
|
97
|
-
return Object.keys(set)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
116
|
+
return Object.keys(set)
|
|
117
|
+
.map((name) => {
|
|
118
|
+
const value = set[name];
|
|
119
|
+
if (value.length > 0) {
|
|
120
|
+
const cssVariable = '--bookish-' +
|
|
121
|
+
name
|
|
122
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
123
|
+
.split(' ')
|
|
124
|
+
.map((s) => s.toLowerCase())
|
|
125
|
+
.join('-')
|
|
126
|
+
.replace(/([0-9])/g, '-$1-');
|
|
127
|
+
return `${cssVariable}: ${value};`;
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
.join('\n\t\t');
|
|
101
131
|
}
|
|
102
132
|
</script>
|
|
103
133
|
|
|
104
|
-
<
|
|
105
|
-
<slot
|
|
106
|
-
|
|
107
|
-
|
|
134
|
+
<main class="bookish {$darkMode ? ' dark' : ''}">
|
|
135
|
+
<slot />
|
|
136
|
+
</main>
|
|
137
|
+
|
|
138
|
+
<style>
|
|
139
|
+
* {
|
|
140
|
+
box-sizing: border-box;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* WINDOW AND PAGES */
|
|
144
|
+
:global(body) {
|
|
145
|
+
margin: 0;
|
|
146
|
+
padding: 0;
|
|
147
|
+
background-color: var(--bookish-background-color);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* The root container for a book */
|
|
151
|
+
.bookish {
|
|
152
|
+
font-weight: var(--bookish-paragraph-font-weight);
|
|
153
|
+
font-family: var(--bookish-paragraph-font-family);
|
|
154
|
+
font-size: var(--bookish-paragraph-font-size);
|
|
155
|
+
background-color: var(--bookish-background-color);
|
|
156
|
+
color: var(--bookish-paragraph-color);
|
|
157
|
+
width: 100%;
|
|
158
|
+
z-index: 0;
|
|
159
|
+
text-align: left;
|
|
160
|
+
}
|
|
161
|
+
</style>
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type EditionModel from
|
|
2
|
+
import type EditionModel from '../../models/book/Edition';
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
|
-
editable?: boolean | undefined;
|
|
6
|
-
base?: string | undefined;
|
|
7
5
|
edition: EditionModel;
|
|
6
|
+
base?: string | undefined;
|
|
8
7
|
};
|
|
9
8
|
events: {
|
|
10
9
|
[evt: string]: CustomEvent<any>;
|
|
@@ -13,9 +12,9 @@ declare const __propDef: {
|
|
|
13
12
|
default: {};
|
|
14
13
|
};
|
|
15
14
|
};
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
export
|
|
15
|
+
export type EditionProps = typeof __propDef.props;
|
|
16
|
+
export type EditionEvents = typeof __propDef.events;
|
|
17
|
+
export type EditionSlots = typeof __propDef.slots;
|
|
19
18
|
export default class Edition extends SvelteComponentTyped<EditionProps, EditionEvents, EditionSlots> {
|
|
20
19
|
}
|
|
21
20
|
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script>import Loading from './Loading.svelte';
|
|
2
|
+
import Edition from './Edition.svelte';
|
|
3
|
+
import Feedback from '../app/Feedback.svelte';
|
|
4
|
+
import { getBook, getEdition, getUser, CHAPTERTEXT, getChapterText, } from './Contexts';
|
|
5
|
+
import { onDestroy } from 'svelte';
|
|
6
|
+
import { page } from '$app/stores';
|
|
7
|
+
import { listenToChapters, listenToEdition } from '../../models/CRUD';
|
|
8
|
+
export let write;
|
|
9
|
+
let auth = getUser();
|
|
10
|
+
let book = getBook();
|
|
11
|
+
let edition = getEdition();
|
|
12
|
+
let chapterText = getChapterText();
|
|
13
|
+
let editionUnsub = undefined;
|
|
14
|
+
let chaptersUnsub = undefined;
|
|
15
|
+
let error = undefined;
|
|
16
|
+
function unsub() {
|
|
17
|
+
// Unsubscribe to the old edition document if we were listening to one.
|
|
18
|
+
if (editionUnsub)
|
|
19
|
+
editionUnsub();
|
|
20
|
+
if (chaptersUnsub)
|
|
21
|
+
chaptersUnsub();
|
|
22
|
+
}
|
|
23
|
+
function listen() {
|
|
24
|
+
unsub();
|
|
25
|
+
error = undefined;
|
|
26
|
+
// If we no longer have a book, we can't get an edition.
|
|
27
|
+
if ($book === undefined) {
|
|
28
|
+
edition.set(undefined);
|
|
29
|
+
error = 'Unknown book.';
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const editionNumber = $page.params.editionid;
|
|
34
|
+
const latestPublished = !write;
|
|
35
|
+
// Figure out which edition to load.
|
|
36
|
+
let editionID;
|
|
37
|
+
if (editionNumber === undefined) {
|
|
38
|
+
if (latestPublished) {
|
|
39
|
+
editionID = $book.getLatestPublishedEditionID();
|
|
40
|
+
if (editionID === undefined)
|
|
41
|
+
error = 'There is no published edition of this book.';
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
editionID = $book.getLatestEditionID();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
editionID = $book.getEditionNumberID(parseFloat(editionNumber));
|
|
49
|
+
if (editionID === undefined)
|
|
50
|
+
error = `There is no ${editionNumber} edition of this book`;
|
|
51
|
+
}
|
|
52
|
+
// Listen to the doc for changes and listen to all of its chapters.
|
|
53
|
+
if (editionID !== undefined) {
|
|
54
|
+
editionUnsub = listenToEdition($book.ref.id, editionID, (ed) => {
|
|
55
|
+
if (ed) {
|
|
56
|
+
// Before setting the new edition, augmented it with the chapter text.
|
|
57
|
+
edition.set($chapterText
|
|
58
|
+
? ed.withChapterText($chapterText)
|
|
59
|
+
: ed);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
edition.set(undefined);
|
|
63
|
+
error = 'Unable to load edition';
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
chaptersUnsub = listenToChapters($book.ref.id, editionID, (chapters) => {
|
|
67
|
+
// Update the chapter text store.
|
|
68
|
+
chapterText.set(chapters);
|
|
69
|
+
// Update the chapter text in the current edition.
|
|
70
|
+
if ($edition)
|
|
71
|
+
edition.set($edition.withChapterText(chapters));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Whenever the book or page changes, change the listener.
|
|
77
|
+
$: if ($page && $auth && $auth.user !== null)
|
|
78
|
+
listen();
|
|
79
|
+
// When unmounted, unset the stores — no longer viewing a book.
|
|
80
|
+
onDestroy(() => {
|
|
81
|
+
edition.set(undefined);
|
|
82
|
+
unsub();
|
|
83
|
+
});
|
|
84
|
+
</script>
|
|
85
|
+
|
|
86
|
+
{#if $book === undefined || error}
|
|
87
|
+
<Feedback error>Unable to load edition.</Feedback>
|
|
88
|
+
{:else if $edition === undefined}
|
|
89
|
+
<Loading />
|
|
90
|
+
{:else}
|
|
91
|
+
<Edition
|
|
92
|
+
edition={$edition}
|
|
93
|
+
base={write
|
|
94
|
+
? `/write/${$book.getRefID()}/${$edition.getEditionNumber()}/`
|
|
95
|
+
: `/${$book.getSubdomain() ?? $book.getRefID()}/`}
|
|
96
|
+
>
|
|
97
|
+
<slot />
|
|
98
|
+
</Edition>
|
|
99
|
+
{/if}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
write: boolean;
|
|
5
|
+
};
|
|
6
|
+
events: {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
};
|
|
9
|
+
slots: {
|
|
10
|
+
default: {};
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type EditionLoaderProps = typeof __propDef.props;
|
|
14
|
+
export type EditionLoaderEvents = typeof __propDef.events;
|
|
15
|
+
export type EditionLoaderSlots = typeof __propDef.slots;
|
|
16
|
+
export default class EditionLoader extends SvelteComponentTyped<EditionLoaderProps, EditionLoaderEvents, EditionLoaderSlots> {
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script>import { createNewEdition } from '../../models/CRUD';
|
|
2
|
+
import Instructions from './Instructions.svelte';
|
|
3
|
+
import Note from '../editor/Note.svelte';
|
|
4
|
+
import { getUser, getBook, isBookEditable } from './Contexts';
|
|
5
|
+
import Button from '../app/Button.svelte';
|
|
6
|
+
import Link from '../app/Link.svelte';
|
|
7
|
+
import Format from '../chapter/Format.svelte';
|
|
8
|
+
import Parser from '../../models/chapter/Parser';
|
|
9
|
+
import Permissions from '../editor/Permissions.svelte';
|
|
10
|
+
let book = getBook();
|
|
11
|
+
let editable = isBookEditable();
|
|
12
|
+
$: editions = $book?.getEditions();
|
|
13
|
+
$: latestPublishedID = $book?.getLatestPublishedEditionID();
|
|
14
|
+
async function handleDraftEdition() {
|
|
15
|
+
if ($book === undefined)
|
|
16
|
+
return;
|
|
17
|
+
book.set(await createNewEdition($book));
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
{#if $book && editions}
|
|
22
|
+
{#if editable}
|
|
23
|
+
<p>
|
|
24
|
+
<Button tooltip="create new edition" command={handleDraftEdition}
|
|
25
|
+
>+ edition</Button
|
|
26
|
+
>
|
|
27
|
+
</p>
|
|
28
|
+
{/if}
|
|
29
|
+
<Instructions {editable}>
|
|
30
|
+
Each book has one or more editions, allowing you to track revisions and
|
|
31
|
+
ensure previous versions remain available. When you're ready to revise,
|
|
32
|
+
add a new edition here; it will copy the latest edition, which you can
|
|
33
|
+
then edit. When you're ready to publish an edition, write a summary here
|
|
34
|
+
and then publish. By default, readers will see the latest published
|
|
35
|
+
edition, but they can access older editions here.
|
|
36
|
+
</Instructions>
|
|
37
|
+
{#each editions as bookEdition, index (bookEdition.ref)}
|
|
38
|
+
{@const editionNumber =
|
|
39
|
+
editions === undefined ? -1 : editions.length - index}
|
|
40
|
+
{@const editionLabel =
|
|
41
|
+
editionNumber +
|
|
42
|
+
(editionNumber === 1
|
|
43
|
+
? 'st'
|
|
44
|
+
: editionNumber === 2
|
|
45
|
+
? 'nd'
|
|
46
|
+
: editionNumber === 3
|
|
47
|
+
? 'rd'
|
|
48
|
+
: 'th')}
|
|
49
|
+
|
|
50
|
+
{#if $book && (editable || bookEdition.published)}
|
|
51
|
+
<section class="edition">
|
|
52
|
+
<h3
|
|
53
|
+
>{editionLabel}
|
|
54
|
+
<Note
|
|
55
|
+
>{#if bookEdition.published}{new Date(
|
|
56
|
+
bookEdition.published
|
|
57
|
+
).toLocaleDateString(
|
|
58
|
+
'en-us'
|
|
59
|
+
)}{:else}unpublished{/if}
|
|
60
|
+
|
|
61
|
+
<Link
|
|
62
|
+
to={latestPublishedID === bookEdition.ref.id &&
|
|
63
|
+
$book.getSubdomain() !== undefined
|
|
64
|
+
? `/${$book.getSubdomain()}`
|
|
65
|
+
: `/${$book.ref.id}/${editions.length - index}`}
|
|
66
|
+
>read</Link
|
|
67
|
+
>
|
|
68
|
+
{#if editable}
|
|
69
|
+
|
|
70
|
+
<Link
|
|
71
|
+
to={`/write/${$book.ref.id}/${
|
|
72
|
+
editions.length - index
|
|
73
|
+
}`}>edit</Link
|
|
74
|
+
>
|
|
75
|
+
{/if}
|
|
76
|
+
</Note>
|
|
77
|
+
</h3>
|
|
78
|
+
<p
|
|
79
|
+
>{#if bookEdition.summary !== ''}<Format
|
|
80
|
+
node={Parser.parseFormat(
|
|
81
|
+
undefined,
|
|
82
|
+
bookEdition.summary
|
|
83
|
+
)}
|
|
84
|
+
/>{:else}&mdash{/if}</p
|
|
85
|
+
>
|
|
86
|
+
</section>
|
|
87
|
+
{/if}
|
|
88
|
+
{/each}
|
|
89
|
+
|
|
90
|
+
{#if editable}
|
|
91
|
+
<h2>Editors</h2>
|
|
92
|
+
<Instructions {editable}>
|
|
93
|
+
These authors can edit any aspect of the book and any of its
|
|
94
|
+
editions.
|
|
95
|
+
</Instructions>
|
|
96
|
+
|
|
97
|
+
<Permissions
|
|
98
|
+
uids={$book.uids}
|
|
99
|
+
inheriteduids={[]}
|
|
100
|
+
atleastone={true}
|
|
101
|
+
writable={editable}
|
|
102
|
+
change={(uids) =>
|
|
103
|
+
$book ? book.set($book.withEditors(uids)) : undefined}
|
|
104
|
+
/>
|
|
105
|
+
{/if}
|
|
106
|
+
{/if}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: Record<string, never>;
|
|
4
|
+
events: {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
};
|
|
7
|
+
slots: {};
|
|
8
|
+
};
|
|
9
|
+
export type EditionsProps = typeof __propDef.props;
|
|
10
|
+
export type EditionsEvents = typeof __propDef.events;
|
|
11
|
+
export type EditionsSlots = typeof __propDef.slots;
|
|
12
|
+
export default class Editions extends SvelteComponentTyped<EditionsProps, EditionsEvents, EditionsSlots> {
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -1,61 +1,77 @@
|
|
|
1
|
-
<script>import Header from
|
|
1
|
+
<script>import Header from './Header.svelte';
|
|
2
2
|
import Outline from './Outline.svelte';
|
|
3
3
|
import Page from './Page.svelte';
|
|
4
4
|
import ChapterIDs from '../../models/book/ChapterID';
|
|
5
|
-
import DefinitionView from
|
|
6
|
-
import { getEdition,
|
|
7
|
-
import Instructions from
|
|
5
|
+
import DefinitionView from './DefinitionView.svelte';
|
|
6
|
+
import { getUser, getEdition, isEditionEditable } from './Contexts';
|
|
7
|
+
import Instructions from './Instructions.svelte';
|
|
8
|
+
import Button from '../app/Button.svelte';
|
|
9
|
+
let auth = getUser();
|
|
8
10
|
let edition = getEdition();
|
|
9
|
-
let editable =
|
|
10
|
-
$: glossary = $edition
|
|
11
|
+
let editable = isEditionEditable();
|
|
12
|
+
$: glossary = $edition?.getGlossary() ?? {};
|
|
11
13
|
// Sort by canonical phrases
|
|
12
|
-
$: keys =
|
|
14
|
+
$: keys =
|
|
15
|
+
$edition === undefined
|
|
16
|
+
? []
|
|
17
|
+
: glossary === undefined || Object.keys(glossary).length === 0
|
|
18
|
+
? null
|
|
19
|
+
: Object.keys(glossary).sort((a, b) => glossary[a].phrase.localeCompare(glossary[b].phrase));
|
|
13
20
|
function addEmptyDefinition() {
|
|
21
|
+
if ($edition === undefined)
|
|
22
|
+
return;
|
|
14
23
|
// Generate an ID.
|
|
15
|
-
const letters =
|
|
16
|
-
let id =
|
|
24
|
+
const letters = 'abcdefghijklmnopqrstuvwxyz'.split('');
|
|
25
|
+
let id = '';
|
|
17
26
|
while (id.length < 4 || $edition.hasDefinition(id))
|
|
18
27
|
id = id + letters[Math.round(Math.random() * 26)];
|
|
19
|
-
$edition.
|
|
28
|
+
edition.set($edition.withDefinition(id, '', '', []));
|
|
20
29
|
}
|
|
21
30
|
</script>
|
|
22
31
|
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
32
|
+
{#if $edition}
|
|
33
|
+
<Page title={`${$edition.getTitle()} - Glossary`}>
|
|
34
|
+
<Header
|
|
35
|
+
editable={isEditionEditable() ||
|
|
36
|
+
($auth !== undefined &&
|
|
37
|
+
$auth.user !== null &&
|
|
38
|
+
$edition.isChapterEditor($auth.user.uid))}
|
|
39
|
+
label="Glossary title"
|
|
40
|
+
id="glossary"
|
|
41
|
+
getImage={() => $edition?.getImage(ChapterIDs.GlossaryID) ?? null}
|
|
42
|
+
setImage={(embed) =>
|
|
43
|
+
$edition
|
|
44
|
+
? edition.set(
|
|
45
|
+
$edition.withImage(ChapterIDs.GlossaryID, embed)
|
|
46
|
+
)
|
|
47
|
+
: undefined}
|
|
48
|
+
header="Glossary"
|
|
49
|
+
tags={$edition.getTags()}
|
|
50
|
+
>
|
|
51
|
+
<Outline
|
|
52
|
+
slot="outline"
|
|
53
|
+
previous={$edition.getPreviousChapterID(ChapterIDs.GlossaryID)}
|
|
54
|
+
next={$edition.getNextChapterID(ChapterIDs.GlossaryID)}
|
|
55
|
+
/>
|
|
56
|
+
</Header>
|
|
57
|
+
{#if editable}
|
|
58
|
+
<Instructions {editable}>
|
|
59
|
+
Build a glossary here, adding terms, phrases, definitions, and
|
|
60
|
+
synonyms. Then, in a chapter, you can select any text and link
|
|
61
|
+
it to a definition.
|
|
62
|
+
</Instructions>
|
|
63
|
+
<Button tooltip="add glossary entry" command={addEmptyDefinition}
|
|
64
|
+
>+ definition</Button
|
|
65
|
+
>
|
|
66
|
+
{/if}
|
|
67
|
+
{#if keys === null}
|
|
68
|
+
<p>This book has no glossary.</p>
|
|
69
|
+
{:else}
|
|
70
|
+
<dl>
|
|
71
|
+
{#each keys as id (id)}
|
|
72
|
+
<DefinitionView {id} definition={glossary[id]} />
|
|
73
|
+
{/each}
|
|
74
|
+
</dl>
|
|
75
|
+
{/if}
|
|
76
|
+
</Page>
|
|
77
|
+
{/if}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
declare const __propDef: {
|
|
3
|
-
props:
|
|
3
|
+
props: Record<string, never>;
|
|
4
4
|
events: {
|
|
5
5
|
[evt: string]: CustomEvent<any>;
|
|
6
6
|
};
|
|
7
7
|
slots: {};
|
|
8
8
|
};
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
9
|
+
export type GlossaryProps = typeof __propDef.props;
|
|
10
|
+
export type GlossaryEvents = typeof __propDef.events;
|
|
11
|
+
export type GlossarySlots = typeof __propDef.slots;
|
|
12
12
|
export default class Glossary extends SvelteComponentTyped<GlossaryProps, GlossaryEvents, GlossarySlots> {
|
|
13
13
|
}
|
|
14
14
|
export {};
|