Skip to content

Instantly share code, notes, and snippets.

@zhasm
Last active December 19, 2015 08:29
Show Gist options
  • Save zhasm/5926097 to your computer and use it in GitHub Desktop.
Save zhasm/5926097 to your computer and use it in GitHub Desktop.
自动发现和编译coffeeb?文件。自动清除错误编译的文件。 原理:检测所有当前目录下的coffee、coffeeb文件,生成 Makefile,然后运行make。 约定coffeeb是以bare模式编译的coffee文件。 执行:python makecoffee.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#
# Author: Rex Zhang
# Create Time: 2013-07-04 16:14
# File name: makecoffee.py
import os
import re
import logging
import sys
def getFiles(pattern, location='.', ignore=None):
if ignore:
cmd = 'find %s -name "%s" |grep -iv "%s"' % (location, pattern, ignore)
else:
cmd = 'find %s -name "%s"' % (location, pattern)
return [i.replace('\n', '') for i in os.popen(cmd).readlines() if '.#' not in i]
COMMENT = len(sys.argv) > 1
class Coffee():
def __init__(self, fn):
self.fn = fn
self.bare = 'b' if '.coffeeb' in fn else ''
self.js = re.sub(r'\.coffeeb?$', '.js', fn)
self._autoClean()
def _autoClean(self):
if not self.bare:
return
if not os.path.exists(self.js):
return
c = open(self.js).read()
if re.search(r'(?im)^\(function\(\)\s\{', c) and \
re.search(r'(?im)\}\)\.call\(this\);$', c):
try:
os.remove(self.js)
except Exception as e:
print 'delete %s error: %r' % (self.js, e)
def getJS(self):
return self.js
def getCmp(self):
d = vars(self)
d.update({
'min': self.js.replace('.js', '.min.js'),
})
cmt = '#' if COMMENT else ''
d.update({'cmt': cmt})
return """%(js)s: %(fn)s\n\tcoffee --no-header -c%(bare)s %(fn)s
\t%(cmt)sjava -jar ~/Dropbox/bin/yuicompressor.jar --type js %(js)s --charset utf-8 -o %(min)s
\t%(cmt)smv %(min)s %(js)s
""" % d
def isPure(self):
return self.bare == ''
class Less():
def __init__(self, fn):
self.fn = fn
self.css = re.sub(r'(?i)\.less', '.css', fn)
self.min = self.css.replace('.css', '.min.css')
def getCss(self):
return self.css
def getCmp(self):
d = vars(self)
cmt = '#' if COMMENT else ''
d.update({'cmt': cmt})
return """%(css)s: %(fn)s
\tlessc %(fn)s %(css)s
\t%(cmt)sjava -jar ~/Dropbox/bin/yuicompressor.jar --type css %(css)s --charset utf-8 -o %(min)s
\t%(cmt)smv %(min)s %(css)s
""" % d
class MakeLess():
def __init__(self):
self.files = [Less(i) for i in getFiles('*.less', ignore='font-awesome')]
def _clean(self):
files = [i.getCss() for i in self.files]
return sorted(files)
def _getFiles(self, s, name):
files = sorted([i.getCss() for i in s])
return "\n%s: %s\n" % (name, " ".join(files))
def getAll(self):
return self._getFiles(self.files, 'css')
def getClean(self):
return """cleanCss:\n\trm %s\n""" % ' '.join(self._clean())
def getBody(self):
cmd = [self.getAll(), self.getClean()]
for i in self.files:
cmd.append(i.getCmp())
return '\n'.join(cmd)
def run(self):
cmd = self.getBody()
f = open('Makefile', 'a')
f.write(cmd)
f.close()
print '\n'.join(os.popen('make').readlines())
class MakeCoffee():
def __init__(self):
self.pure = [Coffee(i) for i in getFiles('*.coffee')]
self.bare = [Coffee(i) for i in getFiles('*.coffeeb')]
def _clean(self):
files = [i.getJS() for i in self.pure+self.bare]
return sorted(files)
def _getFiles(self, s, name):
files = sorted([i.getJS() for i in s])
return "%s: %s\n" % (name, " ".join(files))
def getBare(self):
return self._getFiles(self.bare, 'bare')
def getPure(self):
return self._getFiles(self.pure, 'pure')
def getAll(self):
return self._getFiles(self.pure+self.bare, 'all')
def getClean(self):
return """clean:\n\trm %s\n""" % ' '.join(self._clean())
def getBody(self):
cmd = [self.getAll(), self.getPure(), self.getBare(), self.getClean()]
for i in self.pure:
cmd.append(i.getCmp())
for i in self.bare:
cmd.append(i.getCmp())
return '\n'.join(cmd)
def run(self):
cmd = self.getBody()
f = open('Makefile', 'w')
f.write(cmd)
f.close()
# print '\n'.join(os.popen('make').readlines())
if __name__ == '__main__':
MakeCoffee().run()
MakeLess().run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment