bookish-press 0.4.47 → 0.4.49

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/components/Auth.svelte +55 -0
  2. package/components/Auth.svelte.d.ts +16 -0
  3. package/{src/lib/components/Authentication.ts → components/Authentication.d.ts} +0 -2
  4. package/components/Authentication.js +1 -0
  5. package/{src/lib/components → components}/BookPreview.svelte +22 -27
  6. package/components/BookPreview.svelte.d.ts +18 -0
  7. package/{src/lib/components → components}/External.svelte +1 -2
  8. package/components/External.svelte.d.ts +18 -0
  9. package/components/Link.svelte +51 -0
  10. package/components/Link.svelte.d.ts +18 -0
  11. package/{src/lib/components → components}/app/BookList.svelte +3 -6
  12. package/components/app/BookList.svelte.d.ts +18 -0
  13. package/{src/lib/components → components}/app/Button.svelte +4 -5
  14. package/components/app/Button.svelte.d.ts +22 -0
  15. package/{src/lib/components → components}/app/Feedback.svelte +7 -11
  16. package/components/app/Feedback.svelte.d.ts +18 -0
  17. package/{src/lib/components → components}/app/Head.svelte +1 -2
  18. package/components/app/Head.svelte.d.ts +18 -0
  19. package/{src/lib/components → components}/app/Large.svelte +0 -0
  20. package/components/app/Large.svelte.d.ts +27 -0
  21. package/{src/lib/components → components}/app/Lead.svelte +0 -0
  22. package/components/app/Lead.svelte.d.ts +27 -0
  23. package/{src/lib/components → components}/app/Link.svelte +3 -4
  24. package/components/app/Link.svelte.d.ts +20 -0
  25. package/{src/lib/components → components}/app/Options.svelte +4 -5
  26. package/components/app/Options.svelte.d.ts +19 -0
  27. package/{src/lib/components → components}/app/Paragraph.svelte +1 -2
  28. package/components/app/Paragraph.svelte.d.ts +18 -0
  29. package/{src/lib/components → components}/app/Section.svelte +0 -0
  30. package/components/app/Section.svelte.d.ts +27 -0
  31. package/{src/lib/components → components}/app/Table.svelte +0 -0
  32. package/components/app/Table.svelte.d.ts +27 -0
  33. package/{src/lib/components → components}/app/TextInput.svelte +9 -12
  34. package/components/app/TextInput.svelte.d.ts +22 -0
  35. package/{src/lib/components → components}/chapter/Atom.svelte +12 -18
  36. package/components/chapter/Atom.svelte.d.ts +19 -0
  37. package/components/chapter/Block.svelte +37 -0
  38. package/components/chapter/Block.svelte.d.ts +17 -0
  39. package/{src/lib/components → components}/chapter/Callout.svelte +3 -6
  40. package/components/chapter/Callout.svelte.d.ts +17 -0
  41. package/{src/lib/components → components}/chapter/CaptionedCode.svelte +13 -21
  42. package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
  43. package/{src/lib/components → components}/chapter/ChapterBody.svelte +9 -13
  44. package/components/chapter/ChapterBody.svelte.d.ts +19 -0
  45. package/{src/lib/components → components}/chapter/Citations.svelte +33 -34
  46. package/components/chapter/Citations.svelte.d.ts +17 -0
  47. package/{src/lib/components → components}/chapter/Code.svelte +60 -64
  48. package/components/chapter/Code.svelte.d.ts +22 -0
  49. package/{src/lib/components → components}/chapter/Comment.svelte +18 -30
  50. package/components/chapter/Comment.svelte.d.ts +17 -0
  51. package/{src/lib/components → components}/chapter/Definition.svelte +17 -23
  52. package/components/chapter/Definition.svelte.d.ts +17 -0
  53. package/{src/lib/components → components}/chapter/Embed.svelte +77 -97
  54. package/components/chapter/Embed.svelte.d.ts +20 -0
  55. package/components/chapter/ErrorMessage.svelte +9 -0
  56. package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
  57. package/components/chapter/ExtendedPrism.d.ts +2 -0
  58. package/{src/lib/components → components}/chapter/ExtendedPrism.js +0 -0
  59. package/{src/lib/components → components}/chapter/Figure.svelte +26 -34
  60. package/components/chapter/Figure.svelte.d.ts +24 -0
  61. package/{src/lib/components → components}/chapter/Footnote.svelte +20 -32
  62. package/components/chapter/Footnote.svelte.d.ts +19 -0
  63. package/{src/lib/components → components}/chapter/Format.svelte +34 -39
  64. package/components/chapter/Format.svelte.d.ts +19 -0
  65. package/{src/lib/components → components}/chapter/InlineCode.svelte +5 -9
  66. package/components/chapter/InlineCode.svelte.d.ts +17 -0
  67. package/{src/lib/components → components}/chapter/Label.svelte +14 -23
  68. package/components/chapter/Label.svelte.d.ts +17 -0
  69. package/{src/lib/components → components}/chapter/Link.svelte +21 -27
  70. package/components/chapter/Link.svelte.d.ts +17 -0
  71. package/{src/lib/components → components}/chapter/List.svelte +3 -5
  72. package/components/chapter/List.svelte.d.ts +17 -0
  73. package/{src/lib/components → components}/chapter/Marginal.svelte +41 -54
  74. package/components/chapter/Marginal.svelte.d.ts +22 -0
  75. package/{src/lib/components → components}/chapter/Paragraph.svelte +20 -25
  76. package/components/chapter/Paragraph.svelte.d.ts +18 -0
  77. package/{src/lib/components → components}/chapter/Positioned.svelte +1 -4
  78. package/components/chapter/Positioned.svelte.d.ts +19 -0
  79. package/{src/lib/components → components}/chapter/Problem.svelte +0 -0
  80. package/components/chapter/Problem.svelte.d.ts +27 -0
  81. package/components/chapter/Python.svelte +128 -0
  82. package/components/chapter/Python.svelte.d.ts +18 -0
  83. package/{src/lib/components → components}/chapter/Quote.svelte +19 -13
  84. package/components/chapter/Quote.svelte.d.ts +17 -0
  85. package/{src/lib/components → components}/chapter/Rule.svelte +1 -4
  86. package/components/chapter/Rule.svelte.d.ts +17 -0
  87. package/{src/lib/components → components}/chapter/Table.svelte +7 -11
  88. package/components/chapter/Table.svelte.d.ts +17 -0
  89. package/components/chapter/Text.svelte +87 -0
  90. package/components/chapter/Text.svelte.d.ts +18 -0
  91. package/components/editor/BookishEditor.svelte +884 -0
  92. package/components/editor/BookishEditor.svelte.d.ts +25 -0
  93. package/components/editor/CalloutEditor.svelte +10 -0
  94. package/components/editor/CalloutEditor.svelte.d.ts +17 -0
  95. package/{src/lib/components → components}/editor/CaptionedCodeEditor.svelte +6 -10
  96. package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
  97. package/components/editor/CaretContext.d.ts +50 -0
  98. package/components/editor/CaretContext.js +1 -0
  99. package/{src/lib/components/editor/CaretState.ts → components/editor/CaretState.d.ts} +7 -6
  100. package/components/editor/CaretState.js +1 -0
  101. package/{src/lib/components/editor/CaretUtilities.ts → components/editor/CaretUtilities.d.ts} +0 -1
  102. package/components/editor/CaretUtilities.js +1 -0
  103. package/{src/lib/components → components}/editor/CaretView.svelte +20 -25
  104. package/components/editor/CaretView.svelte.d.ts +25 -0
  105. package/components/editor/CitationsEditor.svelte +53 -0
  106. package/components/editor/CitationsEditor.svelte.d.ts +17 -0
  107. package/{src/lib/components/editor/Clipboard.ts → components/editor/Clipboard.d.ts} +1 -2
  108. package/components/editor/Clipboard.js +1 -0
  109. package/{src/lib/components/editor/Command.ts → components/editor/Command.d.ts} +2 -8
  110. package/components/editor/Command.js +1 -0
  111. package/components/editor/Commands.d.ts +3 -0
  112. package/{src/lib/components/editor/Commands.ts → components/editor/Commands.js} +315 -730
  113. package/components/editor/ConfirmButton.svelte +49 -0
  114. package/components/editor/ConfirmButton.svelte.d.ts +19 -0
  115. package/components/editor/DefinitionEditor.svelte +36 -0
  116. package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
  117. package/components/editor/EmbedEditor.svelte +137 -0
  118. package/components/editor/EmbedEditor.svelte.d.ts +17 -0
  119. package/{src/lib/components → components}/editor/Icon.svelte +1 -2
  120. package/components/editor/Icon.svelte.d.ts +16 -0
  121. package/{src/lib/components → components}/editor/ImageChooser.svelte +19 -24
  122. package/components/editor/ImageChooser.svelte.d.ts +18 -0
  123. package/components/editor/InlineCodeEditor.svelte +12 -0
  124. package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
  125. package/{src/lib/components → components}/editor/LabelEditor.svelte +9 -14
  126. package/components/editor/LabelEditor.svelte.d.ts +17 -0
  127. package/{src/lib/components → components}/editor/LanguageEditor.svelte +5 -8
  128. package/components/editor/LanguageEditor.svelte.d.ts +17 -0
  129. package/components/editor/LinkEditor.svelte +100 -0
  130. package/components/editor/LinkEditor.svelte.d.ts +17 -0
  131. package/{src/lib/components → components}/editor/Note.svelte +0 -0
  132. package/components/editor/Note.svelte.d.ts +27 -0
  133. package/{src/lib/components → components}/editor/Permissions.svelte +36 -43
  134. package/components/editor/Permissions.svelte.d.ts +20 -0
  135. package/components/editor/PositionEditor.svelte +17 -0
  136. package/components/editor/PositionEditor.svelte.d.ts +18 -0
  137. package/components/editor/QuoteEditor.svelte +10 -0
  138. package/components/editor/QuoteEditor.svelte.d.ts +17 -0
  139. package/{src/lib/components → components}/editor/Switch.svelte +11 -14
  140. package/components/editor/Switch.svelte.d.ts +20 -0
  141. package/components/editor/TableEditor.svelte +10 -0
  142. package/components/editor/TableEditor.svelte.d.ts +17 -0
  143. package/{src/lib/components → components}/editor/TextEditor.svelte +89 -101
  144. package/components/editor/TextEditor.svelte.d.ts +24 -0
  145. package/components/editor/Toggle.svelte +41 -0
  146. package/components/editor/Toggle.svelte.d.ts +19 -0
  147. package/components/editor/Toolbar.svelte +249 -0
  148. package/components/editor/Toolbar.svelte.d.ts +17 -0
  149. package/{src/lib/components → components}/editor/ToolbarGroup.svelte +3 -5
  150. package/components/editor/ToolbarGroup.svelte.d.ts +18 -0
  151. package/{src/lib/components → components}/editor/ToolbarSpacer.svelte +0 -0
  152. package/components/editor/ToolbarSpacer.svelte.d.ts +23 -0
  153. package/components/editor/URLEditor.svelte +13 -0
  154. package/components/editor/URLEditor.svelte.d.ts +18 -0
  155. package/{src/lib/components/editor/UndoState.ts → components/editor/UndoState.d.ts} +2 -3
  156. package/components/editor/UndoState.js +1 -0
  157. package/{src/lib/components → components}/editor/icons/annotate.svg +0 -0
  158. package/{src/lib/components → components}/editor/icons/block.svg +0 -0
  159. package/{src/lib/components → components}/editor/icons/bold.svg +0 -0
  160. package/{src/lib/components → components}/editor/icons/bullets.svg +0 -0
  161. package/{src/lib/components → components}/editor/icons/callout.svg +0 -0
  162. package/{src/lib/components → components}/editor/icons/citation.svg +0 -0
  163. package/{src/lib/components → components}/editor/icons/clear.svg +0 -0
  164. package/{src/lib/components → components}/editor/icons/clipboard.svg +0 -0
  165. package/{src/lib/components → components}/editor/icons/code.svg +0 -0
  166. package/{src/lib/components → components}/editor/icons/columnafter.svg +0 -0
  167. package/{src/lib/components → components}/editor/icons/columnbefore.svg +0 -0
  168. package/{src/lib/components → components}/editor/icons/comment.svg +0 -0
  169. package/{src/lib/components → components}/editor/icons/copy.svg +0 -0
  170. package/{src/lib/components → components}/editor/icons/cut.svg +0 -0
  171. package/{src/lib/components → components}/editor/icons/define.svg +0 -0
  172. package/{src/lib/components → components}/editor/icons/deletecolumn.svg +0 -0
  173. package/{src/lib/components → components}/editor/icons/deleterow.svg +0 -0
  174. package/{src/lib/components → components}/editor/icons/footnote.svg +0 -0
  175. package/{src/lib/components → components}/editor/icons/header1.svg +0 -0
  176. package/{src/lib/components → components}/editor/icons/header2.svg +0 -0
  177. package/{src/lib/components → components}/editor/icons/header3.svg +0 -0
  178. package/{src/lib/components → components}/editor/icons/home.svg +0 -0
  179. package/{src/lib/components → components}/editor/icons/indent.svg +0 -0
  180. package/{src/lib/components → components}/editor/icons/italic.svg +0 -0
  181. package/{src/lib/components → components}/editor/icons/label.svg +0 -0
  182. package/{src/lib/components → components}/editor/icons/left.svg +0 -0
  183. package/{src/lib/components → components}/editor/icons/level.svg +0 -0
  184. package/{src/lib/components → components}/editor/icons/link.svg +0 -0
  185. package/{src/lib/components → components}/editor/icons/list.svg +0 -0
  186. package/{src/lib/components → components}/editor/icons/media.svg +0 -0
  187. package/{src/lib/components → components}/editor/icons/middle.svg +0 -0
  188. package/{src/lib/components → components}/editor/icons/numbers.svg +0 -0
  189. package/{src/lib/components → components}/editor/icons/paragraph.svg +0 -0
  190. package/{src/lib/components → components}/editor/icons/paste.svg +0 -0
  191. package/{src/lib/components → components}/editor/icons/quote.svg +0 -0
  192. package/{src/lib/components → components}/editor/icons/redo.svg +0 -0
  193. package/{src/lib/components → components}/editor/icons/right.svg +0 -0
  194. package/{src/lib/components → components}/editor/icons/rowabove.svg +0 -0
  195. package/{src/lib/components → components}/editor/icons/rowbelow.svg +0 -0
  196. package/{src/lib/components → components}/editor/icons/rule.svg +0 -0
  197. package/{src/lib/components → components}/editor/icons/sub.svg +0 -0
  198. package/{src/lib/components → components}/editor/icons/super.svg +0 -0
  199. package/{src/lib/components → components}/editor/icons/table.svg +0 -0
  200. package/{src/lib/components → components}/editor/icons/text.svg +0 -0
  201. package/{src/lib/components → components}/editor/icons/time.svg +0 -0
  202. package/{src/lib/components → components}/editor/icons/undo.svg +0 -0
  203. package/{src/lib/components → components}/editor/icons/unindent.svg +0 -0
  204. package/{src/lib/components → components}/editor/icons/unlink.svg +0 -0
  205. package/{src/lib/components → components}/page/Acknowledgements.svelte +10 -19
  206. package/components/page/Acknowledgements.svelte.d.ts +14 -0
  207. package/components/page/Authors.svelte +85 -0
  208. package/components/page/Authors.svelte.d.ts +21 -0
  209. package/components/page/BookLoader.svelte +59 -0
  210. package/components/page/BookLoader.svelte.d.ts +16 -0
  211. package/components/page/BulkReferenceEditor.svelte +63 -0
  212. package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
  213. package/components/page/Chapter.svelte +393 -0
  214. package/components/page/Chapter.svelte.d.ts +18 -0
  215. package/components/page/ChapterContext.d.ts +10 -0
  216. package/components/page/ChapterContext.js +1 -0
  217. package/{src/lib/components → components}/page/ChapterNumber.svelte +0 -0
  218. package/components/page/ChapterNumber.svelte.d.ts +27 -0
  219. package/{src/lib/components → components}/page/ChapterTitle.svelte +2 -4
  220. package/components/page/ChapterTitle.svelte.d.ts +18 -0
  221. package/components/page/Contexts.d.ts +47 -0
  222. package/components/page/Contexts.js +133 -0
  223. package/{src/lib/components → components}/page/DefinitionView.svelte +38 -53
  224. package/components/page/DefinitionView.svelte.d.ts +18 -0
  225. package/{src/lib/components → components}/page/Description.svelte +7 -15
  226. package/components/page/Description.svelte.d.ts +14 -0
  227. package/components/page/Edition.svelte +161 -0
  228. package/components/page/Edition.svelte.d.ts +20 -0
  229. package/components/page/EditionLoader.svelte +99 -0
  230. package/components/page/EditionLoader.svelte.d.ts +18 -0
  231. package/{src/lib/components → components}/page/Editions.svelte +18 -22
  232. package/components/page/Editions.svelte.d.ts +14 -0
  233. package/{src/lib/components → components}/page/Glossary.svelte +28 -33
  234. package/components/page/Glossary.svelte.d.ts +14 -0
  235. package/{src/lib/components → components}/page/Header.svelte +52 -59
  236. package/components/page/Header.svelte.d.ts +29 -0
  237. package/{src/lib/components → components}/page/Index.svelte +47 -50
  238. package/components/page/Index.svelte.d.ts +14 -0
  239. package/{src/lib/components → components}/page/Instructions.svelte +1 -2
  240. package/components/page/Instructions.svelte.d.ts +18 -0
  241. package/{src/lib/components → components}/page/License.svelte +9 -17
  242. package/components/page/License.svelte.d.ts +14 -0
  243. package/{src/lib/components → components}/page/Loading.svelte +0 -0
  244. package/components/page/Loading.svelte.d.ts +23 -0
  245. package/{src/lib/components → components}/page/Media.svelte +27 -44
  246. package/components/page/Media.svelte.d.ts +14 -0
  247. package/{src/lib/components → components}/page/MediaPreview.svelte +2 -3
  248. package/components/page/MediaPreview.svelte.d.ts +19 -0
  249. package/{src/lib/components → components}/page/Muted.svelte +0 -0
  250. package/components/page/Muted.svelte.d.ts +27 -0
  251. package/{src/lib/components → components}/page/Outline.svelte +110 -140
  252. package/components/page/Outline.svelte.d.ts +19 -0
  253. package/components/page/Page.svelte +84 -0
  254. package/components/page/Page.svelte.d.ts +19 -0
  255. package/{src/lib/components → components}/page/PageHeader.svelte +1 -2
  256. package/components/page/PageHeader.svelte.d.ts +18 -0
  257. package/{src/lib/components → components}/page/PageParagraph.svelte +0 -0
  258. package/components/page/PageParagraph.svelte.d.ts +27 -0
  259. package/components/page/PossibleChapter.svelte +14 -0
  260. package/components/page/PossibleChapter.svelte.d.ts +14 -0
  261. package/components/page/PossibleReference.svelte +11 -0
  262. package/components/page/PossibleReference.svelte.d.ts +18 -0
  263. package/{src/lib/components → components}/page/Print.svelte +3 -5
  264. package/components/page/Print.svelte.d.ts +14 -0
  265. package/{src/lib/components → components}/page/Publish.svelte +52 -59
  266. package/components/page/Publish.svelte.d.ts +14 -0
  267. package/{src/lib/components → components}/page/Reference.svelte +30 -39
  268. package/components/page/Reference.svelte.d.ts +17 -0
  269. package/{src/lib/components → components}/page/References.svelte +14 -18
  270. package/components/page/References.svelte.d.ts +14 -0
  271. package/{src/lib/components → components}/page/Rows.svelte +0 -0
  272. package/components/page/Rows.svelte.d.ts +27 -0
  273. package/components/page/Search.svelte +133 -0
  274. package/components/page/Search.svelte.d.ts +14 -0
  275. package/{src/lib/components → components}/page/Status.svelte +3 -5
  276. package/components/page/Status.svelte.d.ts +14 -0
  277. package/{src/lib/components → components}/page/SubdomainEditor.svelte +13 -16
  278. package/components/page/SubdomainEditor.svelte.d.ts +14 -0
  279. package/{src/lib/components → components}/page/TableOfContents.svelte +68 -79
  280. package/components/page/TableOfContents.svelte.d.ts +14 -0
  281. package/components/page/TableOfContentsImage.svelte +18 -0
  282. package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
  283. package/{src/lib/components → components}/page/TableOfContentsRow.svelte +24 -34
  284. package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
  285. package/{src/lib/components → components}/page/ThemeEditor.svelte +33 -44
  286. package/components/page/ThemeEditor.svelte.d.ts +14 -0
  287. package/{src/lib/components → components}/page/ThemeEditorPreview.svelte +12 -21
  288. package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
  289. package/components/page/ThemeSetEditor.svelte +19 -0
  290. package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
  291. package/{src/lib/components → components}/page/ThemeVariableEditor.svelte +14 -18
  292. package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
  293. package/{src/lib/components → components}/page/Title.svelte +0 -0
  294. package/components/page/Title.svelte.d.ts +27 -0
  295. package/{src/lib/components → components}/page/Unknown.svelte +8 -10
  296. package/components/page/Unknown.svelte.d.ts +16 -0
  297. package/components/page/margins.d.ts +2 -0
  298. package/{src/lib/components/page/margins.ts → components/page/margins.js} +46 -79
  299. package/index.d.ts +15 -0
  300. package/{src/lib/index.js → index.js} +0 -0
  301. package/models/CRUD.d.ts +27 -0
  302. package/models/CRUD.js +262 -0
  303. package/models/Firebase.d.ts +5 -0
  304. package/{src/lib/models/Firebase.ts → models/Firebase.js} +16 -26
  305. package/models/book/Book.d.ts +61 -0
  306. package/models/book/Book.js +135 -0
  307. package/models/book/BookMedia.d.ts +23 -0
  308. package/models/book/BookMedia.js +108 -0
  309. package/models/book/BookSaveStatus.d.ts +7 -0
  310. package/models/book/BookSaveStatus.js +8 -0
  311. package/models/book/Chapter.d.ts +81 -0
  312. package/models/book/Chapter.js +212 -0
  313. package/models/book/ChapterID.d.ts +10 -0
  314. package/{src/lib/models/book/ChapterID.ts → models/book/ChapterID.js} +0 -1
  315. package/models/book/Definition.d.ts +6 -0
  316. package/models/book/Definition.js +1 -0
  317. package/models/book/Edition.d.ts +139 -0
  318. package/models/book/Edition.js +620 -0
  319. package/models/book/Reference.d.ts +24 -0
  320. package/models/book/Reference.js +78 -0
  321. package/models/book/Schema.d.ts +174 -0
  322. package/{src/lib/models/book/Schema.ts → models/book/Schema.js} +0 -1
  323. package/models/book/Theme.d.ts +113 -0
  324. package/{src/lib/models/book/Theme.ts → models/book/Theme.js} +6 -110
  325. package/{src/lib/models/book/ThemeColors.ts → models/book/ThemeColors.d.ts} +0 -6
  326. package/models/book/ThemeColors.js +1 -0
  327. package/models/book/Words.d.ts +2 -0
  328. package/{src/lib/models/book/Words.ts → models/book/Words.js} +0 -1
  329. package/models/chapter/AtomNode.d.ts +18 -0
  330. package/{src/lib/models/chapter/AtomNode.ts → models/chapter/AtomNode.js} +10 -30
  331. package/models/chapter/BlockNode.d.ts +20 -0
  332. package/{src/lib/models/chapter/BlockNode.ts → models/chapter/BlockNode.js} +47 -80
  333. package/models/chapter/BlocksNode.d.ts +50 -0
  334. package/{src/lib/models/chapter/BlocksNode.ts → models/chapter/BlocksNode.js} +359 -571
  335. package/models/chapter/BlocksNode.test.d.ts +1 -0
  336. package/models/chapter/BlocksNode.test.js +568 -0
  337. package/{src/lib/models/chapter/Bookkeeping.ts → models/chapter/Bookkeeping.d.ts} +0 -0
  338. package/models/chapter/Bookkeeping.js +1 -0
  339. package/models/chapter/CalloutNode.d.ts +17 -0
  340. package/models/chapter/CalloutNode.js +58 -0
  341. package/models/chapter/Caret.d.ts +23 -0
  342. package/{src/lib/models/chapter/Caret.ts → models/chapter/Caret.js} +26 -50
  343. package/models/chapter/ChapterNode.d.ts +34 -0
  344. package/models/chapter/ChapterNode.js +117 -0
  345. package/models/chapter/CitationsNode.d.ts +16 -0
  346. package/{src/lib/models/chapter/CitationsNode.ts → models/chapter/CitationsNode.js} +10 -17
  347. package/models/chapter/CodeNode.d.ts +35 -0
  348. package/{src/lib/models/chapter/CodeNode.ts → models/chapter/CodeNode.js} +62 -125
  349. package/models/chapter/CommentNode.d.ts +18 -0
  350. package/models/chapter/CommentNode.js +48 -0
  351. package/models/chapter/DefinitionNode.d.ts +12 -0
  352. package/{src/lib/models/chapter/DefinitionNode.ts → models/chapter/DefinitionNode.js} +8 -14
  353. package/models/chapter/Edit.d.ts +7 -0
  354. package/models/chapter/Edit.js +1 -0
  355. package/models/chapter/EmbedNode.d.ts +45 -0
  356. package/models/chapter/EmbedNode.js +168 -0
  357. package/models/chapter/ErrorNode.d.ts +17 -0
  358. package/{src/lib/models/chapter/ErrorNode.ts → models/chapter/ErrorNode.js} +8 -15
  359. package/models/chapter/FootnoteNode.d.ts +18 -0
  360. package/models/chapter/FootnoteNode.js +47 -0
  361. package/models/chapter/FormatNode.d.ts +60 -0
  362. package/{src/lib/models/chapter/FormatNode.ts → models/chapter/FormatNode.js} +262 -443
  363. package/models/chapter/FormatNode.test.d.ts +1 -0
  364. package/models/chapter/FormatNode.test.js +96 -0
  365. package/models/chapter/InlineCodeNode.d.ts +12 -0
  366. package/{src/lib/models/chapter/InlineCodeNode.ts → models/chapter/InlineCodeNode.js} +9 -17
  367. package/models/chapter/LabelNode.d.ts +17 -0
  368. package/{src/lib/models/chapter/LabelNode.ts → models/chapter/LabelNode.js} +10 -26
  369. package/models/chapter/LinkNode.d.ts +12 -0
  370. package/{src/lib/models/chapter/LinkNode.ts → models/chapter/LinkNode.js} +7 -12
  371. package/models/chapter/ListNode.d.ts +51 -0
  372. package/{src/lib/models/chapter/ListNode.ts → models/chapter/ListNode.js} +200 -277
  373. package/models/chapter/ListNode.test.d.ts +1 -0
  374. package/{src/lib/models/chapter/ListNode.test.ts → models/chapter/ListNode.test.js} +20 -57
  375. package/models/chapter/MetadataNode.d.ts +17 -0
  376. package/models/chapter/MetadataNode.js +32 -0
  377. package/models/chapter/Node.d.ts +38 -0
  378. package/{src/lib/models/chapter/Node.ts → models/chapter/Node.js} +71 -155
  379. package/models/chapter/Node.test.d.ts +1 -0
  380. package/{src/lib/models → models}/chapter/Node.test.js +0 -0
  381. package/models/chapter/ParagraphNode.d.ts +33 -0
  382. package/{src/lib/models/chapter/ParagraphNode.ts → models/chapter/ParagraphNode.js} +58 -95
  383. package/models/chapter/ParagraphNode.test.d.ts +1 -0
  384. package/models/chapter/ParagraphNode.test.js +30 -0
  385. package/models/chapter/Parser.d.ts +75 -0
  386. package/{src/lib/models/chapter/Parser.ts → models/chapter/Parser.js} +184 -369
  387. package/models/chapter/Parser.test.d.ts +1 -0
  388. package/{src/lib/models/chapter/Parser.test.ts → models/chapter/Parser.test.js} +0 -7
  389. package/{src/lib/models/chapter/Position.ts → models/chapter/Position.d.ts} +0 -0
  390. package/models/chapter/Position.js +1 -0
  391. package/models/chapter/QuoteNode.d.ts +25 -0
  392. package/models/chapter/QuoteNode.js +99 -0
  393. package/{src/lib/models/chapter/RootNode.ts → models/chapter/RootNode.d.ts} +0 -2
  394. package/models/chapter/RootNode.js +1 -0
  395. package/models/chapter/RuleNode.d.ts +15 -0
  396. package/{src/lib/models/chapter/RuleNode.ts → models/chapter/RuleNode.js} +6 -9
  397. package/models/chapter/TableNode.d.ts +37 -0
  398. package/{src/lib/models/chapter/TableNode.ts → models/chapter/TableNode.js} +82 -141
  399. package/models/chapter/TableNode.test.d.ts +1 -0
  400. package/{src/lib/models/chapter/TableNode.test.ts → models/chapter/TableNode.test.js} +10 -27
  401. package/models/chapter/TextNode.d.ts +36 -0
  402. package/{src/lib/models/chapter/TextNode.ts → models/chapter/TextNode.js} +65 -117
  403. package/models/chapter/TextNode.test.d.ts +1 -0
  404. package/{src/lib/models/chapter/TextNode.test.ts → models/chapter/TextNode.test.js} +0 -2
  405. package/package.json +270 -53
  406. package/util/getSubdomain.d.ts +3 -0
  407. package/{src/lib/util/getSubdomain.ts → util/getSubdomain.js} +8 -14
  408. package/util/isMobile.d.ts +2 -0
  409. package/{src/lib/util/isMobile.ts → util/isMobile.js} +0 -1
  410. package/util/mineReference.d.ts +4 -0
  411. package/{src/lib/util/mineReference.ts → util/mineReference.js} +25 -45
  412. package/util/scrollToEyeLevel.d.ts +2 -0
  413. package/{src/lib/util/scrollToEyeLevel.ts → util/scrollToEyeLevel.js} +2 -4
  414. package/.env.example +0 -8
  415. package/.firebaserc +0 -8
  416. package/.prettierignore +0 -8
  417. package/.prettierrc.json +0 -5
  418. package/_update-notifier-last-checked +0 -0
  419. package/firebase.json +0 -46
  420. package/firestore.indexes.json +0 -4
  421. package/firestore.rules +0 -59
  422. package/functions/.eslintrc.js +0 -28
  423. package/functions/package-lock.json +0 -12595
  424. package/functions/package.json +0 -43
  425. package/functions/src/index.ts +0 -345
  426. package/functions/tsconfig.dev.json +0 -3
  427. package/functions/tsconfig.json +0 -15
  428. package/scripts/claims.cjs +0 -99
  429. package/src/app.d.ts +0 -9
  430. package/src/app.html +0 -24
  431. package/src/lib/components/Auth.svelte +0 -65
  432. package/src/lib/components/Link.svelte +0 -58
  433. package/src/lib/components/chapter/Block.svelte +0 -42
  434. package/src/lib/components/chapter/ErrorMessage.svelte +0 -12
  435. package/src/lib/components/chapter/Python.svelte +0 -144
  436. package/src/lib/components/chapter/Text.svelte +0 -109
  437. package/src/lib/components/editor/BookishEditor.svelte +0 -1101
  438. package/src/lib/components/editor/CalloutEditor.svelte +0 -14
  439. package/src/lib/components/editor/CaretContext.ts +0 -55
  440. package/src/lib/components/editor/CitationsEditor.svelte +0 -64
  441. package/src/lib/components/editor/ConfirmButton.svelte +0 -51
  442. package/src/lib/components/editor/DefinitionEditor.svelte +0 -44
  443. package/src/lib/components/editor/EmbedEditor.svelte +0 -152
  444. package/src/lib/components/editor/InlineCodeEditor.svelte +0 -16
  445. package/src/lib/components/editor/LinkEditor.svelte +0 -110
  446. package/src/lib/components/editor/PositionEditor.svelte +0 -21
  447. package/src/lib/components/editor/QuoteEditor.svelte +0 -14
  448. package/src/lib/components/editor/TableEditor.svelte +0 -14
  449. package/src/lib/components/editor/Toggle.svelte +0 -47
  450. package/src/lib/components/editor/Toolbar.svelte +0 -297
  451. package/src/lib/components/editor/URLEditor.svelte +0 -15
  452. package/src/lib/components/page/Authors.svelte +0 -92
  453. package/src/lib/components/page/BookLoader.svelte +0 -77
  454. package/src/lib/components/page/BulkReferenceEditor.svelte +0 -86
  455. package/src/lib/components/page/Chapter.svelte +0 -449
  456. package/src/lib/components/page/ChapterContext.ts +0 -13
  457. package/src/lib/components/page/Contexts.ts +0 -176
  458. package/src/lib/components/page/Edition.svelte +0 -189
  459. package/src/lib/components/page/EditionLoader.svelte +0 -123
  460. package/src/lib/components/page/Page.svelte +0 -94
  461. package/src/lib/components/page/PossibleChapter.svelte +0 -16
  462. package/src/lib/components/page/PossibleReference.svelte +0 -14
  463. package/src/lib/components/page/Search.svelte +0 -153
  464. package/src/lib/components/page/TableOfContentsImage.svelte +0 -22
  465. package/src/lib/components/page/ThemeSetEditor.svelte +0 -21
  466. package/src/lib/models/CRUD.ts +0 -469
  467. package/src/lib/models/book/Book.ts +0 -283
  468. package/src/lib/models/book/BookMedia.ts +0 -182
  469. package/src/lib/models/book/BookSaveStatus.ts +0 -8
  470. package/src/lib/models/book/Chapter.ts +0 -462
  471. package/src/lib/models/book/Definition.ts +0 -2
  472. package/src/lib/models/book/Edition.ts +0 -1216
  473. package/src/lib/models/book/Reference.ts +0 -171
  474. package/src/lib/models/chapter/BlocksNode.test.ts +0 -867
  475. package/src/lib/models/chapter/CalloutNode.ts +0 -79
  476. package/src/lib/models/chapter/ChapterNode.ts +0 -169
  477. package/src/lib/models/chapter/CommentNode.ts +0 -61
  478. package/src/lib/models/chapter/Edit.ts +0 -6
  479. package/src/lib/models/chapter/EmbedNode.ts +0 -257
  480. package/src/lib/models/chapter/FootnoteNode.ts +0 -59
  481. package/src/lib/models/chapter/FormatNode.test.ts +0 -137
  482. package/src/lib/models/chapter/MetadataNode.ts +0 -44
  483. package/src/lib/models/chapter/ParagraphNode.test.ts +0 -54
  484. package/src/lib/models/chapter/QuoteNode.ts +0 -135
  485. package/src/params/edition.ts +0 -3
  486. package/src/routes/+error.svelte +0 -12
  487. package/src/routes/+layout.svelte +0 -241
  488. package/src/routes/+page.svelte +0 -43
  489. package/src/routes/Footer.svelte +0 -0
  490. package/src/routes/Header.svelte +0 -112
  491. package/src/routes/[bookid]/+layout.svelte +0 -5
  492. package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +0 -14
  493. package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
  494. package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
  495. package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
  496. package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
  497. package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
  498. package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
  499. package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
  500. package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
  501. package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
  502. package/src/routes/[bookid]/editions/+page.svelte +0 -20
  503. package/src/routes/about/+page.svelte +0 -102
  504. package/src/routes/confirm/+page.svelte +0 -62
  505. package/src/routes/email/+page.svelte +0 -99
  506. package/src/routes/login/+page.svelte +0 -66
  507. package/src/routes/read/+page.svelte +0 -38
  508. package/src/routes/write/+error.svelte +0 -10
  509. package/src/routes/write/+layout.svelte +0 -11
  510. package/src/routes/write/+page.svelte +0 -114
  511. package/src/routes/write/[bookid]/+layout.svelte +0 -5
  512. package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
  513. package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
  514. package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
  515. package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
  516. package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
  517. package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
  518. package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
  519. package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
  520. package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
  521. package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +0 -5
  522. package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +0 -5
  523. package/src/routes/write/[bookid]/editions/+page.svelte +0 -20
  524. package/src/vite-env.d.ts +0 -1
  525. package/static/icons/favicon.png +0 -0
  526. package/static/icons/icon.png +0 -0
  527. package/static/icons/ios-icon.png +0 -0
  528. package/storage.rules +0 -9
  529. package/svelte.config.js +0 -19
  530. package/tsconfig.json +0 -18
  531. package/tsconfig.node.json +0 -9
  532. package/vite.config.ts +0 -8
  533. package/vite.reader.config.ts +0 -32
