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.
Files changed (309) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/components/Auth.svelte +52 -0
  4. package/components/Auth.svelte.d.ts +16 -0
  5. package/components/Authentication.d.ts +8 -0
  6. package/components/Authentication.js +1 -0
  7. package/components/BookPreview.svelte +87 -0
  8. package/components/BookPreview.svelte.d.ts +18 -0
  9. package/components/External.svelte +4 -0
  10. package/components/External.svelte.d.ts +18 -0
  11. package/components/Link.svelte +5 -0
  12. package/components/Link.svelte.d.ts +19 -0
  13. package/components/chapter/Atom.svelte +36 -0
  14. package/components/chapter/Atom.svelte.d.ts +19 -0
  15. package/components/chapter/Block.svelte +32 -0
  16. package/components/chapter/Block.svelte.d.ts +17 -0
  17. package/components/chapter/Callout.svelte +10 -0
  18. package/components/chapter/Callout.svelte.d.ts +17 -0
  19. package/components/chapter/CaptionedCode.svelte +34 -0
  20. package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
  21. package/components/chapter/ChapterBody.svelte +23 -0
  22. package/components/chapter/ChapterBody.svelte.d.ts +18 -0
  23. package/components/chapter/Citations.svelte +66 -0
  24. package/components/chapter/Citations.svelte.d.ts +17 -0
  25. package/components/chapter/Code.svelte +35 -0
  26. package/components/chapter/Code.svelte.d.ts +22 -0
  27. package/components/chapter/Comment.svelte +46 -0
  28. package/components/chapter/Comment.svelte.d.ts +17 -0
  29. package/components/chapter/Definition.svelte +38 -0
  30. package/components/chapter/Definition.svelte.d.ts +20 -0
  31. package/components/chapter/Embed.svelte +122 -0
  32. package/components/chapter/Embed.svelte.d.ts +18 -0
  33. package/components/chapter/ErrorMessage.svelte +4 -0
  34. package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
  35. package/components/chapter/Footnote.svelte +37 -0
  36. package/components/chapter/Footnote.svelte.d.ts +19 -0
  37. package/components/chapter/Format.svelte +57 -0
  38. package/components/chapter/Format.svelte.d.ts +18 -0
  39. package/components/chapter/InlineCode.svelte +12 -0
  40. package/components/chapter/InlineCode.svelte.d.ts +17 -0
  41. package/components/chapter/Label.svelte +20 -0
  42. package/components/chapter/Label.svelte.d.ts +17 -0
  43. package/components/chapter/Link.svelte +51 -0
  44. package/components/chapter/Link.svelte.d.ts +17 -0
  45. package/components/chapter/List.svelte +14 -0
  46. package/components/chapter/List.svelte.d.ts +17 -0
  47. package/components/chapter/Marginal.svelte +48 -0
  48. package/components/chapter/Marginal.svelte.d.ts +19 -0
  49. package/components/chapter/Paragraph.svelte +15 -0
  50. package/components/chapter/Paragraph.svelte.d.ts +18 -0
  51. package/components/chapter/Python.svelte +81 -0
  52. package/components/chapter/Python.svelte.d.ts +18 -0
  53. package/components/chapter/Quote.svelte +16 -0
  54. package/components/chapter/Quote.svelte.d.ts +17 -0
  55. package/components/chapter/Rule.svelte +4 -0
  56. package/components/chapter/Rule.svelte.d.ts +17 -0
  57. package/components/chapter/Table.svelte +29 -0
  58. package/components/chapter/Table.svelte.d.ts +17 -0
  59. package/components/chapter/Text.svelte +62 -0
  60. package/components/chapter/Text.svelte.d.ts +17 -0
  61. package/components/chapter/renderPosition.d.ts +3 -0
  62. package/components/chapter/renderPosition.js +4 -0
  63. package/components/editor/BookishEditor.svelte +755 -0
  64. package/components/editor/BookishEditor.svelte.d.ts +22 -0
  65. package/components/editor/CalloutEditor.svelte +10 -0
  66. package/components/editor/CalloutEditor.svelte.d.ts +17 -0
  67. package/components/editor/CaptionedCodeEditor.svelte +22 -0
  68. package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
  69. package/components/editor/CaretContext.d.ts +18 -0
  70. package/components/editor/CaretContext.js +1 -0
  71. package/components/editor/CaretState.d.ts +47 -0
  72. package/components/editor/CaretState.js +1 -0
  73. package/components/editor/CaretUtilities.d.ts +5 -0
  74. package/components/editor/CaretUtilities.js +1 -0
  75. package/components/editor/CitationsEditor.svelte +42 -0
  76. package/components/editor/CitationsEditor.svelte.d.ts +17 -0
  77. package/components/editor/Clipboard.d.ts +3 -0
  78. package/components/editor/Clipboard.js +1 -0
  79. package/components/editor/Command.d.ts +18 -0
  80. package/components/editor/Command.js +1 -0
  81. package/components/editor/Commands.d.ts +3 -0
  82. package/components/editor/Commands.js +951 -0
  83. package/components/editor/ConfirmButton.svelte +43 -0
  84. package/components/editor/ConfirmButton.svelte.d.ts +18 -0
  85. package/components/editor/DefinitionEditor.svelte +28 -0
  86. package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
  87. package/components/editor/EmbedEditor.svelte +87 -0
  88. package/components/editor/EmbedEditor.svelte.d.ts +17 -0
  89. package/components/editor/ImageChooser.svelte +70 -0
  90. package/components/editor/ImageChooser.svelte.d.ts +18 -0
  91. package/components/editor/InlineCodeEditor.svelte +9 -0
  92. package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
  93. package/components/editor/LabelEditor.svelte +23 -0
  94. package/components/editor/LabelEditor.svelte.d.ts +17 -0
  95. package/components/editor/LanguageEditor.svelte +11 -0
  96. package/components/editor/LanguageEditor.svelte.d.ts +17 -0
  97. package/components/editor/LinkEditor.svelte +75 -0
  98. package/components/editor/LinkEditor.svelte.d.ts +17 -0
  99. package/components/editor/Note.svelte +9 -0
  100. package/components/editor/Note.svelte.d.ts +23 -0
  101. package/components/editor/PositionEditor.svelte +14 -0
  102. package/components/editor/PositionEditor.svelte.d.ts +18 -0
  103. package/components/editor/QuoteEditor.svelte +5 -0
  104. package/components/editor/QuoteEditor.svelte.d.ts +17 -0
  105. package/components/editor/Switch.svelte +56 -0
  106. package/components/editor/Switch.svelte.d.ts +20 -0
  107. package/components/editor/TextEditor.svelte +193 -0
  108. package/components/editor/TextEditor.svelte.d.ts +23 -0
  109. package/components/editor/Toggle.svelte +38 -0
  110. package/components/editor/Toggle.svelte.d.ts +19 -0
  111. package/components/editor/Toolbar.svelte +202 -0
  112. package/components/editor/Toolbar.svelte.d.ts +20 -0
  113. package/components/editor/ToolbarGroup.svelte +41 -0
  114. package/components/editor/ToolbarGroup.svelte.d.ts +19 -0
  115. package/components/editor/ToolbarIcon.svelte +22 -0
  116. package/components/editor/ToolbarIcon.svelte.d.ts +16 -0
  117. package/components/editor/ToolbarSpacer.svelte +1 -0
  118. package/components/editor/ToolbarSpacer.svelte.d.ts +19 -0
  119. package/components/editor/URLEditor.svelte +15 -0
  120. package/components/editor/URLEditor.svelte.d.ts +18 -0
  121. package/components/editor/UndoState.d.ts +8 -0
  122. package/components/editor/UndoState.js +1 -0
  123. package/components/page/Acknowledgements.svelte +29 -0
  124. package/components/page/Acknowledgements.svelte.d.ts +14 -0
  125. package/components/page/Alert.svelte +11 -0
  126. package/components/page/Alert.svelte.d.ts +23 -0
  127. package/components/page/Authors.svelte +62 -0
  128. package/components/page/Authors.svelte.d.ts +20 -0
  129. package/components/page/BulkReferenceEditor.svelte +32 -0
  130. package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
  131. package/components/page/Chapter.svelte +301 -0
  132. package/components/page/Chapter.svelte.d.ts +18 -0
  133. package/components/page/ChapterContext.d.ts +10 -0
  134. package/components/page/ChapterContext.js +1 -0
  135. package/components/page/Contexts.d.ts +27 -0
  136. package/components/page/Contexts.js +21 -0
  137. package/components/page/DefinitionView.svelte +129 -0
  138. package/components/page/DefinitionView.svelte.d.ts +18 -0
  139. package/components/page/Description.svelte +22 -0
  140. package/components/page/Description.svelte.d.ts +14 -0
  141. package/components/page/Edition.svelte +106 -0
  142. package/components/page/Edition.svelte.d.ts +21 -0
  143. package/components/page/Glossary.svelte +61 -0
  144. package/components/page/Glossary.svelte.d.ts +14 -0
  145. package/components/page/Header.svelte +105 -0
  146. package/components/page/Header.svelte.d.ts +27 -0
  147. package/components/page/Index.svelte +117 -0
  148. package/components/page/Index.svelte.d.ts +14 -0
  149. package/components/page/Instructions.svelte +30 -0
  150. package/components/page/Instructions.svelte.d.ts +16 -0
  151. package/components/page/License.svelte +29 -0
  152. package/components/page/License.svelte.d.ts +14 -0
  153. package/components/page/Loading.svelte +13 -0
  154. package/components/page/Loading.svelte.d.ts +19 -0
  155. package/components/page/Media.svelte +76 -0
  156. package/components/page/Media.svelte.d.ts +14 -0
  157. package/components/page/MediaPreview.svelte +11 -0
  158. package/components/page/MediaPreview.svelte.d.ts +19 -0
  159. package/components/page/Outline.svelte +173 -0
  160. package/components/page/Outline.svelte.d.ts +19 -0
  161. package/components/page/Page.svelte +53 -0
  162. package/components/page/Page.svelte.d.ts +19 -0
  163. package/components/page/PossibleChapter.svelte +14 -0
  164. package/components/page/PossibleChapter.svelte.d.ts +14 -0
  165. package/components/page/PossibleReference.svelte +16 -0
  166. package/components/page/PossibleReference.svelte.d.ts +19 -0
  167. package/components/page/Print.svelte +8 -0
  168. package/components/page/Print.svelte.d.ts +14 -0
  169. package/components/page/Reference.svelte +145 -0
  170. package/components/page/Reference.svelte.d.ts +17 -0
  171. package/components/page/References.svelte +58 -0
  172. package/components/page/References.svelte.d.ts +14 -0
  173. package/components/page/Revisions.svelte +124 -0
  174. package/components/page/Revisions.svelte.d.ts +14 -0
  175. package/components/page/Search.svelte +108 -0
  176. package/components/page/Search.svelte.d.ts +14 -0
  177. package/components/page/Status.svelte +49 -0
  178. package/components/page/Status.svelte.d.ts +19 -0
  179. package/components/page/SubdomainEditor.svelte +30 -0
  180. package/components/page/SubdomainEditor.svelte.d.ts +14 -0
  181. package/components/page/TableOfContents.svelte +234 -0
  182. package/components/page/TableOfContents.svelte.d.ts +14 -0
  183. package/components/page/TableOfContentsImage.svelte +15 -0
  184. package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
  185. package/components/page/TableOfContentsRow.svelte +57 -0
  186. package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
  187. package/components/page/ThemeEditor.svelte +52 -0
  188. package/components/page/ThemeEditor.svelte.d.ts +14 -0
  189. package/components/page/ThemeEditorPreview.svelte +37 -0
  190. package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
  191. package/components/page/ThemeSetEditor.svelte +17 -0
  192. package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
  193. package/components/page/ThemeVariableEditor.svelte +28 -0
  194. package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
  195. package/components/page/Unknown.svelte +29 -0
  196. package/components/page/Unknown.svelte.d.ts +16 -0
  197. package/components/page/margins.d.ts +2 -0
  198. package/components/page/margins.js +132 -0
  199. package/models/BookLoader.d.ts +2 -0
  200. package/models/BookLoader.js +67 -0
  201. package/models/Firebase.d.ts +4 -0
  202. package/models/Firebase.js +26 -0
  203. package/models/Firestore.d.ts +22 -0
  204. package/models/Firestore.js +194 -0
  205. package/models/book/Book.d.ts +60 -0
  206. package/models/book/Book.js +135 -0
  207. package/models/book/BookMedia.d.ts +23 -0
  208. package/models/book/BookMedia.js +102 -0
  209. package/models/book/Chapter.d.ts +70 -0
  210. package/models/book/Chapter.js +221 -0
  211. package/models/book/ChapterID.d.ts +10 -0
  212. package/models/book/ChapterID.js +10 -0
  213. package/models/book/Definition.d.ts +6 -0
  214. package/models/book/Definition.js +1 -0
  215. package/models/book/Edition.d.ts +111 -0
  216. package/models/book/Edition.js +466 -0
  217. package/models/book/Theme.d.ts +106 -0
  218. package/models/book/Theme.js +76 -0
  219. package/models/book/ThemeColors.d.ts +15 -0
  220. package/models/book/ThemeColors.js +1 -0
  221. package/models/chapter/AtomNode.d.ts +18 -0
  222. package/models/chapter/AtomNode.js +31 -0
  223. package/models/chapter/BlockNode.d.ts +21 -0
  224. package/models/chapter/BlockNode.js +117 -0
  225. package/models/chapter/BlocksNode.d.ts +50 -0
  226. package/models/chapter/BlocksNode.js +709 -0
  227. package/models/chapter/BlocksNode.test.d.ts +1 -0
  228. package/models/chapter/BlocksNode.test.js +302 -0
  229. package/models/chapter/Bookkeeping.d.ts +4 -0
  230. package/models/chapter/Bookkeeping.js +1 -0
  231. package/models/chapter/CalloutNode.d.ts +17 -0
  232. package/models/chapter/CalloutNode.js +36 -0
  233. package/models/chapter/Caret.d.ts +21 -0
  234. package/models/chapter/Caret.js +69 -0
  235. package/models/chapter/ChapterNode.d.ts +34 -0
  236. package/models/chapter/ChapterNode.js +80 -0
  237. package/models/chapter/CitationsNode.d.ts +16 -0
  238. package/models/chapter/CitationsNode.js +17 -0
  239. package/models/chapter/CodeNode.d.ts +30 -0
  240. package/models/chapter/CodeNode.js +64 -0
  241. package/models/chapter/CommentNode.d.ts +18 -0
  242. package/models/chapter/CommentNode.js +32 -0
  243. package/models/chapter/DefinitionNode.d.ts +12 -0
  244. package/models/chapter/DefinitionNode.js +20 -0
  245. package/models/chapter/Edit.d.ts +7 -0
  246. package/models/chapter/Edit.js +1 -0
  247. package/models/chapter/EmbedNode.d.ts +40 -0
  248. package/models/chapter/EmbedNode.js +89 -0
  249. package/models/chapter/ErrorNode.d.ts +17 -0
  250. package/models/chapter/ErrorNode.js +21 -0
  251. package/models/chapter/FootnoteNode.d.ts +18 -0
  252. package/models/chapter/FootnoteNode.js +29 -0
  253. package/models/chapter/FormatNode.d.ts +60 -0
  254. package/models/chapter/FormatNode.js +614 -0
  255. package/models/chapter/FormatNode.test.d.ts +1 -0
  256. package/models/chapter/FormatNode.test.js +54 -0
  257. package/models/chapter/InlineCodeNode.d.ts +12 -0
  258. package/models/chapter/InlineCodeNode.js +18 -0
  259. package/models/chapter/LabelNode.d.ts +17 -0
  260. package/models/chapter/LabelNode.js +22 -0
  261. package/models/chapter/LinkNode.d.ts +12 -0
  262. package/models/chapter/LinkNode.js +16 -0
  263. package/models/chapter/ListNode.d.ts +51 -0
  264. package/models/chapter/ListNode.js +370 -0
  265. package/models/chapter/ListNode.test.d.ts +1 -0
  266. package/models/chapter/ListNode.test.js +49 -0
  267. package/models/chapter/MetadataNode.d.ts +17 -0
  268. package/models/chapter/MetadataNode.js +24 -0
  269. package/models/chapter/Node.d.ts +36 -0
  270. package/models/chapter/Node.js +173 -0
  271. package/models/chapter/Node.test.d.ts +1 -0
  272. package/models/chapter/Node.test.js +27 -0
  273. package/models/chapter/ParagraphNode.d.ts +33 -0
  274. package/models/chapter/ParagraphNode.js +93 -0
  275. package/models/chapter/ParagraphNode.test.d.ts +1 -0
  276. package/models/chapter/ParagraphNode.test.js +21 -0
  277. package/models/chapter/Parser.d.ts +75 -0
  278. package/models/chapter/Parser.js +824 -0
  279. package/models/chapter/Parser.test.d.ts +1 -0
  280. package/models/chapter/Parser.test.js +25 -0
  281. package/models/chapter/Position.d.ts +2 -0
  282. package/models/chapter/Position.js +1 -0
  283. package/models/chapter/QuoteNode.d.ts +25 -0
  284. package/models/chapter/QuoteNode.js +61 -0
  285. package/models/chapter/ReferenceNode.d.ts +29 -0
  286. package/models/chapter/ReferenceNode.js +48 -0
  287. package/models/chapter/RootNode.d.ts +5 -0
  288. package/models/chapter/RootNode.js +1 -0
  289. package/models/chapter/RuleNode.d.ts +15 -0
  290. package/models/chapter/RuleNode.js +16 -0
  291. package/models/chapter/TableNode.d.ts +35 -0
  292. package/models/chapter/TableNode.js +176 -0
  293. package/models/chapter/TableNode.test.d.ts +1 -0
  294. package/models/chapter/TableNode.test.js +31 -0
  295. package/models/chapter/TextNode.d.ts +36 -0
  296. package/models/chapter/TextNode.js +136 -0
  297. package/models/chapter/TextNode.test.d.ts +1 -0
  298. package/models/chapter/TextNode.test.js +6 -0
  299. package/models/loadEdition.d.ts +5 -0
  300. package/models/loadEdition.js +16 -0
  301. package/package.json +189 -0
  302. package/util/getSubdomain.d.ts +3 -0
  303. package/util/getSubdomain.js +22 -0
  304. package/util/isMobile.d.ts +2 -0
  305. package/util/isMobile.js +6 -0
  306. package/util/mineReference.d.ts +3 -0
  307. package/util/mineReference.js +62 -0
  308. package/util/scrollToEyeLevel.d.ts +2 -0
  309. package/util/scrollToEyeLevel.js +5 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Amy J. Ko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Bookish
