flea-qml 0.0.0-stage → 0.1.0

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 (625) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +478 -2
  3. package/THIRD-PARTY-NOTICES.md +29 -0
  4. package/demos/App.java +5 -0
  5. package/demos/Dockerfile +4 -0
  6. package/demos/Main.kt +3 -0
  7. package/demos/Program.cs +1 -0
  8. package/demos/README.md +12 -0
  9. package/demos/app.dart +3 -0
  10. package/demos/app.deb +0 -0
  11. package/demos/app.js +1 -0
  12. package/demos/backup.tar +0 -0
  13. package/demos/budget.xlsx +0 -0
  14. package/demos/build.sh +2 -0
  15. package/demos/bundle.zip +0 -0
  16. package/demos/clip.mp4 +0 -0
  17. package/demos/data.sqlite +0 -0
  18. package/demos/disk.iso +0 -0
  19. package/demos/engine.cpp +5 -0
  20. package/demos/firmware.bin +0 -0
  21. package/demos/flake.nix +4 -0
  22. package/demos/folder/inside.txt +1 -0
  23. package/demos/font.ttf +0 -0
  24. package/demos/index.html +5 -0
  25. package/demos/index.php +2 -0
  26. package/demos/init.lua +1 -0
  27. package/demos/letter.docx +0 -0
  28. package/demos/lib.rs +3 -0
  29. package/demos/main.c +6 -0
  30. package/demos/main.h +3 -0
  31. package/demos/math-and-diagrams.md +200 -0
  32. package/demos/notes.tar.gz +0 -0
  33. package/demos/notes.txt +3 -0
  34. package/demos/photo.png +0 -0
  35. package/demos/program +2 -0
  36. package/demos/report.pdf +32 -0
  37. package/demos/script.py +1 -0
  38. package/demos/server.go +7 -0
  39. package/demos/settings.json +4 -0
  40. package/demos/slides.pptx +0 -0
  41. package/demos/song.mp3 +0 -0
  42. package/demos/style.css +4 -0
  43. package/demos/tool.rb +1 -0
  44. package/demos/types.ts +2 -0
  45. package/docs/pele.md +23 -0
  46. package/docs/protocol.md +3420 -0
  47. package/docs/temml.md +63 -0
  48. package/index.js +107 -0
  49. package/package.json +34 -4
  50. package/src/archive.js +402 -0
  51. package/src/archiveops.js +697 -0
  52. package/src/backend.js +369 -0
  53. package/src/bulkrename.js +95 -0
  54. package/src/clip-host.js +76 -0
  55. package/src/clip.js +462 -0
  56. package/src/code.js +168 -0
  57. package/src/compare.js +74 -0
  58. package/src/create.js +128 -0
  59. package/src/dirsize.js +147 -0
  60. package/src/figure-svg.js +530 -0
  61. package/src/figure-thread.js +23 -0
  62. package/src/figure.js +132 -0
  63. package/src/find.js +55 -0
  64. package/src/flea.js +39 -0
  65. package/src/fsinfo.js +39 -0
  66. package/src/highlight.js +141 -0
  67. package/src/html.js +52 -0
  68. package/src/kinds.js +89 -0
  69. package/src/listing.js +130 -0
  70. package/src/markdown-html.js +317 -0
  71. package/src/mathml.js +186 -0
  72. package/src/menu.js +180 -0
  73. package/src/meta.js +129 -0
  74. package/src/office.js +810 -0
  75. package/src/order.js +100 -0
  76. package/src/peek.js +49 -0
  77. package/src/pele-wrapper.js +695 -0
  78. package/src/permissions.js +180 -0
  79. package/src/places.js +313 -0
  80. package/src/preview-language.js +10 -0
  81. package/src/transfer.js +669 -0
  82. package/src/trash-record.js +41 -0
  83. package/src/trash.js +210 -0
  84. package/src/trashbrowse.js +326 -0
  85. package/src/uistate.js +393 -0
  86. package/src/uistore.js +168 -0
  87. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  88. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  89. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  90. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  91. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  92. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  93. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  94. package/src/vendor/pele.js +145 -0
  95. package/src/vendor/temml.mjs +14708 -0
  96. package/src/watch.js +98 -0
  97. package/src/wayland/client.js +109 -0
  98. package/src/wayland/protocol.js +55 -0
  99. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  100. package/src/wayland/protocols/wayland.xml +3248 -0
  101. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  102. package/src/wayland/resource-io.js +6 -0
  103. package/src/wayland/socket-discovery.js +26 -0
  104. package/src/wayland/transport-posix.js +120 -0
  105. package/src/wayland/transport-win32.js +11 -0
  106. package/src/wayland/transport.js +3 -0
  107. package/src/wayland/win32-resources.js +80 -0
  108. package/src/wayland/win32-wire.js +62 -0
  109. package/test/archive.test.js +80 -0
  110. package/test/bench-markdown-scroll.mjs +190 -0
  111. package/test/clip-host.test.js +113 -0
  112. package/test/code-preview.test.js +35 -0
  113. package/test/compare-ui-paths.test.js +24 -0
  114. package/test/compare.test.js +54 -0
  115. package/test/delete-trash.test.js +67 -0
  116. package/test/dirsize.test.js +138 -0
  117. package/test/file-ops.test.js +241 -0
  118. package/test/find-contents.test.js +161 -0
  119. package/test/find-input.test.js +66 -0
  120. package/test/fixtures/pele-parity.json +1006 -0
  121. package/test/highlight-launcher.test.js +35 -0
  122. package/test/html-preview.test.js +22 -0
  123. package/test/input.test.js +15 -0
  124. package/test/keymap.test.js +26 -0
  125. package/test/language-icons.test.js +36 -0
  126. package/test/launcher.test.js +51 -0
  127. package/test/manual-code-scroll.mjs +28 -0
  128. package/test/manual-column-scroll.mjs +24 -0
  129. package/test/manual-compare-ui.mjs +20 -0
  130. package/test/manual-find-status.mjs +37 -0
  131. package/test/manual-html-security.mjs +23 -0
  132. package/test/manual-html-ui.mjs +30 -0
  133. package/test/manual-syntax-preview.mjs +26 -0
  134. package/test/manual-trash-ui.mjs +86 -0
  135. package/test/markdown-diagrams.test.js +93 -0
  136. package/test/markdown-html.test.js +105 -0
  137. package/test/mathml.test.js +92 -0
  138. package/test/menu-transfer.test.js +57 -0
  139. package/test/office-preview.test.js +154 -0
  140. package/test/pele-parity.test.js +28 -0
  141. package/test/places.test.js +134 -0
  142. package/test/preview-keys.test.js +60 -0
  143. package/test/preview-language.test.js +22 -0
  144. package/test/status-filename.test.js +20 -0
  145. package/test/transfer-replace-merge.test.js +187 -0
  146. package/test/trash-address.test.js +23 -0
  147. package/test/trash-view.test.js +37 -0
  148. package/test/trashbrowse.test.js +135 -0
  149. package/ui/AboutFacts.qml +78 -0
  150. package/ui/ArchiveCards.qml +68 -0
  151. package/ui/ArchiveCompressDialog.qml +378 -0
  152. package/ui/ArchivePasswordDialog.qml +257 -0
  153. package/ui/Backend.qml +771 -0
  154. package/ui/BulkOldNames.qml +47 -0
  155. package/ui/BulkRenameDialog.qml +380 -0
  156. package/ui/CardFrame.qml +67 -0
  157. package/ui/CardScroll.qml +79 -0
  158. package/ui/CheckBox.qml +73 -0
  159. package/ui/ChromeBar.qml +360 -0
  160. package/ui/ChromeButton.qml +131 -0
  161. package/ui/ChromeModes.qml +43 -0
  162. package/ui/CodeLines.qml +256 -0
  163. package/ui/CodeRefusal.qml +52 -0
  164. package/ui/CollideConfirm.qml +147 -0
  165. package/ui/CollideHost.qml +167 -0
  166. package/ui/ColumnPane.qml +523 -0
  167. package/ui/ColumnRow.qml +380 -0
  168. package/ui/ColumnsArea.qml +594 -0
  169. package/ui/ColumnsLanding.qml +147 -0
  170. package/ui/CompareView.qml +321 -0
  171. package/ui/ContextMenu.qml +743 -0
  172. package/ui/ConvertDialog.qml +456 -0
  173. package/ui/CountedWorker.qml +7 -0
  174. package/ui/Crumb.qml +64 -0
  175. package/ui/CrumbDrop.qml +25 -0
  176. package/ui/CsvTable.qml +394 -0
  177. package/ui/CursorMark.qml +41 -0
  178. package/ui/DefaultClaim.qml +130 -0
  179. package/ui/DeviceLock.qml +47 -0
  180. package/ui/DeviceMounts.qml +540 -0
  181. package/ui/DialogButton.qml +150 -0
  182. package/ui/DialogField.qml +147 -0
  183. package/ui/DialogHeader.qml +31 -0
  184. package/ui/DialogScrim.qml +20 -0
  185. package/ui/DialogTitle.qml +37 -0
  186. package/ui/Divider.qml +9 -0
  187. package/ui/DropInto.qml +126 -0
  188. package/ui/DropTarget.qml +35 -0
  189. package/ui/DropboxMark.qml +60 -0
  190. package/ui/EmptyState.qml +150 -0
  191. package/ui/EscapeHint.qml +11 -0
  192. package/ui/FactsTable.qml +54 -0
  193. package/ui/FastScrollHandler.qml +476 -0
  194. package/ui/FatNamesConfirm.qml +157 -0
  195. package/ui/Favourites.qml +143 -0
  196. package/ui/FigureService.qml +120 -0
  197. package/ui/FileDrag.qml +267 -0
  198. package/ui/FilterStrip.qml +133 -0
  199. package/ui/FitMetrics.qml +22 -0
  200. package/ui/FlashDriveRows.qml +137 -0
  201. package/ui/FlashHost.qml +72 -0
  202. package/ui/FlashImageRow.qml +104 -0
  203. package/ui/FlashRunner.qml +119 -0
  204. package/ui/FlashStepRow.qml +172 -0
  205. package/ui/FlashStrip.qml +38 -0
  206. package/ui/FlashView.qml +397 -0
  207. package/ui/FleaMark.qml +88 -0
  208. package/ui/FlyoutFade.qml +23 -0
  209. package/ui/FontPane.qml +170 -0
  210. package/ui/Glass.qml +114 -0
  211. package/ui/GlassTagger.qml +59 -0
  212. package/ui/Glyph.qml +64 -0
  213. package/ui/GlyphSolid.qml +22 -0
  214. package/ui/GridArea.qml +664 -0
  215. package/ui/GridTile.qml +325 -0
  216. package/ui/GvfsBridge.qml +164 -0
  217. package/ui/Header.qml +433 -0
  218. package/ui/HoverTimers.qml +39 -0
  219. package/ui/HtmlClip.qml +30 -0
  220. package/ui/HtmlPane.qml +63 -0
  221. package/ui/HyprlandMark.qml +45 -0
  222. package/ui/Ipc.qml +1005 -0
  223. package/ui/IpcControls.qml +7 -0
  224. package/ui/IpcMenuState.qml +48 -0
  225. package/ui/IpcPreviewState.qml +185 -0
  226. package/ui/JumpPath.qml +51 -0
  227. package/ui/KeymapSheet.qml +561 -0
  228. package/ui/KeymapSheetResult.qml +89 -0
  229. package/ui/KindStack.qml +40 -0
  230. package/ui/LangMark.qml +51 -0
  231. package/ui/LangMarkLoader.qml +26 -0
  232. package/ui/List.qml +480 -0
  233. package/ui/LoadingState.qml +54 -0
  234. package/ui/LocalSend.qml +56 -0
  235. package/ui/LocalSendMark.qml +73 -0
  236. package/ui/MarkdownBlockView.qml +311 -0
  237. package/ui/MarkdownBlocks.qml +35 -0
  238. package/ui/MarkdownFigure.qml +254 -0
  239. package/ui/MarkdownImages.qml +72 -0
  240. package/ui/MarkdownList.qml +81 -0
  241. package/ui/MarkdownMathsText.qml +97 -0
  242. package/ui/MarkdownPane.qml +83 -0
  243. package/ui/MarkdownPictures.qml +41 -0
  244. package/ui/MarkdownQuote.qml +52 -0
  245. package/ui/MarkdownRemote.qml +82 -0
  246. package/ui/MarkdownSource.qml +155 -0
  247. package/ui/MarkdownTable.qml +222 -0
  248. package/ui/MarkdownTableScroll.qml +64 -0
  249. package/ui/MarkdownTableWheel.qml +126 -0
  250. package/ui/MarkdownText.qml +87 -0
  251. package/ui/MarkdownWorker.js +132 -0
  252. package/ui/MatchText.qml +99 -0
  253. package/ui/MediaSession.qml +38 -0
  254. package/ui/MediaSound.qml +26 -0
  255. package/ui/MediaStrip.qml +191 -0
  256. package/ui/MediaTrack.qml +36 -0
  257. package/ui/MediaVolume.qml +54 -0
  258. package/ui/MenuActionDialog.qml +396 -0
  259. package/ui/MenuEdgeFade.qml +24 -0
  260. package/ui/MenuHost.qml +227 -0
  261. package/ui/MenuRow.qml +351 -0
  262. package/ui/MountListing.qml +100 -0
  263. package/ui/NetworkDialog.qml +435 -0
  264. package/ui/NetworkForm.qml +426 -0
  265. package/ui/NetworkMounts.qml +913 -0
  266. package/ui/NetworkPlaces.qml +127 -0
  267. package/ui/OpenWithDialog.qml +613 -0
  268. package/ui/Opener.qml +115 -0
  269. package/ui/Pane.qml +1296 -0
  270. package/ui/PaneMenuActions.qml +527 -0
  271. package/ui/PanePath.qml +90 -0
  272. package/ui/PaneRail.qml +239 -0
  273. package/ui/PaneStates.qml +88 -0
  274. package/ui/PaneSwap.qml +339 -0
  275. package/ui/PaneWire.qml +605 -0
  276. package/ui/ParkedWait.qml +9 -0
  277. package/ui/PathEntry.qml +186 -0
  278. package/ui/PathJump.qml +400 -0
  279. package/ui/PdfViewer.qml +297 -0
  280. package/ui/PermissionsDialog.qml +658 -0
  281. package/ui/PermissionsHeadings.qml +31 -0
  282. package/ui/PhoneMounts.qml +67 -0
  283. package/ui/PickerAnswers.qml +75 -0
  284. package/ui/PickerBox.qml +26 -0
  285. package/ui/PickerChrome.qml +295 -0
  286. package/ui/PickerFilter.qml +97 -0
  287. package/ui/PickerGrid.qml +308 -0
  288. package/ui/PickerHeader.qml +28 -0
  289. package/ui/PickerLifecycle.qml +27 -0
  290. package/ui/PickerList.qml +218 -0
  291. package/ui/PickerListing.qml +149 -0
  292. package/ui/PickerPathBar.qml +127 -0
  293. package/ui/PickerPlaces.qml +189 -0
  294. package/ui/PickerRecent.qml +92 -0
  295. package/ui/PickerSave.qml +101 -0
  296. package/ui/PickerSelection.qml +155 -0
  297. package/ui/PickerWindow.qml +846 -0
  298. package/ui/PowerSectorsReader.qml +10 -0
  299. package/ui/PrebuildDriver.qml +146 -0
  300. package/ui/Preview.qml +1004 -0
  301. package/ui/PreviewAnimation.qml +24 -0
  302. package/ui/PreviewArchive.qml +66 -0
  303. package/ui/PreviewColumn.qml +551 -0
  304. package/ui/PreviewEdge.qml +63 -0
  305. package/ui/PreviewFacts.qml +30 -0
  306. package/ui/PreviewFactsLine.qml +34 -0
  307. package/ui/PreviewHtml.qml +233 -0
  308. package/ui/PreviewImage.qml +253 -0
  309. package/ui/PreviewImagePan.qml +13 -0
  310. package/ui/PreviewImageSharp.qml +32 -0
  311. package/ui/PreviewLines.qml +106 -0
  312. package/ui/PreviewMarkdown.qml +706 -0
  313. package/ui/PreviewMedia.qml +250 -0
  314. package/ui/PreviewPdf.qml +482 -0
  315. package/ui/PreviewScroll.qml +201 -0
  316. package/ui/PreviewSwap.qml +335 -0
  317. package/ui/PreviewText.qml +149 -0
  318. package/ui/ProtocolChip.qml +18 -0
  319. package/ui/QuickLookArchive.qml +38 -0
  320. package/ui/QuickLookBar.qml +103 -0
  321. package/ui/QuickLookPrepare.qml +355 -0
  322. package/ui/QuickLookSwap.qml +10 -0
  323. package/ui/QuickLookWarm.qml +65 -0
  324. package/ui/RailDrop.qml +155 -0
  325. package/ui/RailHeading.qml +19 -0
  326. package/ui/RailPlaces.qml +38 -0
  327. package/ui/RailTrashRow.qml +67 -0
  328. package/ui/RenameField.qml +353 -0
  329. package/ui/RendererRetry.qml +11 -0
  330. package/ui/ResizeHandle.qml +52 -0
  331. package/ui/Reveal.qml +54 -0
  332. package/ui/Row.qml +476 -0
  333. package/ui/RowDrag.qml +213 -0
  334. package/ui/RowDropTarget.qml +27 -0
  335. package/ui/RunCard.qml +286 -0
  336. package/ui/Scripts.qml +65 -0
  337. package/ui/SearchStrip.qml +232 -0
  338. package/ui/SelectionBand.qml +140 -0
  339. package/ui/SelectionPreview.qml +370 -0
  340. package/ui/SettingsFavourite.qml +122 -0
  341. package/ui/SettingsGroup.qml +96 -0
  342. package/ui/SettingsHint.qml +12 -0
  343. package/ui/SettingsMetrics.qml +29 -0
  344. package/ui/SettingsPane.qml +178 -0
  345. package/ui/SettingsPanel.qml +547 -0
  346. package/ui/SettingsRail.qml +128 -0
  347. package/ui/SettingsRow.qml +409 -0
  348. package/ui/SettingsRuler.qml +85 -0
  349. package/ui/SettingsSegment.qml +85 -0
  350. package/ui/ShareBrowser.qml +113 -0
  351. package/ui/ShareLink.qml +67 -0
  352. package/ui/ShelfPins.qml +101 -0
  353. package/ui/Sidebar.qml +732 -0
  354. package/ui/SidebarRow.qml +358 -0
  355. package/ui/Spinner.qml +60 -0
  356. package/ui/StableModel.qml +89 -0
  357. package/ui/StateMessage.qml +84 -0
  358. package/ui/StatusBar.qml +512 -0
  359. package/ui/StatusFileName.qml +27 -0
  360. package/ui/TabBar.qml +673 -0
  361. package/ui/TabDragGeometry.qml +60 -0
  362. package/ui/TagMenuMark.qml +52 -0
  363. package/ui/TagRailSection.qml +53 -0
  364. package/ui/TagSlot.qml +40 -0
  365. package/ui/TagState.qml +150 -0
  366. package/ui/TagSwatch.qml +28 -0
  367. package/ui/Taildrop.qml +86 -0
  368. package/ui/TailscaleMark.qml +50 -0
  369. package/ui/Theme.qml +460 -0
  370. package/ui/ThemeColors.qml +43 -0
  371. package/ui/TransferCard.qml +239 -0
  372. package/ui/TrashConfirm.qml +129 -0
  373. package/ui/TrashDropHandler.qml +11 -0
  374. package/ui/TrashHost.qml +202 -0
  375. package/ui/TrashMonitor.qml +30 -0
  376. package/ui/TrashToolbar.qml +19 -0
  377. package/ui/TrashView.qml +492 -0
  378. package/ui/UnlockDialog.qml +450 -0
  379. package/ui/UnlockHost.qml +206 -0
  380. package/ui/UpdateCheck.qml +97 -0
  381. package/ui/UserDirs.qml +25 -0
  382. package/ui/ViewState.qml +565 -0
  383. package/ui/ViewportScrollBar.qml +195 -0
  384. package/ui/ViewportScrollBars.qml +25 -0
  385. package/ui/WebPreview.qml +33 -0
  386. package/ui/WebPreviewView.qml +26 -0
  387. package/ui/WindowBody.qml +827 -0
  388. package/ui/WindowDrag.qml +35 -0
  389. package/ui/boot/Commons/AudioNodes.qml +50 -0
  390. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  391. package/ui/boot/Commons/Border.qml +243 -0
  392. package/ui/boot/Commons/BorderGeometry.js +373 -0
  393. package/ui/boot/Commons/Color.qml +258 -0
  394. package/ui/boot/Commons/I18n.qml +118 -0
  395. package/ui/boot/Commons/InputDevices.qml +112 -0
  396. package/ui/boot/Commons/InputMethodState.qml +38 -0
  397. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  398. package/ui/boot/Commons/Numbers.js +19 -0
  399. package/ui/boot/Commons/Plural.js +91 -0
  400. package/ui/boot/Commons/ShellIpc.qml +12 -0
  401. package/ui/boot/Commons/Style.qml +561 -0
  402. package/ui/boot/Commons/Translations.qml +100 -0
  403. package/ui/boot/Commons/UntypedInput.qml +152 -0
  404. package/ui/boot/Commons/Util.qml +188 -0
  405. package/ui/boot/Commons/qmldir +13 -0
  406. package/ui/boot/LICENSE-omarchy +20 -0
  407. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  408. package/ui/boot/Ui/BarIconButton.qml +106 -0
  409. package/ui/boot/Ui/BarIconContent.qml +38 -0
  410. package/ui/boot/Ui/BarIndicator.qml +53 -0
  411. package/ui/boot/Ui/BarWidget.qml +50 -0
  412. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  413. package/ui/boot/Ui/BorderSurface.qml +40 -0
  414. package/ui/boot/Ui/Button.qml +224 -0
  415. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  416. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  417. package/ui/boot/Ui/CursorSurface.qml +42 -0
  418. package/ui/boot/Ui/Dropdown.qml +245 -0
  419. package/ui/boot/Ui/FilterInput.qml +26 -0
  420. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  421. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  422. package/ui/boot/Ui/MultiSelect.qml +624 -0
  423. package/ui/boot/Ui/NumberField.qml +86 -0
  424. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  425. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  426. package/ui/boot/Ui/Panel.qml +60 -0
  427. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  428. package/ui/boot/Ui/PanelController.qml +16 -0
  429. package/ui/boot/Ui/PanelHero.qml +112 -0
  430. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  431. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  432. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  433. package/ui/boot/Ui/PanelSlider.qml +156 -0
  434. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  435. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  436. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  437. package/ui/boot/Ui/PopupCard.qml +181 -0
  438. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  439. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  440. package/ui/boot/Ui/SizedImage.qml +125 -0
  441. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  442. package/ui/boot/Ui/TextField.qml +58 -0
  443. package/ui/boot/Ui/Toggle.qml +118 -0
  444. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  445. package/ui/boot/Ui/WidgetButton.qml +172 -0
  446. package/ui/boot/Ui/qmldir +41 -0
  447. package/ui/boot/fleatab.qml +50 -0
  448. package/ui/boot/picker.qml +39 -0
  449. package/ui/boot/shell.qml +122 -0
  450. package/ui/boot/tabtearoff.qml +51 -0
  451. package/ui/js/Anchor.js +379 -0
  452. package/ui/js/AnchorHold.js +162 -0
  453. package/ui/js/Archive.js +157 -0
  454. package/ui/js/ArchiveCard.js +44 -0
  455. package/ui/js/ArchiveOps.js +44 -0
  456. package/ui/js/BackReturn.js +118 -0
  457. package/ui/js/BulkRename.js +100 -0
  458. package/ui/js/Buttons.js +54 -0
  459. package/ui/js/ChromeKeys.js +116 -0
  460. package/ui/js/ClipMarks.js +73 -0
  461. package/ui/js/ClipSelection.js +67 -0
  462. package/ui/js/Clipboard.js +179 -0
  463. package/ui/js/Cloud.js +97 -0
  464. package/ui/js/CodeRuns.js +72 -0
  465. package/ui/js/Collide.js +212 -0
  466. package/ui/js/ColumnFit.js +28 -0
  467. package/ui/js/ColumnMenu.js +111 -0
  468. package/ui/js/Columns.js +298 -0
  469. package/ui/js/ColumnsCarry.js +103 -0
  470. package/ui/js/Compare.js +74 -0
  471. package/ui/js/Contrast.js +157 -0
  472. package/ui/js/ControlReader.js +42 -0
  473. package/ui/js/Convert.js +52 -0
  474. package/ui/js/CopyAs.js +52 -0
  475. package/ui/js/Crumbs.js +178 -0
  476. package/ui/js/Csv.js +231 -0
  477. package/ui/js/Density.js +44 -0
  478. package/ui/js/Devices.js +440 -0
  479. package/ui/js/DirSizes.js +180 -0
  480. package/ui/js/Drag.js +364 -0
  481. package/ui/js/DragOut.js +166 -0
  482. package/ui/js/DropDev.js +52 -0
  483. package/ui/js/Dropbox.js +41 -0
  484. package/ui/js/Eject.js +217 -0
  485. package/ui/js/Errors.js +188 -0
  486. package/ui/js/ExtThumbs.js +115 -0
  487. package/ui/js/Facts.js +402 -0
  488. package/ui/js/FigureDate.js +14 -0
  489. package/ui/js/Filter.js +285 -0
  490. package/ui/js/Find.js +46 -0
  491. package/ui/js/Flash.js +184 -0
  492. package/ui/js/FlashCard.js +79 -0
  493. package/ui/js/FlashEndings.js +125 -0
  494. package/ui/js/FlashPane.js +116 -0
  495. package/ui/js/FleaBin.js +12 -0
  496. package/ui/js/Focus.js +502 -0
  497. package/ui/js/FolderSorts.js +108 -0
  498. package/ui/js/FolderViews.js +44 -0
  499. package/ui/js/Format.js +305 -0
  500. package/ui/js/Fuzzy.js +141 -0
  501. package/ui/js/GlassTag.js +72 -0
  502. package/ui/js/Grid.js +33 -0
  503. package/ui/js/GridGeometry.js +90 -0
  504. package/ui/js/GridNames.js +153 -0
  505. package/ui/js/GvfsBridge.js +200 -0
  506. package/ui/js/HostClipboard.js +29 -0
  507. package/ui/js/Icons.js +218 -0
  508. package/ui/js/Input.js +50 -0
  509. package/ui/js/Jump.js +200 -0
  510. package/ui/js/KeyName.js +64 -0
  511. package/ui/js/Keymap.js +401 -0
  512. package/ui/js/Kinds.js +164 -0
  513. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  514. package/ui/js/LangMarkPaths.js +47 -0
  515. package/ui/js/LangMarks.js +120 -0
  516. package/ui/js/Lists.js +11 -0
  517. package/ui/js/LocalSend.js +39 -0
  518. package/ui/js/LockedMenu.js +63 -0
  519. package/ui/js/MakeDefault.js +186 -0
  520. package/ui/js/MarkBox.js +7 -0
  521. package/ui/js/Markdown.js +119 -0
  522. package/ui/js/MarkdownLists.js +86 -0
  523. package/ui/js/MarkdownMaths.js +58 -0
  524. package/ui/js/MarkdownPictures.js +32 -0
  525. package/ui/js/MarkdownPrepared.js +139 -0
  526. package/ui/js/MarkdownTableFit.js +34 -0
  527. package/ui/js/Marks.js +148 -0
  528. package/ui/js/Marquee.js +96 -0
  529. package/ui/js/Match.js +93 -0
  530. package/ui/js/Material.js +109 -0
  531. package/ui/js/MdBlocks.js +437 -0
  532. package/ui/js/MdBreak.js +71 -0
  533. package/ui/js/MdChunks.js +70 -0
  534. package/ui/js/MdContainer.js +137 -0
  535. package/ui/js/MdDocument.js +337 -0
  536. package/ui/js/MdEmph.js +97 -0
  537. package/ui/js/MdEntity.js +108 -0
  538. package/ui/js/MdEntityTable.js +223 -0
  539. package/ui/js/MdEscape.js +59 -0
  540. package/ui/js/MdFront.js +37 -0
  541. package/ui/js/MdHold.js +32 -0
  542. package/ui/js/MdHtml.js +307 -0
  543. package/ui/js/MdHtmlBlock.js +290 -0
  544. package/ui/js/MdHtmlHeading.js +53 -0
  545. package/ui/js/MdHtmlImage.js +179 -0
  546. package/ui/js/MdInline.js +154 -0
  547. package/ui/js/MdItems.js +212 -0
  548. package/ui/js/MdLeaf.js +309 -0
  549. package/ui/js/MdLink.js +196 -0
  550. package/ui/js/MdMath.js +67 -0
  551. package/ui/js/MdParagraphs.js +138 -0
  552. package/ui/js/MdRefs.js +232 -0
  553. package/ui/js/MdResolve.js +226 -0
  554. package/ui/js/MdRun.js +300 -0
  555. package/ui/js/MdUrl.js +226 -0
  556. package/ui/js/Menu.js +514 -0
  557. package/ui/js/MenuContext.js +85 -0
  558. package/ui/js/MenuFit.js +13 -0
  559. package/ui/js/MenuRefresh.js +74 -0
  560. package/ui/js/MenuWheel.js +35 -0
  561. package/ui/js/Messages.js +186 -0
  562. package/ui/js/Motion.js +16 -0
  563. package/ui/js/Mounts.js +320 -0
  564. package/ui/js/MouseNav.js +13 -0
  565. package/ui/js/Nav.js +329 -0
  566. package/ui/js/NetFs.js +26 -0
  567. package/ui/js/OpenWith.js +83 -0
  568. package/ui/js/Ops.js +585 -0
  569. package/ui/js/Palette.js +33 -0
  570. package/ui/js/PathBar.js +260 -0
  571. package/ui/js/Permissions.js +179 -0
  572. package/ui/js/Phones.js +112 -0
  573. package/ui/js/Picker.js +353 -0
  574. package/ui/js/PlaceMenu.js +96 -0
  575. package/ui/js/Places.js +265 -0
  576. package/ui/js/PreviewAsk.js +21 -0
  577. package/ui/js/PreviewKeys.js +155 -0
  578. package/ui/js/PreviewSettle.js +29 -0
  579. package/ui/js/PreviewSwap.js +101 -0
  580. package/ui/js/PropertyFacts.js +144 -0
  581. package/ui/js/Protocols.js +296 -0
  582. package/ui/js/QuickLookKinds.js +27 -0
  583. package/ui/js/QuickLookRect.js +24 -0
  584. package/ui/js/RailDrop.js +51 -0
  585. package/ui/js/RailKeys.js +87 -0
  586. package/ui/js/RailMenu.js +133 -0
  587. package/ui/js/Recent.js +135 -0
  588. package/ui/js/RecentMode.js +156 -0
  589. package/ui/js/Reload.js +60 -0
  590. package/ui/js/Renderer.js +9 -0
  591. package/ui/js/RunFile.js +143 -0
  592. package/ui/js/Scripts.js +28 -0
  593. package/ui/js/Scroll.js +304 -0
  594. package/ui/js/ScrollOff.js +69 -0
  595. package/ui/js/Search.js +478 -0
  596. package/ui/js/Selection.js +97 -0
  597. package/ui/js/Settings.js +476 -0
  598. package/ui/js/SettingsAbout.js +97 -0
  599. package/ui/js/SettingsShelf.js +52 -0
  600. package/ui/js/SheetKeys.js +42 -0
  601. package/ui/js/SheetQuery.js +281 -0
  602. package/ui/js/ShelfPile.js +27 -0
  603. package/ui/js/SlowClick.js +53 -0
  604. package/ui/js/SlowOp.js +6 -0
  605. package/ui/js/Sort.js +134 -0
  606. package/ui/js/Startup.js +63 -0
  607. package/ui/js/StateWords.js +17 -0
  608. package/ui/js/Status.js +238 -0
  609. package/ui/js/Swap.js +166 -0
  610. package/ui/js/TabMove.js +39 -0
  611. package/ui/js/Tabs.js +736 -0
  612. package/ui/js/Tags.js +134 -0
  613. package/ui/js/Taildrop.js +128 -0
  614. package/ui/js/Tap.js +174 -0
  615. package/ui/js/TextSize.js +107 -0
  616. package/ui/js/Thumbs.js +158 -0
  617. package/ui/js/Transfer.js +172 -0
  618. package/ui/js/Trash.js +81 -0
  619. package/ui/js/TrashDates.js +47 -0
  620. package/ui/js/TrashDrop.js +64 -0
  621. package/ui/js/UiState.js +438 -0
  622. package/ui/js/Unlock.js +152 -0
  623. package/ui/js/Update.js +130 -0
  624. package/ui/js/UserDirs.js +56 -0
  625. package/ui/qmldir +228 -0
