You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
7.8 KiB
239 lines
7.8 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.isIntegrationPoint = exports.adjustTokenSVGTagName = exports.adjustTokenXMLAttrs = exports.adjustTokenSVGAttrs = exports.adjustTokenMathMLAttrs = exports.causesExit = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = void 0; |
|
const html_js_1 = require("./html.js"); |
|
//MIME types |
|
const MIME_TYPES = { |
|
TEXT_HTML: 'text/html', |
|
APPLICATION_XML: 'application/xhtml+xml', |
|
}; |
|
//Attributes |
|
const DEFINITION_URL_ATTR = 'definitionurl'; |
|
const ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL'; |
|
const SVG_ATTRS_ADJUSTMENT_MAP = new Map([ |
|
'attributeName', |
|
'attributeType', |
|
'baseFrequency', |
|
'baseProfile', |
|
'calcMode', |
|
'clipPathUnits', |
|
'diffuseConstant', |
|
'edgeMode', |
|
'filterUnits', |
|
'glyphRef', |
|
'gradientTransform', |
|
'gradientUnits', |
|
'kernelMatrix', |
|
'kernelUnitLength', |
|
'keyPoints', |
|
'keySplines', |
|
'keyTimes', |
|
'lengthAdjust', |
|
'limitingConeAngle', |
|
'markerHeight', |
|
'markerUnits', |
|
'markerWidth', |
|
'maskContentUnits', |
|
'maskUnits', |
|
'numOctaves', |
|
'pathLength', |
|
'patternContentUnits', |
|
'patternTransform', |
|
'patternUnits', |
|
'pointsAtX', |
|
'pointsAtY', |
|
'pointsAtZ', |
|
'preserveAlpha', |
|
'preserveAspectRatio', |
|
'primitiveUnits', |
|
'refX', |
|
'refY', |
|
'repeatCount', |
|
'repeatDur', |
|
'requiredExtensions', |
|
'requiredFeatures', |
|
'specularConstant', |
|
'specularExponent', |
|
'spreadMethod', |
|
'startOffset', |
|
'stdDeviation', |
|
'stitchTiles', |
|
'surfaceScale', |
|
'systemLanguage', |
|
'tableValues', |
|
'targetX', |
|
'targetY', |
|
'textLength', |
|
'viewBox', |
|
'viewTarget', |
|
'xChannelSelector', |
|
'yChannelSelector', |
|
'zoomAndPan', |
|
].map((attr) => [attr.toLowerCase(), attr])); |
|
const XML_ATTRS_ADJUSTMENT_MAP = new Map([ |
|
['xlink:actuate', { prefix: 'xlink', name: 'actuate', namespace: html_js_1.NS.XLINK }], |
|
['xlink:arcrole', { prefix: 'xlink', name: 'arcrole', namespace: html_js_1.NS.XLINK }], |
|
['xlink:href', { prefix: 'xlink', name: 'href', namespace: html_js_1.NS.XLINK }], |
|
['xlink:role', { prefix: 'xlink', name: 'role', namespace: html_js_1.NS.XLINK }], |
|
['xlink:show', { prefix: 'xlink', name: 'show', namespace: html_js_1.NS.XLINK }], |
|
['xlink:title', { prefix: 'xlink', name: 'title', namespace: html_js_1.NS.XLINK }], |
|
['xlink:type', { prefix: 'xlink', name: 'type', namespace: html_js_1.NS.XLINK }], |
|
['xml:base', { prefix: 'xml', name: 'base', namespace: html_js_1.NS.XML }], |
|
['xml:lang', { prefix: 'xml', name: 'lang', namespace: html_js_1.NS.XML }], |
|
['xml:space', { prefix: 'xml', name: 'space', namespace: html_js_1.NS.XML }], |
|
['xmlns', { prefix: '', name: 'xmlns', namespace: html_js_1.NS.XMLNS }], |
|
['xmlns:xlink', { prefix: 'xmlns', name: 'xlink', namespace: html_js_1.NS.XMLNS }], |
|
]); |
|
//SVG tag names adjustment map |
|
exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map([ |
|
'altGlyph', |
|
'altGlyphDef', |
|
'altGlyphItem', |
|
'animateColor', |
|
'animateMotion', |
|
'animateTransform', |
|
'clipPath', |
|
'feBlend', |
|
'feColorMatrix', |
|
'feComponentTransfer', |
|
'feComposite', |
|
'feConvolveMatrix', |
|
'feDiffuseLighting', |
|
'feDisplacementMap', |
|
'feDistantLight', |
|
'feFlood', |
|
'feFuncA', |
|
'feFuncB', |
|
'feFuncG', |
|
'feFuncR', |
|
'feGaussianBlur', |
|
'feImage', |
|
'feMerge', |
|
'feMergeNode', |
|
'feMorphology', |
|
'feOffset', |
|
'fePointLight', |
|
'feSpecularLighting', |
|
'feSpotLight', |
|
'feTile', |
|
'feTurbulence', |
|
'foreignObject', |
|
'glyphRef', |
|
'linearGradient', |
|
'radialGradient', |
|
'textPath', |
|
].map((tn) => [tn.toLowerCase(), tn])); |
|
//Tags that causes exit from foreign content |
|
const EXITS_FOREIGN_CONTENT = new Set([ |
|
html_js_1.TAG_ID.B, |
|
html_js_1.TAG_ID.BIG, |
|
html_js_1.TAG_ID.BLOCKQUOTE, |
|
html_js_1.TAG_ID.BODY, |
|
html_js_1.TAG_ID.BR, |
|
html_js_1.TAG_ID.CENTER, |
|
html_js_1.TAG_ID.CODE, |
|
html_js_1.TAG_ID.DD, |
|
html_js_1.TAG_ID.DIV, |
|
html_js_1.TAG_ID.DL, |
|
html_js_1.TAG_ID.DT, |
|
html_js_1.TAG_ID.EM, |
|
html_js_1.TAG_ID.EMBED, |
|
html_js_1.TAG_ID.H1, |
|
html_js_1.TAG_ID.H2, |
|
html_js_1.TAG_ID.H3, |
|
html_js_1.TAG_ID.H4, |
|
html_js_1.TAG_ID.H5, |
|
html_js_1.TAG_ID.H6, |
|
html_js_1.TAG_ID.HEAD, |
|
html_js_1.TAG_ID.HR, |
|
html_js_1.TAG_ID.I, |
|
html_js_1.TAG_ID.IMG, |
|
html_js_1.TAG_ID.LI, |
|
html_js_1.TAG_ID.LISTING, |
|
html_js_1.TAG_ID.MENU, |
|
html_js_1.TAG_ID.META, |
|
html_js_1.TAG_ID.NOBR, |
|
html_js_1.TAG_ID.OL, |
|
html_js_1.TAG_ID.P, |
|
html_js_1.TAG_ID.PRE, |
|
html_js_1.TAG_ID.RUBY, |
|
html_js_1.TAG_ID.S, |
|
html_js_1.TAG_ID.SMALL, |
|
html_js_1.TAG_ID.SPAN, |
|
html_js_1.TAG_ID.STRONG, |
|
html_js_1.TAG_ID.STRIKE, |
|
html_js_1.TAG_ID.SUB, |
|
html_js_1.TAG_ID.SUP, |
|
html_js_1.TAG_ID.TABLE, |
|
html_js_1.TAG_ID.TT, |
|
html_js_1.TAG_ID.U, |
|
html_js_1.TAG_ID.UL, |
|
html_js_1.TAG_ID.VAR, |
|
]); |
|
//Check exit from foreign content |
|
function causesExit(startTagToken) { |
|
const tn = startTagToken.tagID; |
|
const isFontWithAttrs = tn === html_js_1.TAG_ID.FONT && |
|
startTagToken.attrs.some(({ name }) => name === html_js_1.ATTRS.COLOR || name === html_js_1.ATTRS.SIZE || name === html_js_1.ATTRS.FACE); |
|
return isFontWithAttrs || EXITS_FOREIGN_CONTENT.has(tn); |
|
} |
|
exports.causesExit = causesExit; |
|
//Token adjustments |
|
function adjustTokenMathMLAttrs(token) { |
|
for (let i = 0; i < token.attrs.length; i++) { |
|
if (token.attrs[i].name === DEFINITION_URL_ATTR) { |
|
token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR; |
|
break; |
|
} |
|
} |
|
} |
|
exports.adjustTokenMathMLAttrs = adjustTokenMathMLAttrs; |
|
function adjustTokenSVGAttrs(token) { |
|
for (let i = 0; i < token.attrs.length; i++) { |
|
const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name); |
|
if (adjustedAttrName != null) { |
|
token.attrs[i].name = adjustedAttrName; |
|
} |
|
} |
|
} |
|
exports.adjustTokenSVGAttrs = adjustTokenSVGAttrs; |
|
function adjustTokenXMLAttrs(token) { |
|
for (let i = 0; i < token.attrs.length; i++) { |
|
const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name); |
|
if (adjustedAttrEntry) { |
|
token.attrs[i].prefix = adjustedAttrEntry.prefix; |
|
token.attrs[i].name = adjustedAttrEntry.name; |
|
token.attrs[i].namespace = adjustedAttrEntry.namespace; |
|
} |
|
} |
|
} |
|
exports.adjustTokenXMLAttrs = adjustTokenXMLAttrs; |
|
function adjustTokenSVGTagName(token) { |
|
const adjustedTagName = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName); |
|
if (adjustedTagName != null) { |
|
token.tagName = adjustedTagName; |
|
token.tagID = (0, html_js_1.getTagID)(token.tagName); |
|
} |
|
} |
|
exports.adjustTokenSVGTagName = adjustTokenSVGTagName; |
|
//Integration points |
|
function isMathMLTextIntegrationPoint(tn, ns) { |
|
return ns === html_js_1.NS.MATHML && (tn === html_js_1.TAG_ID.MI || tn === html_js_1.TAG_ID.MO || tn === html_js_1.TAG_ID.MN || tn === html_js_1.TAG_ID.MS || tn === html_js_1.TAG_ID.MTEXT); |
|
} |
|
function isHtmlIntegrationPoint(tn, ns, attrs) { |
|
if (ns === html_js_1.NS.MATHML && tn === html_js_1.TAG_ID.ANNOTATION_XML) { |
|
for (let i = 0; i < attrs.length; i++) { |
|
if (attrs[i].name === html_js_1.ATTRS.ENCODING) { |
|
const value = attrs[i].value.toLowerCase(); |
|
return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML; |
|
} |
|
} |
|
} |
|
return ns === html_js_1.NS.SVG && (tn === html_js_1.TAG_ID.FOREIGN_OBJECT || tn === html_js_1.TAG_ID.DESC || tn === html_js_1.TAG_ID.TITLE); |
|
} |
|
function isIntegrationPoint(tn, ns, attrs, foreignNS) { |
|
return (((!foreignNS || foreignNS === html_js_1.NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) || |
|
((!foreignNS || foreignNS === html_js_1.NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns))); |
|
} |
|
exports.isIntegrationPoint = isIntegrationPoint; |
|
//# sourceMappingURL=foreign-content.js.map
|