Skip to content

Commit 1540ed8

Browse files
committed
fix review
1 parent 92f65c3 commit 1540ed8

File tree

5 files changed

+73
-24
lines changed

5 files changed

+73
-24
lines changed

src/extensions/additional/QuoteLink/PlaceholderWidget/descriptor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ export class QuoteLinkWidgetDescriptor extends ReactWidgetDescriptor {
8383
currentNodeWithPos.pos + currentNodeWithPos.node.nodeSize,
8484
quoteLinkType(this.#view.state.schema).create(
8585
{
86-
[QuoteLinkAttr.Href]: url,
87-
[QuoteLinkAttr.Content]: text,
86+
[QuoteLinkAttr.Cite]: url,
87+
[QuoteLinkAttr.DataContent]: text,
8888
},
8989
content,
9090
),

src/extensions/additional/QuoteLink/QuoteLink.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const {
1919
extensions: (builder) =>
2020
builder
2121
.use(BaseSchemaSpecs, {})
22-
.use(YfmConfigsSpecs, {attrs: {allowedAttributes: ['data-quotelink']}})
22+
.use(YfmConfigsSpecs, {attrs: {allowedAttributes: ['data-quotelink', 'data-content']}})
2323
.use(BlockquoteSpecs)
2424
.use(QuoteLinkSpecs),
2525
}).buildDeps();
@@ -29,8 +29,8 @@ const {doc, p, quoteLink} = builders<'doc' | 'p' | 'quoteLink'>(schema, {
2929
p: {nodeType: BaseNode.Paragraph},
3030
quoteLink: {
3131
nodeType: quoteLinkNodeName,
32-
[QuoteLinkAttr.Href]: 'https://ya.ru',
33-
[QuoteLinkAttr.Content]: 'Quote link',
32+
[QuoteLinkAttr.Cite]: 'https://ya.ru',
33+
[QuoteLinkAttr.DataContent]: 'Quote link',
3434
},
3535
});
3636

