123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- '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;
- };
|