flea-qml 0.0.0-stage → 0.2.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 (637) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +511 -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 +407 -0
  51. package/src/archiveops.js +728 -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 +135 -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/terminal-server.js +95 -0
  82. package/src/terminal-shell.js +26 -0
  83. package/src/transfer.js +669 -0
  84. package/src/trash-record.js +41 -0
  85. package/src/trash.js +210 -0
  86. package/src/trashbrowse.js +327 -0
  87. package/src/uistate.js +393 -0
  88. package/src/uistore.js +168 -0
  89. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  90. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  91. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  92. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  93. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  94. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  95. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  96. package/src/vendor/pele.js +145 -0
  97. package/src/vendor/temml.mjs +14708 -0
  98. package/src/watch.js +98 -0
  99. package/src/wayland/client.js +109 -0
  100. package/src/wayland/protocol.js +55 -0
  101. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  102. package/src/wayland/protocols/wayland.xml +3248 -0
  103. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  104. package/src/wayland/resource-io.js +6 -0
  105. package/src/wayland/socket-discovery.js +26 -0
  106. package/src/wayland/transport-posix.js +120 -0
  107. package/src/wayland/transport-win32.js +11 -0
  108. package/src/wayland/transport.js +3 -0
  109. package/src/wayland/win32-resources.js +80 -0
  110. package/src/wayland/win32-wire.js +62 -0
  111. package/test/archive.test.js +80 -0
  112. package/test/bench-markdown-scroll.mjs +190 -0
  113. package/test/clip-host.test.js +113 -0
  114. package/test/code-preview.test.js +35 -0
  115. package/test/compare-ui-paths.test.js +24 -0
  116. package/test/compare.test.js +54 -0
  117. package/test/delete-trash.test.js +67 -0
  118. package/test/dirsize.test.js +138 -0
  119. package/test/file-ops.test.js +307 -0
  120. package/test/file-url.test.js +24 -0
  121. package/test/find-contents.test.js +161 -0
  122. package/test/find-input.test.js +66 -0
  123. package/test/fixtures/pele-parity.json +1006 -0
  124. package/test/highlight-launcher.test.js +35 -0
  125. package/test/html-preview.test.js +22 -0
  126. package/test/input.test.js +15 -0
  127. package/test/keymap.test.js +26 -0
  128. package/test/language-icons.test.js +36 -0
  129. package/test/launcher.test.js +51 -0
  130. package/test/manual-archive-here-ui.mjs +47 -0
  131. package/test/manual-code-scroll.mjs +28 -0
  132. package/test/manual-column-scroll.mjs +24 -0
  133. package/test/manual-compare-ui.mjs +20 -0
  134. package/test/manual-find-status.mjs +37 -0
  135. package/test/manual-folder-focus.mjs +63 -0
  136. package/test/manual-html-security.mjs +23 -0
  137. package/test/manual-html-ui.mjs +30 -0
  138. package/test/manual-syntax-preview.mjs +26 -0
  139. package/test/manual-terminal-lifecycle.mjs +42 -0
  140. package/test/manual-terminal-navigation.mjs +48 -0
  141. package/test/manual-terminal-ui.mjs +47 -0
  142. package/test/manual-trash-ui.mjs +86 -0
  143. package/test/markdown-diagrams.test.js +93 -0
  144. package/test/markdown-html.test.js +105 -0
  145. package/test/mathml.test.js +92 -0
  146. package/test/menu-transfer.test.js +57 -0
  147. package/test/office-preview.test.js +154 -0
  148. package/test/pele-parity.test.js +28 -0
  149. package/test/places.test.js +134 -0
  150. package/test/preview-keys.test.js +60 -0
  151. package/test/preview-language.test.js +22 -0
  152. package/test/status-filename.test.js +20 -0
  153. package/test/transfer-replace-merge.test.js +187 -0
  154. package/test/trash-address.test.js +23 -0
  155. package/test/trash-view.test.js +37 -0
  156. package/test/trashbrowse.test.js +135 -0
  157. package/ui/AboutFacts.qml +78 -0
  158. package/ui/ArchiveCards.qml +95 -0
  159. package/ui/ArchiveCompressDialog.qml +378 -0
  160. package/ui/ArchiveHereConfirm.qml +127 -0
  161. package/ui/ArchivePasswordDialog.qml +257 -0
  162. package/ui/Backend.qml +775 -0
  163. package/ui/BulkOldNames.qml +47 -0
  164. package/ui/BulkRenameDialog.qml +380 -0
  165. package/ui/CardFrame.qml +67 -0
  166. package/ui/CardScroll.qml +79 -0
  167. package/ui/CheckBox.qml +73 -0
  168. package/ui/ChromeBar.qml +360 -0
  169. package/ui/ChromeButton.qml +131 -0
  170. package/ui/ChromeModes.qml +43 -0
  171. package/ui/CodeLines.qml +256 -0
  172. package/ui/CodeRefusal.qml +52 -0
  173. package/ui/CollideConfirm.qml +147 -0
  174. package/ui/CollideHost.qml +167 -0
  175. package/ui/ColumnPane.qml +525 -0
  176. package/ui/ColumnRow.qml +380 -0
  177. package/ui/ColumnsArea.qml +594 -0
  178. package/ui/ColumnsLanding.qml +147 -0
  179. package/ui/CompareView.qml +321 -0
  180. package/ui/ContextMenu.qml +743 -0
  181. package/ui/ConvertDialog.qml +456 -0
  182. package/ui/CountedWorker.qml +7 -0
  183. package/ui/Crumb.qml +64 -0
  184. package/ui/CrumbDrop.qml +25 -0
  185. package/ui/CsvTable.qml +394 -0
  186. package/ui/CursorMark.qml +41 -0
  187. package/ui/DefaultClaim.qml +130 -0
  188. package/ui/DeviceLock.qml +47 -0
  189. package/ui/DeviceMounts.qml +540 -0
  190. package/ui/DialogButton.qml +150 -0
  191. package/ui/DialogField.qml +147 -0
  192. package/ui/DialogHeader.qml +31 -0
  193. package/ui/DialogScrim.qml +20 -0
  194. package/ui/DialogTitle.qml +37 -0
  195. package/ui/Divider.qml +9 -0
  196. package/ui/DropInto.qml +126 -0
  197. package/ui/DropTarget.qml +35 -0
  198. package/ui/DropboxMark.qml +60 -0
  199. package/ui/EmptyState.qml +150 -0
  200. package/ui/EscapeHint.qml +11 -0
  201. package/ui/FactsTable.qml +54 -0
  202. package/ui/FastScrollHandler.qml +476 -0
  203. package/ui/FatNamesConfirm.qml +157 -0
  204. package/ui/Favourites.qml +143 -0
  205. package/ui/FigureService.qml +120 -0
  206. package/ui/FileDrag.qml +267 -0
  207. package/ui/FilterStrip.qml +133 -0
  208. package/ui/FitMetrics.qml +22 -0
  209. package/ui/FlashDriveRows.qml +137 -0
  210. package/ui/FlashHost.qml +72 -0
  211. package/ui/FlashImageRow.qml +104 -0
  212. package/ui/FlashRunner.qml +119 -0
  213. package/ui/FlashStepRow.qml +172 -0
  214. package/ui/FlashStrip.qml +38 -0
  215. package/ui/FlashView.qml +397 -0
  216. package/ui/FleaMark.qml +88 -0
  217. package/ui/FlyoutFade.qml +23 -0
  218. package/ui/FontPane.qml +170 -0
  219. package/ui/Glass.qml +114 -0
  220. package/ui/GlassTagger.qml +59 -0
  221. package/ui/Glyph.qml +64 -0
  222. package/ui/GlyphSolid.qml +22 -0
  223. package/ui/GridArea.qml +664 -0
  224. package/ui/GridTile.qml +325 -0
  225. package/ui/GvfsBridge.qml +164 -0
  226. package/ui/Header.qml +433 -0
  227. package/ui/HoverTimers.qml +39 -0
  228. package/ui/HtmlClip.qml +30 -0
  229. package/ui/HtmlPane.qml +63 -0
  230. package/ui/HyprlandMark.qml +45 -0
  231. package/ui/Ipc.qml +1005 -0
  232. package/ui/IpcControls.qml +7 -0
  233. package/ui/IpcMenuState.qml +48 -0
  234. package/ui/IpcPreviewState.qml +185 -0
  235. package/ui/JumpPath.qml +51 -0
  236. package/ui/KeymapSheet.qml +561 -0
  237. package/ui/KeymapSheetResult.qml +89 -0
  238. package/ui/KindStack.qml +40 -0
  239. package/ui/LangMark.qml +51 -0
  240. package/ui/LangMarkLoader.qml +26 -0
  241. package/ui/List.qml +480 -0
  242. package/ui/LoadingState.qml +54 -0
  243. package/ui/LocalSend.qml +56 -0
  244. package/ui/LocalSendMark.qml +73 -0
  245. package/ui/MarkdownBlockView.qml +311 -0
  246. package/ui/MarkdownBlocks.qml +35 -0
  247. package/ui/MarkdownFigure.qml +254 -0
  248. package/ui/MarkdownImages.qml +72 -0
  249. package/ui/MarkdownList.qml +81 -0
  250. package/ui/MarkdownMathsText.qml +97 -0
  251. package/ui/MarkdownPane.qml +83 -0
  252. package/ui/MarkdownPictures.qml +41 -0
  253. package/ui/MarkdownQuote.qml +52 -0
  254. package/ui/MarkdownRemote.qml +82 -0
  255. package/ui/MarkdownSource.qml +155 -0
  256. package/ui/MarkdownTable.qml +222 -0
  257. package/ui/MarkdownTableScroll.qml +64 -0
  258. package/ui/MarkdownTableWheel.qml +126 -0
  259. package/ui/MarkdownText.qml +87 -0
  260. package/ui/MarkdownWorker.js +132 -0
  261. package/ui/MatchText.qml +99 -0
  262. package/ui/MediaSession.qml +38 -0
  263. package/ui/MediaSound.qml +26 -0
  264. package/ui/MediaStrip.qml +191 -0
  265. package/ui/MediaTrack.qml +36 -0
  266. package/ui/MediaVolume.qml +54 -0
  267. package/ui/MenuActionDialog.qml +396 -0
  268. package/ui/MenuEdgeFade.qml +24 -0
  269. package/ui/MenuHost.qml +227 -0
  270. package/ui/MenuRow.qml +351 -0
  271. package/ui/MountListing.qml +100 -0
  272. package/ui/NetworkDialog.qml +435 -0
  273. package/ui/NetworkForm.qml +426 -0
  274. package/ui/NetworkMounts.qml +913 -0
  275. package/ui/NetworkPlaces.qml +127 -0
  276. package/ui/OpenWithDialog.qml +613 -0
  277. package/ui/Opener.qml +95 -0
  278. package/ui/Pane.qml +1320 -0
  279. package/ui/PaneMenuActions.qml +527 -0
  280. package/ui/PanePath.qml +90 -0
  281. package/ui/PaneRail.qml +268 -0
  282. package/ui/PaneStates.qml +88 -0
  283. package/ui/PaneSwap.qml +339 -0
  284. package/ui/PaneWire.qml +601 -0
  285. package/ui/ParkedWait.qml +9 -0
  286. package/ui/PathEntry.qml +186 -0
  287. package/ui/PathJump.qml +400 -0
  288. package/ui/PdfViewer.qml +297 -0
  289. package/ui/PermissionsDialog.qml +658 -0
  290. package/ui/PermissionsHeadings.qml +31 -0
  291. package/ui/PhoneMounts.qml +67 -0
  292. package/ui/PickerAnswers.qml +75 -0
  293. package/ui/PickerBox.qml +26 -0
  294. package/ui/PickerChrome.qml +295 -0
  295. package/ui/PickerFilter.qml +97 -0
  296. package/ui/PickerGrid.qml +308 -0
  297. package/ui/PickerHeader.qml +28 -0
  298. package/ui/PickerLifecycle.qml +27 -0
  299. package/ui/PickerList.qml +218 -0
  300. package/ui/PickerListing.qml +149 -0
  301. package/ui/PickerPathBar.qml +127 -0
  302. package/ui/PickerPlaces.qml +189 -0
  303. package/ui/PickerRecent.qml +92 -0
  304. package/ui/PickerSave.qml +101 -0
  305. package/ui/PickerSelection.qml +155 -0
  306. package/ui/PickerWindow.qml +846 -0
  307. package/ui/PowerSectorsReader.qml +10 -0
  308. package/ui/PrebuildDriver.qml +146 -0
  309. package/ui/Preview.qml +1005 -0
  310. package/ui/PreviewAnimation.qml +24 -0
  311. package/ui/PreviewArchive.qml +91 -0
  312. package/ui/PreviewColumn.qml +553 -0
  313. package/ui/PreviewEdge.qml +63 -0
  314. package/ui/PreviewFacts.qml +30 -0
  315. package/ui/PreviewFactsLine.qml +34 -0
  316. package/ui/PreviewHtml.qml +233 -0
  317. package/ui/PreviewImage.qml +253 -0
  318. package/ui/PreviewImagePan.qml +13 -0
  319. package/ui/PreviewImageSharp.qml +32 -0
  320. package/ui/PreviewLines.qml +106 -0
  321. package/ui/PreviewMarkdown.qml +706 -0
  322. package/ui/PreviewMedia.qml +250 -0
  323. package/ui/PreviewPdf.qml +482 -0
  324. package/ui/PreviewScroll.qml +201 -0
  325. package/ui/PreviewSwap.qml +335 -0
  326. package/ui/PreviewText.qml +149 -0
  327. package/ui/ProtocolChip.qml +18 -0
  328. package/ui/QuickLookArchive.qml +41 -0
  329. package/ui/QuickLookBar.qml +103 -0
  330. package/ui/QuickLookPrepare.qml +355 -0
  331. package/ui/QuickLookSwap.qml +10 -0
  332. package/ui/QuickLookWarm.qml +65 -0
  333. package/ui/RailDrop.qml +155 -0
  334. package/ui/RailHeading.qml +19 -0
  335. package/ui/RailPlaces.qml +38 -0
  336. package/ui/RailTrashRow.qml +67 -0
  337. package/ui/RenameField.qml +353 -0
  338. package/ui/RendererRetry.qml +11 -0
  339. package/ui/ResizeHandle.qml +52 -0
  340. package/ui/Reveal.qml +54 -0
  341. package/ui/Row.qml +476 -0
  342. package/ui/RowDrag.qml +213 -0
  343. package/ui/RowDropTarget.qml +27 -0
  344. package/ui/RunCard.qml +286 -0
  345. package/ui/Scripts.qml +65 -0
  346. package/ui/SearchStrip.qml +232 -0
  347. package/ui/SelectionBand.qml +140 -0
  348. package/ui/SelectionPreview.qml +370 -0
  349. package/ui/SettingsFavourite.qml +122 -0
  350. package/ui/SettingsGroup.qml +96 -0
  351. package/ui/SettingsHint.qml +12 -0
  352. package/ui/SettingsMetrics.qml +29 -0
  353. package/ui/SettingsPane.qml +178 -0
  354. package/ui/SettingsPanel.qml +547 -0
  355. package/ui/SettingsRail.qml +128 -0
  356. package/ui/SettingsRow.qml +409 -0
  357. package/ui/SettingsRuler.qml +85 -0
  358. package/ui/SettingsSegment.qml +85 -0
  359. package/ui/ShareBrowser.qml +113 -0
  360. package/ui/ShareLink.qml +67 -0
  361. package/ui/ShelfPins.qml +101 -0
  362. package/ui/Sidebar.qml +728 -0
  363. package/ui/SidebarRow.qml +358 -0
  364. package/ui/Spinner.qml +60 -0
  365. package/ui/StableModel.qml +89 -0
  366. package/ui/StateMessage.qml +84 -0
  367. package/ui/StatusBar.qml +512 -0
  368. package/ui/StatusFileName.qml +27 -0
  369. package/ui/TabBar.qml +673 -0
  370. package/ui/TabDragGeometry.qml +60 -0
  371. package/ui/TagMenuMark.qml +52 -0
  372. package/ui/TagRailSection.qml +53 -0
  373. package/ui/TagSlot.qml +40 -0
  374. package/ui/TagState.qml +150 -0
  375. package/ui/TagSwatch.qml +28 -0
  376. package/ui/Taildrop.qml +86 -0
  377. package/ui/TailscaleMark.qml +50 -0
  378. package/ui/TerminalService.qml +69 -0
  379. package/ui/TerminalTab.qml +48 -0
  380. package/ui/TerminalTabs.qml +27 -0
  381. package/ui/Theme.qml +460 -0
  382. package/ui/ThemeColors.qml +43 -0
  383. package/ui/TransferCard.qml +239 -0
  384. package/ui/TrashConfirm.qml +129 -0
  385. package/ui/TrashDropHandler.qml +11 -0
  386. package/ui/TrashHost.qml +202 -0
  387. package/ui/TrashMonitor.qml +30 -0
  388. package/ui/TrashToolbar.qml +19 -0
  389. package/ui/TrashView.qml +492 -0
  390. package/ui/UnlockDialog.qml +450 -0
  391. package/ui/UnlockHost.qml +206 -0
  392. package/ui/UpdateCheck.qml +97 -0
  393. package/ui/UserDirs.qml +25 -0
  394. package/ui/ViewState.qml +565 -0
  395. package/ui/ViewportScrollBar.qml +195 -0
  396. package/ui/ViewportScrollBars.qml +25 -0
  397. package/ui/WebPreview.qml +33 -0
  398. package/ui/WebPreviewView.qml +26 -0
  399. package/ui/WindowBody.qml +829 -0
  400. package/ui/WindowDrag.qml +35 -0
  401. package/ui/boot/Commons/AudioNodes.qml +50 -0
  402. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  403. package/ui/boot/Commons/Border.qml +243 -0
  404. package/ui/boot/Commons/BorderGeometry.js +373 -0
  405. package/ui/boot/Commons/Color.qml +258 -0
  406. package/ui/boot/Commons/I18n.qml +118 -0
  407. package/ui/boot/Commons/InputDevices.qml +112 -0
  408. package/ui/boot/Commons/InputMethodState.qml +38 -0
  409. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  410. package/ui/boot/Commons/Numbers.js +19 -0
  411. package/ui/boot/Commons/Plural.js +91 -0
  412. package/ui/boot/Commons/ShellIpc.qml +12 -0
  413. package/ui/boot/Commons/Style.qml +561 -0
  414. package/ui/boot/Commons/Translations.qml +100 -0
  415. package/ui/boot/Commons/UntypedInput.qml +152 -0
  416. package/ui/boot/Commons/Util.qml +188 -0
  417. package/ui/boot/Commons/qmldir +13 -0
  418. package/ui/boot/LICENSE-omarchy +20 -0
  419. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  420. package/ui/boot/Ui/BarIconButton.qml +106 -0
  421. package/ui/boot/Ui/BarIconContent.qml +38 -0
  422. package/ui/boot/Ui/BarIndicator.qml +53 -0
  423. package/ui/boot/Ui/BarWidget.qml +50 -0
  424. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  425. package/ui/boot/Ui/BorderSurface.qml +40 -0
  426. package/ui/boot/Ui/Button.qml +224 -0
  427. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  428. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  429. package/ui/boot/Ui/CursorSurface.qml +42 -0
  430. package/ui/boot/Ui/Dropdown.qml +245 -0
  431. package/ui/boot/Ui/FilterInput.qml +26 -0
  432. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  433. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  434. package/ui/boot/Ui/MultiSelect.qml +624 -0
  435. package/ui/boot/Ui/NumberField.qml +86 -0
  436. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  437. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  438. package/ui/boot/Ui/Panel.qml +60 -0
  439. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  440. package/ui/boot/Ui/PanelController.qml +16 -0
  441. package/ui/boot/Ui/PanelHero.qml +112 -0
  442. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  443. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  444. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  445. package/ui/boot/Ui/PanelSlider.qml +156 -0
  446. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  447. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  448. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  449. package/ui/boot/Ui/PopupCard.qml +181 -0
  450. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  451. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  452. package/ui/boot/Ui/SizedImage.qml +125 -0
  453. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  454. package/ui/boot/Ui/TextField.qml +58 -0
  455. package/ui/boot/Ui/Toggle.qml +118 -0
  456. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  457. package/ui/boot/Ui/WidgetButton.qml +172 -0
  458. package/ui/boot/Ui/qmldir +41 -0
  459. package/ui/boot/fleatab.qml +50 -0
  460. package/ui/boot/picker.qml +39 -0
  461. package/ui/boot/shell.qml +131 -0
  462. package/ui/boot/tabtearoff.qml +51 -0
  463. package/ui/js/Anchor.js +379 -0
  464. package/ui/js/AnchorHold.js +162 -0
  465. package/ui/js/Archive.js +157 -0
  466. package/ui/js/ArchiveCard.js +44 -0
  467. package/ui/js/ArchiveOps.js +44 -0
  468. package/ui/js/BackReturn.js +118 -0
  469. package/ui/js/BulkRename.js +100 -0
  470. package/ui/js/Buttons.js +54 -0
  471. package/ui/js/ChromeKeys.js +116 -0
  472. package/ui/js/ClipMarks.js +73 -0
  473. package/ui/js/ClipSelection.js +67 -0
  474. package/ui/js/Clipboard.js +179 -0
  475. package/ui/js/Cloud.js +97 -0
  476. package/ui/js/CodeRuns.js +72 -0
  477. package/ui/js/Collide.js +212 -0
  478. package/ui/js/ColumnFit.js +28 -0
  479. package/ui/js/ColumnMenu.js +111 -0
  480. package/ui/js/Columns.js +298 -0
  481. package/ui/js/ColumnsCarry.js +103 -0
  482. package/ui/js/Compare.js +74 -0
  483. package/ui/js/Contrast.js +157 -0
  484. package/ui/js/ControlReader.js +42 -0
  485. package/ui/js/Convert.js +52 -0
  486. package/ui/js/CopyAs.js +52 -0
  487. package/ui/js/Crumbs.js +178 -0
  488. package/ui/js/Csv.js +231 -0
  489. package/ui/js/Density.js +44 -0
  490. package/ui/js/Devices.js +440 -0
  491. package/ui/js/DirSizes.js +180 -0
  492. package/ui/js/Drag.js +360 -0
  493. package/ui/js/DragOut.js +166 -0
  494. package/ui/js/DropDev.js +52 -0
  495. package/ui/js/Dropbox.js +41 -0
  496. package/ui/js/Eject.js +217 -0
  497. package/ui/js/Errors.js +188 -0
  498. package/ui/js/ExtThumbs.js +115 -0
  499. package/ui/js/Facts.js +402 -0
  500. package/ui/js/FigureDate.js +14 -0
  501. package/ui/js/Filter.js +285 -0
  502. package/ui/js/Find.js +46 -0
  503. package/ui/js/Flash.js +184 -0
  504. package/ui/js/FlashCard.js +79 -0
  505. package/ui/js/FlashEndings.js +125 -0
  506. package/ui/js/FlashPane.js +116 -0
  507. package/ui/js/FleaBin.js +12 -0
  508. package/ui/js/Focus.js +504 -0
  509. package/ui/js/FolderSorts.js +108 -0
  510. package/ui/js/FolderViews.js +44 -0
  511. package/ui/js/Format.js +314 -0
  512. package/ui/js/Fuzzy.js +141 -0
  513. package/ui/js/GlassTag.js +72 -0
  514. package/ui/js/Grid.js +33 -0
  515. package/ui/js/GridGeometry.js +90 -0
  516. package/ui/js/GridNames.js +153 -0
  517. package/ui/js/GvfsBridge.js +200 -0
  518. package/ui/js/HostClipboard.js +29 -0
  519. package/ui/js/Icons.js +218 -0
  520. package/ui/js/Input.js +50 -0
  521. package/ui/js/Jump.js +200 -0
  522. package/ui/js/KeyName.js +64 -0
  523. package/ui/js/Keymap.js +401 -0
  524. package/ui/js/Kinds.js +164 -0
  525. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  526. package/ui/js/LangMarkPaths.js +47 -0
  527. package/ui/js/LangMarks.js +120 -0
  528. package/ui/js/Lists.js +11 -0
  529. package/ui/js/LocalSend.js +39 -0
  530. package/ui/js/LockedMenu.js +63 -0
  531. package/ui/js/MakeDefault.js +186 -0
  532. package/ui/js/MarkBox.js +7 -0
  533. package/ui/js/Markdown.js +119 -0
  534. package/ui/js/MarkdownLists.js +86 -0
  535. package/ui/js/MarkdownMaths.js +58 -0
  536. package/ui/js/MarkdownPictures.js +32 -0
  537. package/ui/js/MarkdownPrepared.js +139 -0
  538. package/ui/js/MarkdownTableFit.js +34 -0
  539. package/ui/js/Marks.js +148 -0
  540. package/ui/js/Marquee.js +96 -0
  541. package/ui/js/Match.js +93 -0
  542. package/ui/js/Material.js +109 -0
  543. package/ui/js/MdBlocks.js +437 -0
  544. package/ui/js/MdBreak.js +71 -0
  545. package/ui/js/MdChunks.js +70 -0
  546. package/ui/js/MdContainer.js +137 -0
  547. package/ui/js/MdDocument.js +337 -0
  548. package/ui/js/MdEmph.js +97 -0
  549. package/ui/js/MdEntity.js +108 -0
  550. package/ui/js/MdEntityTable.js +223 -0
  551. package/ui/js/MdEscape.js +59 -0
  552. package/ui/js/MdFront.js +37 -0
  553. package/ui/js/MdHold.js +32 -0
  554. package/ui/js/MdHtml.js +307 -0
  555. package/ui/js/MdHtmlBlock.js +290 -0
  556. package/ui/js/MdHtmlHeading.js +53 -0
  557. package/ui/js/MdHtmlImage.js +179 -0
  558. package/ui/js/MdInline.js +154 -0
  559. package/ui/js/MdItems.js +212 -0
  560. package/ui/js/MdLeaf.js +309 -0
  561. package/ui/js/MdLink.js +196 -0
  562. package/ui/js/MdMath.js +67 -0
  563. package/ui/js/MdParagraphs.js +138 -0
  564. package/ui/js/MdRefs.js +232 -0
  565. package/ui/js/MdResolve.js +226 -0
  566. package/ui/js/MdRun.js +300 -0
  567. package/ui/js/MdUrl.js +226 -0
  568. package/ui/js/Menu.js +514 -0
  569. package/ui/js/MenuContext.js +85 -0
  570. package/ui/js/MenuFit.js +13 -0
  571. package/ui/js/MenuRefresh.js +74 -0
  572. package/ui/js/MenuWheel.js +35 -0
  573. package/ui/js/Messages.js +186 -0
  574. package/ui/js/Motion.js +16 -0
  575. package/ui/js/Mounts.js +320 -0
  576. package/ui/js/MouseNav.js +13 -0
  577. package/ui/js/Nav.js +329 -0
  578. package/ui/js/NetFs.js +26 -0
  579. package/ui/js/OpenWith.js +83 -0
  580. package/ui/js/Ops.js +585 -0
  581. package/ui/js/Palette.js +33 -0
  582. package/ui/js/PathBar.js +260 -0
  583. package/ui/js/Permissions.js +179 -0
  584. package/ui/js/Phones.js +112 -0
  585. package/ui/js/Picker.js +353 -0
  586. package/ui/js/PlaceMenu.js +96 -0
  587. package/ui/js/Places.js +265 -0
  588. package/ui/js/PreviewAsk.js +21 -0
  589. package/ui/js/PreviewKeys.js +155 -0
  590. package/ui/js/PreviewSettle.js +29 -0
  591. package/ui/js/PreviewSwap.js +101 -0
  592. package/ui/js/PropertyFacts.js +144 -0
  593. package/ui/js/Protocols.js +296 -0
  594. package/ui/js/QuickLookKinds.js +27 -0
  595. package/ui/js/QuickLookRect.js +24 -0
  596. package/ui/js/RailDrop.js +51 -0
  597. package/ui/js/RailKeys.js +87 -0
  598. package/ui/js/RailMenu.js +133 -0
  599. package/ui/js/Recent.js +135 -0
  600. package/ui/js/RecentMode.js +156 -0
  601. package/ui/js/Reload.js +60 -0
  602. package/ui/js/Renderer.js +9 -0
  603. package/ui/js/RunFile.js +143 -0
  604. package/ui/js/Scripts.js +28 -0
  605. package/ui/js/Scroll.js +304 -0
  606. package/ui/js/ScrollOff.js +69 -0
  607. package/ui/js/Search.js +478 -0
  608. package/ui/js/Selection.js +97 -0
  609. package/ui/js/Settings.js +476 -0
  610. package/ui/js/SettingsAbout.js +97 -0
  611. package/ui/js/SettingsShelf.js +52 -0
  612. package/ui/js/SheetKeys.js +42 -0
  613. package/ui/js/SheetQuery.js +281 -0
  614. package/ui/js/ShelfPile.js +27 -0
  615. package/ui/js/SlowClick.js +53 -0
  616. package/ui/js/SlowOp.js +6 -0
  617. package/ui/js/Sort.js +134 -0
  618. package/ui/js/Startup.js +63 -0
  619. package/ui/js/StateWords.js +17 -0
  620. package/ui/js/Status.js +238 -0
  621. package/ui/js/Swap.js +166 -0
  622. package/ui/js/TabMove.js +39 -0
  623. package/ui/js/Tabs.js +751 -0
  624. package/ui/js/Tags.js +134 -0
  625. package/ui/js/Taildrop.js +128 -0
  626. package/ui/js/Tap.js +180 -0
  627. package/ui/js/TextSize.js +107 -0
  628. package/ui/js/Thumbs.js +158 -0
  629. package/ui/js/Transfer.js +172 -0
  630. package/ui/js/Trash.js +84 -0
  631. package/ui/js/TrashDates.js +47 -0
  632. package/ui/js/TrashDrop.js +64 -0
  633. package/ui/js/UiState.js +438 -0
  634. package/ui/js/Unlock.js +152 -0
  635. package/ui/js/Update.js +130 -0
  636. package/ui/js/UserDirs.js +56 -0
  637. package/ui/qmldir +230 -0