@@ -51,7 +51,7 @@ describe('QuoteLink extension', () => {
5151
parseDOM(
5252
schema,
5353
dd`<div>
54-
<blockquote class="yfm-quote-link" href="https://ya.ru" content="Quote link">
54+
<blockquote class="yfm-quote-link" cite="https://ya.ru" data-content="Quote link">
5555
<p>quote link text</p>
5656
</blockquote>
5757
</div>`,

src/extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);
1111
export const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;
1212

1313
export enum QuoteLinkAttr {
14-
Href = 'href',
15-
Content = 'content',
14+
Cite = 'cite',
15+
DataContent = 'data-content',
1616
}
1717

1818
export const QuoteLinkSpecs: ExtensionAuto = (builder) => {
@@ -30,8 +30,8 @@ export const QuoteLinkSpecs: ExtensionAuto = (builder) => {
3030
spec: {
3131
attrs: {
3232
class: {default: 'yfm-quote-link'},
33-
[QuoteLinkAttr.Href]: {default: ''},
34-
[QuoteLinkAttr.Content]: {default: ''},
33+
[QuoteLinkAttr.Cite]: {default: ''},
34+
[QuoteLinkAttr.DataContent]: {default: ''},
3535
},
3636
content: 'block+',
3737
group: 'block',
@@ -41,8 +41,12 @@ export const QuoteLinkSpecs: ExtensionAuto = (builder) => {
4141
tag: '.yfm-quote-link',
4242
getAttrs(dom) {
4343
return {
44-
href: (dom as Element).getAttribute(QuoteLinkAttr.Href),
45-
content: (dom as Element).getAttribute(QuoteLinkAttr.Content),
44+
[QuoteLinkAttr.Cite]: (dom as Element).getAttribute(
45+
QuoteLinkAttr.Cite,
46+
),
47+
[QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(
48+
QuoteLinkAttr.DataContent,
49+
),
4650
};
4751
},
4852
priority: builder.Priority.VeryHigh,
@@ -58,15 +62,17 @@ export const QuoteLinkSpecs: ExtensionAuto = (builder) => {
5862
name: quoteLinkNodeName,
5963
type: 'block',
6064
getAttrs: (tok) => ({
61-
href: tok.attrGet('href'),
62-
content: tok.attrGet('content') || null,
65+
[QuoteLinkAttr.Cite]: tok.attrGet('cite'),
66+
[QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,
6367
}),
6468
},
6569
},
6670
toMd: (state, node) => {
6771
state.wrapBlock(
6872
'> ',
69-
`> [${node.attrs.content}](${node.attrs.href}){data-quotelink=true}\n>\n`,
73+
`> [${node.attrs[QuoteLinkAttr.DataContent]}](${
74+
node.attrs[QuoteLinkAttr.Cite]
75+
}){data-quotelink=true}\n>\n`,
7076
node,
7177
() => state.renderContent(node),
7278
);

src/extensions/additional/QuoteLink/QuoteLinkSpecs/md/moveLinkToQuoteAttributes.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type {PluginSimple} from 'markdown-it';
22

3+
import {matchLinkAtInlineStart} from 'src/extensions/additional/QuoteLink/QuoteLinkSpecs/md/utils';
4+
5+
import {QuoteLinkAttr} from '..';
6+
37
export const moveLinkToQuoteAttributes: PluginSimple = (md) => {
48
md.core.ruler.push('move-link-to-quote-attributes', (state) => {
59
const {tokens} = state;
@@ -9,17 +13,31 @@ export const moveLinkToQuoteAttributes: PluginSimple = (md) => {
913
while (i < tokens.length) {
1014
const token = tokens[i];
1115
if (token.type === 'yfm_quote-link_open') {
12-
const linkToken = tokens[i + 2]?.children?.[0];
13-
if (linkToken && linkToken.type === 'link_open') {
14-
token.attrSet('href', linkToken.attrGet('href') ?? '');
15-
}
16+
const inlineToken = tokens[i + 2];
17+
const linkMatch = matchLinkAtInlineStart(inlineToken);
1618

17-
const linkTextToken = tokens[i + 2]?.children?.[1];
18-
if (linkTextToken?.content) {
19-
token.attrSet('content', linkTextToken.content);
20-
}
19+
if (
20+
linkMatch?.openToken.attrIndex('data-quotelink') !== -1 &&
21+
linkMatch?.closeTokenIndex
22+
) {
23+
token.attrSet(QuoteLinkAttr.Cite, linkMatch?.openToken.attrGet('href') ?? '');
24+
const content = inlineToken.children
25+
?.slice(1, linkMatch.closeTokenIndex)
26+
.reduce((result, item) => result + item.content, '')
27+
.trim();
28+
if (content) {
29+
token.attrSet(QuoteLinkAttr.DataContent, content);
30+
}
2131

22-
tokens.splice(i + 1, 3);
32+
if (linkMatch.closeTokenIndex === (inlineToken.children?.length ?? 0) - 1) {
33+
tokens.splice(i + 1, 3);
34+
} else {
35+
inlineToken.children?.splice(0, linkMatch.closeTokenIndex + 1);
36+
if (inlineToken.children?.every((childToken) => !childToken.content)) {
37+
tokens.splice(i + 1, 3);
38+
}
39+
}
40+
}
2341
}
2442

2543
i++;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type Token from 'markdown-it/lib/token';
2+
3+
export function matchLinkAtInlineStart(inlineToken: Token) {
4+
if (inlineToken.type !== 'inline' || !inlineToken.children?.length) {
5+
return null;
6+
}
7+
8+
const {children: tokens} = inlineToken;
9+
if (tokens[0].type !== 'link_open') {
10+
return null;
11+
}
12+
13+
for (let i = 0; i < tokens.length; i++) {
14+
const token = tokens[i];
15+
if (token.type === 'link_close') {
16+
return {
17+
openToken: tokens[0],
18+
closeToken: token,
19+
closeTokenIndex: i,
20+
};
21+
}
22+
}
23+
24+
return null;
25+
}

0 commit comments

Comments
 (0)