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,13 +1,19 @@
1
+ import type Caret from './Caret';
2
+ import type { CaretRange } from './Caret';
1
3
  import FormatNode from './FormatNode';
2
4
  import Node from './Node';
3
5
  import AtomNode from './AtomNode';
4
6
  import BlocksNode from './BlocksNode';
7
+ import type RootNode from './RootNode';
8
+
5
9
  export default class TextNode extends Node {
6
- #text;
7
- constructor(text = '') {
10
+ readonly #text: string;
11
+
12
+ constructor(text: string = '') {
8
13
  super();
9
14
  this.#text = text;
10
15
  }
16
+
11
17
  getType() {
12
18
  return 'text';
13
19
  }
@@ -20,19 +26,21 @@ export default class TextNode extends Node {
20
26
  getCaretPositionCount() {
21
27
  return this.#text.length;
22
28
  }
23
- getParentOf() {
29
+ getParentOf(): Node | undefined {
24
30
  return undefined;
25
31
  }
26
- getFirstCaret() {
32
+ getFirstCaret(): Caret {
27
33
  return { node: this, index: 0 };
28
34
  }
29
- getLastCaret() {
35
+ getLastCaret(): Caret {
30
36
  return { node: this, index: this.#text.length };
31
37
  }
32
- toText() {
38
+
39
+ toText(): string {
33
40
  return this.#text;
34
41
  }
35
- toBookdown() {
42
+
43
+ toBookdown(): string {
36
44
  // Escape all characters with special meaning inside content nodes: _*`<^{~\[@% and :'s with no space after
37
45
  return this.#text
38
46
  .replace(/\\/g, '\\\\') // This has to go first! Otherwise it breaks all of the others below.
@@ -48,6 +56,7 @@ export default class TextNode extends Node {
48
56
  .replace(/@/g, '\\@')
49
57
  .replace(/(:)([a-z])/g, '\\:$2');
50
58
  }
59
+
51
60
  toHTML() {
52
61
  return this.#text
53
62
  .replace('<', '&lt;')
@@ -56,121 +65,164 @@ export default class TextNode extends Node {
56
65
  .replace('"', '&quot;')
57
66
  .replace("'", '&#39;');
58
67
  }
68
+
59
69
  getChildren() {
60
70
  return [];
61
71
  }
72
+
62
73
  copy() {
63
- return new TextNode(this.#text);
64
- }
65
- isItalic(root) {
66
- return (this.getAncestors(root).filter((p) => p instanceof FormatNode && p.getFormat() === '_').length > 0);
67
- }
68
- isBold(root) {
69
- return (this.getAncestors(root).filter((p) => p instanceof FormatNode && p.getFormat() === '*').length > 0);
70
- }
74
+ return new TextNode(this.#text) as this;
75
+ }
76
+
77
+ isItalic(root: Node) {
78
+ return (
79
+ this.getAncestors(root).filter(
80
+ (p) => p instanceof FormatNode && p.getFormat() === '_'
81
+ ).length > 0
82
+ );
83
+ }
84
+ isBold(root: Node) {
85
+ return (
86
+ this.getAncestors(root).filter(
87
+ (p) => p instanceof FormatNode && p.getFormat() === '*'
88
+ ).length > 0
89
+ );
90
+ }
91
+
71
92
  isEmpty() {
72
93
  return this.getLength() === 0;
73
94
  }
74
- getFormat(root) {
75
- return this.getClosestParentOfType(root, FormatNode);
95
+
96
+ getFormat(root: Node): FormatNode | undefined {
97
+ return this.getClosestParentOfType<FormatNode>(root, FormatNode);
76
98
  }
77
- getFormatRoot(root) {
99
+
100
+ getFormatRoot(root: Node): FormatNode | undefined {
78
101
  // The format root is the highest format in the tree that contains this text.
79
102
  // There is one exception to this, however: formats inside atom nodes shouldn't traverse
80
103
  // past the atom node, since should be isolated from edits outside the atom.
81
- const atom = this.getClosestParentMatching(root, (p) => p instanceof AtomNode);
82
- if (atom && atom.getMeta() instanceof FormatNode)
83
- return atom.getMeta();
104
+ const atom = this.getClosestParentMatching(
105
+ root,
106
+ (p) => p instanceof AtomNode
107
+ ) as AtomNode<FormatNode>;
108
+ if (atom && atom.getMeta() instanceof FormatNode) return atom.getMeta();
109
+
84
110
  // If this isn't in an atom, just return the highest format this is in.
85
- return this.getFarthestParentMatching(root, (p) => p instanceof FormatNode);
111
+ return this.getFarthestParentMatching(
112
+ root,
113
+ (p) => p instanceof FormatNode
114
+ ) as FormatNode;
86
115
  }
87
- getBlocks(root) {
88
- return this.getClosestParentOfType(root, BlocksNode);
116
+
117
+ getBlocks(root: Node): BlocksNode | undefined {
118
+ return this.getClosestParentOfType<BlocksNode>(root, BlocksNode);
89
119
  }
90
- getNextCaret(index) {
120
+
121
+ getNextCaret(index: number): Caret | undefined {
91
122
  return index < this.#text.length
92
123
  ? { node: this, index: index + 1 }
93
124
  : undefined;
94
125
  }
95
- getPreviousCaret(index) {
126
+
127
+ getPreviousCaret(index: number): Caret | undefined {
96
128
  return index > 0 ? { node: this, index: index - 1 } : undefined;
97
129
  }
98
- nextWord(root, index) {
99
- if (index === undefined)
100
- index = 0;
130
+
131
+ nextWord(root: RootNode, index?: number): Caret {
132
+ if (index === undefined) index = 0;
133
+
101
134
  // Search for the space after the given index.
102
135
  let i = index + 1;
103
- while (i < this.getLength() && this.#text.charAt(i).match(/\W/))
104
- i++;
105
- while (i < this.getLength() && this.#text.charAt(i).match(/\w/))
106
- i++;
136
+ while (i < this.getLength() && this.#text.charAt(i).match(/\W/)) i++;
137
+ while (i < this.getLength() && this.#text.charAt(i).match(/\w/)) i++;
138
+
107
139
  // If we found one in this node, return it.
108
- if (i < this.getLength() ||
109
- (i === this.getLength() && this.#text.charAt(i - 1).match(/\w/)))
140
+ if (
141
+ i < this.getLength() ||
142
+ (i === this.getLength() && this.#text.charAt(i - 1).match(/\w/))
143
+ )
110
144
  return { node: this, index: i };
145
+
111
146
  // Otherwise, find the next text node's next word boundary.
112
147
  const format = this.getFormatRoot(root);
113
148
  const formatTextNodes = format ? format.getTextNodes() : undefined;
114
149
  const nextNode = root.getNextTextOrAtom(this);
115
150
  const nextWord = nextNode?.nextWord(root);
151
+
116
152
  // If there isn't one, just go to the end of this.
117
- if (formatTextNodes &&
153
+ if (
154
+ formatTextNodes &&
118
155
  nextNode &&
119
- this === formatTextNodes[formatTextNodes.length - 1])
156
+ this === formatTextNodes[formatTextNodes.length - 1]
157
+ )
120
158
  return { node: nextNode, index: 0 };
121
159
  else if (nextWord === undefined)
122
160
  return { node: this, index: this.#text.length };
123
- else
124
- return nextWord;
161
+ else return nextWord;
125
162
  }
126
- previousWord(root, index) {
127
- if (index === undefined)
128
- index = this.#text.length;
163
+
164
+ previousWord(root: RootNode, index?: number): Caret {
165
+ if (index === undefined) index = this.#text.length;
166
+
129
167
  // Scan left until we find a word character, then keep scanning until we reach a non-word character.
130
168
  let i = index - 1;
131
- while (i > 0 && this.#text.charAt(i - 1).match(/\W/))
132
- i--;
133
- while (i > 0 && this.#text.charAt(i - 1).match(/\w/))
134
- i--;
169
+ while (i > 0 && this.#text.charAt(i - 1).match(/\W/)) i--;
170
+ while (i > 0 && this.#text.charAt(i - 1).match(/\w/)) i--;
171
+
135
172
  // If we found one in this node, return it.
136
173
  if (i > 0 || (i === 0 && this.#text.charAt(0).match(/\w/)))
137
174
  return { node: this, index: i };
175
+
138
176
  // Otherwise, find the next text node's next word boundary.
139
177
  const format = this.getFormatRoot(root);
140
178
  const formatTextNodes = format ? format.getTextNodes() : undefined;
141
179
  const previousNode = root.getPreviousTextOrAtom(this);
142
180
  const previousWord = previousNode?.previousWord(root);
181
+
143
182
  // If there isn't one, just go to the end of this.
144
183
  if (formatTextNodes && previousNode && this === formatTextNodes[0])
145
184
  return {
146
185
  node: previousNode,
147
- index: previousNode instanceof TextNode
148
- ? previousNode.getLength()
149
- : 0,
186
+ index:
187
+ previousNode instanceof TextNode
188
+ ? previousNode.getLength()
189
+ : 0,
150
190
  };
151
- else if (previousWord === undefined)
152
- return { node: this, index: 0 };
153
- else
154
- return previousWord;
191
+ else if (previousWord === undefined) return { node: this, index: 0 };
192
+ else return previousWord;
155
193
  }
194
+
156
195
  withChildReplaced() {
157
196
  return undefined;
158
197
  }
159
- withCharacterAt(char, index) {
160
- if (index < 0 || index > this.#text.length)
161
- return undefined;
162
- return new TextNode(this.#text.slice(0, index) + char + this.#text.slice(index));
198
+
199
+ withCharacterAt(char: string, index: number): TextNode | undefined {
200
+ if (index < 0 || index > this.#text.length) return undefined;
201
+ return new TextNode(
202
+ this.#text.slice(0, index) + char + this.#text.slice(index)
203
+ );
163
204
  }
164
- withoutRange(range) {
165
- if (range.start.node !== this && range.end.node !== this)
166
- return;
205
+
206
+ withoutRange(range: CaretRange): TextNode | undefined {
207
+ if (range.start.node !== this && range.end.node !== this) return;
167
208
  const min = Math.max(0, Math.min(range.start.index, range.end.index));
168
- const max = Math.min(this.#text.length, Math.max(range.start.index, range.end.index));
169
- return new TextNode(this.#text.substring(0, min) + this.#text.substring(max));
170
- }
171
- withContentInRange(range) {
209
+ const max = Math.min(
210
+ this.#text.length,
211
+ Math.max(range.start.index, range.end.index)
212
+ );
213
+ return new TextNode(
214
+ this.#text.substring(0, min) + this.#text.substring(max)
215
+ );
216
+ }
217
+
218
+ withContentInRange(range: CaretRange): this | undefined {
172
219
  const includesStart = range.start.node === this;
173
220
  const includesEnd = range.end.node === this;
174
- return new TextNode(this.#text.substring(includesStart ? range.start.index : 0, includesEnd ? range.end.index : this.#text.length));
221
+ return new TextNode(
222
+ this.#text.substring(
223
+ includesStart ? range.start.index : 0,
224
+ includesEnd ? range.end.index : this.#text.length
225
+ )
226
+ ) as this;
175
227
  }
176
228
  }
@@ -1,6 +1,5 @@
1
1
  export function getSubdomain() {
2
- if (typeof window === 'undefined')
3
- return undefined;
2
+ if (typeof window === 'undefined') return undefined;
4
3
  // Determine if there's a subdomain.
5
4
  const hostParts = window.location.hostname.split('.');
6
5
  const firstPart = hostParts[0];
@@ -9,16 +8,23 @@ export function getSubdomain() {
9
8
  ? undefined
10
9
  : firstPart;
11
10
  }
12
- export function pathWithoutSubdomain(path) {
11
+
12
+ export function pathWithoutSubdomain(path: string) {
13
13
  // If there's no subdomain, just return the path.
14
14
  const subdomain = getSubdomain();
15
- if (subdomain === undefined)
16
- return path;
15
+ if (subdomain === undefined) return path;
16
+
17
17
  // Otherwise, return a full URL without the subdomain
18
- return `${window.location.protocol}//${window.location.host.replace(subdomain + '.', '')}${path}${window.location.search}`;
18
+ return `${window.location.protocol}//${window.location.host.replace(
19
+ subdomain + '.',
20
+ ''
21
+ )}${path}${window.location.search}`;
19
22
  }
20
- export function getSubdomainURL(subdomain) {
23
+
24
+ export function getSubdomainURL(subdomain: string) {
21
25
  const parts = window.location.host.split('.');
22
26
  // Construct a URL from the subdomain and the last one or two parts of the host (accounting for localhost and normal domains and top level domains.)
23
- return `${window.location.protocol}//${subdomain}.${parts.length > 1 ? `${parts[parts.length - 2]}.` : ''}${parts[parts.length - 1]}`;
27
+ return `${window.location.protocol}//${subdomain}.${
28
+ parts.length > 1 ? `${parts[parts.length - 2]}.` : ''
29
+ }${parts[parts.length - 1]}`;
24
30
  }
@@ -1,6 +1,7 @@
1
1
  export function isMobile() {
2
2
  return watchMobile().matches;
3
3
  }
4
+
4
5
  export function watchMobile() {
5
6
  return window.matchMedia('screen and (max-width: 1200px)');
6
7
  }
@@ -1,28 +1,35 @@
1
1
  import Reference from '../models/book/Reference';
2
- export function mineReference(ids, text) {
2
+
3
+ export function mineReference(ids: string[], text: string): Reference {
3
4
  // First find the year, since it's the most easily detected. Optional parens.
4
5
  let yearMatches = text.match(/(\(?[0-9]{4}\)?)/);
5
- let year = yearMatches !== null && yearMatches.length > 0
6
- ? yearMatches[1].replace('(', '').replace(')', '')
7
- : undefined;
8
- if (year && yearMatches)
9
- text = text.replace(yearMatches[1], '');
6
+ let year =
7
+ yearMatches !== null && yearMatches.length > 0
8
+ ? yearMatches[1].replace('(', '').replace(')', '')
9
+ : undefined;
10
+ if (year && yearMatches) text = text.replace(yearMatches[1], '');
11
+
10
12
  // Next, find the URL
11
- let url = null;
12
- let urlMatches = text.match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/);
13
+ let url: string | null = null;
14
+ let urlMatches = text.match(
15
+ /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/
16
+ );
13
17
  if (urlMatches !== null && urlMatches.length > 0) {
14
18
  url = urlMatches[0];
15
19
  const index = text.indexOf(url);
16
20
  text = text.substring(0, index) + text.substring(index + url.length);
17
21
  }
22
+
18
23
  // Split the remaining portion into sentences.
19
24
  let chunks = splitIntoSentences(text);
25
+
20
26
  // Authors are usually lists of roman characters and periods optionally followed by commas or semicolons
21
27
  let authors = chunks.find((t) => /[a-zA-Z\.]+[,;]?/.test(t));
22
28
  if (authors) {
23
29
  chunks = chunks.filter((t) => t !== authors);
24
30
  authors = authors.trim();
25
31
  }
32
+
26
33
  // Titles are usually lists of roman characters and spaces and maybe a colon.
27
34
  let title = chunks.find((t) => /[a-zA-Z0-9:!#?]+/.test(t));
28
35
  if (title) {
@@ -31,21 +38,33 @@ export function mineReference(ids, text) {
31
38
  title = title + '?';
32
39
  title = title.trim();
33
40
  }
41
+
34
42
  // Source is whatever is left.
35
43
  let source = chunks.length > 0 ? chunks[0] : undefined;
36
44
  if (source) {
37
45
  chunks = chunks.filter((t) => t !== source);
38
46
  source = source.trim();
39
47
  }
48
+
40
49
  // If there's anything left, fall back to just a string.
41
50
  return chunks.length > 0
42
51
  ? new Reference(getUniqueReferenceID(ids), text)
43
- : new Reference(getUniqueReferenceID(ids, authors, year), authors || '', year || '', title || '', source || '', url || '', '', false);
52
+ : new Reference(
53
+ getUniqueReferenceID(ids, authors, year),
54
+ authors || '',
55
+ year || '',
56
+ title || '',
57
+ source || '',
58
+ url || '',
59
+ '',
60
+ false
61
+ );
44
62
  }
45
- export function splitIntoSentences(text) {
63
+
64
+ export function splitIntoSentences(text: string): string[] {
46
65
  // Split the remaining text by period-space sequences, assuming chunks of information are segmented by sentences
47
66
  // unless they are single initials followed by a period.
48
- let sentences = [];
67
+ let sentences: string[] = [];
49
68
  let priorLetterSequence = '';
50
69
  let accumulator = '';
51
70
  for (let i = 0; i < text.length; i++) {
@@ -53,24 +72,27 @@ export function splitIntoSentences(text) {
53
72
  if (/[a-zA-Z]/.test(char)) {
54
73
  priorLetterSequence += char;
55
74
  accumulator += char;
56
- }
57
- else {
75
+ } else {
58
76
  if (char === '.' && priorLetterSequence.length !== 1) {
59
77
  sentences.push(accumulator);
60
78
  accumulator = '';
61
79
  priorLetterSequence = '';
62
- }
63
- else {
80
+ } else {
64
81
  priorLetterSequence = '';
65
82
  accumulator += char;
66
83
  }
67
84
  }
68
85
  }
69
- if (accumulator.length > 0)
70
- sentences.push(accumulator);
86
+ if (accumulator.length > 0) sentences.push(accumulator);
87
+
71
88
  return sentences;
72
89
  }
73
- export function getUniqueReferenceID(ids, authors, year) {
90
+
91
+ export function getUniqueReferenceID(
92
+ ids: string[],
93
+ authors?: string,
94
+ year?: string
95
+ ): string {
74
96
  if (authors && year) {
75
97
  // Split the authors, combine the first initials of each, then append the year.
76
98
  const semicolons = authors.includes(';');
@@ -85,16 +107,14 @@ export function getUniqueReferenceID(ids, authors, year) {
85
107
  const letter = letters.shift();
86
108
  revisedID =
87
109
  id +
88
- (letter !== undefined
89
- ? letter
90
- : Math.floor(Math.random() * 10));
110
+ (letter !== undefined
111
+ ? letter
112
+ : Math.floor(Math.random() * 10));
91
113
  }
92
114
  return revisedID;
93
- }
94
- else {
115
+ } else {
95
116
  let id = 'ref';
96
- for (let i = 0; i < 4; i++)
97
- id = id + Math.round(Math.random() * 9);
117
+ for (let i = 0; i < 4; i++) id = id + Math.round(Math.random() * 9);
98
118
  return id;
99
119
  }
100
120
  }
@@ -1,10 +1,12 @@
1
- let scrollToEyeLevel = (el) => {
1
+ let scrollToEyeLevel = (el: Element) => {
2
2
  // Top of the target minus a third of window height.
3
3
  window.scrollTo({
4
- top: el.getBoundingClientRect().top +
4
+ top:
5
+ el.getBoundingClientRect().top +
5
6
  window.scrollY -
6
7
  window.innerHeight / 3,
7
8
  behavior: 'smooth',
8
9
  });
9
10
  };
11
+
10
12
  export default scrollToEyeLevel;
@@ -0,0 +1,3 @@
1
+ export function match(param: string) {
2
+ return /^\d+$/.test(param);
3
+ }
@@ -0,0 +1,12 @@
1
+ <script lang="ts">
2
+ import Feedback from '$lib/components/app/Feedback.svelte';
3
+ import Lead from '$lib/components/app/Lead.svelte';
4
+ import Link from '$lib/components/app/Link.svelte';
5
+ import Large from '../lib/components/app/Large.svelte';
6
+ </script>
7
+
8
+ <Lead><Large>Oops</Large>.</Lead>
9
+
10
+ <Feedback error>
11
+ This page doesn't exist. Want to go <Link to="/">home</Link>?
12
+ </Feedback>