import os from fnmatch import fnmatch import yaml from django.conf import settings DATA_URI_START = "" DATA_URI_END = "" MHTML_START = "" class JammitAssets: ASSET_FILENAME = "assets.yml" def __init__(self, assets_dir): """ Initializes the Jammit object by reading the assets.yml file and stores all javascripts and stylesheets in memory for easy lookup in templates. """ self.assets_dir = assets_dir self.assets = self.read_assets() def read_assets(self): """ Read the assets from the YAML and store it as a lookup dictionary. """ filepath = os.path.join(self.assets_dir, self.ASSET_FILENAME) with open(filepath, "r") as yaml_file: return yaml.safe_load(yaml_file) def render_tags(self, asset_type, asset_package): """ Returns rendered ' % path def javascript_tag_compressed(self, asset_package, asset_type_ext): filename = "static/%s.%s" % (asset_package, asset_type_ext) asset_mtime = int(os.path.getmtime(filename)) path = "%s?%s" % (filename, asset_mtime) return self.javascript_tag(path) def stylesheet_tag(self, path): return '' % path def stylesheet_tag_compressed(self, asset_package, asset_type_ext): datauri_filename = "static/%s-datauri.%s" % (asset_package, asset_type_ext) original_filename = "static/%s.%s" % (asset_package, asset_type_ext) asset_mtime = int(os.path.getmtime(datauri_filename)) datauri_path = "%s?%s" % (datauri_filename, asset_mtime) original_path = "%s?%s" % (original_filename, asset_mtime) return "\n".join( [ DATA_URI_START, self.stylesheet_tag(datauri_path), DATA_URI_END, MHTML_START, self.stylesheet_tag(original_path), MHTML_END, ] ) class FileFinder: @classmethod def filefinder(cls, pattern): paths = [] if "**" in pattern: folder, wild, pattern = pattern.partition("/**/") for f in cls.recursive_find_files(folder, pattern): paths.append(f) else: folder, pattern = os.path.split(pattern) for f in cls.find_files(folder, pattern): # print f, paths paths.append(f) return paths @classmethod def recursive_find_files(cls, folder, pattern): for root, dirs, files in os.walk(folder): for f in files: if fnmatch(f, pattern): yield os.path.join(root, f) @classmethod def find_files(cls, folder, pattern): listdir = os.listdir(folder) listdir.sort() for entry in listdir: if not os.path.isdir(entry) and fnmatch(entry, pattern): yield os.path.join(folder, entry)