bookish-press 0.4.46 → 0.4.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.env.example +8 -0
  2. package/.firebaserc +8 -0
  3. package/.prettierignore +8 -0
  4. package/.prettierrc.json +5 -0
  5. package/_update-notifier-last-checked +0 -0
  6. package/firebase.json +46 -0
  7. package/firestore.indexes.json +4 -0
  8. package/firestore.rules +59 -0
  9. package/functions/.eslintrc.js +28 -0
  10. package/functions/package-lock.json +12595 -0
  11. package/functions/package.json +43 -0
  12. package/functions/src/index.ts +345 -0
  13. package/functions/tsconfig.dev.json +3 -0
  14. package/functions/tsconfig.json +15 -0
  15. package/package.json +53 -270
  16. package/scripts/claims.cjs +99 -0
  17. package/src/app.d.ts +9 -0
  18. package/src/app.html +24 -0
  19. package/src/lib/components/Auth.svelte +65 -0
  20. package/{components/Authentication.d.ts → src/lib/components/Authentication.ts} +2 -0
  21. package/{components → src/lib/components}/BookPreview.svelte +27 -22
  22. package/{components → src/lib/components}/External.svelte +2 -1
  23. package/src/lib/components/Link.svelte +58 -0
  24. package/{components → src/lib/components}/app/BookList.svelte +6 -3
  25. package/{components → src/lib/components}/app/Button.svelte +5 -4
  26. package/{components → src/lib/components}/app/Feedback.svelte +11 -7
  27. package/{components → src/lib/components}/app/Head.svelte +2 -1
  28. package/{components → src/lib/components}/app/Large.svelte +0 -0
  29. package/{components → src/lib/components}/app/Lead.svelte +0 -0
  30. package/{components → src/lib/components}/app/Link.svelte +4 -3
  31. package/{components → src/lib/components}/app/Options.svelte +5 -4
  32. package/{components → src/lib/components}/app/Paragraph.svelte +2 -1
  33. package/{components → src/lib/components}/app/Section.svelte +0 -0
  34. package/{components → src/lib/components}/app/Table.svelte +0 -0
  35. package/{components → src/lib/components}/app/TextInput.svelte +12 -9
  36. package/{components → src/lib/components}/chapter/Atom.svelte +18 -12
  37. package/src/lib/components/chapter/Block.svelte +42 -0
  38. package/{components → src/lib/components}/chapter/Callout.svelte +6 -3
  39. package/{components → src/lib/components}/chapter/CaptionedCode.svelte +21 -13
  40. package/{components → src/lib/components}/chapter/ChapterBody.svelte +13 -9
  41. package/{components → src/lib/components}/chapter/Citations.svelte +34 -33
  42. package/{components → src/lib/components}/chapter/Code.svelte +63 -59
  43. package/{components → src/lib/components}/chapter/Comment.svelte +30 -18
  44. package/{components → src/lib/components}/chapter/Definition.svelte +23 -17
  45. package/{components → src/lib/components}/chapter/Embed.svelte +97 -77
  46. package/src/lib/components/chapter/ErrorMessage.svelte +12 -0
  47. package/{components → src/lib/components}/chapter/ExtendedPrism.js +0 -0
  48. package/{components → src/lib/components}/chapter/Figure.svelte +34 -26
  49. package/{components → src/lib/components}/chapter/Footnote.svelte +32 -20
  50. package/{components → src/lib/components}/chapter/Format.svelte +39 -34
  51. package/{components → src/lib/components}/chapter/InlineCode.svelte +9 -5
  52. package/{components → src/lib/components}/chapter/Label.svelte +23 -14
  53. package/{components → src/lib/components}/chapter/Link.svelte +27 -21
  54. package/{components → src/lib/components}/chapter/List.svelte +5 -3
  55. package/{components → src/lib/components}/chapter/Marginal.svelte +54 -41
  56. package/{components → src/lib/components}/chapter/Paragraph.svelte +25 -20
  57. package/{components → src/lib/components}/chapter/Positioned.svelte +4 -1
  58. package/{components → src/lib/components}/chapter/Problem.svelte +0 -0
  59. package/src/lib/components/chapter/Python.svelte +144 -0
  60. package/{components → src/lib/components}/chapter/Quote.svelte +9 -5
  61. package/{components → src/lib/components}/chapter/Rule.svelte +4 -1
  62. package/{components → src/lib/components}/chapter/Table.svelte +11 -7
  63. package/src/lib/components/chapter/Text.svelte +109 -0
  64. package/src/lib/components/editor/BookishEditor.svelte +1101 -0
  65. package/src/lib/components/editor/CalloutEditor.svelte +14 -0
  66. package/{components → src/lib/components}/editor/CaptionedCodeEditor.svelte +10 -6
  67. package/src/lib/components/editor/CaretContext.ts +55 -0
  68. package/{components/editor/CaretState.d.ts → src/lib/components/editor/CaretState.ts} +6 -7
  69. package/{components/editor/CaretUtilities.d.ts → src/lib/components/editor/CaretUtilities.ts} +1 -0
  70. package/{components → src/lib/components}/editor/CaretView.svelte +25 -20
  71. package/src/lib/components/editor/CitationsEditor.svelte +64 -0
  72. package/{components/editor/Clipboard.d.ts → src/lib/components/editor/Clipboard.ts} +2 -1
  73. package/{components/editor/Command.d.ts → src/lib/components/editor/Command.ts} +8 -2
  74. package/{components/editor/Commands.js → src/lib/components/editor/Commands.ts} +730 -315
  75. package/src/lib/components/editor/ConfirmButton.svelte +51 -0
  76. package/src/lib/components/editor/DefinitionEditor.svelte +44 -0
  77. package/src/lib/components/editor/EmbedEditor.svelte +152 -0
  78. package/{components → src/lib/components}/editor/Icon.svelte +2 -1
  79. package/{components → src/lib/components}/editor/ImageChooser.svelte +24 -19
  80. package/src/lib/components/editor/InlineCodeEditor.svelte +16 -0
  81. package/{components → src/lib/components}/editor/LabelEditor.svelte +14 -9
  82. package/{components → src/lib/components}/editor/LanguageEditor.svelte +8 -5
  83. package/src/lib/components/editor/LinkEditor.svelte +110 -0
  84. package/{components → src/lib/components}/editor/Note.svelte +0 -0
  85. package/{components → src/lib/components}/editor/Permissions.svelte +43 -36
  86. package/src/lib/components/editor/PositionEditor.svelte +21 -0
  87. package/src/lib/components/editor/QuoteEditor.svelte +14 -0
  88. package/{components → src/lib/components}/editor/Switch.svelte +14 -11
  89. package/src/lib/components/editor/TableEditor.svelte +14 -0
  90. package/{components → src/lib/components}/editor/TextEditor.svelte +101 -89
  91. package/src/lib/components/editor/Toggle.svelte +47 -0
  92. package/src/lib/components/editor/Toolbar.svelte +297 -0
  93. package/{components → src/lib/components}/editor/ToolbarGroup.svelte +5 -3
  94. package/{components → src/lib/components}/editor/ToolbarSpacer.svelte +0 -0
  95. package/src/lib/components/editor/URLEditor.svelte +15 -0
  96. package/{components/editor/UndoState.d.ts → src/lib/components/editor/UndoState.ts} +3 -2
  97. package/{components → src/lib/components}/editor/icons/annotate.svg +0 -0
  98. package/{components → src/lib/components}/editor/icons/block.svg +0 -0
  99. package/{components → src/lib/components}/editor/icons/bold.svg +0 -0
  100. package/{components → src/lib/components}/editor/icons/bullets.svg +0 -0
  101. package/{components → src/lib/components}/editor/icons/callout.svg +0 -0
  102. package/{components → src/lib/components}/editor/icons/citation.svg +0 -0
  103. package/{components → src/lib/components}/editor/icons/clear.svg +0 -0
  104. package/{components → src/lib/components}/editor/icons/clipboard.svg +0 -0
  105. package/{components → src/lib/components}/editor/icons/code.svg +0 -0
  106. package/{components → src/lib/components}/editor/icons/columnafter.svg +0 -0
  107. package/{components → src/lib/components}/editor/icons/columnbefore.svg +0 -0
  108. package/{components → src/lib/components}/editor/icons/comment.svg +0 -0
  109. package/{components → src/lib/components}/editor/icons/copy.svg +0 -0
  110. package/{components → src/lib/components}/editor/icons/cut.svg +0 -0
  111. package/{components → src/lib/components}/editor/icons/define.svg +0 -0
  112. package/{components → src/lib/components}/editor/icons/deletecolumn.svg +0 -0
  113. package/{components → src/lib/components}/editor/icons/deleterow.svg +0 -0
  114. package/{components → src/lib/components}/editor/icons/footnote.svg +0 -0
  115. package/{components → src/lib/components}/editor/icons/header1.svg +0 -0
  116. package/{components → src/lib/components}/editor/icons/header2.svg +0 -0
  117. package/{components → src/lib/components}/editor/icons/header3.svg +0 -0
  118. package/{components → src/lib/components}/editor/icons/home.svg +0 -0
  119. package/{components → src/lib/components}/editor/icons/indent.svg +0 -0
  120. package/{components → src/lib/components}/editor/icons/italic.svg +0 -0
  121. package/{components → src/lib/components}/editor/icons/label.svg +0 -0
  122. package/{components → src/lib/components}/editor/icons/left.svg +0 -0
  123. package/{components → src/lib/components}/editor/icons/level.svg +0 -0
  124. package/{components → src/lib/components}/editor/icons/link.svg +0 -0
  125. package/{components → src/lib/components}/editor/icons/list.svg +0 -0
  126. package/{components → src/lib/components}/editor/icons/media.svg +0 -0
  127. package/{components → src/lib/components}/editor/icons/middle.svg +0 -0
  128. package/{components → src/lib/components}/editor/icons/numbers.svg +0 -0
  129. package/{components → src/lib/components}/editor/icons/paragraph.svg +0 -0
  130. package/{components → src/lib/components}/editor/icons/paste.svg +0 -0
  131. package/{components → src/lib/components}/editor/icons/quote.svg +0 -0
  132. package/{components → src/lib/components}/editor/icons/redo.svg +0 -0
  133. package/{components → src/lib/components}/editor/icons/right.svg +0 -0
  134. package/{components → src/lib/components}/editor/icons/rowabove.svg +0 -0
  135. package/{components → src/lib/components}/editor/icons/rowbelow.svg +0 -0
  136. package/{components → src/lib/components}/editor/icons/rule.svg +0 -0
  137. package/{components → src/lib/components}/editor/icons/sub.svg +0 -0
  138. package/{components → src/lib/components}/editor/icons/super.svg +0 -0
  139. package/{components → src/lib/components}/editor/icons/table.svg +0 -0
  140. package/{components → src/lib/components}/editor/icons/text.svg +0 -0
  141. package/{components → src/lib/components}/editor/icons/time.svg +0 -0
  142. package/{components → src/lib/components}/editor/icons/undo.svg +0 -0
  143. package/{components → src/lib/components}/editor/icons/unindent.svg +0 -0
  144. package/{components → src/lib/components}/editor/icons/unlink.svg +0 -0
  145. package/{components → src/lib/components}/page/Acknowledgements.svelte +19 -10
  146. package/src/lib/components/page/Authors.svelte +92 -0
  147. package/src/lib/components/page/BookLoader.svelte +77 -0
  148. package/src/lib/components/page/BulkReferenceEditor.svelte +86 -0
  149. package/src/lib/components/page/Chapter.svelte +449 -0
  150. package/src/lib/components/page/ChapterContext.ts +13 -0
  151. package/{components → src/lib/components}/page/ChapterNumber.svelte +0 -0
  152. package/{components → src/lib/components}/page/ChapterTitle.svelte +4 -2
  153. package/src/lib/components/page/Contexts.ts +176 -0
  154. package/{components → src/lib/components}/page/DefinitionView.svelte +52 -37
  155. package/{components → src/lib/components}/page/Description.svelte +15 -7
  156. package/src/lib/components/page/Edition.svelte +189 -0
  157. package/src/lib/components/page/EditionLoader.svelte +123 -0
  158. package/{components → src/lib/components}/page/Editions.svelte +22 -18
  159. package/{components → src/lib/components}/page/Glossary.svelte +33 -28
  160. package/{components → src/lib/components}/page/Header.svelte +59 -52
  161. package/{components → src/lib/components}/page/Index.svelte +48 -41
  162. package/{components → src/lib/components}/page/Instructions.svelte +2 -1
  163. package/{components → src/lib/components}/page/License.svelte +17 -9
  164. package/{components → src/lib/components}/page/Loading.svelte +0 -0
  165. package/{components → src/lib/components}/page/Media.svelte +44 -27
  166. package/{components → src/lib/components}/page/MediaPreview.svelte +3 -2
  167. package/{components → src/lib/components}/page/Muted.svelte +0 -0
  168. package/{components → src/lib/components}/page/Outline.svelte +140 -110
  169. package/src/lib/components/page/Page.svelte +94 -0
  170. package/{components → src/lib/components}/page/PageHeader.svelte +2 -1
  171. package/{components → src/lib/components}/page/PageParagraph.svelte +0 -0
  172. package/src/lib/components/page/PossibleChapter.svelte +16 -0
  173. package/src/lib/components/page/PossibleReference.svelte +14 -0
  174. package/{components → src/lib/components}/page/Print.svelte +5 -3
  175. package/{components → src/lib/components}/page/Publish.svelte +59 -52
  176. package/{components → src/lib/components}/page/Reference.svelte +39 -30
  177. package/{components → src/lib/components}/page/References.svelte +18 -14
  178. package/{components → src/lib/components}/page/Rows.svelte +0 -0
  179. package/src/lib/components/page/Search.svelte +153 -0
  180. package/{components → src/lib/components}/page/Status.svelte +5 -3
  181. package/{components → src/lib/components}/page/SubdomainEditor.svelte +16 -13
  182. package/{components → src/lib/components}/page/TableOfContents.svelte +79 -68
  183. package/src/lib/components/page/TableOfContentsImage.svelte +22 -0
  184. package/{components → src/lib/components}/page/TableOfContentsRow.svelte +34 -24
  185. package/{components → src/lib/components}/page/ThemeEditor.svelte +44 -33
  186. package/{components → src/lib/components}/page/ThemeEditorPreview.svelte +21 -12
  187. package/src/lib/components/page/ThemeSetEditor.svelte +21 -0
  188. package/{components → src/lib/components}/page/ThemeVariableEditor.svelte +18 -14
  189. package/{components → src/lib/components}/page/Title.svelte +0 -0
  190. package/{components → src/lib/components}/page/Unknown.svelte +10 -8
  191. package/{components/page/margins.js → src/lib/components/page/margins.ts} +79 -46
  192. package/{index.js → src/lib/index.js} +0 -0
  193. package/src/lib/models/CRUD.ts +469 -0
  194. package/{models/Firebase.js → src/lib/models/Firebase.ts} +26 -16
  195. package/src/lib/models/book/Book.ts +283 -0
  196. package/src/lib/models/book/BookMedia.ts +182 -0
  197. package/src/lib/models/book/BookSaveStatus.ts +8 -0
  198. package/src/lib/models/book/Chapter.ts +462 -0
  199. package/{models/book/ChapterID.js → src/lib/models/book/ChapterID.ts} +1 -0
  200. package/src/lib/models/book/Definition.ts +2 -0
  201. package/src/lib/models/book/Edition.ts +1216 -0
  202. package/src/lib/models/book/Reference.ts +171 -0
  203. package/{models/book/Schema.js → src/lib/models/book/Schema.ts} +1 -0
  204. package/{models/book/Theme.js → src/lib/models/book/Theme.ts} +110 -6
  205. package/{models/book/ThemeColors.d.ts → src/lib/models/book/ThemeColors.ts} +6 -0
  206. package/{models/book/Words.js → src/lib/models/book/Words.ts} +1 -0
  207. package/{models/chapter/AtomNode.js → src/lib/models/chapter/AtomNode.ts} +30 -10
  208. package/{models/chapter/BlockNode.js → src/lib/models/chapter/BlockNode.ts} +80 -47
  209. package/src/lib/models/chapter/BlocksNode.test.ts +867 -0
  210. package/{models/chapter/BlocksNode.js → src/lib/models/chapter/BlocksNode.ts} +571 -359
  211. package/{models/chapter/Bookkeeping.d.ts → src/lib/models/chapter/Bookkeeping.ts} +0 -0
  212. package/src/lib/models/chapter/CalloutNode.ts +79 -0
  213. package/{models/chapter/Caret.js → src/lib/models/chapter/Caret.ts} +50 -26
  214. package/src/lib/models/chapter/ChapterNode.ts +169 -0
  215. package/{models/chapter/CitationsNode.js → src/lib/models/chapter/CitationsNode.ts} +17 -10
  216. package/{models/chapter/CodeNode.js → src/lib/models/chapter/CodeNode.ts} +125 -62
  217. package/src/lib/models/chapter/CommentNode.ts +61 -0
  218. package/{models/chapter/DefinitionNode.js → src/lib/models/chapter/DefinitionNode.ts} +14 -8
  219. package/src/lib/models/chapter/Edit.ts +6 -0
  220. package/src/lib/models/chapter/EmbedNode.ts +257 -0
  221. package/{models/chapter/ErrorNode.js → src/lib/models/chapter/ErrorNode.ts} +15 -8
  222. package/src/lib/models/chapter/FootnoteNode.ts +59 -0
  223. package/src/lib/models/chapter/FormatNode.test.ts +137 -0
  224. package/{models/chapter/FormatNode.js → src/lib/models/chapter/FormatNode.ts} +443 -262
  225. package/{models/chapter/InlineCodeNode.js → src/lib/models/chapter/InlineCodeNode.ts} +17 -9
  226. package/{models/chapter/LabelNode.js → src/lib/models/chapter/LabelNode.ts} +26 -10
  227. package/{models/chapter/LinkNode.js → src/lib/models/chapter/LinkNode.ts} +12 -7
  228. package/{models/chapter/ListNode.test.js → src/lib/models/chapter/ListNode.test.ts} +57 -20
  229. package/{models/chapter/ListNode.js → src/lib/models/chapter/ListNode.ts} +277 -200
  230. package/src/lib/models/chapter/MetadataNode.ts +44 -0
  231. package/{models → src/lib/models}/chapter/Node.test.js +0 -0
  232. package/{models/chapter/Node.js → src/lib/models/chapter/Node.ts} +155 -71
  233. package/src/lib/models/chapter/ParagraphNode.test.ts +54 -0
  234. package/{models/chapter/ParagraphNode.js → src/lib/models/chapter/ParagraphNode.ts} +95 -58
  235. package/{models/chapter/Parser.test.js → src/lib/models/chapter/Parser.test.ts} +7 -0
  236. package/{models/chapter/Parser.js → src/lib/models/chapter/Parser.ts} +369 -184
  237. package/{models/chapter/Position.d.ts → src/lib/models/chapter/Position.ts} +0 -0
  238. package/src/lib/models/chapter/QuoteNode.ts +135 -0
  239. package/{models/chapter/RootNode.d.ts → src/lib/models/chapter/RootNode.ts} +2 -0
  240. package/{models/chapter/RuleNode.js → src/lib/models/chapter/RuleNode.ts} +9 -6
  241. package/{models/chapter/TableNode.test.js → src/lib/models/chapter/TableNode.test.ts} +27 -10
  242. package/{models/chapter/TableNode.js → src/lib/models/chapter/TableNode.ts} +141 -82
  243. package/{models/chapter/TextNode.test.js → src/lib/models/chapter/TextNode.test.ts} +2 -0
  244. package/{models/chapter/TextNode.js → src/lib/models/chapter/TextNode.ts} +117 -65
  245. package/{util/getSubdomain.js → src/lib/util/getSubdomain.ts} +14 -8
  246. package/{util/isMobile.js → src/lib/util/isMobile.ts} +1 -0
  247. package/{util/mineReference.js → src/lib/util/mineReference.ts} +45 -25
  248. package/{util/scrollToEyeLevel.js → src/lib/util/scrollToEyeLevel.ts} +4 -2
  249. package/src/params/edition.ts +3 -0
  250. package/src/routes/+error.svelte +12 -0
  251. package/src/routes/+layout.svelte +241 -0
  252. package/src/routes/+page.svelte +43 -0
  253. package/src/routes/Footer.svelte +0 -0
  254. package/src/routes/Header.svelte +112 -0
  255. package/src/routes/[bookid]/+layout.svelte +5 -0
  256. package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +14 -0
  257. package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
  258. package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
  259. package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
  260. package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
  261. package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
  262. package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
  263. package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
  264. package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
  265. package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
  266. package/src/routes/[bookid]/editions/+page.svelte +20 -0
  267. package/src/routes/about/+page.svelte +102 -0
  268. package/src/routes/confirm/+page.svelte +62 -0
  269. package/src/routes/email/+page.svelte +99 -0
  270. package/src/routes/login/+page.svelte +66 -0
  271. package/src/routes/read/+page.svelte +38 -0
  272. package/src/routes/write/+error.svelte +10 -0
  273. package/src/routes/write/+layout.svelte +11 -0
  274. package/src/routes/write/+page.svelte +114 -0
  275. package/src/routes/write/[bookid]/+layout.svelte +5 -0
  276. package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
  277. package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
  278. package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
  279. package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
  280. package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
  281. package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
  282. package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
  283. package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
  284. package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
  285. package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +5 -0
  286. package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +5 -0
  287. package/src/routes/write/[bookid]/editions/+page.svelte +20 -0
  288. package/src/vite-env.d.ts +1 -0
  289. package/static/icons/favicon.png +0 -0
  290. package/static/icons/icon.png +0 -0
  291. package/static/icons/ios-icon.png +0 -0
  292. package/storage.rules +9 -0
  293. package/svelte.config.js +19 -0
  294. package/tsconfig.json +18 -0
  295. package/tsconfig.node.json +9 -0
  296. package/vite.config.ts +8 -0
  297. package/vite.reader.config.ts +32 -0
  298. package/components/Auth.svelte +0 -55
  299. package/components/Auth.svelte.d.ts +0 -16
  300. package/components/Authentication.js +0 -1
  301. package/components/BookPreview.svelte.d.ts +0 -18
  302. package/components/External.svelte.d.ts +0 -18
  303. package/components/Link.svelte +0 -51
  304. package/components/Link.svelte.d.ts +0 -18
  305. package/components/app/BookList.svelte.d.ts +0 -18
  306. package/components/app/Button.svelte.d.ts +0 -22
  307. package/components/app/Feedback.svelte.d.ts +0 -18
  308. package/components/app/Head.svelte.d.ts +0 -18
  309. package/components/app/Large.svelte.d.ts +0 -27
  310. package/components/app/Lead.svelte.d.ts +0 -27
  311. package/components/app/Link.svelte.d.ts +0 -20
  312. package/components/app/Options.svelte.d.ts +0 -19
  313. package/components/app/Paragraph.svelte.d.ts +0 -18
  314. package/components/app/Section.svelte.d.ts +0 -27
  315. package/components/app/Table.svelte.d.ts +0 -27
  316. package/components/app/TextInput.svelte.d.ts +0 -22
  317. package/components/chapter/Atom.svelte.d.ts +0 -19
  318. package/components/chapter/Block.svelte +0 -37
  319. package/components/chapter/Block.svelte.d.ts +0 -17
  320. package/components/chapter/Callout.svelte.d.ts +0 -17
  321. package/components/chapter/CaptionedCode.svelte.d.ts +0 -17
  322. package/components/chapter/ChapterBody.svelte.d.ts +0 -19
  323. package/components/chapter/Citations.svelte.d.ts +0 -17
  324. package/components/chapter/Code.svelte.d.ts +0 -22
  325. package/components/chapter/Comment.svelte.d.ts +0 -17
  326. package/components/chapter/Definition.svelte.d.ts +0 -17
  327. package/components/chapter/Embed.svelte.d.ts +0 -20
  328. package/components/chapter/ErrorMessage.svelte +0 -9
  329. package/components/chapter/ErrorMessage.svelte.d.ts +0 -17
  330. package/components/chapter/ExtendedPrism.d.ts +0 -2
  331. package/components/chapter/Figure.svelte.d.ts +0 -24
  332. package/components/chapter/Footnote.svelte.d.ts +0 -19
  333. package/components/chapter/Format.svelte.d.ts +0 -19
  334. package/components/chapter/InlineCode.svelte.d.ts +0 -17
  335. package/components/chapter/Label.svelte.d.ts +0 -17
  336. package/components/chapter/Link.svelte.d.ts +0 -17
  337. package/components/chapter/List.svelte.d.ts +0 -17
  338. package/components/chapter/Marginal.svelte.d.ts +0 -22
  339. package/components/chapter/Paragraph.svelte.d.ts +0 -18
  340. package/components/chapter/Positioned.svelte.d.ts +0 -19
  341. package/components/chapter/Problem.svelte.d.ts +0 -27
  342. package/components/chapter/Python.svelte +0 -128
  343. package/components/chapter/Python.svelte.d.ts +0 -18
  344. package/components/chapter/Quote.svelte.d.ts +0 -17
  345. package/components/chapter/Rule.svelte.d.ts +0 -17
  346. package/components/chapter/Table.svelte.d.ts +0 -17
  347. package/components/chapter/Text.svelte +0 -87
  348. package/components/chapter/Text.svelte.d.ts +0 -18
  349. package/components/editor/BookishEditor.svelte +0 -884
  350. package/components/editor/BookishEditor.svelte.d.ts +0 -25
  351. package/components/editor/CalloutEditor.svelte +0 -10
  352. package/components/editor/CalloutEditor.svelte.d.ts +0 -17
  353. package/components/editor/CaptionedCodeEditor.svelte.d.ts +0 -17
  354. package/components/editor/CaretContext.d.ts +0 -50
  355. package/components/editor/CaretContext.js +0 -1
  356. package/components/editor/CaretState.js +0 -1
  357. package/components/editor/CaretUtilities.js +0 -1
  358. package/components/editor/CaretView.svelte.d.ts +0 -25
  359. package/components/editor/CitationsEditor.svelte +0 -53
  360. package/components/editor/CitationsEditor.svelte.d.ts +0 -17
  361. package/components/editor/Clipboard.js +0 -1
  362. package/components/editor/Command.js +0 -1
  363. package/components/editor/Commands.d.ts +0 -3
  364. package/components/editor/ConfirmButton.svelte +0 -49
  365. package/components/editor/ConfirmButton.svelte.d.ts +0 -19
  366. package/components/editor/DefinitionEditor.svelte +0 -36
  367. package/components/editor/DefinitionEditor.svelte.d.ts +0 -17
  368. package/components/editor/EmbedEditor.svelte +0 -137
  369. package/components/editor/EmbedEditor.svelte.d.ts +0 -17
  370. package/components/editor/Icon.svelte.d.ts +0 -16
  371. package/components/editor/ImageChooser.svelte.d.ts +0 -18
  372. package/components/editor/InlineCodeEditor.svelte +0 -12
  373. package/components/editor/InlineCodeEditor.svelte.d.ts +0 -17
  374. package/components/editor/LabelEditor.svelte.d.ts +0 -17
  375. package/components/editor/LanguageEditor.svelte.d.ts +0 -17
  376. package/components/editor/LinkEditor.svelte +0 -100
  377. package/components/editor/LinkEditor.svelte.d.ts +0 -17
  378. package/components/editor/Note.svelte.d.ts +0 -27
  379. package/components/editor/Permissions.svelte.d.ts +0 -20
  380. package/components/editor/PositionEditor.svelte +0 -17
  381. package/components/editor/PositionEditor.svelte.d.ts +0 -18
  382. package/components/editor/QuoteEditor.svelte +0 -10
  383. package/components/editor/QuoteEditor.svelte.d.ts +0 -17
  384. package/components/editor/Switch.svelte.d.ts +0 -20
  385. package/components/editor/TableEditor.svelte +0 -10
  386. package/components/editor/TableEditor.svelte.d.ts +0 -17
  387. package/components/editor/TextEditor.svelte.d.ts +0 -24
  388. package/components/editor/Toggle.svelte +0 -41
  389. package/components/editor/Toggle.svelte.d.ts +0 -19
  390. package/components/editor/Toolbar.svelte +0 -249
  391. package/components/editor/Toolbar.svelte.d.ts +0 -17
  392. package/components/editor/ToolbarGroup.svelte.d.ts +0 -18
  393. package/components/editor/ToolbarSpacer.svelte.d.ts +0 -23
  394. package/components/editor/URLEditor.svelte +0 -13
  395. package/components/editor/URLEditor.svelte.d.ts +0 -18
  396. package/components/editor/UndoState.js +0 -1
  397. package/components/page/Acknowledgements.svelte.d.ts +0 -14
  398. package/components/page/Authors.svelte +0 -85
  399. package/components/page/Authors.svelte.d.ts +0 -21
  400. package/components/page/BookLoader.svelte +0 -59
  401. package/components/page/BookLoader.svelte.d.ts +0 -16
  402. package/components/page/BulkReferenceEditor.svelte +0 -63
  403. package/components/page/BulkReferenceEditor.svelte.d.ts +0 -14
  404. package/components/page/Chapter.svelte +0 -392
  405. package/components/page/Chapter.svelte.d.ts +0 -18
  406. package/components/page/ChapterContext.d.ts +0 -10
  407. package/components/page/ChapterContext.js +0 -1
  408. package/components/page/ChapterNumber.svelte.d.ts +0 -27
  409. package/components/page/ChapterTitle.svelte.d.ts +0 -18
  410. package/components/page/Contexts.d.ts +0 -47
  411. package/components/page/Contexts.js +0 -133
  412. package/components/page/DefinitionView.svelte.d.ts +0 -18
  413. package/components/page/Description.svelte.d.ts +0 -14
  414. package/components/page/Edition.svelte +0 -161
  415. package/components/page/Edition.svelte.d.ts +0 -20
  416. package/components/page/EditionLoader.svelte +0 -99
  417. package/components/page/EditionLoader.svelte.d.ts +0 -18
  418. package/components/page/Editions.svelte.d.ts +0 -14
  419. package/components/page/Glossary.svelte.d.ts +0 -14
  420. package/components/page/Header.svelte.d.ts +0 -29
  421. package/components/page/Index.svelte.d.ts +0 -14
  422. package/components/page/Instructions.svelte.d.ts +0 -18
  423. package/components/page/License.svelte.d.ts +0 -14
  424. package/components/page/Loading.svelte.d.ts +0 -23
  425. package/components/page/Media.svelte.d.ts +0 -14
  426. package/components/page/MediaPreview.svelte.d.ts +0 -19
  427. package/components/page/Muted.svelte.d.ts +0 -27
  428. package/components/page/Outline.svelte.d.ts +0 -19
  429. package/components/page/Page.svelte +0 -84
  430. package/components/page/Page.svelte.d.ts +0 -19
  431. package/components/page/PageHeader.svelte.d.ts +0 -18
  432. package/components/page/PageParagraph.svelte.d.ts +0 -27
  433. package/components/page/PossibleChapter.svelte +0 -14
  434. package/components/page/PossibleChapter.svelte.d.ts +0 -14
  435. package/components/page/PossibleReference.svelte +0 -11
  436. package/components/page/PossibleReference.svelte.d.ts +0 -18
  437. package/components/page/Print.svelte.d.ts +0 -14
  438. package/components/page/Publish.svelte.d.ts +0 -14
  439. package/components/page/Reference.svelte.d.ts +0 -17
  440. package/components/page/References.svelte.d.ts +0 -14
  441. package/components/page/Rows.svelte.d.ts +0 -27
  442. package/components/page/Search.svelte +0 -133
  443. package/components/page/Search.svelte.d.ts +0 -14
  444. package/components/page/Status.svelte.d.ts +0 -14
  445. package/components/page/SubdomainEditor.svelte.d.ts +0 -14
  446. package/components/page/TableOfContents.svelte.d.ts +0 -14
  447. package/components/page/TableOfContentsImage.svelte +0 -18
  448. package/components/page/TableOfContentsImage.svelte.d.ts +0 -16
  449. package/components/page/TableOfContentsRow.svelte.d.ts +0 -24
  450. package/components/page/ThemeEditor.svelte.d.ts +0 -14
  451. package/components/page/ThemeEditorPreview.svelte.d.ts +0 -17
  452. package/components/page/ThemeSetEditor.svelte +0 -19
  453. package/components/page/ThemeSetEditor.svelte.d.ts +0 -18
  454. package/components/page/ThemeVariableEditor.svelte.d.ts +0 -18
  455. package/components/page/Title.svelte.d.ts +0 -27
  456. package/components/page/Unknown.svelte.d.ts +0 -16
  457. package/components/page/margins.d.ts +0 -2
  458. package/index.d.ts +0 -15
  459. package/models/CRUD.d.ts +0 -27
  460. package/models/CRUD.js +0 -262
  461. package/models/Firebase.d.ts +0 -5
  462. package/models/book/Book.d.ts +0 -61
  463. package/models/book/Book.js +0 -135
  464. package/models/book/BookMedia.d.ts +0 -23
  465. package/models/book/BookMedia.js +0 -108
  466. package/models/book/BookSaveStatus.d.ts +0 -7
  467. package/models/book/BookSaveStatus.js +0 -8
  468. package/models/book/Chapter.d.ts +0 -81
  469. package/models/book/Chapter.js +0 -212
  470. package/models/book/ChapterID.d.ts +0 -10
  471. package/models/book/Definition.d.ts +0 -6
  472. package/models/book/Definition.js +0 -1
  473. package/models/book/Edition.d.ts +0 -139
  474. package/models/book/Edition.js +0 -620
  475. package/models/book/Reference.d.ts +0 -24
  476. package/models/book/Reference.js +0 -78
  477. package/models/book/Schema.d.ts +0 -174
  478. package/models/book/Theme.d.ts +0 -113
  479. package/models/book/ThemeColors.js +0 -1
  480. package/models/book/Words.d.ts +0 -2
  481. package/models/chapter/AtomNode.d.ts +0 -18
  482. package/models/chapter/BlockNode.d.ts +0 -20
  483. package/models/chapter/BlocksNode.d.ts +0 -50
  484. package/models/chapter/BlocksNode.test.d.ts +0 -1
  485. package/models/chapter/BlocksNode.test.js +0 -568
  486. package/models/chapter/Bookkeeping.js +0 -1
  487. package/models/chapter/CalloutNode.d.ts +0 -17
  488. package/models/chapter/CalloutNode.js +0 -58
  489. package/models/chapter/Caret.d.ts +0 -23
  490. package/models/chapter/ChapterNode.d.ts +0 -34
  491. package/models/chapter/ChapterNode.js +0 -117
  492. package/models/chapter/CitationsNode.d.ts +0 -16
  493. package/models/chapter/CodeNode.d.ts +0 -35
  494. package/models/chapter/CommentNode.d.ts +0 -18
  495. package/models/chapter/CommentNode.js +0 -48
  496. package/models/chapter/DefinitionNode.d.ts +0 -12
  497. package/models/chapter/Edit.d.ts +0 -7
  498. package/models/chapter/Edit.js +0 -1
  499. package/models/chapter/EmbedNode.d.ts +0 -45
  500. package/models/chapter/EmbedNode.js +0 -168
  501. package/models/chapter/ErrorNode.d.ts +0 -17
  502. package/models/chapter/FootnoteNode.d.ts +0 -18
  503. package/models/chapter/FootnoteNode.js +0 -47
  504. package/models/chapter/FormatNode.d.ts +0 -60
  505. package/models/chapter/FormatNode.test.d.ts +0 -1
  506. package/models/chapter/FormatNode.test.js +0 -96
  507. package/models/chapter/InlineCodeNode.d.ts +0 -12
  508. package/models/chapter/LabelNode.d.ts +0 -17
  509. package/models/chapter/LinkNode.d.ts +0 -12
  510. package/models/chapter/ListNode.d.ts +0 -51
  511. package/models/chapter/ListNode.test.d.ts +0 -1
  512. package/models/chapter/MetadataNode.d.ts +0 -17
  513. package/models/chapter/MetadataNode.js +0 -32
  514. package/models/chapter/Node.d.ts +0 -38
  515. package/models/chapter/Node.test.d.ts +0 -1
  516. package/models/chapter/ParagraphNode.d.ts +0 -33
  517. package/models/chapter/ParagraphNode.test.d.ts +0 -1
  518. package/models/chapter/ParagraphNode.test.js +0 -30
  519. package/models/chapter/Parser.d.ts +0 -75
  520. package/models/chapter/Parser.test.d.ts +0 -1
  521. package/models/chapter/Position.js +0 -1
  522. package/models/chapter/QuoteNode.d.ts +0 -25
  523. package/models/chapter/QuoteNode.js +0 -99
  524. package/models/chapter/RootNode.js +0 -1
  525. package/models/chapter/RuleNode.d.ts +0 -15
  526. package/models/chapter/TableNode.d.ts +0 -37
  527. package/models/chapter/TableNode.test.d.ts +0 -1
  528. package/models/chapter/TextNode.d.ts +0 -36
  529. package/models/chapter/TextNode.test.d.ts +0 -1
  530. package/util/getSubdomain.d.ts +0 -3
  531. package/util/isMobile.d.ts +0 -2
  532. package/util/mineReference.d.ts +0 -4
  533. package/util/scrollToEyeLevel.d.ts +0 -2
