From 77f150b354c1e2754d601e89cd34cb5037a74b2c Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Sun, 29 Dec 2024 15:46:16 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=AF=8C=E6=96=87=E6=9C=AC=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/styles/prosemirror.scss | 37 +++++++++++++++------------ src/hooks/useExport.ts | 4 +-- src/types/slides.ts | 2 +- src/utils/prosemirror/schema/nodes.ts | 4 +-- src/utils/prosemirror/utils.ts | 8 +++--- src/views/Editor/MarkupPanel.vue | 2 ++ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/assets/styles/prosemirror.scss b/src/assets/styles/prosemirror.scss index 6bc1d3c1..7da8e34f 100644 --- a/src/assets/styles/prosemirror.scss +++ b/src/assets/styles/prosemirror.scss @@ -1,7 +1,7 @@ .ProseMirror, .ProseMirror-static { outline: 0; border: 0; - font-size: 20px; + font-size: 16px; word-break: break-word; white-space: normal; @@ -15,19 +15,24 @@ } p { + margin: 0; margin-top: var(--paragraphSpace); } p:first-child { margin-top: 0; } + ul, ol, li { + margin: 0; + margin-top: var(--paragraphSpace); + } ul { list-style-type: disc; padding-inline-start: 1.25em; li { list-style-type: inherit; - padding: 2px 0; + padding: 0.125em 0; } } @@ -37,12 +42,12 @@ li { list-style-type: inherit; - padding: 2px 0; + padding: 0.125em 0; } } code { - background-color: $borderColor; + background-color: #f1f1f1; padding: 2px 6px; margin: 0 1px; border-radius: 4px; @@ -60,37 +65,35 @@ blockquote { overflow: hidden; - padding-right: 1.2em; - padding-left: 1.2em; - margin-left: 0; - margin-right: 0; + padding: 0 1.2em; + margin: 0.6em 0; font-style: italic; - border-left: 4px solid #ddd; + border-left: 4px solid #e0e0e0; } [data-indent='1'] { - padding-left: 20px; + padding-left: 1em; } [data-indent='2'] { - padding-left: 40px; + padding-left: 2em; } [data-indent='3'] { - padding-left: 60px; + padding-left: 3em; } [data-indent='4'] { - padding-left: 80px; + padding-left: 4em; } [data-indent='5'] { - padding-left: 100px; + padding-left: 5em; } [data-indent='6'] { - padding-left: 120px; + padding-left: 6em; } [data-indent='7'] { - padding-left: 140px; + padding-left: 7em; } [data-indent='8'] { - padding-left: 160px; + padding-left: 8em; } } diff --git a/src/hooks/useExport.ts b/src/hooks/useExport.ts index f190cce0..1cc0919a 100644 --- a/src/hooks/useExport.ts +++ b/src/hooks/useExport.ts @@ -203,12 +203,12 @@ export default () => { if (styleObj['href']) options.hyperlink = { url: styleObj['href'] } if (bulletFlag && styleObj['list-type'] === 'ol') { - options.bullet = { type: 'number', indent: (options.fontSize || 20) * 1.25 } + options.bullet = { type: 'number', indent: (options.fontSize || 16) * 1.25 } options.paraSpaceBefore = 0.1 bulletFlag = false } if (bulletFlag && styleObj['list-type'] === 'ul') { - options.bullet = { indent: (options.fontSize || 20) * 1.25 } + options.bullet = { indent: (options.fontSize || 16) * 1.25 } options.paraSpaceBefore = 0.1 bulletFlag = false } diff --git a/src/types/slides.ts b/src/types/slides.ts index d4dce037..1a397a47 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -139,7 +139,7 @@ interface PPTBaseElement { } -export type TextType = 'title' | 'subtitle' | 'content' | 'item' | 'notes' | 'header' | 'footer' +export type TextType = 'title' | 'subtitle' | 'content' | 'item' | 'itemTitle' | 'notes' | 'header' | 'footer' | 'partNumber' /** * 文本元素 diff --git a/src/utils/prosemirror/schema/nodes.ts b/src/utils/prosemirror/schema/nodes.ts index 8cf6a371..6e27f058 100644 --- a/src/utils/prosemirror/schema/nodes.ts +++ b/src/utils/prosemirror/schema/nodes.ts @@ -129,7 +129,7 @@ const paragraph: NodeSpec = { textIndentLevel = parseInt(textIndent) } else if (/px/.test(textIndent)) { - textIndentLevel = Math.floor(parseInt(textIndent) / 20) + textIndentLevel = Math.floor(parseInt(textIndent) / 16) if (!textIndentLevel) textIndentLevel = 1 } } @@ -152,7 +152,7 @@ const paragraph: NodeSpec = { const { align, indent, textIndent } = node.attrs let style = '' if (align && align !== 'left') style += `text-align: ${align};` - if (textIndent) style += `text-indent: ${textIndent * 20}px;` + if (textIndent) style += `text-indent: ${textIndent}em;` const attr: Attr = { style } if (indent) attr['data-indent'] = indent diff --git a/src/utils/prosemirror/utils.ts b/src/utils/prosemirror/utils.ts index d31bff66..eb7117bf 100644 --- a/src/utils/prosemirror/utils.ts +++ b/src/utils/prosemirror/utils.ts @@ -184,9 +184,9 @@ interface DefaultAttrs { align: Align } const _defaultAttrs: DefaultAttrs = { - color: '#000', + color: '#000000', backcolor: '', - fontsize: '20px', + fontsize: '16px', fontname: '微软雅黑', align: 'left', } @@ -248,9 +248,9 @@ export const defaultRichTextAttrs: TextAttrs = { superscript: false, subscript: false, code: false, - color: '#000', + color: '#000000', backcolor: '', - fontsize: '20px', + fontsize: '16px', fontname: '微软雅黑', link: '', align: 'left', diff --git a/src/views/Editor/MarkupPanel.vue b/src/views/Editor/MarkupPanel.vue index 66aa6545..50835171 100644 --- a/src/views/Editor/MarkupPanel.vue +++ b/src/views/Editor/MarkupPanel.vue @@ -61,9 +61,11 @@ const textTypeOptions = ref<{ label: string; value: TextType | '' }[]>([ { label: '副标题', value: 'subtitle' }, { label: '正文', value: 'content' }, { label: '列表项目', value: 'item' }, + { label: '列表项标题', value: 'itemTitle' }, { label: '注释', value: 'notes' }, { label: '页眉', value: 'header' }, { label: '页脚', value: 'footer' }, + { label: '节编号', value: 'partNumber' }, ]) const slideType = computed(() => currentSlide.value?.type || '')