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
package/ui/js/MdRun.js ADDED
@@ -0,0 +1,300 @@
1
+ .pragma library
2
+
3
+ // MdRun: hold code/math, then resolve links, images and HTML in one forward scan; links deactivate earlier link openers, while image openers stay active.
4
+ .import "MdUrl.js" as MdUrl
5
+ .import "MdHtml.js" as MdHtml
6
+ .import "MdInline.js" as Md
7
+ .import "MdRefs.js" as Refs
8
+ .import "MdResolve.js" as Res
9
+ .import "MdEmph.js" as Emph
10
+ .import "MdBreak.js" as Brk
11
+ .import "MdEntity.js" as Ent
12
+ .import "MdHold.js" as Hold
13
+
14
+ var hasOwn = Object.prototype.hasOwnProperty
15
+ // The work gate replaces this no-op to count each frame visited.
16
+ var countFrameStep = function () {}
17
+
18
+ // The driver: held spans first, then one forward scan; bareText says no container holds the text (its ">" is never a quote mark); fragment says the text starts and ends mid-line (an image's alt text).
19
+ function parseInline(text, dir, defs, numbers, chrome, ink, tokens, cited, literalPlain, bareText, fragment) {
20
+ var body = MdHtml.documentText(text)
21
+ // Plain prose returns directly; plain table cells use the bulk escaper before any markup is emitted.
22
+ if (!/[`$[\]<>\\!*_]| {2}\n|https?:\/\/|www\./.test(body)
23
+ && (literalPlain ? !/[*_~]|&(?:#(?:[0-9]+|[xX][0-9a-fA-F]+)|[A-Za-z][A-Za-z0-9]*);/.test(body) : !/&[#A-Za-z]/.test(body)))
24
+ return literalPlain ? Md.escapeHtmlText(body) : body
25
+ var spans = Md.spanIntervals(body)
26
+ var out = []
27
+ var delims = []
28
+ delims.bottom = 0
29
+ var citationTokens = {}
30
+ var frames = []
31
+ var activeLinks = []
32
+ // Without usable ink, link brackets are escaped so md4c cannot resolve unvetted targets.
33
+ var styleLinks = /^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(ink || ""))
34
+ var chromeOk = /^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(chrome || ""))
35
+ var styleCache = {}
36
+ // The span held last, so a repeat reuses its token without slicing.
37
+ var lastSpan = { start: -1, length: -1, open: -1, kind: "", ref: 0 }
38
+ // Exact dead flags: the first scan to find no "-->" or ">" ahead proves no later opener can close either, so dense hostile inputs pay once.
39
+ var dead = { tagDead: -1, commentDead: false }
40
+ // The HTML links whose opener put the ink on and are not closed yet, so each closer takes off only ink that is on.
41
+ var inked = { open: 0 }
42
+ var i = 0
43
+ var sp = 0
44
+ var lastQuote = -1
45
+ // out[0, numbered) holds no citation still to number; imageMark is where the outermost open image's alt text begins, or -1.
46
+ var numbered = 0
47
+ var imageMark = -1
48
+ var imageDepth = -1
49
+ var line = Ent.lineState(fragment !== true)
50
+
51
+ // Join strings, -1-index token references and emphasis marks; inside an emphasis tag or a label a newline is a space, which the renderer would drop.
52
+ function renderFrom(from, flat, alt) {
53
+ var parts = []
54
+ var depth = flat ? 1 : 0
55
+ for (var k = from; k < out.length; k++) {
56
+ var piece = out[k]
57
+ if (typeof piece === "string") {
58
+ parts.push(depth > 0 && piece === "\n" ? " " : piece)
59
+ continue
60
+ }
61
+ if (typeof piece === "object") {
62
+ depth -= piece.closes
63
+ parts.push(piece.before + Emph.literal(piece) + piece.after)
64
+ depth += piece.opens
65
+ continue
66
+ }
67
+ var tokenIndex = -1 - piece
68
+ if (alt === true && citationTokens.hasOwnProperty(tokenIndex)) {
69
+ parts.push("[^" + citationTokens[tokenIndex] + "]")
70
+ continue
71
+ }
72
+ if (citationTokens.hasOwnProperty(tokenIndex))
73
+ cite(tokenIndex)
74
+ parts.push(tokens[tokenIndex])
75
+ }
76
+ return parts.join("")
77
+ }
78
+
79
+ // The open brackets of a finished paragraph never pair with a later "]", so they stay literal.
80
+ function endParagraph() {
81
+ frames.length = 0
82
+ activeLinks.length = 0
83
+ imageMark = -1
84
+ }
85
+
86
+ // Number a footnote citation the first time it is read, so its superscript is the next free number.
87
+ function cite(tokenIndex) {
88
+ var id = citationTokens[tokenIndex]
89
+ if (cited !== undefined && numbers[id] === 0) {
90
+ cited.push(id)
91
+ numbers[id] = cited.length
92
+ }
93
+ tokens[tokenIndex] = "<sup>" + numbers[id] + "</sup>"
94
+ }
95
+
96
+ // Number the citations before out[limit], which a label rendered now would otherwise number ahead of; an image's alt text draws none.
97
+ function citeBefore(limit) {
98
+ var to = Math.min(limit, imageMark < 0 ? limit : imageMark)
99
+ for (; numbered < to; numbered++) {
100
+ var piece = out[numbered]
101
+ if (typeof piece === "number" && citationTokens.hasOwnProperty(-1 - piece))
102
+ cite(-1 - piece)
103
+ }
104
+ }
105
+
106
+ // The label of the bracket pair opened at out[mark], its emphasis resolved first.
107
+ function labelHtml(mark, alt) {
108
+ citeBefore(mark)
109
+ var from = delims.length
110
+ while (from > 0 && delims[from - 1].at > mark)
111
+ from--
112
+ Emph.process(delims, from)
113
+ return renderFrom(mark + 1, true, alt)
114
+ }
115
+
116
+ while (i < body.length) {
117
+ if (sp < spans.length && i === spans[sp]) {
118
+ var spanTo = spans[sp + 1]
119
+ var spanLen = spans[sp + 2]
120
+ var spanKind = spans[sp + 3] === Md.MATH_SPAN ? "math" : ""
121
+ if (!chromeOk && spanKind === "math") {
122
+ sp += Md.INTERVAL_STRIDE
123
+ continue
124
+ }
125
+ Hold.hold(body, i, spanTo, spanLen, spanKind, chromeOk ? chrome : null, styleCache, lastSpan, tokens, out)
126
+ i = spanTo
127
+ sp += Md.INTERVAL_STRIDE
128
+ continue
129
+ }
130
+ if (sp < spans.length && i > spans[sp]) {
131
+ sp += Md.INTERVAL_STRIDE
132
+ continue
133
+ }
134
+ var c = body.charAt(i)
135
+ if (c === "\\" && i + 1 < body.length && Md.isPunct(body.charAt(i + 1))) {
136
+ out.push("&#" + body.charCodeAt(i + 1) + ";")
137
+ i += 2
138
+ continue
139
+ }
140
+ if (c === "\n" || (c === "\\" && body.charAt(i + 1) === "\n")) {
141
+ i = Brk.lineBreak(body, i, out, delims, endParagraph)
142
+ continue
143
+ }
144
+ if (c === "`" || c === "$") {
145
+ out.push(c)
146
+ i++
147
+ continue
148
+ }
149
+ if ((c === "*" || c === "_") && Brk.isRuleLine(body, i)) {
150
+ var ruleEnd = body.indexOf("\n", i)
151
+ ruleEnd = ruleEnd < 0 ? body.length : ruleEnd
152
+ out.push(c + c + c)
153
+ i = ruleEnd
154
+ continue
155
+ }
156
+ if (c === "*" || c === "_") {
157
+ var mark = Emph.runAt(body, i, out.length)
158
+ delims.push(mark)
159
+ out.push(mark)
160
+ i = mark.end
161
+ continue
162
+ }
163
+ if (c === "!" && body.charAt(i + 1) === "[") {
164
+ out.push("!")
165
+ if (imageMark < 0) {
166
+ imageMark = out.length
167
+ imageDepth = frames.length
168
+ }
169
+ frames.push({ bang: true, mark: out.length, rawStart: i + 2, active: true })
170
+ out.push("&#91;")
171
+ i += 2
172
+ continue
173
+ }
174
+ if (c === "[") {
175
+ if (body.charAt(i + 1) === "^") {
176
+ var fn = Refs.readFootnoteRef(body, i)
177
+ if (fn !== null && numbers && hasOwn.call(numbers, fn.id)
178
+ && (cited !== undefined || numbers[fn.id] > 0)) {
179
+ citationTokens[tokens.length] = fn.id
180
+ tokens.push("<sup>" + numbers[fn.id] + "</sup>")
181
+ out.push(-1 - (tokens.length - 1))
182
+ i = fn.end
183
+ continue
184
+ }
185
+ out.push("&#91;")
186
+ i++
187
+ continue
188
+ }
189
+ if (!styleLinks) {
190
+ frames.push({ bang: false, mark: out.length, rawStart: i + 1,
191
+ active: false, passthrough: true })
192
+ out.push("&#91;")
193
+ i++
194
+ continue
195
+ }
196
+ var opener = { bang: false, mark: out.length, rawStart: i + 1, active: true }
197
+ frames.push(opener)
198
+ activeLinks.push(opener)
199
+ out.push("&#91;")
200
+ i++
201
+ continue
202
+ }
203
+ if (c === "]" && frames.length > 0) {
204
+ var frame = frames.pop()
205
+ countFrameStep()
206
+ if (frames.length === imageDepth)
207
+ imageMark = -1
208
+ if (!frame.bang && frame.active)
209
+ activeLinks.pop()
210
+ if (frame.passthrough) {
211
+ out.push("&#93;")
212
+ i++
213
+ continue
214
+ }
215
+ var raw = body.slice(frame.rawStart, i)
216
+ var j = i + 1
217
+ var made = null
218
+ if (frame.active) {
219
+ var found = Res.readDestination(body, j, raw, defs)
220
+ if (found !== null) {
221
+ // Emphasis inside the label pairs now, so the link or image takes the label's own markup.
222
+ made = Res.resolvePair(raw, found.url, frame.bang, dir, ink, tokens, function () {
223
+ return labelHtml(frame.mark, frame.bang)
224
+ })
225
+ j = found.end
226
+ }
227
+ if (made !== null && !frame.bang) {
228
+ while (activeLinks.length > 0) {
229
+ countFrameStep()
230
+ activeLinks.pop().active = false
231
+ }
232
+ }
233
+ }
234
+ if (made !== null) {
235
+ out.length = frame.bang ? frame.mark - 1 : frame.mark
236
+ numbered = Math.min(numbered, out.length)
237
+ while (delims.length > 0 && delims[delims.length - 1].at >= out.length)
238
+ delims.pop()
239
+ out.push(made)
240
+ Ent.lineRestart(line, out, made)
241
+ i = j
242
+ } else {
243
+ out.push("&#93;")
244
+ i++
245
+ }
246
+ continue
247
+ }
248
+ if (c === "]") {
249
+ out.push("&#93;")
250
+ i++
251
+ continue
252
+ }
253
+ if (c === "&") {
254
+ var spaces = Ent.spaceRunAt(body, i, out, Ent.lineBlank(line, out), fragment !== true)
255
+ if (spaces !== null) {
256
+ out.length -= spaces.trim
257
+ out.push(spaces.text)
258
+ i = spaces.end
259
+ continue
260
+ }
261
+ // Qt's own table is short and keeps a newline reference, so the character is decoded here.
262
+ var reference = Ent.referenceAt(body, i)
263
+ out.push(reference === null ? c : Md.escapeDecodedText(reference.text))
264
+ i = reference === null ? i + 1 : reference.end
265
+ continue
266
+ }
267
+ if (c === "<") {
268
+ i = Res.parseAngle(body, i, dir, ink, styleLinks, dead, tokens, out, chrome, inked)
269
+ continue
270
+ }
271
+ if (c === "h" || c === "w") {
272
+ var bareEnd = Res.bareAt(body, i, ink, styleLinks, tokens, out)
273
+ if (bareEnd < 0) {
274
+ out.push(c)
275
+ i++
276
+ } else {
277
+ i = bareEnd
278
+ }
279
+ continue
280
+ }
281
+ if (c === ">") {
282
+ // A mark that opens a quote inside a list item stays for the renderer; table cells never hold one.
283
+ var quoting = !literalPlain && bareText !== true && Brk.quoteMarkAt(body, i, lastQuote)
284
+ lastQuote = quoting ? i : lastQuote
285
+ out.push(quoting ? ">" : "&#62;")
286
+ i++
287
+ continue
288
+ }
289
+ // A table cell's only pipe is an unescaped "\|", so it stays cell text like the bulk escaper writes it.
290
+ if (c === "|" && literalPlain) {
291
+ out.push("&#124;")
292
+ i++
293
+ continue
294
+ }
295
+ out.push(c)
296
+ i++
297
+ }
298
+ Emph.process(delims, delims.bottom)
299
+ return renderFrom(0, false)
300
+ }
package/ui/js/MdUrl.js ADDED
@@ -0,0 +1,226 @@
1
+ .pragma library
2
+
3
+ // MdUrl: linear URL decoding and image classification, with anchored scans and lexical folder containment.
4
+ .import "Format.js" as Format
5
+ .import "MdEntity.js" as Ent
6
+
7
+ var MAX_UNICODE_SCALAR = 1114111
8
+ var PERCENT_ESCAPE_LENGTH = 3
9
+ // A target that still changes after this many decodings is refused: no real address nests that deep.
10
+ var MAX_DECODE_PASSES = 8
11
+
12
+ // An http(s) URL, or a protocol-relative one (which inherits https), loads from the network.
13
+ function isRemoteUrl(url) {
14
+ return /^(https?:)?\/\//i.test(String(url))
15
+ }
16
+
17
+ function hostOf(url) {
18
+ var rest = String(url).replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "").replace(/^\/\//, "")
19
+ var host = rest.split(/[\/?#]/)[0]
20
+ if (host.indexOf("@") >= 0)
21
+ host = host.slice(host.lastIndexOf("@") + 1)
22
+ if (host.charAt(0) === "[" && host.indexOf("]") > 0)
23
+ return host.slice(0, host.indexOf("]") + 1)
24
+ var colon = host.indexOf(":")
25
+ host = colon >= 0 ? host.slice(0, colon) : host
26
+ return host.length > 0 ? host : String(url)
27
+ }
28
+
29
+ function dirOf(path) {
30
+ var text = String(path)
31
+ var slash = text.lastIndexOf("/")
32
+ return slash >= 0 ? text.slice(0, slash) : ""
33
+ }
34
+
35
+ // The board's placeholder, in the text flow where a box cannot go: the host it refused.
36
+ function placeholder(host) {
37
+ return "Remote image not loaded \u00b7 " + host
38
+ }
39
+
40
+ // Sample input: "65583;" at index 0 (after "&#") yields U+1002F and the index after ";".
41
+ function numericRef(text, i) {
42
+ var j = i
43
+ var base = 10
44
+ if (text.charAt(j) === "x" || text.charAt(j) === "X") {
45
+ base = 16
46
+ j++
47
+ }
48
+ var start = j
49
+ while (j < text.length) {
50
+ var c = text.charCodeAt(j)
51
+ var digit = base === 16
52
+ ? (c >= 48 && c <= 57) || (c >= 65 && c <= 70) || (c >= 97 && c <= 102)
53
+ : c >= 48 && c <= 57
54
+ if (!digit)
55
+ break
56
+ j++
57
+ }
58
+ if (j === start || text.charAt(j) !== ";")
59
+ return null
60
+ var code = parseInt(text.slice(start, j), base)
61
+ if (!(code > 0) || code > MAX_UNICODE_SCALAR)
62
+ return null
63
+ return { ch: String.fromCodePoint(code), end: j + 1 }
64
+ }
65
+
66
+ // Sample input: "caf%C3%A9&#46;png" decodes to "café.png"; malformed UTF-8 percent runs stay literal.
67
+ function canonicalUrl(raw) {
68
+ var text = String(raw === undefined || raw === null ? "" : raw)
69
+ var out = ""
70
+ var i = 0
71
+ while (i < text.length) {
72
+ var c = text.charAt(i)
73
+ if (c === "&" && text.charAt(i + 1) === "#") {
74
+ var ref = numericRef(text, i + 2)
75
+ if (ref !== null) {
76
+ out += ref.ch
77
+ i = ref.end
78
+ continue
79
+ }
80
+ out += c
81
+ i++
82
+ } else if (c === "%" && i + 2 < text.length
83
+ && /[0-9a-fA-F]/.test(text.charAt(i + 1)) && /[0-9a-fA-F]/.test(text.charAt(i + 2))) {
84
+ var begin = i
85
+ do {
86
+ i += PERCENT_ESCAPE_LENGTH
87
+ } while (text.charAt(i) === "%" && /^[0-9a-fA-F]{2}$/.test(text.slice(i + 1, i + PERCENT_ESCAPE_LENGTH)))
88
+ var run = text.slice(begin, i)
89
+ try {
90
+ out += decodeURIComponent(run)
91
+ } catch (e) {
92
+ out += run
93
+ }
94
+ } else {
95
+ var code = text.charCodeAt(i)
96
+ // Spaces survive: angle destinations may legally contain them. Tabs, newlines and other controls never do.
97
+ if (code === 32 || code > 32 && code !== 127)
98
+ out += c
99
+ i++
100
+ }
101
+ }
102
+ return out
103
+ }
104
+
105
+ // Sample: /../docs clamps to /docs for absolute paths; ../pic.png is refused for relative image targets.
106
+ function normalizeSubpath(name, absolute) {
107
+ var parts = String(name).split("/")
108
+ var kept = []
109
+ for (var i = 0; i < parts.length; i++) {
110
+ var seg = parts[i]
111
+ if (seg === "" || seg === ".")
112
+ continue
113
+ if (seg === "..") {
114
+ if (kept.length === 0) {
115
+ if (!absolute)
116
+ return null
117
+ } else {
118
+ kept.pop()
119
+ }
120
+ continue
121
+ }
122
+ kept.push(seg)
123
+ }
124
+ if (kept.length === 0 && !absolute)
125
+ return null
126
+ return kept.join("/")
127
+ }
128
+
129
+ // Classify images as remote placeholders, local file URLs inside the document folder, or dropped alt text.
130
+ function classifyImage(raw, dir) {
131
+ var url = String(raw === undefined || raw === null ? "" : raw)
132
+ if (url.length === 0)
133
+ return { kind: "dropped" }
134
+ var seen = canonicalUrl(url)
135
+ if (seen.length === 0)
136
+ return { kind: "dropped" }
137
+ if (isRemoteUrl(seen))
138
+ return { kind: "remote", host: hostOf(seen) }
139
+ // data:, file: and every other scheme never reach Qt unexamined.
140
+ var scheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.exec(seen)
141
+ if (scheme !== null) {
142
+ if (/^file:/i.test(seen)) {
143
+ var fp = seen.replace(/^file:\/\//i, "").replace(/^file:/i, "")
144
+ return localAbsolute(fp, dir)
145
+ }
146
+ return { kind: "dropped" }
147
+ }
148
+ var name = seen
149
+ if (name.charAt(0) === "<" && name.charAt(name.length - 1) === ">")
150
+ name = name.slice(1, -1)
151
+ if (name.length >= 2 && name.slice(0, 2) === "./")
152
+ name = name.slice(2)
153
+ // An absolute path loads only inside the document's folder tree.
154
+ if (name.charAt(0) === "/" || name.charAt(0) === "\\") {
155
+ return localAbsolute(name, dir)
156
+ }
157
+ if (name.length === 0 || name === "." || name === ".." || name.indexOf("\\") >= 0)
158
+ return { kind: "dropped" }
159
+ var collapsed = normalizeSubpath(name)
160
+ if (collapsed === null)
161
+ return { kind: "dropped" }
162
+ return containedLocal(String(dir || "") + "/" + collapsed, dir)
163
+ }
164
+
165
+ // Sample: /docs/notes/../pic.png resolves inside /docs; /docs/../pic.png is refused.
166
+ function localAbsolute(path, dir) {
167
+ if (String(path).indexOf("\\") >= 0)
168
+ return { kind: "dropped" }
169
+ return containedLocal(path, dir)
170
+ }
171
+
172
+ // The folder may hold a backslash (legal on Linux); only the reference the document wrote may not.
173
+ function containedLocal(path, dir) {
174
+ var root = dir === "" ? "/" : String(dir)
175
+ if (root.charAt(0) !== "/" || String(path).charAt(0) !== "/")
176
+ return { kind: "dropped" }
177
+ var base = normalizeSubpath(root, true)
178
+ var collapsed = normalizeSubpath(path, true)
179
+ if (base === null || collapsed === null || (base !== "" && collapsed !== base
180
+ && collapsed.indexOf(base + "/") !== 0))
181
+ return { kind: "dropped" }
182
+ return { kind: "local", url: Format.fileUri("/" + collapsed) }
183
+ }
184
+
185
+ // First srcset candidate classifying local, or its remote flag, else null.
186
+ function srcsetPick(value, dir) {
187
+ var parts = String(value).split(",")
188
+ var remote = null
189
+ for (var i = 0; i < parts.length; i++) {
190
+ var cand = parts[i].replace(/^\s+|\s+$/g, "").split(/\s+/)[0] || ""
191
+ if (cand.length === 0)
192
+ continue
193
+ var seen = classifyImage(cand, dir)
194
+ if (seen.kind === "local")
195
+ return { kind: "local", url: seen.url }
196
+ if (seen.kind === "remote" && remote === null)
197
+ remote = seen.host
198
+ }
199
+ if (remote !== null)
200
+ return { kind: "remote", host: remote }
201
+ return null
202
+ }
203
+
204
+ // Sample input: " \thttps://a.example/x\n " strips URL padding and embedded tab, CR and LF.
205
+ function strippedTarget(value) {
206
+ return String(value).replace(/^[\x00-\x20]+|[\x00-\x20]+$/g, "").replace(/[\t\r\n]/g, "")
207
+ }
208
+
209
+ // Sample input: "java&Tab;script:x" and "&amp;#106;avascript:x" are refused, "https://a.example/?a=1&amp;b=2" and "./x.md" pass.
210
+ function targetAllowed(url) {
211
+ var seen = String(url)
212
+ for (var pass = 0; pass <= MAX_DECODE_PASSES; pass++) {
213
+ var shown = strippedTarget(canonicalUrl(seen))
214
+ var m = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.exec(shown)
215
+ if (m !== null) {
216
+ var scheme = m[0].toLowerCase()
217
+ if (scheme !== "http:" && scheme !== "https:" && scheme !== "mailto:")
218
+ return false
219
+ }
220
+ var next = Ent.decodeReferences(shown)
221
+ if (next === seen || next === shown)
222
+ return true
223
+ seen = next
224
+ }
225
+ return false
226
+ }