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