Skip to content

Commit f4745a8

Browse files
authored
Add data-line attrs support for heading and paragraph (#158)
1 parent a7612c3 commit f4745a8

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

src/extensions/base/BaseSchema/BaseSchemaSpecs/index.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export enum BaseNode {
88
Paragraph = 'paragraph',
99
}
1010

11+
const paragraphLineNumberAttr = 'data-line';
12+
1113
export const pType = nodeTypeFactory(BaseNode.Paragraph);
1214

1315
export type BaseSchemaSpecsOptions = {
@@ -38,11 +40,18 @@ export const BaseSchemaSpecs: ExtensionAuto<BaseSchemaSpecsOptions> = (builder,
3840
}))
3941
.addNode(BaseNode.Paragraph, () => ({
4042
spec: {
43+
attrs: {[paragraphLineNumberAttr]: {default: null}},
4144
content: 'inline*',
4245
group: 'block',
4346
parseDOM: [{tag: 'p'}],
44-
toDOM() {
45-
return ['p', 0];
47+
toDOM(node) {
48+
const lineNumber = node.attrs[paragraphLineNumberAttr];
49+
50+
return [
51+
'p',
52+
lineNumber === null ? {} : {[paragraphLineNumberAttr]: lineNumber},
53+
0,
54+
];
4655
},
4756
placeholder: opts.paragraphPlaceholder
4857
? {

src/extensions/markdown/Heading/HeadingSpecs/index.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {nodeTypeFactory} from '../../../../utils/schema';
44

55
export const headingNodeName = 'heading';
66
export const headingLevelAttr = 'level';
7+
export const headingLineNumberAttr = 'data-line';
78
export const headingType = nodeTypeFactory(headingNodeName);
89

910
const DEFAULT_PLACEHOLDER = (node: Node) => 'Heading ' + node.attrs[headingLevelAttr];
@@ -18,7 +19,7 @@ export type HeadingSpecsOptions = {
1819
export const HeadingSpecs: ExtensionAuto<HeadingSpecsOptions> = (builder, opts) => {
1920
builder.addNode(headingNodeName, () => ({
2021
spec: {
21-
attrs: {[headingLevelAttr]: {default: 1}},
22+
attrs: {[headingLevelAttr]: {default: 1}, [headingLineNumberAttr]: {default: null}},
2223
content: '(text | inline)*',
2324
group: 'block',
2425
defining: true,
@@ -31,7 +32,13 @@ export const HeadingSpecs: ExtensionAuto<HeadingSpecsOptions> = (builder, opts)
3132
{tag: 'h6', attrs: {[headingLevelAttr]: 6}},
3233
],
3334
toDOM(node) {
34-
return ['h' + node.attrs[headingLevelAttr], 0];
35+
const lineNumber = node.attrs[headingLineNumberAttr];
36+
37+
return [
38+
'h' + node.attrs[headingLevelAttr],
39+
lineNumber === null ? {} : {[headingLineNumberAttr]: lineNumber},
40+
0,
41+
];
3542
},
3643
placeholder: {
3744
content:

src/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export {headingLevelAttr, headingNodeName} from '../../../markdown/Heading/Headi
66
export const YfmHeadingAttr = {
77
Level: headingLevelAttr,
88
Id: 'id',
9+
DataLine: 'data-line',
910
} as const;

src/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const YfmHeadingSpecs: ExtensionAuto<YfmHeadingSpecsOptions> = (builder,
2121
attrs: {
2222
[YfmHeadingAttr.Id]: {default: ''},
2323
[YfmHeadingAttr.Level]: {default: 1},
24+
[YfmHeadingAttr.DataLine]: {default: null},
2425
},
2526
content: '(text | inline)*',
2627
group: 'block',
@@ -36,9 +37,13 @@ export const YfmHeadingSpecs: ExtensionAuto<YfmHeadingSpecsOptions> = (builder,
3637
],
3738
toDOM(node) {
3839
const id = node.attrs[YfmHeadingAttr.Id];
40+
const lineNumber = node.attrs[YfmHeadingAttr.DataLine];
3941
return [
4042
'h' + node.attrs[YfmHeadingAttr.Level],
41-
id ? {id} : {},
43+
{
44+
id: id || null,
45+
[YfmHeadingAttr.DataLine]: lineNumber,
46+
},
4247
0,
4348
// [
4449
// 'a',

0 commit comments

Comments
 (0)