def convert_stream(): import sys try: print clevercss.convert(sys.stdin.read()) except (ParserError, EvalException), e: sys.stderr.write('Error: %s\n' % e) sys.exit(1)
def main(): # This is *a little* ugly, but ISTM there are no really great solutions here. # Pick your poision, sort of. clevercss.Parser.sprite_map_cls = clevercss.AnnotatingSpriteMap # Run the file through the parser so the annotater catches it all. fname = sys.argv[1] clevercss.convert(open(fname, "U").read(), fname=fname) # Then extract the sprite names. Should probably add output options here. for smap, sprites in clevercss.AnnotatingSpriteMap.all_used_sprites(): map_name = smap.map_fname.to_string(None) sprite_names = " ".join(s.name for s in sprites) print "%s: %s" % (map_name, sprite_names)
def get_clever_css(title): title = title.strip('"') try: sheet = Stylesheet.objects.get(title=title) except Stylesheet.DoesNotExist: raise template.TemplateSyntaxError('%s is an invalid stylesheet' % title) parse = False modified = None path = os.path.join(settings.MEDIA_ROOT, 'clevercss') file = '%s.css' % sheet.filename output = os.path.join(path, file) try: os.makedirs(path) except OSError: pass try: modified = datetime.fromtimestamp(os.path.getmtime(output)) except OSError: pass if not modified or (modified and modified < sheet.date_updated): parse = True if parse: try: f = open(output, 'w') f.write(clevercss.convert(sheet.ccss)) f.close() except IOError: raise template.TemplateSyntaxError('Failed to write %s' % output) return '%sclevercss/%s' % (settings.MEDIA_URL, file)
def convert_many(files, options): for fname in files: target = fname.rsplit('.', 1)[0] + '.css' if fname == target: sys.stderr.write('Error: same name for ' 'source and target file "%s".' % fname) sys.exit(2) elif options.no_overwrite and os.path.exists(target): sys.stderr.write('File exists (and --no-overwrite was used) "%s".' % target) sys.exit(3) src = open(fname) try: try: converted = clevercss.convert(src.read(), fname=fname) except (ParserError, EvalException), e: sys.stderr.write('Error in file %s: %s\n' % (fname, e)) sys.exit(1) if options.minified: css = cssutils.CSSParser().parseString(converted) cssutils.ser.prefs.useMinified() converted = css.cssText dst = open(target, 'w') try: print 'Writing output to %s...' % target dst.write(converted) finally: dst.close() finally:
def render_css(request, file): o = get_template(file) r = o.render({}) x = clevercss.convert(r) return HttpResponse(x, mimetype="text/css")
def convert_stream(): import sys try: print(clevercss.convert(sys.stdin.read())) except (ParserError, EvalException) as e: sys.stderr.write('Error: %s\n' % e) sys.exit(1)
def do_clevercss(fn): ''' Create css from ccss and return its path Requires settings.MEDIA_ROOT, settings.MEDIA_URL ''' css_name = fn.rsplit('.', 1)[0] css_url = os.path.join(settings.MEDIA_URL, 'css', css_name +'.css') fn = os.path.join(settings.MEDIA_ROOT, 'css', fn) target = fn.rsplit('.', 1)[0] + '.css' if fn == target: sys.stderr.write('Error: same name for source and target file' ' "%s".' % fn) sys.exit(2) # if css newer than ccss if not os.path.exists(fn) and os.path.getmtime(fn) < os.path.getmtime(target): # do nothing return css_url src = file(fn) try: try: converted = convert(src.read()) except (ParserError, EvalException), e: sys.stderr.write('Error in file %s: %s\n' % (fn, e)) sys.exit(1) dst = file(target, 'w') try: dst.write(converted) finally: dst.close()
def convert2(self): self.assertEqual( convert( '''body: background-color: $background_color ''', {'background_color': 'red.darken(10)'}), u'body {\n background-color: #cc0000;\n}')
def _processCCSS( self, path ): """Processes a CCSS file, minifying it if `cssmin` is installed. Requires `clevercss`""" data = self.app().load(path) data = clevercss.convert(data) if self.minify and cssmin: data = cssmin.cssmin(data) return data
def ConvertCcssFile(ccssPath, cssPath, targetDirName='', convertImports=True): def fixupImport(tdn, imps): imports = [] for i in xrange(0, len(imps)): if imps[i].startswith('/'): imports.append(imps[i]) else: imports.append( ('/' + os.path.join(tdn.strip('/'), imps[i]).strip('/')).replace( PathCore, '').replace('/ui/', '/').replace('/cache/css', '')) return imports if not targetDirName: targetDirName = os.path.dirname(cssPath) if not os.path.isdir(targetDirName): os.makedirs(targetDirName) with open(ccssPath, 'r') as ccssFile: with open(cssPath, 'w') as cssFile: imports = [] cssFile.write( '/* Auto-generated with CleverCSS from: ~' + ccssPath.replace(PathCore, '') + ' [' + util.GetDateTimeString() + '] */\n\n' + util.FixupCcss( clevercss.convert( util.PreprocessCcss(ccssFile.read(), imports)), fixupImport(targetDirName, imports), not DEBUG)) if convertImports: for imp in imports: tp = (imp.startswith('/') and MapPath('ui/' + imp.strip('/')) or os.path.join(targetDirName, imp)) ConvertCcssFile(tp.replace('cache/css/', ''), tp.replace('.ccss', '.css'))
def process(resource): import clevercss data = resource.source_file.read_all() out = clevercss.convert(data) out_file = File(resource.source_file.path_without_extension + ".css") out_file.write(out) resource.source_file.delete()
def test_import_line(self): """ Tests the @import url() command. assumes the code is running in the main directory. (i.e. python -c 'from tests import *; main()' from the same dir as clevercss) """ self.assertEqual( convert( dedent(""" @import url(tests/example.ccss) div: color: $arg """)), dedent(""" #test1 { color: blue; } #test2 { color: blue; } #test3 { color: blue; } div { color: blue; }""").strip())
def eigen_test(): import re rx = re.compile(r"Example::\n(.*?)__END__(?ms)") text = rx.search(clevercss.__doc__).group(1) ccss = "\n".join(line[8:].rstrip() for line in text.splitlines()) return clevercss.convert(ccss)
def convert_many(files, options): for fname in files: target = fname.rsplit('.', 1)[0] + '.css' if fname == target: sys.stderr.write('Error: same name for ' 'source and target file "%s".' % fname) sys.exit(2) elif options.no_overwrite and os.path.exists(target): sys.stderr.write('File exists (and --no-overwrite was used) "%s".' % target) sys.exit(3) src = open(fname) try: try: converted = clevercss.convert(src.read(), fname=fname) except (ParserError, EvalException) as e: sys.stderr.write('Error in file %s: %s\n' % (fname, e)) sys.exit(1) if options.minified: css = cssutils.CSSParser().parseString(converted) cssutils.ser.prefs.useMinified() converted = css.cssText dst = open(target, 'w') try: print('Writing output to %s...' % target) dst.write(converted) finally: dst.close() finally: src.close()
def simpleMacro(self): ccss = dedent( """ def simple: color: red font-size: 3px+10px body: $simple width:200px .other: $simple """ ) css = dedent( """\ body { color: red; font-size: 13px; width: 200px; } .other { color: red; font-size: 13px; }""" ) self.assertEqual(convert(ccss), css)
def test_math(self): self.assertEqual( convert( dedent( """ div: margin: -2px -2px padding: 2px + 2px top: 1px+1 left: 5+5px right: 4px-5px bottom: 0 - 5px text-shadow: 0px -1px 8px #fff """ ) ), dedent( """ div { margin: -2px -2px; padding: 4px; top: 2px; left: 10px; right: -1px; bottom: -5px; text-shadow: 0px -1px 8px #ffffff; }""" ).strip(), )
def test_import_line(self): """ Tests the @import url() command. assumes the code is running in the main directory. (i.e. python -c 'from tests import *; main()' from the same dir as clevercss) """ self.assertEqual(convert(dedent(""" @import url(clevercss/tests/example.ccss) div: color: $arg """)), dedent(""" #test1 { color: blue; } #test2 { color: blue; } #test3 { color: blue; } div { color: blue; }""").strip())
def backstring(self): self.assertEqual(convert(dedent(''' div.round: background-image: `-webkit-gradient(top left, bottom right, from(#fff), to(#000))` ''')), dedent('''\ div.round { background-image: -webkit-gradient(top left, bottom right, from(#fff), to(#000)); }'''))
def test_02_min_convert_colors(self): self.assertEqual(convert('''body: background-color: #ffff00 color: #fffafa p: background-color: #ff0000 color: khaki ''', minified=True), u'body{background-color:#ff0;color:snow}body p{background-color:red;color:khaki}')
def convert(self): self.assertEqual( convert( """body: color: $color """, {"color": "#eee"}, ), u"body {\n color: #eeeeee;\n}", )
def convert2(self): self.assertEqual( convert( """body: background-color: $background_color """, {"background_color": "red.darken(10)"}, ), u"body {\n background-color: #cc0000;\n}", )
def convert(): str = '' for file in files: str += open(file, 'r').read() try: open(sys.argv[1], 'w').write(clevercss.convert(str)) except Exception as inst: print inst print type(inst) print inst.args
def get_css(self): print('called') filename = pkg_resources.resource_filename('fanart', 'templates/style/style.ccss') css_context = dict( url=URLExpression('fanart:static', self.request.static_url), avatar_size=clevercss.expressions.Value(AVATAR_SIZE, 'px'), ) return clevercss.convert(open(filename).read(), minified=False, fname=filename, context=css_context)
def backstring(self): self.assertEqual( convert( dedent(''' div.round: background-image: `-webkit-gradient(top left, bottom right, from(#fff), to(#000))` ''')), dedent('''\ div.round { background-image: -webkit-gradient(top left, bottom right, from(#fff), to(#000)); }'''))
def test_02_min_convert_colors(self): self.assertEqual( convert('''body: background-color: #ffff00 color: #fffafa p: background-color: #ff0000 color: khaki ''', minified=True), u'body{background-color:#ff0;color:snow}body p{background-color:red;color:khaki}' )
def test_multiline_rule(self): self.assertEqual(convert(dedent(""" ul.item1 li.item1, ul.item2 li.item2, ul.item3 li.item3: font-weight: bold """)), dedent(""" ul.item1 li.item1, ul.item2 li.item2, ul.item3 li.item3 { font-weight: bold; }""").strip())
def getCCSS( self, request, css ): import clevercss root = self.library if os.path.exists(os.path.join(root, "ccss", css)): path = os.path.join(root, "ccss", css) else: path = os.path.join(root, "css", css) if not self._inCache(path): text = self.app().load(path) text = self._toCache(path, clevercss.convert(text)) else: text = self._fromCache(path) return request.respond(text, contentType="text/css")
def hook_preconvert_ccss(): """ Обработка CleverCSS. Файлы с расширением .ccss конвертируются в .css. """ for ccss in glob.glob(os.path.join(input, "**.ccss")): css = ccss[len(input):].lstrip("/") css = "%s.css" % os.path.splitext(css)[0] css = os.path.join(output, css) fpi = open(ccss) fpo = open(css, 'w') fpo.write(clevercss.convert(fpi.read())) fpi.close() fpo.close()
def build_css(): total = [] for filename in os.listdir(clever_path): path = os.path.join(clever_path, filename) with open(path) as file: if path.endswith('.clever'): total.append("\n/* %s */" % filename) total.append(clevercss.convert(file.read())) elif path.endswith('.css'): total.append("\n/* %s */" % filename) total.append(file.read()) with open(result_path, 'w') as file: file.write("\n".join(total).strip())
def compile(): print " * Compiling CSS" total = [] for filename in os.listdir(css): path = os.path.join(css, filename) with open(path) as file: if path.endswith('.clever'): total.append("\n/* %s */" % filename) total.append(clevercss.convert(file.read())) else: total.append("\n/* %s */" % filename) total.append(file.read()) with open(os.path.join(static, 'style.css'), 'w') as file: file.write("\n".join(total).strip())
def test_multiline_rule(self): self.assertEqual( convert( dedent(""" ul.item1 li.item1, ul.item2 li.item2, ul.item3 li.item3: font-weight: bold """)), dedent(""" ul.item1 li.item1, ul.item2 li.item2, ul.item3 li.item3 { font-weight: bold; }""").strip())
def _do_css(): for out_file, in_files in CSS_FILES.iteritems(): code = [] for in_file in in_files['files']: f = open(os.path.join(IN_PATH_CSS, in_file)) code.append('/* %s */\n\n' % (in_file)) if in_file.endswith('ccss'): code.append(clevercss.convert(f.read(), CLEVERCSS_CONTEXT)) else: code.append(f.read()) code.append('\n\n') f.close() code = ''.join(code) if COMPRESS: code = minimalize(code, level=FULL) code = ('/* %s */\n\n' % in_files['comment']) + code f = open(os.path.join(OUT_PATH_CSS, out_file), 'w') f.write(code) f.close()
def generate_css_from_ccss(context=None): """Parses CleverCSS source files in CLEVERCSS_SOURCE and generates CSS output, which is placed in CLEVERCSS_OUTPUT. Note that files beginning with an underscore will be ignored, as will any subdirectories.""" # Get a list of CCSS files files = get_ccss_file_list() # If no context was passed, fetch one if isinstance(context, (str, unicode)): # Passed a file, not a dict? use_context = ini_to_context(context) else: use_context = context or ini_to_context() outfiles = [] # Loop over found files and process them for filename in files: # Try to read the source file, handle exceptions, etc. try: srcfile = open(filename, 'r') except IOError, msg: raise try: try: converted = clevercss.convert(srcfile.read(), use_context, fname=filename) except (ParserError, EvalException), msg: raise ValueError, "Error in file %s: %s" % (filename, msg) finally: srcfile.close() # Try to dump output into targetfile targetname = path.basename(filename.rsplit('.', 1)[0] + '.css') targetfile = path.join(CLEVERCSS_OUTPUT, targetname) try: outfile = open(targetfile, 'w') outfiles.append(targetfile) except IOError, msg: raise
def simpleMacro(self): ccss = dedent(''' def simple: color: red font-size: 3px+10px body: $simple width:200px .other: $simple ''') css = dedent('''\ body { color: red; font-size: 13px; width: 200px; } .other { color: red; font-size: 13px; }''') self.assertEqual(convert(ccss), css)
def test_math(self): self.assertEqual( convert( dedent(""" div: margin: -2px -2px padding: 2px + 2px top: 1px+1 left: 5+5px right: 4px-5px bottom: 0 - 5px text-shadow: 0px -1px 8px #fff """)), dedent(""" div { margin: -2px -2px; padding: 4px; top: 2px; left: 10px; right: -1px; bottom: -5px; text-shadow: 0px -1px 8px #ffffff; }""").strip())
def getCCSS( self, request, paths ): response_data = "" if not self.cacheAggregates or not self._inCache(paths): result = [] for path in paths.split("+"): root = self.library if os.path.exists(os.path.join(root, "ccss", path)): path = os.path.join(root, "ccss", path) else: path = os.path.join(root, "css", path) if not self._inCache(path): data = self.app().load(path) data = clevercss.convert(data) if self.minify and cssmin: data = cssmin.cssmin(data) self._toCache(path, data) else: data = self._fromCache(path) result.append(data) response_data = "\n".join(result) self._toCache(paths, response_data) else: response_data = self._fromCache(paths) return request.respond(response_data, contentType="text/css").compress(self.compress)
def getCCSS(self, request, paths): response_data = "" if not self.cacheAggregates or not self._inCache(paths): result = [] for path in paths.split("+"): root = self.library if os.path.exists(os.path.join(root, "ccss", path)): path = os.path.join(root, "ccss", path) else: path = os.path.join(root, "css", path) if not self._inCache(path): data = self.app().load(path) data = clevercss.convert(data) if self.minify and cssmin: data = cssmin.cssmin(data) self._toCache(path, data) else: data = self._fromCache(path) result.append(data) response_data = "\n".join(result) self._toCache(paths, response_data) else: response_data = self._fromCache(paths) return request.respond(response_data, contentType="text/css").compress(self.compress)
def meta(self): a = clevercss.convert(ccss, indent=4) if a != css: print a print css self.assertEqual(a, css)
def ConvertCcssFile(ccssPath, cssPath, targetDirName = '', convertImports = True): def fixupImport(tdn, imps): imports = [] for i in xrange(0, len(imps)): if imps[i].startswith('/'): imports.append(imps[i]) else: imports.append(('/' + os.path.join(tdn.strip('/'), imps[i]).strip('/')).replace(PathCore, '').replace('/ui/', '/').replace('/cache/css', '')) return imports if not targetDirName: targetDirName = os.path.dirname(cssPath) if not os.path.isdir(targetDirName): os.makedirs(targetDirName) with open(ccssPath, 'r') as ccssFile: with open(cssPath, 'w') as cssFile: imports = [] cssFile.write('/* Auto-generated with CleverCSS from: ~' + ccssPath.replace(PathCore, '') + ' [' + util.GetDateTimeString() + '] */\n\n' + util.FixupCcss(clevercss.convert(util.PreprocessCcss(ccssFile.read(), imports)), fixupImport(targetDirName, imports), not DEBUG)) if convertImports: for imp in imports: tp = (imp.startswith('/') and MapPath('ui/' + imp.strip('/')) or os.path.join(targetDirName, imp)) ConvertCcssFile(tp.replace('cache/css/', ''), tp.replace('.ccss', '.css'))
def test_01_min_convert(self): self.assertEqual( convert('''body: color: $color ''', {'color': '#eee'}, minified=True), u'body{color:#eee}')
def _test_attr(self, attr, ccval, cssval): self.assertEqual(convert("body:\n %s: %s\n" % (attr, ccval)), "body {\n %s: %s;\n}" % (attr, cssval))
def test_02_min_convert(self): self.assertEqual( convert('''body: background-color: $background_color ''', {'background_color': 'red.darken(10)'}, minified=True), u'body{background-color:#c00}')
#!/usr/bin/env python """Extract the names of the sprites of each sprite map in a CleverCSS.""" import sys import clevercss # This is *a little* ugly, but ISTM there are no really great solutions here. # Pick your poision, sort of. clevercss.Parser.sprite_map_cls = clevercss.AnnotatingSpriteMap # Run the file through the parser so the annotater catches it all. fname = sys.argv[1] clevercss.convert(open(fname, "U").read(), fname=fname) # Then extract the sprite names. Should probably add output options here. for smap, sprites in clevercss.AnnotatingSpriteMap.all_used_sprites(): map_name = smap.map_fname.to_string(None) sprite_names = " ".join(s.name for s in sprites) print "%s: %s" % (map_name, sprite_names)
def eigen_test(): filename = os.path.join(os.path.dirname(__file__), 'eigentest.ccss') ccss = open(filename).read() return clevercss.convert(ccss)
def convert(self): self.assertEqual( convert('''body: color: $color ''', {'color': '#eee'}), u'body {\n color: #eeeeee;\n}')
def test_01_convert(self): self.assertEqual(convert('''body: color: $color ''',{'color':'#eee'}), u'body {\n color: #eeeeee;\n}')
def _test_attr(self, attr, ccval, cssval): self.assertEqual(convert('body:\n %s: %s\n' % (attr, ccval)), 'body {\n %s: %s;\n}' % (attr, cssval))
def get_output(self, variation): for input in self.get_input(variation): yield convert(input)
def process(resource): import clevercss data = resource.source_file.read_all() out = clevercss.convert(data) resource.source_file.write(out)
def input(self, **kwargs): if 'filename' in kwargs and kwargs['filename'].endswith('ccss'): return '@media screen {%s}' % clevercss.convert(self.content.replace('@media screen {', '')[:-1]) return self.content
def convert_spritemap(self): self.assertEqual( convert(open('tests/example_sprites.ccss').read(), fname='tests/example_sprites.ccss'), correct)
def do_test(): rx = re.compile(r'Example::\n(.*?)__END__(?ms)') text = rx.search(clevercss.__doc__).group(1) ccss = '\n'.join(line[8:].rstrip() for line in text.splitlines()) return clevercss.convert(ccss)
def get_dev_output(self, name, variation): content = super(CleverCSS, self).get_dev_output(name, variation) return convert(content)
def action(source, dest): with open(source, 'r') as s: if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest)) with open(dest, 'w') as d: d.write(clevercss.convert(s.read()))