Ejemplo n.º 1
0
def compress(context, data, name):
    """
    Data is the string from the template (the list of js files in this case)
    Name is either 'js' or 'css' (the sekizai namespace)
    Basically passes the string through the {% compress 'js' %} template tag
    """
    # separate compressible from uncompressable files
    parser = get_class(settings.COMPRESS_PARSER)(data)
    js_compressor, css_compressor = Compressor('js'), Compressor('css')
    compressable_elements, expanded_elements, deferred_elements = [], [], []
    if name == 'js':
        for elem in parser.js_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if 'src' in attribs:
                    js_compressor.get_basename(attribs['src'])
            except UncompressableFileError:
                if 'defer' in attribs:
                    deferred_elements.append(elem)
                else:
                    expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)
    elif name == 'css':
        for elem in parser.css_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if parser.elem_name(elem) == 'link' and attribs['rel'].lower(
                ) == 'stylesheet':
                    css_compressor.get_basename(attribs['href'])
            except UncompressableFileError:
                expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)

    # reconcatenate them
    data = ''.join(parser.elem_str(e) for e in expanded_elements)
    expanded_node = CompressorNode(nodelist=TextNode(data),
                                   kind=name,
                                   mode='file')
    data = ''.join(parser.elem_str(e) for e in compressable_elements)
    compressable_node = CompressorNode(nodelist=TextNode(data),
                                       kind=name,
                                       mode='file')
    data = ''.join(parser.elem_str(e) for e in deferred_elements)
    deferred_node = CompressorNode(nodelist=TextNode(data),
                                   kind=name,
                                   mode='file')

    return '\n'.join([
        expanded_node.get_original_content(context=context),
        compressable_node.render(context=context),
        deferred_node.get_original_content(context=context),
    ])
Ejemplo n.º 2
0
    def get_assets_content(self, asset_type):
        """Takes content from assets files to then bundle them into single file"""

        cc = Compressor()
        content = ""

        for f in self.ASSETS.get(asset_type, []):
            filename = cc.get_filename(f)
            content += cc.get_filecontent(filename, 'utf-8')

        if asset_type == 'css':
            content = content.replace('\n', '')
            content = content.replace('\t', '')

        return content
Ejemplo n.º 3
0
    def get_assets_content(self, asset_type):
        """Takes content from assets files to then bundle them into single file"""

        cc = Compressor()
        content = ""

        for f in self.ASSETS.get(asset_type, []):
            filename = cc.get_filename(f)
            content += cc.get_filecontent(filename, 'utf-8')

        if asset_type == 'css':
            content = content.replace('\n', '')
            content = content.replace('\t', '')

        return content
Ejemplo n.º 4
0
def compress(context, data, name):
    """
    Data is the string from the template (the list of js files in this case)
    Name is either 'js' or 'css' (the sekizai namespace)
    Basically passes the string through the {% compress 'js' %} template tag
    """
    # separate compressable from uncompressable files
    parser = get_class(settings.COMPRESS_PARSER)(data)
    compressor = Compressor()
    compressable_elements, expanded_elements, deferred_elements = [], [], []
    if name == 'js':
        for elem in parser.js_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if 'src' in attribs:
                    compressor.get_basename(attribs['src'])
            except UncompressableFileError:
                if 'defer' in attribs:
                    deferred_elements.append(elem)
                else:
                    expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)
    elif name == 'css':
        for elem in parser.css_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if parser.elem_name(elem) == 'link' and attribs['rel'].lower() == 'stylesheet':
                    compressor.get_basename(attribs['href'])
            except UncompressableFileError:
                expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)

    # reconcatenate them
    data = ''.join(parser.elem_str(e) for e in expanded_elements)
    expanded_node = CompressorNode(nodelist=TextNode(data), kind=name, mode='file')
    data = ''.join(parser.elem_str(e) for e in compressable_elements)
    compressable_node = CompressorNode(nodelist=TextNode(data), kind=name, mode='file')
    data = ''.join(parser.elem_str(e) for e in deferred_elements)
    deferred_node = CompressorNode(nodelist=TextNode(data), kind=name, mode='file')

    return '\n'.join([
        expanded_node.get_original_content(context=context),
        compressable_node.render(context=context),
        deferred_node.get_original_content(context=context),
    ])
