Merge pull request #15987 from Budibase/markdown-performance

Markdown performance improvements
This commit is contained in:
Andrew Kingston 2025-04-23 14:31:31 +01:00 committed by GitHub
commit 7ae39cf629
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 69 additions and 52 deletions

View File

@ -1,71 +1,76 @@
<script lang="ts"> <script lang="ts">
import SpectrumMDE from "./SpectrumMDE.svelte" import { marked } from "marked"
export let value: string | undefined = undefined export let value: string | undefined = undefined
export let height: string | undefined = undefined export let height: string | undefined = undefined
let mde: any let ref: HTMLDivElement | undefined
// Keep the value up to date $: updateValue(ref, value)
$: mde && mde.value(value || "")
$: { const updateValue = (
if (mde && !mde.isPreviewActive()) { ref: HTMLDivElement | undefined,
mde.togglePreview() markdown: string | undefined
) => {
if (!ref) {
return
} }
if (!markdown) {
ref.innerHTML = ""
return
}
ref.innerHTML = marked.parse(markdown)
} }
</script> </script>
<div class="markdown-viewer" style="height:{height};"> <div class="markdown-viewer" style="height:{height};" bind:this={ref} />
<SpectrumMDE
bind:mde
scroll={false}
easyMDEOptions={{
initialValue: value,
toolbar: false,
}}
/>
</div>
<style> <style>
.markdown-viewer { .markdown-viewer {
overflow: auto; overflow: auto;
} }
/* Remove padding, borders and background colors */
.markdown-viewer :global(.editor-preview) {
padding: 0;
border: none;
background: transparent;
}
.markdown-viewer :global(.CodeMirror) {
border: none;
background: transparent;
padding: 0;
color: inherit;
}
.markdown-viewer :global(.EasyMDEContainer) {
background: transparent;
}
/* Hide the actual code editor */
.markdown-viewer :global(.CodeMirror-scroll) {
display: none;
}
/*Hide the scrollbar*/
.markdown-viewer :global(.CodeMirror-vscrollbar) {
display: none !important;
}
/*Position relatively so we only consume whatever space we need */
.markdown-viewer :global(.editor-preview-full) {
position: relative;
}
/* Remove margin on the first and last components to fully trim the preview */ /* Remove margin on the first and last components to fully trim the preview */
.markdown-viewer :global(.editor-preview-full > :first-child) { .markdown-viewer :global(:first-child) {
margin-top: 0; margin-top: 0;
} }
.markdown-viewer :global(.editor-preview-full > :last-child) { .markdown-viewer :global(:last-child) {
margin-bottom: 0; margin-bottom: 0;
} }
/* Code blocks in preview */ /* Code blocks */
.markdown-viewer :global(.editor-preview-full pre) { .markdown-viewer :global(pre) {
background: var(--spectrum-global-color-gray-200); background: var(--spectrum-global-color-gray-200);
padding: 4px;
border-radius: 4px;
}
.markdown-viewer :global(code) {
color: #e83e8c;
}
.markdown-viewer :global(pre code) {
color: var(--spectrum-alias-text-color);
}
/* Block quotes */
.markdown-viewer :global(blockquote) {
border-left: 4px solid var(--spectrum-global-color-gray-400);
color: var(--spectrum-global-color-gray-700);
margin-left: 0;
padding-left: 20px;
}
/* HRs */
.markdown-viewer :global(hr) {
background-color: var(--spectrum-global-color-gray-300);
border: none;
height: 2px;
}
/* Tables */
.markdown-viewer :global(td),
.markdown-viewer :global(th) {
border-color: var(--spectrum-alias-border-color) !important;
}
/* Links */
.markdown-viewer :global(a) {
color: var(--primaryColor);
}
.markdown-viewer :global(a:hover) {
color: var(--primaryColorHover);
} }
</style> </style>

View File