@@ -1,15 +1,29 @@
1
- import FormatNode, {} from './FormatNode';
1
+ import type Node from './Node';
2
+ import type Position from './Position';
3
+ import FormatNode, { type Format } from './FormatNode';
2
4
  import TextNode from './TextNode';
3
5
  import BlockNode from './BlockNode';
6
+ import type { CaretRange } from './Caret';
7
+ import type Edit from './Edit';
8
+ import type Caret from './Caret';
9
+
4
10
  export default class CodeNode extends BlockNode {
5
- #code;
6
- #caption;
7
- #position;
8
- #language;
9
- #executable;
10
- constructor(code, language, position, caption) {
11
+ readonly #code: TextNode;
12
+ readonly #caption: FormatNode;
13
+ readonly #position: Position;
14
+ readonly #language: string;
15
+ readonly #executable: boolean;
16
+
17
+ constructor(
18
+ code: TextNode,
19
+ language: string,
20
+ position: Position,
21
+ caption?: FormatNode
22
+ ) {
11
23
  super();
24
+
12
25
  const executable = language.charAt(language.length - 1) === '!';
26
+
13
27
  this.#code = code;
14
28
  this.#position = position;
15
29
  this.#language = executable ? language.slice(0, -1) : language;
@@ -19,9 +33,11 @@ export default class CodeNode extends BlockNode {
19
33
  ? new FormatNode('', [new TextNode()])
20
34
  : caption.withTextIfEmpty();
21
35
  }
36
+
22
37
  getType() {
23
38
  return 'code';
24
39
  }
40
+
25
41
  getCodeNode() {
26
42
  return this.#code;
27
43
  }
@@ -43,82 +59,132 @@ export default class CodeNode extends BlockNode {
43
59
  getFormats() {
44
60
  return [this.#caption];
45
61
  }
62
+
46
63
  toText() {
47
64
  return '';
48
65
  }
49
- toHTML() {
66
+ toHTML(): string {
50
67
  return `<pre><code>${this.#code.toHTML()}</code><pre><center>${this.#caption.toHTML()}</center>`;
51
68
  }
52
- toBookdown() {
69
+
70
+ toBookdown(): string {
53
71
  // Remember to escape any back ticks.
54
- return ('`' +
72
+ return (
73
+ '`' +
55
74
  (this.#language !== 'plaintext' ? this.#language : '') +
56
75
  (this.#executable ? '!' : '') +
57
76
  '\n' +
58
77
  this.#code.getText().replace(/`/g, '\\`') +
59
78
  '\n`' +
60
79
  (this.#position !== '|' ? this.#position : '') +
61
- this.#caption.toBookdown());
80
+ this.#caption.toBookdown()
81
+ );
62
82
  }
83
+
63
84
  getChildren() {
64
85
  return [this.#code, this.#caption];
65
86
  }
87
+
66
88
  copy() {
67
- return new CodeNode(this.#code.copy(), this.#language, this.#position, this.#caption.copy());
68
- }
69
- getParentOf(node) {
89
+ return new CodeNode(
90
+ this.#code.copy(),
91
+ this.#language,
92
+ this.#position,
93
+ this.#caption.copy()
94
+ ) as this;
95
+ }
96
+
97
+ getParentOf(node: Node): Node | undefined {
70
98
  return node == this.#code || node === this.#caption
71
99
  ? this
72
100
  : this.#caption.getParentOf(node);
73
101
  }
74
- withChildReplaced(node, replacement) {
75
- const newCode = node === this.#code && replacement instanceof TextNode
76
- ? replacement
77
- : undefined;
78
- const newCaption = node === this.#caption &&
102
+
103
+ withChildReplaced(node: Node, replacement: Node | undefined) {
104
+ const newCode =
105
+ node === this.#code && replacement instanceof TextNode
106
+ ? replacement
107
+ : undefined;
108
+ const newCaption =
109
+ node === this.#caption &&
79
110
  (replacement instanceof FormatNode || replacement === undefined)
80
- ? replacement
81
- : undefined;
111
+ ? replacement
112
+ : undefined;
82
113
  return newCode || newCaption
83
- ? new CodeNode(newCode ? newCode : this.#code, this.#language, this.#position, newCaption ? newCaption : this.#caption)
114
+ ? (new CodeNode(
115
+ newCode ? newCode : this.#code,
116
+ this.#language,
117
+ this.#position,
118
+ newCaption ? newCaption : this.#caption
119
+ ) as this)
84
120
  : undefined;
85
121
  }
86
- withPosition(position) {
87
- return new CodeNode(this.#code, this.#language, position, this.#caption);
88
- }
89
- withLanguage(language) {
90
- return new CodeNode(this.#code, language, this.#position, this.#caption);
91
- }
92
- withExecutable(executable) {
93
- return new CodeNode(this.#code, executable ? this.#language + '!' : this.#language, this.#position, this.#caption);
94
- }
95
- withCaption(caption) {
96
- return new CodeNode(this.#code, this.#language, this.#position, caption);
97
- }
98
- withContentInRange(range) {
122
+
123
+ withPosition(position: Position) {
124
+ return new CodeNode(
125
+ this.#code,
126
+ this.#language,
127
+ position,
128
+ this.#caption
129
+ );
130
+ }
131
+ withLanguage(language: string) {
132
+ return new CodeNode(
133
+ this.#code,
134
+ language,
135
+ this.#position,
136
+ this.#caption
137
+ );
138
+ }
139
+ withExecutable(executable: boolean) {
140
+ return new CodeNode(
141
+ this.#code,
142
+ executable ? this.#language + '!' : this.#language,
143
+ this.#position,
144
+ this.#caption
145
+ );
146
+ }
147
+ withCaption(caption: FormatNode) {
148
+ return new CodeNode(
149
+ this.#code,
150
+ this.#language,
151
+ this.#position,
152
+ caption
153
+ );
154
+ }
155
+
156
+ withContentInRange(range: CaretRange): this | undefined {
99
157
  if (!this.contains(range.start.node) && !this.contains(range.end.node))
100
158
  return this.copy();
101
159
  const newCode = this.#caption.contains(range.start.node)
102
160
  ? new TextNode()
103
161
  : this.#code.withContentInRange(range);
104
- const newCaption = range.end.node === this.#code
105
- ? new FormatNode('', [new TextNode()])
106
- : this.#caption.withContentInRange(range);
107
- if (newCode === undefined || newCaption === undefined)
108
- return;
109
- return new CodeNode(newCode, this.#language, this.#position, newCaption);
110
- }
162
+ const newCaption =
163
+ range.end.node === this.#code
164
+ ? new FormatNode('', [new TextNode()])
165
+ : this.#caption.withContentInRange(range);
166
+ if (newCode === undefined || newCaption === undefined) return;
167
+ return new CodeNode(
168
+ newCode,
169
+ this.#language,
170
+ this.#position,
171
+ newCaption
172
+ ) as this;
173
+ }
174
+
111
175
  /** Overrides super, special casing TextNode, since super only handles formats. */
112
- withRangeFormatted(range, format) {
113
- let editedNode = this;
176
+ withRangeFormatted(range: CaretRange, format: Format | undefined): Edit {
177
+ let editedNode: Node | undefined = this;
178
+
114
179
  // First, handle the caption, if necessary.
115
180
  let captionEdit = super.withRangeFormatted(range, format);
181
+
116
182
  // If we're asking for format, skip it, code can't be formatted. Just return the caption edit.
117
- if (format !== undefined)
118
- return captionEdit;
183
+ if (format !== undefined) return captionEdit;
184
+
119
185
  // Grab the new CodeNode if the caption was edited.
120
- if (captionEdit)
121
- editedNode = captionEdit.root;
186
+ if (captionEdit) editedNode = captionEdit.root as this;
187
+
122
188
  // Next, see if part of the range included this text node.
123
189
  const sortedRange = this.sortRange(range);
124
190
  const containsStart = sortedRange.start.node === this.#code;
@@ -133,11 +199,9 @@ export default class CodeNode extends BlockNode {
133
199
  : this.#code.getLength(),
134
200
  },
135
201
  });
136
- if (revisedCode === undefined)
137
- return;
202
+ if (revisedCode === undefined) return;
138
203
  editedNode = editedNode.withChildReplaced(this.#code, revisedCode);
139
- if (editedNode === undefined)
140
- return;
204
+ if (editedNode === undefined) return;
141
205
  const revisedCaret = {
142
206
  node: revisedCode,
143
207
  index: sortedRange.start.index,
@@ -146,27 +210,26 @@ export default class CodeNode extends BlockNode {
146
210
  root: editedNode,
147
211
  range: { start: revisedCaret, end: revisedCaret },
148
212
  };
149
- }
150
- else {
213
+ } else {
151
214
  return captionEdit;
152
215
  }
153
216
  }
154
- withNodeInserted(caret, node) {
217
+
218
+ withNodeInserted(caret: Caret, node: Node): Edit {
155
219
  // Only insert if the caret is in the code node.
156
- if (caret.node !== this.#code)
157
- return undefined;
220
+ if (caret.node !== this.#code) return undefined;
221
+
158
222
  // Convert the node to text, then insert it at the position.
159
223
  const text = node
160
224
  .getNodes()
161
- .filter((n) => n instanceof TextNode)
225
+ .filter((n): n is TextNode => n instanceof TextNode)
162
226
  .map((t) => t.getText())
163
227
  .join('');
228
+
164
229
  const newCode = this.#code.withCharacterAt(text, caret.index);
165
- if (newCode === undefined)
166
- return undefined;
230
+ if (newCode === undefined) return undefined;
167
231
  const newNode = this.withChildReplaced(this.#code, newCode);
168
- if (newNode === undefined)
169
- return;
232
+ if (newNode === undefined) return;
170
233
  const newCaret = { node: newCode, index: caret.index + text.length };
171
234
  return { root: newNode, range: { start: newCaret, end: newCaret } };
172
235
  }
@@ -0,0 +1,61 @@
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
+
7
+ export default class CommentNode extends AtomNode<FormatNode> {
8
+ constructor(comment: FormatNode) {
9
+ super(comment.withTextIfEmpty());
10
+ }
11
+
12
+ getType() {
13
+ return 'comment';
14
+ }
15
+ toText(): string {
16
+ return '';
17
+ }
18
+ toHTML(): string {
19
+ return `(${this.getMeta().toHTML()})`;
20
+ }
21
+
22
+ getDefaultCaret(): Caret | undefined {
23
+ return this.getMeta().getFirstCaret();
24
+ }
25
+
26
+ toBookdown(format?: FormatNode): string {
27
+ const previousText = format?.getPreviousTextOrAtom(this)?.toBookdown();
28
+ // Insert a space before the % if there isn't one before this.
29
+ return `${
30
+ previousText?.endsWith(' ') ? '' : ' '
31
+ }%${this.getMeta().toBookdown()}%`;
32
+ }
33
+
34
+ copy() {
35
+ return new CommentNode(this.getMeta().copy()) as this;
36
+ }
37
+
38
+ withChildReplaced(node: Node, replacement: Node | undefined) {
39
+ return node instanceof FormatNode &&
40
+ replacement instanceof FormatNode &&
41
+ node === this.getMeta()
42
+ ? (new CommentNode(replacement) as this)
43
+ : undefined;
44
+ }
45
+
46
+ getParentOf(node: Node): Node | undefined {
47
+ return node === this.getMeta()
48
+ ? this
49
+ : this.getMeta().getParentOf(node);
50
+ }
51
+
52
+ withMeta(comment: FormatNode) {
53
+ return new CommentNode(comment);
54
+ }
55
+
56
+ withContentInRange(range: CaretRange): this | undefined {
57
+ const newFormat = this.getMeta().withContentInRange(range);
58
+ if (newFormat === undefined) return;
59
+ return this.withMeta(newFormat) as this;
60
+ }
61
+ }
@@ -1,28 +1,34 @@
1
1
  import MetadataNode from './MetadataNode';
2
2
  import TextNode from './TextNode';
3
- export default class DefinitionNode extends MetadataNode {
4
- constructor(phrase, glossaryID = '') {
3
+
4
+ export default class DefinitionNode extends MetadataNode<string> {
5
+ constructor(phrase?: TextNode, glossaryID: string = '') {
5
6
  super(phrase === undefined ? new TextNode() : phrase, glossaryID);
6
7
  }
8
+
7
9
  getType() {
8
10
  return 'definition';
9
11
  }
10
- toText() {
12
+
13
+ toText(): string {
11
14
  return this.getText().toText();
12
15
  }
13
- toHTML() {
16
+ toHTML(): string {
14
17
  return `${this.getText().toHTML()}`;
15
18
  }
16
- toBookdown() {
19
+
20
+ toBookdown(): string {
17
21
  return `~${this.getText().toBookdown()}~${this.getMeta()}`;
18
22
  }
23
+
19
24
  copy() {
20
- return new DefinitionNode(this.getText(), this.getMeta());
25
+ return new DefinitionNode(this.getText(), this.getMeta()) as this;
21
26
  }
22
- withMeta(meta) {
27
+
28
+ withMeta(meta: string): MetadataNode<string> {
23
29
  return new DefinitionNode(this.getText(), meta);
24
30
  }
25
- withText(text) {
31
+ withText(text: TextNode): MetadataNode<string> {
26
32
  return new DefinitionNode(text, this.getMeta());
27
33
  }
28
34
  }
@@ -0,0 +1,6 @@
1
+ import type { CaretRange } from './Caret';
2
+ import type Node from './Node';
3
+
4
+ // Edits can either result in no change (represented by undefined) or a new root node and a selection in it.
5
+ type Edit = undefined | { root: Node; range: CaretRange };
6
+ export default Edit;
@@ -0,0 +1,257 @@
1
+ import type Node from './Node';
2
+ import type Position from './Position';
3
+ import FormatNode from './FormatNode';
4
+ import TextNode from './TextNode';
5
+ import BlockNode from './BlockNode';
6
+ import type { CaretRange } from './Caret';
7
+ import type RootNode from './RootNode';
8
+ import type Caret from './Caret';
9
+
10
+ // This is what we use to encode URLs in the URL field of the embed node.
11
+ const URL_SEPARATOR = '*';
12
+
13
+ export default class EmbedNode extends BlockNode {
14
+ /**
15
+ * 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.
16
+ * These are used for responsive rendering and to limit bandwidth usage. Any image URLs after the second are ignored.
17
+ */
18
+ readonly #urls: string;
19
+ readonly #description: string;
20
+ readonly #caption: FormatNode;
21
+ readonly #credit: FormatNode;
22
+ readonly #position: Position;
23
+
24
+ constructor(
25
+ url: string,
26
+ description: string,
27
+ caption?: FormatNode,
28
+ credit?: FormatNode,
29
+ position: Position = '|'
30
+ ) {
31
+ super();
32
+
33
+ this.#urls = url;
34
+ this.#description = description;
35
+ this.#caption =
36
+ caption === undefined
37
+ ? new FormatNode('', [new TextNode()])
38
+ : caption.withTextIfEmpty();
39
+ this.#credit =
40
+ credit == undefined
41
+ ? new FormatNode('', [new TextNode()])
42
+ : credit.withTextIfEmpty();
43
+ this.#position = position;
44
+ }
45
+
46
+ getType() {
47
+ return 'embed';
48
+ }
49
+
50
+ isVideo() {
51
+ return (
52
+ this.#urls.includes('https://www.youtube.com') ||
53
+ this.#urls.includes('https://youtu.be') ||
54
+ this.#urls.includes('https://www.tiktok.com') ||
55
+ this.#urls.includes('vimeo.com')
56
+ );
57
+ }
58
+ getURL() {
59
+ return this.#urls.split(URL_SEPARATOR)[0];
60
+ }
61
+ getSmallURL() {
62
+ return this.isLocal()
63
+ ? 'images/small/' + this.getURL()
64
+ : this.hasSmallURL()
65
+ ? this.#urls.split(URL_SEPARATOR)[1]
66
+ : this.getURL();
67
+ }
68
+ hasSmallURL() {
69
+ return (
70
+ this.#urls.split(URL_SEPARATOR).length > 1 &&
71
+ this.#urls.split(URL_SEPARATOR)[1].trim().length > 0
72
+ );
73
+ }
74
+ isHosted() {
75
+ return this.#urls.includes('bookish');
76
+ }
77
+ isLocal() {
78
+ return this.#urls.length > 0 && !this.#urls.startsWith('http');
79
+ }
80
+ getDescription() {
81
+ return this.#description;
82
+ }
83
+ getCaption() {
84
+ return this.#caption;
85
+ }
86
+ getCredit() {
87
+ return this.#credit;
88
+ }
89
+ getPosition() {
90
+ return this.#position;
91
+ }
92
+ getFormats() {
93
+ return [this.#caption, this.#credit];
94
+ }
95
+ getChildren() {
96
+ return [this.#caption, this.#credit];
97
+ }
98
+ getParentOf(node: Node): Node | undefined {
99
+ if (node === this.#caption || node === this.#credit) return this;
100
+ const captionParent = this.#caption.getParentOf(node);
101
+ if (captionParent) return captionParent;
102
+ const creditParent = this.#credit.getParentOf(node);
103
+ if (creditParent) return creditParent;
104
+ }
105
+
106
+ toText(): string {
107
+ return this.#caption.toText();
108
+ }
109
+ toHTML(): string {
110
+ return `<img src="${this.getURL()}" alt="${this.getDescription()}" />`;
111
+ }
112
+ toBookdown(): string {
113
+ return `|${this.#urls}|${
114
+ this.#description
115
+ }|${this.#caption.toBookdown()}|${this.#credit.toBookdown()}|`;
116
+ }
117
+ toJSON() {
118
+ return {
119
+ url: this.#urls,
120
+ alt: this.#description,
121
+ caption: this.#caption.toText(),
122
+ credit: this.#credit.toText(),
123
+ };
124
+ }
125
+
126
+ copy() {
127
+ return new EmbedNode(
128
+ this.#urls,
129
+ this.#description,
130
+ this.#caption.copy(),
131
+ this.#credit.copy(),
132
+ this.#position
133
+ ) as this;
134
+ }
135
+
136
+ withChildReplaced(node: Node, replacement: Node | undefined) {
137
+ const newCaption =
138
+ node === this.#caption &&
139
+ (replacement === undefined || replacement instanceof FormatNode)
140
+ ? replacement
141
+ : this.#caption;
142
+ const newCredit =
143
+ node === this.#credit &&
144
+ (replacement === undefined || replacement instanceof FormatNode)
145
+ ? replacement
146
+ : this.#credit;
147
+ return newCaption || newCredit
148
+ ? (new EmbedNode(
149
+ this.#urls,
150
+ this.#description,
151
+ newCaption,
152
+ newCredit,
153
+ this.#position
154
+ ) as this)
155
+ : undefined;
156
+ }
157
+
158
+ withURL(url: string) {
159
+ // If the URL is a YouTube URL, convert to an embed URL, since a raw YouTube URL is never valid for embedding.
160
+ if (url.includes('www.youtube.com/watch?v='))
161
+ url = url.replace('/watch?v=', '/embed/');
162
+
163
+ return new EmbedNode(
164
+ url,
165
+ this.#description,
166
+ this.#caption,
167
+ this.#credit,
168
+ this.#position
169
+ );
170
+ }
171
+ withURLs(url: string, thumbnail: string) {
172
+ return new EmbedNode(
173
+ url + URL_SEPARATOR + thumbnail,
174
+ this.#description,
175
+ this.#caption,
176
+ this.#credit,
177
+ this.#position
178
+ );
179
+ }
180
+ withDescription(description: string) {
181
+ return new EmbedNode(
182
+ this.#urls,
183
+ description,
184
+ this.#caption,
185
+ this.#credit,
186
+ this.#position
187
+ );
188
+ }
189
+ withCaption(caption: FormatNode) {
190
+ return new EmbedNode(
191
+ this.#urls,
192
+ this.#description,
193
+ caption,
194
+ this.#credit,
195
+ this.#position
196
+ );
197
+ }
198
+ withCredit(credit: FormatNode) {
199
+ return new EmbedNode(
200
+ this.#urls,
201
+ this.#description,
202
+ this.#caption,
203
+ credit,
204
+ this.#position
205
+ );
206
+ }
207
+ withPosition(position: Position) {
208
+ return new EmbedNode(
209
+ this.#urls,
210
+ this.#description,
211
+ this.#caption,
212
+ this.#credit,
213
+ position
214
+ );
215
+ }
216
+
217
+ withContentInRange(range: CaretRange): this | undefined {
218
+ if (!this.contains(range.start.node) && !this.contains(range.end.node))
219
+ return this.copy();
220
+ const newCredit =
221
+ this.#credit.contains(range.end.node) ||
222
+ this.#credit.contains(range.start.node)
223
+ ? this.#credit.withContentInRange(range)
224
+ : new FormatNode('', [new TextNode()]);
225
+ const newCaption =
226
+ this.#caption.contains(range.start.node) ||
227
+ this.#caption.contains(range.end.node)
228
+ ? this.#caption.withContentInRange(range)
229
+ : new FormatNode('', [new TextNode()]);
230
+ if (newCaption === undefined || newCredit === undefined) return;
231
+
232
+ return new EmbedNode(
233
+ this.#urls,
234
+ this.#description,
235
+ newCaption,
236
+ newCredit,
237
+ this.#position
238
+ ) as this;
239
+ }
240
+
241
+ nextWord(): Caret {
242
+ return this.#caption.getFirstCaret() as Caret;
243
+ }
244
+
245
+ previousWord(root: RootNode): Caret {
246
+ const previous = root.getPreviousTextOrAtom(
247
+ this.#caption.getFirstTextNode()
248
+ );
249
+ return previous
250
+ ? {
251
+ node: previous,
252
+ index:
253
+ previous instanceof TextNode ? previous.getLength() : 0,
254
+ }
255
+ : { node: this, index: 0 };
256
+ }
257
+ }
@@ -1,12 +1,15 @@
1
1
  import BlockNode from './BlockNode';
2
+ import type Node from './Node';
3
+
2
4
  export default class ErrorNode extends BlockNode {
3
- #text;
4
- #error;
5
- constructor(text, error) {
5
+ #text: string | undefined;
6
+ #error: string;
7
+ constructor(text: string | undefined, error: string) {
6
8
  super();
7
9
  this.#text = text;
8
10
  this.#error = error;
9
11
  }
12
+
10
13
  getType() {
11
14
  return 'error';
12
15
  }
@@ -16,28 +19,32 @@ export default class ErrorNode extends BlockNode {
16
19
  getFormats() {
17
20
  return [];
18
21
  }
19
- toText() {
22
+
23
+ toText(): string {
20
24
  return '';
21
25
  }
22
- toBookdown() {
26
+ toBookdown(): string {
23
27
  return this.#text ?? '';
24
28
  }
25
29
  toHTML() {
26
30
  return this.#text ?? '';
27
31
  }
32
+
28
33
  getChildren() {
29
34
  return [];
30
35
  }
31
- getParentOf() {
36
+ getParentOf(): Node | undefined {
32
37
  return undefined;
33
38
  }
39
+
34
40
  copy() {
35
- return new ErrorNode(this.#text, this.#error);
41
+ return new ErrorNode(this.#text, this.#error) as this;
36
42
  }
43
+
37
44
  withChildReplaced() {
38
45
  return undefined;
39
46
  }
40
- withContentInRange() {
47
+ withContentInRange(): this | undefined {
41
48
  return this.copy();
42
49
  }
43
50
  }