Ejemplo n.º 5
0
 def runner(original_file_path, file_type):
     """
     :param original_file_path: e.g. 'app/layout.scss'
     :param file_type: 'css' or 'js'
     """
     original_file_name = os.path.basename(original_file_path)
     compiled_file_path = os.path.join(
         settings.COMPRESS_ROOT,
         Compressor(output_prefix=file_type).get_filepath(
             '...', original_file_name))
     with open(compiled_file_path) as f:
         return f.read()
Ejemplo n.º 6
0
def compress(context, data, name):
    """
    Data is the string from the template (the list of js files in this case)
    Name is either 'js' or 'css' (the sekizai namespace)
    Basically passes the string through the {% compress 'js' %} template tag
    Alternatively, if the block can contain a html comment structured like:
    <!-- compress_options [params] -->
    params can be: one of ['js','css'] and one or multiple of ['file','preload','inline']
    """
    # separate compressable from uncompressable files
    options = []
    kind = name
    m = re.search('<!-- *compress_options *([a-z ]+?) *-->', data)
    if m is not None:
        options_clean = re.sub(' +', ' ', m.groups()[0])
        options = set(options_clean.split(' '))
        if 'js' in options and 'css' not in options:
            kind = 'js'
        elif 'css' in options and 'js' not in options:
            kind = 'css'

    parser = get_class(settings.COMPRESS_PARSER)(data)
    js_compressor, css_compressor = Compressor('js'), Compressor('css')
    compressable_elements, expanded_elements, deferred_elements = [], [], []
    if kind == 'js':
        for elem in parser.js_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if 'src' in attribs:
                    js_compressor.get_basename(attribs['src'])
            except UncompressableFileError:
                if 'defer' in attribs:
                    deferred_elements.append(elem)
                else:
                    expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)
    elif kind == 'css':
        for elem in parser.css_elems():
            attribs = parser.elem_attribs(elem)
            try:
                if parser.elem_name(elem) == 'link' and attribs['rel'].lower(
                ) == 'stylesheet':
                    css_compressor.get_basename(attribs['href'])
            except UncompressableFileError:
                expanded_elements.append(elem)
            else:
                compressable_elements.append(elem)

    # reconcatenate them
    results = []
    data = ''.join(parser.elem_str(e) for e in expanded_elements)
    expanded_node = CompressorNode(nodelist=TextNode(data),
                                   kind=kind,
                                   mode='file')
    results.append(expanded_node.get_original_content(context=context))

    if 'file' in options or len(options) == 0:
        data = ''.join(parser.elem_str(e) for e in compressable_elements)
        compressable_node = CompressorNode(nodelist=TextNode(data),
                                           kind=kind,
                                           mode='file')
        tmp_result = compressable_node.render(context=context)
        if 'defer' in options:
            tmp_result = re.sub("></script>$", " defer=\"defer\"></script>",
                                tmp_result)
        results.append(tmp_result)

    if 'preload' in options:
        data = ''.join(parser.elem_str(e) for e in compressable_elements)
        compressable_node = CompressorNode(nodelist=TextNode(data),
                                           kind=kind,
                                           mode='preload')
        results.append(compressable_node.render(context=context))

    if 'inline' in options:
        data = ''.join(parser.elem_str(e) for e in compressable_elements)
        compressable_node = CompressorNode(nodelist=TextNode(data),
                                           kind=kind,
                                           mode='inline')
        results.append(compressable_node.render(context=context))

    data = ''.join(parser.elem_str(e) for e in deferred_elements)
    deferred_node = CompressorNode(nodelist=TextNode(data),
                                   kind=kind,
                                   mode='file')
    results.append(deferred_node.get_original_content(context=context))

    return '\n'.join(results)