1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| /* @flow */
|
| import { inBrowser } from 'core/util/env'
| import { makeMap } from 'shared/util'
|
| export const namespaceMap = {
| svg: 'http://www.w3.org/2000/svg',
| math: 'http://www.w3.org/1998/Math/MathML'
| }
|
| export const isHTMLTag = makeMap(
| 'html,body,base,head,link,meta,style,title,' +
| 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
| 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
| 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
| 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
| 'embed,object,param,source,canvas,script,noscript,del,ins,' +
| 'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
| 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
| 'output,progress,select,textarea,' +
| 'details,dialog,menu,menuitem,summary,' +
| 'content,element,shadow,template,blockquote,iframe,tfoot'
| )
|
| // this map is intentionally selective, only covering SVG elements that may
| // contain child elements.
| export const isSVG = makeMap(
| 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
| 'foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
| 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
| true
| )
|
| export const isPreTag = (tag: ?string): boolean => tag === 'pre'
|
| export const isReservedTag = (tag: string): ?boolean => {
| return isHTMLTag(tag) || isSVG(tag)
| }
|
| export function getTagNamespace (tag: string): ?string {
| if (isSVG(tag)) {
| return 'svg'
| }
| // basic support for MathML
| // note it doesn't support other MathML elements being component roots
| if (tag === 'math') {
| return 'math'
| }
| }
|
| const unknownElementCache = Object.create(null)
| export function isUnknownElement (tag: string): boolean {
| /* istanbul ignore if */
| if (!inBrowser) {
| return true
| }
| if (isReservedTag(tag)) {
| return false
| }
| tag = tag.toLowerCase()
| /* istanbul ignore if */
| if (unknownElementCache[tag] != null) {
| return unknownElementCache[tag]
| }
| const el = document.createElement(tag)
| if (tag.indexOf('-') > -1) {
| // http://stackoverflow.com/a/28210364/1070244
| return (unknownElementCache[tag] = (
| el.constructor === window.HTMLUnknownElement ||
| el.constructor === window.HTMLElement
| ))
| } else {
| return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
| }
| }
|
| export const isTextInputType = makeMap('text,number,password,search,email,tel,url')
|
|