@rasenjs/html 0.1.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/index.cjs +454 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +258 -0
- package/dist/index.d.ts +258 -0
- package/dist/index.js +386 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @rasenjs/html
|
|
2
|
+
|
|
3
|
+
Rasen HTML 渲染器,用于服务端渲染 (SSR) 和静态站点生成 (SSG)。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @rasenjs/html
|
|
9
|
+
# 或
|
|
10
|
+
yarn add @rasenjs/html
|
|
11
|
+
# 或
|
|
12
|
+
pnpm add @rasenjs/html
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 使用
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { renderToString, div, span, p } from '@rasenjs/html'
|
|
19
|
+
|
|
20
|
+
// 创建组件
|
|
21
|
+
const component = div(
|
|
22
|
+
{ class: 'container' },
|
|
23
|
+
p({ class: 'title' }, 'Hello, World!'),
|
|
24
|
+
span('This is SSR content')
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
// 渲染为 HTML 字符串
|
|
28
|
+
const html = renderToString(component)
|
|
29
|
+
console.log(html)
|
|
30
|
+
// 输出: <div class="container"><p class="title">Hello, World!</p><span>This is SSR content</span></div>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API
|
|
34
|
+
|
|
35
|
+
### renderToString(component)
|
|
36
|
+
|
|
37
|
+
将组件渲染为 HTML 字符串。
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { renderToString, div } from '@rasenjs/html'
|
|
41
|
+
|
|
42
|
+
const html = renderToString(div({ class: 'app' }, 'Content'))
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 元素组件
|
|
46
|
+
|
|
47
|
+
所有标准 HTML 元素都可用:
|
|
48
|
+
|
|
49
|
+
- `div`, `span`, `p`
|
|
50
|
+
- `h1`, `h2`, `h3`, `h4`, `h5`, `h6`
|
|
51
|
+
- `a`, `img`, `button`, `input`
|
|
52
|
+
- `ul`, `ol`, `li`
|
|
53
|
+
- `form`, `label`, `textarea`, `select`, `option`
|
|
54
|
+
- `table`, `thead`, `tbody`, `tr`, `th`, `td`
|
|
55
|
+
- `section`, `article`, `header`, `footer`, `nav`, `main`, `aside`
|
|
56
|
+
- 以及更多...
|
|
57
|
+
|
|
58
|
+
### element(props)
|
|
59
|
+
|
|
60
|
+
创建自定义元素:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { element } from '@rasenjs/html'
|
|
64
|
+
|
|
65
|
+
const customElement = element({
|
|
66
|
+
tag: 'custom-element',
|
|
67
|
+
attrs: { 'data-id': '123' },
|
|
68
|
+
children: [...]
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 特性
|
|
73
|
+
|
|
74
|
+
- 🚀 轻量级,无运行时依赖
|
|
75
|
+
- 🔧 与 Rasen DOM 包 API 兼容
|
|
76
|
+
- 📦 支持 ESM 和 CommonJS
|
|
77
|
+
- 🎯 TypeScript 支持
|
|
78
|
+
- 🔒 自动 HTML 转义,防止 XSS
|
|
79
|
+
|
|
80
|
+
## 许可证
|
|
81
|
+
|
|
82
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@rasenjs/core');
|
|
4
|
+
|
|
5
|
+
// src/types.ts
|
|
6
|
+
function createStringHost() {
|
|
7
|
+
const fragments = [];
|
|
8
|
+
return {
|
|
9
|
+
fragments,
|
|
10
|
+
append(html2) {
|
|
11
|
+
fragments.push(html2);
|
|
12
|
+
},
|
|
13
|
+
toString() {
|
|
14
|
+
return fragments.join("");
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/components/string-context.ts
|
|
20
|
+
function stringContext(props) {
|
|
21
|
+
return (host) => {
|
|
22
|
+
const { children } = props;
|
|
23
|
+
for (const child of children) {
|
|
24
|
+
child(host);
|
|
25
|
+
}
|
|
26
|
+
return void 0;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function renderToString(component) {
|
|
30
|
+
const host = createStringHost();
|
|
31
|
+
component(host);
|
|
32
|
+
return host.toString();
|
|
33
|
+
}
|
|
34
|
+
function renderToStringMultiple(components) {
|
|
35
|
+
const host = createStringHost();
|
|
36
|
+
for (const component of components) {
|
|
37
|
+
component(host);
|
|
38
|
+
}
|
|
39
|
+
return host.toString();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/utils.ts
|
|
43
|
+
var HTML_ESCAPE_MAP = {
|
|
44
|
+
"&": "&",
|
|
45
|
+
"<": "<",
|
|
46
|
+
">": ">",
|
|
47
|
+
'"': """,
|
|
48
|
+
"'": "'"
|
|
49
|
+
};
|
|
50
|
+
function escapeHtml(text) {
|
|
51
|
+
return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
|
|
52
|
+
}
|
|
53
|
+
function escapeAttr(value) {
|
|
54
|
+
return value.replace(/[&<>"]/g, (char) => HTML_ESCAPE_MAP[char] || char);
|
|
55
|
+
}
|
|
56
|
+
function stringifyAttr(name, value) {
|
|
57
|
+
if (value === null || value === void 0 || value === false) {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
if (value === true) {
|
|
61
|
+
return ` ${name}`;
|
|
62
|
+
}
|
|
63
|
+
return ` ${name}="${escapeAttr(String(value))}"`;
|
|
64
|
+
}
|
|
65
|
+
function stringifyStyle(styles) {
|
|
66
|
+
const parts = [];
|
|
67
|
+
for (const [key, value] of Object.entries(styles)) {
|
|
68
|
+
if (value !== null && value !== void 0) {
|
|
69
|
+
const kebabKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
70
|
+
parts.push(`${kebabKey}: ${value}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return parts.join("; ");
|
|
74
|
+
}
|
|
75
|
+
function stringifyClass(className) {
|
|
76
|
+
if (!className) {
|
|
77
|
+
return "";
|
|
78
|
+
}
|
|
79
|
+
if (typeof className === "string") {
|
|
80
|
+
return className;
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(className)) {
|
|
83
|
+
return className.filter(Boolean).join(" ");
|
|
84
|
+
}
|
|
85
|
+
return Object.entries(className).filter(([, value]) => value).map(([key]) => key).join(" ");
|
|
86
|
+
}
|
|
87
|
+
var VOID_ELEMENTS = /* @__PURE__ */ new Set([
|
|
88
|
+
"area",
|
|
89
|
+
"base",
|
|
90
|
+
"br",
|
|
91
|
+
"col",
|
|
92
|
+
"embed",
|
|
93
|
+
"hr",
|
|
94
|
+
"img",
|
|
95
|
+
"input",
|
|
96
|
+
"link",
|
|
97
|
+
"meta",
|
|
98
|
+
"param",
|
|
99
|
+
"source",
|
|
100
|
+
"track",
|
|
101
|
+
"wbr"
|
|
102
|
+
]);
|
|
103
|
+
function isVoidElement(tag) {
|
|
104
|
+
return VOID_ELEMENTS.has(tag.toLowerCase());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/components/element.ts
|
|
108
|
+
var element = (props) => {
|
|
109
|
+
return (host) => {
|
|
110
|
+
const tag = props.tag;
|
|
111
|
+
const isVoid = isVoidElement(tag);
|
|
112
|
+
let html2 = `<${tag}`;
|
|
113
|
+
const id = core.unrefValue(props.id);
|
|
114
|
+
if (id) {
|
|
115
|
+
html2 += stringifyAttr("id", id);
|
|
116
|
+
}
|
|
117
|
+
const className = core.unrefValue(props.className);
|
|
118
|
+
if (className) {
|
|
119
|
+
html2 += stringifyAttr("class", className);
|
|
120
|
+
}
|
|
121
|
+
const style = core.unrefValue(props.style);
|
|
122
|
+
if (style && Object.keys(style).length > 0) {
|
|
123
|
+
html2 += stringifyAttr("style", stringifyStyle(style));
|
|
124
|
+
}
|
|
125
|
+
const value = core.unrefValue(props.value);
|
|
126
|
+
if (value !== void 0) {
|
|
127
|
+
html2 += stringifyAttr("value", String(value));
|
|
128
|
+
}
|
|
129
|
+
const attrs = core.unrefValue(props.attrs);
|
|
130
|
+
if (attrs) {
|
|
131
|
+
for (const [key, val] of Object.entries(attrs)) {
|
|
132
|
+
if (/^\d/.test(key)) continue;
|
|
133
|
+
html2 += stringifyAttr(key, val);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const specialProps = /* @__PURE__ */ new Set(["tag", "id", "className", "style", "value", "attrs", "children", "on"]);
|
|
137
|
+
for (const [key, val] of Object.entries(props)) {
|
|
138
|
+
if (specialProps.has(key)) continue;
|
|
139
|
+
if (key.startsWith("on")) continue;
|
|
140
|
+
if (val === void 0 || val === null) continue;
|
|
141
|
+
const attrValue = core.unrefValue(val);
|
|
142
|
+
if (attrValue !== void 0 && attrValue !== null) {
|
|
143
|
+
if (typeof attrValue === "string" || typeof attrValue === "number" || typeof attrValue === "boolean") {
|
|
144
|
+
html2 += stringifyAttr(key, attrValue);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
html2 += ">";
|
|
149
|
+
if (isVoid) {
|
|
150
|
+
host.append(html2);
|
|
151
|
+
return void 0;
|
|
152
|
+
}
|
|
153
|
+
const children = props.children;
|
|
154
|
+
if (children !== void 0) {
|
|
155
|
+
if (typeof children === "string" || typeof children === "object" && "value" in children) {
|
|
156
|
+
html2 += escapeHtml(String(core.unrefValue(children)));
|
|
157
|
+
} else if (Array.isArray(children) && children.length > 0) {
|
|
158
|
+
const childHost = {
|
|
159
|
+
fragments: [],
|
|
160
|
+
append(s) {
|
|
161
|
+
this.fragments.push(s);
|
|
162
|
+
},
|
|
163
|
+
toString() {
|
|
164
|
+
return this.fragments.join("");
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
for (const child of children) {
|
|
168
|
+
if (child === null || child === void 0) continue;
|
|
169
|
+
if (typeof child === "string") {
|
|
170
|
+
childHost.append(escapeHtml(child));
|
|
171
|
+
} else if (typeof child === "function") {
|
|
172
|
+
const result = child(childHost);
|
|
173
|
+
if (typeof result === "string" || typeof result === "number") {
|
|
174
|
+
childHost.append(escapeHtml(String(result)));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
html2 += childHost.toString();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
html2 += `</${tag}>`;
|
|
182
|
+
host.append(html2);
|
|
183
|
+
return void 0;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
var html = (props) => {
|
|
187
|
+
return (host) => {
|
|
188
|
+
const content = core.unrefValue(props.content) || "";
|
|
189
|
+
host.append(content);
|
|
190
|
+
return void 0;
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// src/components/elements.ts
|
|
195
|
+
function createElement(tag) {
|
|
196
|
+
return (propsOrChild, ...restChildren) => {
|
|
197
|
+
if (propsOrChild === void 0) {
|
|
198
|
+
return element({ tag });
|
|
199
|
+
}
|
|
200
|
+
if (typeof propsOrChild === "string" || typeof propsOrChild === "function") {
|
|
201
|
+
const children = [propsOrChild, ...restChildren];
|
|
202
|
+
return element({ tag, children });
|
|
203
|
+
}
|
|
204
|
+
const props = propsOrChild;
|
|
205
|
+
const { class: cls, className, ...restProps } = props;
|
|
206
|
+
const normalizedProps = {
|
|
207
|
+
...restProps,
|
|
208
|
+
className: className || cls
|
|
209
|
+
};
|
|
210
|
+
if (restChildren.length > 0) {
|
|
211
|
+
const existingChildren = props.children;
|
|
212
|
+
const children = Array.isArray(existingChildren) ? [...existingChildren, ...restChildren] : existingChildren !== void 0 ? [existingChildren, ...restChildren] : restChildren;
|
|
213
|
+
return element({ tag, ...normalizedProps, children });
|
|
214
|
+
}
|
|
215
|
+
return element({ tag, ...normalizedProps });
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
var div = createElement("div");
|
|
219
|
+
var span = createElement("span");
|
|
220
|
+
var button = createElement("button");
|
|
221
|
+
var a = createElement("a");
|
|
222
|
+
var p = createElement("p");
|
|
223
|
+
var h1 = createElement("h1");
|
|
224
|
+
var h2 = createElement("h2");
|
|
225
|
+
var h3 = createElement("h3");
|
|
226
|
+
var h4 = createElement("h4");
|
|
227
|
+
var h5 = createElement("h5");
|
|
228
|
+
var h6 = createElement("h6");
|
|
229
|
+
var ul = createElement("ul");
|
|
230
|
+
var ol = createElement("ol");
|
|
231
|
+
var li = createElement("li");
|
|
232
|
+
var form = createElement("form");
|
|
233
|
+
var label = createElement("label");
|
|
234
|
+
var select = createElement("select");
|
|
235
|
+
var table = createElement("table");
|
|
236
|
+
var thead = createElement("thead");
|
|
237
|
+
var tbody = createElement("tbody");
|
|
238
|
+
var tfoot = createElement("tfoot");
|
|
239
|
+
var tr = createElement("tr");
|
|
240
|
+
var th = createElement("th");
|
|
241
|
+
var td = createElement("td");
|
|
242
|
+
var section = createElement("section");
|
|
243
|
+
var article = createElement("article");
|
|
244
|
+
var header = createElement("header");
|
|
245
|
+
var footer = createElement("footer");
|
|
246
|
+
var nav = createElement("nav");
|
|
247
|
+
var main = createElement("main");
|
|
248
|
+
var aside = createElement("aside");
|
|
249
|
+
var pre = createElement("pre");
|
|
250
|
+
var code = createElement("code");
|
|
251
|
+
var blockquote = createElement("blockquote");
|
|
252
|
+
var strong = createElement("strong");
|
|
253
|
+
var em = createElement("em");
|
|
254
|
+
var small = createElement("small");
|
|
255
|
+
var mark = createElement("mark");
|
|
256
|
+
var del = createElement("del");
|
|
257
|
+
var ins = createElement("ins");
|
|
258
|
+
var sub = createElement("sub");
|
|
259
|
+
var sup = createElement("sup");
|
|
260
|
+
var svg = createElement("svg");
|
|
261
|
+
var br = () => element({ tag: "br" });
|
|
262
|
+
var hr = () => element({ tag: "hr" });
|
|
263
|
+
var input = (props) => {
|
|
264
|
+
const { type, value, placeholder, disabled, attrs, ...restProps } = props;
|
|
265
|
+
const newAttrs = {
|
|
266
|
+
...attrs || {},
|
|
267
|
+
...type !== void 0 ? { type } : {},
|
|
268
|
+
...placeholder !== void 0 ? { placeholder } : {},
|
|
269
|
+
...disabled !== void 0 ? { disabled } : {}
|
|
270
|
+
};
|
|
271
|
+
return element({
|
|
272
|
+
tag: "input",
|
|
273
|
+
...restProps,
|
|
274
|
+
attrs: newAttrs,
|
|
275
|
+
...value !== void 0 ? { value } : {}
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
var img = (props) => {
|
|
279
|
+
return element({ tag: "img", ...props });
|
|
280
|
+
};
|
|
281
|
+
var textarea = (props) => {
|
|
282
|
+
const { value, placeholder, disabled, rows, cols, attrs, ...restProps } = props;
|
|
283
|
+
const newAttrs = {
|
|
284
|
+
...attrs || {},
|
|
285
|
+
...placeholder !== void 0 ? { placeholder } : {},
|
|
286
|
+
...disabled !== void 0 ? { disabled } : {},
|
|
287
|
+
...rows !== void 0 ? { rows } : {},
|
|
288
|
+
...cols !== void 0 ? { cols } : {}
|
|
289
|
+
};
|
|
290
|
+
return element({
|
|
291
|
+
tag: "textarea",
|
|
292
|
+
...restProps,
|
|
293
|
+
attrs: newAttrs,
|
|
294
|
+
...value !== void 0 ? { children: String(value) } : {}
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
var option = (props) => {
|
|
298
|
+
const { value, selected, attrs, ...restProps } = props;
|
|
299
|
+
const newAttrs = {
|
|
300
|
+
...attrs || {},
|
|
301
|
+
...value !== void 0 ? { value } : {},
|
|
302
|
+
...selected ? { selected: true } : {}
|
|
303
|
+
};
|
|
304
|
+
return element({
|
|
305
|
+
tag: "option",
|
|
306
|
+
...restProps,
|
|
307
|
+
attrs: newAttrs
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
var video = (props) => {
|
|
311
|
+
const { src, poster, controls, autoplay, loop, muted, attrs, ...restProps } = props;
|
|
312
|
+
const newAttrs = {
|
|
313
|
+
...attrs || {},
|
|
314
|
+
...src !== void 0 ? { src } : {},
|
|
315
|
+
...poster !== void 0 ? { poster } : {},
|
|
316
|
+
...controls ? { controls: true } : {},
|
|
317
|
+
...autoplay ? { autoplay: true } : {},
|
|
318
|
+
...loop ? { loop: true } : {},
|
|
319
|
+
...muted ? { muted: true } : {}
|
|
320
|
+
};
|
|
321
|
+
return element({
|
|
322
|
+
tag: "video",
|
|
323
|
+
...restProps,
|
|
324
|
+
attrs: newAttrs
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
var audio = (props) => {
|
|
328
|
+
const { src, controls, autoplay, loop, muted, attrs, ...restProps } = props;
|
|
329
|
+
const newAttrs = {
|
|
330
|
+
...attrs || {},
|
|
331
|
+
...src !== void 0 ? { src } : {},
|
|
332
|
+
...controls ? { controls: true } : {},
|
|
333
|
+
...autoplay ? { autoplay: true } : {},
|
|
334
|
+
...loop ? { loop: true } : {},
|
|
335
|
+
...muted ? { muted: true } : {}
|
|
336
|
+
};
|
|
337
|
+
return element({
|
|
338
|
+
tag: "audio",
|
|
339
|
+
...restProps,
|
|
340
|
+
attrs: newAttrs
|
|
341
|
+
});
|
|
342
|
+
};
|
|
343
|
+
var source = (props) => {
|
|
344
|
+
const { src, type, attrs, ...restProps } = props;
|
|
345
|
+
const newAttrs = {
|
|
346
|
+
...attrs || {},
|
|
347
|
+
...src !== void 0 ? { src } : {},
|
|
348
|
+
...type !== void 0 ? { type } : {}
|
|
349
|
+
};
|
|
350
|
+
return element({
|
|
351
|
+
tag: "source",
|
|
352
|
+
...restProps,
|
|
353
|
+
attrs: newAttrs
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
var iframe = (props) => {
|
|
357
|
+
const { src, width, height, frameborder, allowfullscreen, attrs, ...restProps } = props;
|
|
358
|
+
const newAttrs = {
|
|
359
|
+
...attrs || {},
|
|
360
|
+
...src !== void 0 ? { src } : {},
|
|
361
|
+
...width !== void 0 ? { width } : {},
|
|
362
|
+
...height !== void 0 ? { height } : {},
|
|
363
|
+
...frameborder !== void 0 ? { frameborder } : {},
|
|
364
|
+
...allowfullscreen ? { allowfullscreen: true } : {}
|
|
365
|
+
};
|
|
366
|
+
return element({
|
|
367
|
+
tag: "iframe",
|
|
368
|
+
...restProps,
|
|
369
|
+
attrs: newAttrs
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
var canvas = (props) => {
|
|
373
|
+
const { width, height, attrs, ...restProps } = props;
|
|
374
|
+
const newAttrs = {
|
|
375
|
+
...attrs || {},
|
|
376
|
+
...width !== void 0 ? { width } : {},
|
|
377
|
+
...height !== void 0 ? { height } : {}
|
|
378
|
+
};
|
|
379
|
+
return element({
|
|
380
|
+
tag: "canvas",
|
|
381
|
+
...restProps,
|
|
382
|
+
attrs: newAttrs
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
exports.VOID_ELEMENTS = VOID_ELEMENTS;
|
|
387
|
+
exports.a = a;
|
|
388
|
+
exports.article = article;
|
|
389
|
+
exports.aside = aside;
|
|
390
|
+
exports.audio = audio;
|
|
391
|
+
exports.blockquote = blockquote;
|
|
392
|
+
exports.br = br;
|
|
393
|
+
exports.button = button;
|
|
394
|
+
exports.canvas = canvas;
|
|
395
|
+
exports.code = code;
|
|
396
|
+
exports.createStringHost = createStringHost;
|
|
397
|
+
exports.del = del;
|
|
398
|
+
exports.div = div;
|
|
399
|
+
exports.element = element;
|
|
400
|
+
exports.em = em;
|
|
401
|
+
exports.escapeAttr = escapeAttr;
|
|
402
|
+
exports.escapeHtml = escapeHtml;
|
|
403
|
+
exports.footer = footer;
|
|
404
|
+
exports.form = form;
|
|
405
|
+
exports.h1 = h1;
|
|
406
|
+
exports.h2 = h2;
|
|
407
|
+
exports.h3 = h3;
|
|
408
|
+
exports.h4 = h4;
|
|
409
|
+
exports.h5 = h5;
|
|
410
|
+
exports.h6 = h6;
|
|
411
|
+
exports.header = header;
|
|
412
|
+
exports.hr = hr;
|
|
413
|
+
exports.html = html;
|
|
414
|
+
exports.iframe = iframe;
|
|
415
|
+
exports.img = img;
|
|
416
|
+
exports.input = input;
|
|
417
|
+
exports.ins = ins;
|
|
418
|
+
exports.isVoidElement = isVoidElement;
|
|
419
|
+
exports.label = label;
|
|
420
|
+
exports.li = li;
|
|
421
|
+
exports.main = main;
|
|
422
|
+
exports.mark = mark;
|
|
423
|
+
exports.nav = nav;
|
|
424
|
+
exports.ol = ol;
|
|
425
|
+
exports.option = option;
|
|
426
|
+
exports.p = p;
|
|
427
|
+
exports.pre = pre;
|
|
428
|
+
exports.renderToString = renderToString;
|
|
429
|
+
exports.renderToStringMultiple = renderToStringMultiple;
|
|
430
|
+
exports.section = section;
|
|
431
|
+
exports.select = select;
|
|
432
|
+
exports.small = small;
|
|
433
|
+
exports.source = source;
|
|
434
|
+
exports.span = span;
|
|
435
|
+
exports.stringContext = stringContext;
|
|
436
|
+
exports.stringifyAttr = stringifyAttr;
|
|
437
|
+
exports.stringifyClass = stringifyClass;
|
|
438
|
+
exports.stringifyStyle = stringifyStyle;
|
|
439
|
+
exports.strong = strong;
|
|
440
|
+
exports.sub = sub;
|
|
441
|
+
exports.sup = sup;
|
|
442
|
+
exports.svg = svg;
|
|
443
|
+
exports.table = table;
|
|
444
|
+
exports.tbody = tbody;
|
|
445
|
+
exports.td = td;
|
|
446
|
+
exports.textarea = textarea;
|
|
447
|
+
exports.tfoot = tfoot;
|
|
448
|
+
exports.th = th;
|
|
449
|
+
exports.thead = thead;
|
|
450
|
+
exports.tr = tr;
|
|
451
|
+
exports.ul = ul;
|
|
452
|
+
exports.video = video;
|
|
453
|
+
//# sourceMappingURL=index.cjs.map
|
|
454
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/components/string-context.ts","../src/utils.ts","../src/components/element.ts","../src/components/html.ts","../src/components/elements.ts"],"names":["html","unrefValue"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 字符串渲染器类型定义\n */\n\nimport type { Mountable } from '@rasenjs/core'\n\n/**\n * 字符串渲染宿主\n * 用于收集渲染结果\n */\nexport interface StringHost {\n /**\n * 收集的 HTML 片段\n */\n fragments: string[]\n\n /**\n * 添加 HTML 片段\n */\n append(html: string): void\n\n /**\n * 获取完整的 HTML 字符串\n */\n toString(): string\n}\n\n/**\n * 创建字符串宿主\n */\nexport function createStringHost(): StringHost {\n const fragments: string[] = []\n return {\n fragments,\n append(html: string) {\n fragments.push(html)\n },\n toString() {\n return fragments.join('')\n }\n }\n}\n\n/**\n * 字符串渲染的 Mountable 类型\n * @deprecated 使用 Mountable<StringHost> 替代\n */\nexport type StringMountFunction = Mountable<StringHost>\n","/**\n * htmlContext 组件 - 提供 HTML 渲染上下文\n */\nimport type { Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { createStringHost } from '../types'\n\n/**\n * 创建字符串渲染上下文\n */\nexport function stringContext(props: {\n children: Array<Mountable<StringHost>>\n}): Mountable<StringHost> {\n return (host: StringHost) => {\n const { children } = props\n\n // 挂载所有子组件\n for (const child of children) {\n child(host)\n }\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n\n/**\n * 将组件渲染为 HTML 字符串\n *\n * 这是 SSR 的主要入口\n */\nexport function renderToString(component: Mountable<StringHost>): string {\n const host = createStringHost()\n component(host)\n return host.toString()\n}\n\n/**\n * 将多个组件渲染为 HTML 字符串\n */\nexport function renderToStringMultiple(components: Mountable<StringHost>[]): string {\n const host = createStringHost()\n for (const component of components) {\n component(host)\n }\n return host.toString()\n}\n","/**\n * HTML 转义字符映射\n */\nconst HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\n\n/**\n * 转义 HTML 特殊字符,防止 XSS\n */\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 转义属性值\n */\nexport function escapeAttr(value: string): string {\n return value.replace(/[&<>\"]/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 将属性值转换为字符串\n */\nexport function stringifyAttr(\n name: string,\n value: string | number | boolean | null | undefined\n): string {\n if (value === null || value === undefined || value === false) {\n return ''\n }\n if (value === true) {\n return ` ${name}`\n }\n return ` ${name}=\"${escapeAttr(String(value))}\"`\n}\n\n/**\n * 将样式对象转换为 style 属性字符串\n */\nexport function stringifyStyle(\n styles: Record<string, string | number | null | undefined>\n): string {\n const parts: string[] = []\n for (const [key, value] of Object.entries(styles)) {\n if (value !== null && value !== undefined) {\n // 将 camelCase 转换为 kebab-case\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n parts.push(`${kebabKey}: ${value}`)\n }\n }\n return parts.join('; ')\n}\n\n/**\n * 将类名数组或对象转换为 class 属性字符串\n */\nexport function stringifyClass(\n className: string | string[] | Record<string, boolean> | undefined\n): string {\n if (!className) {\n return ''\n }\n if (typeof className === 'string') {\n return className\n }\n if (Array.isArray(className)) {\n return className.filter(Boolean).join(' ')\n }\n // 对象形式 { 'class-name': true/false }\n return Object.entries(className)\n .filter(([, value]) => value)\n .map(([key]) => key)\n .join(' ')\n}\n\n/**\n * 自闭合标签列表\n */\nexport const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n])\n\n/**\n * 判断是否为自闭合标签\n */\nexport function isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag.toLowerCase())\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport {\n stringifyAttr,\n stringifyStyle,\n escapeHtml,\n isVoidElement\n} from '../utils'\n\n/**\n * element 组件 - 通用 HTML 元素组件(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染\n */\nexport const element = (props: {\n tag: string\n id?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions (including reactive text functions) */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n value?: PropValue<string | number>\n // SSR does not need events - removed for consistency\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const tag = props.tag\n const isVoid = isVoidElement(tag)\n\n // 构建开始标签\n let html = `<${tag}`\n\n // id\n const id = unrefValue(props.id)\n if (id) {\n html += stringifyAttr('id', id)\n }\n\n // className\n const className = unrefValue(props.className)\n if (className) {\n html += stringifyAttr('class', className)\n }\n\n // style\n const style = unrefValue(props.style)\n if (style && Object.keys(style).length > 0) {\n html += stringifyAttr('style', stringifyStyle(style))\n }\n\n // value (for input, textarea, select)\n const value = unrefValue(props.value)\n if (value !== undefined) {\n html += stringifyAttr('value', String(value))\n }\n\n // attrs (other attributes)\n const attrs = unrefValue(props.attrs)\n if (attrs) {\n for (const [key, val] of Object.entries(attrs)) {\n // 跳过无效的属性名(数字开头或纯数字)\n if (/^\\d/.test(key)) continue\n html += stringifyAttr(key, val)\n }\n }\n \n // 处理其他props(除了特殊props和已处理的)\n const specialProps = new Set(['tag', 'id', 'className', 'style', 'value', 'attrs', 'children', 'on'])\n for (const [key, val] of Object.entries(props)) {\n if (specialProps.has(key)) continue\n if (key.startsWith('on')) continue // 跳过事件处理器(SSR不需要)\n if (val === undefined || val === null) continue\n \n const attrValue = unrefValue(val as PropValue<unknown>)\n if (attrValue !== undefined && attrValue !== null) {\n // 只处理基本类型(string, number, boolean)\n if (typeof attrValue === 'string' || typeof attrValue === 'number' || typeof attrValue === 'boolean') {\n html += stringifyAttr(key, attrValue)\n }\n }\n }\n\n html += '>'\n\n // 自闭合标签不需要内容和结束标签\n if (isVoid) {\n host.append(html)\n return undefined\n }\n\n // children (text content or mount functions)\n const children = props.children\n if (children !== undefined) {\n if (typeof children === 'string' || (typeof children === 'object' && 'value' in (children as any))) {\n // String content (or ref to string)\n html += escapeHtml(String(unrefValue(children as PropValue<string>)))\n } else if (Array.isArray(children) && children.length > 0) {\n // Array of children - 创建子宿主收集子元素内容\n const childHost: StringHost = {\n fragments: [],\n append(s: string) {\n this.fragments.push(s)\n },\n toString() {\n return this.fragments.join('')\n }\n }\n\n for (const child of children) {\n if (child === null || child === undefined) continue\n \n if (typeof child === 'string') {\n // String child\n childHost.append(escapeHtml(child))\n } else if (typeof child === 'function') {\n // Function - could be Mountable or reactive text function\n // Call it with childHost and check the return value type\n const result = (child as any)(childHost)\n \n // If it returns string/number, it's a reactive text function that ignored our parameter\n if (typeof result === 'string' || typeof result === 'number') {\n childHost.append(escapeHtml(String(result)))\n }\n // Otherwise it's a Mountable, already executed correctly\n }\n }\n\n html += childHost.toString()\n }\n }\n\n // 结束标签\n html += `</${tag}>`\n\n host.append(html)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\n\n/**\n * html 组件 - 用于插入原始 HTML 内容(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染。\n * 直接将 HTML 字符串输出,不创建额外的包裹元素。\n *\n * 安全提示:请确保传入的 HTML 内容是可信的,因为它会直接插入到输出中\n *\n * @example\n * ```ts\n * // 静态 HTML - 直接插入\n * div({}, html({ content: '<p>paragraph</p><span>text</span>' }))\n * // 结果: <div><p>paragraph</p><span>text</span></div>\n * ```\n */\nexport const html = (props: {\n /** 原始 HTML 内容 */\n content: PropValue<string>\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const content = unrefValue(props.content) || ''\n // 直接输出 HTML 内容,不添加包裹元素\n host.append(content)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { element } from './element'\n\n// ============================================================================\n// Type definitions\n// ============================================================================\n\ninterface BaseProps {\n id?: PropValue<string>\n class?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n // SSR does not support events - removed on, onClick, onInput, etc.\n}\n\n/** Child type - 响应式文本函数优先匹配 */\ntype Child = string | (() => string | number) | Mountable<StringHost>\n\n/**\n * Factory function to create HTML element components\n * Supports: el(), el('text'), el(child), el(props), el(props, ...children)\n */\nfunction createElement(tag: string) {\n return (\n propsOrChild?: BaseProps | Child,\n ...restChildren: Child[]\n ): Mountable<StringHost> => {\n // No arguments\n if (propsOrChild === undefined) {\n return element({ tag })\n }\n\n // First argument is string or function (Mountable or reactive text), treat as child\n if (\n typeof propsOrChild === 'string' ||\n typeof propsOrChild === 'function'\n ) {\n const children = [propsOrChild, ...restChildren]\n return element({ tag, children })\n }\n \n // First argument is props object\n const props = propsOrChild as BaseProps\n \n // Normalize props: convert `class` to `className` for element()\n const { class: cls, className, ...restProps } = props as any\n const normalizedProps = {\n ...restProps,\n className: className || cls\n }\n \n if (restChildren.length > 0) {\n // Merge children\n const existingChildren = props.children\n const children = Array.isArray(existingChildren)\n ? [...existingChildren, ...restChildren]\n : existingChildren !== undefined\n ? [existingChildren, ...restChildren]\n : restChildren\n \n return element({ tag, ...normalizedProps, children })\n }\n\n return element({ tag, ...normalizedProps })\n }\n}\n\n// ============================================================================\n// Common elements\n// ============================================================================\n\nexport const div = createElement('div')\nexport const span = createElement('span')\nexport const button = createElement('button')\nexport const a = createElement('a')\nexport const p = createElement('p')\n\n// Headings\nexport const h1 = createElement('h1')\nexport const h2 = createElement('h2')\nexport const h3 = createElement('h3')\nexport const h4 = createElement('h4')\nexport const h5 = createElement('h5')\nexport const h6 = createElement('h6')\n\n// Lists\nexport const ul = createElement('ul')\nexport const ol = createElement('ol')\nexport const li = createElement('li')\n\n// Forms\nexport const form = createElement('form')\nexport const label = createElement('label')\nexport const select = createElement('select')\n\n// Tables\nexport const table = createElement('table')\nexport const thead = createElement('thead')\nexport const tbody = createElement('tbody')\nexport const tfoot = createElement('tfoot')\nexport const tr = createElement('tr')\nexport const th = createElement('th')\nexport const td = createElement('td')\n\n// Semantic layout\nexport const section = createElement('section')\nexport const article = createElement('article')\nexport const header = createElement('header')\nexport const footer = createElement('footer')\nexport const nav = createElement('nav')\nexport const main = createElement('main')\nexport const aside = createElement('aside')\n\n// Other common elements\nexport const pre = createElement('pre')\nexport const code = createElement('code')\nexport const blockquote = createElement('blockquote')\nexport const strong = createElement('strong')\nexport const em = createElement('em')\nexport const small = createElement('small')\nexport const mark = createElement('mark')\nexport const del = createElement('del')\nexport const ins = createElement('ins')\nexport const sub = createElement('sub')\nexport const sup = createElement('sup')\nexport const svg = createElement('svg')\n\n// Self-closing elements\nexport const br = () => element({ tag: 'br' })\nexport const hr = () => element({ tag: 'hr' })\n\n// ============================================================================\n// Special elements with extended props\n// ============================================================================\n\n/**\n * input component\n */\nexport const input = (\n props: BaseProps & {\n type?: PropValue<string>\n value?: PropValue<string | any>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { type, value, placeholder, disabled, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(type !== undefined ? { type } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {})\n }\n\n return element({\n tag: 'input',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { value } : {})\n })\n}\n\n/**\n * img component\n */\nexport const img = (props: BaseProps & {\n src?: PropValue<string>\n alt?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n}): Mountable<StringHost> => {\n return element({ tag: 'img', ...props })\n}\n\n/**\n * textarea component\n */\nexport const textarea = (\n props: BaseProps & {\n value?: PropValue<string>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n rows?: PropValue<number>\n cols?: PropValue<number>\n }\n): Mountable<StringHost> => {\n const { value, placeholder, disabled, rows, cols, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(rows !== undefined ? { rows } : {}),\n ...(cols !== undefined ? { cols } : {})\n }\n\n // textarea value should be children (text content)\n return element({\n tag: 'textarea',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { children: String(value) } : {})\n })\n}\n\n/**\n * option component\n */\nexport const option = (\n props: BaseProps & {\n value?: PropValue<string | number>\n selected?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { value, selected, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(value !== undefined ? { value } : {}),\n ...(selected ? { selected: true } : {})\n }\n\n return element({\n tag: 'option',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * video component\n */\nexport const video = (\n props: BaseProps & {\n src?: PropValue<string>\n poster?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, poster, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(poster !== undefined ? { poster } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'video',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * audio component\n */\nexport const audio = (\n props: BaseProps & {\n src?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'audio',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * source component\n */\nexport const source = (\n props: BaseProps & {\n src?: PropValue<string>\n type?: PropValue<string>\n }\n): Mountable<StringHost> => {\n const { src, type, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(type !== undefined ? { type } : {})\n }\n\n return element({\n tag: 'source',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * iframe component\n */\nexport const iframe = (\n props: BaseProps & {\n src?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n frameborder?: PropValue<string | number>\n allowfullscreen?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, width, height, frameborder, allowfullscreen, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(frameborder !== undefined ? { frameborder } : {}),\n ...(allowfullscreen ? { allowfullscreen: true } : {})\n }\n\n return element({\n tag: 'iframe',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * canvas component (SSR only renders empty canvas tag)\n */\nexport const canvas = (\n props: BaseProps & {\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n }\n): Mountable<StringHost> => {\n const { width, height, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {})\n }\n\n return element({\n tag: 'canvas',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n"]}
|