239 lines
No EOL
7.8 KiB
JavaScript
239 lines
No EOL
7.8 KiB
JavaScript
"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
|