bookish-press 0.4.0 → 0.4.16

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 (394) hide show
  1. package/README.md +3 -1
  2. package/components/Auth.svelte +19 -14
  3. package/components/Auth.svelte.d.ts +4 -4
  4. package/components/Authentication.d.ts +2 -2
  5. package/components/BookPreview.svelte +77 -59
  6. package/components/BookPreview.svelte.d.ts +5 -5
  7. package/components/External.svelte +1 -1
  8. package/components/External.svelte.d.ts +3 -3
  9. package/components/Link.svelte +49 -3
  10. package/components/Link.svelte.d.ts +3 -4
  11. package/components/app/BookList.svelte +19 -0
  12. package/components/app/BookList.svelte.d.ts +18 -0
  13. package/components/app/Button.svelte +49 -0
  14. package/components/app/Button.svelte.d.ts +22 -0
  15. package/components/app/Feedback.svelte +45 -0
  16. package/components/app/Feedback.svelte.d.ts +18 -0
  17. package/components/app/Head.svelte +12 -0
  18. package/components/app/Head.svelte.d.ts +27 -0
  19. package/components/app/Large.svelte +8 -0
  20. package/components/app/Large.svelte.d.ts +27 -0
  21. package/components/app/Lead.svelte +12 -0
  22. package/components/app/Lead.svelte.d.ts +27 -0
  23. package/components/app/Link.svelte +24 -0
  24. package/components/app/Link.svelte.d.ts +20 -0
  25. package/components/app/Options.svelte +24 -0
  26. package/components/app/Options.svelte.d.ts +19 -0
  27. package/components/app/Paragraph.svelte +19 -0
  28. package/components/app/Paragraph.svelte.d.ts +18 -0
  29. package/components/app/Table.svelte +32 -0
  30. package/components/app/Table.svelte.d.ts +27 -0
  31. package/components/app/TextInput.svelte +37 -0
  32. package/components/app/TextInput.svelte.d.ts +22 -0
  33. package/components/app/Writing.svelte +13 -0
  34. package/components/app/Writing.svelte.d.ts +27 -0
  35. package/components/chapter/Atom.svelte +20 -6
  36. package/components/chapter/Atom.svelte.d.ts +3 -3
  37. package/components/chapter/Block.svelte +23 -20
  38. package/components/chapter/Block.svelte.d.ts +4 -4
  39. package/components/chapter/Callout.svelte +38 -7
  40. package/components/chapter/Callout.svelte.d.ts +4 -4
  41. package/components/chapter/CaptionedCode.svelte +66 -23
  42. package/components/chapter/CaptionedCode.svelte.d.ts +4 -4
  43. package/components/chapter/ChapterBody.svelte +61 -9
  44. package/components/chapter/ChapterBody.svelte.d.ts +4 -4
  45. package/components/chapter/Citations.svelte +86 -20
  46. package/components/chapter/Citations.svelte.d.ts +4 -4
  47. package/components/chapter/Code.svelte +152 -21
  48. package/components/chapter/Code.svelte.d.ts +3 -3
  49. package/components/chapter/Comment.svelte +38 -16
  50. package/components/chapter/Comment.svelte.d.ts +3 -3
  51. package/components/chapter/Definition.svelte +52 -18
  52. package/components/chapter/Definition.svelte.d.ts +5 -8
  53. package/components/chapter/Embed.svelte +154 -66
  54. package/components/chapter/Embed.svelte.d.ts +5 -4
  55. package/components/chapter/ErrorMessage.svelte +7 -2
  56. package/components/chapter/ErrorMessage.svelte.d.ts +4 -4
  57. package/components/chapter/ExtendedPrism.d.ts +2 -0
  58. package/components/chapter/ExtendedPrism.js +69 -0
  59. package/components/chapter/Figure.svelte +90 -0
  60. package/components/chapter/Figure.svelte.d.ts +24 -0
  61. package/components/chapter/Footnote.svelte +75 -12
  62. package/components/chapter/Footnote.svelte.d.ts +4 -4
  63. package/components/chapter/Format.svelte +60 -37
  64. package/components/chapter/Format.svelte.d.ts +4 -4
  65. package/components/chapter/InlineCode.svelte +15 -5
  66. package/components/chapter/InlineCode.svelte.d.ts +4 -4
  67. package/components/chapter/Label.svelte +37 -8
  68. package/components/chapter/Label.svelte.d.ts +4 -4
  69. package/components/chapter/Link.svelte +23 -18
  70. package/components/chapter/Link.svelte.d.ts +4 -4
  71. package/components/chapter/List.svelte +75 -8
  72. package/components/chapter/List.svelte.d.ts +4 -4
  73. package/components/chapter/Marginal.svelte +169 -27
  74. package/components/chapter/Marginal.svelte.d.ts +6 -3
  75. package/components/chapter/Paragraph.svelte +74 -6
  76. package/components/chapter/Paragraph.svelte.d.ts +4 -4
  77. package/components/chapter/Positioned.svelte +33 -0
  78. package/components/chapter/Positioned.svelte.d.ts +19 -0
  79. package/components/chapter/Problem.svelte +15 -0
  80. package/components/chapter/Problem.svelte.d.ts +27 -0
  81. package/components/chapter/Python.svelte +68 -21
  82. package/components/chapter/Python.svelte.d.ts +4 -4
  83. package/components/chapter/Quote.svelte +64 -11
  84. package/components/chapter/Quote.svelte.d.ts +4 -4
  85. package/components/chapter/Rule.svelte +12 -1
  86. package/components/chapter/Rule.svelte.d.ts +4 -4
  87. package/components/chapter/Table.svelte +36 -25
  88. package/components/chapter/Table.svelte.d.ts +4 -4
  89. package/components/chapter/Text.svelte +61 -36
  90. package/components/chapter/Text.svelte.d.ts +5 -4
  91. package/components/editor/BookishEditor.svelte +343 -237
  92. package/components/editor/BookishEditor.svelte.d.ts +5 -5
  93. package/components/editor/CalloutEditor.svelte +5 -5
  94. package/components/editor/CalloutEditor.svelte.d.ts +4 -4
  95. package/components/editor/CaptionedCodeEditor.svelte +16 -12
  96. package/components/editor/CaptionedCodeEditor.svelte.d.ts +4 -4
  97. package/components/editor/CaretContext.d.ts +48 -16
  98. package/components/editor/CaretState.d.ts +16 -44
  99. package/components/editor/CaretUtilities.d.ts +2 -2
  100. package/components/editor/CaretView.svelte +80 -0
  101. package/components/editor/CaretView.svelte.d.ts +24 -0
  102. package/components/editor/CitationsEditor.svelte +36 -25
  103. package/components/editor/CitationsEditor.svelte.d.ts +4 -4
  104. package/components/editor/Clipboard.d.ts +2 -2
  105. package/components/editor/Command.d.ts +13 -12
  106. package/components/editor/Commands.d.ts +1 -1
  107. package/components/editor/Commands.js +1114 -571
  108. package/components/editor/ConfirmButton.svelte +18 -12
  109. package/components/editor/ConfirmButton.svelte.d.ts +5 -4
  110. package/components/editor/DefinitionEditor.svelte +29 -21
  111. package/components/editor/DefinitionEditor.svelte.d.ts +4 -4
  112. package/components/editor/EmbedEditor.svelte +93 -43
  113. package/components/editor/EmbedEditor.svelte.d.ts +3 -3
  114. package/components/editor/Icon.svelte +17 -0
  115. package/components/editor/Icon.svelte.d.ts +16 -0
  116. package/components/editor/ImageChooser.svelte +53 -34
  117. package/components/editor/ImageChooser.svelte.d.ts +3 -3
  118. package/components/editor/InlineCodeEditor.svelte +7 -4
  119. package/components/editor/InlineCodeEditor.svelte.d.ts +4 -4
  120. package/components/editor/LabelEditor.svelte +20 -11
  121. package/components/editor/LabelEditor.svelte.d.ts +4 -4
  122. package/components/editor/LanguageEditor.svelte +10 -7
  123. package/components/editor/LanguageEditor.svelte.d.ts +3 -3
  124. package/components/editor/LinkEditor.svelte +64 -39
  125. package/components/editor/LinkEditor.svelte.d.ts +4 -4
  126. package/components/editor/Note.svelte +3 -3
  127. package/components/editor/Note.svelte.d.ts +6 -2
  128. package/components/editor/PositionEditor.svelte +9 -6
  129. package/components/editor/PositionEditor.svelte.d.ts +4 -4
  130. package/components/editor/QuoteEditor.svelte +7 -2
  131. package/components/editor/QuoteEditor.svelte.d.ts +4 -4
  132. package/components/editor/Switch.svelte +55 -28
  133. package/components/editor/Switch.svelte.d.ts +4 -4
  134. package/components/editor/TableEditor.svelte +10 -0
  135. package/components/editor/TableEditor.svelte.d.ts +17 -0
  136. package/components/editor/TextEditor.svelte +83 -45
  137. package/components/editor/TextEditor.svelte.d.ts +5 -4
  138. package/components/editor/Toggle.svelte +11 -8
  139. package/components/editor/Toggle.svelte.d.ts +4 -4
  140. package/components/editor/Toolbar.svelte +192 -144
  141. package/components/editor/Toolbar.svelte.d.ts +5 -8
  142. package/components/editor/ToolbarGroup.svelte +18 -23
  143. package/components/editor/ToolbarGroup.svelte.d.ts +3 -4
  144. package/components/editor/ToolbarSpacer.svelte +8 -1
  145. package/components/editor/ToolbarSpacer.svelte.d.ts +6 -2
  146. package/components/editor/URLEditor.svelte +6 -8
  147. package/components/editor/URLEditor.svelte.d.ts +3 -3
  148. package/components/editor/UndoState.d.ts +3 -3
  149. package/components/editor/icons/annotate.svg +1 -0
  150. package/components/editor/icons/block.svg +1 -0
  151. package/components/editor/icons/bold.svg +1 -0
  152. package/components/editor/icons/bullets.svg +1 -0
  153. package/components/editor/icons/callout.svg +1 -0
  154. package/components/editor/icons/citation.svg +8 -0
  155. package/components/editor/icons/clear.svg +1 -0
  156. package/components/editor/icons/clipboard.svg +1 -0
  157. package/components/editor/icons/code.svg +1 -0
  158. package/components/editor/icons/columnafter.svg +1 -0
  159. package/components/editor/icons/columnbefore.svg +1 -0
  160. package/components/editor/icons/comment.svg +1 -0
  161. package/components/editor/icons/copy.svg +1 -0
  162. package/components/editor/icons/cut.svg +1 -0
  163. package/components/editor/icons/define.svg +7 -0
  164. package/components/editor/icons/deletecolumn.svg +1 -0
  165. package/components/editor/icons/deleterow.svg +1 -0
  166. package/components/editor/icons/footnote.svg +8 -0
  167. package/components/editor/icons/header1.svg +7 -0
  168. package/components/editor/icons/header2.svg +7 -0
  169. package/components/editor/icons/header3.svg +7 -0
  170. package/components/editor/icons/home.svg +1 -0
  171. package/components/editor/icons/indent.svg +1 -0
  172. package/components/editor/icons/italic.svg +1 -0
  173. package/components/editor/icons/label.svg +1 -0
  174. package/components/editor/icons/left.svg +1 -0
  175. package/components/editor/icons/level.svg +1 -0
  176. package/components/editor/icons/link.svg +1 -0
  177. package/components/editor/icons/list.svg +1 -0
  178. package/components/editor/icons/media.svg +1 -0
  179. package/components/editor/icons/middle.svg +1 -0
  180. package/components/editor/icons/numbers.svg +10 -0
  181. package/components/editor/icons/paragraph.svg +1 -0
  182. package/components/editor/icons/paste.svg +10 -0
  183. package/components/editor/icons/quote.svg +1 -0
  184. package/components/editor/icons/redo.svg +1 -0
  185. package/components/editor/icons/right.svg +1 -0
  186. package/components/editor/icons/rowabove.svg +1 -0
  187. package/components/editor/icons/rowbelow.svg +1 -0
  188. package/components/editor/icons/rule.svg +1 -0
  189. package/components/editor/icons/sub.svg +1 -0
  190. package/components/editor/icons/super.svg +1 -0
  191. package/components/editor/icons/table.svg +1 -0
  192. package/components/editor/icons/text.svg +1 -0
  193. package/components/editor/icons/time.svg +1 -0
  194. package/components/editor/icons/undo.svg +1 -0
  195. package/components/editor/icons/unindent.svg +1 -0
  196. package/components/editor/icons/unlink.svg +1 -0
  197. package/components/page/Acknowledgements.svelte +31 -22
  198. package/components/page/Acknowledgements.svelte.d.ts +4 -4
  199. package/components/page/Authors.svelte +34 -14
  200. package/components/page/Authors.svelte.d.ts +6 -6
  201. package/components/page/BulkReferenceEditor.svelte +53 -22
  202. package/components/page/BulkReferenceEditor.svelte.d.ts +4 -4
  203. package/components/page/Chapter.svelte +196 -141
  204. package/components/page/Chapter.svelte.d.ts +3 -3
  205. package/components/page/ChapterContext.d.ts +4 -4
  206. package/components/page/ChapterNumber.svelte +9 -0
  207. package/components/page/ChapterNumber.svelte.d.ts +27 -0
  208. package/components/page/ChapterTitle.svelte +16 -0
  209. package/components/page/ChapterTitle.svelte.d.ts +18 -0
  210. package/components/page/Contexts.d.ts +31 -20
  211. package/components/page/Contexts.js +47 -17
  212. package/components/page/DefinitionView.svelte +115 -86
  213. package/components/page/DefinitionView.svelte.d.ts +3 -3
  214. package/components/page/Description.svelte +27 -18
  215. package/components/page/Description.svelte.d.ts +4 -4
  216. package/components/page/Edition.svelte +127 -74
  217. package/components/page/Edition.svelte.d.ts +4 -4
  218. package/components/page/Editions.svelte +144 -0
  219. package/components/page/Editions.svelte.d.ts +14 -0
  220. package/components/page/Glossary.svelte +57 -48
  221. package/components/page/Glossary.svelte.d.ts +4 -4
  222. package/components/page/Header.svelte +129 -44
  223. package/components/page/Header.svelte.d.ts +6 -6
  224. package/components/page/Index.svelte +114 -80
  225. package/components/page/Index.svelte.d.ts +4 -4
  226. package/components/page/Instructions.svelte +18 -16
  227. package/components/page/Instructions.svelte.d.ts +4 -4
  228. package/components/page/License.svelte +29 -21
  229. package/components/page/License.svelte.d.ts +4 -4
  230. package/components/page/Loading.svelte +102 -12
  231. package/components/page/Loading.svelte.d.ts +6 -2
  232. package/components/page/Media.svelte +77 -51
  233. package/components/page/Media.svelte.d.ts +4 -4
  234. package/components/page/MediaPreview.svelte +26 -8
  235. package/components/page/MediaPreview.svelte.d.ts +3 -3
  236. package/components/page/Muted.svelte +10 -0
  237. package/components/page/Muted.svelte.d.ts +27 -0
  238. package/components/page/Outline.svelte +279 -59
  239. package/components/page/Outline.svelte.d.ts +3 -3
  240. package/components/page/Page.svelte +40 -9
  241. package/components/page/Page.svelte.d.ts +3 -3
  242. package/components/page/PageHeader.svelte +14 -0
  243. package/components/page/PageHeader.svelte.d.ts +18 -0
  244. package/components/page/PageParagraph.svelte +18 -0
  245. package/components/page/PageParagraph.svelte.d.ts +27 -0
  246. package/components/page/PossibleChapter.svelte +7 -7
  247. package/components/page/PossibleChapter.svelte.d.ts +4 -4
  248. package/components/page/PossibleReference.svelte +6 -11
  249. package/components/page/PossibleReference.svelte.d.ts +6 -7
  250. package/components/page/Print.svelte +27 -3
  251. package/components/page/Print.svelte.d.ts +4 -4
  252. package/components/page/Reference.svelte +256 -113
  253. package/components/page/Reference.svelte.d.ts +5 -5
  254. package/components/page/References.svelte +39 -47
  255. package/components/page/References.svelte.d.ts +4 -4
  256. package/components/page/Rows.svelte +54 -0
  257. package/components/page/Rows.svelte.d.ts +27 -0
  258. package/components/page/Search.svelte +86 -63
  259. package/components/page/Search.svelte.d.ts +4 -4
  260. package/components/page/Status.svelte +43 -35
  261. package/components/page/Status.svelte.d.ts +4 -9
  262. package/components/page/SubdomainEditor.svelte +40 -27
  263. package/components/page/SubdomainEditor.svelte.d.ts +4 -4
  264. package/components/page/TableOfContents.svelte +225 -190
  265. package/components/page/TableOfContents.svelte.d.ts +4 -4
  266. package/components/page/TableOfContentsImage.svelte +8 -8
  267. package/components/page/TableOfContentsImage.svelte.d.ts +3 -3
  268. package/components/page/TableOfContentsRow.svelte +96 -33
  269. package/components/page/TableOfContentsRow.svelte.d.ts +4 -4
  270. package/components/page/ThemeEditor.svelte +174 -39
  271. package/components/page/ThemeEditor.svelte.d.ts +4 -4
  272. package/components/page/ThemeEditorPreview.svelte +35 -23
  273. package/components/page/ThemeEditorPreview.svelte.d.ts +5 -5
  274. package/components/page/ThemeSetEditor.svelte +15 -13
  275. package/components/page/ThemeSetEditor.svelte.d.ts +4 -4
  276. package/components/page/ThemeVariableEditor.svelte +24 -15
  277. package/components/page/ThemeVariableEditor.svelte.d.ts +3 -3
  278. package/components/page/Title.svelte +12 -0
  279. package/components/page/Title.svelte.d.ts +27 -0
  280. package/components/page/Unknown.svelte +25 -21
  281. package/components/page/Unknown.svelte.d.ts +4 -4
  282. package/components/page/margins.js +50 -33
  283. package/index.d.ts +14 -0
  284. package/index.js +14 -0
  285. package/models/CRUD.d.ts +17 -0
  286. package/models/CRUD.js +194 -0
  287. package/models/Firebase.js +17 -15
  288. package/models/book/Book.d.ts +24 -28
  289. package/models/book/Book.js +120 -113
  290. package/models/book/BookMedia.d.ts +3 -3
  291. package/models/book/BookMedia.js +22 -16
  292. package/models/book/BookSaveStatus.d.ts +7 -0
  293. package/models/book/BookSaveStatus.js +8 -0
  294. package/models/book/Chapter.d.ts +46 -39
  295. package/models/book/Chapter.js +180 -198
  296. package/models/book/ChapterID.js +7 -7
  297. package/models/book/Definition.d.ts +1 -1
  298. package/models/book/Edition.d.ts +62 -60
  299. package/models/book/Edition.js +385 -303
  300. package/models/book/Reference.d.ts +24 -0
  301. package/models/book/Reference.js +78 -0
  302. package/models/book/Schema.d.ts +169 -0
  303. package/models/book/Schema.js +114 -0
  304. package/models/book/Theme.d.ts +44 -37
  305. package/models/book/Theme.js +452 -52
  306. package/models/book/ThemeColors.d.ts +1 -1
  307. package/models/book/Words.d.ts +2 -0
  308. package/models/book/Words.js +110 -0
  309. package/models/chapter/AtomNode.d.ts +4 -4
  310. package/models/chapter/AtomNode.js +20 -13
  311. package/models/chapter/BlockNode.d.ts +9 -10
  312. package/models/chapter/BlockNode.js +32 -13
  313. package/models/chapter/BlocksNode.d.ts +10 -10
  314. package/models/chapter/BlocksNode.js +315 -120
  315. package/models/chapter/BlocksNode.test.js +494 -228
  316. package/models/chapter/Bookkeeping.d.ts +1 -1
  317. package/models/chapter/CalloutNode.d.ts +3 -3
  318. package/models/chapter/CalloutNode.js +34 -12
  319. package/models/chapter/Caret.d.ts +9 -7
  320. package/models/chapter/Caret.js +11 -6
  321. package/models/chapter/ChapterNode.d.ts +11 -11
  322. package/models/chapter/ChapterNode.js +70 -33
  323. package/models/chapter/CitationsNode.d.ts +3 -3
  324. package/models/chapter/CitationsNode.js +31 -12
  325. package/models/chapter/CodeNode.d.ts +11 -6
  326. package/models/chapter/CodeNode.js +143 -34
  327. package/models/chapter/CommentNode.d.ts +5 -5
  328. package/models/chapter/CommentNode.js +29 -13
  329. package/models/chapter/DefinitionNode.d.ts +2 -2
  330. package/models/chapter/DefinitionNode.js +15 -7
  331. package/models/chapter/Edit.d.ts +3 -3
  332. package/models/chapter/EmbedNode.d.ts +9 -5
  333. package/models/chapter/EmbedNode.js +108 -35
  334. package/models/chapter/ErrorNode.d.ts +2 -2
  335. package/models/chapter/ErrorNode.js +34 -12
  336. package/models/chapter/FootnoteNode.d.ts +5 -5
  337. package/models/chapter/FootnoteNode.js +34 -16
  338. package/models/chapter/FormatNode.d.ts +10 -10
  339. package/models/chapter/FormatNode.js +237 -106
  340. package/models/chapter/FormatNode.test.js +87 -45
  341. package/models/chapter/InlineCodeNode.d.ts +2 -2
  342. package/models/chapter/InlineCodeNode.js +22 -9
  343. package/models/chapter/LabelNode.d.ts +4 -4
  344. package/models/chapter/LabelNode.js +31 -13
  345. package/models/chapter/LinkNode.d.ts +2 -2
  346. package/models/chapter/LinkNode.js +21 -9
  347. package/models/chapter/ListNode.d.ts +8 -8
  348. package/models/chapter/ListNode.js +99 -38
  349. package/models/chapter/ListNode.test.js +29 -24
  350. package/models/chapter/MetadataNode.d.ts +3 -3
  351. package/models/chapter/MetadataNode.js +13 -5
  352. package/models/chapter/Node.d.ts +5 -3
  353. package/models/chapter/Node.js +76 -29
  354. package/models/chapter/Node.test.js +20 -18
  355. package/models/chapter/ParagraphNode.d.ts +6 -6
  356. package/models/chapter/ParagraphNode.js +84 -29
  357. package/models/chapter/ParagraphNode.test.js +22 -13
  358. package/models/chapter/Parser.d.ts +25 -25
  359. package/models/chapter/Parser.js +201 -189
  360. package/models/chapter/Parser.test.js +16 -16
  361. package/models/chapter/Position.d.ts +1 -1
  362. package/models/chapter/QuoteNode.d.ts +6 -6
  363. package/models/chapter/QuoteNode.js +61 -23
  364. package/models/chapter/RootNode.d.ts +4 -4
  365. package/models/chapter/RuleNode.d.ts +2 -2
  366. package/models/chapter/RuleNode.js +31 -11
  367. package/models/chapter/TableNode.d.ts +8 -6
  368. package/models/chapter/TableNode.js +89 -34
  369. package/models/chapter/TableNode.test.js +22 -24
  370. package/models/chapter/TextNode.d.ts +6 -6
  371. package/models/chapter/TextNode.js +72 -32
  372. package/models/chapter/TextNode.test.js +4 -4
  373. package/models/loadEdition.d.ts +1 -1
  374. package/models/loadEdition.js +10 -6
  375. package/package.json +104 -25
  376. package/util/getSubdomain.js +8 -6
  377. package/util/isMobile.js +1 -1
  378. package/util/mineReference.d.ts +3 -2
  379. package/util/mineReference.js +67 -29
  380. package/util/scrollToEyeLevel.js +6 -1
  381. package/components/chapter/renderPosition.d.ts +0 -3
  382. package/components/chapter/renderPosition.js +0 -4
  383. package/components/editor/ToolbarIcon.svelte +0 -22
  384. package/components/editor/ToolbarIcon.svelte.d.ts +0 -16
  385. package/components/page/Alert.svelte +0 -11
  386. package/components/page/Alert.svelte.d.ts +0 -23
  387. package/components/page/Revisions.svelte +0 -124
  388. package/components/page/Revisions.svelte.d.ts +0 -14
  389. package/models/BookLoader.d.ts +0 -2
  390. package/models/BookLoader.js +0 -67
  391. package/models/Firestore.d.ts +0 -22
  392. package/models/Firestore.js +0 -194
  393. package/models/chapter/ReferenceNode.d.ts +0 -29
  394. package/models/chapter/ReferenceNode.js +0 -48
