Skip to content

Commit caaa1bd

Browse files
committed
fix: sizeパーサーのサポート単位を制限
Wikidotがサポートする単位(px,em,rem,ex,%,cm,mm,in,pc)のみ受け入れ、 pt,vh,vw等はテキストとしてフォールバック
1 parent 223d18c commit caaa1bd

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

packages/parser/src/parser/rules/inline/size.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,22 @@ import { currentToken } from "../types";
88
import { parseBlockName } from "../utils";
99
import { parseInlineUntil } from "./utils";
1010

11+
// Wikidot supports these CSS size units
12+
const VALID_SIZE_UNITS = ["px", "em", "rem", "ex", "%", "cm", "mm", "in", "pc"];
13+
14+
/**
15+
* Validate size value against Wikidot-supported units
16+
*/
17+
function isValidSizeValue(size: string): boolean {
18+
// Match number + unit pattern
19+
const match = size.match(/^(\d+(?:\.\d+)?)(px|em|rem|ex|%|cm|mm|in|pc)$/i);
20+
return match !== null;
21+
}
22+
1123
/**
12-
* Parse size value (e.g., "12pt", "90%", "2vh", "4px")
24+
* Parse size value (e.g., "90%", "4px", "1.5em")
25+
* Only Wikidot-supported units are accepted (px, em, rem, ex, %, cm, mm, in, pc)
26+
* Units like pt, vh, vw are NOT supported and will cause parse failure
1327
*/
1428
function parseSizeValue(
1529
ctx: ParseContext,
@@ -48,7 +62,14 @@ function parseSizeValue(
4862
return null;
4963
}
5064

51-
return { size: parts.join(""), consumed };
65+
const size = parts.join("");
66+
67+
// Validate against supported units
68+
if (!isValidSizeValue(size)) {
69+
return null;
70+
}
71+
72+
return { size, consumed };
5273
}
5374

5475
export const sizeRule: InlineRule = {

tests/fixtures/size/basic/expected.json

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,39 @@
88
"elements": [
99
{
1010
"element": "text",
11-
"data": "[[size 12pt]]Apple[[/size]]"
11+
"data": "[["
12+
},
13+
{
14+
"element": "text",
15+
"data": "size"
16+
},
17+
{
18+
"element": "text",
19+
"data": " "
20+
},
21+
{
22+
"element": "text",
23+
"data": "12pt"
24+
},
25+
{
26+
"element": "text",
27+
"data": "]]"
28+
},
29+
{
30+
"element": "text",
31+
"data": "Apple"
32+
},
33+
{
34+
"element": "text",
35+
"data": "[[/"
36+
},
37+
{
38+
"element": "text",
39+
"data": "size"
40+
},
41+
{
42+
"element": "text",
43+
"data": "]]"
1244
}
1345
]
1446
}
@@ -45,7 +77,39 @@
4577
"elements": [
4678
{
4779
"element": "text",
48-
"data": "[[size 2vh]]Melon[[/size]]"
80+
"data": "[["
81+
},
82+
{
83+
"element": "text",
84+
"data": "size"
85+
},
86+
{
87+
"element": "text",
88+
"data": " "
89+
},
90+
{
91+
"element": "text",
92+
"data": "2vh"
93+
},
94+
{
95+
"element": "text",
96+
"data": "]]"
97+
},
98+
{
99+
"element": "text",
100+
"data": "Melon"
101+
},
102+
{
103+
"element": "text",
104+
"data": "[[/"
105+
},
106+
{
107+
"element": "text",
108+
"data": "size"
109+
},
110+
{
111+
"element": "text",
112+
"data": "]]"
49113
}
50114
]
51115
}

0 commit comments

Comments
 (0)