bookish-press 0.4.45 → 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 -58
  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} +111 -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
@@ -0,0 +1,135 @@
1
+ import type Node from './Node';
2
+ import BlockNode from './BlockNode';
3
+ import type Position from './Position';
4
+ import FormatNode from './FormatNode';
5
+ import BlocksNode from './BlocksNode';
6
+ import TextNode from './TextNode';
7
+ import type { CaretRange } from './Caret';
8
+
9
+ export default class QuoteNode extends BlocksNode {
10
+ readonly #credit: FormatNode;
11
+ readonly #position: Position;
12
+
13
+ constructor(
14
+ elements: BlockNode[],
15
+ credit?: FormatNode,
16
+ position: Position = '|'
17
+ ) {
18
+ super(elements);
19
+
20
+ this.#position = position;
21
+ this.#credit =
22
+ credit === undefined
23
+ ? new FormatNode('', [new TextNode()])
24
+ : credit.withTextIfEmpty();
25
+ }
26
+
27
+ getType() {
28
+ return 'quote';
29
+ }
30
+
31
+ getCredit() {
32
+ return this.#credit;
33
+ }
34
+ getPosition() {
35
+ return this.#position;
36
+ }
37
+
38
+ getFormats() {
39
+ return [this.#credit];
40
+ }
41
+
42
+ toText(): string {
43
+ return (
44
+ this.getBlocks()
45
+ .map((element) => element.toText())
46
+ .join(' ') + (this.#credit ? ' ' + this.#credit.toText() : '')
47
+ );
48
+ }
49
+
50
+ toBookdown(): string {
51
+ return `"\n${this.getBlocks()
52
+ .map((element) => element.toBookdown())
53
+ .join('\n\n')}\n"${this.#position === '|' ? '' : this.#position}${
54
+ this.#credit ? this.#credit.toBookdown() : ''
55
+ }`;
56
+ }
57
+ toHTML() {
58
+ return `"${super.toHTML()}"<center>${this.#credit.toHTML()}</center>`;
59
+ }
60
+
61
+ getChildren(): Node[] {
62
+ return [...this.getBlocks(), this.#credit];
63
+ }
64
+
65
+ getParentOf(node: Node): Node | undefined {
66
+ if (node === this.#credit) return this;
67
+ const creditParent = this.#credit.getParentOf(node);
68
+ if (creditParent !== undefined) return creditParent;
69
+ return super.getParentOf(node);
70
+ }
71
+
72
+ copy() {
73
+ return new QuoteNode(this.getBlocks().map((b) => b.copy())) as this;
74
+ }
75
+ create(blocks: BlockNode[]): BlocksNode {
76
+ return new QuoteNode(blocks, this.#credit, this.#position);
77
+ }
78
+
79
+ withChildReplaced(
80
+ node: BlockNode | FormatNode,
81
+ replacement: BlockNode | FormatNode | undefined
82
+ ) {
83
+ // Replace the credit.
84
+ if (
85
+ this.#credit === node &&
86
+ (replacement instanceof FormatNode || replacement === undefined)
87
+ )
88
+ return new QuoteNode(
89
+ this.getBlocks(),
90
+ replacement,
91
+ this.#position
92
+ ) as this;
93
+
94
+ // Replace a block.
95
+ if (replacement !== undefined && !(replacement instanceof BlockNode))
96
+ return;
97
+ const index = this.getBlocks().indexOf(node as BlockNode);
98
+ if (index < 0) return;
99
+
100
+ // Make a new blocks node, assigning and re-parenting the replacement.
101
+ const blocks =
102
+ replacement === undefined
103
+ ? [
104
+ ...this.getBlocks().slice(0, index),
105
+ ...this.getBlocks().slice(index + 1),
106
+ ]
107
+ : [
108
+ ...this.getBlocks().slice(0, index),
109
+ replacement,
110
+ ...this.getBlocks().slice(index + 1),
111
+ ];
112
+
113
+ return new QuoteNode(blocks, this.#credit, this.#position) as this;
114
+ }
115
+
116
+ withCredit(credit: FormatNode | undefined): QuoteNode {
117
+ return new QuoteNode(this.getBlocks(), credit, this.#position);
118
+ }
119
+ withPosition(position: Position): QuoteNode {
120
+ return new QuoteNode(this.getBlocks(), this.#credit, position);
121
+ }
122
+
123
+ withContentInRange(range: CaretRange): this | undefined {
124
+ // First get the blocks in range.
125
+ const newQuote = super.withContentInRange(range);
126
+ if (newQuote === undefined) return;
127
+
128
+ const newCredit =
129
+ this.getBlocks().find((b) => b.contains(range.end.node)) !==
130
+ undefined
131
+ ? new FormatNode('', [new TextNode()])
132
+ : this.#credit.withContentInRange(range);
133
+ return newQuote.withNodeReplaced(this.#credit, newCredit) as this;
134
+ }
135
+ }
@@ -1,5 +1,7 @@
1
1
  import type ChapterNode from './ChapterNode';
2
2
  import type EmbedNode from './EmbedNode';
3
3
  import type FormatNode from './FormatNode';
4
+
5
+ // Beware: BookishEditor checks for each of these in order to undo/redo. If you change this, check it's undo/redo logic too.
4
6
  type RootNode = ChapterNode | FormatNode | EmbedNode;
5
7
  export default RootNode;
@@ -1,36 +1,39 @@
1
+ import type Node from './Node';
1
2
  import BlockNode from './BlockNode';
3
+
2
4
  export default class RuleNode extends BlockNode {
3
5
  constructor() {
4
6
  super();
5
7
  }
8
+
6
9
  getType() {
7
10
  return 'rule';
8
11
  }
9
- toText() {
12
+ toText(): string {
10
13
  return '';
11
14
  }
12
- toBookdown() {
15
+ toBookdown(): string {
13
16
  return '-';
14
17
  }
15
18
  toHTML() {
16
19
  return `<hr/>`;
17
20
  }
18
- getParentOf() {
21
+ getParentOf(): Node | undefined {
19
22
  return undefined;
20
23
  }
21
24
  getFormats() {
22
25
  return [];
23
26
  }
24
- getChildren() {
27
+ getChildren(): Node[] {
25
28
  return [];
26
29
  }
27
30
  copy() {
28
- return new RuleNode();
31
+ return new RuleNode() as this;
29
32
  }
30
33
  withChildReplaced() {
31
34
  return undefined;
32
35
  }
33
- withContentInRange() {
36
+ withContentInRange(): this | undefined {
34
37
  return this.copy();
35
38
  }
36
39
  }
@@ -1,28 +1,45 @@
1
1
  import { test, expect } from 'vitest';
2
+
2
3
  import FormatNode from './FormatNode';
3
4
  import TextNode from './TextNode';
4
5
  import TableNode from './TableNode';
6
+
5
7
  const tl = new FormatNode('', [new TextNode('tl')]);
6
8
  const tr = new FormatNode('', [new TextNode('tr')]);
7
9
  const bl = new FormatNode('', [new TextNode('bl')]);
8
10
  const br = new FormatNode('', [new TextNode('br')]);
9
11
  const caption = new FormatNode('', [new TextNode('hi')]);
10
- const table = new TableNode([
11
- [tl, tr],
12
- [bl, br],
13
- ], '|', caption);
12
+ const table = new TableNode(
13
+ [
14
+ [tl, tr],
15
+ [bl, br],
16
+ ],
17
+ '|',
18
+ caption
19
+ );
20
+
14
21
  test('Replace', () => {
15
- expect(table
16
- .withChildReplaced(tl, new FormatNode('', [new TextNode('new')]))
17
- ?.toBookdown()).toBe(',new|tr\n,bl|br\nhi');
18
- expect(table
19
- .withChildReplaced(caption, new FormatNode('', [new TextNode('bye')]))
20
- ?.toBookdown()).toBe(',tl|tr\n,bl|br\nbye');
22
+ expect(
23
+ table
24
+ .withChildReplaced(tl, new FormatNode('', [new TextNode('new')]))
25
+ ?.toBookdown()
26
+ ).toBe(',new|tr\n,bl|br\nhi');
27
+
28
+ expect(
29
+ table
30
+ .withChildReplaced(
31
+ caption,
32
+ new FormatNode('', [new TextNode('bye')])
33
+ )
34
+ ?.toBookdown()
35
+ ).toBe(',tl|tr\n,bl|br\nbye');
21
36
  });
37
+
22
38
  test('Insert', () => {
23
39
  expect(table.withNewRow(0)?.toBookdown()).toBe(',|\n,tl|tr\n,bl|br\nhi');
24
40
  expect(table.withNewColumn(0)?.toBookdown()).toBe(',|tl|tr\n,|bl|br\nhi');
25
41
  });
42
+
26
43
  test('Delete', () => {
27
44
  expect(table.withoutRow(0)?.toBookdown()).toBe(',bl|br\nhi');
28
45
  expect(table.withoutColumn(0)?.toBookdown()).toBe(',tr\n,br\nhi');
@@ -1,11 +1,22 @@
1
+ import type Node from './Node';
2
+ import type Position from './Position';
1
3
  import FormatNode from './FormatNode';
2
4
  import TextNode from './TextNode';
3
5
  import BlockNode from './BlockNode';
6
+ import type { CaretRange } from './Caret';
7
+
8
+ type Location = { row: number; column: number };
9
+
4
10
  export default class TableNode extends BlockNode {
5
- #rows;
6
- #caption;
7
- #position;
8
- constructor(rows, position, caption) {
11
+ readonly #rows: FormatNode[][];
12
+ readonly #caption: FormatNode;
13
+ readonly #position: Position;
14
+
15
+ constructor(
16
+ rows: FormatNode[][],
17
+ position?: Position,
18
+ caption?: FormatNode
19
+ ) {
9
20
  super();
10
21
  this.#rows = rows.map((r) => r.map((c) => c.withTextIfEmpty()));
11
22
  this.#position = position ? position : '|';
@@ -14,9 +25,11 @@ export default class TableNode extends BlockNode {
14
25
  ? new FormatNode('', [new TextNode()])
15
26
  : caption.withTextIfEmpty();
16
27
  }
28
+
17
29
  getType() {
18
30
  return 'table';
19
31
  }
32
+
20
33
  getRows() {
21
34
  return this.#rows;
22
35
  }
@@ -33,64 +46,81 @@ export default class TableNode extends BlockNode {
33
46
  return this.#caption;
34
47
  }
35
48
  getFormats() {
36
- const formats = [];
37
- this.#rows.forEach((row) => row.forEach((cell) => {
38
- formats.push(cell);
39
- }));
49
+ const formats: FormatNode[] = [];
50
+ this.#rows.forEach((row) =>
51
+ row.forEach((cell) => {
52
+ formats.push(cell);
53
+ })
54
+ );
40
55
  return [...formats, this.#caption];
41
56
  }
42
- getNextCell(format, direction = 1) {
43
- let previous = undefined;
44
- let found = false;
57
+
58
+ getNextCell(format: FormatNode, direction: -1 | 1 = 1) {
59
+ let previous: FormatNode | undefined = undefined;
60
+ let found: boolean = false;
45
61
  for (const row of this.#rows) {
46
62
  for (const cell of row) {
47
- if (found)
48
- return cell;
63
+ if (found) return cell;
49
64
  if (cell === format) {
50
- if (direction > 0)
51
- found = true;
52
- else
53
- return previous;
65
+ if (direction > 0) found = true;
66
+ else return previous;
54
67
  }
55
68
  previous = cell;
56
69
  }
57
70
  }
58
71
  return undefined;
59
72
  }
73
+
60
74
  toText() {
61
75
  return this.#rows
62
76
  .map((row) => row.map((cell) => cell.toText()).join(', '))
63
77
  .join(', ');
64
78
  }
65
- toBookdown() {
66
- return (this.#rows
67
- .map((row) => `,${row.map((cell) => cell.toBookdown()).join('|')}`)
68
- .join('\n') +
69
- `\n${this.#position === '|' ? '' : this.#position}${this.#caption ? '' + this.#caption.toBookdown() : ''}`);
79
+
80
+ toBookdown(): string {
81
+ return (
82
+ this.#rows
83
+ .map(
84
+ (row) =>
85
+ `,${row.map((cell) => cell.toBookdown()).join('|')}`
86
+ )
87
+ .join('\n') +
88
+ `\n${this.#position === '|' ? '' : this.#position}${
89
+ this.#caption ? '' + this.#caption.toBookdown() : ''
90
+ }`
91
+ );
70
92
  }
93
+
71
94
  toHTML() {
72
95
  return `<table><tbody>${this.#rows
73
- .map((row) => `<tr>${row
74
- .map((cell) => `<td>${cell.toHTML()}</td>`)
75
- .join('')}`)
76
- .join('')}</tbody></table><center>${this.#caption.toHTML()}</center>`;
96
+ .map(
97
+ (row) =>
98
+ `<tr>${row
99
+ .map((cell) => `<td>${cell.toHTML()}</td>`)
100
+ .join('')}`
101
+ )
102
+ .join(
103
+ ''
104
+ )}</tbody></table><center>${this.#caption.toHTML()}</center>`;
77
105
  }
106
+
78
107
  getChildren() {
79
108
  const children = [];
80
109
  this.#rows.forEach((row) => row.forEach((cell) => children.push(cell)));
81
110
  children.push(this.#caption);
82
111
  return children;
83
112
  }
84
- locate(format) {
113
+
114
+ locate(format: FormatNode): Location | undefined {
85
115
  for (let r = 0; r < this.#rows.length; r++) {
86
116
  const row = this.#rows[r];
87
117
  for (let c = 0; c < row.length; c++) {
88
- if (row[c] === format)
89
- return { row: r, column: c };
118
+ if (row[c] === format) return { row: r, column: c };
90
119
  }
91
120
  }
92
121
  }
93
- getCell(row, col) {
122
+
123
+ getCell(row: number, col: number): FormatNode | undefined {
94
124
  return row >= 0 &&
95
125
  row < this.#rows.length &&
96
126
  this.#rows.length > 0 &&
@@ -99,33 +129,45 @@ export default class TableNode extends BlockNode {
99
129
  ? this.#rows[row][col]
100
130
  : undefined;
101
131
  }
102
- getParentOf(node) {
132
+
133
+ getParentOf(node: Node): Node | undefined {
103
134
  for (let r = 0; r < this.#rows.length; r++) {
104
135
  const row = this.#rows[r];
105
136
  for (let c = 0; c < row.length; c++) {
106
- if (row[c] === node)
107
- return this;
137
+ if (row[c] === node) return this;
108
138
  const parent = row[c].getParentOf(node);
109
- if (parent !== undefined)
110
- return parent;
139
+ if (parent !== undefined) return parent;
111
140
  }
112
141
  }
113
142
  return node === this.#caption ? this : this.#caption.getParentOf(node);
114
143
  }
144
+
115
145
  copy() {
116
- const rows = [];
146
+ const rows: FormatNode[][] = [];
117
147
  this.#rows.forEach((row) => {
118
- const cells = [];
148
+ const cells: FormatNode[] = [];
119
149
  row.forEach((cell) => cells.push(cell.copy()));
120
150
  rows.push(cells);
121
151
  });
122
- return new TableNode(rows, this.#position, this.#caption ? this.#caption.copy() : undefined);
152
+ return new TableNode(
153
+ rows,
154
+ this.#position,
155
+ this.#caption ? this.#caption.copy() : undefined
156
+ ) as this;
123
157
  }
124
- withChildReplaced(node, replacement) {
158
+
159
+ withChildReplaced(node: FormatNode, replacement: FormatNode | undefined) {
125
160
  // If it's just the caption, make a new node with the new credit.
126
- if (node === this.#caption &&
127
- (replacement instanceof FormatNode || replacement === undefined))
128
- return new TableNode(this.#rows, this.#position, replacement);
161
+ if (
162
+ node === this.#caption &&
163
+ (replacement instanceof FormatNode || replacement === undefined)
164
+ )
165
+ return new TableNode(
166
+ this.#rows,
167
+ this.#position,
168
+ replacement
169
+ ) as this;
170
+
129
171
  // If it's a cell, update the cell.
130
172
  if (node instanceof FormatNode && replacement instanceof FormatNode) {
131
173
  // Does this table contain node we're replacing?
@@ -133,49 +175,59 @@ export default class TableNode extends BlockNode {
133
175
  let updateColumn = -1;
134
176
  for (; updateRow < this.#rows.length; updateRow++) {
135
177
  updateColumn = this.#rows[updateRow].indexOf(node);
136
- if (updateColumn >= 0)
137
- break;
178
+ if (updateColumn >= 0) break;
138
179
  }
180
+
139
181
  // Make new rows with the updated cell.
140
182
  if (updateRow < this.#rows.length && updateColumn >= 0) {
141
183
  const newRows = this.#rows.map((row) => [...row]);
142
184
  newRows[updateRow][updateColumn] = replacement;
143
- return new TableNode(newRows, this.#position, this.#caption);
185
+ return new TableNode(
186
+ newRows,
187
+ this.#position,
188
+ this.#caption
189
+ ) as this;
144
190
  }
145
191
  }
146
192
  }
147
- withNewRow(index) {
148
- if (index < 0 || index > this.#rows.length)
149
- return;
193
+
194
+ withNewRow(index: number): TableNode | undefined {
195
+ if (index < 0 || index > this.#rows.length) return;
196
+
150
197
  // Figure out how many columns the first row has, then create a row with that many columns
151
198
  // and an empty FormatNode.
152
199
  const columnCount = this.#rows.length === 0 ? 0 : this.#rows[0].length;
153
- const column = [];
200
+ const column: FormatNode[] = [];
201
+
154
202
  for (let c = 0; c < columnCount; c++)
155
203
  column.push(new FormatNode('', [new TextNode()]));
204
+
156
205
  const newRows = this.#rows.slice();
157
206
  newRows.splice(index, 0, column);
158
207
  return new TableNode(newRows, this.#position, this.#caption);
159
208
  }
160
- withoutRow(index) {
161
- if (index < 0 || index >= this.#rows.length)
162
- return;
209
+
210
+ withoutRow(index: number): TableNode | undefined {
211
+ if (index < 0 || index >= this.#rows.length) return;
163
212
  const newRows = this.#rows.slice();
164
213
  newRows.splice(index, 1);
165
214
  return new TableNode(newRows, this.#position, this.#caption);
166
215
  }
167
- withoutColumn(index) {
168
- if (index < 0 || index >= this.getColumnCount())
169
- return;
216
+
217
+ withoutColumn(index: number): TableNode | undefined {
218
+ if (index < 0 || index >= this.getColumnCount()) return;
170
219
  const newRows = this.#rows.slice();
171
- for (let r = 0; r < this.#rows.length; r++)
172
- newRows[r].splice(index, 1);
220
+ for (let r = 0; r < this.#rows.length; r++) newRows[r].splice(index, 1);
173
221
  return new TableNode(newRows, this.#position, this.#caption);
174
222
  }
175
- withNewColumn(index) {
176
- if (this.#rows.length > 0 &&
177
- (index < 0 || index > this.#rows[0].length))
223
+
224
+ withNewColumn(index: number): TableNode | undefined {
225
+ if (
226
+ this.#rows.length > 0 &&
227
+ (index < 0 || index > this.#rows[0].length)
228
+ )
178
229
  return;
230
+
179
231
  // Figure out how many rows the table has and add a column
180
232
  const newRows = this.#rows.slice();
181
233
  for (let r = 0; r < this.#rows.length; r++) {
@@ -184,48 +236,55 @@ export default class TableNode extends BlockNode {
184
236
  }
185
237
  return new TableNode(newRows, this.#position, this.#caption);
186
238
  }
187
- withContentInRange(range) {
239
+
240
+ withContentInRange(range: CaretRange): this | undefined {
188
241
  const containsStart = this.contains(range.start.node);
189
242
  const containsEnd = this.contains(range.end.node);
190
- if (!containsStart && !containsEnd)
191
- return this.copy();
243
+ if (!containsStart && !containsEnd) return this.copy();
244
+
192
245
  // If it contains the start, skip rows until we find the cell with the start node.
193
246
  // If it contains the end, skip rows after we find the cell with the end node.
194
- let r = 0, c = 0;
247
+ let r = 0,
248
+ c = 0;
195
249
  let foundStart = false;
196
250
  let foundEnd = false;
197
- let newRows = [];
251
+ let newRows: FormatNode[][] = [];
198
252
  for (; r < this.#rows.length; r++, c = 0) {
199
253
  const row = this.#rows[r];
254
+
200
255
  // Skip this row if this table contains the start node and we haven't found it and the row doesn't contain it
201
- if (containsStart &&
256
+ if (
257
+ containsStart &&
202
258
  !foundStart &&
203
- row.find((r) => r.contains(range.start.node)) === undefined)
259
+ row.find((r) => r.contains(range.start.node)) === undefined
260
+ )
204
261
  continue;
205
262
  // Stop if we found the end row.
206
- if (containsEnd && foundEnd)
207
- break;
208
- newRows.push([]);
263
+ if (containsEnd && foundEnd) break;
264
+
265
+ newRows.push([] as FormatNode[]);
209
266
  for (; c < row.length; c++) {
210
267
  if (!foundStart && row[c].contains(range.start.node))
211
268
  foundStart = true;
212
269
  const newCell = row[c].withContentInRange(range);
213
- if (newCell === undefined)
214
- return;
215
- newRows[newRows.length - 1].push(((containsStart && foundStart) || !containsStart) &&
216
- ((containsEnd && !foundEnd) || !containsEnd)
217
- ? newCell
218
- : new FormatNode('', [new TextNode()]));
219
- if (row[c].contains(range.end.node))
220
- foundEnd = true;
270
+ if (newCell === undefined) return;
271
+ newRows[newRows.length - 1].push(
272
+ ((containsStart && foundStart) || !containsStart) &&
273
+ ((containsEnd && !foundEnd) || !containsEnd)
274
+ ? newCell
275
+ : new FormatNode('', [new TextNode()])
276
+ );
277
+ if (row[c].contains(range.end.node)) foundEnd = true;
221
278
  }
222
279
  }
280
+
223
281
  const newCaption = this.#caption.withContentInRange(range);
224
- if (newCaption === undefined)
225
- return;
226
- return new TableNode(newRows, this.#position, newCaption);
282
+ if (newCaption === undefined) return;
283
+
284
+ return new TableNode(newRows, this.#position, newCaption) as this;
227
285
  }
228
- withPosition(position) {
286
+
287
+ withPosition(position: Position) {
229
288
  return new TableNode(this.#rows, position, this.#caption);
230
289
  }
231
290
  }
@@ -1,5 +1,7 @@
1
1
  import { test, expect } from 'vitest';
2
+
2
3
  import TextNode from './TextNode';
4
+
3
5
  test('Insert character', () => {
4
6
  const text = new TextNode('Hello');
5
7
  expect(text.withCharacterAt('!', 5)?.toBookdown()).toBe('Hello!');