@@ -0,0 +1,179 @@
1
+ .pragma library
2
+
3
+ // MdHtmlImage: a raw HTML image on its own line, alone or inside a centring paragraph, as an image block.
4
+ .import "MdUrl.js" as MdUrl
5
+ .import "MdHtml.js" as MdHtml
6
+
7
+ // Sample input: '<p align="center"><a href="https://x"><img src="a.png"></a></p>' splits into wrapper, link, image, link end and closer.
8
+ var IMAGE_LINE = /^(<(?:p|div)\b[^<>]*>)?\s*(<a\b[^<>]*>)?\s*(<img\b[^<>]*>)\s*(<\/a>)?\s*(<\/(?:p|div)>)?$/i
9
+ // Sample input: '<div align="center">' and '<p>' open a wrapper; '<div>text' and '<span>' do not.
10
+ var WRAPPER_OPEN = /^<(?:p|div)\b[^<>]*>$/i
11
+ // Sample input: '</div>' and '</P>' close a wrapper and answer its tag name; '</div> text' does not.
12
+ var WRAPPER_CLOSE = /^<\/(p|div)>$/i
13
+ // Sample input: '<div class="x">' and '</div>' in a line each count once for div, with the slash captured; '<divider>' counts for none.
14
+ var WRAPPER_NESTING = { p: /<(\/?)p(?=[\s>\/])[^<>]*>/gi, div: /<(\/?)div(?=[\s>\/])[^<>]*>/gi }
15
+ // Sample input: '<p>text <img src="b.png"></p>' holds a second image; '<p>text</p>' and '<imgs>' hold none.
16
+ var SECOND_IMAGE = /<img\b/i
17
+ // Sample input: "<br>" or "<br />" at the start of a line; the image above it already ends its line.
18
+ var LEADING_BREAK = /^\s*(?:<br\s*\/?>\s*)+/i
19
+ // Sample input: " 64", "64px" and "64 " are sizes; "50%", "6.4" and "abc" are not.
20
+ var WIDTH_VALUE = /^\s*(\d{1,4})(?:px)?\s*$/i
21
+
22
+ // Sample input: '<p align="center">' is centred; '<p>' and '<div align="left">' are not.
23
+ function isCentred(open) {
24
+ var attributes = MdHtml.tagHead(open).attributes
25
+ for (var i = 0; i < attributes.length; i++) {
26
+ if (attributes[i].name === "align")
27
+ return attributes[i].value !== null && attributes[i].value.toLowerCase() === "center"
28
+ }
29
+ return false
30
+ }
31
+
32
+ // Sample input: '<img src="a.png" width="64" height="20" alt="x">' answers an image block with its width and height; null when the tag draws nothing.
33
+ function rawImage(text, dir) {
34
+ var tag = MdHtml.readTag(text, 0)
35
+ if (tag === null)
36
+ return null
37
+ var head = MdHtml.tagHead(tag.tag)
38
+ if (head.name !== "img" || head.closing || !head.validAttrs)
39
+ return null
40
+ // First attributes win even when their values are empty or absent.
41
+ var src = null
42
+ var alt = null
43
+ var width = null
44
+ var height = null
45
+ for (var a = 0; a < head.attributes.length; a++) {
46
+ var attr = head.attributes[a]
47
+ var value = attr.value === null ? "" : attr.value
48
+ if (attr.name === "src" && src === null)
49
+ src = value
50
+ if (attr.name === "alt" && alt === null)
51
+ alt = value
52
+ if (attr.name === "width" && width === null)
53
+ width = value
54
+ if (attr.name === "height" && height === null)
55
+ height = value
56
+ }
57
+ var cls = MdUrl.classifyImage(src === null ? "" : src, dir)
58
+ if (cls.kind === "remote")
59
+ return { type: "remote", host: cls.host }
60
+ if (cls.kind !== "local")
61
+ return null
62
+ var block = { type: "image", url: cls.url, alt: alt === null ? "" : alt }
63
+ var sized = width === null ? null : WIDTH_VALUE.exec(width)
64
+ if (sized !== null && Number(sized[1]) > 0)
65
+ block.width = Number(sized[1])
66
+ var tall = height === null ? null : WIDTH_VALUE.exec(height)
67
+ if (tall !== null && Number(tall[1]) > 0)
68
+ block.height = Number(tall[1])
69
+ return block
70
+ }
71
+
72
+ // Sample input: { width: 120 } on a 40x30 picture in a 500 pane answers { w: 120, h: 90, stretch: false }; { width: 70, height: 20 } answers { w: 70, h: 20, stretch: true }.
73
+ // One size rule for a lone picture and a row: a width or height attribute is honoured past the natural size, both name the box, none keeps the natural size; the pane width caps it, the ratio kept.
74
+ function pictureSize(spec, naturalW, naturalH, limit) {
75
+ var w = spec.width > 0 ? spec.width : 0
76
+ var h = spec.height > 0 ? spec.height : 0
77
+ var stretch = w > 0 && h > 0
78
+ if (w === 0 && h === 0) {
79
+ w = naturalW
80
+ h = naturalH
81
+ } else if (h === 0) {
82
+ h = naturalW > 0 ? w * naturalH / naturalW : 0
83
+ } else if (w === 0) {
84
+ w = naturalH > 0 ? h * naturalW / naturalH : 0
85
+ }
86
+ if (w > limit && w > 0) {
87
+ h = h * limit / w
88
+ w = limit
89
+ }
90
+ return { w: w, h: h, stretch: stretch }
91
+ }
92
+
93
+ // Sample input: '<a href="https://x/y">' answers "https://x/y"; a javascript: or relative target answers null.
94
+ function linkOf(open) {
95
+ var attributes = MdHtml.tagHead(open).attributes
96
+ for (var i = 0; i < attributes.length; i++) {
97
+ if (attributes[i].name === "href" && attributes[i].value !== null) {
98
+ var url = MdHtml.normalizedTarget(MdUrl.canonicalUrl(attributes[i].value))
99
+ return /^(?:https?|mailto):/i.test(url) ? url : null
100
+ }
101
+ }
102
+ return null
103
+ }
104
+
105
+ // Sample input: lines ['<p>', 'note', '</p>', '</div>'] from 0 for "div" answer { rest: ['<p>', 'note', '</p>'], end: 3 }; a blank line or a missing closer answers null.
106
+ // The lines after a wrapper's image up to its own tag's closer, nested openers counted; a line holding another image answers null at once (the splitter draws that row whole).
107
+ function wrapperTail(lines, from, name) {
108
+ var rest = []
109
+ var depth = 1
110
+ for (var j = from; j < lines.length; j++) {
111
+ var line = lines[j].trim()
112
+ if (line === "")
113
+ return null
114
+ if (SECOND_IMAGE.test(line))
115
+ return null
116
+ var closer = WRAPPER_CLOSE.exec(line)
117
+ if (depth === 1 && closer !== null && closer[1].toLowerCase() === name)
118
+ return { rest: rest, end: j }
119
+ line.replace(WRAPPER_NESTING[name], function (tag, slash) {
120
+ depth += slash === "/" ? -1 : 1
121
+ return tag
122
+ })
123
+ // A closer sharing its line with text, or one with no opener, ends the wrapper where no unit can follow.
124
+ if (depth < 1)
125
+ return null
126
+ rest.push(line)
127
+ }
128
+ return null
129
+ }
130
+
131
+ // Sample input: lines ['<p align="center">', ' <img src="a.png">', '</p>'] at 0 answers { block, end: 2, wrapper: [] }; a line that is no image unit answers null.
132
+ // wrapper holds the opener, the lines between the image and the closer, and the closer on one line, to draw under the image; empty when none.
133
+ function imageUnit(lines, at, dir) {
134
+ var first = IMAGE_LINE.exec(lines[at].trim())
135
+ var open = null
136
+ var parts = null
137
+ var last = at
138
+ if (first !== null && first[1] !== undefined) {
139
+ open = first[1]
140
+ parts = first
141
+ } else if (first === null && WRAPPER_OPEN.test(lines[at].trim()) && at + 1 < lines.length) {
142
+ parts = IMAGE_LINE.exec(lines[at + 1].trim())
143
+ if (parts === null || parts[1] !== undefined)
144
+ return null
145
+ open = lines[at].trim()
146
+ last = at + 1
147
+ } else {
148
+ return null
149
+ }
150
+ if ((parts[2] === undefined) !== (parts[4] === undefined))
151
+ return null
152
+ var name = MdHtml.tagHead(open).name
153
+ var rest = []
154
+ if (parts[5] !== undefined) {
155
+ if (WRAPPER_CLOSE.exec(parts[5])[1].toLowerCase() !== name)
156
+ return null
157
+ } else {
158
+ var tail = wrapperTail(lines, last + 1, name)
159
+ if (tail === null)
160
+ return null
161
+ rest = tail.rest
162
+ last = tail.end
163
+ }
164
+ var block = rawImage(parts[3], dir)
165
+ if (block === null)
166
+ return null
167
+ if (isCentred(open))
168
+ block.align = "center"
169
+ if (parts[2] !== undefined && block.type === "image" && linkOf(parts[2]) !== null)
170
+ block.link = linkOf(parts[2])
171
+ if (rest.length > 0)
172
+ rest[0] = rest[0].replace(LEADING_BREAK, "")
173
+ var shown = []
174
+ for (var r = 0; r < rest.length; r++) {
175
+ if (rest[r].length > 0)
176
+ shown.push(rest[r])
177
+ }
178
+ return { block: block, end: last, wrapper: shown.length === 0 ? [] : [open + shown.join("\n") + "</" + name + ">"] }
179
+ }
@@ -0,0 +1,154 @@
1
+ .pragma library
2
+
3
+ // MdInline: single-pass scanners that never restart, so hostile input stays linear and no unresolved "![", "[" or "<" escapes.
4
+ .import "MdEscape.js" as Esc
5
+
6
+ var MAX_MATH_RUN_LENGTH = 2
7
+
8
+ function isSpace(c) {
9
+ return c === " " || c === "\t" || c === "\n" || c === "\r"
10
+ }
11
+
12
+ function isPunct(c) {
13
+ return Esc.isAsciiPunct(c.charCodeAt(0))
14
+ }
15
+
16
+ // Interval tuple: [from, to, run length, kind]; the kind is CODE_SPAN or MATH_SPAN.
17
+ var INTERVAL_STRIDE = 4
18
+ var CODE_SPAN = 0
19
+ var MATH_SPAN = 1
20
+
21
+ // Sample input: `` ` `` and `x`, or $x+1$ and $$x^2$$; code pairs before math, never across it.
22
+ function spanIntervals(text) {
23
+ var hasCode = text.indexOf("`") >= 0
24
+ if (!hasCode && text.indexOf("$") < 0)
25
+ return []
26
+ var code = hasCode ? codeIntervals(text) : []
27
+ return text.indexOf("$") >= 0 ? mergeIntervals(code, mathIntervals(text, code)) : code
28
+ }
29
+
30
+ // Sample input: ``a ` b`` and `c`; a closing run drops the openers and spans inside it, which are literal.
31
+ function codeIntervals(text) {
32
+ var out = []
33
+ var openByLen = {}
34
+ var openers = []
35
+ var i = text.indexOf("`")
36
+ while (i >= 0) {
37
+ var j = i + 1
38
+ while (text.charAt(j) === "`")
39
+ j++
40
+ var len = j - i
41
+ var open = openByLen[len]
42
+ if (open !== undefined && open !== null) {
43
+ while (out.length > 0 && out[out.length - INTERVAL_STRIDE] > open)
44
+ out.length -= INTERVAL_STRIDE
45
+ out.push(open, j, len, CODE_SPAN)
46
+ var covered = 0
47
+ do {
48
+ covered = openers.pop()
49
+ openByLen[covered] = null
50
+ } while (covered !== len)
51
+ } else {
52
+ openByLen[len] = i
53
+ openers.push(len)
54
+ }
55
+ i = text.indexOf("`", j)
56
+ }
57
+ return out
58
+ }
59
+
60
+ // Sample input: costs $5 and $10 stays prose; $x+1$ pairs; no space inside an edge, no digit after the closer, no odd backslash run before.
61
+ function mathIntervals(text, code) {
62
+ var out = []
63
+ var codeAt = 0
64
+ var i = text.indexOf("$")
65
+ var open = -1
66
+ var openLen = 0
67
+ while (i >= 0) {
68
+ while (codeAt < code.length && code[codeAt + 1] <= i) {
69
+ open = code[codeAt] > open ? -1 : open
70
+ codeAt += INTERVAL_STRIDE
71
+ }
72
+ if (codeAt < code.length && code[codeAt] < i) {
73
+ open = -1
74
+ i = text.indexOf("$", code[codeAt + 1])
75
+ continue
76
+ }
77
+ var j = i + 1
78
+ while (text.charAt(j) === "$")
79
+ j++
80
+ var len = j - i
81
+ var back = 0
82
+ for (var b = i - 1; b >= 0 && text.charAt(b) === "\\"; b--)
83
+ back++
84
+ if (len <= MAX_MATH_RUN_LENGTH && back % 2 === 0) {
85
+ var after = text.charAt(j)
86
+ var canClose = i > 0 && !isSpace(text.charAt(i - 1)) && !(after >= "0" && after <= "9")
87
+ if (open >= 0 && len === openLen && canClose) {
88
+ out.push(open, j, openLen, MATH_SPAN)
89
+ open = -1
90
+ } else if (j < text.length && !isSpace(text.charAt(j))) {
91
+ open = i
92
+ openLen = len
93
+ }
94
+ }
95
+ i = text.indexOf("$", j)
96
+ }
97
+ return out
98
+ }
99
+
100
+ // Merge two from-ordered tuple lists in one pass; code and math never share a start.
101
+ function mergeIntervals(a, b) {
102
+ var out = []
103
+ var ai = 0
104
+ var bi = 0
105
+ while (ai < a.length || bi < b.length) {
106
+ var fromA = bi >= b.length || (ai < a.length && a[ai] < b[bi])
107
+ var src = fromA ? a : b
108
+ var at = fromA ? ai : bi
109
+ out.push(src[at], src[at + 1], src[at + 2], src[at + 3])
110
+ ai += fromA ? INTERVAL_STRIDE : 0
111
+ bi += fromA ? 0 : INTERVAL_STRIDE
112
+ }
113
+ return out
114
+ }
115
+
116
+ // An inline code span as styled HTML, content escaped; math keeps its kind tag for the later figure unit.
117
+ function codeHtml(content, chrome, kind) {
118
+ if (!/^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(chrome || "")))
119
+ return null
120
+ var tag = kind === "math" ? '<code data-math="inline" style="background-color:' + chrome + '">'
121
+ : '<code style="background-color:' + chrome + '">'
122
+ return tag + Esc.chipPad() + escapeHtmlText(content) + Esc.chipPad() + "</code>"
123
+ }
124
+
125
+ function escapeHtmlText(content) {
126
+ return Esc.escapeText(content)
127
+ }
128
+
129
+ // Sample input: "1. ol" answers "&#49;&#46; ol", so a decoded "&#49;. ol" never reaches Qt as an ordered list marker; "a<b" answers "a&#60;b".
130
+ var ASCII_DIGIT_SPLIT = /([0-9])/
131
+
132
+ // Text a character reference decoded to: punctuation and digits as numeric entities, so no marker, fence or rule forms at a line start.
133
+ function escapeDecodedText(content) {
134
+ var parts = String(content).split(ASCII_DIGIT_SPLIT)
135
+ for (var i = 0; i < parts.length; i++)
136
+ parts[i] = i % 2 === 1 ? "&#" + parts[i].charCodeAt(0) + ";" : escapeHtmlText(parts[i])
137
+ return parts.join("")
138
+ }
139
+
140
+ // The tags a link wears: the importer hardcodes its link blue, but a font tag inside the anchor survives it; null when the ink is no colour.
141
+ function linkInk(ink) {
142
+ if (!/^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(ink || "")))
143
+ return null
144
+ return { open: '<font color="' + ink + '">', close: "</font>" }
145
+ }
146
+
147
+ // A link as an anchor wrapping its label in the ink.
148
+ function linkHtml(label, url, ink, markup) {
149
+ var wear = linkInk(ink)
150
+ if (wear === null)
151
+ return null
152
+ var safe = String(url).replace(/&/g, "&#38;").replace(/"/g, "&#34;")
153
+ return '<a href="' + safe + '">' + wear.open + (markup === true ? label : escapeHtmlText(label)) + wear.close + "</a>"
154
+ }
@@ -0,0 +1,212 @@
1
+ .pragma library
2
+
3
+ .import "MdLeaf.js" as Leaf
4
+
5
+ // MdItems: one top-level list as flat entries (depth, marker, loose flag per list), and the quote and list blocks built from them.
6
+ var BULLET = "•"
7
+
8
+ // Sample input: "fenceBody" and "codeLine" are lines inside a fence or an indented block; "run" is prose.
9
+ function isRaw(kind) {
10
+ return kind === "fenceOpen" || kind === "fenceBody" || kind === "fenceClose" || kind === "codeLine"
11
+ }
12
+
13
+ // Sample input: item "a" holding a nested list "b" answers entries a (depth 0, marker bullet) and b (depth 1).
14
+ function builder() {
15
+ var entries = []
16
+ // levels[d] is the list now open at depth d: its parent item, its kind, its item count and whether a blank line loosened it.
17
+ var levels = []
18
+ var heads = {}
19
+ var cur = null
20
+ var blank = false
21
+
22
+ function sibling(depth, chain) {
23
+ var lv = depth < levels.length ? levels[depth] : null
24
+ return lv !== null && lv.mark === chain[depth].mark
25
+ }
26
+
27
+ function open(chain, depth) {
28
+ var frame = chain[depth]
29
+ var lv = sibling(depth, chain) ? levels[depth] : null
30
+ if (lv !== null) {
31
+ lv.count++
32
+ } else {
33
+ lv = { mark: frame.mark, start: frame.start, count: 0, loose: false }
34
+ levels[depth] = lv
35
+ }
36
+ levels.length = depth + 1
37
+ var entry = { depth: depth, lines: [], list: lv, frameId: frame.id, content: 0,
38
+ marker: frame.ordered ? (lv.start + lv.count) + "." : BULLET }
39
+ entries.push(entry)
40
+ heads[frame.id] = entry
41
+ return entry
42
+ }
43
+
44
+ // A blank line before a new item loosens the list the item joins, or the list whose item it nests in.
45
+ function loosenOpened(chain, depth) {
46
+ if (sibling(depth, chain))
47
+ levels[depth].loose = true
48
+ else if (depth > 0)
49
+ levels[depth - 1].loose = true
50
+ }
51
+
52
+ function add(event, text) {
53
+ var chain = event.chain
54
+ var lead = event.lead
55
+ var line = { text: text, index: event.index, raw: isRaw(event.kind) }
56
+ var last = lead.n - 1
57
+ var from = Math.min(lead.retained, lead.n)
58
+ // A blank line opens no item; "-" alone opens an empty one.
59
+ if (event.kind === "run" && text.trim().length === 0 && from > last) {
60
+ blank = true
61
+ if (cur !== null)
62
+ cur.lines.push(line)
63
+ return
64
+ }
65
+ if (from <= last) {
66
+ if (blank)
67
+ loosenOpened(chain, from)
68
+ for (var depth = from; depth <= last; depth++)
69
+ cur = open(chain, depth)
70
+ } else {
71
+ var head = heads[chain[last].id]
72
+ if (cur.frameId !== head.frameId) {
73
+ levels.length = last + 1
74
+ cur = { depth: last, lines: [], list: head.list, frameId: head.frameId, content: 0, marker: "" }
75
+ entries.push(cur)
76
+ if (blank)
77
+ head.list.loose = true
78
+ } else if (blank && cur.content > 0) {
79
+ cur.list.loose = true
80
+ }
81
+ }
82
+ blank = false
83
+ cur.content++
84
+ cur.lines.push(line)
85
+ }
86
+
87
+ return { add: add, entries: entries }
88
+ }
89
+
90
+ // The text of the lines that draw; kept.raw[k] marks a code line, which the renderer reads as code and the inline pass never sees.
91
+ function visibleLines(lines, state) {
92
+ var kept = []
93
+ kept.raw = []
94
+ for (var i = 0; i < lines.length; i++) {
95
+ var line = lines[i]
96
+ if (state.hidden.hasOwnProperty(line.index))
97
+ continue
98
+ var text = line.text
99
+ if (state.escaped.hasOwnProperty(line.index)) {
100
+ var at = text.indexOf("[")
101
+ text = text.slice(0, at) + "\\[" + text.slice(at + 1)
102
+ }
103
+ kept.push(text)
104
+ kept.raw.push(line.raw === true)
105
+ }
106
+ return kept
107
+ }
108
+
109
+ // Prose goes through the inline pass; a fence or indented code in an item or quote stays verbatim for the renderer.
110
+ function inlineLines(kept, inlineOf) {
111
+ var parts = []
112
+ var prose = []
113
+ for (var k = 0; k <= kept.length; k++) {
114
+ if (k < kept.length && !kept.raw[k]) {
115
+ prose.push(kept[k])
116
+ continue
117
+ }
118
+ if (prose.length > 0)
119
+ parts.push(inlineOf(prose.join("\n")))
120
+ prose = []
121
+ if (k < kept.length)
122
+ parts.push(kept[k])
123
+ }
124
+ return parts.join("\n")
125
+ }
126
+
127
+ // Sample input: lines "a" and "```" answer parts, prose alone answers its one text, and nothing to draw answers an empty text.
128
+ function content(lines, inlineOf, partsOf) {
129
+ if (lines.join("\n").trim().length === 0)
130
+ return { text: "" }
131
+ var parts = partsOf(lines)
132
+ if (parts === null)
133
+ return { text: inlineLines(lines, inlineOf) }
134
+ if (parts.length === 0)
135
+ return { text: "" }
136
+ if (parts.length === 1 && parts[0].type === "run" && parts[0].maths === undefined)
137
+ return { text: parts[0].text }
138
+ return { text: "", parts: parts }
139
+ }
140
+
141
+ // One quote block per run of lines at one nesting depth; the depth shows past the first level, joined after the first block.
142
+ function quoteBlocks(all, state, inlineOf, partsOf) {
143
+ var out = []
144
+ for (var at = 0; at < all.length; ) {
145
+ var to = at
146
+ while (to < all.length && all[to].depth === all[at].depth)
147
+ to++
148
+ var quote = visibleLines(all.slice(at, to), state)
149
+ // A quote with nothing to draw is still a block: a browser gives it its margin.
150
+ var title = at === 0 && quote.length > 0 && !quote.raw[0] ? Leaf.alertTitle(quote[0]) : null
151
+ if (title !== null)
152
+ quote[0] = title
153
+ var held = content(quote, inlineOf, partsOf)
154
+ var block = { type: "quote", text: held.text }
155
+ if (held.parts !== undefined)
156
+ block.parts = held.parts
157
+ if (all[at].depth > 1)
158
+ block.depth = all[at].depth
159
+ if (at > 0)
160
+ block.joined = true
161
+ out.push(block)
162
+ at = to
163
+ }
164
+ return out
165
+ }
166
+
167
+ // One list as a block; depths, markers and gaps only when nesting or looseness needs them, parts when an item holds more than prose.
168
+ function listBlock(event, state, inlineOf, partsOf) {
169
+ var items = []
170
+ var depths = []
171
+ var markers = []
172
+ var gaps = []
173
+ var parts = []
174
+ var nested = false
175
+ var loose = false
176
+ var holds = false
177
+ var entries = event.builder.entries
178
+ for (var k = 0; k < entries.length; k++) {
179
+ var entry = entries[k]
180
+ // An item that opens on a blank line starts at its first line of text.
181
+ var first = 0
182
+ while (first < entry.lines.length - 1 && entry.lines[first].text.trim().length === 0)
183
+ first++
184
+ var lines = visibleLines(entry.lines.slice(first), state)
185
+ while (lines.length > 0 && lines[lines.length - 1].trim().length === 0)
186
+ lines.pop()
187
+ if (entry.marker !== "" && lines.length > 0 && !lines.raw[0])
188
+ lines[0] = Leaf.taskText(lines[0])
189
+ var gap = entry.list.loose
190
+ nested = nested || entry.depth > 0 || entry.marker === ""
191
+ loose = loose || gap
192
+ var held = content(lines, inlineOf, partsOf)
193
+ held.text = Leaf.pinTaskBox(held.text)
194
+ if (held.parts !== undefined && held.parts[0].type === "run")
195
+ held.parts[0].text = Leaf.pinTaskBox(held.parts[0].text)
196
+ holds = holds || held.parts !== undefined
197
+ items.push(held.text)
198
+ parts.push(held.parts !== undefined ? held.parts : null)
199
+ depths.push(entry.depth)
200
+ markers.push(entry.marker)
201
+ gaps.push(gap)
202
+ }
203
+ var block = { type: "list", ordered: event.ordered, start: event.start, items: items }
204
+ if (nested || loose) {
205
+ block.depths = depths
206
+ block.markers = markers
207
+ block.gaps = gaps
208
+ }
209
+ if (holds)
210
+ block.parts = parts
211
+ return block
212
+ }