@@ -1,1216 +0,0 @@
1
- import Chapter from './Chapter';
2
- import type { ChapterSpecification } from './Chapter';
3
- import Parser from '../chapter/Parser';
4
- import EmbedNode from '../chapter/EmbedNode';
5
- import Reference from './Reference';
6
- import type Theme from './Theme';
7
- import type Definition from './Definition.js';
8
- import ChapterIDs from './ChapterID.js';
9
- import type { DocumentReference } from 'firebase/firestore';
10
- import type Book from './Book';
11
- import type FormatNode from '../chapter/FormatNode';
12
- import type { EditionInfo } from './Book';
13
-
14
- export type EditionSpecification = {
15
- bookRef: DocumentReference;
16
- // The title of the book.
17
- title: string;
18
- // A numerical string indicating the version of the book. Can be any string, but is sorted alphanumerically.
19
- number: number;
20
- // A summary of the revisions in the edition
21
- summary: string;
22
- // A time stamp or nothing, indicating when the book was published.
23
- published: number | null;
24
- authors: string[];
25
- images: Record<string, string | null>;
26
- description: string;
27
- chapters: ChapterSpecification[];
28
- license: string;
29
- acknowledgements: string;
30
- tags: string[];
31
- sources: Record<string, string>;
32
- references: Record<string, string | string[]>;
33
- symbols: Record<string, string>;
34
- glossary: Record<string, Definition>;
35
- theme: Theme | null;
36
- base: string | null;
37
- uids: string[];
38
- chapteruids: string[];
39
- active: Record<string, string>;
40
- };
41
-
42
- export default class Edition {
43
- readonly bookRef: DocumentReference;
44
- readonly editionRef: DocumentReference | undefined;
45
- readonly uids: string[];
46
- readonly title: string;
47
- readonly authors: string[];
48
- readonly number: number;
49
- readonly summary: string;
50
- readonly published: number | null;
51
- readonly images: Record<string, string | null>;
52
- readonly description: string;
53
- readonly chapters: Chapter[];
54
- readonly license: string;
55
- readonly acknowledgements: string;
56
- readonly tags: string[];
57
- readonly sources: Record<string, string>;
58
- readonly references: Record<string, Reference | FormatNode>;
59
- readonly symbols: Record<string, string>;
60
- readonly glossary: Record<string, Definition>;
61
- readonly theme: Theme | null;
62
- readonly base: string | null;
63
- readonly active: Record<string, string>;
64
-
65
- // Given an object with a valid specification and an object mapping chapter IDs to chapter text,
66
- // construct an object representing a book.
67
- constructor(
68
- bookRef: DocumentReference,
69
- editionRef: DocumentReference | undefined,
70
- uids: string[],
71
- title: string,
72
- authors: string[],
73
- number: number,
74
- summary: string,
75
- published: number | null,
76
- images: Record<string, string | null>,
77
- description: string,
78
- chapters: Chapter[],
79
- license: string,
80
- acknowledgements: string,
81
- tags: string[],
82
- sources: Record<string, string>,
83
- references:
84
- | Record<string, string | string[]>
85
- | Record<string, FormatNode | Reference>,
86
- symbols: Record<string, string>,
87
- glossary: Record<string, Definition>,
88
- theme: Theme | null,
89
- base: string | null,
90
- active: Record<string, string>
91
- ) {
92
- this.bookRef = bookRef;
93
- this.editionRef = editionRef;
94
- this.uids = uids;
95
- this.title = title;
96
- this.authors = authors;
97
- this.number = number;
98
- this.summary = summary;
99
- this.published = published;
100
- this.images = images;
101
- this.description = description;
102
- this.chapters = chapters.slice();
103
- this.license = license;
104
- this.acknowledgements = acknowledgements;
105
- this.tags = tags.slice();
106
- this.sources = Object.assign({}, sources);
107
- this.references = {};
108
- for (const [citationID, ref] of Object.entries(references)) {
109
- this.references[citationID] =
110
- ref instanceof Reference
111
- ? ref
112
- : Edition.parseReference(citationID, ref, this);
113
- }
114
- this.symbols = Object.assign({}, symbols);
115
- this.glossary = Object.assign({}, glossary);
116
- this.theme = theme;
117
- this.base = base;
118
- this.active = active;
119
- }
120
-
121
- static fromJSON(
122
- editionRef: DocumentReference | undefined,
123
- spec: EditionSpecification
124
- ) {
125
- // Copy all of the specification metadata to fields.
126
- // Choose suitable defaults if the spec is lacking a field.
127
- return new Edition(
128
- spec.bookRef,
129
- editionRef,
130
- spec.uids,
131
- spec.title,
132
- spec.authors,
133
- spec.number,
134
- spec.summary,
135
- spec.published,
136
- spec.images,
137
- spec.description,
138
- spec.chapters.map((chap) => Chapter.fromJSON(chap, '')),
139
- spec.license,
140
- spec.acknowledgements,
141
- spec.tags ?? [],
142
- spec.sources ?? {},
143
- spec.references ?? {},
144
- spec.symbols ?? {},
145
- spec.glossary ?? {},
146
- spec.theme,
147
- spec.base ?? '',
148
- spec.active
149
- );
150
- }
151
-
152
- static parseReference(
153
- citationID: string,
154
- ref: string | string[],
155
- edition: Edition,
156
- short = false
157
- ) {
158
- if (typeof ref === 'string') return Parser.parseFormat(edition, ref);
159
- else {
160
- // APA Format. Could eventually support multiple formats.
161
- let [authors, year, title, source, url, summary] = ref;
162
-
163
- if (source.charAt(0) === '#') {
164
- let src = edition.getSource(source);
165
- if (src !== null) source = src;
166
- }
167
-
168
- return new Reference(
169
- citationID,
170
- authors ?? '',
171
- year ?? '',
172
- title ?? '',
173
- source ?? '',
174
- url ?? '',
175
- summary ?? '',
176
- short
177
- );
178
- }
179
- }
180
-
181
- // Convert the book to an object for storage.
182
- toObject(): EditionSpecification {
183
- const references: Record<string, string | string[]> = {};
184
- for (const [citationID, ref] of Object.entries(this.references))
185
- references[citationID] =
186
- ref instanceof Reference ? ref.toList() : ref.toBookdown();
187
-
188
- const editionJSON: EditionSpecification = {
189
- bookRef: this.bookRef,
190
- title: this.title,
191
- authors: this.authors,
192
- number: this.number,
193
- summary: this.summary,
194
- published: this.published,
195
- images: Object.assign({}, this.images),
196
- description: this.description,
197
- chapters: this.chapters.map((chap) => chap.toJSON()),
198
- license: this.license,
199
- acknowledgements: this.acknowledgements,
200
- tags: this.tags.slice(),
201
- sources: Object.assign({}, this.sources),
202
- references: references,
203
- symbols: Object.assign({}, this.symbols),
204
- glossary: Object.assign({}, this.glossary),
205
- theme: this.theme,
206
- base: this.base,
207
- uids: this.uids.slice(),
208
- chapteruids: this.getChapterUIDS(),
209
- active: this.active,
210
- };
211
- return editionJSON;
212
- }
213
-
214
- getBookRef() {
215
- return this.bookRef;
216
- }
217
-
218
- getEditionRef() {
219
- return this.editionRef;
220
- }
221
-
222
- getChapterUIDS() {
223
- return Array.from(
224
- new Set(this.chapters.map((chapter) => chapter.uids).flat())
225
- );
226
- }
227
-
228
- withRef(editionRef: DocumentReference | undefined) {
229
- return new Edition(
230
- this.bookRef,
231
- editionRef,
232
- this.uids,
233
- this.title,
234
- this.authors,
235
- this.number,
236
- this.summary,
237
- this.published,
238
- this.images,
239
- this.description,
240
- this.chapters,
241
- this.license,
242
- this.acknowledgements,
243
- this.tags,
244
- this.sources,
245
- this.references,
246
- this.symbols,
247
- this.glossary,
248
- this.theme,
249
- this.base,
250
- this.active
251
- );
252
- }
253
-
254
- getTitle() {
255
- return this.title;
256
- }
257
-
258
- withTitle(title: string): Edition {
259
- return new Edition(
260
- this.bookRef,
261
- this.editionRef,
262
- this.uids,
263
- title,
264
- this.authors,
265
- this.number,
266
- this.summary,
267
- this.published,
268
- this.images,
269
- this.description,
270
- this.chapters,
271
- this.license,
272
- this.acknowledgements,
273
- this.tags,
274
- this.sources,
275
- this.references,
276
- this.symbols,
277
- this.glossary,
278
- this.theme,
279
- this.base,
280
- this.active
281
- );
282
- }
283
-
284
- getDescription() {
285
- return this.description;
286
- }
287
- setDescription(description: string): Edition {
288
- return new Edition(
289
- this.bookRef,
290
- this.editionRef,
291
- this.uids,
292
- this.title,
293
- this.authors,
294
- this.number,
295
- this.summary,
296
- this.published,
297
- this.images,
298
- description,
299
- this.chapters,
300
- this.license,
301
- this.acknowledgements,
302
- this.tags,
303
- this.sources,
304
- this.references,
305
- this.symbols,
306
- this.glossary,
307
- this.theme,
308
- this.base,
309
- this.active
310
- );
311
- }
312
-
313
- getAcknowledgements() {
314
- return this.acknowledgements;
315
- }
316
-
317
- withAcknowledgements(acks: string) {
318
- return new Edition(
319
- this.bookRef,
320
- this.editionRef,
321
- this.uids,
322
- this.title,
323
- this.authors,
324
- this.number,
325
- this.summary,
326
- this.published,
327
- this.images,
328
- this.description,
329
- this.chapters,
330
- this.license,
331
- acks,
332
- this.tags,
333
- this.sources,
334
- this.references,
335
- this.symbols,
336
- this.glossary,
337
- this.theme,
338
- this.base,
339
- this.active
340
- );
341
- }
342
-
343
- withSummary(summary: string) {
344
- return new Edition(
345
- this.bookRef,
346
- this.editionRef,
347
- this.uids,
348
- this.title,
349
- this.authors,
350
- this.number,
351
- summary,
352
- this.published,
353
- this.images,
354
- this.description,
355
- this.chapters,
356
- this.license,
357
- this.acknowledgements,
358
- this.tags,
359
- this.sources,
360
- this.references,
361
- this.symbols,
362
- this.glossary,
363
- this.theme,
364
- this.base,
365
- this.active
366
- );
367
- }
368
-
369
- asPublished(published: boolean) {
370
- return new Edition(
371
- this.bookRef,
372
- this.editionRef,
373
- this.uids,
374
- this.title,
375
- this.authors,
376
- this.number,
377
- this.summary,
378
- published ? Date.now() : null,
379
- this.images,
380
- this.description,
381
- this.chapters,
382
- this.license,
383
- this.acknowledgements,
384
- this.tags,
385
- this.sources,
386
- this.references,
387
- this.symbols,
388
- this.glossary,
389
- this.theme,
390
- this.base,
391
- this.active
392
- );
393
- }
394
-
395
- getLicense() {
396
- return this.license;
397
- }
398
- setLicense(license: string) {
399
- return new Edition(
400
- this.bookRef,
401
- this.editionRef,
402
- this.uids,
403
- this.title,
404
- this.authors,
405
- this.number,
406
- this.summary,
407
- this.published,
408
- this.images,
409
- this.description,
410
- this.chapters,
411
- license,
412
- this.acknowledgements,
413
- this.tags,
414
- this.sources,
415
- this.references,
416
- this.symbols,
417
- this.glossary,
418
- this.theme,
419
- this.base,
420
- this.active
421
- );
422
- }
423
-
424
- getChapters() {
425
- return this.chapters.slice();
426
- }
427
-
428
- hasChapter(chapterID: string): boolean {
429
- return (
430
- this.getChapter(chapterID) !== undefined ||
431
- ['references', 'glossary', 'index', 'search', 'media'].includes(
432
- chapterID
433
- )
434
- );
435
- }
436
-
437
- getChapter(chapterID: string): Chapter | undefined {
438
- return this.chapters.find((chapter) => chapter.getID() === chapterID);
439
- }
440
-
441
- getChapterByRef(ref: DocumentReference): Chapter | undefined {
442
- return this.chapters.find(
443
- (chap) => chap.ref !== undefined && chap.ref.id === ref.id
444
- );
445
- }
446
-
447
- getChapterPosition(chapterID: string): number | undefined {
448
- var position = 0;
449
- for (; position < this.chapters.length; position++)
450
- if (this.chapters[position].getID() === chapterID) return position;
451
-
452
- return undefined;
453
- }
454
-
455
- getChapterCount() {
456
- return this.chapters.length;
457
- }
458
-
459
- withChapters(chapters: Chapter[]) {
460
- return new Edition(
461
- this.bookRef,
462
- this.editionRef,
463
- this.uids,
464
- this.title,
465
- this.authors,
466
- this.number,
467
- this.summary,
468
- this.published,
469
- this.images,
470
- this.description,
471
- chapters,
472
- this.license,
473
- this.acknowledgements,
474
- this.tags,
475
- this.sources,
476
- this.references,
477
- this.symbols,
478
- this.glossary,
479
- this.theme,
480
- this.base,
481
- this.active
482
- );
483
- }
484
-
485
- withChapterText(text: [DocumentReference, string][]) {
486
- return this.withChapters(
487
- this.chapters.map((chapter) => {
488
- if (chapter.ref === undefined) return chapter;
489
- const match = text.find(
490
- ([ref, text]) =>
491
- chapter.ref !== undefined &&
492
- chapter.ref.id === ref.id &&
493
- chapter.text !== text &&
494
- text !== undefined
495
- );
496
- return match ? chapter.withText(match[1]) : chapter;
497
- })
498
- );
499
- }
500
-
501
- withRevisedChapter(previous: Chapter, edited: Chapter) {
502
- const index = this.chapters.indexOf(previous);
503
- if (index < 0) return this;
504
- return this.withChapters([
505
- ...this.chapters.slice(0, index),
506
- edited,
507
- ...this.chapters.slice(index + 1),
508
- ]);
509
- }
510
-
511
- withoutRefs() {
512
- return this.withRef(undefined).withChapters(
513
- this.chapters.map((chap) => chap.withoutRef())
514
- );
515
- }
516
-
517
- withIncrementedEditionNumber() {
518
- return new Edition(
519
- this.bookRef,
520
- this.editionRef,
521
- this.uids,
522
- this.title,
523
- this.authors,
524
- this.number + 1,
525
- this.summary,
526
- this.published,
527
- this.images,
528
- this.description,
529
- this.chapters,
530
- this.license,
531
- this.acknowledgements,
532
- this.tags,
533
- this.sources,
534
- this.references,
535
- this.symbols,
536
- this.glossary,
537
- this.theme,
538
- this.base,
539
- this.active
540
- );
541
- }
542
-
543
- withNewChapter() {
544
- // Synthesize a chapter ID placeholder that doesn't overlap with existing chapter names
545
- let number = 1;
546
- while (this.hasChapter('chapter' + number)) number++;
547
-
548
- // Create a default chapter on this model. Remember the document reference so we can modify it later.
549
- const newChapter = new Chapter(
550
- undefined,
551
- `chapter${number}`,
552
- 'Untitled Chapter',
553
- [],
554
- null,
555
- true,
556
- false,
557
- undefined,
558
- '',
559
- []
560
- );
561
- return this.withChapters([...this.chapters, newChapter]);
562
- }
563
-
564
- withoutChapter(chapterID: string): Edition {
565
- let index = this.chapters.findIndex(
566
- (chapter) => chapter.getID() === chapterID
567
- );
568
- if (index < 0) return this;
569
-
570
- return this.withChapters([
571
- ...this.chapters.slice(0, index),
572
- ...this.chapters.slice(index + 1),
573
- ]);
574
- }
575
-
576
- withMovedChapter(chapterID: string, increment: number): Edition {
577
- // Get the index of the chapter.
578
- let index = this.chapters.findIndex(
579
- (chapter) => chapter.getID() === chapterID
580
- );
581
- if (index + increment < 0 || index + increment >= this.chapters.length)
582
- return this;
583
-
584
- const newChapters = this.chapters.slice();
585
- const temp = newChapters[index + increment];
586
- newChapters[index + increment] = newChapters[index];
587
- newChapters[index] = temp;
588
-
589
- return new Edition(
590
- this.bookRef,
591
- this.editionRef,
592
- this.uids,
593
- this.title,
594
- this.authors,
595
- this.number,
596
- this.summary,
597
- this.published,
598
- this.images,
599
- this.description,
600
- newChapters,
601
- this.license,
602
- this.acknowledgements,
603
- this.tags,
604
- this.sources,
605
- this.references,
606
- this.symbols,
607
- this.glossary,
608
- this.theme,
609
- this.base,
610
- this.active
611
- );
612
- }
613
-
614
- getSymbols() {
615
- return this.symbols;
616
- }
617
-
618
- hasReferences() {
619
- return Object.keys(this.references).length > 0;
620
- }
621
-
622
- getReferences() {
623
- return Object.assign({}, this.references);
624
- }
625
-
626
- getReference(citationID: string) {
627
- return citationID in this.references
628
- ? this.references[citationID]
629
- : undefined;
630
- }
631
-
632
- withReferences(newReferences: Record<string, FormatNode | Reference>) {
633
- return new Edition(
634
- this.bookRef,
635
- this.editionRef,
636
- this.uids,
637
- this.title,
638
- this.authors,
639
- this.number,
640
- this.summary,
641
- this.published,
642
- this.images,
643
- this.description,
644
- this.chapters,
645
- this.license,
646
- this.acknowledgements,
647
- this.tags,
648
- this.sources,
649
- newReferences,
650
- this.symbols,
651
- this.glossary,
652
- this.theme,
653
- this.base,
654
- this.active
655
- );
656
- }
657
-
658
- withNewReferences(references: Reference[]): Edition {
659
- const newReferences = Object.assign({}, this.references);
660
- // Generate a unique ID for the reference.
661
- for (const newRef of references)
662
- newReferences[newRef.citationID] = newRef;
663
- return this.withReferences(newReferences);
664
- }
665
-
666
- withEditedReference(ref: Reference) {
667
- if (!(ref.citationID in this.references)) return this;
668
- const newReferences = Object.assign({}, this.references);
669
- newReferences[ref.citationID] = ref;
670
- return this.withReferences(newReferences);
671
- }
672
-
673
- withEditedReferenceID(newCitationID: string, ref: Reference) {
674
- if (!(ref.citationID in this.references)) return;
675
- const newReferences = Object.assign({}, this.references);
676
- delete newReferences[ref.citationID];
677
- newReferences[newCitationID] = ref.withCitationID(newCitationID);
678
- return this.withReferences(newReferences);
679
- }
680
-
681
- withoutReference(citationID: string) {
682
- if (!(citationID in this.references)) return this;
683
- const newReferences = Object.assign({}, this.references);
684
- delete newReferences[citationID];
685
- return this.withReferences(newReferences);
686
- }
687
-
688
- hasGlossary() {
689
- return Object.keys(this.glossary).length > 0;
690
- }
691
-
692
- getGlossary() {
693
- return Object.assign({}, this.glossary);
694
- }
695
-
696
- hasDefinition(id: string) {
697
- return id in this.glossary;
698
- }
699
-
700
- withGlossary(glossary: Record<string, Definition>) {
701
- return new Edition(
702
- this.bookRef,
703
- this.editionRef,
704
- this.uids,
705
- this.title,
706
- this.authors,
707
- this.number,
708
- this.summary,
709
- this.published,
710
- this.images,
711
- this.description,
712
- this.chapters,
713
- this.license,
714
- this.acknowledgements,
715
- this.tags,
716
- this.sources,
717
- this.references,
718
- this.symbols,
719
- glossary,
720
- this.theme,
721
- this.base,
722
- this.active
723
- );
724
- }
725
-
726
- withDefinition(
727
- id: string,
728
- phrase: string,
729
- definition: string,
730
- synonyms: string[]
731
- ): Edition {
732
- const newGlossary = Object.assign({}, this.glossary);
733
- newGlossary[id] = {
734
- phrase: phrase,
735
- definition: definition,
736
- synonyms: synonyms,
737
- };
738
- return this.withGlossary(newGlossary);
739
- }
740
-
741
- withoutDefinition(id: string): Edition {
742
- const newGlossary = Object.assign({}, this.glossary);
743
- delete newGlossary[id];
744
- return this.withGlossary(newGlossary);
745
- }
746
-
747
- withEditedDefinition(id: string, definition: Definition): Edition {
748
- const newGlossary = Object.assign({}, this.glossary);
749
- newGlossary[id] = definition;
750
- return this.withGlossary(newGlossary);
751
- }
752
-
753
- withEditedDefinitionID(id: string, newID: string) {
754
- if (!(id in this.glossary)) return;
755
- const newGlossary = Object.assign({}, this.glossary);
756
- const definition = newGlossary[id];
757
- delete newGlossary[id];
758
- newGlossary[newID] = definition;
759
- return this.withGlossary(newGlossary);
760
- }
761
-
762
- getTags() {
763
- return this.tags;
764
- }
765
-
766
- getTheme() {
767
- return this.theme;
768
- }
769
-
770
- withTheme(theme: Theme | null) {
771
- return new Edition(
772
- this.bookRef,
773
- this.editionRef,
774
- this.uids,
775
- this.title,
776
- this.authors,
777
- this.number,
778
- this.summary,
779
- this.published,
780
- this.images,
781
- this.description,
782
- this.chapters,
783
- this.license,
784
- this.acknowledgements,
785
- this.tags,
786
- this.sources,
787
- this.references,
788
- this.symbols,
789
- this.glossary,
790
- theme,
791
- this.base,
792
- this.active
793
- );
794
- }
795
-
796
- withThemeValue(group: string, name: string, value: string) {
797
- if (this.theme === null) return this;
798
- if (group === 'imports') return this;
799
- const newTheme: Record<string, Record<string, string>> = Object.assign(
800
- {},
801
- this.theme as Record<string, Record<string, string>>
802
- );
803
- const newGroup: Record<string, string> = Object.assign(
804
- {},
805
- (this.theme as Record<string, Record<string, string>>)[group]
806
- );
807
- newGroup[name] = value;
808
- newTheme[group] = newGroup;
809
- return this.withTheme(newTheme);
810
- }
811
-
812
- // Don't let callers get their sneaky hands on this mutable array...
813
- getAuthors() {
814
- return [...this.authors];
815
- }
816
-
817
- withAuthors(authors: string[]) {
818
- return new Edition(
819
- this.bookRef,
820
- this.editionRef,
821
- this.uids,
822
- this.title,
823
- authors,
824
- this.number,
825
- this.summary,
826
- this.published,
827
- this.images,
828
- this.description,
829
- this.chapters,
830
- this.license,
831
- this.acknowledgements,
832
- this.tags,
833
- this.sources,
834
- this.references,
835
- this.symbols,
836
- this.glossary,
837
- this.theme,
838
- this.base,
839
- this.active
840
- );
841
- }
842
-
843
- withAuthor(name: string) {
844
- return this.withAuthors([...this.authors, name]);
845
- }
846
-
847
- withAuthorName(index: number, name: string) {
848
- if (index < 0 || index >= this.authors.length) return this;
849
- return this.withAuthors([
850
- ...this.authors.slice(0, index),
851
- name,
852
- ...this.authors.slice(index + 1),
853
- ]);
854
- }
855
-
856
- withoutAuthor(index: number) {
857
- if (index < 0 || index >= this.authors.length) return this;
858
- return this.withAuthors([
859
- ...this.authors.slice(0, index),
860
- ...this.authors.slice(index + 1),
861
- ]);
862
- }
863
-
864
- withEditors(uids: string[]) {
865
- return new Edition(
866
- this.bookRef,
867
- this.editionRef,
868
- uids,
869
- this.title,
870
- this.authors,
871
- this.number,
872
- this.summary,
873
- this.published,
874
- this.images,
875
- this.description,
876
- this.chapters,
877
- this.license,
878
- this.acknowledgements,
879
- this.tags,
880
- this.sources,
881
- this.references,
882
- this.symbols,
883
- this.glossary,
884
- this.theme,
885
- this.base,
886
- this.active
887
- );
888
- }
889
-
890
- hasImage(id: string) {
891
- return this.images[id] !== null;
892
- }
893
-
894
- getImage(id: string) {
895
- return this.images[id] ?? null;
896
- }
897
-
898
- withImage(id: string, embed: string | null) {
899
- const newImages = Object.assign({}, this.images);
900
- newImages[id] = embed;
901
- return new Edition(
902
- this.bookRef,
903
- this.editionRef,
904
- this.uids,
905
- this.title,
906
- this.authors,
907
- this.number,
908
- this.summary,
909
- this.published,
910
- newImages,
911
- this.description,
912
- this.chapters,
913
- this.license,
914
- this.acknowledgements,
915
- this.tags,
916
- this.sources,
917
- this.references,
918
- this.symbols,
919
- this.glossary,
920
- this.theme,
921
- this.base,
922
- this.active
923
- );
924
- }
925
-
926
- isEditor(uid: string) {
927
- return this.uids.includes(uid);
928
- }
929
-
930
- isChapterEditor(uid: string) {
931
- return this.getChapterUIDS().includes(uid);
932
- }
933
-
934
- getLeasee(content: string): string | undefined {
935
- return this.active[content];
936
- }
937
-
938
- hasLease(uid: string, content: string) {
939
- return this.active[content] === uid;
940
- }
941
-
942
- isLeased(contentID: string) {
943
- return contentID in this.active;
944
- }
945
-
946
- withLock(uid: string, content: string, lock: boolean) {
947
- const newActive = Object.assign({}, this.active);
948
- if (lock) newActive[content] = uid;
949
- else delete newActive[content];
950
-
951
- return new Edition(
952
- this.bookRef,
953
- this.editionRef,
954
- this.uids,
955
- this.title,
956
- this.authors,
957
- this.number,
958
- this.summary,
959
- this.published,
960
- this.images,
961
- this.description,
962
- this.chapters,
963
- this.license,
964
- this.acknowledgements,
965
- this.tags,
966
- this.sources,
967
- this.references,
968
- this.symbols,
969
- this.glossary,
970
- this.theme,
971
- this.base,
972
- newActive
973
- );
974
- }
975
-
976
- getBookReadingTime() {
977
- return this.chapters
978
- .map((chapter) => chapter.getReadingTime(this))
979
- .reduce(
980
- (total, time) =>
981
- total === undefined
982
- ? 0
983
- : time === undefined
984
- ? total
985
- : total + time,
986
- 0
987
- );
988
- }
989
-
990
- getChapterNumber(chapterID: string) {
991
- let chapterNumber = 1;
992
- let match = null;
993
- this.chapters.forEach((chapter) => {
994
- // If we found a match...
995
- if (chapter.getID() === chapterID) {
996
- match = chapterNumber;
997
- // And it's an unnumbered chapter, set to null.
998
- if (!chapter.isNumbered()) match = null;
999
- }
1000
- // Otherwise, increment if it's numbered.
1001
- else if (chapter.isNumbered()) chapterNumber++;
1002
- });
1003
- // Remember the number if we found it.
1004
- if (match !== null) return match;
1005
- else return undefined;
1006
- }
1007
-
1008
- getSource(sourceID: string) {
1009
- return sourceID.charAt(0) === '#' &&
1010
- sourceID.substring(1) in this.sources
1011
- ? this.sources[sourceID.substring(1)]
1012
- : null;
1013
- }
1014
-
1015
- getChapterName(chapterID: string): string | undefined {
1016
- const chapter = this.getChapter(chapterID);
1017
- return chapter?.getTitle();
1018
- }
1019
-
1020
- getChapterSection(chapterID: string): string | undefined {
1021
- const chapter = this.getChapter(chapterID);
1022
- return chapter?.getSection();
1023
- }
1024
-
1025
- getFootnoteSymbol(number: number) {
1026
- let symbols = 'abcdefghijklmnopqrstuvwxyz';
1027
- // Let's hope there are never more than 26^2 footnotes in a single chapter...
1028
- return number < symbols.length
1029
- ? symbols.charAt(number)
1030
- : symbols.charAt(Math.floor(number / symbols.length) - 1) +
1031
- symbols.charAt(number % symbols.length);
1032
- }
1033
-
1034
- getBookIndex(): Record<string, Set<string>> {
1035
- // A map from word to a map of chapters containing the word
1036
- const bookIndex: Record<string, Set<string>> = {};
1037
-
1038
- // Construct the index by building a dictionary of chapters in which each word appears.
1039
- this.chapters.forEach((chapter) => {
1040
- let index = chapter.getIndex(this);
1041
- if (index)
1042
- Object.keys(index).forEach((word) => {
1043
- if (word !== '' && word.length > 2) {
1044
- if (!(word in bookIndex)) bookIndex[word] = new Set();
1045
- bookIndex[word].add(chapter.getID());
1046
- }
1047
- });
1048
- });
1049
-
1050
- return bookIndex;
1051
- }
1052
-
1053
- // Given the current chapter, find the available chapter after it.
1054
- getNextChapterID(chapterID: string) {
1055
- // Handle back matter chapters.
1056
- switch (chapterID) {
1057
- case ChapterIDs.ReferencesID:
1058
- return this.hasGlossary()
1059
- ? ChapterIDs.GlossaryID
1060
- : ChapterIDs.IndexID;
1061
- case ChapterIDs.GlossaryID:
1062
- return ChapterIDs.IndexID;
1063
- case ChapterIDs.IndexID:
1064
- return ChapterIDs.SearchID;
1065
- case ChapterIDs.SearchID:
1066
- return ChapterIDs.MediaID;
1067
- case ChapterIDs.MediaID:
1068
- return ChapterIDs.TableOfContentsID;
1069
- case ChapterIDs.TableOfContentsID:
1070
- return this.chapters.length > 0
1071
- ? this.chapters[0].getID()
1072
- : null;
1073
- default:
1074
- let after = false;
1075
- for (let i = 0; i < this.chapters.length; i++) {
1076
- let chapter = this.chapters[i];
1077
- if (chapter.getID() === chapterID) after = true;
1078
- // If we're after the given chapter and it's not forthcoming.
1079
- else if (after && !chapter.isForthcoming())
1080
- return chapter.getID();
1081
- }
1082
- // If the given ID was the last chapter, go to the next back matter chapter.
1083
- if (after)
1084
- return this.hasReferences()
1085
- ? ChapterIDs.ReferencesID
1086
- : this.hasGlossary()
1087
- ? ChapterIDs.GlossaryID
1088
- : ChapterIDs.IndexID;
1089
- // Otherwise, it wasn't a valid ID
1090
- else return null;
1091
- }
1092
- }
1093
-
1094
- // Given a chapter id, find the available chapter before it.
1095
- getPreviousChapterID(chapterID: string) {
1096
- switch (chapterID) {
1097
- // Handle back matter chapters.
1098
- case ChapterIDs.ReferencesID:
1099
- return this.chapters.length > 0
1100
- ? this.chapters[this.chapters.length - 1].getID()
1101
- : null; // Last chapter of the book
1102
- case ChapterIDs.GlossaryID:
1103
- return this.hasReferences()
1104
- ? ChapterIDs.ReferencesID
1105
- : this.chapters.length > 0
1106
- ? this.chapters[this.chapters.length - 1].getID()
1107
- : ChapterIDs.TableOfContentsID;
1108
- case ChapterIDs.IndexID:
1109
- return this.hasGlossary()
1110
- ? ChapterIDs.GlossaryID
1111
- : this.hasReferences()
1112
- ? ChapterIDs.ReferencesID
1113
- : this.chapters.length > 0
1114
- ? this.chapters[this.chapters.length - 1].getID()
1115
- : ChapterIDs.TableOfContentsID;
1116
- case ChapterIDs.SearchID:
1117
- return ChapterIDs.IndexID;
1118
- case ChapterIDs.MediaID:
1119
- return ChapterIDs.SearchID;
1120
- default:
1121
- let before = false;
1122
- for (let i = this.chapters.length - 1; i >= 0; i--) {
1123
- let chapter = this.chapters[i];
1124
- if (chapter.getID() === chapterID) before = true;
1125
- // If we're before the given chapter and it's not forthcoming.
1126
- else if (before && !chapter.isForthcoming())
1127
- return chapter.getID();
1128
- }
1129
- // If the given ID was the last chapter, go to the next back matter chapter.
1130
- if (before) return ChapterIDs.TableOfContentsID;
1131
- // Otherwise, it wasn't a valid ID
1132
- else return null;
1133
- }
1134
- }
1135
-
1136
- // Get all of the embeds in the book
1137
- getEmbeds(): EmbedNode[] {
1138
- let embeds: EmbedNode[] = [];
1139
-
1140
- // Add the book cover
1141
- const cover = this.getImage('cover');
1142
- if (cover) {
1143
- let coverNode = Parser.parseEmbed(this, cover);
1144
- if (coverNode instanceof EmbedNode) embeds.push(coverNode);
1145
- }
1146
-
1147
- // Add the cover and images from each chapter.
1148
- this.getChapters().forEach((c) => {
1149
- const image = c.getImage();
1150
- let cover =
1151
- image === null ? undefined : Parser.parseEmbed(this, image);
1152
- if (cover && cover instanceof EmbedNode) embeds.push(cover);
1153
-
1154
- // Get the chapter body's embeds
1155
- let bodyEmbeds = c?.getAST(this)?.getEmbeds();
1156
- if (bodyEmbeds)
1157
- bodyEmbeds.forEach((embed: EmbedNode) => embeds.push(embed));
1158
- });
1159
-
1160
- // Add the back matter covers
1161
- let backmatter = ['references', 'glossary', 'index', 'search', 'media'];
1162
- backmatter.forEach((id) => {
1163
- const img = this.getImage(id);
1164
- if (img) {
1165
- let image = Parser.parseEmbed(this, img);
1166
- if (image instanceof EmbedNode) embeds.push(image);
1167
- }
1168
- });
1169
-
1170
- return embeds;
1171
- }
1172
-
1173
- isLatestEdition(book: Book): boolean {
1174
- const latestEditionID = book.getLatestEditionID();
1175
- return (
1176
- latestEditionID !== undefined &&
1177
- latestEditionID === this.editionRef?.id
1178
- );
1179
- }
1180
-
1181
- isLatestPublishedEdition(book: Book): boolean {
1182
- const latestEditionID = book.getLatestPublishedEditionID();
1183
- return (
1184
- latestEditionID !== undefined &&
1185
- latestEditionID === this.editionRef?.id
1186
- );
1187
- }
1188
-
1189
- getEditionNumber() {
1190
- return this.number;
1191
- }
1192
-
1193
- getEditionLabel() {
1194
- const num = this.number;
1195
- return `${num}${
1196
- num === 1 ? 'st' : num === 2 ? 'nd' : num === 3 ? 'rd' : ''
1197
- }`;
1198
- }
1199
-
1200
- getInfo(): EditionInfo | undefined {
1201
- return this.editionRef === undefined
1202
- ? undefined
1203
- : {
1204
- ref: this.editionRef,
1205
- summary: this.summary,
1206
- number: this.number,
1207
- published: this.published,
1208
- editionuids: this.uids,
1209
- chapteruids: Array.from(
1210
- new Set(
1211
- this.chapters.map((chapter) => chapter.uids).flat()
1212
- )
1213
- ),
1214
- };
1215
- }
1216
- }