'use strict';
|
|
const { DOCUMENT_MODE } = require('./html');
|
|
//Const
|
const VALID_DOCTYPE_NAME = 'html';
|
const VALID_SYSTEM_ID = 'about:legacy-compat';
|
const QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd';
|
|
const QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
|
'+//silmaril//dtd html pro v0r11 19970101//',
|
'-//as//dtd html 3.0 aswedit + extensions//',
|
'-//advasoft ltd//dtd html 3.0 aswedit + extensions//',
|
'-//ietf//dtd html 2.0 level 1//',
|
'-//ietf//dtd html 2.0 level 2//',
|
'-//ietf//dtd html 2.0 strict level 1//',
|
'-//ietf//dtd html 2.0 strict level 2//',
|
'-//ietf//dtd html 2.0 strict//',
|
'-//ietf//dtd html 2.0//',
|
'-//ietf//dtd html 2.1e//',
|
'-//ietf//dtd html 3.0//',
|
'-//ietf//dtd html 3.2 final//',
|
'-//ietf//dtd html 3.2//',
|
'-//ietf//dtd html 3//',
|
'-//ietf//dtd html level 0//',
|
'-//ietf//dtd html level 1//',
|
'-//ietf//dtd html level 2//',
|
'-//ietf//dtd html level 3//',
|
'-//ietf//dtd html strict level 0//',
|
'-//ietf//dtd html strict level 1//',
|
'-//ietf//dtd html strict level 2//',
|
'-//ietf//dtd html strict level 3//',
|
'-//ietf//dtd html strict//',
|
'-//ietf//dtd html//',
|
'-//metrius//dtd metrius presentational//',
|
'-//microsoft//dtd internet explorer 2.0 html strict//',
|
'-//microsoft//dtd internet explorer 2.0 html//',
|
'-//microsoft//dtd internet explorer 2.0 tables//',
|
'-//microsoft//dtd internet explorer 3.0 html strict//',
|
'-//microsoft//dtd internet explorer 3.0 html//',
|
'-//microsoft//dtd internet explorer 3.0 tables//',
|
'-//netscape comm. corp.//dtd html//',
|
'-//netscape comm. corp.//dtd strict html//',
|
"-//o'reilly and associates//dtd html 2.0//",
|
"-//o'reilly and associates//dtd html extended 1.0//",
|
"-//o'reilly and associates//dtd html extended relaxed 1.0//",
|
'-//sq//dtd html 2.0 hotmetal + extensions//',
|
'-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//',
|
'-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//',
|
'-//spyglass//dtd html 2.0 extended//',
|
'-//sun microsystems corp.//dtd hotjava html//',
|
'-//sun microsystems corp.//dtd hotjava strict html//',
|
'-//w3c//dtd html 3 1995-03-24//',
|
'-//w3c//dtd html 3.2 draft//',
|
'-//w3c//dtd html 3.2 final//',
|
'-//w3c//dtd html 3.2//',
|
'-//w3c//dtd html 3.2s draft//',
|
'-//w3c//dtd html 4.0 frameset//',
|
'-//w3c//dtd html 4.0 transitional//',
|
'-//w3c//dtd html experimental 19960712//',
|
'-//w3c//dtd html experimental 970421//',
|
'-//w3c//dtd w3 html//',
|
'-//w3o//dtd w3 html 3.0//',
|
'-//webtechs//dtd mozilla html 2.0//',
|
'-//webtechs//dtd mozilla html//'
|
];
|
|
const QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = QUIRKS_MODE_PUBLIC_ID_PREFIXES.concat([
|
'-//w3c//dtd html 4.01 frameset//',
|
'-//w3c//dtd html 4.01 transitional//'
|
]);
|
|
const QUIRKS_MODE_PUBLIC_IDS = ['-//w3o//dtd w3 html strict 3.0//en//', '-/w3c/dtd html 4.0 transitional/en', 'html'];
|
const LIMITED_QUIRKS_PUBLIC_ID_PREFIXES = ['-//w3c//dtd xhtml 1.0 frameset//', '-//w3c//dtd xhtml 1.0 transitional//'];
|
|
const LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = LIMITED_QUIRKS_PUBLIC_ID_PREFIXES.concat([
|
'-//w3c//dtd html 4.01 frameset//',
|
'-//w3c//dtd html 4.01 transitional//'
|
]);
|
|
//Utils
|
function enquoteDoctypeId(id) {
|
const quote = id.indexOf('"') !== -1 ? "'" : '"';
|
|
return quote + id + quote;
|
}
|
|
function hasPrefix(publicId, prefixes) {
|
for (let i = 0; i < prefixes.length; i++) {
|
if (publicId.indexOf(prefixes[i]) === 0) {
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
//API
|
exports.isConforming = function(token) {
|
return (
|
token.name === VALID_DOCTYPE_NAME &&
|
token.publicId === null &&
|
(token.systemId === null || token.systemId === VALID_SYSTEM_ID)
|
);
|
};
|
|
exports.getDocumentMode = function(token) {
|
if (token.name !== VALID_DOCTYPE_NAME) {
|
return DOCUMENT_MODE.QUIRKS;
|
}
|
|
const systemId = token.systemId;
|
|
if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) {
|
return DOCUMENT_MODE.QUIRKS;
|
}
|
|
let publicId = token.publicId;
|
|
if (publicId !== null) {
|
publicId = publicId.toLowerCase();
|
|
if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) {
|
return DOCUMENT_MODE.QUIRKS;
|
}
|
|
let prefixes = systemId === null ? QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES : QUIRKS_MODE_PUBLIC_ID_PREFIXES;
|
|
if (hasPrefix(publicId, prefixes)) {
|
return DOCUMENT_MODE.QUIRKS;
|
}
|
|
prefixes =
|
systemId === null ? LIMITED_QUIRKS_PUBLIC_ID_PREFIXES : LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES;
|
|
if (hasPrefix(publicId, prefixes)) {
|
return DOCUMENT_MODE.LIMITED_QUIRKS;
|
}
|
}
|
|
return DOCUMENT_MODE.NO_QUIRKS;
|
};
|
|
exports.serializeContent = function(name, publicId, systemId) {
|
let str = '!DOCTYPE ';
|
|
if (name) {
|
str += name;
|
}
|
|
if (publicId) {
|
str += ' PUBLIC ' + enquoteDoctypeId(publicId);
|
} else if (systemId) {
|
str += ' SYSTEM';
|
}
|
|
if (systemId !== null) {
|
str += ' ' + enquoteDoctypeId(systemId);
|
}
|
|
return str;
|
};
|