@@ -1,135 +1,142 @@
1
- import { loadEditionFromFirestore, updateBookInFirestore } from "../Firestore";
2
- import BookMedia from "./BookMedia";
3
- import Edition, { BookSaveStatus } from "./Edition";
1
+ import { readEdition, updateBook } from '../CRUD';
2
+ import BookMedia from './BookMedia';
4
3
  export default class Book {
5
4
  ref;
6
- spec;
7
- // A list of requested edits, stored as promises, resolved
8
- // when the book is ready to save.
9
- edits = [];
10
- lastEdit = 0;
11
- listeners = new Set();
5
+ title;
6
+ authors;
7
+ description;
8
+ cover;
9
+ revisions;
10
+ domain;
11
+ uids;
12
12
  media;
13
- constructor(ref, spec) {
13
+ constructor(ref, title, authors, description, cover, revisions, domain, uids) {
14
14
  this.ref = ref;
15
- this.spec = spec;
15
+ this.title = title;
16
+ this.authors = authors;
17
+ this.description = description;
18
+ this.cover = cover;
19
+ this.revisions = revisions;
20
+ this.domain = domain;
21
+ this.uids = uids;
16
22
  this.media = new BookMedia(this);
17
23
  }
18
- saveEdits() {
19
- // If it's been more than a second since our last edit and there
20
- // are edits that haven't been saved, try updating the book,
21
- // and if we succeed, resolve all of the edits, and if we fail,
22
- // then reject them.
23
- if (Date.now() - this.lastEdit > 1000 && this.edits.length > 0) {
24
- // Tell listeners that this book model changed.
25
- this.notifyListeners(BookSaveStatus.Saving);
26
- updateBookInFirestore(this)
27
- .then(() => {
28
- // Approve the edits.
29
- this.edits.forEach(edit => edit.resolve());
30
- this.notifyListeners(BookSaveStatus.Saved);
31
- })
32
- .catch(() => {
33
- // Reject the edits.
34
- this.edits.forEach(edit => edit.reject());
35
- this.notifyListeners(BookSaveStatus.Error);
36
- })
37
- .finally(() => {
38
- // Reset the edit queue.
39
- this.edits = [];
40
- });
41
- }
42
- }
43
- getMedia() { return this.media; }
44
- // Adds a save request to the queue, to be resolved later after a period of
45
- // inactivity. Returns a promise that will eventually be resolved.
46
- requestSave() {
47
- // Tell listeners that this book model changed.
48
- this.notifyListeners(BookSaveStatus.Changed);
49
- // Return a promise that will resolve or reject later after this model saves the edits to the database.
50
- this.lastEdit = Date.now();
51
- const promise = new Promise((resolve, reject) => {
52
- this.edits.push({ resolve: resolve, reject: reject });
53
- });
54
- return promise;
55
- }
56
- addListener(listener) { this.listeners.add(listener); }
57
- removeListener(listener) { this.listeners.delete(listener); }
58
- notifyListeners(status) { this.listeners.forEach(listener => listener.call(undefined, status)); }
59
- toObject() { return this.spec; }
60
- getSubdomain() { return this.spec.domain; }
61
- setSubdomain(domain) {
62
- if (domain.length === 0)
63
- delete this.spec.domain;
64
- else
65
- this.spec.domain = domain;
66
- return this.requestSave();
67
- }
68
- getTitle() { return this.spec.title; }
69
- setTitle(title) {
70
- this.spec.title = title;
71
- return this.requestSave();
72
- }
73
- getDescription() { return this.spec.description; }
74
- setDescription(description) {
75
- this.spec.description = description;
76
- return this.requestSave();
77
- }
78
- getCover() { return this.spec.cover; }
79
- setCover(cover) {
80
- this.spec.cover = cover;
81
- return this.requestSave();
82
- }
83
- getAuthors() { return this.spec.authors; }
84
- setAuthors(authors) {
85
- this.spec.authors = authors;
86
- return this.requestSave();
87
- }
88
- getRef() { return this.ref; }
89
- getRefID() { return this.ref.id; }
24
+ getMedia() {
25
+ return this.media;
26
+ }
27
+ static fromJSON(ref, book) {
28
+ return new Book(ref, book.title, book.authors, book.description, book.cover, book.revisions, book.domain, book.uids);
29
+ }
30
+ toJSON() {
31
+ const json = {
32
+ title: this.title,
33
+ authors: this.authors,
34
+ description: this.description,
35
+ cover: this.cover,
36
+ revisions: this.revisions,
37
+ uids: this.uids,
38
+ };
39
+ if (this.domain !== undefined)
40
+ json.domain = this.domain;
41
+ return json;
42
+ }
43
+ getSubdomain() {
44
+ return this.domain;
45
+ }
46
+ withSubdomain(domain) {
47
+ return new Book(this.ref, this.title, this.authors, this.description, this.cover, this.revisions, domain.length === 0 ? undefined : domain, this.uids);
48
+ }
49
+ getTitle() {
50
+ return this.title;
51
+ }
52
+ withTitle(title) {
53
+ return new Book(this.ref, title, this.authors, this.description, this.cover, this.revisions, this.domain, this.uids);
54
+ }
55
+ getDescription() {
56
+ return this.description;
57
+ }
58
+ withDescription(description) {
59
+ return new Book(this.ref, this.title, this.authors, description, this.cover, this.revisions, this.domain, this.uids);
60
+ }
61
+ getCover() {
62
+ return this.cover;
63
+ }
64
+ withCover(cover) {
65
+ return new Book(this.ref, this.title, this.authors, this.description, cover, this.revisions, this.domain, this.uids);
66
+ }
67
+ getAuthors() {
68
+ return this.authors;
69
+ }
70
+ withAuthors(authors) {
71
+ return new Book(this.ref, this.title, authors, this.description, this.cover, this.revisions, this.domain, this.uids);
72
+ }
73
+ getRef() {
74
+ return this.ref;
75
+ }
76
+ getRefID() {
77
+ return this.ref.id;
78
+ }
90
79
  getDraftEdition() {
91
- return this.spec.revisions.length === 0 ? undefined : loadEditionFromFirestore(this, this.spec.revisions[0].ref.id);
80
+ return this.revisions.length === 0
81
+ ? undefined
82
+ : readEdition(this.revisions[0].ref.id);
92
83
  }
93
84
  isValidEditionNumber(edition) {
94
85
  return this.getEditionNumber(edition) !== undefined;
95
86
  }
96
87
  /* Note: editions are numbered 1-n, but stored in reverse chronological order. */
97
88
  getEditionNumber(number) {
98
- return number < 1 || number > this.spec.revisions.length ?
99
- undefined :
100
- loadEditionFromFirestore(this, this.spec.revisions[this.spec.revisions.length - number].ref.id);
89
+ return number < 1 || number > this.revisions.length
90
+ ? undefined
91
+ : readEdition(this.revisions[this.revisions.length - number].ref.id);
101
92
  }
102
93
  getLatestPublishedEdition() {
103
94
  const latest = this.getLatestPublishedEditionID();
104
- return latest === undefined ? undefined : loadEditionFromFirestore(this, latest);
95
+ return latest === undefined ? undefined : readEdition(latest);
105
96
  }
106
97
  getLatestPublishedEditionID() {
107
- return this.spec.revisions.find(e => e.published)?.ref.id;
108
- }
109
- getRevisions() { return this.spec.revisions.slice(); }
110
- setRevisions(revisions) {
111
- this.spec.revisions = revisions.slice();
112
- return this.requestSave();
113
- }
114
- setEditionChangeSummary(summary, index) {
115
- if (index >= 0 && index < this.spec.revisions.length) {
116
- this.spec.revisions[index].summary = summary;
117
- return this.requestSave();
118
- }
119
- }
120
- setPublished(published, revisionNumber) {
121
- if (revisionNumber >= 0 && revisionNumber < this.spec.revisions.length) {
122
- this.spec.revisions[revisionNumber].published = published;
123
- return this.requestSave();
124
- }
98
+ return this.revisions.find((e) => e.published)?.ref.id;
99
+ }
100
+ getLatestEditionID() {
101
+ return this.revisions[0]?.ref.id;
102
+ }
103
+ getRevisions() {
104
+ return this.revisions.slice();
105
+ }
106
+ withRevisions(revisions) {
107
+ return new Book(this.ref, this.title, this.authors, this.description, this.cover, revisions, this.domain, this.uids);
108
+ }
109
+ withEditionSummary(summary, index) {
110
+ if (index < 0 || index >= this.revisions.length)
111
+ return this;
112
+ const revision = this.revisions[index];
113
+ return this.withRevisions([
114
+ ...this.revisions.slice(0, index),
115
+ {
116
+ ref: revision.ref,
117
+ time: revision.time,
118
+ summary,
119
+ published: revision.published,
120
+ },
121
+ ...this.revisions.slice(index + 1),
122
+ ]);
123
+ }
124
+ asPublished(published, index) {
125
+ if (index < 0 || index >= this.revisions.length)
126
+ return this;
127
+ const revision = this.revisions[index];
128
+ return this.withRevisions([
129
+ ...this.revisions.slice(0, index),
130
+ {
131
+ ref: revision.ref,
132
+ time: revision.time,
133
+ summary: revision.summary,
134
+ published,
135
+ },
136
+ ...this.revisions.slice(index + 1),
137
+ ]);
125
138
  }
126
139
  hasPublishedEdition() {
127
- return this.spec.revisions.find(revision => revision.published) !== undefined;
128
- }
129
- updateMetadataFromEdition(edition) {
130
- this.setTitle(edition.getTitle());
131
- this.setCover(edition.getImage("cover") ?? null);
132
- this.setAuthors(edition.getAuthors());
133
- this.setDescription(edition.getDescription());
140
+ return (this.revisions.find((revision) => revision.published) !== undefined);
134
141
  }
135
142
  }
@@ -1,6 +1,6 @@
1
- import type { StorageReference } from "firebase/storage";
2
- import type Book from "./Book";
3
- export declare type Image = {
1
+ import type { StorageReference } from 'firebase/storage';
2
+ import type Book from './Book';
3
+ export type Image = {
4
4
  url: string;
5
5
  ref: StorageReference;
6
6
  };
@@ -1,6 +1,6 @@
1
- import { deleteObject, getDownloadURL, listAll, ref, uploadBytes } from "firebase/storage";
1
+ import { deleteObject, getDownloadURL, listAll, ref, uploadBytes, } from 'firebase/storage';
2
2
  import { v4 as uuidv4 } from 'uuid';
3
- import { storage } from "../Firebase";
3
+ import { storage } from '../Firebase';
4
4
  export default class BookMedia {
5
5
  book;
6
6
  _images;
@@ -12,7 +12,7 @@ export default class BookMedia {
12
12
  notify(observer) {
13
13
  this.observers.add(observer);
14
14
  // Notify it right away!
15
- this.getImages().then(images => observer(images));
15
+ this.getImages().then((images) => observer(images));
16
16
  }
17
17
  stopNotifying(observer) {
18
18
  this.observers.delete(observer);
@@ -21,13 +21,15 @@ export default class BookMedia {
21
21
  async getImages() {
22
22
  return this._images === undefined ? this.cacheImages() : this._images;
23
23
  }
24
- getImagePath() { return `images/${this.book.getRefID()}/`; }
24
+ getImagePath() {
25
+ return `images/${this.book.getRefID()}/`;
26
+ }
25
27
  /** Get a listing of all of the images for the book. */
26
28
  async cacheImages() {
27
29
  if (storage === undefined)
28
30
  return [];
29
31
  // Find all the prefixes and items.
30
- this._images = (await this.retrieveImages()).filter(image => image !== undefined);
32
+ this._images = (await this.retrieveImages()).filter((image) => image !== undefined);
31
33
  // Notify observers
32
34
  for (const observer of this.observers)
33
35
  observer(this._images.slice());
@@ -39,10 +41,12 @@ export default class BookMedia {
39
41
  // Create a reference under which you want to list
40
42
  const listRef = ref(storage, this.getImagePath());
41
43
  // Find all the prefixes and items.
42
- return listAll(listRef)
43
- .then((res) => Promise.all(res.items.map(itemRef => getDownloadURL(itemRef)
44
- .then((url) => {
45
- const image = { url: url, description: "", ref: itemRef };
44
+ return listAll(listRef).then((res) => Promise.all(res.items.map((itemRef) => getDownloadURL(itemRef).then((url) => {
45
+ const image = {
46
+ url: url,
47
+ description: '',
48
+ ref: itemRef,
49
+ };
46
50
  if (this._images !== undefined) {
47
51
  this._images.push(image);
48
52
  }
@@ -51,9 +55,11 @@ export default class BookMedia {
51
55
  }
52
56
  getThumbnailURL(url, thumbnailRef, error, finished, attempt = 0) {
53
57
  getDownloadURL(thumbnailRef)
54
- .then(thumbnail => finished(url, thumbnail))
58
+ .then((thumbnail) => finished(url, thumbnail))
55
59
  // Try again in a bit.
56
- .catch(() => attempt > 10 ? error("Couldn't upload image") : setTimeout(() => this.getThumbnailURL(url, thumbnailRef, error, finished, attempt + 1), 250));
60
+ .catch(() => attempt > 25
61
+ ? error("Couldn't get the image URL. Connection issues?")
62
+ : setTimeout(() => this.getThumbnailURL(url, thumbnailRef, error, finished, attempt + 1), 250));
57
63
  }
58
64
  upload(file, progressHandler, errorHandler, finishedHandler) {
59
65
  progressHandler;
@@ -67,11 +73,11 @@ export default class BookMedia {
67
73
  uploadBytes(imageRef, file)
68
74
  .then((snapshot) => {
69
75
  getDownloadURL(snapshot.ref)
70
- .then(url => {
76
+ .then((url) => {
71
77
  // Give some time for the cloud function to create a thumbnail, then try to get it's URL.
72
78
  setTimeout(() => this.getThumbnailURL(url, thumbnailRef, errorHandler, finishedHandler), 250);
73
79
  })
74
- .catch(() => errorHandler("Unable to get image URL."));
80
+ .catch(() => errorHandler('Unable to get image URL.'));
75
81
  })
76
82
  .then(() => this.cacheImages());
77
83
  // This seems to be broken in Firebase right now. Switched above to a no-feedback approach.
@@ -83,14 +89,14 @@ export default class BookMedia {
83
89
  // // https://firebase.google.com/docs/storage/web/handle-errors
84
90
  // (error) => {
85
91
  // console.error(error);
86
- // errorHandler(
92
+ // errorHandler(
87
93
  // error.code === "storage/unauthorized" ? "Wrong permissions to upload" :
88
- // error.code === "storage/canceled" ? "Upload canceled" :
94
+ // error.code === "storage/canceled" ? "Upload canceled" :
89
95
  // error.code === "storage/quota-exceeded" ? "Storage limit reached" :
90
96
  // error.code === "storage/unauthenticated" ? "Log in again to upload" :
91
97
  // "Unknown upload error"
92
98
  // )
93
- // },
99
+ // },
94
100
  }
95
101
  async remove(image) {
96
102
  if (storage === undefined)
@@ -0,0 +1,7 @@
1
+ declare enum BookSaveStatus {
2
+ Changed = 0,
3
+ Saving = 1,
4
+ Saved = 2,
5
+ Error = 3
6
+ }
7
+ export default BookSaveStatus;
@@ -0,0 +1,8 @@
1
+ var BookSaveStatus;
2
+ (function (BookSaveStatus) {
3
+ BookSaveStatus[BookSaveStatus["Changed"] = 0] = "Changed";
4
+ BookSaveStatus[BookSaveStatus["Saving"] = 1] = "Saving";
5
+ BookSaveStatus[BookSaveStatus["Saved"] = 2] = "Saved";
6
+ BookSaveStatus[BookSaveStatus["Error"] = 3] = "Error";
7
+ })(BookSaveStatus || (BookSaveStatus = {}));
8
+ export default BookSaveStatus;
@@ -1,7 +1,7 @@
1
- import type ChapterNode from "../chapter/ChapterNode";
2
- import type Edition from "./Edition";
3
- import type { DocumentReference } from "firebase/firestore";
4
- export declare type ChapterSpecification = {
1
+ import type ChapterNode from '../chapter/ChapterNode';
2
+ import type Edition from './Edition';
3
+ import type { DocumentReference } from 'firebase/firestore';
4
+ export type ChapterSpecification = {
5
5
  ref?: DocumentReference;
6
6
  id: string;
7
7
  title: string;
@@ -12,59 +12,66 @@ export declare type ChapterSpecification = {
12
12
  section?: string;
13
13
  text?: string;
14
14
  };
15
- export declare type ChapterContent = {
15
+ export type ChapterContent = {
16
16
  text: string;
17
17
  };
18
- export declare type Match = {
18
+ export type Match = {
19
19
  left: string;
20
20
  match: string;
21
21
  right: string;
22
22
  };
23
23
  export default class Chapter {
24
- readonly spec: ChapterSpecification;
25
- edition: Edition;
26
- ast: ChapterNode | undefined;
27
- index: Record<string, Array<Match>> | undefined;
28
- wordCount: number | undefined;
24
+ readonly ref: DocumentReference | undefined;
25
+ readonly id: string;
26
+ readonly title: string;
27
+ readonly authors: string[];
28
+ readonly image: string | null;
29
+ readonly numbered: boolean;
30
+ readonly forthcoming: boolean;
31
+ readonly section: string | undefined;
32
+ readonly text: string;
33
+ _ast: ChapterNode | undefined;
34
+ _index: Record<string, Array<Match>> | undefined;
35
+ _wordCount: number | undefined;
29
36
  edits: {
30
37
  resolve: Function;
31
38
  reject: Function;
32
39
  }[];
33
40
  lastEdit: number;
34
41
  listeners: Set<(text: string) => void>;
35
- constructor(edition: Edition, spec: ChapterSpecification);
36
- saveEdits(): void;
37
- addListener(listener: (text: string) => void): void;
38
- removeListener(listener: (text: string) => void): void;
39
- notifyListeners(): void;
40
- requestSave(): Promise<void>;
41
- toObject(): any;
42
- getBook(): Edition;
42
+ constructor(ref: DocumentReference | undefined, id: string, title: string, authors: string[], image: string | null, numbered: boolean, forthcoming: boolean, section: string | undefined, text: string);
43
+ /**
44
+ * Convert a chapter spec and it's text into a chapter object.
45
+ * The spec may contain the text itself, but it may not, so we require it to be
46
+ * repeated here to guarantee its provided.
47
+ */
48
+ static fromJSON(spec: ChapterSpecification, text: string): Chapter;
49
+ toJSON(): ChapterSpecification;
43
50
  getRef(): DocumentReference<import("@firebase/firestore").DocumentData> | undefined;
44
- getChapterID(): string;
45
- setChapterID(id: string): Promise<void> | undefined;
51
+ withRef(ref: DocumentReference): Chapter;
52
+ withoutRef(): Chapter;
53
+ getID(): string;
54
+ withChapterID(id: string): Chapter;
46
55
  getSection(): string | undefined;
47
- setSection(section: string): Promise<void> | undefined;
56
+ withSection(section: string): Chapter;
48
57
  isForthcoming(): boolean;
49
- setForthcoming(forthcoming: boolean): Promise<void> | undefined;
58
+ asForthcoming(forthcoming: boolean): Chapter;
50
59
  isNumbered(): boolean;
51
- setNumbered(numbered: boolean): Promise<void> | undefined;
52
- getText(): string | undefined;
53
- setText(text: string): void;
54
- setAST(node: ChapterNode): Promise<void> | undefined;
55
- addAuthor(name: string): Promise<void>;
60
+ asNumbered(numbered: boolean): Chapter;
61
+ getText(): string;
62
+ withText(text: string): Chapter;
63
+ withAST(ast: ChapterNode): Chapter;
56
64
  getAuthors(): string[];
57
- setAuthor(index: number, name: string): Promise<void> | undefined;
58
- removeAuthor(index: number): Promise<void> | undefined;
65
+ withAuthor(name: string): Chapter;
66
+ withRenamedAuthor(index: number, name: string): Chapter;
67
+ withoutAuthor(index: number): Chapter;
59
68
  getTitle(): string;
60
- setTitle(title: string): Promise<void> | undefined;
61
- getPosition(): number | undefined;
62
- move(increment: number): Promise<void>;
63
- delete(): Promise<void>;
69
+ withTitle(title: string): Chapter;
64
70
  getImage(): string | null;
65
- setImage(embed: string | null): Promise<void> | undefined;
66
- getIndex(): Record<string, Match[]> | undefined;
67
- getAST(): ChapterNode | undefined;
68
- getReadingTime(): number | undefined;
69
- computeIndex(): Record<string, Match[]> | undefined;
71
+ withImage(image: string | null): Chapter;
72
+ getAST(edition: Edition): ChapterNode;
73
+ getWordCount(edition: Edition): number;
74
+ getReadingTime(edition: Edition): number | undefined;
75
+ getIndex(edition: Edition): Record<string, Match[]>;
76
+ toString(): string;
70
77
  }