UNPKG

10.1 kBPlain TextView Raw
1// tslint:disable:max-file-line-count
2import {h} from 'snabbdom/h';
3import {VNode, VNodeData} from 'snabbdom/vnode';
4
5function isValidString(param: any): boolean {
6 return typeof param === 'string' && param.length > 0;
7}
8
9function isSelector(param: any): boolean {
10 return isValidString(param) && (param[0] === '.' || param[0] === '#');
11}
12
13function 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
38const 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
120const svg = createTagFunction('svg');
121
122SVG_TAG_NAMES.forEach(tag => {
123 svg[tag] = createTagFunction(tag);
124});
125
126const 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
232const exported = {
233 SVG_TAG_NAMES,
234 TAG_NAMES,
235 svg,
236 isSelector,
237 createTagFunction,
238};
239TAG_NAMES.forEach(n => {
240 exported[n] = createTagFunction(n);
241});
242export default (exported as any) as HyperScriptHelpers;
243
244export type Children = Array<VNode | string | null>;
245export type Properties = any; //VNodeData // does not work yet, because of https://github.com/snabbdom/snabbdom/pull/325
246export 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
260export 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
342export 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}