{"version":3,"sources":["jsdelivr-header.js","/npm/html-compress@0.0.4/lib/html.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACDA,aAEA,IAAI,EAAI,QAAQ,aACZ,YAAc,QAAQ,qBAO1B,SAAS,aAAa,EAAS,GAC3B,KAAK,QAAU,EACf,KAAK,QAAU,GACf,KAAK,WAAa,GAClB,KAAK,cAAgB,EAAQ,cAAe,EAAQ,cAAgB,KACpE,KAAK,eAAiB,EAAQ,eAAgB,EAAQ,eAAiB,KACvE,KAAK,MAAQ,EAAQ,MAAO,EAAQ,MAAQ,QAO5C,KAAK,WAAa,CACd,KAAM,QAAS,OAAQ,OAAQ,WAAY,WAAY,OACvD,OAAQ,KAAM,MAAO,QAAS,MAAO,UAAW,OAAQ,SAQ5D,KAAK,cAAgB,CACjB,OAAQ,OAAQ,WAAY,QAAS,KAAM,QAAS,KACpD,KAAM,KAAM,KAAM,SAAU,SAOhC,KAAK,eAAiB,CAClB,UAAU,aAAa,SAAS,MAAM,MAAM,KAAK,WAAW,OAC5D,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,WAAW,WACrD,KAAK,IAAI,MAAM,QAAQ,MAO3B,KAAK,qBAAuB,CACxB,IAAM,CACF,MAAU,GACV,IAAQ,IAEZ,KAAS,CACL,MAAU,UAEd,MAAU,CAEV,EACA,KAAS,CACL,OAAW,OAEf,OAAW,CACP,KAAS,kBACT,YAAgB,KAIxB,KAAK,iBAAmB,CACpB,WAAW,WAAW,UAAW,WAAY,WAErD,CAtEA,OAAO,QAAQ,SAAW,SAAS,EAAS,GAExC,OADmB,IAAI,aAAa,EAAS,GACzB,UACxB,EAqEA,aAAa,UAAU,SAAW,WAE9B,IADA,IAAI,EAAkB,YAAY,MAAM,KAAK,QAAS,EAAG,KAAK,cAAe,KAAK,gBACzE,EAAI,EAAG,EAAQ,EAAgB,OAAQ,EAAI,EAAO,IAAI,CAC3D,KAAK,WAAa,OAAO,EAAgB,GAAG,IAC5C,IAAI,EAAY,EAAgB,GAAG,GAEnC,GAA4C,MAAvC,KAAK,QAAQ,KAAK,QAAQ,OAAO,IAAc,IAAc,EAAE,KAAK,YAGzE,OAAQ,GACJ,KAAK,EAAE,KAAK,aAAe,MAC3B,KAAK,EAAE,KAAK,aACS,iBAAd,KAAK,MACJ,KAAK,uBAEL,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,WAE7C,MACJ,KAAK,EAAE,KAAK,aACO,YAAZ,KAAK,OACC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,WAAY,QAAS,KAAK,iBAI7D,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,YAE7C,MACJ,KAAK,EAAE,KAAK,eACZ,KAAK,EAAE,KAAK,cACO,YAAZ,KAAK,OAAsB,KAAK,uBAAuB,GAGtD,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,WAFzC,KAAK,eAIT,MACJ,KAAK,EAAE,KAAK,iBAGZ,KAAK,EAAE,KAAK,gBACR,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,WACzC,MACJ,KAAK,EAAE,KAAK,iBACR,IAAI,EAAO,KAAK,YACiB,IAA7B,EAAK,QAAQ,aACb,GAAQ,KAEZ,KAAK,QAAQ,KAAK,QAAQ,QAAU,EACpC,MACJ,QACI,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,WAErD,CACA,OAAO,KAAK,QAAQ,KAAK,GAC7B,EAEA,aAAa,UAAU,qBAAuB,WAE1C,GAAwB,KAApB,KAAK,WAAkB,CAEvB,IAAuC,IAAnC,KAAK,WAAW,QAAQ,MAExB,OADA,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,YAClC,EAEX,IAAI,EAAmB,GACN,eAAd,KAAK,QACJ,EAAmB,KAEvB,KAAK,WAAa,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,KAAK,MAAO,EAAkB,KAAK,aACzD,KAApB,KAAK,aACJ,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAK,WAEjD,CACJ,EAGA,aAAa,UAAU,aAAe,WAClC,IAAI,EAAS,YAAY,MAAM,KAAK,WAAY,EAAG,KAAK,cAAe,KAAK,gBAE5E,GAAI,EAAO,KAAO,EAAE,KAAK,aAErB,OADA,KAAK,QAAQ,KAAK,QAAQ,QAAU,KAAO,EAAO,GAAK,KAChD,EAEX,IAAI,EAAe,IAAM,EAAO,GAChC,GAAI,EAAO,GAAG,OAAO,CACjB,IAAI,EAAa,IACb,EAAY,KAAK,qBAAqB,KACtC,EAAE,SAAS,KAAK,qBAAqB,EAAO,OAC5C,EAAY,EAAE,YAAY,EAAW,KAAK,qBAAqB,EAAO,MAG1E,IAAI,IAAI,EAAI,EAAG,EAAI,EAAO,GAAG,OAAQ,IAAI,CACrC,IAAI,EAAO,EAAO,GAAG,GACrB,EAAe,EAAE,MAAM,GAEvB,IAAI,EAAI,EAAE,KAAK,EAAK,GAAG,OAGnB,IAFK,EAAU,EAAK,MAMpB,sBAAsB,KAAK,GAC3B,GAAgB,EAAa,EAAK,GAAK,IAAM,EAK7C,EAAK,KAAO,EAAE,KAAK,mBAKnB,EAAE,SAAS,EAAK,GAAI,KAAK,kBACzB,GAAgB,EAAa,EAAK,GAIjC,EAAE,OAAO,EAAK,IAInB,GAAgB,EAAa,EAAK,GAAK,IAAM,EAAK,GAH9C,GAAgB,EAAa,EAAK,GAVlC,GAAgB,EAAa,EAAK,GAc1C,CACJ,CACA,GAAgB,IAChB,KAAK,QAAQ,KAAK,QAAQ,QAAU,CACxC,EAEA,aAAa,UAAU,uBAAyB,SAAS,GACrD,QAAG,GAAa,EAAE,KAAK,gBAChB,KAAK,YAAY,KAAK,WAAY,EAAG,KAAK,cAAc,OAAS,EAAG,KAAK,cAAgB,UAIpG,EAEA,aAAa,UAAU,YAAc,SAAS,EAAK,EAAO,EAAK,GAC3D,OAAO,EAAI,OAAO,EAAO,GAAK,gBAAkB,EAAO,aAC3D","file":"/npm/html-compress@0.0.4/lib/html.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/html-compress@0.0.4/lib/html.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\n * fis\r\n * http://fis.baidu.com/\r\n */\r\n\r\n'use strict';\r\n\r\nvar _ = require('./util.js'),\r\n    analytihtml = require('./analytichtml.js');\r\n\r\nmodule.exports.compress = function(content, options){\r\n    var htmlCompress = new HTMLCompress(content, options);\r\n    return htmlCompress.compress();\r\n};\r\n\r\nfunction HTMLCompress(content, options){\r\n    this.content = content;\r\n    this._output = [];\r\n    this._tokenText = '';\r\n    this.leftDelimiter = options.leftDelimiter? options.leftDelimiter : '{%';\r\n    this.rightDelimiter = options.rightDelimiter? options.rightDelimiter : '%}';\r\n    this.level = options.level? options.level : 'strip';\r\n\r\n    /**\r\n     *\r\n     * 单一标签，这些标签不需要对应的闭合标签\r\n     * @var array\r\n     */\r\n    this._singleTag = [\r\n        \"br\", \"input\", \"link\", \"meta\", \"!doctype\", \"basefont\", \"base\",\r\n        \"area\", \"hr\", \"wbr\", \"param\", \"img\", \"isindex\", \"?xml\", \"embed\"\r\n    ];\r\n\r\n    /**\r\n     *\r\n     * 可删除的闭合标签\r\n     * @var array\r\n     */\r\n    this._removeEndTag = [\r\n        \"html\", \"body\", \"colgroup\", \"thead\", \"tr\", \"tbody\", \"td\",\r\n        \"dt\", \"dd\", \"li\", \"option\", \"tfoot\"\r\n    ];\r\n    /**\r\n     *\r\n     * 块级元素，2个块级元素之间的空格是可以删除的\r\n     * @var array\r\n     */\r\n    this._blockElements = [\r\n        'address','blockquote','center','dir','div','dl','fieldset','form',\r\n        'h1','h2','h3','h4','h5','h6','hr','menu','noframes','noscript',\r\n        'ol','p','pre','table','ul'\r\n    ];\r\n    /**\r\n     *\r\n     * 标签属性默认值,这些默认指是可以删除的\r\n     * @var array\r\n     */\r\n    this._tagAttrDefaultValue = {\r\n        '*' : {\r\n            'class' : '',\r\n            'alt' : ''\r\n        },\r\n        'link' : {\r\n            'media' : 'screen'\r\n        },\r\n        'input' : {\r\n            //'type' => 'text'\r\n        },\r\n        'form' : {\r\n            'method' : 'get'\r\n        },\r\n        'script' : {\r\n            'type' : 'text/javascript',\r\n            'fcpcompress' : ''\r\n        }\r\n    };\r\n\r\n    this._tagAttrOnlyName = [\r\n        'disabled','selected','checked', 'readonly', 'multiple'\r\n    ];\r\n}\r\n\r\nHTMLCompress.prototype.compress = function(){\r\n    var analyticContent = analytihtml.parse(this.content, 1, this.leftDelimiter, this.rightDelimiter);\r\n    for (var i = 0, count = analyticContent.length; i < count; i++){\r\n        this._tokenText = String(analyticContent[i][0]);\r\n        var tokenType = analyticContent[i][1];\r\n        //将连续的换行进行剔除，只留一个换行\r\n        if ( this._output[this._output.length-1] == '\\n' && tokenType === _.sign.FL_NEW_LINE){\r\n            continue;\r\n        }\r\n        switch (tokenType){\r\n            case _.sign.HTML_COMMENT : break;\r\n            case _.sign.HTML_CONTENT:\r\n                if(this.level != \"strip_comment\"){\r\n                    this._compressTextContent();\r\n                }else{\r\n                    this._output[this._output.length] = this._tokenText;\r\n                }\r\n                break;\r\n            case _.sign.HTML_TAG_END :\r\n                if(this.level==\"compress\"){\r\n                    if (!_.in_array(_.trim(_.trim(this._tokenText, '<>/')), this._removeEndTag)){\r\n                        this._output[this._output.length] = this._tokenText;\r\n                    }\r\n                }else{\r\n                    this._output[this._output.length] = this._tokenText;\r\n                }\r\n                break;\r\n            case _.sign.HTML_TAG_START :\r\n            case _.sign.HTML_JS_START:\r\n                if(this.level==\"compress\" && !this.isDelimiterScriptStart(tokenType)){\r\n                    this._compressTag();\r\n                }else{\r\n                    this._output[this._output.length] = this._tokenText;\r\n                }\r\n                break;\r\n            case _.sign.HTML_CSS_CONTENT :\r\n                this._output[this._output.length] = this._tokenText;\r\n                break;\r\n            case _.sign.HTML_JS_CONTENT :\r\n                this._output[this._output.length] = this._tokenText;\r\n                break;\r\n            case _.sign.FL_TPL_DELIMITER:\r\n                var text = this._tokenText;\r\n                if (text.indexOf('extends') !== -1){ //smarty3里extends后至少要加个空白字符\r\n                    text += ' ';\r\n                }\r\n                this._output[this._output.length] = text;\r\n                break;\r\n            default:\r\n                this._output[this._output.length] = this._tokenText;\r\n        }\r\n    }\r\n    return this._output.join('');\r\n};\r\n\r\nHTMLCompress.prototype._compressTextContent = function(){\r\n    //如果内容部完全是空格,将多个空格合并为一个空格\r\n    if (this._tokenText !== ''){\r\n        //如果内容里还有//，有可能含有注释，则不能去掉换行\r\n        if (this._tokenText.indexOf('//') !== -1){\r\n            this._output[this._output.length] = this._tokenText;\r\n            return true;\r\n        }\r\n        var beReplaceContent = '';\r\n        if(this.level == 'strip:space'){\r\n            beReplaceContent = \" \";\r\n        }\r\n        this._tokenText = _.trim(_.str_replace([\"\\r\",\"\\n\",\"\\t\"], beReplaceContent, this._tokenText));\r\n        if(this._tokenText !== ''){\r\n            this._output[this._output.length] = this._tokenText;\r\n        }\r\n    }\r\n};\r\n\r\n\r\nHTMLCompress.prototype._compressTag = function(){\r\n    var result = analytihtml.parse(this._tokenText, 2, this.leftDelimiter, this.rightDelimiter);\r\n\r\n    if (result[0] === _.sign.HTML_TAG_END){\r\n        this._output[this._output.length] = '</' + result[1] + '>';\r\n        return true;\r\n    }\r\n    var resultString = '<' + result[1];\r\n    if (result[2].length){\r\n        var blankSpace = ' ';\r\n        var chPattern = this._tagAttrDefaultValue['*'];\r\n        if (_.is_array(this._tagAttrDefaultValue[result[1]])){\r\n            chPattern = _.array_merge(chPattern, this._tagAttrDefaultValue[result[1]]);\r\n        }\r\n\r\n        for(var i = 0; i < result[2].length; i++){\r\n            var item = result[2][i];\r\n            resultString = _.rtrim(resultString);\r\n            //先进行压缩：属性或者属性值去除\r\n            var v = _.trim(item[1],\"'\\\"\");\r\n            var tv = chPattern[item[0]];\r\n            //如果值在默认可去除的值范围内，则将该属性去除\r\n            if (v === tv){\r\n                continue;\r\n            }\r\n            //如果值内没有一些特殊字符，可以将两边的引号去除\r\n            if (/^[\\w\\-\\/\\:\\.\\?\\=]+$/.test(v)){\r\n                resultString += blankSpace + item[0] + '=' + v;\r\n                continue;\r\n            }\r\n\r\n            //smarty变量\r\n            if (item[0] === _.sign.HTML_TPL_ATTR_NAME){\r\n                resultString += blankSpace + item[1];\r\n                continue;\r\n            }\r\n            //只要属性名的，属性值可以省略的\r\n            if (_.in_array(item[0], this._tagAttrOnlyName)){\r\n                resultString += blankSpace + item[0];\r\n                continue;\r\n            }\r\n            //only attr,no value.such as \"disabled\"\r\n            if (!_.strlen(item[1])){\r\n                resultString += blankSpace + item[0];\r\n                continue;\r\n            }\r\n            resultString += blankSpace + item[0] + '=' + item[1];\r\n        }\r\n    };\r\n    resultString += '>';\r\n    this._output[this._output.length] = resultString;\r\n};\r\n\r\nHTMLCompress.prototype.isDelimiterScriptStart = function(tokenType){\r\n    if(tokenType == _.sign.HTML_JS_START\r\n        && this._checkEqual(this._tokenText, 0, this.leftDelimiter.length + 6, this.leftDelimiter + 'script')){\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\nHTMLCompress.prototype._checkEqual = function(str, start, len, result){\r\n    return str.substr(start, len).toLowerCase() === result.toLowerCase();\r\n};"]}