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,437 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// The same streaming block pass collects definitions and renders with the resulting complete map.
|
|
4
|
+
.import "MdLeaf.js" as Leaf
|
|
5
|
+
.import "MdRefs.js" as Refs
|
|
6
|
+
.import "MdContainer.js" as Container
|
|
7
|
+
.import "MdDocument.js" as Document
|
|
8
|
+
.import "MdHtml.js" as Html
|
|
9
|
+
.import "MdMath.js" as Maths
|
|
10
|
+
.import "MdFront.js" as Front
|
|
11
|
+
|
|
12
|
+
var CODE_INDENT = 4
|
|
13
|
+
var MIN_RULE_MARKS = 3
|
|
14
|
+
var MAX_RULE_INDENT = 3
|
|
15
|
+
var LIST_INTERRUPT_START = 1
|
|
16
|
+
// A working parse proves it every few thousand block-pass events or PROGRESS_MS, so the pane's fallback waits for silence, never speed.
|
|
17
|
+
var PROGRESS_EVENTS = 4000
|
|
18
|
+
// Events cost more or less as the box is loaded, so a parse also beats once PROGRESS_MS passed, the clock read every CLOCK_EVENTS events.
|
|
19
|
+
var PROGRESS_MS = 500
|
|
20
|
+
var CLOCK_EVENTS = 64
|
|
21
|
+
// A live request is parsed SLICE_MS at a time, so a newer request is read between slices (a running parse cannot be cancelled).
|
|
22
|
+
var SLICE_MS = 200
|
|
23
|
+
var clock = Date.now
|
|
24
|
+
// A suite replaces the clock with a stepped one, so the clock beat is proved without waiting.
|
|
25
|
+
function useClock(now) {
|
|
26
|
+
clock = now
|
|
27
|
+
}
|
|
28
|
+
// A slice's stop test: true once ms have passed, the clock read every CLOCK_EVENTS lines.
|
|
29
|
+
function sliceDue(ms) {
|
|
30
|
+
var from = clock()
|
|
31
|
+
var seen = 0
|
|
32
|
+
return function () { return ++seen % CLOCK_EVENTS === 0 && clock() - from >= ms }
|
|
33
|
+
}
|
|
34
|
+
// A document nesting containers deeper than this is not rendered: blocks answers one sentinel and the pane shows the source.
|
|
35
|
+
var NESTING_LIMIT = 32
|
|
36
|
+
var SETEXT_MARK = /^(\s*)([=-])/
|
|
37
|
+
var hasOwn = Object.prototype.hasOwnProperty
|
|
38
|
+
|
|
39
|
+
// Sample input: "mermaid chart title" selects a diagram by its first word, ignoring case.
|
|
40
|
+
function figureKind(info) {
|
|
41
|
+
var first = String(info || "").trim().split(/\s+/)[0] || ""
|
|
42
|
+
var word = first.toLowerCase()
|
|
43
|
+
if (word === "mermaid")
|
|
44
|
+
return "mermaid"
|
|
45
|
+
if (word === "math" || word === "latex")
|
|
46
|
+
return "math"
|
|
47
|
+
return ""
|
|
48
|
+
}
|
|
49
|
+
// Sample: "> - - -" has one thematic suffix; cache it before opening any nested containers.
|
|
50
|
+
function ruleSuffix(line) {
|
|
51
|
+
var at = line.length - 1
|
|
52
|
+
while (at >= 0 && (line.charAt(at) === " " || line.charAt(at) === "\t"))
|
|
53
|
+
at--
|
|
54
|
+
var tick = line.charAt(at)
|
|
55
|
+
var count = 0
|
|
56
|
+
if (tick !== "-" && tick !== "*" && tick !== "_")
|
|
57
|
+
return { start: line.length, count: count }
|
|
58
|
+
while (at >= 0 && (line.charAt(at) === tick || line.charAt(at) === " " || line.charAt(at) === "\t")) {
|
|
59
|
+
if (line.charAt(at) === tick)
|
|
60
|
+
count++
|
|
61
|
+
at--
|
|
62
|
+
}
|
|
63
|
+
return { start: at + 1, count: count }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Keys are document text, so the three keyed maps have no prototype: "__proto__" and "hasOwnProperty" are ordinary ids.
|
|
67
|
+
function referenceState() {
|
|
68
|
+
return { defs: Object.create(null), notes: Object.create(null), numbers: Object.create(null),
|
|
69
|
+
hidden: {}, escaped: {}, code: {}, dropped: [] }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Sample: "- > ```\n > [id]: literal\n > ```" matches an item, then a quote, before its fence; nested lines hold no front matter.
|
|
73
|
+
function blockPass(lines, state, emit, collect, nested, onProgress, job) {
|
|
74
|
+
// A job's due() stops the pass at a line boundary, and its saved state is what the next slice resumes with.
|
|
75
|
+
var frames = []
|
|
76
|
+
var leaf = null
|
|
77
|
+
var pending = null
|
|
78
|
+
var serial = 0
|
|
79
|
+
var lastQuote = -1
|
|
80
|
+
// No listener means no heartbeat: a parse without onProgress never beats.
|
|
81
|
+
var beatEvery = onProgress !== undefined ? PROGRESS_EVENTS : 0
|
|
82
|
+
var sinceBeat = 0
|
|
83
|
+
var beatAt = beatEvery !== 0 ? clock() : 0
|
|
84
|
+
// Leading frames now open that share frame 0's type (items or quotes), where the line's text starts after them, and the frames found open.
|
|
85
|
+
var lead = { n: 0, here: 0, lazy: false, retained: 0, at: 0, pad: 0, col: 0, raw: "" }
|
|
86
|
+
function send(kind, index, text, top, display, info) {
|
|
87
|
+
if (emit !== undefined)
|
|
88
|
+
emit({ type: "line", kind: kind, index: index, text: text,
|
|
89
|
+
outer: top, display: display, info: info || "", chain: frames, lead: lead,
|
|
90
|
+
figureKind: kind === "fenceOpen" ? figureKind(info) : "" })
|
|
91
|
+
// A pass carrying the heartbeat proves it is moving every few thousand sends or every half second.
|
|
92
|
+
if (beatEvery !== 0) {
|
|
93
|
+
sinceBeat++
|
|
94
|
+
if (sinceBeat >= beatEvery || (sinceBeat % CLOCK_EVENTS === 0 && clock() - beatAt >= PROGRESS_MS)) {
|
|
95
|
+
sinceBeat = 0
|
|
96
|
+
beatAt = clock()
|
|
97
|
+
onProgress()
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function finishNote() {
|
|
102
|
+
if (pending !== null && pending.note !== undefined)
|
|
103
|
+
pending.note.text = pending.body.join("\n")
|
|
104
|
+
pending = null
|
|
105
|
+
}
|
|
106
|
+
var due = job !== undefined ? job.due : undefined
|
|
107
|
+
var from = 0
|
|
108
|
+
if (job !== undefined && job.saved !== null) {
|
|
109
|
+
from = job.saved.at
|
|
110
|
+
frames = job.saved.frames
|
|
111
|
+
leaf = job.saved.leaf
|
|
112
|
+
pending = job.saved.pending
|
|
113
|
+
serial = job.saved.serial
|
|
114
|
+
lastQuote = job.saved.lastQuote
|
|
115
|
+
lead = job.saved.lead
|
|
116
|
+
}
|
|
117
|
+
for (var i = from; i < lines.length; i++) {
|
|
118
|
+
if (due !== undefined && due()) {
|
|
119
|
+
job.saved = { at: i, frames: frames, leaf: leaf, pending: pending, serial: serial, lastQuote: lastQuote, lead: lead }
|
|
120
|
+
job.paused = true
|
|
121
|
+
return
|
|
122
|
+
}
|
|
123
|
+
var raw = lines[i]
|
|
124
|
+
var view = { at: 0, padding: 0, column: 0 }
|
|
125
|
+
var rawBlank = raw.trim().length === 0
|
|
126
|
+
var matched = 0
|
|
127
|
+
var leadHere = 0
|
|
128
|
+
lead = { n: lead.n, here: 0, lazy: false, retained: 0, at: 0, pad: 0, col: 0, raw: raw }
|
|
129
|
+
var display = raw
|
|
130
|
+
var rule = ruleSuffix(raw)
|
|
131
|
+
var previousTop = frames.length > 0 ? frames[0] : null
|
|
132
|
+
for (; matched < frames.length; matched++) {
|
|
133
|
+
var frame = frames[matched]
|
|
134
|
+
if (frame.type === "quote") {
|
|
135
|
+
var quote = Container.quoteAt(raw, view)
|
|
136
|
+
if (quote < 0)
|
|
137
|
+
break
|
|
138
|
+
Container.takeQuote(raw, view, quote)
|
|
139
|
+
} else {
|
|
140
|
+
var indent = Container.indentationAt(raw, view, frame.contentCol).width
|
|
141
|
+
if (indent >= frame.contentCol && frame.sealed !== true) {
|
|
142
|
+
Container.takeIndent(raw, view, frame.contentCol)
|
|
143
|
+
} else if (rawBlank || raw.slice(view.at).trim().length === 0) {
|
|
144
|
+
// An item opened on a blank line holds at most that one blank line, so a second seals it against more content.
|
|
145
|
+
if (frame.bareAt === i - 1)
|
|
146
|
+
frame.sealed = true
|
|
147
|
+
if (matched > lastQuote) {
|
|
148
|
+
matched = frames.length
|
|
149
|
+
break
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
break
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (frame.type === frames[0].type && leadHere === matched) {
|
|
156
|
+
lead.here = ++leadHere
|
|
157
|
+
lead.at = view.at
|
|
158
|
+
lead.pad = view.padding
|
|
159
|
+
lead.col = view.column
|
|
160
|
+
}
|
|
161
|
+
if (matched === 0)
|
|
162
|
+
display = Container.textAt(raw, view)
|
|
163
|
+
}
|
|
164
|
+
var unmatchedText = Container.textAt(raw, view)
|
|
165
|
+
var startsQuote = Container.quoteAt(raw, view) >= 0
|
|
166
|
+
var startsList = Container.listAt(raw, view)
|
|
167
|
+
var siblingList = matched < frames.length && frames[matched].type === "list" && startsList !== null
|
|
168
|
+
var listInterrupts = startsList !== null && (siblingList || ((!startsList.ordered
|
|
169
|
+
|| startsList.start === LIST_INTERRUPT_START) && raw.slice(startsList.markerEnd).trim().length > 0))
|
|
170
|
+
var startsFence = Leaf.fenceOpen(unmatchedText)
|
|
171
|
+
var thematic = Leaf.isThematic(unmatchedText)
|
|
172
|
+
var setext = leaf !== null && leaf.kind === "paragraph" && matched === frames.length && Leaf.isSetext(unmatchedText)
|
|
173
|
+
var lazy = leaf !== null && leaf.kind === "paragraph" && unmatchedText.trim().length > 0
|
|
174
|
+
&& !startsQuote && !listInterrupts && startsFence === null && !thematic
|
|
175
|
+
&& !/^ {0,3}#{1,6}(?:\s|$)/.test(unmatchedText)
|
|
176
|
+
if (matched < frames.length && !lazy) {
|
|
177
|
+
frames.length = matched
|
|
178
|
+
lead.n = Math.min(lead.n, matched)
|
|
179
|
+
lastQuote = -1
|
|
180
|
+
for (var q = 0; q < frames.length; q++) {
|
|
181
|
+
if (frames[q].type === "quote")
|
|
182
|
+
lastQuote = q
|
|
183
|
+
}
|
|
184
|
+
leaf = null
|
|
185
|
+
}
|
|
186
|
+
var owner = frames.length > 0 ? frames[frames.length - 1].id : 0
|
|
187
|
+
var fenced = leaf !== null && leaf.kind === "fence" && leaf.owner === owner
|
|
188
|
+
lead.retained = frames.length
|
|
189
|
+
lead.lazy = lazy && matched < frames.length
|
|
190
|
+
if (!fenced && !lazy && !setext) {
|
|
191
|
+
while (true) {
|
|
192
|
+
var quoteIndent = Container.quoteAt(raw, view)
|
|
193
|
+
var marker = quoteIndent < 0 ? Container.listAt(raw, view) : null
|
|
194
|
+
var ruleHere = rule.count >= MIN_RULE_MARKS && view.at >= rule.start
|
|
195
|
+
&& marker !== null && marker.indent <= MAX_RULE_INDENT
|
|
196
|
+
if (quoteIndent < 0 && (marker === null || thematic || ruleHere))
|
|
197
|
+
break
|
|
198
|
+
var next = { id: ++serial, type: quoteIndent >= 0 ? "quote" : "list" }
|
|
199
|
+
if (quoteIndent >= 0) {
|
|
200
|
+
Container.takeQuote(raw, view, quoteIndent)
|
|
201
|
+
lastQuote = frames.length
|
|
202
|
+
} else {
|
|
203
|
+
next.contentCol = marker.contentCol
|
|
204
|
+
next.ordered = marker.ordered
|
|
205
|
+
next.mark = marker.mark
|
|
206
|
+
next.start = marker.start
|
|
207
|
+
next.bareAt = raw.slice(marker.markerEnd).trim().length === 0 ? i : -1
|
|
208
|
+
next.group = frames.length === 0 && previousTop !== null
|
|
209
|
+
&& previousTop.type === "list" && previousTop.mark === marker.mark
|
|
210
|
+
? previousTop.group : next.id
|
|
211
|
+
Container.takeList(raw, view, marker)
|
|
212
|
+
}
|
|
213
|
+
if (lead.n === frames.length && (frames.length === 0 || next.type === frames[0].type)) {
|
|
214
|
+
lead.here = ++lead.n
|
|
215
|
+
leadHere = lead.n
|
|
216
|
+
lead.at = view.at
|
|
217
|
+
lead.pad = view.padding
|
|
218
|
+
lead.col = view.column
|
|
219
|
+
}
|
|
220
|
+
frames.push(next)
|
|
221
|
+
if (frames.length > NESTING_LIMIT) {
|
|
222
|
+
state.deep = true
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
owner = next.id
|
|
226
|
+
leaf = null
|
|
227
|
+
if (frames.length === 1)
|
|
228
|
+
display = Container.textAt(raw, view)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
var top = frames.length > 0 ? frames[0] : null
|
|
232
|
+
var text = Container.textAt(raw, view)
|
|
233
|
+
// Sample: "> foo\nbar\n===" keeps its lazy "===" as text, so the renderer cannot take it for a setext underline.
|
|
234
|
+
if (lazy && matched < frames.length && Leaf.isSetext(unmatchedText)) {
|
|
235
|
+
text = text.replace(SETEXT_MARK, "$1\\$2")
|
|
236
|
+
display = display.replace(SETEXT_MARK, "$1\\$2")
|
|
237
|
+
}
|
|
238
|
+
if (fenced) {
|
|
239
|
+
var closer = Leaf.fenceOpen(text)
|
|
240
|
+
var closed = closer !== null && closer.info === "" && closer.tick === leaf.tick && closer.len >= leaf.len
|
|
241
|
+
state.code[i] = true
|
|
242
|
+
send(closed ? "fenceClose" : "fenceBody", i, closed ? text : Container.unindent(text, leaf.indent), top, display)
|
|
243
|
+
if (closed)
|
|
244
|
+
leaf = null
|
|
245
|
+
continue
|
|
246
|
+
}
|
|
247
|
+
if (pending !== null) {
|
|
248
|
+
if (collect && pending.owner === owner && pending.note !== undefined
|
|
249
|
+
&& Container.indentationAt(raw, view).width >= CODE_INDENT) {
|
|
250
|
+
pending.body.push(text.replace(/^\s+/, ""))
|
|
251
|
+
Refs.hideDefinition(state, i, i)
|
|
252
|
+
send("hidden", i, text, top, display)
|
|
253
|
+
continue
|
|
254
|
+
}
|
|
255
|
+
if (collect && pending.owner === owner && pending.ref !== undefined && Leaf.fenceOpen(text) === null) {
|
|
256
|
+
// Sample: '[cover].png "Title"' accepts a destination only when the complete line parses.
|
|
257
|
+
var destination = Refs.readDefinitionParts(text.trim())
|
|
258
|
+
if (destination.target !== "") {
|
|
259
|
+
Refs.storeDefinition(state.defs, pending.ref.key, destination.target)
|
|
260
|
+
Refs.hideDefinition(state, pending.index, i)
|
|
261
|
+
Refs.hideTitle(lines, i + 1, state, !destination.titled, frames)
|
|
262
|
+
// Replay the opener's paragraph state so its lazy destination keeps the same containers.
|
|
263
|
+
state.hidden[pending.index] = "paragraph"
|
|
264
|
+
pending = null
|
|
265
|
+
leaf = null
|
|
266
|
+
send("hidden", i, text, top, display)
|
|
267
|
+
continue
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
finishNote()
|
|
271
|
+
}
|
|
272
|
+
if (state.hidden.hasOwnProperty(i)) {
|
|
273
|
+
leaf = state.hidden[i] === "paragraph" ? { kind: "paragraph", owner: owner } : null
|
|
274
|
+
send("hidden", i, text, top, display)
|
|
275
|
+
continue
|
|
276
|
+
}
|
|
277
|
+
var front = i === 0 && nested !== true ? Front.closeAt(lines) : -1
|
|
278
|
+
if (front > 0) {
|
|
279
|
+
i = Front.sendFront(lines, front, send, state)
|
|
280
|
+
leaf = null
|
|
281
|
+
continue
|
|
282
|
+
}
|
|
283
|
+
var open = Leaf.fenceOpen(text)
|
|
284
|
+
if (open !== null) {
|
|
285
|
+
leaf = { kind: "fence", owner: owner, tick: open.tick, len: open.len, indent: open.indent }
|
|
286
|
+
state.code[i] = true
|
|
287
|
+
send("fenceOpen", i, text, top, display, open.info)
|
|
288
|
+
continue
|
|
289
|
+
}
|
|
290
|
+
// Sample input: "$$x^2$$" and "$$\nx^2\n$$" emit figures, with trailing prose retained.
|
|
291
|
+
var math = top === null ? Maths.displayAt(lines, i, text) : null
|
|
292
|
+
if (math !== null) {
|
|
293
|
+
for (var m = i; m <= math.to; m++)
|
|
294
|
+
state.code[m] = true
|
|
295
|
+
if (emit !== undefined)
|
|
296
|
+
emit({ type: "figure", kind: "math", source: math.source, display: true })
|
|
297
|
+
i = math.to
|
|
298
|
+
if (math.tail.length > 0)
|
|
299
|
+
send("run", i, math.tail, null, math.tail)
|
|
300
|
+
leaf = math.tail.trim().length > 0 ? { kind: "paragraph", owner: owner } : null
|
|
301
|
+
continue
|
|
302
|
+
}
|
|
303
|
+
var blank = text.trim().length === 0
|
|
304
|
+
var width = Container.indentationAt(raw, view).width
|
|
305
|
+
if (leaf !== null && leaf.kind === "code" && (blank || width >= CODE_INDENT)) {
|
|
306
|
+
state.code[i] = true
|
|
307
|
+
Container.takeIndent(raw, view, CODE_INDENT)
|
|
308
|
+
send("codeLine", i, Container.textAt(raw, view), top, display)
|
|
309
|
+
continue
|
|
310
|
+
}
|
|
311
|
+
if (leaf !== null && leaf.kind === "code") {
|
|
312
|
+
send("codeEnd", i, "", top, display)
|
|
313
|
+
leaf = null
|
|
314
|
+
}
|
|
315
|
+
if ((leaf === null || leaf.kind !== "paragraph") && !blank && width >= CODE_INDENT) {
|
|
316
|
+
leaf = { kind: "code", owner: owner }
|
|
317
|
+
state.code[i] = true
|
|
318
|
+
Container.takeIndent(raw, view, CODE_INDENT)
|
|
319
|
+
send("codeLine", i, Container.textAt(raw, view), top, display)
|
|
320
|
+
continue
|
|
321
|
+
}
|
|
322
|
+
if (collect && leaf === null && !blank) {
|
|
323
|
+
var note = Refs.readFootnoteDefinition(text)
|
|
324
|
+
// Outside a container a definition may span lines; inside one it is read a line at a time.
|
|
325
|
+
var multi = note === null && top === null ? Refs.definitionAt(lines, i) : null
|
|
326
|
+
var ref = note === null && top !== null ? Refs.readDefinition(text) : null
|
|
327
|
+
if (multi !== null) {
|
|
328
|
+
Refs.storeDefinition(state.defs, multi.key, multi.target)
|
|
329
|
+
Refs.hideDefinition(state, i, multi.end)
|
|
330
|
+
i = multi.end
|
|
331
|
+
continue
|
|
332
|
+
}
|
|
333
|
+
if (note !== null) {
|
|
334
|
+
var stored = hasOwn.call(state.notes, note.id) ? null : { text: note.text }
|
|
335
|
+
if (stored !== null) {
|
|
336
|
+
state.notes[note.id] = stored
|
|
337
|
+
state.numbers[note.id] = 0
|
|
338
|
+
}
|
|
339
|
+
pending = { owner: owner, note: stored || {}, body: [note.text] }
|
|
340
|
+
Refs.hideDefinition(state, i, i)
|
|
341
|
+
send("hidden", i, text, top, display)
|
|
342
|
+
continue
|
|
343
|
+
}
|
|
344
|
+
if (ref !== null) {
|
|
345
|
+
if (ref.target !== "") {
|
|
346
|
+
Refs.storeDefinition(state.defs, ref.key, ref.target)
|
|
347
|
+
Refs.hideDefinition(state, i, i)
|
|
348
|
+
Refs.hideTitle(lines, i + 1, state, !ref.titled, frames)
|
|
349
|
+
send("hidden", i, text, top, display)
|
|
350
|
+
continue
|
|
351
|
+
}
|
|
352
|
+
pending = { owner: owner, ref: ref, index: i }
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
var heading = top === null ? Leaf.atxHeading(text) : null
|
|
356
|
+
if (heading !== null) {
|
|
357
|
+
if (emit !== undefined)
|
|
358
|
+
emit({ type: "heading", level: heading.level, text: heading.text })
|
|
359
|
+
leaf = null
|
|
360
|
+
continue
|
|
361
|
+
}
|
|
362
|
+
var aligns = top === null && text.indexOf("|") >= 0 && i + 1 < lines.length ? Leaf.delimAligns(lines[i + 1]) : null
|
|
363
|
+
var header = aligns === null ? null : Leaf.splitRow(text)
|
|
364
|
+
// The delimiter row must match the header's cell count; a row ends the table at a blank line or another block.
|
|
365
|
+
if (header !== null && header.length === aligns.length) {
|
|
366
|
+
var rows = []
|
|
367
|
+
i += 2
|
|
368
|
+
while (i < lines.length && lines[i].trim().length > 0 && !Container.startsBlock(lines[i]))
|
|
369
|
+
rows.push(Leaf.splitRow(lines[i++]))
|
|
370
|
+
if (emit !== undefined)
|
|
371
|
+
emit({ type: "table", head: header, aligns: aligns, rows: rows })
|
|
372
|
+
i--
|
|
373
|
+
leaf = null
|
|
374
|
+
continue
|
|
375
|
+
}
|
|
376
|
+
if (Refs.killDefinition(text) !== text)
|
|
377
|
+
state.escaped[i] = true
|
|
378
|
+
send(setext && top === null ? "setext" : "run", i, text, top, display)
|
|
379
|
+
leaf = blank || setext || Leaf.isThematic(text) || /^ {0,3}#{1,6}(?:\s|$)/.test(text) ? null : { kind: "paragraph", owner: owner }
|
|
380
|
+
}
|
|
381
|
+
finishNote()
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function collectReferences(source) {
|
|
385
|
+
var state = referenceState()
|
|
386
|
+
blockPass(Html.documentText(source).split("\n"), state, undefined, true)
|
|
387
|
+
return state
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// A parse that stops between lines: run(due) answers the blocks when both passes are done, or null when due() stopped it.
|
|
391
|
+
function blockJob(source, dir, chrome, ink, headCount, onHead, onProgress) {
|
|
392
|
+
var lines = Html.documentText(source).split("\n")
|
|
393
|
+
var state = referenceState()
|
|
394
|
+
var collecting = { due: undefined, saved: null, paused: false }
|
|
395
|
+
var rendering = { due: undefined, saved: null, paused: false }
|
|
396
|
+
var writer = null
|
|
397
|
+
var project = null
|
|
398
|
+
var answer = null
|
|
399
|
+
function run(due) {
|
|
400
|
+
if (answer !== null)
|
|
401
|
+
return answer
|
|
402
|
+
if (writer === null) {
|
|
403
|
+
collecting.due = due
|
|
404
|
+
collecting.paused = false
|
|
405
|
+
// The collecting pass carries the heartbeat too, so a slow reference scan still proves it is moving.
|
|
406
|
+
blockPass(lines, state, undefined, true, undefined, onProgress, collecting)
|
|
407
|
+
if (collecting.paused)
|
|
408
|
+
return null
|
|
409
|
+
if (state.deep === true) {
|
|
410
|
+
answer = [{ type: "deep", limit: NESTING_LIMIT }]
|
|
411
|
+
return answer
|
|
412
|
+
}
|
|
413
|
+
writer = Document.writer(state, dir, chrome, ink, blockPass)
|
|
414
|
+
project = onHead !== undefined && headCount > 0 ? writer.headed(headCount, onHead) : writer.project
|
|
415
|
+
}
|
|
416
|
+
rendering.due = due
|
|
417
|
+
rendering.paused = false
|
|
418
|
+
blockPass(lines, state, project, false, undefined, onProgress, rendering)
|
|
419
|
+
if (rendering.paused)
|
|
420
|
+
return null
|
|
421
|
+
answer = writer.finish()
|
|
422
|
+
return answer
|
|
423
|
+
}
|
|
424
|
+
return { run: run }
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function blocks(source, dir, chrome, ink, headCount, onHead, onProgress) {
|
|
428
|
+
var job = blockJob(source, dir, chrome, ink, headCount, onHead, onProgress)
|
|
429
|
+
return job.run(undefined)
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function prepare(source, dir, defs, chrome, ink) {
|
|
433
|
+
var lines = Html.documentText(source).split("\n")
|
|
434
|
+
var state = referenceState()
|
|
435
|
+
blockPass(lines, state, undefined, true)
|
|
436
|
+
return Document.preparedText(lines, state, dir, defs, chrome, ink)
|
|
437
|
+
}
|
package/ui/js/MdBreak.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdBreak: the line-level readers of the inline scan, hard breaks and thematic break lines.
|
|
4
|
+
.import "MdEmph.js" as Emph
|
|
5
|
+
.import "MdLeaf.js" as Leaf
|
|
6
|
+
|
|
7
|
+
var HARD_BREAK_SPACES = 2
|
|
8
|
+
var MAX_MARKER_LENGTH = 10
|
|
9
|
+
|
|
10
|
+
// Sample input: "foo \nbar" and "foo\\\nbar" break the line; "foo \nbar" and a paragraph's last newline do not.
|
|
11
|
+
function lineBreak(body, i, out, delims, endParagraph) {
|
|
12
|
+
var slash = body.charAt(i) === "\\"
|
|
13
|
+
var next = slash ? i + 2 : i + 1
|
|
14
|
+
var spaces = 0
|
|
15
|
+
while (!slash && out.length > 0 && out[out.length - 1] === " ") {
|
|
16
|
+
out.pop()
|
|
17
|
+
spaces++
|
|
18
|
+
}
|
|
19
|
+
while (next < body.length && (body.charAt(next) === " " || body.charAt(next) === "\t"))
|
|
20
|
+
next++
|
|
21
|
+
// A blank line ends the paragraph, and no emphasis mark pairs and no bracket pair closes across it.
|
|
22
|
+
if (next < body.length && body.charAt(next) === "\n") {
|
|
23
|
+
Emph.process(delims, delims.bottom)
|
|
24
|
+
delims.bottom = delims.length
|
|
25
|
+
endParagraph()
|
|
26
|
+
}
|
|
27
|
+
if (next < body.length && body.charAt(next) !== "\n" && (slash || spaces >= HARD_BREAK_SPACES)) {
|
|
28
|
+
out.push("<br />")
|
|
29
|
+
return next
|
|
30
|
+
}
|
|
31
|
+
if (slash)
|
|
32
|
+
out.push("\\")
|
|
33
|
+
out.push("\n")
|
|
34
|
+
return slash ? i + 2 : i + 1
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var RULE_LINE_INDENT = 3
|
|
38
|
+
|
|
39
|
+
// Sample input: "a\n * * *\nb" at the second star is a thematic break line, which the renderer draws as a rule.
|
|
40
|
+
function isRuleLine(body, at) {
|
|
41
|
+
var from = at
|
|
42
|
+
while (from > 0 && at - from < RULE_LINE_INDENT && body.charAt(from - 1) === " ")
|
|
43
|
+
from--
|
|
44
|
+
if (from > 0 && body.charAt(from - 1) !== "\n")
|
|
45
|
+
return false
|
|
46
|
+
var end = body.indexOf("\n", at)
|
|
47
|
+
return Leaf.isThematic(body.slice(from, end < 0 ? body.length : end))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
var LIST_MARK = /^(?:[-+*]|\d{1,9}[.)])$/
|
|
51
|
+
|
|
52
|
+
function skipBlanksBack(body, at) {
|
|
53
|
+
var p = at
|
|
54
|
+
while (p >= 0 && (body.charAt(p) === " " || body.charAt(p) === "\t"))
|
|
55
|
+
p--
|
|
56
|
+
return p
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Sample input: "- > q" at the ">" is a quote mark inside an item; "a > b" is not. last is the previous mark's index.
|
|
60
|
+
function quoteMarkAt(body, at, last) {
|
|
61
|
+
var p = skipBlanksBack(body, at - 1)
|
|
62
|
+
if (p < 0 || body.charAt(p) === "\n" || p === last)
|
|
63
|
+
return true
|
|
64
|
+
var from = p
|
|
65
|
+
while (from > 0 && /\S/.test(body.charAt(from - 1)))
|
|
66
|
+
from--
|
|
67
|
+
if (p - from >= MAX_MARKER_LENGTH || p === at - 1 || !LIST_MARK.test(body.slice(from, p + 1)))
|
|
68
|
+
return false
|
|
69
|
+
var before = skipBlanksBack(body, from - 1)
|
|
70
|
+
return before < 0 || body.charAt(before) === "\n" || before === last
|
|
71
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdChunks: a long list as consecutive blocks the outer ListView draws lazily.
|
|
4
|
+
.import "MdLeaf.js" as Leaf
|
|
5
|
+
.import "MarkdownLists.js" as Lists
|
|
6
|
+
|
|
7
|
+
var ARRAY_FIELDS = ["depths", "markers", "gaps", "parts"]
|
|
8
|
+
|
|
9
|
+
function openRun(ordered) {
|
|
10
|
+
return { ordered: ordered, widest: "" }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Sample input: a list "9.", "10." with a bullet under the first answers, at each chunk edge k, the runs still open after k entries.
|
|
14
|
+
function openRuns(list, size) {
|
|
15
|
+
var open = []
|
|
16
|
+
var previous = -1
|
|
17
|
+
var edges = {}
|
|
18
|
+
for (var k = 0; k < list.items.length; k++) {
|
|
19
|
+
if (k % size === 0)
|
|
20
|
+
edges[k] = open.slice()
|
|
21
|
+
var depth = list.depths !== undefined ? list.depths[k] : 0
|
|
22
|
+
var given = list.markers !== undefined ? list.markers[k] : list.ordered ? (list.start + k) + "." : ""
|
|
23
|
+
// The runs open here are the ones MarkdownLists.layout opens, since both step through runStep.
|
|
24
|
+
var run = Lists.runStep(open, previous, depth, given, list.ordered === true, openRun)
|
|
25
|
+
if (run.ordered && given.length > run.widest.length)
|
|
26
|
+
run.widest = given
|
|
27
|
+
previous = depth
|
|
28
|
+
}
|
|
29
|
+
edges[list.items.length] = open.slice()
|
|
30
|
+
return edges
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// A run as the chunk carries it: its kind and the widest marker over the whole list, which fixes its text column.
|
|
34
|
+
function carried(runs) {
|
|
35
|
+
return runs.map(function (run) { return { ordered: run.ordered, marker: run.widest } })
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Sample input: a list of 40 items answers two blocks of 32 and 8, numbering continued through start, last keeping one marker column width.
|
|
39
|
+
function chunkList(list) {
|
|
40
|
+
if (list.items.length <= Leaf.LIST_CHUNK_ITEMS)
|
|
41
|
+
return [list]
|
|
42
|
+
var size = Leaf.LIST_CHUNK_ITEMS
|
|
43
|
+
var chunks = []
|
|
44
|
+
var last = list.start + list.items.length - 1
|
|
45
|
+
// Entries of a nested list are not numbered items, so the last number is the last one a top-level marker carries.
|
|
46
|
+
for (var m = 0; list.depths !== undefined && m < list.items.length; m++) {
|
|
47
|
+
if (list.depths[m] === 0 && Lists.ORDERED_START.test(list.markers[m]))
|
|
48
|
+
last = parseInt(list.markers[m], 10)
|
|
49
|
+
}
|
|
50
|
+
var edges = openRuns(list, size)
|
|
51
|
+
for (var at = 0; at < list.items.length; at += size) {
|
|
52
|
+
var chunk = { type: "list", ordered: list.ordered, start: list.start + at, items: list.items.slice(at, at + size), last: last, joined: at > 0 }
|
|
53
|
+
// Each field of a nested, loose or part-holding list is cut at the same places, whichever of them the list carries.
|
|
54
|
+
for (var f = 0; f < ARRAY_FIELDS.length; f++) {
|
|
55
|
+
var name = ARRAY_FIELDS[f]
|
|
56
|
+
if (list[name] !== undefined)
|
|
57
|
+
chunk[name] = list[name].slice(at, at + size)
|
|
58
|
+
}
|
|
59
|
+
// A later chunk's first entry keeps the gap above it that the whole list gave it, a nested list's parent being the entry before.
|
|
60
|
+
if (at > 0 && list.gaps !== undefined) {
|
|
61
|
+
var deeper = list.depths !== undefined && list.depths[at] > list.depths[at - 1]
|
|
62
|
+
chunk.gaps[0] = list.gaps[at] || (deeper && list.gaps[at - 1])
|
|
63
|
+
}
|
|
64
|
+
// The runs open at each end keep the text column the whole list gives them, so a sublist at a seam does not jump.
|
|
65
|
+
chunk.carry = carried(edges[at])
|
|
66
|
+
chunk.tail = carried(edges[Math.min(at + size, list.items.length)])
|
|
67
|
+
chunks.push(chunk)
|
|
68
|
+
}
|
|
69
|
+
return chunks
|
|
70
|
+
}
|