From 6f63a407dda4e62f420ef291c394bafc288bcdbe Mon Sep 17 00:00:00 2001 From: Alexander Onnikov Date: Tue, 18 Mar 2025 19:20:24 +0700 Subject: [PATCH] UBERF-9634 Handle unsupported markdown in github integration (port to develop) (#8260) Signed-off-by: Alexander Onnikov --- .../src/components/markup/MarkdownNode.svelte | 38 +++++++++++++++++ .../src/components/markup/NodeContent.svelte | 3 ++ packages/text-core/src/markup/model.ts | 3 +- .../src/__tests__/markdown.test.ts | 16 +++---- packages/text-markdown/src/parser.ts | 2 +- packages/text-markdown/src/serializer.ts | 18 +++++++- packages/text/src/kits/server-kit.ts | 21 ++++++---- packages/text/src/nodes/index.ts | 1 + packages/text/src/nodes/markdown.ts | 42 +++++++++++++++++++ .../src/kits/editor-kit.ts | 15 ++++++- services/github/pod-github/src/config.ts | 2 +- .../src/markdown/__tests__/textmodel.test.ts | 4 +- .../github/pod-github/src/sync/comments.ts | 4 +- .../github/pod-github/src/sync/issueBase.ts | 4 +- services/github/pod-github/src/sync/issues.ts | 8 ++-- .../github/pod-github/src/sync/projects.ts | 2 +- .../pod-github/src/sync/pullrequests.ts | 14 +++++-- .../pod-github/src/sync/reviewComments.ts | 6 +-- .../github/pod-github/src/sync/reviews.ts | 2 +- services/github/pod-github/src/types.ts | 5 +++ services/github/pod-github/src/worker.ts | 38 +++++++++++++++-- 21 files changed, 203 insertions(+), 45 deletions(-) create mode 100644 packages/presentation/src/components/markup/MarkdownNode.svelte create mode 100644 packages/text/src/nodes/markdown.ts diff --git a/packages/presentation/src/components/markup/MarkdownNode.svelte b/packages/presentation/src/components/markup/MarkdownNode.svelte new file mode 100644 index 0000000000..e478c77e87 --- /dev/null +++ b/packages/presentation/src/components/markup/MarkdownNode.svelte @@ -0,0 +1,38 @@ + + + +{#if node} +
+{/if} diff --git a/packages/presentation/src/components/markup/NodeContent.svelte b/packages/presentation/src/components/markup/NodeContent.svelte index 7aede5b461..debe0469f7 100644 --- a/packages/presentation/src/components/markup/NodeContent.svelte +++ b/packages/presentation/src/components/markup/NodeContent.svelte @@ -18,6 +18,7 @@ import CodeBlockNode from './CodeBlockNode.svelte' import ObjectNode from './ObjectNode.svelte' + import MarkdownNode from './MarkdownNode.svelte' import Node from './Node.svelte' export let node: MarkupNode @@ -198,6 +199,8 @@ {/each} {/if} + {:else if node.type === MarkupNodeType.markdown} + {:else if node.type === MarkupNodeType.mermaid} {:else if node.type === MarkupNodeType.comment} diff --git a/packages/text-core/src/markup/model.ts b/packages/text-core/src/markup/model.ts index a851787dcb..ef5878cd22 100644 --- a/packages/text-core/src/markup/model.ts +++ b/packages/text-core/src/markup/model.ts @@ -39,7 +39,8 @@ export enum MarkupNodeType { table_cell = 'tableCell', table_header = 'tableHeader', mermaid = 'mermaid', - comment = 'comment' + comment = 'comment', + markdown = 'markdown' } /** @public */ diff --git a/packages/text-markdown/src/__tests__/markdown.test.ts b/packages/text-markdown/src/__tests__/markdown.test.ts index 4176a81a6c..6c080398ac 100644 --- a/packages/text-markdown/src/__tests__/markdown.test.ts +++ b/packages/text-markdown/src/__tests__/markdown.test.ts @@ -74,7 +74,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -107,7 +107,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -168,7 +168,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -233,7 +233,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -336,7 +336,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -453,7 +453,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -528,7 +528,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', @@ -692,7 +692,7 @@ Lorem ipsum dolor sit amet. content: [ { type: 'heading', - attrs: { level: 1 }, + attrs: { level: 1, marker: '#' }, content: [ { type: 'text', diff --git a/packages/text-markdown/src/parser.ts b/packages/text-markdown/src/parser.ts index cf6ba219df..9658712bb2 100644 --- a/packages/text-markdown/src/parser.ts +++ b/packages/text-markdown/src/parser.ts @@ -445,7 +445,7 @@ const tokensBlock: Record = { }, heading: { block: MarkupNodeType.heading, - getAttrs: (tok: Token) => ({ level: Number(tok.tag.slice(1)) }) + getAttrs: (tok: Token) => ({ level: Number(tok.tag.slice(1)), marker: tok.markup }) }, code_block: { block: MarkupNodeType.code_block, diff --git a/packages/text-markdown/src/serializer.ts b/packages/text-markdown/src/serializer.ts index 69410f9f2d..af7d95cbb6 100644 --- a/packages/text-markdown/src/serializer.ts +++ b/packages/text-markdown/src/serializer.ts @@ -104,8 +104,18 @@ export const storeNodes: Record = { }, heading: (state, node) => { const attrs = nodeAttrs(node) - state.write(state.repeat('#', attrs.level !== undefined ? Number(attrs.level) : 1) + ' ') - state.renderInline(node) + if (attrs.marker === '=' && attrs.level === 1) { + state.renderInline(node) + state.ensureNewLine() + state.write('===\n') + } else if (attrs.marker === '-' && attrs.level === 2) { + state.renderInline(node) + state.ensureNewLine() + state.write('---\n') + } else { + state.write(state.repeat('#', attrs.level !== undefined ? Number(attrs.level) : 1) + ' ') + state.renderInline(node) + } state.closeBlock(node) }, horizontalRule: (state, node) => { @@ -228,6 +238,10 @@ export const storeNodes: Record = { ')' ) }, + markdown: (state, node) => { + state.renderInline(node) + state.closeBlock(node) + }, comment: (state, node) => { state.write('