1 |
|
2 | import {h} from 'snabbdom/h';
|
3 | import {VNode, VNodeData} from 'snabbdom/vnode';
|
4 |
|
5 | function isValidString(param: any): boolean {
|
6 | return typeof param === 'string' && param.length > 0;
|
7 | }
|
8 |
|
9 | function isSelector(param: any): boolean {
|
10 | return isValidString(param) && (param[0] === '.' || param[0] === '#');
|
11 | }
|
12 |
|
13 | function createTagFunction(tagName: string): Function {
|
14 | return function hyperscript(a: any, b?: any, c?: any): VNode {
|
15 | const hasA = typeof a !== 'undefined';
|
16 | const hasB = typeof b !== 'undefined';
|
17 | const hasC = typeof c !== 'undefined';
|
18 | if (isSelector(a)) {
|
19 | if (hasB && hasC) {
|
20 | return h(tagName + a, b, c);
|
21 | } else if (hasB) {
|
22 | return h(tagName + a, b);
|
23 | } else {
|
24 | return h(tagName + a, {});
|
25 | }
|
26 | } else if (hasC) {
|
27 | return h(tagName + a, b, c);
|
28 | } else if (hasB) {
|
29 | return h(tagName, a, b);
|
30 | } else if (hasA) {
|
31 | return h(tagName, a);
|
32 | } else {
|
33 | return h(tagName, {});
|
34 | }
|
35 | };
|
36 | }
|
37 |
|
38 | const SVG_TAG_NAMES = [
|
39 | 'a',
|
40 | 'altGlyph',
|
41 | 'altGlyphDef',
|
42 | 'altGlyphItem',
|
43 | 'animate',
|
44 | 'animateColor',
|
45 | 'animateMotion',
|
46 | 'animateTransform',
|
47 | 'circle',
|
48 | 'clipPath',
|
49 | 'colorProfile',
|
50 | 'cursor',
|
51 | 'defs',
|
52 | 'desc',
|
53 | 'ellipse',
|
54 | 'feBlend',
|
55 | 'feColorMatrix',
|
56 | 'feComponentTransfer',
|
57 | 'feComposite',
|
58 | 'feConvolveMatrix',
|
59 | 'feDiffuseLighting',
|
60 | 'feDisplacementMap',
|
61 | 'feDistantLight',
|
62 | 'feFlood',
|
63 | 'feFuncA',
|
64 | 'feFuncB',
|
65 | 'feFuncG',
|
66 | 'feFuncR',
|
67 | 'feGaussianBlur',
|
68 | 'feImage',
|
69 | 'feMerge',
|
70 | 'feMergeNode',
|
71 | 'feMorphology',
|
72 | 'feOffset',
|
73 | 'fePointLight',
|
74 | 'feSpecularLighting',
|
75 | 'feSpotlight',
|
76 | 'feTile',
|
77 | 'feTurbulence',
|
78 | 'filter',
|
79 | 'font',
|
80 | 'fontFace',
|
81 | 'fontFaceFormat',
|
82 | 'fontFaceName',
|
83 | 'fontFaceSrc',
|
84 | 'fontFaceUri',
|
85 | 'foreignObject',
|
86 | 'g',
|
87 | 'glyph',
|
88 | 'glyphRef',
|
89 | 'hkern',
|
90 | 'image',
|
91 | 'line',
|
92 | 'linearGradient',
|
93 | 'marker',
|
94 | 'mask',
|
95 | 'metadata',
|
96 | 'missingGlyph',
|
97 | 'mpath',
|
98 | 'path',
|
99 | 'pattern',
|
100 | 'polygon',
|
101 | 'polyline',
|
102 | 'radialGradient',
|
103 | 'rect',
|
104 | 'script',
|
105 | 'set',
|
106 | 'stop',
|
107 | 'style',
|
108 | 'switch',
|
109 | 'symbol',
|
110 | 'text',
|
111 | 'textPath',
|
112 | 'title',
|
113 | 'tref',
|
114 | 'tspan',
|
115 | 'use',
|
116 | 'view',
|
117 | 'vkern',
|
118 | ];
|
119 |
|
120 | const svg = createTagFunction('svg');
|
121 |
|
122 | SVG_TAG_NAMES.forEach(tag => {
|
123 | svg[tag] = createTagFunction(tag);
|
124 | });
|
125 |
|
126 | const TAG_NAMES = [
|
127 | 'a',
|
128 | 'abbr',
|
129 | 'address',
|
130 | 'area',
|
131 | 'article',
|
132 | 'aside',
|
133 | 'audio',
|
134 | 'b',
|
135 | 'base',
|
136 | 'bdi',
|
137 | 'bdo',
|
138 | 'blockquote',
|
139 | 'body',
|
140 | 'br',
|
141 | 'button',
|
142 | 'canvas',
|
143 | 'caption',
|
144 | 'cite',
|
145 | 'code',
|
146 | 'col',
|
147 | 'colgroup',
|
148 | 'dd',
|
149 | 'del',
|
150 | 'details',
|
151 | 'dfn',
|
152 | 'dir',
|
153 | 'div',
|
154 | 'dl',
|
155 | 'dt',
|
156 | 'em',
|
157 | 'embed',
|
158 | 'fieldset',
|
159 | 'figcaption',
|
160 | 'figure',
|
161 | 'footer',
|
162 | 'form',
|
163 | 'h1',
|
164 | 'h2',
|
165 | 'h3',
|
166 | 'h4',
|
167 | 'h5',
|
168 | 'h6',
|
169 | 'head',
|
170 | 'header',
|
171 | 'hgroup',
|
172 | 'hr',
|
173 | 'html',
|
174 | 'i',
|
175 | 'iframe',
|
176 | 'img',
|
177 | 'input',
|
178 | 'ins',
|
179 | 'kbd',
|
180 | 'keygen',
|
181 | 'label',
|
182 | 'legend',
|
183 | 'li',
|
184 | 'link',
|
185 | 'main',
|
186 | 'map',
|
187 | 'mark',
|
188 | 'menu',
|
189 | 'meta',
|
190 | 'nav',
|
191 | 'noscript',
|
192 | 'object',
|
193 | 'ol',
|
194 | 'optgroup',
|
195 | 'option',
|
196 | 'p',
|
197 | 'param',
|
198 | 'pre',
|
199 | 'progress',
|
200 | 'q',
|
201 | 'rp',
|
202 | 'rt',
|
203 | 'ruby',
|
204 | 's',
|
205 | 'samp',
|
206 | 'script',
|
207 | 'section',
|
208 | 'select',
|
209 | 'small',
|
210 | 'source',
|
211 | 'span',
|
212 | 'strong',
|
213 | 'style',
|
214 | 'sub',
|
215 | 'summary',
|
216 | 'sup',
|
217 | 'table',
|
218 | 'tbody',
|
219 | 'td',
|
220 | 'textarea',
|
221 | 'tfoot',
|
222 | 'th',
|
223 | 'thead',
|
224 | 'time',
|
225 | 'title',
|
226 | 'tr',
|
227 | 'u',
|
228 | 'ul',
|
229 | 'video',
|
230 | ];
|
231 |
|
232 | const exported = {
|
233 | SVG_TAG_NAMES,
|
234 | TAG_NAMES,
|
235 | svg,
|
236 | isSelector,
|
237 | createTagFunction,
|
238 | };
|
239 | TAG_NAMES.forEach(n => {
|
240 | exported[n] = createTagFunction(n);
|
241 | });
|
242 | export default (exported as any) as HyperScriptHelpers;
|
243 |
|
244 | export type Children = Array<VNode | string | null>;
|
245 | export type Properties = any;
|
246 | export interface HyperScriptHelperFn {
|
247 | (): VNode;
|
248 | (textOrSelector: string): VNode;
|
249 | (children: Children): VNode;
|
250 | (properties: Properties): VNode;
|
251 | (selector: string, children: Children): VNode;
|
252 | (selector: string, text: string): VNode;
|
253 | (selector: string, properties: Properties): VNode;
|
254 | (properties: Properties, children: Children): VNode;
|
255 | (properties: Properties, text: string): VNode;
|
256 | (selector: string, properties: Properties, text: string): VNode;
|
257 | (selector: string, properties: Properties, children: Children): VNode;
|
258 | }
|
259 |
|
260 | export interface SVGHelperFn extends HyperScriptHelperFn {
|
261 | a: HyperScriptHelperFn;
|
262 | altGlyph: HyperScriptHelperFn;
|
263 | altGlyphDef: HyperScriptHelperFn;
|
264 | altGlyphItem: HyperScriptHelperFn;
|
265 | animate: HyperScriptHelperFn;
|
266 | animateColor: HyperScriptHelperFn;
|
267 | animateMotion: HyperScriptHelperFn;
|
268 | animateTransform: HyperScriptHelperFn;
|
269 | circle: HyperScriptHelperFn;
|
270 | clipPath: HyperScriptHelperFn;
|
271 | colorProfile: HyperScriptHelperFn;
|
272 | cursor: HyperScriptHelperFn;
|
273 | defs: HyperScriptHelperFn;
|
274 | desc: HyperScriptHelperFn;
|
275 | ellipse: HyperScriptHelperFn;
|
276 | feBlend: HyperScriptHelperFn;
|
277 | feColorMatrix: HyperScriptHelperFn;
|
278 | feComponentTransfer: HyperScriptHelperFn;
|
279 | feComposite: HyperScriptHelperFn;
|
280 | feConvolveMatrix: HyperScriptHelperFn;
|
281 | feDiffuseLighting: HyperScriptHelperFn;
|
282 | feDisplacementMap: HyperScriptHelperFn;
|
283 | feDistantLight: HyperScriptHelperFn;
|
284 | feFlood: HyperScriptHelperFn;
|
285 | feFuncA: HyperScriptHelperFn;
|
286 | feFuncB: HyperScriptHelperFn;
|
287 | feFuncG: HyperScriptHelperFn;
|
288 | feFuncR: HyperScriptHelperFn;
|
289 | feGaussianBlur: HyperScriptHelperFn;
|
290 | feImage: HyperScriptHelperFn;
|
291 | feMerge: HyperScriptHelperFn;
|
292 | feMergeNode: HyperScriptHelperFn;
|
293 | feMorphology: HyperScriptHelperFn;
|
294 | feOffset: HyperScriptHelperFn;
|
295 | fePointLight: HyperScriptHelperFn;
|
296 | feSpecularLighting: HyperScriptHelperFn;
|
297 | feSpotlight: HyperScriptHelperFn;
|
298 | feTile: HyperScriptHelperFn;
|
299 | feTurbulence: HyperScriptHelperFn;
|
300 | filter: HyperScriptHelperFn;
|
301 | font: HyperScriptHelperFn;
|
302 | fontFace: HyperScriptHelperFn;
|
303 | fontFaceFormat: HyperScriptHelperFn;
|
304 | fontFaceName: HyperScriptHelperFn;
|
305 | fontFaceSrc: HyperScriptHelperFn;
|
306 | fontFaceUri: HyperScriptHelperFn;
|
307 | foreignObject: HyperScriptHelperFn;
|
308 | g: HyperScriptHelperFn;
|
309 | glyph: HyperScriptHelperFn;
|
310 | glyphRef: HyperScriptHelperFn;
|
311 | hkern: HyperScriptHelperFn;
|
312 | image: HyperScriptHelperFn;
|
313 | line: HyperScriptHelperFn;
|
314 | linearGradient: HyperScriptHelperFn;
|
315 | marker: HyperScriptHelperFn;
|
316 | mask: HyperScriptHelperFn;
|
317 | metadata: HyperScriptHelperFn;
|
318 | missingGlyph: HyperScriptHelperFn;
|
319 | mpath: HyperScriptHelperFn;
|
320 | path: HyperScriptHelperFn;
|
321 | pattern: HyperScriptHelperFn;
|
322 | polygon: HyperScriptHelperFn;
|
323 | polyline: HyperScriptHelperFn;
|
324 | radialGradient: HyperScriptHelperFn;
|
325 | rect: HyperScriptHelperFn;
|
326 | script: HyperScriptHelperFn;
|
327 | set: HyperScriptHelperFn;
|
328 | stop: HyperScriptHelperFn;
|
329 | style: HyperScriptHelperFn;
|
330 | switch: HyperScriptHelperFn;
|
331 | symbol: HyperScriptHelperFn;
|
332 | text: HyperScriptHelperFn;
|
333 | textPath: HyperScriptHelperFn;
|
334 | title: HyperScriptHelperFn;
|
335 | tref: HyperScriptHelperFn;
|
336 | tspan: HyperScriptHelperFn;
|
337 | use: HyperScriptHelperFn;
|
338 | view: HyperScriptHelperFn;
|
339 | vkern: HyperScriptHelperFn;
|
340 | }
|
341 |
|
342 | export interface HyperScriptHelpers {
|
343 | svg: SVGHelperFn;
|
344 | a: HyperScriptHelperFn;
|
345 | abbr: HyperScriptHelperFn;
|
346 | address: HyperScriptHelperFn;
|
347 | area: HyperScriptHelperFn;
|
348 | article: HyperScriptHelperFn;
|
349 | aside: HyperScriptHelperFn;
|
350 | audio: HyperScriptHelperFn;
|
351 | b: HyperScriptHelperFn;
|
352 | base: HyperScriptHelperFn;
|
353 | bdi: HyperScriptHelperFn;
|
354 | bdo: HyperScriptHelperFn;
|
355 | blockquote: HyperScriptHelperFn;
|
356 | body: HyperScriptHelperFn;
|
357 | br: HyperScriptHelperFn;
|
358 | button: HyperScriptHelperFn;
|
359 | canvas: HyperScriptHelperFn;
|
360 | caption: HyperScriptHelperFn;
|
361 | cite: HyperScriptHelperFn;
|
362 | code: HyperScriptHelperFn;
|
363 | col: HyperScriptHelperFn;
|
364 | colgroup: HyperScriptHelperFn;
|
365 | dd: HyperScriptHelperFn;
|
366 | del: HyperScriptHelperFn;
|
367 | details: HyperScriptHelperFn;
|
368 | dfn: HyperScriptHelperFn;
|
369 | dir: HyperScriptHelperFn;
|
370 | div: HyperScriptHelperFn;
|
371 | dl: HyperScriptHelperFn;
|
372 | dt: HyperScriptHelperFn;
|
373 | em: HyperScriptHelperFn;
|
374 | embed: HyperScriptHelperFn;
|
375 | fieldset: HyperScriptHelperFn;
|
376 | figcaption: HyperScriptHelperFn;
|
377 | figure: HyperScriptHelperFn;
|
378 | footer: HyperScriptHelperFn;
|
379 | form: HyperScriptHelperFn;
|
380 | h1: HyperScriptHelperFn;
|
381 | h2: HyperScriptHelperFn;
|
382 | h3: HyperScriptHelperFn;
|
383 | h4: HyperScriptHelperFn;
|
384 | h5: HyperScriptHelperFn;
|
385 | h6: HyperScriptHelperFn;
|
386 | head: HyperScriptHelperFn;
|
387 | header: HyperScriptHelperFn;
|
388 | hgroup: HyperScriptHelperFn;
|
389 | hr: HyperScriptHelperFn;
|
390 | html: HyperScriptHelperFn;
|
391 | i: HyperScriptHelperFn;
|
392 | iframe: HyperScriptHelperFn;
|
393 | img: HyperScriptHelperFn;
|
394 | input: HyperScriptHelperFn;
|
395 | ins: HyperScriptHelperFn;
|
396 | kbd: HyperScriptHelperFn;
|
397 | keygen: HyperScriptHelperFn;
|
398 | label: HyperScriptHelperFn;
|
399 | legend: HyperScriptHelperFn;
|
400 | li: HyperScriptHelperFn;
|
401 | link: HyperScriptHelperFn;
|
402 | main: HyperScriptHelperFn;
|
403 | map: HyperScriptHelperFn;
|
404 | mark: HyperScriptHelperFn;
|
405 | menu: HyperScriptHelperFn;
|
406 | meta: HyperScriptHelperFn;
|
407 | nav: HyperScriptHelperFn;
|
408 | noscript: HyperScriptHelperFn;
|
409 | object: HyperScriptHelperFn;
|
410 | ol: HyperScriptHelperFn;
|
411 | optgroup: HyperScriptHelperFn;
|
412 | option: HyperScriptHelperFn;
|
413 | p: HyperScriptHelperFn;
|
414 | param: HyperScriptHelperFn;
|
415 | pre: HyperScriptHelperFn;
|
416 | progress: HyperScriptHelperFn;
|
417 | q: HyperScriptHelperFn;
|
418 | rp: HyperScriptHelperFn;
|
419 | rt: HyperScriptHelperFn;
|
420 | ruby: HyperScriptHelperFn;
|
421 | s: HyperScriptHelperFn;
|
422 | samp: HyperScriptHelperFn;
|
423 | script: HyperScriptHelperFn;
|
424 | section: HyperScriptHelperFn;
|
425 | select: HyperScriptHelperFn;
|
426 | small: HyperScriptHelperFn;
|
427 | source: HyperScriptHelperFn;
|
428 | span: HyperScriptHelperFn;
|
429 | strong: HyperScriptHelperFn;
|
430 | style: HyperScriptHelperFn;
|
431 | sub: HyperScriptHelperFn;
|
432 | summary: HyperScriptHelperFn;
|
433 | sup: HyperScriptHelperFn;
|
434 | table: HyperScriptHelperFn;
|
435 | tbody: HyperScriptHelperFn;
|
436 | td: HyperScriptHelperFn;
|
437 | textarea: HyperScriptHelperFn;
|
438 | tfoot: HyperScriptHelperFn;
|
439 | th: HyperScriptHelperFn;
|
440 | thead: HyperScriptHelperFn;
|
441 | time: HyperScriptHelperFn;
|
442 | title: HyperScriptHelperFn;
|
443 | tr: HyperScriptHelperFn;
|
444 | u: HyperScriptHelperFn;
|
445 | ul: HyperScriptHelperFn;
|
446 | video: HyperScriptHelperFn;
|
447 | }
|