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
@@ -1,28 +1,41 @@
1
+ import type Node from './Node';
1
2
  import FormatNode from './FormatNode';
2
- import { caretToIndex, indexToCaret } from './Caret';
3
+ import type { Format } from './FormatNode';
4
+ import type Caret from './Caret';
5
+ import { caretToIndex, indexToCaret, type CaretRange } from './Caret';
3
6
  import BlockNode from './BlockNode';
7
+ import type Edit from './Edit';
8
+
9
+ export type ListNodeType = FormatNode | ListNode;
10
+
4
11
  export default class ListNode extends BlockNode {
5
- #numbered;
6
- #items;
7
- constructor(items, numbered) {
12
+ readonly #numbered: boolean;
13
+ readonly #items: ListNodeType[];
14
+
15
+ constructor(items: Array<FormatNode | ListNode>, numbered: boolean) {
8
16
  super();
9
17
  this.#numbered = numbered;
18
+
10
19
  let adjustedItems = items
11
20
  // Make sure all format nodes have an empty text.
12
21
  .map((i) => (i instanceof FormatNode ? i.withTextIfEmpty() : i))
13
22
  // Strip all empty sublists.
14
23
  .filter((i) => !i.isEmpty());
24
+
15
25
  this.#items = adjustedItems;
16
26
  }
27
+
17
28
  getType() {
18
29
  return 'list';
19
30
  }
20
31
  isNumbered() {
21
32
  return this.#numbered;
22
33
  }
23
- isEmpty() {
24
- return (this.#items.length === 0 ||
25
- this.#items.every((i) => i instanceof ListNode && i.isEmpty()));
34
+ isEmpty(): boolean {
35
+ return (
36
+ this.#items.length === 0 ||
37
+ this.#items.every((i) => i instanceof ListNode && i.isEmpty())
38
+ );
26
39
  }
27
40
  getItems() {
28
41
  return this.#items;
@@ -31,240 +44,278 @@ export default class ListNode extends BlockNode {
31
44
  return this.#items;
32
45
  }
33
46
  getListItems() {
34
- return this.#items.filter((i) => i instanceof ListNode);
47
+ return this.#items.filter((i) => i instanceof ListNode) as ListNode[];
35
48
  }
36
49
  getLength() {
37
50
  return this.#items.length;
38
51
  }
39
- getLastItem() {
52
+ getLastItem(): FormatNode | undefined {
40
53
  return this.getFirstLastItem(false);
41
54
  }
42
- getFirstItem() {
55
+ getFirstItem(): FormatNode | undefined {
43
56
  return this.getFirstLastItem(true);
44
57
  }
45
- getFormats() {
46
- return this.#items.reduce((previous, current) => previous.concat(current instanceof FormatNode
47
- ? [current]
48
- : current.getFormats()), []);
49
- }
50
- getFirstLastItem(first) {
51
- if (this.#items.length === 0)
52
- return undefined;
58
+ getFormats(): FormatNode[] {
59
+ return this.#items.reduce(
60
+ (previous: FormatNode[], current: ListNodeType) =>
61
+ previous.concat(
62
+ current instanceof FormatNode
63
+ ? [current]
64
+ : current.getFormats()
65
+ ),
66
+ []
67
+ ) as FormatNode[];
68
+ }
69
+ getFirstLastItem(first: boolean): FormatNode | undefined {
70
+ if (this.#items.length === 0) return undefined;
71
+
53
72
  // If it's a format, return it.
54
73
  const last = this.#items[first ? 0 : this.getLength() - 1];
55
- if (last instanceof FormatNode)
56
- return last;
74
+ if (last instanceof FormatNode) return last;
75
+
57
76
  // Otherwise, recurse into the last item's list.
58
77
  return last.getFirstLastItem(first);
59
78
  }
60
- getLevel(root) {
79
+
80
+ getLevel(root: Node): number {
61
81
  const parent = root.getParentOf(this);
62
- if (parent instanceof ListNode)
63
- return parent.getLevel(root) + 1;
64
- else
65
- return 1;
82
+ if (parent instanceof ListNode) return parent.getLevel(root) + 1;
83
+ else return 1;
66
84
  }
67
- toText() {
85
+
86
+ toText(): string {
68
87
  return this.#items.map((item) => item.toText()).join(' ');
69
88
  }
70
- toBookdown(level = 1) {
89
+
90
+ toBookdown(level: number = 1): string {
71
91
  return this.isNumbered()
72
92
  ? this.#items
73
- .map((item, number) => (item instanceof ListNode
74
- ? ''
75
- : number + 1 + '.'.repeat(level) + ' ') +
76
- item.toBookdown(level + 1))
77
- .join('\n')
93
+ .map(
94
+ (item, number) =>
95
+ (item instanceof ListNode
96
+ ? ''
97
+ : number + 1 + '.'.repeat(level) + ' ') +
98
+ item.toBookdown(level + 1)
99
+ )
100
+ .join('\n')
78
101
  : this.#items
79
- .map((item) => (item instanceof ListNode
80
- ? ''
81
- : '*'.repeat(level) + ' ') +
82
- item.toBookdown(level + 1))
83
- .join('\n');
84
- }
85
- toHTML() {
102
+ .map(
103
+ (item) =>
104
+ (item instanceof ListNode
105
+ ? ''
106
+ : '*'.repeat(level) + ' ') +
107
+ item.toBookdown(level + 1)
108
+ )
109
+ .join('\n');
110
+ }
111
+
112
+ toHTML(): string {
86
113
  return this.isNumbered()
87
114
  ? `<ol>${this.#items
88
- .map((i) => `<li>${i.toHTML()}</li>`)
89
- .join('')}</ol>`
115
+ .map((i) => `<li>${i.toHTML()}</li>`)
116
+ .join('')}</ol>`
90
117
  : `<ul>${this.#items
91
- .map((i) => `<li>${i.toHTML()}</li>`)
92
- .join('')}</ul>`;
118
+ .map((i) => `<li>${i.toHTML()}</li>`)
119
+ .join('')}</ul>`;
93
120
  }
94
- getParentOf(node) {
121
+
122
+ getParentOf(node: Node): Node | undefined {
95
123
  return this.#items
96
124
  .map((b) => (b === node ? this : b.getParentOf(node)))
97
125
  .find((b) => b !== undefined);
98
126
  }
99
- atBeginningOfItem(root, caret) {
100
- const format = caret.node.getFarthestParentMatching(root, (n) => n instanceof FormatNode);
101
- return (format !== undefined &&
127
+
128
+ atBeginningOfItem(root: Node, caret: Caret) {
129
+ const format = caret.node.getFarthestParentMatching(
130
+ root,
131
+ (n) => n instanceof FormatNode
132
+ ) as FormatNode;
133
+
134
+ return (
135
+ format !== undefined &&
102
136
  caret.node.hasAncestor(root, this) &&
103
137
  caret.index === 0 &&
104
- format.getTextNodes()[0] === caret.node);
105
- }
106
- getItemContaining(caret) {
107
- const match = this.#items.find((n) => n.getParentOf(caret.node) !== undefined);
108
- if (match === undefined)
109
- return undefined;
138
+ format.getTextNodes()[0] === caret.node
139
+ );
140
+ }
141
+
142
+ getItemContaining(caret: Caret): number | undefined {
143
+ const match = this.#items.find(
144
+ (n) => n.getParentOf(caret.node) !== undefined
145
+ );
146
+ if (match === undefined) return undefined;
110
147
  const index = this.#items.indexOf(match);
111
- if (index === undefined)
112
- return undefined;
148
+ if (index === undefined) return undefined;
113
149
  return index;
114
150
  }
115
- getItem(index) {
116
- if (index < 0 || index >= this.#items.length)
117
- return;
151
+
152
+ getItem(index: number): ListNodeType | undefined {
153
+ if (index < 0 || index >= this.#items.length) return;
118
154
  return this.#items[index];
119
155
  }
120
- getFirstCaret() {
156
+
157
+ getFirstCaret(): Caret | undefined {
121
158
  return this.#items.length === 0
122
159
  ? undefined
123
160
  : this.#items[0].getFirstCaret();
124
161
  }
125
- copy() {
126
- return new ListNode(this.#items.map((i) => i.copy()), this.#numbered);
162
+
163
+ copy(): this {
164
+ return new ListNode(
165
+ this.#items.map((i) => i.copy()),
166
+ this.#numbered
167
+ ) as this;
127
168
  }
128
- withStyle(numbered) {
169
+
170
+ withStyle(numbered: boolean) {
129
171
  return new ListNode(this.#items, numbered);
130
172
  }
131
- withItemAppended(item) {
173
+
174
+ withItemAppended(item: ListNodeType): ListNode {
132
175
  return new ListNode([...this.#items, item], this.#numbered);
133
176
  }
134
- withItemPrepended(item) {
177
+
178
+ withItemPrepended(item: ListNodeType): ListNode {
135
179
  return new ListNode([item, ...this.#items], this.#numbered);
136
180
  }
137
- withItemAt(item, index) {
138
- if (index < 0 || index > this.#items.length)
139
- return;
181
+
182
+ withItemAt(item: ListNodeType, index: number): ListNode | undefined {
183
+ if (index < 0 || index > this.#items.length) return;
140
184
  const newItems = this.#items.slice();
141
185
  newItems.splice(index, 0, item);
142
186
  return new ListNode(newItems, this.#numbered);
143
187
  }
144
- withItemAfter(item, anchor) {
188
+
189
+ withItemAfter(
190
+ item: ListNodeType,
191
+ anchor: ListNodeType
192
+ ): ListNode | undefined {
145
193
  const index = this.#items.indexOf(anchor);
146
- if (index < 0)
147
- return;
194
+ if (index < 0) return;
148
195
  return this.withItemAt(item, index + 1);
149
196
  }
150
- withItemBefore(item, anchor) {
197
+
198
+ withItemBefore(item: ListNodeType, anchor: ListNodeType) {
151
199
  const index = this.#items.indexOf(anchor);
152
- if (index < 0)
153
- return;
200
+ if (index < 0) return;
154
201
  return this.withItemAt(item, index);
155
202
  }
156
- withItemReplaced(index, item) {
157
- if (index < 0 || index >= this.#items.length)
158
- return;
203
+
204
+ withItemReplaced(index: number, item: ListNodeType): ListNode | undefined {
205
+ if (index < 0 || index >= this.#items.length) return;
159
206
  const newItems = this.#items.slice();
160
207
  newItems[index] = item;
161
208
  return new ListNode(newItems, this.#numbered);
162
209
  }
163
- withoutItemAt(index) {
164
- if (index < 0 || index >= this.#items.length)
165
- return;
210
+
211
+ withoutItemAt(index: number): ListNode | undefined {
212
+ if (index < 0 || index >= this.#items.length) return;
166
213
  const newItems = this.#items.slice();
167
214
  newItems.splice(index, 1);
168
215
  return new ListNode(newItems, this.#numbered);
169
216
  }
170
- withoutItem(item) {
217
+
218
+ withoutItem(item: FormatNode): ListNode | undefined {
171
219
  const index = this.#items.indexOf(item);
172
- if (index < 0)
173
- return;
220
+ if (index < 0) return;
174
221
  return this.withoutItemAt(index);
175
222
  }
176
- withListAppended(list) {
223
+
224
+ withListAppended(list: ListNode): ListNode {
177
225
  return new ListNode([...this.#items, ...list.#items], this.#numbered);
178
226
  }
179
- withItemMergedBackwards(index) {
180
- if (index <= 0 || index >= this.#items.length)
181
- return;
227
+
228
+ withItemMergedBackwards(index: number): [ListNode, Caret] | undefined {
229
+ if (index <= 0 || index >= this.#items.length) return;
230
+
182
231
  const deletedItem = this.#items[index];
183
232
  let previousItem = this.#items[index - 1];
233
+
184
234
  // If we're merging a sublist back into this list, move its
185
235
  // remaining format into the previous item.
186
236
  if (deletedItem instanceof ListNode) {
187
- if (previousItem instanceof ListNode)
188
- return;
237
+ if (previousItem instanceof ListNode) return;
189
238
  const itemToMerge = deletedItem.getFirstItem();
190
- if (itemToMerge === undefined)
191
- return;
192
- const newSubList = deletedItem.withChildReplaced(itemToMerge, undefined);
193
- if (newSubList === undefined)
194
- return;
195
- const listWithRevisedSublist = this.withChildReplaced(deletedItem, newSubList);
196
- if (listWithRevisedSublist === undefined)
197
- return;
239
+ if (itemToMerge === undefined) return;
240
+ const newSubList = deletedItem.withChildReplaced(
241
+ itemToMerge,
242
+ undefined
243
+ );
244
+ if (newSubList === undefined) return;
245
+ const listWithRevisedSublist = this.withChildReplaced(
246
+ deletedItem,
247
+ newSubList
248
+ );
249
+ if (listWithRevisedSublist === undefined) return;
198
250
  const lastCaret = previousItem.getLastCaret();
199
- if (lastCaret === undefined)
200
- return;
251
+ if (lastCaret === undefined) return;
201
252
  const textIndex = caretToIndex(previousItem, lastCaret);
202
- if (textIndex === undefined)
203
- return;
253
+ if (textIndex === undefined) return;
204
254
  const mergedItem = previousItem.withSegmentsAppended(itemToMerge);
205
- const listWithMergedItem = listWithRevisedSublist.withChildReplaced(previousItem, mergedItem);
206
- if (listWithMergedItem === undefined)
207
- return;
255
+ const listWithMergedItem = listWithRevisedSublist.withChildReplaced(
256
+ previousItem,
257
+ mergedItem
258
+ );
259
+ if (listWithMergedItem === undefined) return;
208
260
  const newCaret = indexToCaret(mergedItem, textIndex);
209
- if (newCaret === undefined)
210
- return;
261
+ if (newCaret === undefined) return;
211
262
  return [listWithMergedItem, newCaret];
212
263
  }
213
264
  // If the previous item is a list, find it's last item.
214
265
  else if (previousItem instanceof ListNode) {
215
266
  const lastItem = previousItem.getLastItem();
216
- if (lastItem === undefined)
217
- return;
267
+ if (lastItem === undefined) return;
218
268
  const lastCaret = lastItem.getLastCaret();
219
- if (lastCaret === undefined)
220
- return;
269
+ if (lastCaret === undefined) return;
221
270
  const newCaretIndex = caretToIndex(lastItem, lastCaret);
222
- if (newCaretIndex === undefined)
223
- return;
271
+ if (newCaretIndex === undefined) return;
224
272
  const mergedItem = lastItem.withSegmentsAppended(deletedItem);
225
- const newSublist = previousItem.withChildReplaced(lastItem, mergedItem);
226
- if (newSublist === undefined)
227
- return;
228
- const newList = this.withChildReplaced(previousItem, newSublist)?.withoutItemAt(index);
229
- if (newList === undefined)
230
- return;
273
+ const newSublist = previousItem.withChildReplaced(
274
+ lastItem,
275
+ mergedItem
276
+ );
277
+ if (newSublist === undefined) return;
278
+ const newList = this.withChildReplaced(
279
+ previousItem,
280
+ newSublist
281
+ )?.withoutItemAt(index);
282
+ if (newList === undefined) return;
231
283
  const newCaret = indexToCaret(mergedItem, newCaretIndex);
232
- if (newCaret === undefined)
233
- return;
284
+ if (newCaret === undefined) return;
234
285
  return [newList, newCaret];
235
- }
236
- else {
286
+ } else {
237
287
  const lastCaret = previousItem.getLastCaret();
238
- if (lastCaret === undefined)
239
- return;
288
+ if (lastCaret === undefined) return;
240
289
  const newCaretIndex = caretToIndex(previousItem, lastCaret);
241
- if (newCaretIndex === undefined)
242
- return;
290
+ if (newCaretIndex === undefined) return;
243
291
  const mergedItem = previousItem.withSegmentsAppended(deletedItem);
244
- const newList = this.withItemReplaced(index - 1, mergedItem)?.withoutItemAt(index);
245
- if (newList === undefined)
246
- return;
292
+ const newList = this.withItemReplaced(
293
+ index - 1,
294
+ mergedItem
295
+ )?.withoutItemAt(index);
296
+ if (newList === undefined) return;
247
297
  const newCaret = indexToCaret(mergedItem, newCaretIndex);
248
- if (newCaret === undefined)
249
- return;
298
+ if (newCaret === undefined) return;
250
299
  return [newList, newCaret];
251
300
  }
252
301
  }
253
- withItemSplit(caret) {
302
+
303
+ withItemSplit(caret: Caret): ListNode | undefined {
254
304
  // Which item contains the caret?
255
- const item = this.#items.find((i) => i instanceof FormatNode && i.contains(caret.node));
256
- if (item === undefined)
257
- return;
305
+ const item = this.#items.find(
306
+ (i) => i instanceof FormatNode && i.contains(caret.node)
307
+ ) as FormatNode | undefined;
308
+ if (item === undefined) return;
258
309
  const parts = item.split(caret);
259
- if (parts === undefined)
260
- return;
310
+ if (parts === undefined) return;
261
311
  const [first, second] = parts;
262
312
  return this.withItemAfter(second, item)
263
313
  ?.withItemAfter(first, item)
264
314
  ?.withoutItem(item);
265
315
  }
316
+
266
317
  // Recursively search for the given item and indent it, constructing a new list.
267
- withItemIndented(format) {
318
+ withItemIndented(format: FormatNode): ListNode | undefined {
268
319
  // Check each item in the list to see if it matches...
269
320
  for (let index = 0; index < this.#items.length; index++) {
270
321
  const item = this.#items[index];
@@ -274,13 +325,22 @@ export default class ListNode extends BlockNode {
274
325
  const afterList = this.#items[index + 1];
275
326
  // If the format is just after a list, move the format to the end of the list.
276
327
  if (beforeList instanceof ListNode)
277
- return this.withItemReplaced(index - 1, beforeList.withItemAppended(format))?.withoutItemAt(index);
328
+ return this.withItemReplaced(
329
+ index - 1,
330
+ beforeList.withItemAppended(format)
331
+ )?.withoutItemAt(index);
278
332
  // If the format is just before a list, move the format to the beginning of the list.
279
333
  else if (afterList instanceof ListNode)
280
- return this.withItemReplaced(index + 1, afterList.withItemPrepended(format))?.withoutItemAt(index);
334
+ return this.withItemReplaced(
335
+ index + 1,
336
+ afterList.withItemPrepended(format)
337
+ )?.withoutItemAt(index);
281
338
  // Otherwise, make a new sub list node, add the format to it.
282
339
  else
283
- return this.withItemReplaced(index, new ListNode([format], this.#numbered));
340
+ return this.withItemReplaced(
341
+ index,
342
+ new ListNode([format], this.#numbered)
343
+ );
284
344
  }
285
345
  // If this is a sublist, see if it contains the item, and if so,
286
346
  // replace this list with list that has the item indented.
@@ -292,8 +352,9 @@ export default class ListNode extends BlockNode {
292
352
  }
293
353
  // Otherwise, return nothing.
294
354
  }
355
+
295
356
  // Recursively search for the item and unindent it, constructing a new list.
296
- withItemUnindented(format) {
357
+ withItemUnindented(format: FormatNode): ListNode | undefined {
297
358
  // Check each sublist in the list to see if any has the item so we can unindent it into this.
298
359
  for (let index = 0; index < this.#items.length; index++) {
299
360
  const list = this.#items[index];
@@ -301,14 +362,18 @@ export default class ListNode extends BlockNode {
301
362
  const match = list.#items.indexOf(format);
302
363
  // If we found it in this sublist, extract it here!
303
364
  if (match >= 0) {
304
- const before = new ListNode(list.#items.slice(0, match), this.#numbered);
305
- const after = new ListNode(list.#items.slice(match + 1), this.#numbered);
306
- let newItems = this.#items.slice(0, index);
307
- if (before.getLength() > 0)
308
- newItems.push(before);
365
+ const before = new ListNode(
366
+ list.#items.slice(0, match),
367
+ this.#numbered
368
+ );
369
+ const after = new ListNode(
370
+ list.#items.slice(match + 1),
371
+ this.#numbered
372
+ );
373
+ let newItems: ListNodeType[] = this.#items.slice(0, index);
374
+ if (before.getLength() > 0) newItems.push(before);
309
375
  newItems.push(format);
310
- if (after.getLength() > 0)
311
- newItems.push(after);
376
+ if (after.getLength() > 0) newItems.push(after);
312
377
  newItems = newItems.concat(this.#items.slice(index + 1));
313
378
  return new ListNode(newItems, this.#numbered);
314
379
  }
@@ -322,60 +387,66 @@ export default class ListNode extends BlockNode {
322
387
  }
323
388
  // Otherwise, return nothing, indicating no match.
324
389
  }
325
- withChildReplaced(node, replacement) {
390
+
391
+ withChildReplaced(
392
+ node: ListNodeType,
393
+ replacement: ListNodeType | undefined
394
+ ): this | undefined {
326
395
  const index = this.#items.indexOf(node);
327
- if (index < 0)
328
- return;
329
- return new ListNode(replacement === undefined
330
- ? [
331
- ...this.#items.slice(0, index),
332
- ...this.#items.slice(index + 1),
333
- ]
334
- : [
335
- ...this.#items.slice(0, index),
336
- replacement,
337
- ...this.#items.slice(index + 1),
338
- ], this.#numbered);
339
- }
340
- withContentInRange(range) {
396
+ if (index < 0) return;
397
+ return new ListNode(
398
+ replacement === undefined
399
+ ? [
400
+ ...this.#items.slice(0, index),
401
+ ...this.#items.slice(index + 1),
402
+ ]
403
+ : [
404
+ ...this.#items.slice(0, index),
405
+ replacement,
406
+ ...this.#items.slice(index + 1),
407
+ ],
408
+ this.#numbered
409
+ ) as this;
410
+ }
411
+
412
+ withContentInRange(range: CaretRange): this | undefined {
341
413
  const containsStart = this.contains(range.start.node);
342
414
  const containsEnd = this.contains(range.end.node);
343
- if (!containsStart && !containsEnd)
344
- return this.copy();
415
+ if (!containsStart && !containsEnd) return this.copy();
416
+
345
417
  const newItems = [];
346
418
  let foundStart = false;
347
419
  let foundEnd = false;
348
420
  for (let i = 0; i < this.#items.length; i++) {
349
- if (this.#items[i].contains(range.start.node))
350
- foundStart = true;
351
- if (((containsStart && foundStart) || !containsStart) &&
352
- ((containsEnd && !foundEnd) || !containsEnd)) {
421
+ if (this.#items[i].contains(range.start.node)) foundStart = true;
422
+ if (
423
+ ((containsStart && foundStart) || !containsStart) &&
424
+ ((containsEnd && !foundEnd) || !containsEnd)
425
+ ) {
353
426
  const newItem = this.#items[i].withContentInRange(range);
354
- if (newItem === undefined)
355
- return;
427
+ if (newItem === undefined) return;
356
428
  newItems.push(newItem);
357
429
  }
358
- if (this.#items[i].contains(range.end.node))
359
- foundEnd = true;
430
+ if (this.#items[i].contains(range.end.node)) foundEnd = true;
360
431
  }
361
- return new ListNode(newItems, this.#numbered);
432
+ return new ListNode(newItems, this.#numbered) as this;
362
433
  }
363
- withNodeInserted(caret, node) {
364
- if (!this.contains(caret.node))
365
- return;
366
- if (!(node instanceof ListNode))
367
- return;
434
+
435
+ withNodeInserted(caret: Caret, node: Node): Edit {
436
+ if (!this.contains(caret.node)) return;
437
+ if (!(node instanceof ListNode)) return;
438
+
368
439
  // Find the anchor item.
369
440
  const anchor = this.#items.find((i) => i.contains(caret.node));
370
- if (anchor === undefined)
371
- return;
441
+ if (anchor === undefined) return;
442
+
372
443
  const items = node.getItems();
444
+
373
445
  let lastItem = anchor;
374
- let newList = this;
446
+ let newList: ListNode | undefined = this;
375
447
  while (items.length > 0) {
376
448
  let item = items.shift();
377
- if (item === undefined)
378
- return;
449
+ if (item === undefined) return;
379
450
  // Insert all of the node's items into this list, merging the first.
380
451
  if (lastItem === anchor) {
381
452
  const edit = anchor.withNodeInserted(caret, item);
@@ -383,49 +454,55 @@ export default class ListNode extends BlockNode {
383
454
  return;
384
455
  item = edit.root;
385
456
  newList = newList.withChildReplaced(anchor, item);
386
- }
387
- else {
457
+ } else {
388
458
  newList = newList.withItemAfter(item, lastItem);
389
459
  }
390
- if (newList === undefined)
391
- return;
460
+ if (newList === undefined) return;
392
461
  // Remember where we inserted.
393
462
  lastItem = item;
394
463
  }
464
+
395
465
  // The caret should be the last item inserted.
396
- const newCaret = lastItem instanceof FormatNode
397
- ? lastItem.getLastCaret()
398
- : lastItem.getLastItem()?.getLastCaret();
399
- if (newCaret === undefined)
400
- return;
466
+ const newCaret =
467
+ lastItem instanceof FormatNode
468
+ ? lastItem.getLastCaret()
469
+ : lastItem.getLastItem()?.getLastCaret();
470
+ if (newCaret === undefined) return;
471
+
401
472
  return { root: newList, range: { start: newCaret, end: newCaret } };
402
473
  }
403
- withRangeFormatted(range, format) {
474
+
475
+ withRangeFormatted(range: CaretRange, format: Format | undefined): Edit {
404
476
  const sortedRange = this.sortRange(range);
405
477
  const itemStart = this.getItemContaining(sortedRange.start);
406
478
  const itemEnd = this.getItemContaining(sortedRange.end);
479
+
407
480
  // This edits all of the formats contained in the range in the list, since the BlockNode class doesn't care about
408
481
  // what formats are stored in.
409
482
  const edit = super.withRangeFormatted(sortedRange, format);
483
+
410
484
  // If we were deleting and two list items were involved, merge them.
411
- if (edit &&
485
+ if (
486
+ edit &&
412
487
  format === undefined &&
413
488
  itemStart !== undefined &&
414
489
  itemEnd !== undefined &&
415
- itemStart !== itemEnd) {
416
- const newList = edit.root;
417
- const itemIndex = itemEnd - (this.#items.length - newList.#items.length);
490
+ itemStart !== itemEnd
491
+ ) {
492
+ const newList = edit.root as ListNode;
493
+ const itemIndex =
494
+ itemEnd - (this.#items.length - newList.#items.length);
418
495
  if (itemIndex > 0 && newList.getLength() > 1) {
419
496
  // Merge the items, accounting for the new index of the last item.
420
497
  const mergedEdit = newList.withItemMergedBackwards(itemIndex);
421
- if (mergedEdit === undefined)
422
- return;
498
+ if (mergedEdit === undefined) return;
423
499
  return {
424
500
  root: mergedEdit[0],
425
501
  range: { start: mergedEdit[1], end: mergedEdit[1] },
426
502
  };
427
503
  }
428
504
  }
505
+
429
506
  return edit;
430
507
  }
431
508
  }