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,179 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdHtmlImage: a raw HTML image on its own line, alone or inside a centring paragraph, as an image block.
|
|
4
|
+
.import "MdUrl.js" as MdUrl
|
|
5
|
+
.import "MdHtml.js" as MdHtml
|
|
6
|
+
|
|
7
|
+
// Sample input: '<p align="center"><a href="https://x"><img src="a.png"></a></p>' splits into wrapper, link, image, link end and closer.
|
|
8
|
+
var IMAGE_LINE = /^(<(?:p|div)\b[^<>]*>)?\s*(<a\b[^<>]*>)?\s*(<img\b[^<>]*>)\s*(<\/a>)?\s*(<\/(?:p|div)>)?$/i
|
|
9
|
+
// Sample input: '<div align="center">' and '<p>' open a wrapper; '<div>text' and '<span>' do not.
|
|
10
|
+
var WRAPPER_OPEN = /^<(?:p|div)\b[^<>]*>$/i
|
|
11
|
+
// Sample input: '</div>' and '</P>' close a wrapper and answer its tag name; '</div> text' does not.
|
|
12
|
+
var WRAPPER_CLOSE = /^<\/(p|div)>$/i
|
|
13
|
+
// Sample input: '<div class="x">' and '</div>' in a line each count once for div, with the slash captured; '<divider>' counts for none.
|
|
14
|
+
var WRAPPER_NESTING = { p: /<(\/?)p(?=[\s>\/])[^<>]*>/gi, div: /<(\/?)div(?=[\s>\/])[^<>]*>/gi }
|
|
15
|
+
// Sample input: '<p>text <img src="b.png"></p>' holds a second image; '<p>text</p>' and '<imgs>' hold none.
|
|
16
|
+
var SECOND_IMAGE = /<img\b/i
|
|
17
|
+
// Sample input: "<br>" or "<br />" at the start of a line; the image above it already ends its line.
|
|
18
|
+
var LEADING_BREAK = /^\s*(?:<br\s*\/?>\s*)+/i
|
|
19
|
+
// Sample input: " 64", "64px" and "64 " are sizes; "50%", "6.4" and "abc" are not.
|
|
20
|
+
var WIDTH_VALUE = /^\s*(\d{1,4})(?:px)?\s*$/i
|
|
21
|
+
|
|
22
|
+
// Sample input: '<p align="center">' is centred; '<p>' and '<div align="left">' are not.
|
|
23
|
+
function isCentred(open) {
|
|
24
|
+
var attributes = MdHtml.tagHead(open).attributes
|
|
25
|
+
for (var i = 0; i < attributes.length; i++) {
|
|
26
|
+
if (attributes[i].name === "align")
|
|
27
|
+
return attributes[i].value !== null && attributes[i].value.toLowerCase() === "center"
|
|
28
|
+
}
|
|
29
|
+
return false
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Sample input: '<img src="a.png" width="64" height="20" alt="x">' answers an image block with its width and height; null when the tag draws nothing.
|
|
33
|
+
function rawImage(text, dir) {
|
|
34
|
+
var tag = MdHtml.readTag(text, 0)
|
|
35
|
+
if (tag === null)
|
|
36
|
+
return null
|
|
37
|
+
var head = MdHtml.tagHead(tag.tag)
|
|
38
|
+
if (head.name !== "img" || head.closing || !head.validAttrs)
|
|
39
|
+
return null
|
|
40
|
+
// First attributes win even when their values are empty or absent.
|
|
41
|
+
var src = null
|
|
42
|
+
var alt = null
|
|
43
|
+
var width = null
|
|
44
|
+
var height = null
|
|
45
|
+
for (var a = 0; a < head.attributes.length; a++) {
|
|
46
|
+
var attr = head.attributes[a]
|
|
47
|
+
var value = attr.value === null ? "" : attr.value
|
|
48
|
+
if (attr.name === "src" && src === null)
|
|
49
|
+
src = value
|
|
50
|
+
if (attr.name === "alt" && alt === null)
|
|
51
|
+
alt = value
|
|
52
|
+
if (attr.name === "width" && width === null)
|
|
53
|
+
width = value
|
|
54
|
+
if (attr.name === "height" && height === null)
|
|
55
|
+
height = value
|
|
56
|
+
}
|
|
57
|
+
var cls = MdUrl.classifyImage(src === null ? "" : src, dir)
|
|
58
|
+
if (cls.kind === "remote")
|
|
59
|
+
return { type: "remote", host: cls.host }
|
|
60
|
+
if (cls.kind !== "local")
|
|
61
|
+
return null
|
|
62
|
+
var block = { type: "image", url: cls.url, alt: alt === null ? "" : alt }
|
|
63
|
+
var sized = width === null ? null : WIDTH_VALUE.exec(width)
|
|
64
|
+
if (sized !== null && Number(sized[1]) > 0)
|
|
65
|
+
block.width = Number(sized[1])
|
|
66
|
+
var tall = height === null ? null : WIDTH_VALUE.exec(height)
|
|
67
|
+
if (tall !== null && Number(tall[1]) > 0)
|
|
68
|
+
block.height = Number(tall[1])
|
|
69
|
+
return block
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Sample input: { width: 120 } on a 40x30 picture in a 500 pane answers { w: 120, h: 90, stretch: false }; { width: 70, height: 20 } answers { w: 70, h: 20, stretch: true }.
|
|
73
|
+
// One size rule for a lone picture and a row: a width or height attribute is honoured past the natural size, both name the box, none keeps the natural size; the pane width caps it, the ratio kept.
|
|
74
|
+
function pictureSize(spec, naturalW, naturalH, limit) {
|
|
75
|
+
var w = spec.width > 0 ? spec.width : 0
|
|
76
|
+
var h = spec.height > 0 ? spec.height : 0
|
|
77
|
+
var stretch = w > 0 && h > 0
|
|
78
|
+
if (w === 0 && h === 0) {
|
|
79
|
+
w = naturalW
|
|
80
|
+
h = naturalH
|
|
81
|
+
} else if (h === 0) {
|
|
82
|
+
h = naturalW > 0 ? w * naturalH / naturalW : 0
|
|
83
|
+
} else if (w === 0) {
|
|
84
|
+
w = naturalH > 0 ? h * naturalW / naturalH : 0
|
|
85
|
+
}
|
|
86
|
+
if (w > limit && w > 0) {
|
|
87
|
+
h = h * limit / w
|
|
88
|
+
w = limit
|
|
89
|
+
}
|
|
90
|
+
return { w: w, h: h, stretch: stretch }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Sample input: '<a href="https://x/y">' answers "https://x/y"; a javascript: or relative target answers null.
|
|
94
|
+
function linkOf(open) {
|
|
95
|
+
var attributes = MdHtml.tagHead(open).attributes
|
|
96
|
+
for (var i = 0; i < attributes.length; i++) {
|
|
97
|
+
if (attributes[i].name === "href" && attributes[i].value !== null) {
|
|
98
|
+
var url = MdHtml.normalizedTarget(MdUrl.canonicalUrl(attributes[i].value))
|
|
99
|
+
return /^(?:https?|mailto):/i.test(url) ? url : null
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Sample input: lines ['<p>', 'note', '</p>', '</div>'] from 0 for "div" answer { rest: ['<p>', 'note', '</p>'], end: 3 }; a blank line or a missing closer answers null.
|
|
106
|
+
// The lines after a wrapper's image up to its own tag's closer, nested openers counted; a line holding another image answers null at once (the splitter draws that row whole).
|
|
107
|
+
function wrapperTail(lines, from, name) {
|
|
108
|
+
var rest = []
|
|
109
|
+
var depth = 1
|
|
110
|
+
for (var j = from; j < lines.length; j++) {
|
|
111
|
+
var line = lines[j].trim()
|
|
112
|
+
if (line === "")
|
|
113
|
+
return null
|
|
114
|
+
if (SECOND_IMAGE.test(line))
|
|
115
|
+
return null
|
|
116
|
+
var closer = WRAPPER_CLOSE.exec(line)
|
|
117
|
+
if (depth === 1 && closer !== null && closer[1].toLowerCase() === name)
|
|
118
|
+
return { rest: rest, end: j }
|
|
119
|
+
line.replace(WRAPPER_NESTING[name], function (tag, slash) {
|
|
120
|
+
depth += slash === "/" ? -1 : 1
|
|
121
|
+
return tag
|
|
122
|
+
})
|
|
123
|
+
// A closer sharing its line with text, or one with no opener, ends the wrapper where no unit can follow.
|
|
124
|
+
if (depth < 1)
|
|
125
|
+
return null
|
|
126
|
+
rest.push(line)
|
|
127
|
+
}
|
|
128
|
+
return null
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Sample input: lines ['<p align="center">', ' <img src="a.png">', '</p>'] at 0 answers { block, end: 2, wrapper: [] }; a line that is no image unit answers null.
|
|
132
|
+
// wrapper holds the opener, the lines between the image and the closer, and the closer on one line, to draw under the image; empty when none.
|
|
133
|
+
function imageUnit(lines, at, dir) {
|
|
134
|
+
var first = IMAGE_LINE.exec(lines[at].trim())
|
|
135
|
+
var open = null
|
|
136
|
+
var parts = null
|
|
137
|
+
var last = at
|
|
138
|
+
if (first !== null && first[1] !== undefined) {
|
|
139
|
+
open = first[1]
|
|
140
|
+
parts = first
|
|
141
|
+
} else if (first === null && WRAPPER_OPEN.test(lines[at].trim()) && at + 1 < lines.length) {
|
|
142
|
+
parts = IMAGE_LINE.exec(lines[at + 1].trim())
|
|
143
|
+
if (parts === null || parts[1] !== undefined)
|
|
144
|
+
return null
|
|
145
|
+
open = lines[at].trim()
|
|
146
|
+
last = at + 1
|
|
147
|
+
} else {
|
|
148
|
+
return null
|
|
149
|
+
}
|
|
150
|
+
if ((parts[2] === undefined) !== (parts[4] === undefined))
|
|
151
|
+
return null
|
|
152
|
+
var name = MdHtml.tagHead(open).name
|
|
153
|
+
var rest = []
|
|
154
|
+
if (parts[5] !== undefined) {
|
|
155
|
+
if (WRAPPER_CLOSE.exec(parts[5])[1].toLowerCase() !== name)
|
|
156
|
+
return null
|
|
157
|
+
} else {
|
|
158
|
+
var tail = wrapperTail(lines, last + 1, name)
|
|
159
|
+
if (tail === null)
|
|
160
|
+
return null
|
|
161
|
+
rest = tail.rest
|
|
162
|
+
last = tail.end
|
|
163
|
+
}
|
|
164
|
+
var block = rawImage(parts[3], dir)
|
|
165
|
+
if (block === null)
|
|
166
|
+
return null
|
|
167
|
+
if (isCentred(open))
|
|
168
|
+
block.align = "center"
|
|
169
|
+
if (parts[2] !== undefined && block.type === "image" && linkOf(parts[2]) !== null)
|
|
170
|
+
block.link = linkOf(parts[2])
|
|
171
|
+
if (rest.length > 0)
|
|
172
|
+
rest[0] = rest[0].replace(LEADING_BREAK, "")
|
|
173
|
+
var shown = []
|
|
174
|
+
for (var r = 0; r < rest.length; r++) {
|
|
175
|
+
if (rest[r].length > 0)
|
|
176
|
+
shown.push(rest[r])
|
|
177
|
+
}
|
|
178
|
+
return { block: block, end: last, wrapper: shown.length === 0 ? [] : [open + shown.join("\n") + "</" + name + ">"] }
|
|
179
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdInline: single-pass scanners that never restart, so hostile input stays linear and no unresolved "![", "[" or "<" escapes.
|
|
4
|
+
.import "MdEscape.js" as Esc
|
|
5
|
+
|
|
6
|
+
var MAX_MATH_RUN_LENGTH = 2
|
|
7
|
+
|
|
8
|
+
function isSpace(c) {
|
|
9
|
+
return c === " " || c === "\t" || c === "\n" || c === "\r"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function isPunct(c) {
|
|
13
|
+
return Esc.isAsciiPunct(c.charCodeAt(0))
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Interval tuple: [from, to, run length, kind]; the kind is CODE_SPAN or MATH_SPAN.
|
|
17
|
+
var INTERVAL_STRIDE = 4
|
|
18
|
+
var CODE_SPAN = 0
|
|
19
|
+
var MATH_SPAN = 1
|
|
20
|
+
|
|
21
|
+
// Sample input: `` ` `` and `x`, or $x+1$ and $$x^2$$; code pairs before math, never across it.
|
|
22
|
+
function spanIntervals(text) {
|
|
23
|
+
var hasCode = text.indexOf("`") >= 0
|
|
24
|
+
if (!hasCode && text.indexOf("$") < 0)
|
|
25
|
+
return []
|
|
26
|
+
var code = hasCode ? codeIntervals(text) : []
|
|
27
|
+
return text.indexOf("$") >= 0 ? mergeIntervals(code, mathIntervals(text, code)) : code
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Sample input: ``a ` b`` and `c`; a closing run drops the openers and spans inside it, which are literal.
|
|
31
|
+
function codeIntervals(text) {
|
|
32
|
+
var out = []
|
|
33
|
+
var openByLen = {}
|
|
34
|
+
var openers = []
|
|
35
|
+
var i = text.indexOf("`")
|
|
36
|
+
while (i >= 0) {
|
|
37
|
+
var j = i + 1
|
|
38
|
+
while (text.charAt(j) === "`")
|
|
39
|
+
j++
|
|
40
|
+
var len = j - i
|
|
41
|
+
var open = openByLen[len]
|
|
42
|
+
if (open !== undefined && open !== null) {
|
|
43
|
+
while (out.length > 0 && out[out.length - INTERVAL_STRIDE] > open)
|
|
44
|
+
out.length -= INTERVAL_STRIDE
|
|
45
|
+
out.push(open, j, len, CODE_SPAN)
|
|
46
|
+
var covered = 0
|
|
47
|
+
do {
|
|
48
|
+
covered = openers.pop()
|
|
49
|
+
openByLen[covered] = null
|
|
50
|
+
} while (covered !== len)
|
|
51
|
+
} else {
|
|
52
|
+
openByLen[len] = i
|
|
53
|
+
openers.push(len)
|
|
54
|
+
}
|
|
55
|
+
i = text.indexOf("`", j)
|
|
56
|
+
}
|
|
57
|
+
return out
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Sample input: costs $5 and $10 stays prose; $x+1$ pairs; no space inside an edge, no digit after the closer, no odd backslash run before.
|
|
61
|
+
function mathIntervals(text, code) {
|
|
62
|
+
var out = []
|
|
63
|
+
var codeAt = 0
|
|
64
|
+
var i = text.indexOf("$")
|
|
65
|
+
var open = -1
|
|
66
|
+
var openLen = 0
|
|
67
|
+
while (i >= 0) {
|
|
68
|
+
while (codeAt < code.length && code[codeAt + 1] <= i) {
|
|
69
|
+
open = code[codeAt] > open ? -1 : open
|
|
70
|
+
codeAt += INTERVAL_STRIDE
|
|
71
|
+
}
|
|
72
|
+
if (codeAt < code.length && code[codeAt] < i) {
|
|
73
|
+
open = -1
|
|
74
|
+
i = text.indexOf("$", code[codeAt + 1])
|
|
75
|
+
continue
|
|
76
|
+
}
|
|
77
|
+
var j = i + 1
|
|
78
|
+
while (text.charAt(j) === "$")
|
|
79
|
+
j++
|
|
80
|
+
var len = j - i
|
|
81
|
+
var back = 0
|
|
82
|
+
for (var b = i - 1; b >= 0 && text.charAt(b) === "\\"; b--)
|
|
83
|
+
back++
|
|
84
|
+
if (len <= MAX_MATH_RUN_LENGTH && back % 2 === 0) {
|
|
85
|
+
var after = text.charAt(j)
|
|
86
|
+
var canClose = i > 0 && !isSpace(text.charAt(i - 1)) && !(after >= "0" && after <= "9")
|
|
87
|
+
if (open >= 0 && len === openLen && canClose) {
|
|
88
|
+
out.push(open, j, openLen, MATH_SPAN)
|
|
89
|
+
open = -1
|
|
90
|
+
} else if (j < text.length && !isSpace(text.charAt(j))) {
|
|
91
|
+
open = i
|
|
92
|
+
openLen = len
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
i = text.indexOf("$", j)
|
|
96
|
+
}
|
|
97
|
+
return out
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Merge two from-ordered tuple lists in one pass; code and math never share a start.
|
|
101
|
+
function mergeIntervals(a, b) {
|
|
102
|
+
var out = []
|
|
103
|
+
var ai = 0
|
|
104
|
+
var bi = 0
|
|
105
|
+
while (ai < a.length || bi < b.length) {
|
|
106
|
+
var fromA = bi >= b.length || (ai < a.length && a[ai] < b[bi])
|
|
107
|
+
var src = fromA ? a : b
|
|
108
|
+
var at = fromA ? ai : bi
|
|
109
|
+
out.push(src[at], src[at + 1], src[at + 2], src[at + 3])
|
|
110
|
+
ai += fromA ? INTERVAL_STRIDE : 0
|
|
111
|
+
bi += fromA ? 0 : INTERVAL_STRIDE
|
|
112
|
+
}
|
|
113
|
+
return out
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// An inline code span as styled HTML, content escaped; math keeps its kind tag for the later figure unit.
|
|
117
|
+
function codeHtml(content, chrome, kind) {
|
|
118
|
+
if (!/^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(chrome || "")))
|
|
119
|
+
return null
|
|
120
|
+
var tag = kind === "math" ? '<code data-math="inline" style="background-color:' + chrome + '">'
|
|
121
|
+
: '<code style="background-color:' + chrome + '">'
|
|
122
|
+
return tag + Esc.chipPad() + escapeHtmlText(content) + Esc.chipPad() + "</code>"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function escapeHtmlText(content) {
|
|
126
|
+
return Esc.escapeText(content)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Sample input: "1. ol" answers "1. ol", so a decoded "1. ol" never reaches Qt as an ordered list marker; "a<b" answers "a<b".
|
|
130
|
+
var ASCII_DIGIT_SPLIT = /([0-9])/
|
|
131
|
+
|
|
132
|
+
// Text a character reference decoded to: punctuation and digits as numeric entities, so no marker, fence or rule forms at a line start.
|
|
133
|
+
function escapeDecodedText(content) {
|
|
134
|
+
var parts = String(content).split(ASCII_DIGIT_SPLIT)
|
|
135
|
+
for (var i = 0; i < parts.length; i++)
|
|
136
|
+
parts[i] = i % 2 === 1 ? "&#" + parts[i].charCodeAt(0) + ";" : escapeHtmlText(parts[i])
|
|
137
|
+
return parts.join("")
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The tags a link wears: the importer hardcodes its link blue, but a font tag inside the anchor survives it; null when the ink is no colour.
|
|
141
|
+
function linkInk(ink) {
|
|
142
|
+
if (!/^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(String(ink || "")))
|
|
143
|
+
return null
|
|
144
|
+
return { open: '<font color="' + ink + '">', close: "</font>" }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// A link as an anchor wrapping its label in the ink.
|
|
148
|
+
function linkHtml(label, url, ink, markup) {
|
|
149
|
+
var wear = linkInk(ink)
|
|
150
|
+
if (wear === null)
|
|
151
|
+
return null
|
|
152
|
+
var safe = String(url).replace(/&/g, "&").replace(/"/g, """)
|
|
153
|
+
return '<a href="' + safe + '">' + wear.open + (markup === true ? label : escapeHtmlText(label)) + wear.close + "</a>"
|
|
154
|
+
}
|
package/ui/js/MdItems.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
.import "MdLeaf.js" as Leaf
|
|
4
|
+
|
|
5
|
+
// MdItems: one top-level list as flat entries (depth, marker, loose flag per list), and the quote and list blocks built from them.
|
|
6
|
+
var BULLET = "•"
|
|
7
|
+
|
|
8
|
+
// Sample input: "fenceBody" and "codeLine" are lines inside a fence or an indented block; "run" is prose.
|
|
9
|
+
function isRaw(kind) {
|
|
10
|
+
return kind === "fenceOpen" || kind === "fenceBody" || kind === "fenceClose" || kind === "codeLine"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Sample input: item "a" holding a nested list "b" answers entries a (depth 0, marker bullet) and b (depth 1).
|
|
14
|
+
function builder() {
|
|
15
|
+
var entries = []
|
|
16
|
+
// levels[d] is the list now open at depth d: its parent item, its kind, its item count and whether a blank line loosened it.
|
|
17
|
+
var levels = []
|
|
18
|
+
var heads = {}
|
|
19
|
+
var cur = null
|
|
20
|
+
var blank = false
|
|
21
|
+
|
|
22
|
+
function sibling(depth, chain) {
|
|
23
|
+
var lv = depth < levels.length ? levels[depth] : null
|
|
24
|
+
return lv !== null && lv.mark === chain[depth].mark
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function open(chain, depth) {
|
|
28
|
+
var frame = chain[depth]
|
|
29
|
+
var lv = sibling(depth, chain) ? levels[depth] : null
|
|
30
|
+
if (lv !== null) {
|
|
31
|
+
lv.count++
|
|
32
|
+
} else {
|
|
33
|
+
lv = { mark: frame.mark, start: frame.start, count: 0, loose: false }
|
|
34
|
+
levels[depth] = lv
|
|
35
|
+
}
|
|
36
|
+
levels.length = depth + 1
|
|
37
|
+
var entry = { depth: depth, lines: [], list: lv, frameId: frame.id, content: 0,
|
|
38
|
+
marker: frame.ordered ? (lv.start + lv.count) + "." : BULLET }
|
|
39
|
+
entries.push(entry)
|
|
40
|
+
heads[frame.id] = entry
|
|
41
|
+
return entry
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// A blank line before a new item loosens the list the item joins, or the list whose item it nests in.
|
|
45
|
+
function loosenOpened(chain, depth) {
|
|
46
|
+
if (sibling(depth, chain))
|
|
47
|
+
levels[depth].loose = true
|
|
48
|
+
else if (depth > 0)
|
|
49
|
+
levels[depth - 1].loose = true
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function add(event, text) {
|
|
53
|
+
var chain = event.chain
|
|
54
|
+
var lead = event.lead
|
|
55
|
+
var line = { text: text, index: event.index, raw: isRaw(event.kind) }
|
|
56
|
+
var last = lead.n - 1
|
|
57
|
+
var from = Math.min(lead.retained, lead.n)
|
|
58
|
+
// A blank line opens no item; "-" alone opens an empty one.
|
|
59
|
+
if (event.kind === "run" && text.trim().length === 0 && from > last) {
|
|
60
|
+
blank = true
|
|
61
|
+
if (cur !== null)
|
|
62
|
+
cur.lines.push(line)
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
if (from <= last) {
|
|
66
|
+
if (blank)
|
|
67
|
+
loosenOpened(chain, from)
|
|
68
|
+
for (var depth = from; depth <= last; depth++)
|
|
69
|
+
cur = open(chain, depth)
|
|
70
|
+
} else {
|
|
71
|
+
var head = heads[chain[last].id]
|
|
72
|
+
if (cur.frameId !== head.frameId) {
|
|
73
|
+
levels.length = last + 1
|
|
74
|
+
cur = { depth: last, lines: [], list: head.list, frameId: head.frameId, content: 0, marker: "" }
|
|
75
|
+
entries.push(cur)
|
|
76
|
+
if (blank)
|
|
77
|
+
head.list.loose = true
|
|
78
|
+
} else if (blank && cur.content > 0) {
|
|
79
|
+
cur.list.loose = true
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
blank = false
|
|
83
|
+
cur.content++
|
|
84
|
+
cur.lines.push(line)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return { add: add, entries: entries }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The text of the lines that draw; kept.raw[k] marks a code line, which the renderer reads as code and the inline pass never sees.
|
|
91
|
+
function visibleLines(lines, state) {
|
|
92
|
+
var kept = []
|
|
93
|
+
kept.raw = []
|
|
94
|
+
for (var i = 0; i < lines.length; i++) {
|
|
95
|
+
var line = lines[i]
|
|
96
|
+
if (state.hidden.hasOwnProperty(line.index))
|
|
97
|
+
continue
|
|
98
|
+
var text = line.text
|
|
99
|
+
if (state.escaped.hasOwnProperty(line.index)) {
|
|
100
|
+
var at = text.indexOf("[")
|
|
101
|
+
text = text.slice(0, at) + "\\[" + text.slice(at + 1)
|
|
102
|
+
}
|
|
103
|
+
kept.push(text)
|
|
104
|
+
kept.raw.push(line.raw === true)
|
|
105
|
+
}
|
|
106
|
+
return kept
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Prose goes through the inline pass; a fence or indented code in an item or quote stays verbatim for the renderer.
|
|
110
|
+
function inlineLines(kept, inlineOf) {
|
|
111
|
+
var parts = []
|
|
112
|
+
var prose = []
|
|
113
|
+
for (var k = 0; k <= kept.length; k++) {
|
|
114
|
+
if (k < kept.length && !kept.raw[k]) {
|
|
115
|
+
prose.push(kept[k])
|
|
116
|
+
continue
|
|
117
|
+
}
|
|
118
|
+
if (prose.length > 0)
|
|
119
|
+
parts.push(inlineOf(prose.join("\n")))
|
|
120
|
+
prose = []
|
|
121
|
+
if (k < kept.length)
|
|
122
|
+
parts.push(kept[k])
|
|
123
|
+
}
|
|
124
|
+
return parts.join("\n")
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Sample input: lines "a" and "```" answer parts, prose alone answers its one text, and nothing to draw answers an empty text.
|
|
128
|
+
function content(lines, inlineOf, partsOf) {
|
|
129
|
+
if (lines.join("\n").trim().length === 0)
|
|
130
|
+
return { text: "" }
|
|
131
|
+
var parts = partsOf(lines)
|
|
132
|
+
if (parts === null)
|
|
133
|
+
return { text: inlineLines(lines, inlineOf) }
|
|
134
|
+
if (parts.length === 0)
|
|
135
|
+
return { text: "" }
|
|
136
|
+
if (parts.length === 1 && parts[0].type === "run" && parts[0].maths === undefined)
|
|
137
|
+
return { text: parts[0].text }
|
|
138
|
+
return { text: "", parts: parts }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// One quote block per run of lines at one nesting depth; the depth shows past the first level, joined after the first block.
|
|
142
|
+
function quoteBlocks(all, state, inlineOf, partsOf) {
|
|
143
|
+
var out = []
|
|
144
|
+
for (var at = 0; at < all.length; ) {
|
|
145
|
+
var to = at
|
|
146
|
+
while (to < all.length && all[to].depth === all[at].depth)
|
|
147
|
+
to++
|
|
148
|
+
var quote = visibleLines(all.slice(at, to), state)
|
|
149
|
+
// A quote with nothing to draw is still a block: a browser gives it its margin.
|
|
150
|
+
var title = at === 0 && quote.length > 0 && !quote.raw[0] ? Leaf.alertTitle(quote[0]) : null
|
|
151
|
+
if (title !== null)
|
|
152
|
+
quote[0] = title
|
|
153
|
+
var held = content(quote, inlineOf, partsOf)
|
|
154
|
+
var block = { type: "quote", text: held.text }
|
|
155
|
+
if (held.parts !== undefined)
|
|
156
|
+
block.parts = held.parts
|
|
157
|
+
if (all[at].depth > 1)
|
|
158
|
+
block.depth = all[at].depth
|
|
159
|
+
if (at > 0)
|
|
160
|
+
block.joined = true
|
|
161
|
+
out.push(block)
|
|
162
|
+
at = to
|
|
163
|
+
}
|
|
164
|
+
return out
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// One list as a block; depths, markers and gaps only when nesting or looseness needs them, parts when an item holds more than prose.
|
|
168
|
+
function listBlock(event, state, inlineOf, partsOf) {
|
|
169
|
+
var items = []
|
|
170
|
+
var depths = []
|
|
171
|
+
var markers = []
|
|
172
|
+
var gaps = []
|
|
173
|
+
var parts = []
|
|
174
|
+
var nested = false
|
|
175
|
+
var loose = false
|
|
176
|
+
var holds = false
|
|
177
|
+
var entries = event.builder.entries
|
|
178
|
+
for (var k = 0; k < entries.length; k++) {
|
|
179
|
+
var entry = entries[k]
|
|
180
|
+
// An item that opens on a blank line starts at its first line of text.
|
|
181
|
+
var first = 0
|
|
182
|
+
while (first < entry.lines.length - 1 && entry.lines[first].text.trim().length === 0)
|
|
183
|
+
first++
|
|
184
|
+
var lines = visibleLines(entry.lines.slice(first), state)
|
|
185
|
+
while (lines.length > 0 && lines[lines.length - 1].trim().length === 0)
|
|
186
|
+
lines.pop()
|
|
187
|
+
if (entry.marker !== "" && lines.length > 0 && !lines.raw[0])
|
|
188
|
+
lines[0] = Leaf.taskText(lines[0])
|
|
189
|
+
var gap = entry.list.loose
|
|
190
|
+
nested = nested || entry.depth > 0 || entry.marker === ""
|
|
191
|
+
loose = loose || gap
|
|
192
|
+
var held = content(lines, inlineOf, partsOf)
|
|
193
|
+
held.text = Leaf.pinTaskBox(held.text)
|
|
194
|
+
if (held.parts !== undefined && held.parts[0].type === "run")
|
|
195
|
+
held.parts[0].text = Leaf.pinTaskBox(held.parts[0].text)
|
|
196
|
+
holds = holds || held.parts !== undefined
|
|
197
|
+
items.push(held.text)
|
|
198
|
+
parts.push(held.parts !== undefined ? held.parts : null)
|
|
199
|
+
depths.push(entry.depth)
|
|
200
|
+
markers.push(entry.marker)
|
|
201
|
+
gaps.push(gap)
|
|
202
|
+
}
|
|
203
|
+
var block = { type: "list", ordered: event.ordered, start: event.start, items: items }
|
|
204
|
+
if (nested || loose) {
|
|
205
|
+
block.depths = depths
|
|
206
|
+
block.markers = markers
|
|
207
|
+
block.gaps = gaps
|
|
208
|
+
}
|
|
209
|
+
if (holds)
|
|
210
|
+
block.parts = parts
|
|
211
|
+
return block
|
|
212
|
+
}
|