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,137 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
.import "MdLeaf.js" as Leaf
|
|
4
|
+
|
|
5
|
+
// Prefix readers use byte offsets and absolute tab columns, without copying the remaining line.
|
|
6
|
+
var CODE_INDENT = 4
|
|
7
|
+
var MAX_MARKER_INDENT = 3
|
|
8
|
+
var MAX_MARKER_DIGITS = 9
|
|
9
|
+
var DECIMAL_RADIX = 10
|
|
10
|
+
var MAX_GAP_SCAN = CODE_INDENT + 1
|
|
11
|
+
var MIN_MARKER_GAP = 1
|
|
12
|
+
|
|
13
|
+
// Sample: a tab after two spaces advances to column four.
|
|
14
|
+
function indentationAt(line, view, limit) {
|
|
15
|
+
var stop = limit === undefined ? CODE_INDENT : limit
|
|
16
|
+
var at = view.at
|
|
17
|
+
var width = view.padding
|
|
18
|
+
while (at < line.length && width < stop) {
|
|
19
|
+
var c = line.charAt(at)
|
|
20
|
+
if (c !== " " && c !== "\t")
|
|
21
|
+
break
|
|
22
|
+
width += c === "\t" ? CODE_INDENT - (view.column + width) % CODE_INDENT : 1
|
|
23
|
+
at++
|
|
24
|
+
}
|
|
25
|
+
return { end: at, width: width }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function takeIndent(line, view, wanted) {
|
|
29
|
+
var width = Math.min(view.padding, wanted)
|
|
30
|
+
view.padding -= width
|
|
31
|
+
while (view.at < line.length && width < wanted) {
|
|
32
|
+
var c = line.charAt(view.at)
|
|
33
|
+
if (c !== " " && c !== "\t")
|
|
34
|
+
break
|
|
35
|
+
var step = c === "\t" ? CODE_INDENT - (view.column + width) % CODE_INDENT : 1
|
|
36
|
+
view.at++
|
|
37
|
+
width += step
|
|
38
|
+
}
|
|
39
|
+
view.padding += Math.max(0, width - wanted)
|
|
40
|
+
view.column += Math.min(width, wanted)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Sample: ">\ttext" consumes one column after > and retains the tab's remaining columns.
|
|
44
|
+
function quoteAt(line, view) {
|
|
45
|
+
var indent = indentationAt(line, view)
|
|
46
|
+
return indent.width <= MAX_MARKER_INDENT && line.charAt(indent.end) === ">" ? indent.width : -1
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function takeQuote(line, view, indent) {
|
|
50
|
+
takeIndent(line, view, indent)
|
|
51
|
+
view.at++
|
|
52
|
+
view.column++
|
|
53
|
+
if (line.charAt(view.at) === " " || line.charAt(view.at) === "\t")
|
|
54
|
+
takeIndent(line, view, 1)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Sample: "10.\ttext" starts content at column four, and five gap columns leave indented code.
|
|
58
|
+
function listAt(line, view) {
|
|
59
|
+
var indentation = indentationAt(line, view)
|
|
60
|
+
var at = indentation.end
|
|
61
|
+
var indent = indentation.width
|
|
62
|
+
if (indent > MAX_MARKER_INDENT)
|
|
63
|
+
return null
|
|
64
|
+
var start = at
|
|
65
|
+
var c = line.charAt(at)
|
|
66
|
+
var ordered = c >= "0" && c <= "9"
|
|
67
|
+
if (ordered) {
|
|
68
|
+
while (at - start < MAX_MARKER_DIGITS && line.charAt(at) >= "0" && line.charAt(at) <= "9")
|
|
69
|
+
at++
|
|
70
|
+
if (line.charAt(at) !== "." && line.charAt(at) !== ")")
|
|
71
|
+
return null
|
|
72
|
+
} else if (c !== "-" && c !== "*" && c !== "+") {
|
|
73
|
+
return null
|
|
74
|
+
}
|
|
75
|
+
var mark = line.charAt(at)
|
|
76
|
+
at++
|
|
77
|
+
if (at < line.length && line.charAt(at) !== " " && line.charAt(at) !== "\t")
|
|
78
|
+
return null
|
|
79
|
+
var markerWidth = at - start
|
|
80
|
+
var gapView = { at: at, padding: 0, column: view.column + indent + markerWidth }
|
|
81
|
+
var gap = line.slice(at).trim().length === 0 ? MIN_MARKER_GAP : indentationAt(line, gapView, MAX_GAP_SCAN).width
|
|
82
|
+
var consumedGap = gap > CODE_INDENT ? MIN_MARKER_GAP : gap
|
|
83
|
+
return { indent: indent, ordered: ordered, mark: mark,
|
|
84
|
+
start: ordered ? parseInt(line.slice(start, at - 1), DECIMAL_RADIX) : 0,
|
|
85
|
+
contentCol: indent + markerWidth + consumedGap, markerEnd: at,
|
|
86
|
+
markerColumn: gapView.column, gap: consumedGap }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function takeList(line, view, marker) {
|
|
90
|
+
view.at = marker.markerEnd
|
|
91
|
+
view.padding = 0
|
|
92
|
+
view.column = marker.markerColumn
|
|
93
|
+
takeIndent(line, view, marker.gap)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Sample input: "\tbar" read at column 2 answers " bar": the leading tab expands to its own stop, so no importer miscounts it.
|
|
97
|
+
function expandLead(text, column) {
|
|
98
|
+
var out = ""
|
|
99
|
+
var at = 0
|
|
100
|
+
var col = column
|
|
101
|
+
while (at < text.length && (text.charAt(at) === " " || text.charAt(at) === "\t")) {
|
|
102
|
+
var step = text.charAt(at) === "\t" ? CODE_INDENT - col % CODE_INDENT : 1
|
|
103
|
+
out += " ".repeat(step)
|
|
104
|
+
col += step
|
|
105
|
+
at++
|
|
106
|
+
}
|
|
107
|
+
return out + text.slice(at)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function textAt(line, view) {
|
|
111
|
+
return " ".repeat(view.padding) + line.slice(view.at)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function readListMarker(line) {
|
|
115
|
+
var view = { at: 0, padding: 0, column: 0 }
|
|
116
|
+
var marker = listAt(String(line), view)
|
|
117
|
+
if (marker === null)
|
|
118
|
+
return null
|
|
119
|
+
takeList(line, view, marker)
|
|
120
|
+
return { indent: marker.indent, ordered: marker.ordered, start: marker.start,
|
|
121
|
+
contentCol: marker.contentCol, text: textAt(line, view) }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Sample input: " aaa" with 1 answers " aaa"; a fence opened at that indent drops up to as many spaces from each body line.
|
|
125
|
+
function unindent(text, width) {
|
|
126
|
+
var at = 0
|
|
127
|
+
while (at < width && text.charAt(at) === " ")
|
|
128
|
+
at++
|
|
129
|
+
return text.slice(at)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Sample input: "> q", "- item", "```", "# h" and "***" start a block, so a table stops before them; "bar" does not.
|
|
133
|
+
function startsBlock(line) {
|
|
134
|
+
var view = { at: 0, padding: 0, column: 0 }
|
|
135
|
+
return quoteAt(line, view) >= 0 || listAt(line, view) !== null || Leaf.fenceOpen(line) !== null
|
|
136
|
+
|| Leaf.atxHeading(line) !== null || Leaf.isThematic(line)
|
|
137
|
+
}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// Serialize the block reader's events; all container and code decisions belong to MdBlocks.
|
|
4
|
+
.import "MdLeaf.js" as Leaf
|
|
5
|
+
.import "MdContainer.js" as Container
|
|
6
|
+
.import "MdRun.js" as Run
|
|
7
|
+
.import "MdHtmlImage.js" as HtmlImage
|
|
8
|
+
.import "MdParagraphs.js" as MdParagraphs
|
|
9
|
+
.import "MdHtmlBlock.js" as HtmlBlock
|
|
10
|
+
.import "MdHtmlHeading.js" as HtmlHeading
|
|
11
|
+
.import "MdItems.js" as Items
|
|
12
|
+
.import "MdChunks.js" as Chunks
|
|
13
|
+
.import "MdResolve.js" as Res
|
|
14
|
+
.import "MdMath.js" as Maths
|
|
15
|
+
.import "MdEntity.js" as Ent
|
|
16
|
+
|
|
17
|
+
// The importer joins an HTML block onto the paragraph above it, so a block-level raw tag after a blank line starts its own run.
|
|
18
|
+
// Sample input: "Body.\n\n<div>x</div>" splits before the div; "<table>\n<tr>" keeps its rows together.
|
|
19
|
+
var HTML_BLOCK_AFTER_BLANK = /\n[ \t]*\n+(?= {0,3}<(?:p|div|h[1-6]|hr|table|ul|ol|blockquote|pre)(?=[\s>\/]))/i
|
|
20
|
+
|
|
21
|
+
// Sample input: "one<br />\n two" collapses to "one<br />two"; a blank line after the break stays a paragraph break.
|
|
22
|
+
var BREAK_SOFT_NEWLINE = /(<br \/>)[ \t]*\n(?![ \t]*\n)[ \t]*/g
|
|
23
|
+
|
|
24
|
+
// Items and quotes hold their blocks as parts down to this many levels; deeper text stays one markdown text, which keeps a deep chain linear.
|
|
25
|
+
var NEST_LIMIT = 8
|
|
26
|
+
|
|
27
|
+
// shared is set for the writer of an item's or a quote's parts, which numbers footnotes and tokens with the document's.
|
|
28
|
+
function writer(state, dir, chrome, ink, pass, shared) {
|
|
29
|
+
var out = []
|
|
30
|
+
var run = []
|
|
31
|
+
var tokens = shared !== undefined ? shared.tokens : []
|
|
32
|
+
var cited = shared !== undefined ? shared.cited : []
|
|
33
|
+
var level = shared !== undefined ? shared.level : 0
|
|
34
|
+
function inlineOf(text, citations, literalPlain, bareText, fragment) {
|
|
35
|
+
return Run.parseInline(text, dir, state.defs, state.numbers, chrome, ink, tokens,
|
|
36
|
+
citations === false ? undefined : cited, literalPlain, bareText, fragment)
|
|
37
|
+
}
|
|
38
|
+
// Prose outside every container: a ">" in it, even after a formula's figure, is text and never a quote mark.
|
|
39
|
+
function pushPiece(lines) {
|
|
40
|
+
var text = HtmlBlock.separateBlocks(lines).join("\n")
|
|
41
|
+
// A soft break after a line break collapses, as in a browser, so the next line starts at the text column.
|
|
42
|
+
var pieces = inlineOf(text, undefined, false, true).replace(BREAK_SOFT_NEWLINE, "$1").split(HTML_BLOCK_AFTER_BLANK)
|
|
43
|
+
var maths = Maths.inlineSources(text)
|
|
44
|
+
for (var p = 0; p < pieces.length; p++) {
|
|
45
|
+
if (pieces[p].trim().length === 0)
|
|
46
|
+
continue
|
|
47
|
+
var block = { type: "run", text: pieces[p] }
|
|
48
|
+
// The text's formulas are listed on its first block, so a split never lists one twice.
|
|
49
|
+
if (maths.length > 0)
|
|
50
|
+
block.maths = maths
|
|
51
|
+
maths = []
|
|
52
|
+
out.push(block)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// An image inside an HTML block leaves it as an image block, since the importer draws no Markdown there.
|
|
56
|
+
function pushImages(lines) {
|
|
57
|
+
var parts = HtmlBlock.splitHtmlImages(lines, dir)
|
|
58
|
+
for (var p = 0; p < parts.length; p++) {
|
|
59
|
+
if (parts[p].block !== undefined)
|
|
60
|
+
out.push(parts[p].block)
|
|
61
|
+
else
|
|
62
|
+
pushPiece(parts[p].lines)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// A display formula inside a paragraph stands on its own as a figure, the way a display block does.
|
|
66
|
+
function pushRun(lines) {
|
|
67
|
+
var pieces = Maths.splitDisplay(lines.join("\n"))
|
|
68
|
+
if (pieces === null)
|
|
69
|
+
return pushImages(lines)
|
|
70
|
+
for (var p = 0; p < pieces.length; p++) {
|
|
71
|
+
if (pieces[p].math === undefined)
|
|
72
|
+
pushImages(pieces[p].text.split("\n"))
|
|
73
|
+
else if (pieces[p].math !== "")
|
|
74
|
+
out.push({ type: "figure", kind: "math", source: pieces[p].math, display: true })
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Sample input: the lines "a", "```", "x", "```" answer a run and a fence; null past NEST_LIMIT, where the lines stay one text.
|
|
78
|
+
function partsOf(lines) {
|
|
79
|
+
if (level >= NEST_LIMIT)
|
|
80
|
+
return null
|
|
81
|
+
var own = { defs: state.defs, notes: state.notes, numbers: state.numbers, hidden: {}, escaped: {}, code: {}, dropped: [] }
|
|
82
|
+
var inner = writer(own, dir, chrome, ink, pass, { tokens: tokens, cited: cited, level: level + 1 })
|
|
83
|
+
pass(lines, own, inner.project, false, true)
|
|
84
|
+
return inner.finish()
|
|
85
|
+
}
|
|
86
|
+
function pushAll(blocks) {
|
|
87
|
+
for (var b = 0; b < blocks.length; b++)
|
|
88
|
+
out.push(blocks[b])
|
|
89
|
+
}
|
|
90
|
+
// The blocks an HTML heading draws as, its leading picture an image block; null when its drawn text, references resolved, still holds a picture.
|
|
91
|
+
function headingBlocks(head) {
|
|
92
|
+
var blocks = []
|
|
93
|
+
var inner = head.inner
|
|
94
|
+
var logo = head.align === "right" ? null : HtmlHeading.headingPicture(inner, dir)
|
|
95
|
+
if (logo !== null) {
|
|
96
|
+
if (head.align === "center")
|
|
97
|
+
logo.block.align = "center"
|
|
98
|
+
blocks.push(logo.block)
|
|
99
|
+
inner = logo.rest
|
|
100
|
+
if (inner.trim().length === 0)
|
|
101
|
+
return blocks
|
|
102
|
+
}
|
|
103
|
+
var text = inlineOf(Leaf.headingSafe(inner))
|
|
104
|
+
if (HtmlHeading.DRAWN_PICTURE.test(text))
|
|
105
|
+
return null
|
|
106
|
+
var headBlock = { type: "heading", level: head.level, text: text }
|
|
107
|
+
if (head.align !== null)
|
|
108
|
+
headBlock.align = head.align
|
|
109
|
+
blocks.push(headBlock)
|
|
110
|
+
return blocks
|
|
111
|
+
}
|
|
112
|
+
function flushRun() {
|
|
113
|
+
var plain = []
|
|
114
|
+
var depth = 0
|
|
115
|
+
// cutAfter says after which blanks the paragraph ends; open HTML across the blank joins it instead.
|
|
116
|
+
var cut = MdParagraphs.cutAfter(run)
|
|
117
|
+
function flushPlain() {
|
|
118
|
+
if (plain.length > 0)
|
|
119
|
+
pushRun(plain)
|
|
120
|
+
plain = []
|
|
121
|
+
depth = 0
|
|
122
|
+
}
|
|
123
|
+
for (var i = 0; i < run.length; i++) {
|
|
124
|
+
if (run[i].trim().length === 0) {
|
|
125
|
+
if (cut[i])
|
|
126
|
+
flushPlain()
|
|
127
|
+
else
|
|
128
|
+
plain.push(run[i])
|
|
129
|
+
continue
|
|
130
|
+
}
|
|
131
|
+
// A heading in a lone wrapper lifts with it; one in other open HTML stays in its run, so no wrapper is ever split.
|
|
132
|
+
var lifted = depth === 0 ? HtmlHeading.headingUnit(run, i) : null
|
|
133
|
+
var htmlHead = lifted !== null ? lifted.head : depth === 0 ? HtmlBlock.htmlHeading(run[i]) : null
|
|
134
|
+
var drawn = htmlHead !== null ? headingBlocks(htmlHead) : null
|
|
135
|
+
if (drawn !== null) {
|
|
136
|
+
flushPlain()
|
|
137
|
+
pushAll(drawn)
|
|
138
|
+
if (lifted !== null) {
|
|
139
|
+
i = lifted.end
|
|
140
|
+
plain = lifted.wrapper.slice()
|
|
141
|
+
}
|
|
142
|
+
continue
|
|
143
|
+
}
|
|
144
|
+
var solo = (i === 0 || run[i - 1].trim().length === 0)
|
|
145
|
+
&& (i + 1 === run.length || run[i + 1].trim().length === 0)
|
|
146
|
+
var image = solo ? Leaf.standaloneImage(run[i], dir, state.defs) : null
|
|
147
|
+
// A raw image inside its own paragraph or div, on one line or three, is an image block too.
|
|
148
|
+
var unit = image === null ? HtmlImage.imageUnit(run, i, dir) : null
|
|
149
|
+
if (image !== null || unit !== null) {
|
|
150
|
+
if (image !== null)
|
|
151
|
+
image.alt = Res.plainText(inlineOf(image.alt, false, false, false, true))
|
|
152
|
+
flushPlain()
|
|
153
|
+
out.push(image !== null ? image : unit.block)
|
|
154
|
+
if (unit !== null) {
|
|
155
|
+
i = unit.end
|
|
156
|
+
// What its wrapper held under the image is drawn centred under it.
|
|
157
|
+
plain = unit.wrapper.slice()
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
plain.push(run[i])
|
|
161
|
+
depth = HtmlHeading.nestDepth(run[i], depth)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
flushPlain()
|
|
165
|
+
run = []
|
|
166
|
+
}
|
|
167
|
+
// The underline of a setext heading takes the paragraph above it out of the pending run and draws it as a heading.
|
|
168
|
+
function setext(event) {
|
|
169
|
+
var at = run.length
|
|
170
|
+
while (at > 0 && run[at - 1].trim().length > 0 && !Leaf.isThematic(run[at - 1]))
|
|
171
|
+
at--
|
|
172
|
+
var paragraph = run.slice(at)
|
|
173
|
+
run.length = at
|
|
174
|
+
flushRun()
|
|
175
|
+
var text = Leaf.headingSafe(paragraph.join("\n").trim())
|
|
176
|
+
if (text !== "")
|
|
177
|
+
out.push({ type: "heading", level: Leaf.setextLevel(event.text), text: inlineOf(text) })
|
|
178
|
+
}
|
|
179
|
+
function emit(event) {
|
|
180
|
+
if (event.type === "setext")
|
|
181
|
+
return setext(event)
|
|
182
|
+
if (event.type === "run") {
|
|
183
|
+
var lines = Items.visibleLines(event.lines, state)
|
|
184
|
+
for (var l = 0; l < lines.length; l++)
|
|
185
|
+
run.push(lines[l])
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
flushRun()
|
|
189
|
+
if (event.type === "fence") {
|
|
190
|
+
var source = event.lines.map(function (line) { return line.text }).join("\n")
|
|
191
|
+
if (event.figureKind !== "")
|
|
192
|
+
out.push({ type: "figure", kind: event.figureKind, source: source, display: true })
|
|
193
|
+
else
|
|
194
|
+
out.push({ type: "fence", text: source, info: Ent.decodeReferences(event.info) })
|
|
195
|
+
} else if (event.type === "heading") {
|
|
196
|
+
out.push({ type: "heading", level: event.level, text: inlineOf(Leaf.headingSafe(event.text)) })
|
|
197
|
+
} else if (event.type === "table") {
|
|
198
|
+
pushAll(Leaf.chunkTable(Leaf.tableBlock(event.head, event.aligns, event.rows,
|
|
199
|
+
function (text) { return inlineOf(text, true, true) })))
|
|
200
|
+
} else if (event.type === "quote") {
|
|
201
|
+
pushAll(Items.quoteBlocks(event.lines, state, inlineOf, partsOf))
|
|
202
|
+
} else if (event.type === "list") {
|
|
203
|
+
var list = Items.listBlock(event, state, inlineOf, partsOf)
|
|
204
|
+
if (list.items.length > 0)
|
|
205
|
+
pushAll(Chunks.chunkList(list))
|
|
206
|
+
} else {
|
|
207
|
+
out.push(event)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// The line's text once the list markers and indents around it are gone; a lazy line has none to remove.
|
|
211
|
+
function leadText(event) {
|
|
212
|
+
var lead = event.lead
|
|
213
|
+
return lead.here === lead.n && !lead.lazy
|
|
214
|
+
? " ".repeat(lead.pad) + Container.expandLead(lead.raw.slice(lead.at), lead.col + lead.pad) : event.text
|
|
215
|
+
}
|
|
216
|
+
// A delimiter row the block reader refused as a table keeps its first dash from the renderer, which would make a table of it.
|
|
217
|
+
function tableless(text) {
|
|
218
|
+
return text.indexOf("|") >= 0 && Leaf.delimAligns(text) !== null ? text.replace("-", "\\-") : text
|
|
219
|
+
}
|
|
220
|
+
var outer = null
|
|
221
|
+
var code = null
|
|
222
|
+
function flushOuter() {
|
|
223
|
+
if (outer !== null)
|
|
224
|
+
emit(outer)
|
|
225
|
+
outer = null
|
|
226
|
+
}
|
|
227
|
+
function flushCode() {
|
|
228
|
+
if (code === null)
|
|
229
|
+
return
|
|
230
|
+
if (code.indented) {
|
|
231
|
+
while (code.lines.length > 0 && code.lines[code.lines.length - 1].text.trim().length === 0)
|
|
232
|
+
code.lines.pop()
|
|
233
|
+
}
|
|
234
|
+
emit(code)
|
|
235
|
+
code = null
|
|
236
|
+
}
|
|
237
|
+
function project(event) {
|
|
238
|
+
if (event.type !== "line") {
|
|
239
|
+
flushOuter()
|
|
240
|
+
flushCode()
|
|
241
|
+
emit(event)
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
var top = event.outer
|
|
245
|
+
var group = top === null ? null : top.type === "list" ? top.group : top.id
|
|
246
|
+
if (outer !== null && outer.group !== group)
|
|
247
|
+
flushOuter()
|
|
248
|
+
if (top !== null) {
|
|
249
|
+
flushCode()
|
|
250
|
+
if (outer === null)
|
|
251
|
+
outer = { type: top.type, group: group, lines: [], ordered: top.ordered, start: top.start,
|
|
252
|
+
builder: top.type === "list" ? Items.builder() : null }
|
|
253
|
+
if (event.kind === "codeEnd")
|
|
254
|
+
return
|
|
255
|
+
if (top.type === "quote")
|
|
256
|
+
outer.lines.push({ text: leadText(event), index: event.index, depth: event.lead.n, raw: Items.isRaw(event.kind) })
|
|
257
|
+
else
|
|
258
|
+
outer.builder.add(event, leadText(event))
|
|
259
|
+
return
|
|
260
|
+
}
|
|
261
|
+
if (event.kind === "hidden")
|
|
262
|
+
return
|
|
263
|
+
if (event.kind === "fenceOpen") {
|
|
264
|
+
flushCode()
|
|
265
|
+
code = { type: "fence", lines: [], info: event.info, figureKind: event.figureKind, indented: false }
|
|
266
|
+
} else if (event.kind === "fenceBody" || event.kind === "codeLine") {
|
|
267
|
+
if (code === null)
|
|
268
|
+
code = { type: "fence", lines: [], info: "", figureKind: "", indented: true }
|
|
269
|
+
code.lines.push({ text: event.text, index: event.index })
|
|
270
|
+
} else if (event.kind === "fenceClose" || event.kind === "codeEnd") {
|
|
271
|
+
flushCode()
|
|
272
|
+
} else if (event.kind === "setext") {
|
|
273
|
+
flushCode()
|
|
274
|
+
emit({ type: "setext", text: event.text })
|
|
275
|
+
} else {
|
|
276
|
+
flushCode()
|
|
277
|
+
emit({ type: "run", lines: [{ text: tableless(event.text), index: event.index }] })
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function finish() {
|
|
281
|
+
flushOuter()
|
|
282
|
+
// A fence left open at the end of the text holds no line for the final newline.
|
|
283
|
+
if (code !== null && !code.indented && code.lines.length > 0 && code.lines[code.lines.length - 1].text === "")
|
|
284
|
+
code.lines.pop()
|
|
285
|
+
flushCode()
|
|
286
|
+
flushRun()
|
|
287
|
+
var footItems = []
|
|
288
|
+
// Only the document's own writer lists the notes cited anywhere, parts included.
|
|
289
|
+
for (var i = 0; shared === undefined && i < cited.length; i++) {
|
|
290
|
+
var id = cited[i]
|
|
291
|
+
footItems.push("<sup>" + state.numbers[id] + "</sup> " + inlineOf(state.notes[id].text, false))
|
|
292
|
+
}
|
|
293
|
+
if (footItems.length > 0) {
|
|
294
|
+
out.push({ type: "run", text: "---" })
|
|
295
|
+
out.push({ type: "list", ordered: false, start: 0, items: footItems })
|
|
296
|
+
}
|
|
297
|
+
return out
|
|
298
|
+
}
|
|
299
|
+
// The projection that hands onHead the first n blocks once they are written; written blocks are final, so finish starts with them.
|
|
300
|
+
function headed(n, onHead) {
|
|
301
|
+
var sent = false
|
|
302
|
+
return function (event) {
|
|
303
|
+
project(event)
|
|
304
|
+
if (!sent && out.length >= n) {
|
|
305
|
+
sent = true
|
|
306
|
+
onHead(out.slice(0, n))
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return { project: project, finish: finish, headed: headed }
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function preparedText(lines, state, dir, defs, chrome, ink) {
|
|
314
|
+
var out = []
|
|
315
|
+
var prose = []
|
|
316
|
+
var tokens = []
|
|
317
|
+
var cited = []
|
|
318
|
+
function flush() {
|
|
319
|
+
if (prose.length > 0)
|
|
320
|
+
out.push(Run.parseInline(prose.join("\n"), dir, defs || state.defs,
|
|
321
|
+
state.numbers, chrome, ink, tokens, cited))
|
|
322
|
+
prose = []
|
|
323
|
+
}
|
|
324
|
+
for (var i = 0; i < lines.length; i++) {
|
|
325
|
+
var line = { text: lines[i], index: i }
|
|
326
|
+
if (state.hidden.hasOwnProperty(line.index))
|
|
327
|
+
continue
|
|
328
|
+
if (state.code.hasOwnProperty(line.index)) {
|
|
329
|
+
flush()
|
|
330
|
+
out.push(line.text)
|
|
331
|
+
} else {
|
|
332
|
+
prose.push(Items.visibleLines([line], state)[0])
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
flush()
|
|
336
|
+
return out.join("\n")
|
|
337
|
+
}
|
package/ui/js/MdEmph.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdEmph: CommonMark delimiter runs, resolved after the inline scan; a mark that pairs becomes a tag, any other stays text.
|
|
4
|
+
.import "MdEscape.js" as Esc
|
|
5
|
+
|
|
6
|
+
var RULE_OF_THREE = 3
|
|
7
|
+
var STRONG_LENGTH = 2
|
|
8
|
+
var MAX_RUN_LENGTH = 1024
|
|
9
|
+
// Unicode P and S approximated by the blocks that hold them: Latin-1, general punctuation, currency, symbols, CJK, fullwidth.
|
|
10
|
+
var UNICODE_PUNCT = /[¡-©«-±´¶-¸»¿×÷˂-˅˒-˟‐-‧‰-⁞₠-⃀℀-⅏←-⯿⸀-、-〃〈-〠〰・︐-︙︰-﹫!-/:-@[-`{-・¢-○\ud83c-\ud83e]/
|
|
11
|
+
var SPACE = /\s/
|
|
12
|
+
|
|
13
|
+
function isPunctChar(c) {
|
|
14
|
+
return Esc.isAsciiPunct(c.charCodeAt(0)) || UNICODE_PUNCT.test(c)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Sample input: "foo*bar*" at index 3 reads a run of one star, flanked by letters, which can open and close.
|
|
18
|
+
function runAt(body, i, at) {
|
|
19
|
+
var ch = body.charAt(i)
|
|
20
|
+
var j = i + 1
|
|
21
|
+
while (j < body.length && j - i < MAX_RUN_LENGTH && body.charAt(j) === ch)
|
|
22
|
+
j++
|
|
23
|
+
var before = i > 0 ? body.charAt(i - 1) : "\n"
|
|
24
|
+
var after = j < body.length ? body.charAt(j) : "\n"
|
|
25
|
+
var spaceBefore = SPACE.test(before)
|
|
26
|
+
var spaceAfter = SPACE.test(after)
|
|
27
|
+
var punctBefore = isPunctChar(before)
|
|
28
|
+
var punctAfter = isPunctChar(after)
|
|
29
|
+
var left = !spaceAfter && (!punctAfter || spaceBefore || punctBefore)
|
|
30
|
+
var right = !spaceBefore && (!punctBefore || spaceAfter || punctAfter)
|
|
31
|
+
var under = ch === "_"
|
|
32
|
+
return { ch: ch, n: j - i, orig: j - i, at: at, end: j,
|
|
33
|
+
open: under ? left && (!right || punctBefore) : left,
|
|
34
|
+
close: under ? right && (!left || punctAfter) : right,
|
|
35
|
+
before: "", after: "", opens: 0, closes: 0 }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The delimiters from index from on pair as the reference algorithm does, over a linked list so a nested pair never rescans its inside.
|
|
39
|
+
function process(delims, from) {
|
|
40
|
+
var total = delims.length
|
|
41
|
+
var prev = []
|
|
42
|
+
var next = []
|
|
43
|
+
var bottoms = {}
|
|
44
|
+
for (var k = from; k < total; k++) {
|
|
45
|
+
prev[k] = k - 1
|
|
46
|
+
next[k] = k + 1
|
|
47
|
+
}
|
|
48
|
+
var ci = from
|
|
49
|
+
while (ci < total) {
|
|
50
|
+
var closer = delims[ci]
|
|
51
|
+
if (!closer.close || closer.n === 0) {
|
|
52
|
+
ci = next[ci]
|
|
53
|
+
continue
|
|
54
|
+
}
|
|
55
|
+
var key = closer.ch + (closer.orig % RULE_OF_THREE) + (closer.open ? "o" : "c")
|
|
56
|
+
var bottom = bottoms.hasOwnProperty(key) ? bottoms[key] : from - 1
|
|
57
|
+
var oi = prev[ci]
|
|
58
|
+
while (oi > bottom) {
|
|
59
|
+
var cand = delims[oi]
|
|
60
|
+
if (cand.open && cand.n > 0 && cand.ch === closer.ch
|
|
61
|
+
&& !((closer.open || cand.close) && (cand.orig + closer.orig) % RULE_OF_THREE === 0
|
|
62
|
+
&& !(cand.orig % RULE_OF_THREE === 0 && closer.orig % RULE_OF_THREE === 0)))
|
|
63
|
+
break
|
|
64
|
+
oi = prev[oi]
|
|
65
|
+
}
|
|
66
|
+
if (oi <= bottom) {
|
|
67
|
+
bottoms[key] = prev[ci]
|
|
68
|
+
ci = next[ci]
|
|
69
|
+
continue
|
|
70
|
+
}
|
|
71
|
+
var opener = delims[oi]
|
|
72
|
+
var strong = closer.n >= STRONG_LENGTH && opener.n >= STRONG_LENGTH
|
|
73
|
+
var use = strong ? STRONG_LENGTH : 1
|
|
74
|
+
opener.n -= use
|
|
75
|
+
closer.n -= use
|
|
76
|
+
opener.after = (strong ? "<strong>" : "<em>") + opener.after
|
|
77
|
+
closer.before = closer.before + (strong ? "</strong>" : "</em>")
|
|
78
|
+
opener.opens++
|
|
79
|
+
closer.closes++
|
|
80
|
+
// Everything between the pair can no longer pair: unlink it, and the opener too once it has no marks left.
|
|
81
|
+
next[oi] = ci
|
|
82
|
+
prev[ci] = oi
|
|
83
|
+
if (opener.n === 0) {
|
|
84
|
+
next[prev[oi]] = ci
|
|
85
|
+
prev[ci] = prev[oi]
|
|
86
|
+
}
|
|
87
|
+
if (closer.n === 0)
|
|
88
|
+
ci = next[ci]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Sample input: an unpaired "**" that could open reads "**", which no renderer pairs again; the "_" in "a_b" stays plain.
|
|
93
|
+
function literal(d) {
|
|
94
|
+
if (d.n === 0)
|
|
95
|
+
return ""
|
|
96
|
+
return d.open || d.close ? Esc.escapeText(d.ch).repeat(d.n) : d.ch.repeat(d.n)
|
|
97
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// MdEntity: backslash escapes and character references in destinations, info strings and running text, decoded here.
|
|
4
|
+
.import "MdEntityTable.js" as Names
|
|
5
|
+
|
|
6
|
+
var REPLACEMENT_CHARACTER = 0xfffd
|
|
7
|
+
var MAX_CODE_POINT = 0x10ffff
|
|
8
|
+
var SURROGATE_START = 0xd800
|
|
9
|
+
var SURROGATE_END = 0xdfff
|
|
10
|
+
// The longest reference is "∳" (33 characters), so a window this long holds any one.
|
|
11
|
+
var REFERENCE_WINDOW = 34
|
|
12
|
+
var REFERENCE = /\\([!-\/:-@\[-`{-~])|&(?:#([0-9]{1,7})|#[xX]([0-9a-fA-F]{1,6})|([A-Za-z][A-Za-z0-9]{1,31}));/g
|
|
13
|
+
var REFERENCE_HERE = /^&(?:#([0-9]{1,7})|#[xX]([0-9a-fA-F]{1,6})|([A-Za-z][A-Za-z0-9]{1,31}));/
|
|
14
|
+
|
|
15
|
+
// Sample input: 10 and 0x1F600 answer their characters; 0, a surrogate and a value past U+10FFFF answer U+FFFD.
|
|
16
|
+
function codePointText(code) {
|
|
17
|
+
var valid = code > 0 && code <= MAX_CODE_POINT && (code < SURROGATE_START || code > SURROGATE_END)
|
|
18
|
+
return String.fromCodePoint(valid ? code : REPLACEMENT_CHARACTER)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Sample input: "föo\\*" answers "f\u00f6o*"; an unknown name such as "&nosuch;" stays as written.
|
|
22
|
+
function decodeReferences(text) {
|
|
23
|
+
if (text.indexOf("\\") < 0 && text.indexOf("&") < 0)
|
|
24
|
+
return text
|
|
25
|
+
return text.replace(REFERENCE, function (all, escaped, dec, hex, name) {
|
|
26
|
+
if (escaped !== undefined)
|
|
27
|
+
return escaped
|
|
28
|
+
if (name !== undefined) {
|
|
29
|
+
var named = Names.namedValue(name)
|
|
30
|
+
return named === null ? all : named
|
|
31
|
+
}
|
|
32
|
+
return codePointText(dec !== undefined ? parseInt(dec, 10) : parseInt(hex, 16))
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Sample input: "a © b" at index 2 answers { text: "\u00a9", end: 8 }; "&nosuch;" and a bare "&" answer null.
|
|
37
|
+
function referenceAt(text, i) {
|
|
38
|
+
var hit = REFERENCE_HERE.exec(text.slice(i, i + REFERENCE_WINDOW))
|
|
39
|
+
if (hit === null)
|
|
40
|
+
return null
|
|
41
|
+
var decoded = hit[3] !== undefined ? Names.namedValue(hit[3])
|
|
42
|
+
: codePointText(hit[1] !== undefined ? parseInt(hit[1], 10) : parseInt(hit[2], 16))
|
|
43
|
+
return decoded === null ? null : { text: decoded, end: i + hit[0].length }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Sample input: "", " " or " " is a piece with nothing drawn on its line.
|
|
47
|
+
var BLANK_PIECE = /^ *$/
|
|
48
|
+
var WHITESPACE_REFERENCE = /[\t\n\r\f]/g
|
|
49
|
+
var HARD_BREAK_PIECE = "<br />"
|
|
50
|
+
// What a line holding only space references keeps, so Qt reads text and the paragraph stays whole.
|
|
51
|
+
var WHOLE_LINE_REFERENCE = " "
|
|
52
|
+
|
|
53
|
+
// Sample input: after "a" and "\n" a line is blank, after " " it stays blank, after "b" or a token (a number) it is not; "<br />" ends a line.
|
|
54
|
+
function blankAfter(blank, piece) {
|
|
55
|
+
if (typeof piece !== "string")
|
|
56
|
+
return false
|
|
57
|
+
var cut = piece.lastIndexOf("\n")
|
|
58
|
+
if (cut >= 0)
|
|
59
|
+
return BLANK_PIECE.test(piece.slice(cut + 1))
|
|
60
|
+
return piece === HARD_BREAK_PIECE || (blank && BLANK_PIECE.test(piece))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Sample input: lineBlank(lineState(true), ["a", "\n", " "]) answers true; ["a", " "] on a fresh state answers false; lineState(false), a fragment, starts not blank.
|
|
64
|
+
// The state folds each piece once, so it stays linear; lineRestart sets it afresh after a label's pieces were replaced by one.
|
|
65
|
+
function lineState(startsBlank) {
|
|
66
|
+
return { scanned: 0, blank: startsBlank }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function lineBlank(state, out) {
|
|
70
|
+
state.scanned = Math.min(state.scanned, out.length)
|
|
71
|
+
for (; state.scanned < out.length; state.scanned++)
|
|
72
|
+
state.blank = blankAfter(state.blank, out[state.scanned])
|
|
73
|
+
return state.blank
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function lineRestart(state, out, piece) {
|
|
77
|
+
state.blank = blankAfter(false, piece)
|
|
78
|
+
state.scanned = out.length
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Sample input: a tab or a newline (the decoded text of "	" and " ") is drawn as one space, any other text is unchanged.
|
|
82
|
+
function drawnText(text) {
|
|
83
|
+
return text.replace(WHITESPACE_REFERENCE, " ")
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Sample input: "x  \ny" at 3 answers { text: "", end: 8, trim: 2 }; "x  \ny" at 1 answers { text: "", end: 6, trim: 0 }; "a\n \nb" at 2 with blank true answers { text: " ", end: 7, trim: 0 }; "©" answers null.
|
|
87
|
+
// A run of space references with the literal spaces inside and after it is one unit: dropped at a line end (the literal spaces after it stay to decide a hard break) and at a line start, else one raw space; a whole-line run stays one reference so Qt sees a non-blank line.
|
|
88
|
+
function spaceRunAt(text, i, out, blank, endsLine) {
|
|
89
|
+
var end = i
|
|
90
|
+
var lastReference = i
|
|
91
|
+
var hit = referenceAt(text, end)
|
|
92
|
+
while (hit !== null && drawnText(hit.text) === " ") {
|
|
93
|
+
end = hit.end
|
|
94
|
+
lastReference = end
|
|
95
|
+
while (text.charAt(end) === " ")
|
|
96
|
+
end++
|
|
97
|
+
hit = referenceAt(text, end)
|
|
98
|
+
}
|
|
99
|
+
if (lastReference === i)
|
|
100
|
+
return null
|
|
101
|
+
if ((end >= text.length && endsLine) || text.charAt(end) === "\n") {
|
|
102
|
+
var trim = 0
|
|
103
|
+
while (trim < out.length && out[out.length - 1 - trim] === " ")
|
|
104
|
+
trim++
|
|
105
|
+
return { text: blank ? WHOLE_LINE_REFERENCE : "", end: lastReference, trim: trim }
|
|
106
|
+
}
|
|
107
|
+
return { text: blank ? "" : " ", end: end, trim: 0 }
|
|
108
|
+
}
|