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.
- package/LICENSE +22 -0
- package/README.md +511 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/demos/App.java +5 -0
- package/demos/Dockerfile +4 -0
- package/demos/Main.kt +3 -0
- package/demos/Program.cs +1 -0
- package/demos/README.md +12 -0
- package/demos/app.dart +3 -0
- package/demos/app.deb +0 -0
- package/demos/app.js +1 -0
- package/demos/backup.tar +0 -0
- package/demos/budget.xlsx +0 -0
- package/demos/build.sh +2 -0
- package/demos/bundle.zip +0 -0
- package/demos/clip.mp4 +0 -0
- package/demos/data.sqlite +0 -0
- package/demos/disk.iso +0 -0
- package/demos/engine.cpp +5 -0
- package/demos/firmware.bin +0 -0
- package/demos/flake.nix +4 -0
- package/demos/folder/inside.txt +1 -0
- package/demos/font.ttf +0 -0
- package/demos/index.html +5 -0
- package/demos/index.php +2 -0
- package/demos/init.lua +1 -0
- package/demos/letter.docx +0 -0
- package/demos/lib.rs +3 -0
- package/demos/main.c +6 -0
- package/demos/main.h +3 -0
- package/demos/math-and-diagrams.md +200 -0
- package/demos/notes.tar.gz +0 -0
- package/demos/notes.txt +3 -0
- package/demos/photo.png +0 -0
- package/demos/program +2 -0
- package/demos/report.pdf +32 -0
- package/demos/script.py +1 -0
- package/demos/server.go +7 -0
- package/demos/settings.json +4 -0
- package/demos/slides.pptx +0 -0
- package/demos/song.mp3 +0 -0
- package/demos/style.css +4 -0
- package/demos/tool.rb +1 -0
- package/demos/types.ts +2 -0
- package/docs/pele.md +23 -0
- package/docs/protocol.md +3420 -0
- package/docs/temml.md +63 -0
- package/index.js +107 -0
- package/package.json +34 -4
- package/src/archive.js +407 -0
- package/src/archiveops.js +728 -0
- package/src/backend.js +369 -0
- package/src/bulkrename.js +95 -0
- package/src/clip-host.js +76 -0
- package/src/clip.js +462 -0
- package/src/code.js +168 -0
- package/src/compare.js +74 -0
- package/src/create.js +128 -0
- package/src/dirsize.js +147 -0
- package/src/figure-svg.js +530 -0
- package/src/figure-thread.js +23 -0
- package/src/figure.js +132 -0
- package/src/find.js +55 -0
- package/src/flea.js +39 -0
- package/src/fsinfo.js +39 -0
- package/src/highlight.js +141 -0
- package/src/html.js +52 -0
- package/src/kinds.js +89 -0
- package/src/listing.js +130 -0
- package/src/markdown-html.js +317 -0
- package/src/mathml.js +186 -0
- package/src/menu.js +180 -0
- package/src/meta.js +135 -0
- package/src/office.js +810 -0
- package/src/order.js +100 -0
- package/src/peek.js +49 -0
- package/src/pele-wrapper.js +695 -0
- package/src/permissions.js +180 -0
- package/src/places.js +313 -0
- package/src/preview-language.js +10 -0
- package/src/terminal-server.js +95 -0
- package/src/terminal-shell.js +26 -0
- package/src/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +327 -0
- package/src/uistate.js +393 -0
- package/src/uistore.js +168 -0
- package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
- package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
- package/src/vendor/LICENSES/MIT-katex.txt +21 -0
- package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
- package/src/vendor/LICENSES/MIT-pele.txt +40 -0
- package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
- package/src/vendor/LICENSES/MIT-temml.txt +21 -0
- package/src/vendor/pele.js +145 -0
- package/src/vendor/temml.mjs +14708 -0
- package/src/watch.js +98 -0
- package/src/wayland/client.js +109 -0
- package/src/wayland/protocol.js +55 -0
- package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
- package/src/wayland/protocols/wayland.xml +3248 -0
- package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
- package/src/wayland/resource-io.js +6 -0
- package/src/wayland/socket-discovery.js +26 -0
- package/src/wayland/transport-posix.js +120 -0
- package/src/wayland/transport-win32.js +11 -0
- package/src/wayland/transport.js +3 -0
- package/src/wayland/win32-resources.js +80 -0
- package/src/wayland/win32-wire.js +62 -0
- package/test/archive.test.js +80 -0
- package/test/bench-markdown-scroll.mjs +190 -0
- package/test/clip-host.test.js +113 -0
- package/test/code-preview.test.js +35 -0
- package/test/compare-ui-paths.test.js +24 -0
- package/test/compare.test.js +54 -0
- package/test/delete-trash.test.js +67 -0
- package/test/dirsize.test.js +138 -0
- package/test/file-ops.test.js +307 -0
- package/test/file-url.test.js +24 -0
- package/test/find-contents.test.js +161 -0
- package/test/find-input.test.js +66 -0
- package/test/fixtures/pele-parity.json +1006 -0
- package/test/highlight-launcher.test.js +35 -0
- package/test/html-preview.test.js +22 -0
- package/test/input.test.js +15 -0
- package/test/keymap.test.js +26 -0
- package/test/language-icons.test.js +36 -0
- package/test/launcher.test.js +51 -0
- package/test/manual-archive-here-ui.mjs +47 -0
- package/test/manual-code-scroll.mjs +28 -0
- package/test/manual-column-scroll.mjs +24 -0
- package/test/manual-compare-ui.mjs +20 -0
- package/test/manual-find-status.mjs +37 -0
- package/test/manual-folder-focus.mjs +63 -0
- package/test/manual-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -0
- package/test/manual-terminal-lifecycle.mjs +42 -0
- package/test/manual-terminal-navigation.mjs +48 -0
- package/test/manual-terminal-ui.mjs +47 -0
- package/test/manual-trash-ui.mjs +86 -0
- package/test/markdown-diagrams.test.js +93 -0
- package/test/markdown-html.test.js +105 -0
- package/test/mathml.test.js +92 -0
- package/test/menu-transfer.test.js +57 -0
- package/test/office-preview.test.js +154 -0
- package/test/pele-parity.test.js +28 -0
- package/test/places.test.js +134 -0
- package/test/preview-keys.test.js +60 -0
- package/test/preview-language.test.js +22 -0
- package/test/status-filename.test.js +20 -0
- package/test/transfer-replace-merge.test.js +187 -0
- package/test/trash-address.test.js +23 -0
- package/test/trash-view.test.js +37 -0
- package/test/trashbrowse.test.js +135 -0
- package/ui/AboutFacts.qml +78 -0
- package/ui/ArchiveCards.qml +95 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchiveHereConfirm.qml +127 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +775 -0
- package/ui/BulkOldNames.qml +47 -0
- package/ui/BulkRenameDialog.qml +380 -0
- package/ui/CardFrame.qml +67 -0
- package/ui/CardScroll.qml +79 -0
- package/ui/CheckBox.qml +73 -0
- package/ui/ChromeBar.qml +360 -0
- package/ui/ChromeButton.qml +131 -0
- package/ui/ChromeModes.qml +43 -0
- package/ui/CodeLines.qml +256 -0
- package/ui/CodeRefusal.qml +52 -0
- package/ui/CollideConfirm.qml +147 -0
- package/ui/CollideHost.qml +167 -0
- package/ui/ColumnPane.qml +525 -0
- package/ui/ColumnRow.qml +380 -0
- package/ui/ColumnsArea.qml +594 -0
- package/ui/ColumnsLanding.qml +147 -0
- package/ui/CompareView.qml +321 -0
- package/ui/ContextMenu.qml +743 -0
- package/ui/ConvertDialog.qml +456 -0
- package/ui/CountedWorker.qml +7 -0
- package/ui/Crumb.qml +64 -0
- package/ui/CrumbDrop.qml +25 -0
- package/ui/CsvTable.qml +394 -0
- package/ui/CursorMark.qml +41 -0
- package/ui/DefaultClaim.qml +130 -0
- package/ui/DeviceLock.qml +47 -0
- package/ui/DeviceMounts.qml +540 -0
- package/ui/DialogButton.qml +150 -0
- package/ui/DialogField.qml +147 -0
- package/ui/DialogHeader.qml +31 -0
- package/ui/DialogScrim.qml +20 -0
- package/ui/DialogTitle.qml +37 -0
- package/ui/Divider.qml +9 -0
- package/ui/DropInto.qml +126 -0
- package/ui/DropTarget.qml +35 -0
- package/ui/DropboxMark.qml +60 -0
- package/ui/EmptyState.qml +150 -0
- package/ui/EscapeHint.qml +11 -0
- package/ui/FactsTable.qml +54 -0
- package/ui/FastScrollHandler.qml +476 -0
- package/ui/FatNamesConfirm.qml +157 -0
- package/ui/Favourites.qml +143 -0
- package/ui/FigureService.qml +120 -0
- package/ui/FileDrag.qml +267 -0
- package/ui/FilterStrip.qml +133 -0
- package/ui/FitMetrics.qml +22 -0
- package/ui/FlashDriveRows.qml +137 -0
- package/ui/FlashHost.qml +72 -0
- package/ui/FlashImageRow.qml +104 -0
- package/ui/FlashRunner.qml +119 -0
- package/ui/FlashStepRow.qml +172 -0
- package/ui/FlashStrip.qml +38 -0
- package/ui/FlashView.qml +397 -0
- package/ui/FleaMark.qml +88 -0
- package/ui/FlyoutFade.qml +23 -0
- package/ui/FontPane.qml +170 -0
- package/ui/Glass.qml +114 -0
- package/ui/GlassTagger.qml +59 -0
- package/ui/Glyph.qml +64 -0
- package/ui/GlyphSolid.qml +22 -0
- package/ui/GridArea.qml +664 -0
- package/ui/GridTile.qml +325 -0
- package/ui/GvfsBridge.qml +164 -0
- package/ui/Header.qml +433 -0
- package/ui/HoverTimers.qml +39 -0
- package/ui/HtmlClip.qml +30 -0
- package/ui/HtmlPane.qml +63 -0
- package/ui/HyprlandMark.qml +45 -0
- package/ui/Ipc.qml +1005 -0
- package/ui/IpcControls.qml +7 -0
- package/ui/IpcMenuState.qml +48 -0
- package/ui/IpcPreviewState.qml +185 -0
- package/ui/JumpPath.qml +51 -0
- package/ui/KeymapSheet.qml +561 -0
- package/ui/KeymapSheetResult.qml +89 -0
- package/ui/KindStack.qml +40 -0
- package/ui/LangMark.qml +51 -0
- package/ui/LangMarkLoader.qml +26 -0
- package/ui/List.qml +480 -0
- package/ui/LoadingState.qml +54 -0
- package/ui/LocalSend.qml +56 -0
- package/ui/LocalSendMark.qml +73 -0
- package/ui/MarkdownBlockView.qml +311 -0
- package/ui/MarkdownBlocks.qml +35 -0
- package/ui/MarkdownFigure.qml +254 -0
- package/ui/MarkdownImages.qml +72 -0
- package/ui/MarkdownList.qml +81 -0
- package/ui/MarkdownMathsText.qml +97 -0
- package/ui/MarkdownPane.qml +83 -0
- package/ui/MarkdownPictures.qml +41 -0
- package/ui/MarkdownQuote.qml +52 -0
- package/ui/MarkdownRemote.qml +82 -0
- package/ui/MarkdownSource.qml +155 -0
- package/ui/MarkdownTable.qml +222 -0
- package/ui/MarkdownTableScroll.qml +64 -0
- package/ui/MarkdownTableWheel.qml +126 -0
- package/ui/MarkdownText.qml +87 -0
- package/ui/MarkdownWorker.js +132 -0
- package/ui/MatchText.qml +99 -0
- package/ui/MediaSession.qml +38 -0
- package/ui/MediaSound.qml +26 -0
- package/ui/MediaStrip.qml +191 -0
- package/ui/MediaTrack.qml +36 -0
- package/ui/MediaVolume.qml +54 -0
- package/ui/MenuActionDialog.qml +396 -0
- package/ui/MenuEdgeFade.qml +24 -0
- package/ui/MenuHost.qml +227 -0
- package/ui/MenuRow.qml +351 -0
- package/ui/MountListing.qml +100 -0
- package/ui/NetworkDialog.qml +435 -0
- package/ui/NetworkForm.qml +426 -0
- package/ui/NetworkMounts.qml +913 -0
- package/ui/NetworkPlaces.qml +127 -0
- package/ui/OpenWithDialog.qml +613 -0
- package/ui/Opener.qml +95 -0
- package/ui/Pane.qml +1320 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +268 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +601 -0
- package/ui/ParkedWait.qml +9 -0
- package/ui/PathEntry.qml +186 -0
- package/ui/PathJump.qml +400 -0
- package/ui/PdfViewer.qml +297 -0
- package/ui/PermissionsDialog.qml +658 -0
- package/ui/PermissionsHeadings.qml +31 -0
- package/ui/PhoneMounts.qml +67 -0
- package/ui/PickerAnswers.qml +75 -0
- package/ui/PickerBox.qml +26 -0
- package/ui/PickerChrome.qml +295 -0
- package/ui/PickerFilter.qml +97 -0
- package/ui/PickerGrid.qml +308 -0
- package/ui/PickerHeader.qml +28 -0
- package/ui/PickerLifecycle.qml +27 -0
- package/ui/PickerList.qml +218 -0
- package/ui/PickerListing.qml +149 -0
- package/ui/PickerPathBar.qml +127 -0
- package/ui/PickerPlaces.qml +189 -0
- package/ui/PickerRecent.qml +92 -0
- package/ui/PickerSave.qml +101 -0
- package/ui/PickerSelection.qml +155 -0
- package/ui/PickerWindow.qml +846 -0
- package/ui/PowerSectorsReader.qml +10 -0
- package/ui/PrebuildDriver.qml +146 -0
- package/ui/Preview.qml +1005 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +91 -0
- package/ui/PreviewColumn.qml +553 -0
- package/ui/PreviewEdge.qml +63 -0
- package/ui/PreviewFacts.qml +30 -0
- package/ui/PreviewFactsLine.qml +34 -0
- package/ui/PreviewHtml.qml +233 -0
- package/ui/PreviewImage.qml +253 -0
- package/ui/PreviewImagePan.qml +13 -0
- package/ui/PreviewImageSharp.qml +32 -0
- package/ui/PreviewLines.qml +106 -0
- package/ui/PreviewMarkdown.qml +706 -0
- package/ui/PreviewMedia.qml +250 -0
- package/ui/PreviewPdf.qml +482 -0
- package/ui/PreviewScroll.qml +201 -0
- package/ui/PreviewSwap.qml +335 -0
- package/ui/PreviewText.qml +149 -0
- package/ui/ProtocolChip.qml +18 -0
- package/ui/QuickLookArchive.qml +41 -0
- package/ui/QuickLookBar.qml +103 -0
- package/ui/QuickLookPrepare.qml +355 -0
- package/ui/QuickLookSwap.qml +10 -0
- package/ui/QuickLookWarm.qml +65 -0
- package/ui/RailDrop.qml +155 -0
- package/ui/RailHeading.qml +19 -0
- package/ui/RailPlaces.qml +38 -0
- package/ui/RailTrashRow.qml +67 -0
- package/ui/RenameField.qml +353 -0
- package/ui/RendererRetry.qml +11 -0
- package/ui/ResizeHandle.qml +52 -0
- package/ui/Reveal.qml +54 -0
- package/ui/Row.qml +476 -0
- package/ui/RowDrag.qml +213 -0
- package/ui/RowDropTarget.qml +27 -0
- package/ui/RunCard.qml +286 -0
- package/ui/Scripts.qml +65 -0
- package/ui/SearchStrip.qml +232 -0
- package/ui/SelectionBand.qml +140 -0
- package/ui/SelectionPreview.qml +370 -0
- package/ui/SettingsFavourite.qml +122 -0
- package/ui/SettingsGroup.qml +96 -0
- package/ui/SettingsHint.qml +12 -0
- package/ui/SettingsMetrics.qml +29 -0
- package/ui/SettingsPane.qml +178 -0
- package/ui/SettingsPanel.qml +547 -0
- package/ui/SettingsRail.qml +128 -0
- package/ui/SettingsRow.qml +409 -0
- package/ui/SettingsRuler.qml +85 -0
- package/ui/SettingsSegment.qml +85 -0
- package/ui/ShareBrowser.qml +113 -0
- package/ui/ShareLink.qml +67 -0
- package/ui/ShelfPins.qml +101 -0
- package/ui/Sidebar.qml +728 -0
- package/ui/SidebarRow.qml +358 -0
- package/ui/Spinner.qml +60 -0
- package/ui/StableModel.qml +89 -0
- package/ui/StateMessage.qml +84 -0
- package/ui/StatusBar.qml +512 -0
- package/ui/StatusFileName.qml +27 -0
- package/ui/TabBar.qml +673 -0
- package/ui/TabDragGeometry.qml +60 -0
- package/ui/TagMenuMark.qml +52 -0
- package/ui/TagRailSection.qml +53 -0
- package/ui/TagSlot.qml +40 -0
- package/ui/TagState.qml +150 -0
- package/ui/TagSwatch.qml +28 -0
- package/ui/Taildrop.qml +86 -0
- package/ui/TailscaleMark.qml +50 -0
- package/ui/TerminalService.qml +69 -0
- package/ui/TerminalTab.qml +48 -0
- package/ui/TerminalTabs.qml +27 -0
- package/ui/Theme.qml +460 -0
- package/ui/ThemeColors.qml +43 -0
- package/ui/TransferCard.qml +239 -0
- package/ui/TrashConfirm.qml +129 -0
- package/ui/TrashDropHandler.qml +11 -0
- package/ui/TrashHost.qml +202 -0
- package/ui/TrashMonitor.qml +30 -0
- package/ui/TrashToolbar.qml +19 -0
- package/ui/TrashView.qml +492 -0
- package/ui/UnlockDialog.qml +450 -0
- package/ui/UnlockHost.qml +206 -0
- package/ui/UpdateCheck.qml +97 -0
- package/ui/UserDirs.qml +25 -0
- package/ui/ViewState.qml +565 -0
- package/ui/ViewportScrollBar.qml +195 -0
- package/ui/ViewportScrollBars.qml +25 -0
- package/ui/WebPreview.qml +33 -0
- package/ui/WebPreviewView.qml +26 -0
- package/ui/WindowBody.qml +829 -0
- package/ui/WindowDrag.qml +35 -0
- package/ui/boot/Commons/AudioNodes.qml +50 -0
- package/ui/boot/Commons/AudioNodesModel.js +96 -0
- package/ui/boot/Commons/Border.qml +243 -0
- package/ui/boot/Commons/BorderGeometry.js +373 -0
- package/ui/boot/Commons/Color.qml +258 -0
- package/ui/boot/Commons/I18n.qml +118 -0
- package/ui/boot/Commons/InputDevices.qml +112 -0
- package/ui/boot/Commons/InputMethodState.qml +38 -0
- package/ui/boot/Commons/IpcRegistry.qml +77 -0
- package/ui/boot/Commons/Numbers.js +19 -0
- package/ui/boot/Commons/Plural.js +91 -0
- package/ui/boot/Commons/ShellIpc.qml +12 -0
- package/ui/boot/Commons/Style.qml +561 -0
- package/ui/boot/Commons/Translations.qml +100 -0
- package/ui/boot/Commons/UntypedInput.qml +152 -0
- package/ui/boot/Commons/Util.qml +188 -0
- package/ui/boot/Commons/qmldir +13 -0
- package/ui/boot/LICENSE-omarchy +20 -0
- package/ui/boot/Ui/BackgroundMedia.qml +49 -0
- package/ui/boot/Ui/BarIconButton.qml +106 -0
- package/ui/boot/Ui/BarIconContent.qml +38 -0
- package/ui/boot/Ui/BarIndicator.qml +53 -0
- package/ui/boot/Ui/BarWidget.qml +50 -0
- package/ui/boot/Ui/BorderOverlay.qml +54 -0
- package/ui/boot/Ui/BorderSurface.qml +40 -0
- package/ui/boot/Ui/Button.qml +224 -0
- package/ui/boot/Ui/ButtonGroup.qml +131 -0
- package/ui/boot/Ui/ConfirmDialog.qml +134 -0
- package/ui/boot/Ui/CursorSurface.qml +42 -0
- package/ui/boot/Ui/Dropdown.qml +245 -0
- package/ui/boot/Ui/FilterInput.qml +26 -0
- package/ui/boot/Ui/IconContentBounds.qml +141 -0
- package/ui/boot/Ui/KeyboardPanel.qml +453 -0
- package/ui/boot/Ui/MultiSelect.qml +624 -0
- package/ui/boot/Ui/NumberField.qml +86 -0
- package/ui/boot/Ui/OpticalGlyph.qml +68 -0
- package/ui/boot/Ui/OverlayWindow.qml +102 -0
- package/ui/boot/Ui/Panel.qml +60 -0
- package/ui/boot/Ui/PanelActionButton.qml +105 -0
- package/ui/boot/Ui/PanelController.qml +16 -0
- package/ui/boot/Ui/PanelHero.qml +112 -0
- package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
- package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
- package/ui/boot/Ui/PanelSeparator.qml +19 -0
- package/ui/boot/Ui/PanelSlider.qml +156 -0
- package/ui/boot/Ui/PanelToolTip.qml +50 -0
- package/ui/boot/Ui/PluginBarApi.qml +89 -0
- package/ui/boot/Ui/PointerMoveGate.qml +54 -0
- package/ui/boot/Ui/PopupCard.qml +181 -0
- package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
- package/ui/boot/Ui/SearchableDropdown.qml +354 -0
- package/ui/boot/Ui/SizedImage.qml +125 -0
- package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
- package/ui/boot/Ui/TextField.qml +58 -0
- package/ui/boot/Ui/Toggle.qml +118 -0
- package/ui/boot/Ui/ToggleSwitch.qml +115 -0
- package/ui/boot/Ui/WidgetButton.qml +172 -0
- package/ui/boot/Ui/qmldir +41 -0
- package/ui/boot/fleatab.qml +50 -0
- package/ui/boot/picker.qml +39 -0
- package/ui/boot/shell.qml +131 -0
- package/ui/boot/tabtearoff.qml +51 -0
- package/ui/js/Anchor.js +379 -0
- package/ui/js/AnchorHold.js +162 -0
- package/ui/js/Archive.js +157 -0
- package/ui/js/ArchiveCard.js +44 -0
- package/ui/js/ArchiveOps.js +44 -0
- package/ui/js/BackReturn.js +118 -0
- package/ui/js/BulkRename.js +100 -0
- package/ui/js/Buttons.js +54 -0
- package/ui/js/ChromeKeys.js +116 -0
- package/ui/js/ClipMarks.js +73 -0
- package/ui/js/ClipSelection.js +67 -0
- package/ui/js/Clipboard.js +179 -0
- package/ui/js/Cloud.js +97 -0
- package/ui/js/CodeRuns.js +72 -0
- package/ui/js/Collide.js +212 -0
- package/ui/js/ColumnFit.js +28 -0
- package/ui/js/ColumnMenu.js +111 -0
- package/ui/js/Columns.js +298 -0
- package/ui/js/ColumnsCarry.js +103 -0
- package/ui/js/Compare.js +74 -0
- package/ui/js/Contrast.js +157 -0
- package/ui/js/ControlReader.js +42 -0
- package/ui/js/Convert.js +52 -0
- package/ui/js/CopyAs.js +52 -0
- package/ui/js/Crumbs.js +178 -0
- package/ui/js/Csv.js +231 -0
- package/ui/js/Density.js +44 -0
- package/ui/js/Devices.js +440 -0
- package/ui/js/DirSizes.js +180 -0
- package/ui/js/Drag.js +360 -0
- package/ui/js/DragOut.js +166 -0
- package/ui/js/DropDev.js +52 -0
- package/ui/js/Dropbox.js +41 -0
- package/ui/js/Eject.js +217 -0
- package/ui/js/Errors.js +188 -0
- package/ui/js/ExtThumbs.js +115 -0
- package/ui/js/Facts.js +402 -0
- package/ui/js/FigureDate.js +14 -0
- package/ui/js/Filter.js +285 -0
- package/ui/js/Find.js +46 -0
- package/ui/js/Flash.js +184 -0
- package/ui/js/FlashCard.js +79 -0
- package/ui/js/FlashEndings.js +125 -0
- package/ui/js/FlashPane.js +116 -0
- package/ui/js/FleaBin.js +12 -0
- package/ui/js/Focus.js +504 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +314 -0
- package/ui/js/Fuzzy.js +141 -0
- package/ui/js/GlassTag.js +72 -0
- package/ui/js/Grid.js +33 -0
- package/ui/js/GridGeometry.js +90 -0
- package/ui/js/GridNames.js +153 -0
- package/ui/js/GvfsBridge.js +200 -0
- package/ui/js/HostClipboard.js +29 -0
- package/ui/js/Icons.js +218 -0
- package/ui/js/Input.js +50 -0
- package/ui/js/Jump.js +200 -0
- package/ui/js/KeyName.js +64 -0
- package/ui/js/Keymap.js +401 -0
- package/ui/js/Kinds.js +164 -0
- package/ui/js/LICENSES/ISC-lucide.txt +43 -0
- package/ui/js/LangMarkPaths.js +47 -0
- package/ui/js/LangMarks.js +120 -0
- package/ui/js/Lists.js +11 -0
- package/ui/js/LocalSend.js +39 -0
- package/ui/js/LockedMenu.js +63 -0
- package/ui/js/MakeDefault.js +186 -0
- package/ui/js/MarkBox.js +7 -0
- package/ui/js/Markdown.js +119 -0
- package/ui/js/MarkdownLists.js +86 -0
- package/ui/js/MarkdownMaths.js +58 -0
- package/ui/js/MarkdownPictures.js +32 -0
- package/ui/js/MarkdownPrepared.js +139 -0
- package/ui/js/MarkdownTableFit.js +34 -0
- package/ui/js/Marks.js +148 -0
- package/ui/js/Marquee.js +96 -0
- package/ui/js/Match.js +93 -0
- package/ui/js/Material.js +109 -0
- package/ui/js/MdBlocks.js +437 -0
- package/ui/js/MdBreak.js +71 -0
- package/ui/js/MdChunks.js +70 -0
- package/ui/js/MdContainer.js +137 -0
- package/ui/js/MdDocument.js +337 -0
- package/ui/js/MdEmph.js +97 -0
- package/ui/js/MdEntity.js +108 -0
- package/ui/js/MdEntityTable.js +223 -0
- package/ui/js/MdEscape.js +59 -0
- package/ui/js/MdFront.js +37 -0
- package/ui/js/MdHold.js +32 -0
- package/ui/js/MdHtml.js +307 -0
- package/ui/js/MdHtmlBlock.js +290 -0
- package/ui/js/MdHtmlHeading.js +53 -0
- package/ui/js/MdHtmlImage.js +179 -0
- package/ui/js/MdInline.js +154 -0
- package/ui/js/MdItems.js +212 -0
- package/ui/js/MdLeaf.js +309 -0
- package/ui/js/MdLink.js +196 -0
- package/ui/js/MdMath.js +67 -0
- package/ui/js/MdParagraphs.js +138 -0
- package/ui/js/MdRefs.js +232 -0
- package/ui/js/MdResolve.js +226 -0
- package/ui/js/MdRun.js +300 -0
- package/ui/js/MdUrl.js +226 -0
- package/ui/js/Menu.js +514 -0
- package/ui/js/MenuContext.js +85 -0
- package/ui/js/MenuFit.js +13 -0
- package/ui/js/MenuRefresh.js +74 -0
- package/ui/js/MenuWheel.js +35 -0
- package/ui/js/Messages.js +186 -0
- package/ui/js/Motion.js +16 -0
- package/ui/js/Mounts.js +320 -0
- package/ui/js/MouseNav.js +13 -0
- package/ui/js/Nav.js +329 -0
- package/ui/js/NetFs.js +26 -0
- package/ui/js/OpenWith.js +83 -0
- package/ui/js/Ops.js +585 -0
- package/ui/js/Palette.js +33 -0
- package/ui/js/PathBar.js +260 -0
- package/ui/js/Permissions.js +179 -0
- package/ui/js/Phones.js +112 -0
- package/ui/js/Picker.js +353 -0
- package/ui/js/PlaceMenu.js +96 -0
- package/ui/js/Places.js +265 -0
- package/ui/js/PreviewAsk.js +21 -0
- package/ui/js/PreviewKeys.js +155 -0
- package/ui/js/PreviewSettle.js +29 -0
- package/ui/js/PreviewSwap.js +101 -0
- package/ui/js/PropertyFacts.js +144 -0
- package/ui/js/Protocols.js +296 -0
- package/ui/js/QuickLookKinds.js +27 -0
- package/ui/js/QuickLookRect.js +24 -0
- package/ui/js/RailDrop.js +51 -0
- package/ui/js/RailKeys.js +87 -0
- package/ui/js/RailMenu.js +133 -0
- package/ui/js/Recent.js +135 -0
- package/ui/js/RecentMode.js +156 -0
- package/ui/js/Reload.js +60 -0
- package/ui/js/Renderer.js +9 -0
- package/ui/js/RunFile.js +143 -0
- package/ui/js/Scripts.js +28 -0
- package/ui/js/Scroll.js +304 -0
- package/ui/js/ScrollOff.js +69 -0
- package/ui/js/Search.js +478 -0
- package/ui/js/Selection.js +97 -0
- package/ui/js/Settings.js +476 -0
- package/ui/js/SettingsAbout.js +97 -0
- package/ui/js/SettingsShelf.js +52 -0
- package/ui/js/SheetKeys.js +42 -0
- package/ui/js/SheetQuery.js +281 -0
- package/ui/js/ShelfPile.js +27 -0
- package/ui/js/SlowClick.js +53 -0
- package/ui/js/SlowOp.js +6 -0
- package/ui/js/Sort.js +134 -0
- package/ui/js/Startup.js +63 -0
- package/ui/js/StateWords.js +17 -0
- package/ui/js/Status.js +238 -0
- package/ui/js/Swap.js +166 -0
- package/ui/js/TabMove.js +39 -0
- package/ui/js/Tabs.js +751 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +180 -0
- package/ui/js/TextSize.js +107 -0
- package/ui/js/Thumbs.js +158 -0
- package/ui/js/Transfer.js +172 -0
- package/ui/js/Trash.js +84 -0
- package/ui/js/TrashDates.js +47 -0
- package/ui/js/TrashDrop.js +64 -0
- package/ui/js/UiState.js +438 -0
- package/ui/js/Unlock.js +152 -0
- package/ui/js/Update.js +130 -0
- package/ui/js/UserDirs.js +56 -0
- package/ui/qmldir +230 -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("[")
|
|
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("[")
|
|
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("[")
|
|
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("[")
|
|
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("]")
|
|
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("]")
|
|
244
|
+
i++
|
|
245
|
+
}
|
|
246
|
+
continue
|
|
247
|
+
}
|
|
248
|
+
if (c === "]") {
|
|
249
|
+
out.push("]")
|
|
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 ? ">" : ">")
|
|
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("|")
|
|
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.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	script:x" and "&#106;avascript:x" are refused, "https://a.example/?a=1&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
|
+
}
|