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
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdParagraphs: cut one run's lines into paragraphs; a blank ends the paragraph unless HTML spans it.
|
|
4
|
+
.import "MdHtml.js" as MdHtml
|
|
5
|
+
|
|
6
|
+
// Tags that never pair across a blank line: void elements carry no content, so an unclosed one never joins paragraphs.
|
|
7
|
+
var VOID_TAGS = { area: 1, base: 1, br: 1, col: 1, hr: 1, img: 1, link: 1, meta: 1, source: 1, track: 1, wbr: 1 }
|
|
8
|
+
|
|
9
|
+
// A backtick run closed by a run of the same length is a code span, as CommonMark reads it; an unclosed run stays literal.
|
|
10
|
+
function codeRanges(text) {
|
|
11
|
+
var out = []
|
|
12
|
+
var openByLen = {}
|
|
13
|
+
var openers = []
|
|
14
|
+
var i = text.indexOf("`")
|
|
15
|
+
while (i >= 0) {
|
|
16
|
+
var j = i + 1
|
|
17
|
+
while (text.charAt(j) === "`")
|
|
18
|
+
j++
|
|
19
|
+
var len = j - i
|
|
20
|
+
var open = openByLen[len]
|
|
21
|
+
if (open !== undefined && open !== null) {
|
|
22
|
+
while (out.length > 0 && out[out.length - 1][0] > open)
|
|
23
|
+
out.length -= 1
|
|
24
|
+
out.push([open, j])
|
|
25
|
+
var covered = 0
|
|
26
|
+
do {
|
|
27
|
+
covered = openers.pop()
|
|
28
|
+
openByLen[covered] = null
|
|
29
|
+
} while (covered !== len)
|
|
30
|
+
} else {
|
|
31
|
+
openByLen[len] = i
|
|
32
|
+
openers.push(len)
|
|
33
|
+
}
|
|
34
|
+
i = text.indexOf("`", j)
|
|
35
|
+
}
|
|
36
|
+
return out
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// A backslash escapes the punctuation after it, so "\<" opens no tag; an even run escapes only itself.
|
|
40
|
+
function isEscaped(text, tag) {
|
|
41
|
+
var back = 0
|
|
42
|
+
for (var b = tag - 1; b >= 0 && text.charAt(b) === "\\"; b--)
|
|
43
|
+
back++
|
|
44
|
+
return back % 2 === 1
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Sample input: ["a", "", "b"] cuts after the blank; ["<div>", "", "x"] never cuts inside the open tag.
|
|
48
|
+
// One forward pass, so hostile input stays linear: tag depth and comments ride along, and a later paragraph never rescans an earlier one.
|
|
49
|
+
function cutAfter(lines) {
|
|
50
|
+
var cut = []
|
|
51
|
+
for (var i = 0; i < lines.length; i++)
|
|
52
|
+
cut.push(false)
|
|
53
|
+
var laterText = []
|
|
54
|
+
var seen = false
|
|
55
|
+
for (var w = lines.length - 1; w >= 0; w--) {
|
|
56
|
+
laterText[w] = seen
|
|
57
|
+
if (lines[w].trim().length > 0)
|
|
58
|
+
seen = true
|
|
59
|
+
}
|
|
60
|
+
var depth = 0
|
|
61
|
+
var comment = false
|
|
62
|
+
// An unterminated tag may complete on a later line; past readTag's own cap it never classifies, so it is dropped.
|
|
63
|
+
var carry = ""
|
|
64
|
+
var hasText = false
|
|
65
|
+
for (var l = 0; l < lines.length; l++) {
|
|
66
|
+
var line = lines[l]
|
|
67
|
+
if (line.trim().length === 0) {
|
|
68
|
+
if (hasText && laterText[l] && depth === 0 && !comment) {
|
|
69
|
+
cut[l] = true
|
|
70
|
+
hasText = false
|
|
71
|
+
depth = 0
|
|
72
|
+
comment = false
|
|
73
|
+
carry = ""
|
|
74
|
+
}
|
|
75
|
+
continue
|
|
76
|
+
}
|
|
77
|
+
hasText = true
|
|
78
|
+
// A tag may wrap at whitespace, so the carried fragment rejoins with the newline it was split on.
|
|
79
|
+
var text = carry === "" ? line : carry + "\n" + line
|
|
80
|
+
carry = ""
|
|
81
|
+
// Tags inside a closed code span are literal text, the same rule the inline parser pairs by.
|
|
82
|
+
var code = codeRanges(text)
|
|
83
|
+
var span = 0
|
|
84
|
+
var at = 0
|
|
85
|
+
// A ">" search that reaches the end proves no later tag on this text can close, so each pays once.
|
|
86
|
+
var noClose = -1
|
|
87
|
+
while (at < text.length) {
|
|
88
|
+
if (comment) {
|
|
89
|
+
var end = text.indexOf("-->", at)
|
|
90
|
+
if (end < 0)
|
|
91
|
+
break
|
|
92
|
+
comment = false
|
|
93
|
+
at = end + 3
|
|
94
|
+
continue
|
|
95
|
+
}
|
|
96
|
+
var tag = text.indexOf("<", at)
|
|
97
|
+
if (tag < 0)
|
|
98
|
+
break
|
|
99
|
+
while (span < code.length && code[span][1] <= tag)
|
|
100
|
+
span += 1
|
|
101
|
+
if (span < code.length && code[span][0] <= tag && tag < code[span][1]) {
|
|
102
|
+
at = code[span][1]
|
|
103
|
+
continue
|
|
104
|
+
}
|
|
105
|
+
if (isEscaped(text, tag)) {
|
|
106
|
+
at = tag + 1
|
|
107
|
+
continue
|
|
108
|
+
}
|
|
109
|
+
if (text.slice(tag, tag + 4) === "<!--") {
|
|
110
|
+
comment = true
|
|
111
|
+
at = tag + 4
|
|
112
|
+
continue
|
|
113
|
+
}
|
|
114
|
+
var found = null
|
|
115
|
+
if (noClose < 0 || tag <= noClose)
|
|
116
|
+
found = MdHtml.readTag(text, tag, null)
|
|
117
|
+
if (found === null) {
|
|
118
|
+
if (noClose < 0 && text.indexOf(">", tag + 1) < 0)
|
|
119
|
+
noClose = tag
|
|
120
|
+
at = tag + 1
|
|
121
|
+
continue
|
|
122
|
+
}
|
|
123
|
+
var head = MdHtml.tagHead(found.tag)
|
|
124
|
+
if (head.name !== "" && !VOID_TAGS.hasOwnProperty(head.name)) {
|
|
125
|
+
if (head.closing) {
|
|
126
|
+
if (depth > 0)
|
|
127
|
+
depth--
|
|
128
|
+
} else if (!head.selfClose)
|
|
129
|
+
depth++
|
|
130
|
+
}
|
|
131
|
+
at = found.end
|
|
132
|
+
}
|
|
133
|
+
var lastLt = text.lastIndexOf("<")
|
|
134
|
+
if (lastLt > text.lastIndexOf(">") && text.length - lastLt <= MdHtml.MAX_TAG_LENGTH)
|
|
135
|
+
carry = text.slice(lastLt)
|
|
136
|
+
}
|
|
137
|
+
return cut
|
|
138
|
+
}
|
package/ui/js/MdRefs.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// Parse one definition's text; MdBlocks alone decides where definitions are allowed.
|
|
4
|
+
.import "MdLink.js" as Link
|
|
5
|
+
.import "MdHtml.js" as MdHtml
|
|
6
|
+
.import "MdContainer.js" as Container
|
|
7
|
+
|
|
8
|
+
var hasOwn = Object.prototype.hasOwnProperty
|
|
9
|
+
|
|
10
|
+
// Sample: [pic]: image.png "Title"; an empty destination can continue on the next container line.
|
|
11
|
+
function readDefinition(line) {
|
|
12
|
+
var indent = 0
|
|
13
|
+
while (indent < MAX_INDENT && line.charAt(indent) === " ")
|
|
14
|
+
indent++
|
|
15
|
+
var found = Link.readLabelRef(line, indent)
|
|
16
|
+
if (found === null || found.label.trim().length === 0 || found.label.charAt(0) === "^" || line.charAt(found.end) !== ":")
|
|
17
|
+
return null
|
|
18
|
+
var rest = line.slice(found.end + 1)
|
|
19
|
+
if (rest.trim().length === 0)
|
|
20
|
+
return { key: Link.normalizeLabel(found.label), target: "", titled: false }
|
|
21
|
+
var body = readBodyAt(rest, 0)
|
|
22
|
+
if (body === null)
|
|
23
|
+
return null
|
|
24
|
+
return { key: Link.normalizeLabel(found.label), target: body.target, titled: body.titled }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Sample: <my pic.png> "Title" or pic.png; one destination grammar for top level and containers.
|
|
28
|
+
function readDefinitionParts(text) {
|
|
29
|
+
var body = readBodyAt(text, 0)
|
|
30
|
+
if (body === null)
|
|
31
|
+
return { target: "", titled: false }
|
|
32
|
+
return { target: body.target, titled: body.titled }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function readDefinitionTarget(text) {
|
|
36
|
+
return readDefinitionParts(text).target
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var MAX_INDENT = 3
|
|
40
|
+
var TITLE_CLOSER = { '"': '"', "'": "'", "(": ")" }
|
|
41
|
+
|
|
42
|
+
// Sample input: "\n x" read from 0 answers { at: 4, newline: true }; spaces, tabs and at most one line ending are skipped.
|
|
43
|
+
function skipGap(text, from) {
|
|
44
|
+
var at = from
|
|
45
|
+
var newline = false
|
|
46
|
+
while (at < text.length && (text.charAt(at) === " " || text.charAt(at) === "\t" || (!newline && text.charAt(at) === "\n"))) {
|
|
47
|
+
newline = newline || text.charAt(at) === "\n"
|
|
48
|
+
at++
|
|
49
|
+
}
|
|
50
|
+
return { at: at, newline: newline }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Sample input: '<a b> "t"' read from 0 answers { target: "a b", end: 5 }; "/u x" answers { target: "/u", end: 2 }; "<a" answers null.
|
|
54
|
+
function readDestinationAt(text, from) {
|
|
55
|
+
var at = from
|
|
56
|
+
if (text.charAt(at) === "<") {
|
|
57
|
+
at = Link.angleClose(text, from + 1, text.length, true)
|
|
58
|
+
return at >= 0 ? { target: text.slice(from + 1, at), end: at + 1 } : null
|
|
59
|
+
}
|
|
60
|
+
var depth = 0
|
|
61
|
+
while (at < text.length && !/[\s\x00-\x1f]/.test(text.charAt(at))) {
|
|
62
|
+
var c = text.charAt(at)
|
|
63
|
+
depth += c === "(" ? 1 : c === ")" ? -1 : 0
|
|
64
|
+
at += c === "\\" && at + 1 < text.length && !/\s/.test(text.charAt(at + 1)) ? 2 : 1
|
|
65
|
+
}
|
|
66
|
+
return at > from && depth === 0 ? { target: text.slice(from, at), end: at } : null
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Sample input: `"a\nb" x` read from 0 answers 6, the index after the closing quote; a title needs its closer, and "(" titles hold no "(".
|
|
70
|
+
function readTitleEnd(text, from) {
|
|
71
|
+
var opener = text.charAt(from)
|
|
72
|
+
var closer = TITLE_CLOSER.hasOwnProperty(opener) ? TITLE_CLOSER[opener] : ""
|
|
73
|
+
for (var at = from + 1; closer !== "" && at < text.length; at++) {
|
|
74
|
+
var c = text.charAt(at)
|
|
75
|
+
if (c === closer)
|
|
76
|
+
return at + 1
|
|
77
|
+
if (opener === "(" && c === "(")
|
|
78
|
+
return -1
|
|
79
|
+
at += c === "\\" && text.charAt(at + 1) !== "\n" ? 1 : 0
|
|
80
|
+
}
|
|
81
|
+
return -1
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Sample input: "a \nb" at 1 answers true, only blanks remain on the line; "a b" at 1 answers false.
|
|
85
|
+
function endsLine(text, from) {
|
|
86
|
+
var at = from
|
|
87
|
+
while (text.charAt(at) === " " || text.charAt(at) === "\t")
|
|
88
|
+
at++
|
|
89
|
+
return at >= text.length || text.charAt(at) === "\n"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Sample input: '<a b> "t"' read from 0 answers { target: "a b", titled: true, end: 9 }; "/u x" answers null, junk follows the destination.
|
|
93
|
+
function readBodyAt(text, from) {
|
|
94
|
+
var lead = skipGap(text, from)
|
|
95
|
+
var dest = readDestinationAt(text, lead.at)
|
|
96
|
+
if (dest === null)
|
|
97
|
+
return null
|
|
98
|
+
var gap = skipGap(text, dest.end)
|
|
99
|
+
var close = gap.at > dest.end ? readTitleEnd(text, gap.at) : -1
|
|
100
|
+
var titled = close >= 0 && endsLine(text, close)
|
|
101
|
+
if (!titled && !endsLine(text, dest.end))
|
|
102
|
+
return null
|
|
103
|
+
return { target: dest.target, titled: titled, end: titled ? close : dest.end }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Sample input: lines "[Foo\n bar]: /url\n'a\nb'" answer { key: "foo bar", titled: true, end: 3 }; "[a]: /u x" answers null.
|
|
107
|
+
function definitionAt(lines, from) {
|
|
108
|
+
var stop = from + 1
|
|
109
|
+
while (stop < lines.length && lines[stop].trim().length > 0 && !Container.startsBlock(lines[stop]))
|
|
110
|
+
stop++
|
|
111
|
+
var text = lines.slice(from, stop).join("\n")
|
|
112
|
+
var indent = 0
|
|
113
|
+
while (indent < MAX_INDENT && text.charAt(indent) === " ")
|
|
114
|
+
indent++
|
|
115
|
+
var label = Link.readLabelRef(text, indent)
|
|
116
|
+
if (label === null || label.label.trim().length === 0 || label.label.charAt(0) === "^" || text.charAt(label.end) !== ":")
|
|
117
|
+
return null
|
|
118
|
+
var body = readBodyAt(text, label.end + 1)
|
|
119
|
+
if (body === null)
|
|
120
|
+
return null
|
|
121
|
+
// A title that does not close its own line is dropped when it sits on the next line, and spoils the definition when it follows the destination.
|
|
122
|
+
return { key: Link.normalizeLabel(label.label), target: body.target, titled: body.titled,
|
|
123
|
+
end: from + text.slice(0, body.end).split("\n").length - 1 }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Sample input: ' > "t"' under frames list (contentCol 4) then quote answers '"t"'; '"t"' with no indent stays a lazy continuation; a line that opens its own quote answers null.
|
|
127
|
+
function replayed(line, frames) {
|
|
128
|
+
var view = { at: 0, padding: 0, column: 0 }
|
|
129
|
+
for (var f = 0; f < frames.length; f++) {
|
|
130
|
+
var quote = Container.quoteAt(line, view)
|
|
131
|
+
if (frames[f].type === "quote" && quote >= 0)
|
|
132
|
+
Container.takeQuote(line, view, quote)
|
|
133
|
+
else if (frames[f].type === "list" && Container.indentationAt(line, view, frames[f].contentCol).width >= frames[f].contentCol)
|
|
134
|
+
Container.takeIndent(line, view, frames[f].contentCol)
|
|
135
|
+
else
|
|
136
|
+
break
|
|
137
|
+
}
|
|
138
|
+
return Container.quoteAt(line, view) >= 0 ? null : Container.textAt(line, view)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Sample input: lines "'a" over "b'" at 0 with no frames answer 1, the line that closes the title; "'open" with no closer, or junk after it, answers -1.
|
|
142
|
+
function titleEnd(lines, at, frames) {
|
|
143
|
+
var first = at < lines.length ? replayed(lines[at], frames) : null
|
|
144
|
+
var open = first === null ? "" : first.trim().charAt(0)
|
|
145
|
+
if (open !== "\"" && open !== "'" && open !== "(")
|
|
146
|
+
return -1
|
|
147
|
+
var close = open === "(" ? ")" : open
|
|
148
|
+
for (var k = at; k < lines.length; k++) {
|
|
149
|
+
var text = replayed(lines[k], frames)
|
|
150
|
+
if (text === null || text.trim().length === 0)
|
|
151
|
+
return -1
|
|
152
|
+
for (var c = k === at ? text.indexOf(open) + 1 : 0; c < text.length; c++) {
|
|
153
|
+
if (text.charAt(c) === "\\")
|
|
154
|
+
c++
|
|
155
|
+
else if (text.charAt(c) === close)
|
|
156
|
+
return text.slice(c + 1).trim().length === 0 ? k : -1
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return -1
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// The first definition of a label wins.
|
|
163
|
+
function storeDefinition(defs, key, target) {
|
|
164
|
+
if (!hasOwn.call(defs, key))
|
|
165
|
+
defs[key] = target
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// A title on the lines after a finished definition belongs to it: its lines hide with the definition; allowed says it has none yet, frames are its containers.
|
|
169
|
+
function hideTitle(lines, from, state, allowed, frames) {
|
|
170
|
+
var end = allowed ? titleEnd(lines, from, frames) : -1
|
|
171
|
+
if (end < 0)
|
|
172
|
+
return
|
|
173
|
+
for (var k = from; k <= end; k++)
|
|
174
|
+
state.hidden[k] = true
|
|
175
|
+
state.dropped.push([from, end])
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Sample: [^id]: note body; the block reader supplies any indented continuation lines.
|
|
179
|
+
function readFootnoteDefinition(line) {
|
|
180
|
+
var match = /^ {0,3}\[\^([^\]\n]+)\]:\s*(.*)$/.exec(line)
|
|
181
|
+
return match === null ? null : { id: match[1], text: match[2] }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Escape a definition-shaped leaf refused by the block reader before handing it to md4c.
|
|
185
|
+
function killDefinition(line) {
|
|
186
|
+
if (!/^ {0,3}\[(?:\\.|[^\[\]\\\n])+\]:/.test(line))
|
|
187
|
+
return line
|
|
188
|
+
var at = line.indexOf("[")
|
|
189
|
+
return line.slice(0, at) + "\\[" + line.slice(at + 1)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Sample input: "[^note]" at its "[" yields id "note" and the index after "]".
|
|
193
|
+
function readFootnoteRef(text, i) {
|
|
194
|
+
var j = i + 2
|
|
195
|
+
while (j < text.length && text.charAt(j) !== "]" && text.charAt(j) !== "\n")
|
|
196
|
+
j++
|
|
197
|
+
if (j >= text.length || text.charAt(j) !== "]" || j === i + 2)
|
|
198
|
+
return null
|
|
199
|
+
return { id: text.slice(i + 2, j), end: j + 1 }
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
// Skip DROP_CONTENT bodies with same-name nesting; share the dead-tag flag to keep unmatched runs linear.
|
|
204
|
+
function skipDropContent(body, i, name, dead) {
|
|
205
|
+
var depth = 1
|
|
206
|
+
while (i < body.length && depth > 0) {
|
|
207
|
+
var o = body.indexOf("<", i)
|
|
208
|
+
if (o < 0)
|
|
209
|
+
return body.length
|
|
210
|
+
var inner = MdHtml.readTag(body, o, dead)
|
|
211
|
+
if (inner === null) {
|
|
212
|
+
i = o + 1
|
|
213
|
+
continue
|
|
214
|
+
}
|
|
215
|
+
var head = MdHtml.tagHead(inner.tag)
|
|
216
|
+
if (head.name === name) {
|
|
217
|
+
if (head.closing)
|
|
218
|
+
depth--
|
|
219
|
+
else if (!head.selfClose)
|
|
220
|
+
depth++
|
|
221
|
+
}
|
|
222
|
+
i = inner.end
|
|
223
|
+
}
|
|
224
|
+
return i
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Sample input: lines 2 to 3 hide both and record the span as dropped, so no line of the definition reaches the renderer.
|
|
228
|
+
function hideDefinition(state, from, to) {
|
|
229
|
+
for (var i = from; i <= to; i++)
|
|
230
|
+
state.hidden[i] = true
|
|
231
|
+
state.dropped.push([from, to])
|
|
232
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdResolve: resolve bracket pairs into held local images, escaped placeholders, safe links or literal text.
|
|
4
|
+
.import "MdUrl.js" as MdUrl
|
|
5
|
+
.import "MdHtml.js" as MdHtml
|
|
6
|
+
.import "MdInline.js" as Md
|
|
7
|
+
.import "MdLink.js" as Link
|
|
8
|
+
.import "MdRefs.js" as Refs
|
|
9
|
+
.import "MdEntity.js" as Ent
|
|
10
|
+
|
|
11
|
+
var MAX_STYLED_SPANS = 1024
|
|
12
|
+
var hasOwn = Object.prototype.hasOwnProperty
|
|
13
|
+
// The bytes a markdown destination cannot hold as written, as percent escapes.
|
|
14
|
+
var PERCENT_ESCAPE = { " ": "%20", "(": "%28", ")": "%29" }
|
|
15
|
+
// The characters the renderer decodes in a destination, written so it reads back the text it was given.
|
|
16
|
+
var DESTINATION_ESCAPE = { "\\": "\\\\", "&": "&", "<": "<", ">": ">" }
|
|
17
|
+
|
|
18
|
+
// A destination as the markdown the renderer reads back to exactly this text: it decodes references and escapes once more.
|
|
19
|
+
function markdownDestination(target) {
|
|
20
|
+
return String(target).replace(/[ ()\\&<>]/g, function (c) {
|
|
21
|
+
return PERCENT_ESCAPE.hasOwnProperty(c) ? PERCENT_ESCAPE[c] : DESTINATION_ESCAPE[c]
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Sample input: "https://a.example" and "mailto:a@b.example" are external; "./x.md", "#top" and "ftp://h/f" are not.
|
|
26
|
+
function isExternalLink(url) {
|
|
27
|
+
var seen = MdHtml.normalizedTarget(MdUrl.canonicalUrl(url))
|
|
28
|
+
return /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(seen) && MdUrl.targetAllowed(url)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Sample input: "(/u)" after a label answers { url: "/u", end: 4 }; "[ref]" and "[]" read a definition, as does a bare label (raw).
|
|
32
|
+
function readDestination(body, j, raw, defs) {
|
|
33
|
+
var found = readRawDestination(body, j, raw, defs)
|
|
34
|
+
return found === null ? null : { url: Ent.decodeReferences(found.url), end: found.end }
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function readRawDestination(body, j, raw, defs) {
|
|
38
|
+
var inline = body.charAt(j) === "(" ? Link.readInlineTarget(body, j) : null
|
|
39
|
+
if (inline !== null)
|
|
40
|
+
return { url: inline.url, end: inline.end }
|
|
41
|
+
if (body.charAt(j) === "[") {
|
|
42
|
+
var ref = Link.readLabelRef(body, j)
|
|
43
|
+
var label = ref === null ? "" : ref.label.length > 0 ? ref.label : raw
|
|
44
|
+
if (label.length > 0 && hasOwn.call(defs, Link.normalizeLabel(label)))
|
|
45
|
+
return { url: defs[Link.normalizeLabel(label)], end: ref.end }
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
if (raw.length > 0 && hasOwn.call(defs, Link.normalizeLabel(raw)))
|
|
49
|
+
return { url: defs[Link.normalizeLabel(raw)], end: j }
|
|
50
|
+
return null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// An alt text is the label's text alone: tags go, numeric entities turn back into characters.
|
|
54
|
+
function plainText(html) {
|
|
55
|
+
return String(html).replace(/<[^>]*>/g, "").replace(/&#(\d+);/g, function (m, n) {
|
|
56
|
+
return String.fromCharCode(parseInt(n, 10))
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Resolve one bracket pair into text, a -1-i token reference or null; raw is its label, label() its resolved markup and target its destination.
|
|
61
|
+
function resolvePair(raw, target, bang, dir, ink, tokens, label) {
|
|
62
|
+
// A backslash before punctuation is consumed by the backslash: the alt and the label display the punctuation, never the escape.
|
|
63
|
+
var clean = String(raw).replace(/\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g, "$1")
|
|
64
|
+
if (bang) {
|
|
65
|
+
clean = label === undefined ? clean : plainText(label())
|
|
66
|
+
var cls = MdUrl.classifyImage(target, dir)
|
|
67
|
+
if (cls.kind === "remote")
|
|
68
|
+
return "\n\n" + MdUrl.placeholder(Md.escapeHtmlText(cls.host)) + "\n\n"
|
|
69
|
+
if (cls.kind === "local") {
|
|
70
|
+
var alt = Md.escapeHtmlText(clean)
|
|
71
|
+
tokens.push(" + ")")
|
|
72
|
+
return -1 - (tokens.length - 1)
|
|
73
|
+
}
|
|
74
|
+
return Md.escapeHtmlText(clean)
|
|
75
|
+
}
|
|
76
|
+
target = MdHtml.normalizedTarget(target)
|
|
77
|
+
// Only http, https, mailto, relative and #anchor targets link, checked through every decoding, so no javascript: href is emitted.
|
|
78
|
+
if (!MdUrl.targetAllowed(target))
|
|
79
|
+
return Md.escapeHtmlText("[" + clean + "](" + target + ")")
|
|
80
|
+
var shown = label === undefined ? clean : label()
|
|
81
|
+
// Inside an html link the renderer would draw a linked image's alt text beside it, so its own link syntax carries that label.
|
|
82
|
+
var html = label !== undefined && shown.indexOf(" + ")"
|
|
84
|
+
: Md.linkHtml(shown, target, ink, label !== undefined)
|
|
85
|
+
if (html === null)
|
|
86
|
+
return Md.escapeHtmlText("[" + clean + "](" + target + ")")
|
|
87
|
+
tokens.push(html)
|
|
88
|
+
return -1 - (tokens.length - 1)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Push sanitizer output, splitting any held-span markers it carries into token references. Tags are short, so this walk is bounded by the tag length.
|
|
92
|
+
function pushEmitted(out, tokens, emit) {
|
|
93
|
+
var open = MdHtml.openToken()
|
|
94
|
+
if (emit.indexOf(open) < 0) {
|
|
95
|
+
out.push(emit)
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
var close = MdHtml.closeToken()
|
|
99
|
+
var plain = ""
|
|
100
|
+
var i = 0
|
|
101
|
+
while (i < emit.length) {
|
|
102
|
+
if (emit.charAt(i) !== open) {
|
|
103
|
+
plain += emit.charAt(i)
|
|
104
|
+
i++
|
|
105
|
+
continue
|
|
106
|
+
}
|
|
107
|
+
var j = i + 1
|
|
108
|
+
var num = ""
|
|
109
|
+
while (j < emit.length && emit.charAt(j) !== close) {
|
|
110
|
+
num += emit.charAt(j)
|
|
111
|
+
j++
|
|
112
|
+
}
|
|
113
|
+
var idx = parseInt(num, 10)
|
|
114
|
+
if (j < emit.length && idx >= 0 && idx < tokens.length) {
|
|
115
|
+
if (plain !== "") {
|
|
116
|
+
out.push(plain)
|
|
117
|
+
plain = ""
|
|
118
|
+
}
|
|
119
|
+
out.push(-1 - idx)
|
|
120
|
+
i = j + 1
|
|
121
|
+
} else {
|
|
122
|
+
plain += emit.charAt(i)
|
|
123
|
+
i++
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (plain !== "")
|
|
127
|
+
out.push(plain)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// One styled span, cached by content: dense documents repeat the same spans thousands of times, and each rebuild costs a regex the cache pays once.
|
|
131
|
+
function styledSpan(kind, content, chrome, cache) {
|
|
132
|
+
var key = kind + "\n" + content
|
|
133
|
+
if (cache.hasOwnProperty(key))
|
|
134
|
+
return cache[key]
|
|
135
|
+
var held = Md.codeHtml(content, chrome, kind)
|
|
136
|
+
var count = 0
|
|
137
|
+
for (var existing in cache)
|
|
138
|
+
count++
|
|
139
|
+
if (count < MAX_STYLED_SPANS)
|
|
140
|
+
cache[key] = held
|
|
141
|
+
return held
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Sample input: '<img src="pic.png">' at its "<" resolves a tag; '<https://a.example>' resolves an autolink.
|
|
145
|
+
function parseAngle(body, i, dir, ink, styleLinks, dead, tokens, out, chrome, inked) {
|
|
146
|
+
var auto = Link.readAutolink(body, i)
|
|
147
|
+
if (auto !== null && !MdUrl.targetAllowed(auto.href))
|
|
148
|
+
auto = null
|
|
149
|
+
if (auto !== null) {
|
|
150
|
+
if (!styleLinks) {
|
|
151
|
+
out.push(Md.escapeHtmlText(auto.url))
|
|
152
|
+
i = auto.end
|
|
153
|
+
return i
|
|
154
|
+
}
|
|
155
|
+
var ahtml = Md.linkHtml(auto.url, auto.href, ink)
|
|
156
|
+
if (ahtml === null)
|
|
157
|
+
out.push(Md.escapeHtmlText(auto.url))
|
|
158
|
+
else {
|
|
159
|
+
tokens.push(ahtml)
|
|
160
|
+
out.push(-1 - (tokens.length - 1))
|
|
161
|
+
}
|
|
162
|
+
i = auto.end
|
|
163
|
+
return i
|
|
164
|
+
}
|
|
165
|
+
if (body.slice(i, i + 4) === "<!--") {
|
|
166
|
+
if (dead.commentDead) {
|
|
167
|
+
out.push("<")
|
|
168
|
+
i++
|
|
169
|
+
return i
|
|
170
|
+
}
|
|
171
|
+
var ce = body.indexOf("-->", i + 4)
|
|
172
|
+
if (ce < 0) {
|
|
173
|
+
dead.commentDead = true
|
|
174
|
+
out.push("<")
|
|
175
|
+
i++
|
|
176
|
+
} else {
|
|
177
|
+
i = ce + 3
|
|
178
|
+
}
|
|
179
|
+
return i
|
|
180
|
+
}
|
|
181
|
+
if (body.charAt(i + 1) === "!" || body.charAt(i + 1) === "?") {
|
|
182
|
+
var decl = MdHtml.readTag(body, i, dead)
|
|
183
|
+
if (decl === null) {
|
|
184
|
+
out.push("<")
|
|
185
|
+
i++
|
|
186
|
+
} else {
|
|
187
|
+
i = decl.end
|
|
188
|
+
}
|
|
189
|
+
return i
|
|
190
|
+
}
|
|
191
|
+
var found = MdHtml.readTag(body, i, dead)
|
|
192
|
+
if (found === null || MdHtml.tagHead(found.tag).name.length === 0) {
|
|
193
|
+
out.push("<")
|
|
194
|
+
i++
|
|
195
|
+
return i
|
|
196
|
+
}
|
|
197
|
+
var san = MdHtml.sanitizeTag(found.tag, dir, tokens, chrome, ink, inked)
|
|
198
|
+
pushEmitted(out, tokens, san.emit)
|
|
199
|
+
i = found.end
|
|
200
|
+
if (san.drop !== null)
|
|
201
|
+
i = Refs.skipDropContent(body, i, san.drop, dead)
|
|
202
|
+
return i
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Sample input: "see https://a.example/x now" at the "h" answers the index after the address; no bare address answers -1.
|
|
206
|
+
function bareAt(body, i, ink, styleLinks, tokens, out) {
|
|
207
|
+
var bare = Link.readBarelink(body, i)
|
|
208
|
+
if (bare === null || !MdUrl.targetAllowed(bare.href))
|
|
209
|
+
return -1
|
|
210
|
+
var url = bare.url
|
|
211
|
+
var href = bare.href
|
|
212
|
+
// GFM leaves a trailing entity reference such as "&hl;" out of the address.
|
|
213
|
+
var entity = body.charAt(bare.end) === ";" ? /&[A-Za-z0-9]+$/.exec(url) : null
|
|
214
|
+
if (entity !== null) {
|
|
215
|
+
url = url.slice(0, entity.index)
|
|
216
|
+
href = href.slice(0, href.length - (bare.url.length - url.length))
|
|
217
|
+
}
|
|
218
|
+
var html = styleLinks ? Md.linkHtml(url, href, ink) : null
|
|
219
|
+
if (html === null) {
|
|
220
|
+
out.push(Md.escapeHtmlText(url))
|
|
221
|
+
} else {
|
|
222
|
+
tokens.push(html)
|
|
223
|
+
out.push(-1 - (tokens.length - 1))
|
|
224
|
+
}
|
|
225
|
+
return bare.end - (bare.url.length - url.length)
|
|
226
|
+
}
|