@@ -0,0 +1,437 @@
1
+ .pragma library
2
+
3
+ // The same streaming block pass collects definitions and renders with the resulting complete map.
4
+ .import "MdLeaf.js" as Leaf
5
+ .import "MdRefs.js" as Refs
6
+ .import "MdContainer.js" as Container
7
+ .import "MdDocument.js" as Document
8
+ .import "MdHtml.js" as Html
9
+ .import "MdMath.js" as Maths
10
+ .import "MdFront.js" as Front
11
+
12
+ var CODE_INDENT = 4
13
+ var MIN_RULE_MARKS = 3
14
+ var MAX_RULE_INDENT = 3
15
+ var LIST_INTERRUPT_START = 1
16
+ // A working parse proves it every few thousand block-pass events or PROGRESS_MS, so the pane's fallback waits for silence, never speed.
17
+ var PROGRESS_EVENTS = 4000
18
+ // Events cost more or less as the box is loaded, so a parse also beats once PROGRESS_MS passed, the clock read every CLOCK_EVENTS events.
19
+ var PROGRESS_MS = 500
20
+ var CLOCK_EVENTS = 64
21
+ // A live request is parsed SLICE_MS at a time, so a newer request is read between slices (a running parse cannot be cancelled).
22
+ var SLICE_MS = 200
23
+ var clock = Date.now
24
+ // A suite replaces the clock with a stepped one, so the clock beat is proved without waiting.
25
+ function useClock(now) {
26
+ clock = now
27
+ }
28
+ // A slice's stop test: true once ms have passed, the clock read every CLOCK_EVENTS lines.
29
+ function sliceDue(ms) {
30
+ var from = clock()
31
+ var seen = 0
32
+ return function () { return ++seen % CLOCK_EVENTS === 0 && clock() - from >= ms }
33
+ }
34
+ // A document nesting containers deeper than this is not rendered: blocks answers one sentinel and the pane shows the source.
35
+ var NESTING_LIMIT = 32
36
+ var SETEXT_MARK = /^(\s*)([=-])/
37
+ var hasOwn = Object.prototype.hasOwnProperty
38
+
39
+ // Sample input: "mermaid chart title" selects a diagram by its first word, ignoring case.
40
+ function figureKind(info) {
41
+ var first = String(info || "").trim().split(/\s+/)[0] || ""
42
+ var word = first.toLowerCase()
43
+ if (word === "mermaid")
44
+ return "mermaid"
45
+ if (word === "math" || word === "latex")
46
+ return "math"
47
+ return ""
48
+ }
49
+ // Sample: "> - - -" has one thematic suffix; cache it before opening any nested containers.
50
+ function ruleSuffix(line) {
51
+ var at = line.length - 1
52
+ while (at >= 0 && (line.charAt(at) === " " || line.charAt(at) === "\t"))
53
+ at--
54
+ var tick = line.charAt(at)
55
+ var count = 0
56
+ if (tick !== "-" && tick !== "*" && tick !== "_")
57
+ return { start: line.length, count: count }
58
+ while (at >= 0 && (line.charAt(at) === tick || line.charAt(at) === " " || line.charAt(at) === "\t")) {
59
+ if (line.charAt(at) === tick)
60
+ count++
61
+ at--
62
+ }
63
+ return { start: at + 1, count: count }
64
+ }
65
+
66
+ // Keys are document text, so the three keyed maps have no prototype: "__proto__" and "hasOwnProperty" are ordinary ids.
67
+ function referenceState() {
68
+ return { defs: Object.create(null), notes: Object.create(null), numbers: Object.create(null),
69
+ hidden: {}, escaped: {}, code: {}, dropped: [] }
70
+ }
71
+
72
+ // Sample: "- > ```\n > [id]: literal\n > ```" matches an item, then a quote, before its fence; nested lines hold no front matter.
73
+ function blockPass(lines, state, emit, collect, nested, onProgress, job) {
74
+ // A job's due() stops the pass at a line boundary, and its saved state is what the next slice resumes with.
75
+ var frames = []
76
+ var leaf = null
77
+ var pending = null
78
+ var serial = 0
79
+ var lastQuote = -1
80
+ // No listener means no heartbeat: a parse without onProgress never beats.
81
+ var beatEvery = onProgress !== undefined ? PROGRESS_EVENTS : 0
82
+ var sinceBeat = 0
83
+ var beatAt = beatEvery !== 0 ? clock() : 0
84
+ // Leading frames now open that share frame 0's type (items or quotes), where the line's text starts after them, and the frames found open.
85
+ var lead = { n: 0, here: 0, lazy: false, retained: 0, at: 0, pad: 0, col: 0, raw: "" }
86
+ function send(kind, index, text, top, display, info) {
87
+ if (emit !== undefined)
88
+ emit({ type: "line", kind: kind, index: index, text: text,
89
+ outer: top, display: display, info: info || "", chain: frames, lead: lead,
90
+ figureKind: kind === "fenceOpen" ? figureKind(info) : "" })
91
+ // A pass carrying the heartbeat proves it is moving every few thousand sends or every half second.
92
+ if (beatEvery !== 0) {
93
+ sinceBeat++
94
+ if (sinceBeat >= beatEvery || (sinceBeat % CLOCK_EVENTS === 0 && clock() - beatAt >= PROGRESS_MS)) {
95
+ sinceBeat = 0
96
+ beatAt = clock()
97
+ onProgress()
98
+ }
99
+ }
100
+ }
101
+ function finishNote() {
102
+ if (pending !== null && pending.note !== undefined)
103
+ pending.note.text = pending.body.join("\n")
104
+ pending = null
105
+ }
106
+ var due = job !== undefined ? job.due : undefined
107
+ var from = 0
108
+ if (job !== undefined && job.saved !== null) {
109
+ from = job.saved.at
110
+ frames = job.saved.frames
111
+ leaf = job.saved.leaf
112
+ pending = job.saved.pending
113
+ serial = job.saved.serial
114
+ lastQuote = job.saved.lastQuote
115
+ lead = job.saved.lead
116
+ }
117
+ for (var i = from; i < lines.length; i++) {
118
+ if (due !== undefined && due()) {
119
+ job.saved = { at: i, frames: frames, leaf: leaf, pending: pending, serial: serial, lastQuote: lastQuote, lead: lead }
120
+ job.paused = true
121
+ return
122
+ }
123
+ var raw = lines[i]
124
+ var view = { at: 0, padding: 0, column: 0 }
125
+ var rawBlank = raw.trim().length === 0
126
+ var matched = 0
127
+ var leadHere = 0
128
+ lead = { n: lead.n, here: 0, lazy: false, retained: 0, at: 0, pad: 0, col: 0, raw: raw }
129
+ var display = raw
130
+ var rule = ruleSuffix(raw)
131
+ var previousTop = frames.length > 0 ? frames[0] : null
132
+ for (; matched < frames.length; matched++) {
133
+ var frame = frames[matched]
134
+ if (frame.type === "quote") {
135
+ var quote = Container.quoteAt(raw, view)
136
+ if (quote < 0)
137
+ break
138
+ Container.takeQuote(raw, view, quote)
139
+ } else {
140
+ var indent = Container.indentationAt(raw, view, frame.contentCol).width
141
+ if (indent >= frame.contentCol && frame.sealed !== true) {
142
+ Container.takeIndent(raw, view, frame.contentCol)
143
+ } else if (rawBlank || raw.slice(view.at).trim().length === 0) {
144
+ // An item opened on a blank line holds at most that one blank line, so a second seals it against more content.
145
+ if (frame.bareAt === i - 1)
146
+ frame.sealed = true
147
+ if (matched > lastQuote) {
148
+ matched = frames.length
149
+ break
150
+ }
151
+ } else {
152
+ break
153
+ }
154
+ }
155
+ if (frame.type === frames[0].type && leadHere === matched) {
156
+ lead.here = ++leadHere
157
+ lead.at = view.at
158
+ lead.pad = view.padding
159
+ lead.col = view.column
160
+ }
161
+ if (matched === 0)
162
+ display = Container.textAt(raw, view)
163
+ }
164
+ var unmatchedText = Container.textAt(raw, view)
165
+ var startsQuote = Container.quoteAt(raw, view) >= 0
166
+ var startsList = Container.listAt(raw, view)
167
+ var siblingList = matched < frames.length && frames[matched].type === "list" && startsList !== null
168
+ var listInterrupts = startsList !== null && (siblingList || ((!startsList.ordered
169
+ || startsList.start === LIST_INTERRUPT_START) && raw.slice(startsList.markerEnd).trim().length > 0))
170
+ var startsFence = Leaf.fenceOpen(unmatchedText)
171
+ var thematic = Leaf.isThematic(unmatchedText)
172
+ var setext = leaf !== null && leaf.kind === "paragraph" && matched === frames.length && Leaf.isSetext(unmatchedText)
173
+ var lazy = leaf !== null && leaf.kind === "paragraph" && unmatchedText.trim().length > 0
174
+ && !startsQuote && !listInterrupts && startsFence === null && !thematic
175
+ && !/^ {0,3}#{1,6}(?:\s|$)/.test(unmatchedText)
176
+ if (matched < frames.length && !lazy) {
177
+ frames.length = matched
178
+ lead.n = Math.min(lead.n, matched)
179
+ lastQuote = -1
180
+ for (var q = 0; q < frames.length; q++) {
181
+ if (frames[q].type === "quote")
182
+ lastQuote = q
183
+ }
184
+ leaf = null
185
+ }
186
+ var owner = frames.length > 0 ? frames[frames.length - 1].id : 0
187
+ var fenced = leaf !== null && leaf.kind === "fence" && leaf.owner === owner
188
+ lead.retained = frames.length
189
+ lead.lazy = lazy && matched < frames.length
190
+ if (!fenced && !lazy && !setext) {
191
+ while (true) {
192
+ var quoteIndent = Container.quoteAt(raw, view)
193
+ var marker = quoteIndent < 0 ? Container.listAt(raw, view) : null
194
+ var ruleHere = rule.count >= MIN_RULE_MARKS && view.at >= rule.start
195
+ && marker !== null && marker.indent <= MAX_RULE_INDENT
196
+ if (quoteIndent < 0 && (marker === null || thematic || ruleHere))
197
+ break
198
+ var next = { id: ++serial, type: quoteIndent >= 0 ? "quote" : "list" }
199
+ if (quoteIndent >= 0) {
200
+ Container.takeQuote(raw, view, quoteIndent)
201
+ lastQuote = frames.length
202
+ } else {
203
+ next.contentCol = marker.contentCol
204
+ next.ordered = marker.ordered
205
+ next.mark = marker.mark
206
+ next.start = marker.start
207
+ next.bareAt = raw.slice(marker.markerEnd).trim().length === 0 ? i : -1
208
+ next.group = frames.length === 0 && previousTop !== null
209
+ && previousTop.type === "list" && previousTop.mark === marker.mark
210
+ ? previousTop.group : next.id
211
+ Container.takeList(raw, view, marker)
212
+ }
213
+ if (lead.n === frames.length && (frames.length === 0 || next.type === frames[0].type)) {
214
+ lead.here = ++lead.n
215
+ leadHere = lead.n
216
+ lead.at = view.at
217
+ lead.pad = view.padding
218
+ lead.col = view.column
219
+ }
220
+ frames.push(next)
221
+ if (frames.length > NESTING_LIMIT) {
222
+ state.deep = true
223
+ return
224
+ }
225
+ owner = next.id
226
+ leaf = null
227
+ if (frames.length === 1)
228
+ display = Container.textAt(raw, view)
229
+ }
230
+ }
231
+ var top = frames.length > 0 ? frames[0] : null
232
+ var text = Container.textAt(raw, view)
233
+ // Sample: "> foo\nbar\n===" keeps its lazy "===" as text, so the renderer cannot take it for a setext underline.
234
+ if (lazy && matched < frames.length && Leaf.isSetext(unmatchedText)) {
235
+ text = text.replace(SETEXT_MARK, "$1\\$2")
236
+ display = display.replace(SETEXT_MARK, "$1\\$2")
237
+ }
238
+ if (fenced) {
239
+ var closer = Leaf.fenceOpen(text)
240
+ var closed = closer !== null && closer.info === "" && closer.tick === leaf.tick && closer.len >= leaf.len
241
+ state.code[i] = true
242
+ send(closed ? "fenceClose" : "fenceBody", i, closed ? text : Container.unindent(text, leaf.indent), top, display)
243
+ if (closed)
244
+ leaf = null
245
+ continue
246
+ }
247
+ if (pending !== null) {
248
+ if (collect && pending.owner === owner && pending.note !== undefined
249
+ && Container.indentationAt(raw, view).width >= CODE_INDENT) {
250
+ pending.body.push(text.replace(/^\s+/, ""))
251
+ Refs.hideDefinition(state, i, i)
252
+ send("hidden", i, text, top, display)
253
+ continue
254
+ }
255
+ if (collect && pending.owner === owner && pending.ref !== undefined && Leaf.fenceOpen(text) === null) {
256
+ // Sample: '[cover].png "Title"' accepts a destination only when the complete line parses.
257
+ var destination = Refs.readDefinitionParts(text.trim())
258
+ if (destination.target !== "") {
259
+ Refs.storeDefinition(state.defs, pending.ref.key, destination.target)
260
+ Refs.hideDefinition(state, pending.index, i)
261
+ Refs.hideTitle(lines, i + 1, state, !destination.titled, frames)
262
+ // Replay the opener's paragraph state so its lazy destination keeps the same containers.
263
+ state.hidden[pending.index] = "paragraph"
264
+ pending = null
265
+ leaf = null
266
+ send("hidden", i, text, top, display)
267
+ continue
268
+ }
269
+ }
270
+ finishNote()
271
+ }
272
+ if (state.hidden.hasOwnProperty(i)) {
273
+ leaf = state.hidden[i] === "paragraph" ? { kind: "paragraph", owner: owner } : null
274
+ send("hidden", i, text, top, display)
275
+ continue
276
+ }
277
+ var front = i === 0 && nested !== true ? Front.closeAt(lines) : -1
278
+ if (front > 0) {
279
+ i = Front.sendFront(lines, front, send, state)
280
+ leaf = null
281
+ continue
282
+ }
283
+ var open = Leaf.fenceOpen(text)
284
+ if (open !== null) {
285
+ leaf = { kind: "fence", owner: owner, tick: open.tick, len: open.len, indent: open.indent }
286
+ state.code[i] = true
287
+ send("fenceOpen", i, text, top, display, open.info)
288
+ continue
289
+ }
290
+ // Sample input: "$$x^2$$" and "$$\nx^2\n$$" emit figures, with trailing prose retained.
291
+ var math = top === null ? Maths.displayAt(lines, i, text) : null
292
+ if (math !== null) {
293
+ for (var m = i; m <= math.to; m++)
294
+ state.code[m] = true
295
+ if (emit !== undefined)
296
+ emit({ type: "figure", kind: "math", source: math.source, display: true })
297
+ i = math.to
298
+ if (math.tail.length > 0)
299
+ send("run", i, math.tail, null, math.tail)
300
+ leaf = math.tail.trim().length > 0 ? { kind: "paragraph", owner: owner } : null
301
+ continue
302
+ }
303
+ var blank = text.trim().length === 0
304
+ var width = Container.indentationAt(raw, view).width
305
+ if (leaf !== null && leaf.kind === "code" && (blank || width >= CODE_INDENT)) {
306
+ state.code[i] = true
307
+ Container.takeIndent(raw, view, CODE_INDENT)
308
+ send("codeLine", i, Container.textAt(raw, view), top, display)
309
+ continue
310
+ }
311
+ if (leaf !== null && leaf.kind === "code") {
312
+ send("codeEnd", i, "", top, display)
313
+ leaf = null
314
+ }
315
+ if ((leaf === null || leaf.kind !== "paragraph") && !blank && width >= CODE_INDENT) {
316
+ leaf = { kind: "code", owner: owner }
317
+ state.code[i] = true
318
+ Container.takeIndent(raw, view, CODE_INDENT)
319
+ send("codeLine", i, Container.textAt(raw, view), top, display)
320
+ continue
321
+ }
322
+ if (collect && leaf === null && !blank) {
323
+ var note = Refs.readFootnoteDefinition(text)
324
+ // Outside a container a definition may span lines; inside one it is read a line at a time.
325
+ var multi = note === null && top === null ? Refs.definitionAt(lines, i) : null
326
+ var ref = note === null && top !== null ? Refs.readDefinition(text) : null
327
+ if (multi !== null) {
328
+ Refs.storeDefinition(state.defs, multi.key, multi.target)
329
+ Refs.hideDefinition(state, i, multi.end)
330
+ i = multi.end
331
+ continue
332
+ }
333
+ if (note !== null) {
334
+ var stored = hasOwn.call(state.notes, note.id) ? null : { text: note.text }
335
+ if (stored !== null) {
336
+ state.notes[note.id] = stored
337
+ state.numbers[note.id] = 0
338
+ }
339
+ pending = { owner: owner, note: stored || {}, body: [note.text] }
340
+ Refs.hideDefinition(state, i, i)
341
+ send("hidden", i, text, top, display)
342
+ continue
343
+ }
344
+ if (ref !== null) {
345
+ if (ref.target !== "") {
346
+ Refs.storeDefinition(state.defs, ref.key, ref.target)
347
+ Refs.hideDefinition(state, i, i)
348
+ Refs.hideTitle(lines, i + 1, state, !ref.titled, frames)
349
+ send("hidden", i, text, top, display)
350
+ continue
351
+ }
352
+ pending = { owner: owner, ref: ref, index: i }
353
+ }
354
+ }
355
+ var heading = top === null ? Leaf.atxHeading(text) : null
356
+ if (heading !== null) {
357
+ if (emit !== undefined)
358
+ emit({ type: "heading", level: heading.level, text: heading.text })
359
+ leaf = null
360
+ continue
361
+ }
362
+ var aligns = top === null && text.indexOf("|") >= 0 && i + 1 < lines.length ? Leaf.delimAligns(lines[i + 1]) : null
363
+ var header = aligns === null ? null : Leaf.splitRow(text)
364
+ // The delimiter row must match the header's cell count; a row ends the table at a blank line or another block.
365
+ if (header !== null && header.length === aligns.length) {
366
+ var rows = []
367
+ i += 2
368
+ while (i < lines.length && lines[i].trim().length > 0 && !Container.startsBlock(lines[i]))
369
+ rows.push(Leaf.splitRow(lines[i++]))
370
+ if (emit !== undefined)
371
+ emit({ type: "table", head: header, aligns: aligns, rows: rows })
372
+ i--
373
+ leaf = null
374
+ continue
375
+ }
376
+ if (Refs.killDefinition(text) !== text)
377
+ state.escaped[i] = true
378
+ send(setext && top === null ? "setext" : "run", i, text, top, display)
379
+ leaf = blank || setext || Leaf.isThematic(text) || /^ {0,3}#{1,6}(?:\s|$)/.test(text) ? null : { kind: "paragraph", owner: owner }
380
+ }
381
+ finishNote()
382
+ }
383
+
384
+ function collectReferences(source) {
385
+ var state = referenceState()
386
+ blockPass(Html.documentText(source).split("\n"), state, undefined, true)
387
+ return state
388
+ }
389
+
390
+ // A parse that stops between lines: run(due) answers the blocks when both passes are done, or null when due() stopped it.
391
+ function blockJob(source, dir, chrome, ink, headCount, onHead, onProgress) {
392
+ var lines = Html.documentText(source).split("\n")
393
+ var state = referenceState()
394
+ var collecting = { due: undefined, saved: null, paused: false }
395
+ var rendering = { due: undefined, saved: null, paused: false }
396
+ var writer = null
397
+ var project = null
398
+ var answer = null
399
+ function run(due) {
400
+ if (answer !== null)
401
+ return answer
402
+ if (writer === null) {
403
+ collecting.due = due
404
+ collecting.paused = false
405
+ // The collecting pass carries the heartbeat too, so a slow reference scan still proves it is moving.
406
+ blockPass(lines, state, undefined, true, undefined, onProgress, collecting)
407
+ if (collecting.paused)
408
+ return null
409
+ if (state.deep === true) {
410
+ answer = [{ type: "deep", limit: NESTING_LIMIT }]
411
+ return answer
412
+ }
413
+ writer = Document.writer(state, dir, chrome, ink, blockPass)
414
+ project = onHead !== undefined && headCount > 0 ? writer.headed(headCount, onHead) : writer.project
415
+ }
416
+ rendering.due = due
417
+ rendering.paused = false
418
+ blockPass(lines, state, project, false, undefined, onProgress, rendering)
419
+ if (rendering.paused)
420
+ return null
421
+ answer = writer.finish()
422
+ return answer
423
+ }
424
+ return { run: run }
425
+ }
426
+
427
+ function blocks(source, dir, chrome, ink, headCount, onHead, onProgress) {
428
+ var job = blockJob(source, dir, chrome, ink, headCount, onHead, onProgress)
429
+ return job.run(undefined)
430
+ }
431
+
432
+ function prepare(source, dir, defs, chrome, ink) {
433
+ var lines = Html.documentText(source).split("\n")
434
+ var state = referenceState()
435
+ blockPass(lines, state, undefined, true)
436
+ return Document.preparedText(lines, state, dir, defs, chrome, ink)
437
+ }
@@ -0,0 +1,71 @@
1
+ .pragma library
2
+
3
+ // MdBreak: the line-level readers of the inline scan, hard breaks and thematic break lines.
4
+ .import "MdEmph.js" as Emph
5
+ .import "MdLeaf.js" as Leaf
6
+
7
+ var HARD_BREAK_SPACES = 2
8
+ var MAX_MARKER_LENGTH = 10
9
+
10
+ // Sample input: "foo \nbar" and "foo\\\nbar" break the line; "foo \nbar" and a paragraph's last newline do not.
11
+ function lineBreak(body, i, out, delims, endParagraph) {
12
+ var slash = body.charAt(i) === "\\"
13
+ var next = slash ? i + 2 : i + 1
14
+ var spaces = 0
15
+ while (!slash && out.length > 0 && out[out.length - 1] === " ") {
16
+ out.pop()
17
+ spaces++
18
+ }
19
+ while (next < body.length && (body.charAt(next) === " " || body.charAt(next) === "\t"))
20
+ next++
21
+ // A blank line ends the paragraph, and no emphasis mark pairs and no bracket pair closes across it.
22
+ if (next < body.length && body.charAt(next) === "\n") {
23
+ Emph.process(delims, delims.bottom)
24
+ delims.bottom = delims.length
25
+ endParagraph()
26
+ }
27
+ if (next < body.length && body.charAt(next) !== "\n" && (slash || spaces >= HARD_BREAK_SPACES)) {
28
+ out.push("<br />")
29
+ return next
30
+ }
31
+ if (slash)
32
+ out.push("\\")
33
+ out.push("\n")
34
+ return slash ? i + 2 : i + 1
35
+ }
36
+
37
+ var RULE_LINE_INDENT = 3
38
+
39
+ // Sample input: "a\n * * *\nb" at the second star is a thematic break line, which the renderer draws as a rule.
40
+ function isRuleLine(body, at) {
41
+ var from = at
42
+ while (from > 0 && at - from < RULE_LINE_INDENT && body.charAt(from - 1) === " ")
43
+ from--
44
+ if (from > 0 && body.charAt(from - 1) !== "\n")
45
+ return false
46
+ var end = body.indexOf("\n", at)
47
+ return Leaf.isThematic(body.slice(from, end < 0 ? body.length : end))
48
+ }
49
+
50
+ var LIST_MARK = /^(?:[-+*]|\d{1,9}[.)])$/
51
+
52
+ function skipBlanksBack(body, at) {
53
+ var p = at
54
+ while (p >= 0 && (body.charAt(p) === " " || body.charAt(p) === "\t"))
55
+ p--
56
+ return p
57
+ }
58
+
59
+ // Sample input: "- > q" at the ">" is a quote mark inside an item; "a > b" is not. last is the previous mark's index.
60
+ function quoteMarkAt(body, at, last) {
61
+ var p = skipBlanksBack(body, at - 1)
62
+ if (p < 0 || body.charAt(p) === "\n" || p === last)
63
+ return true
64
+ var from = p
65
+ while (from > 0 && /\S/.test(body.charAt(from - 1)))
66
+ from--
67
+ if (p - from >= MAX_MARKER_LENGTH || p === at - 1 || !LIST_MARK.test(body.slice(from, p + 1)))
68
+ return false
69
+ var before = skipBlanksBack(body, from - 1)
70
+ return before < 0 || body.charAt(before) === "\n" || before === last
71
+ }
@@ -0,0 +1,70 @@
1
+ .pragma library
2
+
3
+ // MdChunks: a long list as consecutive blocks the outer ListView draws lazily.
4
+ .import "MdLeaf.js" as Leaf
5
+ .import "MarkdownLists.js" as Lists
6
+
7
+ var ARRAY_FIELDS = ["depths", "markers", "gaps", "parts"]
8
+
9
+ function openRun(ordered) {
10
+ return { ordered: ordered, widest: "" }
11
+ }
12
+
13
+ // Sample input: a list "9.", "10." with a bullet under the first answers, at each chunk edge k, the runs still open after k entries.
14
+ function openRuns(list, size) {
15
+ var open = []
16
+ var previous = -1
17
+ var edges = {}
18
+ for (var k = 0; k < list.items.length; k++) {
19
+ if (k % size === 0)
20
+ edges[k] = open.slice()
21
+ var depth = list.depths !== undefined ? list.depths[k] : 0
22
+ var given = list.markers !== undefined ? list.markers[k] : list.ordered ? (list.start + k) + "." : ""
23
+ // The runs open here are the ones MarkdownLists.layout opens, since both step through runStep.
24
+ var run = Lists.runStep(open, previous, depth, given, list.ordered === true, openRun)
25
+ if (run.ordered && given.length > run.widest.length)
26
+ run.widest = given
27
+ previous = depth
28
+ }
29
+ edges[list.items.length] = open.slice()
30
+ return edges
31
+ }
32
+
33
+ // A run as the chunk carries it: its kind and the widest marker over the whole list, which fixes its text column.
34
+ function carried(runs) {
35
+ return runs.map(function (run) { return { ordered: run.ordered, marker: run.widest } })
36
+ }
37
+
38
+ // Sample input: a list of 40 items answers two blocks of 32 and 8, numbering continued through start, last keeping one marker column width.
39
+ function chunkList(list) {
40
+ if (list.items.length <= Leaf.LIST_CHUNK_ITEMS)
41
+ return [list]
42
+ var size = Leaf.LIST_CHUNK_ITEMS
43
+ var chunks = []
44
+ var last = list.start + list.items.length - 1
45
+ // Entries of a nested list are not numbered items, so the last number is the last one a top-level marker carries.
46
+ for (var m = 0; list.depths !== undefined && m < list.items.length; m++) {
47
+ if (list.depths[m] === 0 && Lists.ORDERED_START.test(list.markers[m]))
48
+ last = parseInt(list.markers[m], 10)
49
+ }
50
+ var edges = openRuns(list, size)
51
+ for (var at = 0; at < list.items.length; at += size) {
52
+ var chunk = { type: "list", ordered: list.ordered, start: list.start + at, items: list.items.slice(at, at + size), last: last, joined: at > 0 }
53
+ // Each field of a nested, loose or part-holding list is cut at the same places, whichever of them the list carries.
54
+ for (var f = 0; f < ARRAY_FIELDS.length; f++) {
55
+ var name = ARRAY_FIELDS[f]
56
+ if (list[name] !== undefined)
57
+ chunk[name] = list[name].slice(at, at + size)
58
+ }
59
+ // A later chunk's first entry keeps the gap above it that the whole list gave it, a nested list's parent being the entry before.
60
+ if (at > 0 && list.gaps !== undefined) {
61
+ var deeper = list.depths !== undefined && list.depths[at] > list.depths[at - 1]
62
+ chunk.gaps[0] = list.gaps[at] || (deeper && list.gaps[at - 1])
63
+ }
64
+ // The runs open at each end keep the text column the whole list gives them, so a sublist at a seam does not jump.
65
+ chunk.carry = carried(edges[at])
66
+ chunk.tail = carried(edges[Math.min(at + size, list.items.length)])
67
+ chunks.push(chunk)
68
+ }
69
+ return chunks
70
+ }