2
+ Bookish is a simple framework and platforem for publishing online books. I originally created it to make it easier to maintain the many online books on my website (amyjko.com), while adding more sophisticated features to support reading. I'm slowly evolving it to be a simple free online service for authoring and reading online books.
3
+
4
+ ## Project Status
5
+ This is very much an alpha that I use for my own book publishing. I have aspirations to make it usable for others in the future. Expect slow progress while I sneak in programming time on evenings and weekends. You can see where I'm headed by reading the issues and Backend project, which are somewhat organized.
@@ -0,0 +1,52 @@
1
+ <script>import { sendSignInLinkToEmail } from "firebase/auth";
2
+ import { onMount, setContext } from "svelte";
3
+ import { writable } from "svelte/store";
4
+ import { auth } from "../models/Firebase";
5
+ import { AUTH } from "./page/Contexts";
6
+ // Track the user and user loading status in state
7
+ let loading = true;
8
+ // The store that tracks the auth context.
9
+ const authentication = writable({ user: null, loading: loading, login, logout, });
10
+ // Login using Firebase's password-less email verification
11
+ async function login(email) {
12
+ // If connected to firebase...
13
+ if (auth) {
14
+ const actionCodeSettings = {
15
+ url: location.origin + "/finishlogin",
16
+ handleCodeInApp: true
17
+ };
18
+ // Ask Firebase to log in with the given email
19
+ await sendSignInLinkToEmail(auth, email, actionCodeSettings);
20
+ // Remember the email in local storage so we don't have to ask for it again
21
+ // after returning to the link above.
22
+ window.localStorage.setItem("email", email);
23
+ }
24
+ }
25
+ function updateAuth(user) {
26
+ authentication.set({ user, loading: loading, login, logout, });
27
+ }
28
+ // Logout using Firebase's authentication framework.
29
+ function logout() {
30
+ if (auth) {
31
+ return auth.signOut().then(() => updateAuth(null));
32
+ }
33
+ }
34
+ // On mount, subscribe to authentication changes.
35
+ onMount(() => {
36
+ if (auth) {
37
+ const unsubscribe = auth.onAuthStateChanged(user => {
38
+ loading = false;
39
+ updateAuth(user);
40
+ });
41
+ // On unmount, stop subscribing.
42
+ return unsubscribe;
43
+ }
44
+ });
45
+ // Expose the state and the login/logout functionality.
46
+ setContext(AUTH, authentication);
47
+ </script>
48
+
49
+ <!-- Wrap whatever children are given in this context. -->
50
+ {#if loading === false }
51
+ <slot></slot>
52
+ {/if}
@@ -0,0 +1,16 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {
8
+ default: {};
9
+ };
10
+ };
11
+ export declare type AuthProps = typeof __propDef.props;
12
+ export declare type AuthEvents = typeof __propDef.events;
13
+ export declare type AuthSlots = typeof __propDef.slots;
14
+ export default class Auth extends SvelteComponentTyped<AuthProps, AuthEvents, AuthSlots> {
15
+ }
16
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { User } from "firebase/auth";
2
+ declare type Authentication = {
3
+ user: User | null;
4
+ loading: boolean;
5
+ login: Function;
6
+ logout: Function;
7
+ };
8
+ export default Authentication;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,87 @@
1
+ <script>import EmbedNode from "../models/chapter/EmbedNode";
2
+ import Parser from "../models/chapter/Parser";
3
+ import ErrorNode from "../models/chapter/ErrorNode";
4
+ import ChapterBody from "./chapter/ChapterBody.svelte";
5
+ import Embed from "./chapter/Embed.svelte";
6
+ import ErrorMessage from "./chapter/ErrorMessage.svelte";
7
+ import Link from "./Link.svelte";
8
+ export let book;
9
+ export let write;
10
+ $: refID = book.getRefID();
11
+ $: cover = book.getCover();
12
+ $: authors = book.getAuthors();
13
+ $: description = book.getDescription();
14
+ $: subdomain = book.getSubdomain();
15
+ $: title = book.getTitle() === "" ? "Untitled" : book.getTitle();
16
+ $: embed = cover === null ? null : Parser.parseEmbed(undefined, cover);
17
+ </script>
18
+
19
+ <div class="bookish-app-book-preview">
20
+ <div class={`bookish-app-book-preview-cover ${cover === null ? "bookish-app-book-preview-nocover" : ""}`}>
21
+ {#if embed instanceof EmbedNode }
22
+ <Embed node={embed}/>
23
+ {:else if embed instanceof ErrorNode }
24
+ <ErrorMessage node={embed}/>
25
+ {/if}
26
+ </div>
27
+ <div class="bookish-app-book-preview-title">
28
+ {#if subdomain === undefined || write }
29
+ <Link to={refID === undefined ? "" : (write ? "/write/" : "/") + refID}>{title}</Link>
30
+ {:else}
31
+ <Link to={`/${subdomain}`}>{title}</Link>
32
+ {/if}
33
+ </div>
34
+ <div class="bookish-app-book-preview-authors">
35
+ {#each authors as author, index}
36
+ <span>{author}{#if index !== authors.length - 1},&nbsp;{/if}</span>
37
+ {:else}
38
+ <em>No authors</em>
39
+ {/each}
40
+ </div>
41
+ <div class="bookish-app-book-preview-description">
42
+ {#if description.length === 0}
43
+ <em>No description</em>
44
+ {:else}
45
+ <ChapterBody node={Parser.parseChapter(undefined, description)}/>
46
+ {/if}
47
+ </div>
48
+ </div>
49
+
50
+ <style>
51
+ .bookish-app-book-preview {
52
+ display: flex;
53
+ width: 100%;
54
+ border: var(--bookish-app-chrome-border-width) solid var(--bookish-app-chrome-border-color);
55
+ padding: var(--bookish-app-chrome-padding);
56
+ border-radius: var(--bookish-app-chrome-roundedness);
57
+ text-align: left;
58
+ }
59
+
60
+ .bookish-app-book-preview-cover {
61
+ width: 5em;
62
+ height: auto;
63
+ margin-right: var(--bookish-app-chrome-padding);
64
+ }
65
+
66
+ .bookish-app-book-preview-cover.bookish-app-book-preview-nocover {
67
+ background-color: var(--bookish-app-chrome-muted);
68
+ height: 5em;
69
+ }
70
+
71
+ .bookish-app-book-preview-title {
72
+ flex: 1;
73
+ margin-right: var(--bookish-app-chrome-padding);
74
+ }
75
+
76
+ .bookish-app-book-preview-authors {
77
+ flex: 1;
78
+ margin-right: var(--bookish-app-chrome-padding);
79
+ }
80
+
81
+ .bookish-app-book-preview-description {
82
+ flex: 2;
83
+ overflow: hidden;
84
+ max-height: 10em;
85
+ }
86
+
87
+ </style>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type Book from "../models/book/Book";
3
+ declare const __propDef: {
4
+ props: {
5
+ book: Book;
6
+ write: boolean;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type BookPreviewProps = typeof __propDef.props;
14
+ export declare type BookPreviewEvents = typeof __propDef.events;
15
+ export declare type BookPreviewSlots = typeof __propDef.slots;
16
+ export default class BookPreview extends SvelteComponentTyped<BookPreviewProps, BookPreviewEvents, BookPreviewSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,4 @@
1
+ <script>export let to;
2
+ </script>
3
+
4
+ <a href={to} target="_blank" rel="noreferrer"><slot></slot></a>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ to: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {
10
+ default: {};
11
+ };
12
+ };
13
+ export declare type ExternalProps = typeof __propDef.props;
14
+ export declare type ExternalEvents = typeof __propDef.events;
15
+ export declare type ExternalSlots = typeof __propDef.slots;
16
+ export default class External extends SvelteComponentTyped<ExternalProps, ExternalEvents, ExternalSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,5 @@
1
+ <script>export let to;
2
+ export let before = undefined;
3
+ </script>
4
+
5
+ <a href={to} on:click={() => before ? before() : undefined }><slot></slot></a>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ to: string;
5
+ before?: Function | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export declare type LinkProps = typeof __propDef.props;
15
+ export declare type LinkEvents = typeof __propDef.events;
16
+ export declare type LinkSlots = typeof __propDef.slots;
17
+ export default class Link extends SvelteComponentTyped<LinkProps, LinkEvents, LinkSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,36 @@
1
+ <script>import { getCaret } from '../page/Contexts';
2
+ export let node;
3
+ let caret = getCaret();
4
+ // Is the caret on this link?
5
+ $: selected = $caret && $caret.range && $caret.range.start.node === node;
6
+ function handleMouseDown() {
7
+ // Select this so that the view stays focused.
8
+ $caret?.setCaret({ start: { node: node, index: 0 }, end: { node: node, index: 0 } });
9
+ }
10
+ </script>
11
+
12
+ <!-- Prevent the editor from receiving the click. -->
13
+ <span class={`bookish-editor-atom ${selected ? "bookish-editor-atom-selected" : ""} ${$caret?.focused ? "bookish-editor-atom-selected-focused" : ""}`} on:mousedown|stopPropagation|preventDefault={handleMouseDown}><slot></slot></span>
14
+
15
+ <style>
16
+ .bookish-editor-atom {
17
+ cursor: pointer;
18
+ }
19
+
20
+ .bookish-editor-atom-selected {
21
+ border-radius: 2px;
22
+ outline-style: solid;
23
+ outline-color: var(--bookish-paragraph-color);
24
+ outline-offset: 2px;
25
+ }
26
+
27
+ .bookish-editor-atom-selected-focused {
28
+ animation: 1s atom-selected infinite;
29
+ }
30
+
31
+ @keyframes atom-selected {
32
+ from, to { outline-width: 2px; }
33
+ 50% { outline-width: 4px; }
34
+ }
35
+
36
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type AtomNode from '../../models/chapter/AtomNode';
3
+ declare const __propDef: {
4
+ props: {
5
+ node: AtomNode<any>;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export declare type AtomProps = typeof __propDef.props;
15
+ export declare type AtomEvents = typeof __propDef.events;
16
+ export declare type AtomSlots = typeof __propDef.slots;
17
+ export default class Atom extends SvelteComponentTyped<AtomProps, AtomEvents, AtomSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,32 @@
1
+ <script>import CalloutNode from "../../models/chapter/CalloutNode";
2
+ import CodeNode from "../../models/chapter/CodeNode";
3
+ import EmbedNode from "../../models/chapter/EmbedNode";
4
+ import ErrorNode from "../../models/chapter/ErrorNode";
5
+ import ListNode from "../../models/chapter/ListNode";
6
+ import ParagraphNode from "../../models/chapter/ParagraphNode";
7
+ import QuoteNode from "../../models/chapter/QuoteNode";
8
+ import RuleNode from "../../models/chapter/RuleNode";
9
+ import TableNode from "../../models/chapter/TableNode";
10
+ import Callout from "./Callout.svelte";
11
+ import CaptionedCode from "./CaptionedCode.svelte";
12
+ import Embed from "./Embed.svelte";
13
+ import ErrorMessage from "./ErrorMessage.svelte";
14
+ import List from "./List.svelte";
15
+ import Paragraph from "./Paragraph.svelte";
16
+ import Quote from "./Quote.svelte";
17
+ import Rule from "./Rule.svelte";
18
+ import Table from "./Table.svelte";
19
+ export let node;
20
+ </script>
21
+
22
+ {#if node instanceof ParagraphNode}<Paragraph {node} />
23
+ {:else if node instanceof ListNode}<List {node} />
24
+ {:else if node instanceof EmbedNode}<Embed {node} />
25
+ {:else if node instanceof CalloutNode}<Callout {node} />
26
+ {:else if node instanceof QuoteNode}<Quote {node} />
27
+ {:else if node instanceof CodeNode}<CaptionedCode {node} />
28
+ {:else if node instanceof ErrorNode}<ErrorMessage {node} />
29
+ {:else if node instanceof RuleNode}<Rule {node} />
30
+ {:else if node instanceof TableNode}<Table {node} />
31
+ {:else}<p class="bookish-error">Unknown node type</p>
32
+ {/if}
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type BlockNode from "../../models/chapter/BlockNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: BlockNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type BlockProps = typeof __propDef.props;
13
+ export declare type BlockEvents = typeof __propDef.events;
14
+ export declare type BlockSlots = typeof __propDef.slots;
15
+ export default class Block extends SvelteComponentTyped<BlockProps, BlockEvents, BlockSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,10 @@
1
+ <script>import Block from "./Block.svelte";
2
+ import renderPosition from "./renderPosition";
3
+ export let node;
4
+ </script>
5
+
6
+ <div class={"bookish-callout " + renderPosition(node.getPosition())} data-nodeid={node.nodeID}>
7
+ {#each node.getBlocks() as element }
8
+ <Block node={element} />
9
+ {/each}
10
+ </div>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type CalloutNode from "../../models/chapter/CalloutNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: CalloutNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type CalloutProps = typeof __propDef.props;
13
+ export declare type CalloutEvents = typeof __propDef.events;
14
+ export declare type CalloutSlots = typeof __propDef.slots;
15
+ export default class Callout extends SvelteComponentTyped<CalloutProps, CalloutEvents, CalloutSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,34 @@
1
+ <script>import Code from './Code.svelte';
2
+ import Python from './Python.svelte';
3
+ import Format from './Format.svelte';
4
+ import Text from './Text.svelte';
5
+ import renderPosition from './renderPosition';
6
+ import { isEditable } from "../page/Contexts";
7
+ export let node;
8
+ $: caption = node.getCaption();
9
+ $: language = node.getLanguage();
10
+ let editable = isEditable();
11
+ // const languages = [ "C", "C++", "CSS", "Go", "HTML", "Java", "JavaScript", "Markdown", "Plaintext", "Python", "TypeScript" ];
12
+ </script>
13
+
14
+ <div class={"bookish-figure " + renderPosition(node.getPosition())} data-nodeid={node.nodeID}>
15
+ {#if editable }
16
+ <code
17
+ class={`bookish-code bookish-code-block language-${language}`}
18
+ >
19
+ <Text node={node.getCodeNode()}/>
20
+ </code>
21
+ {:else}
22
+ {#if node.getLanguage() === "python" && node.isExecutable() }
23
+ <Python node={node} startCode={node.getCode()}></Python>
24
+ {:else}
25
+ <div>
26
+ <Code editable={false} inline={false} language={node.getLanguage()} nodeID={node.getCodeNode().nodeID}>{node.getCode()}</Code>
27
+ {#if node.getLanguage() !== "plaintext"}<div class="bookish-code-language">{node.getLanguage()}</div>{/if}
28
+ </div>
29
+ {/if}
30
+ {/if}
31
+ {#if caption }
32
+ <div class="bookish-figure-caption"><Format node={caption} placeholder="caption"/></div>
33
+ {/if}
34
+ </div>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type CodeNode from "../../models/chapter/CodeNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: CodeNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type CaptionedCodeProps = typeof __propDef.props;
13
+ export declare type CaptionedCodeEvents = typeof __propDef.events;
14
+ export declare type CaptionedCodeSlots = typeof __propDef.slots;
15
+ export default class CaptionedCode extends SvelteComponentTyped<CaptionedCodeProps, CaptionedCodeEvents, CaptionedCodeSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,23 @@
1
+ <script>import ParagraphNode from '../../models/chapter/ParagraphNode';
2
+ import Block from "./Block.svelte";
3
+ import Paragraph from './Paragraph.svelte';
4
+ export let node;
5
+ export let placeholder = "";
6
+ $: errors = node.getErrors();
7
+ $: blocks = node.getBlocks();
8
+ </script>
9
+
10
+ <div class="bookish-chapter-body" data-nodeid={node.nodeID}>
11
+ {#if errors.length > 0 }
12
+ <p>
13
+ <span class="bookish-error">{errors.length + " " + (errors.length > 1 ? "errors" : "error")} below</span>
14
+ </p>
15
+ {/if}
16
+ {#if blocks.length === 1 && blocks[0] instanceof ParagraphNode && blocks[0].getFormat().isEmptyText() }
17
+ <Paragraph node={blocks[0]} placeholder={placeholder} />
18
+ {:else}
19
+ {#each node.getBlocks() as block }
20
+ <Block node={block} />
21
+ {/each}
22
+ {/if}
23
+ </div>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type ChapterNode from "../../models/chapter/ChapterNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: ChapterNode;
6
+ placeholder?: string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type ChapterBodyProps = typeof __propDef.props;
14
+ export declare type ChapterBodyEvents = typeof __propDef.events;
15
+ export declare type ChapterBodySlots = typeof __propDef.slots;
16
+ export default class ChapterBody extends SvelteComponentTyped<ChapterBodyProps, ChapterBodyEvents, ChapterBodySlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,66 @@
1
+ <script>import Marginal from './Marginal.svelte';
2
+ import Parser from '../../models/chapter/Parser';
3
+ import Atom from './Atom.svelte';
4
+ import { getChapter, getEdition } from '../page/Contexts';
5
+ import PossibleReference from '../page/PossibleReference.svelte';
6
+ import { afterUpdate } from 'svelte';
7
+ export let node;
8
+ let chapter = getChapter();
9
+ let edition = getEdition();
10
+ $: chapterNode = $chapter?.chapter.getAST();
11
+ // Sort citations numerically, however they're numbered.
12
+ $: citations = node.getMeta().sort((a, b) => {
13
+ if (chapterNode === undefined)
14
+ return 0;
15
+ let aNumber = chapterNode.getCitationNumber(a);
16
+ let bNumber = chapterNode.getCitationNumber(b);
17
+ if (aNumber === null) {
18
+ if (bNumber === null)
19
+ return 0;
20
+ else
21
+ return 1;
22
+ }
23
+ else {
24
+ if (bNumber === null)
25
+ return -1;
26
+ else
27
+ return aNumber - bNumber;
28
+ }
29
+ });
30
+ // Position the marginals on every render.
31
+ afterUpdate(() => $chapter?.layoutMarginals());
32
+ </script>
33
+
34
+ <Atom {node}>
35
+ {#if chapterNode }
36
+ <span class="bookish-citation" data-nodeid={node.nodeID}>
37
+ <Marginal id={"citation-" + citations.join("-")}>
38
+ <svelte:fragment slot="interactor">
39
+ {#each citations as citationID, index}
40
+ {@const citationNumber = chapterNode?.getCitationNumber(citationID) }
41
+ {#if citationNumber && citationID in $edition.getReferences()}
42
+ <sup class="bookish-citation-symbol">{citationNumber}</sup>
43
+ {:else}
44
+ <span class="bookish-error">Unknown reference: <code>{citationID}</code></span>
45
+ {/if}
46
+ {#if citations.length > 1 && index < citations.length - 1 }<sup>,</sup>{/if}
47
+ {:else}
48
+ <sup class="bookish-citation-symbol">{"\u2014"}</sup>
49
+ {/each}
50
+ </svelte:fragment>
51
+ <span slot="content" class="bookish-references">
52
+ {#each citations as citationID }
53
+ {@const citationNumber = chapterNode?.getCitationNumber(citationID) }
54
+ {@const ref = $edition.getReference(citationID) }
55
+ {#if citationNumber && ref }
56
+ <span class="bookish-reference">
57
+ <sup class="bookish-citation-symbol">{citationNumber}</sup>
58
+ <PossibleReference node={Parser.parseReference(citationID, ref, $edition, true)}/>
59
+ </span>
60
+ {/if}
61
+ {/each}
62
+ </span>
63
+ </Marginal>
64
+ </span>
65
+ {/if}
66
+ </Atom>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type CitationsNode from "../../models/chapter/CitationsNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: CitationsNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type CitationsProps = typeof __propDef.props;
13
+ export declare type CitationsEvents = typeof __propDef.events;
14
+ export declare type CitationsSlots = typeof __propDef.slots;
15
+ export default class Citations extends SvelteComponentTyped<CitationsProps, CitationsEvents, CitationsSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,35 @@
1
+ <script>import hljs from 'highlight.js';
2
+ import { onMount } from 'svelte';
3
+ // Suppress unescaped HTML warning, trusting the escaping of the parser.
4
+ hljs.configure({ ignoreUnescapedHTML: true });
5
+ export let editable;
6
+ export let inline;
7
+ export let nodeID;
8
+ export let edited = undefined;
9
+ export let language = undefined;
10
+ let el = null;
11
+ // Find any code tags inside and highlight them.
12
+ function highlightCode() {
13
+ if (el)
14
+ hljs.highlightElement(el);
15
+ }
16
+ // When the component mounts or updates, highlight the code inside.
17
+ onMount(() => {
18
+ highlightCode();
19
+ });
20
+ function handleChange() {
21
+ if (el && edited)
22
+ edited(el.innerText);
23
+ }
24
+ // There's no way to mute highlightjs warnings on missing languages, so we check here.
25
+ $: lang = language ? (hljs.getLanguage(language) === undefined ? "text" : language) : "plaintext";
26
+ </script>
27
+
28
+ <code
29
+ data-nodeid={nodeID}
30
+ contenteditable={editable}
31
+ class={`bookish-code ${inline ? "bookish-code-inline" : "bookish-code-block"} ${"language-" + lang}`}
32
+ on:blur={handleChange}
33
+ bind:this={el}>
34
+ <slot></slot>
35
+ </code>
@@ -0,0 +1,22 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ editable: boolean;
5
+ inline: boolean;
6
+ nodeID: number | undefined;
7
+ edited?: ((text: string) => void) | undefined;
8
+ language?: string | undefined;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {
14
+ default: {};
15
+ };
16
+ };
17
+ export declare type CodeProps = typeof __propDef.props;
18
+ export declare type CodeEvents = typeof __propDef.events;
19
+ export declare type CodeSlots = typeof __propDef.slots;
20
+ export default class Code extends SvelteComponentTyped<CodeProps, CodeEvents, CodeSlots> {
21
+ }
22
+ export {};