Skip to content

Commit bb24517

Browse files
committed
docs(changeset): fix: Improve HTML Input element handling
1 parent 735f6d1 commit bb24517

File tree

9 files changed

+614
-577
lines changed

9 files changed

+614
-577
lines changed

.changeset/lemon-seals-cross.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@m2d/html": patch
3+
---
4+
5+
fix: Improve HTML Input element handling

examples/nextjs/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
"start": "next start"
1313
},
1414
"dependencies": {
15-
"@m2d/core": "^1.3.2",
16-
"@m2d/emoji": "^0.1.2",
15+
"@m2d/core": "^1.4.2",
16+
"@m2d/emoji": "^0.1.3",
1717
"@m2d/html": "workspace:*",
1818
"@repo/shared": "workspace:*",
19-
"mdast2docx": "1.2.0",
19+
"mdast2docx": "1.3.0",
2020
"next": "^15.3.3",
2121
"nextjs-darkmode-lite": "^1.0.10",
2222
"nextjs-themes": "^4.0.6",
@@ -34,8 +34,8 @@
3434
"@next/eslint-plugin-next": "^15.3.3",
3535
"@repo/eslint-config": "workspace:*",
3636
"@repo/typescript-config": "workspace:*",
37-
"@types/node": "^22.15.30",
38-
"@types/react": "^19.1.6",
37+
"@types/node": "^24.0.3",
38+
"@types/react": "^19.1.8",
3939
"@types/react-dom": "^19.1.6",
4040
"typescript": "^5.8.3"
4141
}

