def _minify_buildout(src): """ Run minification on all javascript files in directory src. Minification is done in-place, so the original file is replaced with the minified one. """ for base, dirs, files in os.walk(src): for file in [f for f in files if f.endswith(".js")]: abs = os.path.join(base, file) jsminify.minify_in_place(abs)
def _process_directives(root, filepath, vars): """ Process all directives in the file filepath. The root dir is in root TODO: Refactor this to use separate functions for each directive and just pass in a context for it to keep stuff in. """ file = open(filepath) tmpfd, tmppath = tempfile.mkstemp(".tmp", "dfbuild.") tmpfile = os.fdopen(tmpfd, "w") known_files = {} current_css_file = None current_js_file = None for line in file: match_cmd = _re_command.search(line) match_css = _re_css.search(line) match_js = _re_script.search(line) match_comment = _re_comment.search(line) if match_cmd: cmd, target, neg, cond = match_cmd.groups() if cond: # check if this directive is conditional c = bool(cond in vars and vars[cond]) if neg: c = not c if not c: # the condition was not met, skip rule continue # at this point the rule will be honoured if cmd == "concat_css": if target in ["off", "false", "no"]: current_css_file = None elif target in known_files: current_css_file = target else: known_files[target] = [] current_css_file = target tmpfile.write(_style_ele % target) continue elif cmd == "concat_js": if target in ["off", "false", "no"]: current_js_file = None elif target in known_files: current_js_file = target else: known_files[target] = [] current_js_file = target tmpfile.write(_script_ele % target) continue elif cmd == "set_rel_base_url" and \ vars.has_key("base_url") and vars["base_url"]: tmpfile.write(_base_url % vars["base_url"]) continue else: # some other unknown command! Let fall through so line is written pass elif match_comment: continue elif match_css: if current_css_file: known_files[current_css_file].append(match_css.group("href")) continue elif match_js: if current_js_file: known_files[current_js_file].append(match_js.group("src")) #fixme: The following continue should have been on the same level as this comment. However, that causes lang files to be included. must fix continue elif line.isspace(): continue tmpfile.write(line) tmpfile.close() # write back the temp stuff, which is now the authoritative stuff: shutil.copy(tmppath, filepath) os.unlink(tmppath) for outfile, contentfiles in known_files.items(): outpath = os.path.join(root, outfile) outdir = os.path.dirname(outpath) if not os.path.isdir(outdir): os.makedirs(outdir) fout_path = os.path.join(root, outfile) fout = codecs.open(fout_path, "w", encoding="utf_8_sig") for infile in contentfiles: fout.write(_concatcomment % infile) fin = codecs.open(os.path.join(root, infile), "r", encoding="utf_8_sig") fout.write(fin.read()) fin.close() os.unlink(os.path.join(root, infile)) fout.close() if fout_path.endswith('.js') and options.minify: # fout is a temp file here jsminify.minify_in_place(fout_path)