@ -75,6 +75,7 @@
"downloadjs": "1.4.7", "downloadjs": "1.4.7",
"fast-json-patch": "^3.1.1", "fast-json-patch": "^3.1.1",
"lodash": "4.17.21", "lodash": "4.17.21",
"marked": "^15.0.8",
"posthog-js": "^1.118.0", "posthog-js": "^1.118.0",
"remixicon": "2.5.0", "remixicon": "2.5.0",
"sanitize-html": "^2.13.0", "sanitize-html": "^2.13.0",

View File

@ -20,7 +20,7 @@
// Aliases for other strings to match to when searching // Aliases for other strings to match to when searching
const aliases = { const aliases = {
text: ["headline", "paragraph"], text: ["headline", "heading", "title", "paragraph", "markdown"],
} }
let searchString let searchString

View File

@ -45,7 +45,6 @@
"link", "link",
"icon", "icon",
"embed", "embed",
"markdownviewer",
"backgroundimage", "backgroundimage",
"embeddedmap" "embeddedmap"
] ]

View File

@ -6980,6 +6980,7 @@
] ]
}, },
"markdownviewer": { "markdownviewer": {
"deprecated": true,
"name": "Markdown Viewer", "name": "Markdown Viewer",
"icon": "Preview", "icon": "Preview",
"styles": ["size"], "styles": ["size"],
@ -8057,6 +8058,7 @@
} }
}, },
"textv2": { "textv2": {
"new": true,
"name": "Text", "name": "Text",
"description": "A component for displaying text", "description": "A component for displaying text",
"icon": "Text", "icon": "Text",

View File

@ -72,4 +72,9 @@
div :global(h6) { div :global(h6) {
font-weight: 600; font-weight: 600;
} }
/* Slightly shrink h1 so that it fits into 2 grid rows by default */
div :global(h1) {
font-size: 1.8em;
}
</style> </style>

View File

@ -1,7 +1,7 @@
<script> <script>
import { MarkdownViewer } from "@budibase/bbui" import { MarkdownViewer } from "@budibase/bbui"
import { getContext } from "svelte" import { getContext } from "svelte"
import Placeholder from "./Placeholder.svelte" import Placeholder from "../Placeholder.svelte"
export let value export let value

View File

@ -30,7 +30,6 @@ export { default as daterangepicker } from "./DateRangePicker.svelte"
export { default as cardstat } from "./CardStat.svelte" export { default as cardstat } from "./CardStat.svelte"
export { default as spectrumcard } from "./SpectrumCard.svelte" export { default as spectrumcard } from "./SpectrumCard.svelte"
export { default as tag } from "./Tag.svelte" export { default as tag } from "./Tag.svelte"
export { default as markdownviewer } from "./MarkdownViewer.svelte"
export { default as embeddedmap } from "./embedded-map/EmbeddedMap.svelte" export { default as embeddedmap } from "./embedded-map/EmbeddedMap.svelte"
export { default as sidepanel } from "./SidePanel.svelte" export { default as sidepanel } from "./SidePanel.svelte"
export { default as modal } from "./Modal.svelte" export { default as modal } from "./Modal.svelte"
@ -54,3 +53,4 @@ export { default as card } from "./deprecated/Card.svelte"
export { default as section } from "./deprecated/Section.svelte" export { default as section } from "./deprecated/Section.svelte"
export { default as text } from "./deprecated/Text.svelte" export { default as text } from "./deprecated/Text.svelte"
export { default as heading } from "./deprecated/Heading.svelte" export { default as heading } from "./deprecated/Heading.svelte"
export { default as markdownviewer } from "./deprecated/MarkdownViewer.svelte"

View File

@ -15957,6 +15957,11 @@ map-obj@^4.0.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
marked@^15.0.8:
version "15.0.8"
resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.8.tgz#39873a3fdf91a520111e48aeb2ef3746d58d7166"
integrity sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==
marked@^4.0.10, marked@^4.1.0: marked@^4.0.10, marked@^4.1.0:
version "4.2.12" version "4.2.12"
resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5"