加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python压缩javascript文件代码

发布时间:2020-12-17 17:26:20 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 通过正规表达式实现 '''a regex-based JavaScript code compression kludge'''import reclass JSCompressor(object): def __init__(self,compressionL

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

通过正规表达式实现
'''
a regex-based JavaScript code compression kludge
'''
import re

class JSCompressor(object):

    def __init__(self,compressionLevel=2,measureCompression=False):
        '''
        compressionLevel:
        0 - no compression,script returned unchanged. For debugging only -
            try if you suspect that compression compromises your script
        1 - Strip comments and empty lines,don't change line breaks and indentation (code remains readable)
        2 - Additionally strip insignificant whitespace (code will become quite unreadable)

        measureCompression: append a comment stating the extent of compression
        '''
        self.compressionLevel = compressionLevel
        self.measureCompression = measureCompression

    # a bunch of regexes used in compression
    # first,exempt string and regex literals from compression by transient substitution

    findLiterals = re.compile(r'''
        ('.*?(?<=[^])')             |       # single-quoted strings
        (".*?(?<=[^])")             |       # double-quoted strings
        ((?<![*/])/(?![/*]).*?(?<![])/) # JS regexes,trying hard not to be tripped up by comments
        ''',re.VERBOSE)

    # literals are temporarily replaced by numbered placeholders

    literalMarker = '@[email?protected]%[email?protected][email?protected]'                  # temporary replacement
    backSubst = re.compile('@[email?protected](d+)@[email?protected]')       # put the string literals back in

    mlc1 = re.compile(r'(/*.*?*/)')         # /* ... */ comments on single line
    mlc = re.compile(r'(/*.*?*/)',re.DOTALL)  # real multiline comments
    slc = re.compile('//.*')                  # remove single line comments

    collapseWs = re.compile('(?<=S)[ t]+')    # collapse successive non-leading white space characters into one

    squeeze = re.compile('''
        s+(?=[}]):&;|=;,.+])   |     # remove whitespace preceding control characters
        (?<=[{[(:&;|=;,.+])s+  |     # ... or following such
        [ t]+(?=W)                      |     # remove spaces or tabs preceding non-word characters
        (?<=W)[ t]+                           # ... or following such
        ''',re.VERBOSE | re.DOTALL)

    def compress(self,script):
        '''
        perform compression and return compressed script
        '''
        if self.compressionLevel == 0:
            return script

        lengthBefore = len(script)

        # first,substitute string literals by placeholders to prevent the regexes messing with them
        literals = []

        def insertMarker(mo):
            l = mo.group()
            literals.append(l)
            return self.literalMarker % (len(literals) - 1)

        script = self.findLiterals.sub(insertMarker,script)

        # now,to the literal-stripped carcass,apply some kludgy regexes for deflation...
        script = self.slc.sub('',script)       # strip single line comments
        script = self.mlc1.sub(' ',script)     # replace /* .. */ comments on single lines by space
        script = self.mlc.sub('n',script)     # replace real multiline comments by newlines

        # remove empty lines and trailing whitespace
        script = 'n'.join([l.rstrip() for l in script.splitlines() if l.strip()])

        if self.compressionLevel == 2:              # squeeze out any dispensible whitespace
            script = self.squeeze.sub('',script)
        elif self.compressionLevel == 1:            # only collapse multiple whitespace characters
            script = self.collapseWs.sub(' ',script)

        # now back-substitute the string and regex literals
        def backsub(mo):
            return literals[int(mo.group(1))]

        script = self.backSubst.sub(backsub,script)

        if self.measureCompression:
            lengthAfter = float(len(script))
            squeezedBy = int(100*(1-lengthAfter/lengthBefore))
            script += 'n// squeezed out %s%%n' % squeezedBy

        return script

if __name__ == '__main__':
    script = '''

    /* this is a totally useless multiline comment,containing a silly "quoted string",surrounded by several superfluous line breaks
     */

    // and this is an equally important single line comment

    sth = "this string contains 'quotes',a /regex/ and a // comment yet it will survive compression";

    function wurst(){           // this is a great function
        var hans = 33;
    }

    sthelse = 'and another useless string';

    function hans(){            // another function
        var   bill   =   66;    // successive spaces will be collapsed into one;
        var bob = 77            // this line break will be preserved b/c of lacking semicolon
        var george = 88;
    }
    '''

    for x in range(1,3):
        print 'ncompression level',x,':n--------------'
        c = JSCompressor(compressionLevel=x,measureCompression=True)
        cpr = c.compress(script)
        print cpr
        print 'length',len(cpr)

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读