examples/vite/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
"lint:fix": "eslint src/ --fix"
1313
},
1414
"dependencies": {
15-
"@m2d/core": "^1.3.2",
16-
"@m2d/emoji": "^0.1.2",
15+
"@m2d/core": "^1.4.2",
16+
"@m2d/emoji": "^0.1.3",
1717
"@m2d/html": "workspace:*",
1818
"@repo/shared": "workspace:*",
1919
"nextjs-darkmode": "^1.0.10",
@@ -26,9 +26,9 @@
2626
"devDependencies": {
2727
"@repo/eslint-config": "workspace:*",
2828
"@repo/typescript-config": "workspace:*",
29-
"@types/react": "^19.1.6",
29+
"@types/react": "^19.1.8",
3030
"@types/react-dom": "^19.1.6",
31-
"@vitejs/plugin-react": "^4.5.1",
31+
"@vitejs/plugin-react": "^4.5.2",
3232
"typescript": "^5.8.3",
3333
"vite": "^6.3.5"
3434
}

lib/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
"@repo/eslint-config": "workspace:*",
3636
"@repo/typescript-config": "workspace:*",
3737
"@testing-library/react": "^16.3.0",
38-
"@types/node": "^22.15.30",
39-
"@types/react": "^19.1.6",
38+
"@types/node": "^24.0.3",
39+
"@types/react": "^19.1.8",
4040
"@types/react-dom": "^19.1.6",
41-
"@vitejs/plugin-react": "^4.5.1",
42-
"@vitest/coverage-v8": "^3.2.2",
41+
"@vitejs/plugin-react": "^4.5.2",
42+
"@vitest/coverage-v8": "^3.2.3",
4343
"docx": "^9.5.0",
4444
"esbuild-plugin-rdi": "^0.0.0",
4545
"jsdom": "^26.1.0",
@@ -49,10 +49,10 @@
4949
"typescript": "^5.8.3",
5050
"unified": "^11.0.5",
5151
"vite-tsconfig-paths": "^5.1.4",
52-
"vitest": "^3.2.2"
52+
"vitest": "^3.2.3"
5353
},
5454
"dependencies": {
55-
"@m2d/core": "^1.3.2"
55+
"@m2d/core": "^1.4.2"
5656
},
5757
"peerDependencies": {
5858
"docx": "^9.3.0"

lib/src/index.ts

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -243,19 +243,25 @@ const parseStyles = (el: Node, inline = true): Data => {
243243

244244
if (color) data.color = standardizeColor(color);
245245

246-
if (el.tagName === "SUP") data.superScript = true;
247-
else if (el.tagName === "SUB") data.subScript = true;
248-
else if (["STRONG", "B"].includes(el.tagName)) data.bold = true;
249-
else if (["EM", "I"].includes(el.tagName)) data.italics = true;
250-
else if (["DEL", "S"].includes(el.tagName)) data.strike = true;
251-
else if (["U", "INS"].includes(el.tagName)) data.underline = {};
252-
else if (el.tagName === "MARK") {
246+
const tagName = el.tagName;
247+
if (tagName === "SUP") data.superScript = true;
248+
else if (tagName === "SUB") data.subScript = true;
249+
else if (["STRONG", "B"].includes(tagName)) data.bold = true;
250+
else if (["EM", "I"].includes(tagName)) data.italics = true;
251+
else if (["DEL", "S"].includes(tagName)) data.strike = true;
252+
else if (["U", "INS"].includes(tagName)) data.underline = {};
253+
else if (tagName === "MARK") {
253254
data.highlight = "yellow";
254255
data.emphasisMark = {};
255-
} else if (el.tagName === "PRE") {
256+
} else if (tagName === "PRE") {
256257
data.pre = true;
258+
} else if (/(radio|checkbox)/.test(tagName)) {
259+
data.type = (el as HTMLInputElement).type;
260+
data.name = (el as HTMLInputElement).name;
261+
data.value = (el as HTMLInputElement).value;
262+
data.checked = (el as HTMLInputElement).checked ?? (el as HTMLInputElement).defaultChecked;
257263
}
258-
264+
data.tag = tagName.toLowerCase() as keyof HTMLElementTagNameMap;
259265
return data;
260266
};
261267

@@ -278,7 +284,8 @@ const processInlineDOMNode = (el: Node, isPre = false): PhrasingContent => {
278284
.getAttributeNames()
279285
.reduce((acc, cur) => ({ ...acc, [cur]: el.getAttribute(cur) }), {});
280286

281-
switch (el.tagName) {
287+
const tagName = el.tagName;
288+
switch (tagName) {
282289
case "BR":
283290
return { type: "break" };
284291
case "IMG":
@@ -301,9 +308,9 @@ const processInlineDOMNode = (el: Node, isPre = false): PhrasingContent => {
301308
case "DEL":
302309
case "S":
303310
return {
304-
type: DOM_TO_MDAST_MAP[el.tagName],
311+
type: DOM_TO_MDAST_MAP[tagName],
305312
children,
306-
data: { ...data, tag: el.tagName.toLowerCase() as keyof HTMLElementTagNameMap },
313+
data,
307314
};
308315
case "A":
309316
return {
@@ -314,14 +321,13 @@ const processInlineDOMNode = (el: Node, isPre = false): PhrasingContent => {
314321
};
315322
case "INPUT":
316323
return /(radio|checkbox)/.test((el as HTMLInputElement).type)
317-
? { type: "checkbox" }
324+
? { type: "checkbox", data }
318325
: {
319326
type: "text",
320327
value: `_${(el as HTMLInputElement).value || "_".repeat(20)}_`,
321328
data: {
322329
...data,
323330
border: { style: BorderStyle.OUTSET },
324-
type: (el as HTMLInputElement).type,
325331
},
326332
};
327333
}
@@ -407,7 +413,8 @@ const defaultBorder = { left: border, right: border, top: border, bottom: border
407413
*/
408414
const processDOMNode = (el: HTMLElement | SVGElement): BlockContent => {
409415
const data = parseStyles(el);
410-
switch (el.tagName) {
416+
const tagName = el.tagName;
417+
switch (tagName) {
411418
case "H1":
412419
case "H2":
413420
case "H3":
@@ -416,9 +423,9 @@ const processDOMNode = (el: HTMLElement | SVGElement): BlockContent => {
416423
case "H6":
417424
return {
418425
type: "heading",
419-
depth: parseInt(el.tagName[1]),
426+
depth: parseInt(tagName[1]),
420427
children: Array.from(el.childNodes).map(cNode => processInlineDOMNode(cNode)),
421-
data: { ...data, tag: el.tagName.toLowerCase() },
428+
data,
422429
} as Heading;
423430
case "PRE":
424431
case "P":
@@ -427,19 +434,16 @@ const processDOMNode = (el: HTMLElement | SVGElement): BlockContent => {
427434
case "SUMMARY":
428435
case "FORM":
429436
case "LI":
430-
return createFragmentWithParentNodes(el, {
431-
...data,
432-
tag: el.tagName.toLowerCase() as keyof HTMLElementTagNameMap,
433-
});
437+
return createFragmentWithParentNodes(el, data);
434438
case "UL":
435439
case "OL":
436440
return {
437441
type: "list",
438-
ordered: el.tagName === "OL",
442+
ordered: tagName === "OL",
439443
children: Array.from(el.childNodes).map(node => ({
440444
type: "listItem",
441445
children: [createFragmentWithParentNodes(node)],
442-
data: { ...data, tag: el.tagName.toLowerCase() as keyof HTMLElementTagNameMap },
446+
data,
443447
})),
444448
};
445449
case "HR":

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"devDependencies": {
2020
"@changesets/cli": "^2.29.4",
2121
"@repo/typescript-config": "workspace:*",
22-
"@types/node": "^22.15.30",
22+
"@types/node": "^24.0.3",
2323
"prettier": "^3.5.3",
2424
"turbo": "^2.5.4"
2525
},

packages/eslint-config/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
"private": true,
66
"devDependencies": {
77
"@next/eslint-plugin-next": "^15.3.3",
8-
"@typescript-eslint/eslint-plugin": "^8.33.1",
9-
"@typescript-eslint/parser": "^8.33.1",
10-
"eslint": "^9.28.0",
8+
"@typescript-eslint/eslint-plugin": "^8.34.0",
9+
"@typescript-eslint/parser": "^8.34.0",
10+
"eslint": "^9.29.0",
1111
"eslint-config-prettier": "^10.1.5",
1212
"eslint-plugin-only-warn": "^1.1.0",
1313
"eslint-plugin-react": "^7.37.5",
1414
"eslint-plugin-react-hooks": "^5.2.0",
1515
"eslint-plugin-turbo": "^2.5.4",
1616
"globals": "^16.2.0",
1717
"typescript": "^5.8.3",
18-
"typescript-eslint": "^8.33.1"
18+
"typescript-eslint": "^8.34.0"
1919
}
2020
}

packages/shared/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
"@repo/scripts": "workspace:*",
2424
"@repo/typescript-config": "workspace:*",
2525
"@testing-library/react": "^16.3.0",
26-
"@types/node": "^22.15.30",
27-
"@types/react": "^19.1.6",
26+
"@types/node": "^24.0.3",
27+
"@types/react": "^19.1.8",
2828
"@types/react-dom": "^19.1.6",
29-
"@vitejs/plugin-react": "^4.5.1",
30-
"@vitest/coverage-v8": "^3.2.2",
29+
"@vitejs/plugin-react": "^4.5.2",
30+
"@vitest/coverage-v8": "^3.2.3",
3131
"esbuild-plugin-rdi": "^0.0.0",
3232
"esbuild-plugin-react18": "^0.2.6",
3333
"esbuild-plugin-react18-css": "^0.0.4",
@@ -37,16 +37,16 @@
3737
"tsup": "^8.5.0",
3838
"typescript": "^5.8.3",
3939
"vite-tsconfig-paths": "^5.1.4",
40-
"vitest": "^3.2.2"
40+
"vitest": "^3.2.3"
4141
},
4242
"dependencies": {
43-
"@m2d/core": "^1.3.2",
44-
"@m2d/emoji": "^0.1.2",
43+
"@m2d/core": "^1.4.2",
44+
"@m2d/emoji": "^0.1.3",
4545
"@m2d/html": "workspace:*",
4646
"@mayank1513/fork-me": "^2.1.3",
4747
"@repo/scripts": "workspace:*",
4848
"esbuild-raw-plugin": "^0.2.0",
49-
"mdast2docx": "1.2.0",
49+
"mdast2docx": "1.3.0",
5050
"nextjs-darkmode": "^1.0.10",
5151
"nextjs-themes": "^4.0.6",
5252
"r18gs": "^3.0.1",

0 commit comments

Comments
 (0)