1'use strict'; 2 3//Const 4var VALID_DOCTYPE_NAME = 'html', 5 QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd', 6 QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ 7 "+//silmaril//dtd html pro v0r11 19970101//en", 8 "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en", 9 "-//as//dtd html 3.0 aswedit + extensions//en", 10 "-//ietf//dtd html 2.0 level 1//en", 11 "-//ietf//dtd html 2.0 level 2//en", 12 "-//ietf//dtd html 2.0 strict level 1//en", 13 "-//ietf//dtd html 2.0 strict level 2//en", 14 "-//ietf//dtd html 2.0 strict//en", 15 "-//ietf//dtd html 2.0//en", 16 "-//ietf//dtd html 2.1e//en", 17 "-//ietf//dtd html 3.0//en", 18 "-//ietf//dtd html 3.0//en//", 19 "-//ietf//dtd html 3.2 final//en", 20 "-//ietf//dtd html 3.2//en", 21 "-//ietf//dtd html 3//en", 22 "-//ietf//dtd html level 0//en", 23 "-//ietf//dtd html level 0//en//2.0", 24 "-//ietf//dtd html level 1//en", 25 "-//ietf//dtd html level 1//en//2.0", 26 "-//ietf//dtd html level 2//en", 27 "-//ietf//dtd html level 2//en//2.0", 28 "-//ietf//dtd html level 3//en", 29 "-//ietf//dtd html level 3//en//3.0", 30 "-//ietf//dtd html strict level 0//en", 31 "-//ietf//dtd html strict level 0//en//2.0", 32 "-//ietf//dtd html strict level 1//en", 33 "-//ietf//dtd html strict level 1//en//2.0", 34 "-//ietf//dtd html strict level 2//en", 35 "-//ietf//dtd html strict level 2//en//2.0", 36 "-//ietf//dtd html strict level 3//en", 37 "-//ietf//dtd html strict level 3//en//3.0", 38 "-//ietf//dtd html strict//en", 39 "-//ietf//dtd html strict//en//2.0", 40 "-//ietf//dtd html strict//en//3.0", 41 "-//ietf//dtd html//en", 42 "-//ietf//dtd html//en//2.0", 43 "-//ietf//dtd html//en//3.0", 44 "-//metrius//dtd metrius presentational//en", 45 "-//microsoft//dtd internet explorer 2.0 html strict//en", 46 "-//microsoft//dtd internet explorer 2.0 html//en", 47 "-//microsoft//dtd internet explorer 2.0 tables//en", 48 "-//microsoft//dtd internet explorer 3.0 html strict//en", 49 "-//microsoft//dtd internet explorer 3.0 html//en", 50 "-//microsoft//dtd internet explorer 3.0 tables//en", 51 "-//netscape comm. corp.//dtd html//en", 52 "-//netscape comm. corp.//dtd strict html//en", 53 "-//o'reilly and associates//dtd html 2.0//en", 54 "-//o'reilly and associates//dtd html extended 1.0//en", 55 "-//spyglass//dtd html 2.0 extended//en", 56 "-//sq//dtd html 2.0 hotmetal + extensions//en", 57 "-//sun microsystems corp.//dtd hotjava html//en", 58 "-//sun microsystems corp.//dtd hotjava strict html//en", 59 "-//w3c//dtd html 3 1995-03-24//en", 60 "-//w3c//dtd html 3.2 draft//en", 61 "-//w3c//dtd html 3.2 final//en", 62 "-//w3c//dtd html 3.2//en", 63 "-//w3c//dtd html 3.2s draft//en", 64 "-//w3c//dtd html 4.0 frameset//en", 65 "-//w3c//dtd html 4.0 transitional//en", 66 "-//w3c//dtd html experimental 19960712//en", 67 "-//w3c//dtd html experimental 970421//en", 68 "-//w3c//dtd w3 html//en", 69 "-//w3o//dtd w3 html 3.0//en", 70 "-//w3o//dtd w3 html 3.0//en//", 71 "-//webtechs//dtd mozilla html 2.0//en", 72 "-//webtechs//dtd mozilla html//en" 73 ], 74 QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [ 75 '-//w3c//dtd html 4.01 frameset//', 76 '-//w3c//dtd html 4.01 transitional//' 77 ], 78 QUIRKS_MODE_PUBLIC_IDS = [ 79 '-//w3o//dtd w3 html strict 3.0//en//', 80 '-/w3c/dtd html 4.0 transitional/en', 81 'html' 82 ]; 83 84 85//Utils 86function enquoteDoctypeId(id) { 87 var quote = id.indexOf('"') !== -1 ? '\'' : '"'; 88 89 return quote + id + quote; 90} 91 92 93//API 94exports.isQuirks = function (name, publicId, systemId) { 95 if (name !== VALID_DOCTYPE_NAME) 96 return true; 97 98 if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) 99 return true; 100 101 if (publicId !== null) { 102 publicId = publicId.toLowerCase(); 103 104 if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) 105 return true; 106 107 var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES; 108 109 if (systemId === null) 110 prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES); 111 112 for (var i = 0; i < prefixes.length; i++) { 113 if (publicId.indexOf(prefixes[i]) === 0) 114 return true; 115 } 116 } 117 118 return false; 119}; 120 121exports.serializeContent = function (name, publicId, systemId) { 122 var str = '!DOCTYPE ' + name; 123 124 if (publicId !== null) 125 str += ' PUBLIC ' + enquoteDoctypeId(publicId); 126 127 else if (systemId !== null) 128 str += ' SYSTEM'; 129 130 if (systemId !== null) 131 str += ' ' + enquoteDoctypeId(systemId); 132 133 return str; 134}; 135