1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik'use strict';
2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar Tokenizer = require('../tokenization/tokenizer'),
4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    HTML = require('./html');
5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Aliases
7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar $ = HTML.TAG_NAMES,
8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    NS = HTML.NAMESPACES,
9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    ATTRS = HTML.ATTRS;
10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//MIME types
13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar MIME_TYPES = {
14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    TEXT_HTML: 'text/html',
15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    APPLICATION_XML: 'application/xhtml+xml'
16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Attributes
19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar DEFINITION_URL_ATTR = 'definitionurl',
20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL',
21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    SVG_ATTRS_ADJUSTMENT_MAP = {
22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'attributename': 'attributeName',
23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'attributetype': 'attributeType',
24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'basefrequency': 'baseFrequency',
25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'baseprofile': 'baseProfile',
26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'calcmode': 'calcMode',
27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'clippathunits': 'clipPathUnits',
28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'contentscripttype': 'contentScriptType',
29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'contentstyletype': 'contentStyleType',
30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'diffuseconstant': 'diffuseConstant',
31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'edgemode': 'edgeMode',
32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'externalresourcesrequired': 'externalResourcesRequired',
33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'filterres': 'filterRes',
34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'filterunits': 'filterUnits',
35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'glyphref': 'glyphRef',
36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'gradienttransform': 'gradientTransform',
37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'gradientunits': 'gradientUnits',
38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'kernelmatrix': 'kernelMatrix',
39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'kernelunitlength': 'kernelUnitLength',
40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'keypoints': 'keyPoints',
41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'keysplines': 'keySplines',
42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'keytimes': 'keyTimes',
43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'lengthadjust': 'lengthAdjust',
44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'limitingconeangle': 'limitingConeAngle',
45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'markerheight': 'markerHeight',
46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'markerunits': 'markerUnits',
47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'markerwidth': 'markerWidth',
48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'maskcontentunits': 'maskContentUnits',
49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'maskunits': 'maskUnits',
50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'numoctaves': 'numOctaves',
51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'pathlength': 'pathLength',
52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'patterncontentunits': 'patternContentUnits',
53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'patterntransform': 'patternTransform',
54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'patternunits': 'patternUnits',
55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'pointsatx': 'pointsAtX',
56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'pointsaty': 'pointsAtY',
57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'pointsatz': 'pointsAtZ',
58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'preservealpha': 'preserveAlpha',
59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'preserveaspectratio': 'preserveAspectRatio',
60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'primitiveunits': 'primitiveUnits',
61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'refx': 'refX',
62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'refy': 'refY',
63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'repeatcount': 'repeatCount',
64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'repeatdur': 'repeatDur',
65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'requiredextensions': 'requiredExtensions',
66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'requiredfeatures': 'requiredFeatures',
67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'specularconstant': 'specularConstant',
68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'specularexponent': 'specularExponent',
69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'spreadmethod': 'spreadMethod',
70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'startoffset': 'startOffset',
71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'stddeviation': 'stdDeviation',
72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'stitchtiles': 'stitchTiles',
73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'surfacescale': 'surfaceScale',
74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'systemlanguage': 'systemLanguage',
75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'tablevalues': 'tableValues',
76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'targetx': 'targetX',
77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'targety': 'targetY',
78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'textlength': 'textLength',
79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'viewbox': 'viewBox',
80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'viewtarget': 'viewTarget',
81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xchannelselector': 'xChannelSelector',
82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'ychannelselector': 'yChannelSelector',
83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'zoomandpan': 'zoomAndPan'
84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    },
85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    XML_ATTRS_ADJUSTMENT_MAP = {
86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK},
87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK},
88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK},
89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK},
90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK},
91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK},
92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK},
93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML},
94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML},
95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML},
96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS},
97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS}
98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    };
100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//SVG tag names adjustment map
102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar SVG_TAG_NAMES_ADJUSTMENT_MAP = {
103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'altglyph': 'altGlyph',
104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'altglyphdef': 'altGlyphDef',
105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'altglyphitem': 'altGlyphItem',
106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'animatecolor': 'animateColor',
107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'animatemotion': 'animateMotion',
108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'animatetransform': 'animateTransform',
109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'clippath': 'clipPath',
110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feblend': 'feBlend',
111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fecolormatrix': 'feColorMatrix',
112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fecomponenttransfer': 'feComponentTransfer',
113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fecomposite': 'feComposite',
114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feconvolvematrix': 'feConvolveMatrix',
115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fediffuselighting': 'feDiffuseLighting',
116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fedisplacementmap': 'feDisplacementMap',
117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fedistantlight': 'feDistantLight',
118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feflood': 'feFlood',
119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fefunca': 'feFuncA',
120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fefuncb': 'feFuncB',
121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fefuncg': 'feFuncG',
122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fefuncr': 'feFuncR',
123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fegaussianblur': 'feGaussianBlur',
124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feimage': 'feImage',
125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'femerge': 'feMerge',
126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'femergenode': 'feMergeNode',
127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'femorphology': 'feMorphology',
128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feoffset': 'feOffset',
129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fepointlight': 'fePointLight',
130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fespecularlighting': 'feSpecularLighting',
131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fespotlight': 'feSpotLight',
132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'fetile': 'feTile',
133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'feturbulence': 'feTurbulence',
134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'foreignobject': 'foreignObject',
135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'glyphref': 'glyphRef',
136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'lineargradient': 'linearGradient',
137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'radialgradient': 'radialGradient',
138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    'textpath': 'textPath'
139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Tags that causes exit from foreign content
142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar EXITS_FOREIGN_CONTENT = {};
143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.B] = true;
145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.BIG] = true;
146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true;
147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.BODY] = true;
148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.BR] = true;
149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.CENTER] = true;
150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.CODE] = true;
151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.DD] = true;
152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.DIV] = true;
153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.DL] = true;
154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.DT] = true;
155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.EM] = true;
156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.EMBED] = true;
157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H1] = true;
158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H2] = true;
159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H3] = true;
160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H4] = true;
161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H5] = true;
162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.H6] = true;
163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.HEAD] = true;
164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.HR] = true;
165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.I] = true;
166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.IMG] = true;
167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.LI] = true;
168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.LISTING] = true;
169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.MENU] = true;
170b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.META] = true;
171b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.NOBR] = true;
172b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.OL] = true;
173b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.P] = true;
174b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.PRE] = true;
175b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.RUBY] = true;
176b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.S] = true;
177b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.SMALL] = true;
178b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.SPAN] = true;
179b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.STRONG] = true;
180b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.STRIKE] = true;
181b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.SUB] = true;
182b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.SUP] = true;
183b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.TABLE] = true;
184b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.TT] = true;
185b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.U] = true;
186b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.UL] = true;
187b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikEXITS_FOREIGN_CONTENT[$.VAR] = true;
188b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
189b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Check exit from foreign content
190b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.causesExit = function (startTagToken) {
191b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    var tn = startTagToken.tagName;
192b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
193b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if (tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
194b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
195b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null)) {
196b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        return true;
197b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    }
198b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
199b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    return EXITS_FOREIGN_CONTENT[tn];
200b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
201b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
202b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Token adjustments
203b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.adjustTokenMathMLAttrs = function (token) {
204b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    for (var i = 0; i < token.attrs.length; i++) {
205b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        if (token.attrs[i].name === DEFINITION_URL_ATTR) {
206b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR;
207b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            break;
208b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        }
209b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    }
210b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
211b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
212b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.adjustTokenSVGAttrs = function (token) {
213b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    for (var i = 0; i < token.attrs.length; i++) {
214b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
215b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
216b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        if (adjustedAttrName)
217b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            token.attrs[i].name = adjustedAttrName;
218b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    }
219b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
220b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
221b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.adjustTokenXMLAttrs = function (token) {
222b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    for (var i = 0; i < token.attrs.length; i++) {
223b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
224b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
225b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        if (adjustedAttrEntry) {
226b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            token.attrs[i].prefix = adjustedAttrEntry.prefix;
227b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            token.attrs[i].name = adjustedAttrEntry.name;
228b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            token.attrs[i].namespace = adjustedAttrEntry.namespace;
229b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        }
230b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    }
231b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
232b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
233b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.adjustTokenSVGTagName = function (token) {
234b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName];
235b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
236b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if (adjustedTagName)
237b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token.tagName = adjustedTagName;
238b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
239b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
240b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik//Integration points
241b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.isMathMLTextIntegrationPoint = function (tn, ns) {
242b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT);
243b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
244b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
245b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikexports.isHtmlIntegrationPoint = function (tn, ns, attrs) {
246b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if (ns === NS.MATHML && tn === $.ANNOTATION_XML) {
247b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        for (var i = 0; i < attrs.length; i++) {
248b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            if (attrs[i].name === ATTRS.ENCODING) {
249b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                var value = attrs[i].value.toLowerCase();
250b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
251b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML;
252b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            }
253b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        }
254b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    }
255b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
256b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE);
257b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik};
258