Skip to content

Commit 426bfcf

Browse files
committed
feat(YfmCut): add data-line attribute to cut title
1 parent f55d176 commit 426bfcf

File tree

6 files changed

+32
-4
lines changed

6 files changed

+32
-4
lines changed

demo/stories/examples/line-numbers/md-plugin.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const TOKENS: readonly string[] = [
1313
'dt_open',
1414
'checkbox_open',
1515
'yfm_note_open',
16+
'yfm_cut_open',
1617
];
1718

1819
export const lineNumbersPlugin: PluginSimple = (md) => {

src/extensions/yfm/YfmCut/YfmCutSpecs/const.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export enum CutNode {
88

99
export enum CutAttr {
1010
Class = 'class',
11+
Line = 'data-line',
1112
Markup = 'data-markup',
1213
}
1314

src/extensions/yfm/YfmCut/YfmCutSpecs/parser.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ const getAttrs: ParserToken['getAttrs'] = (tok) => {
1010

1111
export const parserTokens: Record<CutNode, ParserToken> = {
1212
[CutNode.Cut]: {name: CutNode.Cut, type: 'block', getAttrs},
13-
[CutNode.CutTitle]: {name: CutNode.CutTitle, type: 'block'},
13+
[CutNode.CutTitle]: {
14+
name: CutNode.CutTitle,
15+
type: 'block',
16+
getAttrs: (token, tokens, index) => {
17+
let dataLine = token.attrGet('data-line');
18+
if (!dataLine) {
19+
const prevToken = tokens[index - 1];
20+
if (prevToken?.type === 'yfm_cut_open') {
21+
dataLine = prevToken.attrGet('data-line');
22+
}
23+
}
24+
return {[CutAttr.Line]: dataLine};
25+
},
26+
},
1427
[CutNode.CutContent]: {name: CutNode.CutContent, type: 'block'},
1528
};

src/extensions/yfm/YfmCut/YfmCutSpecs/schema.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ export const getSchemaSpecs = (
4343
},
4444

4545
[CutNode.CutTitle]: {
46-
attrs: {class: {default: YfmCutClassName.Title}},
46+
attrs: {
47+
[CutAttr.Class]: {default: YfmCutClassName.Title},
48+
[CutAttr.Line]: {default: null},
49+
},
4750
content: 'inline*',
4851
group: 'block yfm-cut',
4952
parseDOM: [{tag: `.${YfmCutClassName.Title}`}],

src/extensions/yfm/YfmCut/const.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {YfmCutClassName as YfmCutClassNameSpecs} from './YfmCutSpecs/const';
22

3-
export {CutNode, cutType, cutTitleType, cutContentType} from './YfmCutSpecs/const';
3+
export {CutNode, CutAttr, cutType, cutTitleType, cutContentType} from './YfmCutSpecs/const';
44

55
export const YfmCutClassName = {
66
...YfmCutClassNameSpecs,

src/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type {Node} from '#pm/model';
22
import type {NodeView} from '#pm/view';
33

4-
import {YfmCutClassName} from '../const';
4+
import {CutAttr, YfmCutClassName} from '../const';
55

66
import './yfm-cut-title.scss';
77

@@ -17,6 +17,7 @@ export class YfmCutTitleNodeView implements NodeView {
1717
this.dom = document.createElement('div');
1818
this.dom.classList.add(YfmCutClassName.Title);
1919
this.dom.addEventListener('click', this._onTitleClick);
20+
updateDomAttribute(this.dom, CutAttr.Line, node.attrs[CutAttr.Line]);
2021

2122
this.contentDOM = this.dom.appendChild(document.createElement('div'));
2223
this.contentDOM.classList.add(YfmCutClassName.TitleInner);
@@ -26,6 +27,7 @@ export class YfmCutTitleNodeView implements NodeView {
2627
update(node: Node): boolean {
2728
if (this.node.type !== node.type) return false;
2829
this.node = node;
30+
updateDomAttribute(this.dom, CutAttr.Line, node.attrs[CutAttr.Line]);
2931
return true;
3032
}
3133

@@ -52,3 +54,11 @@ export class YfmCutTitleNodeView implements NodeView {
5254
e.preventDefault();
5355
};
5456
}
57+
58+
function updateDomAttribute(elem: Element, attr: string, value: string | null | undefined) {
59+
if (value) {
60+
elem.setAttribute(attr, value);
61+
} else {
62+
elem.removeAttribute(attr);
63+
}
64+
}

0 commit comments

Comments
 (0)