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