Commit patch from Tim Schaub for #361 : replace tabs with spaces in

jsmin.py and mergejs.py, to make all our python stuff follow the same 
conventions. 


git-svn-id: http://svn.openlayers.org/trunk/openlayers@1905 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
crschmidt
2006-11-18 14:53:52 +00:00
parent ac949589a0
commit 57dc3a7f53
2 changed files with 156 additions and 156 deletions
+151 -151
View File
@@ -33,180 +33,180 @@
from StringIO import StringIO from StringIO import StringIO
def jsmin(js): def jsmin(js):
ins = StringIO(js) ins = StringIO(js)
outs = StringIO() outs = StringIO()
JavascriptMinify().minify(ins, outs) JavascriptMinify().minify(ins, outs)
str = outs.getvalue() str = outs.getvalue()
if len(str) > 0 and str[0] == '\n': if len(str) > 0 and str[0] == '\n':
str = str[1:] str = str[1:]
return str return str
def isAlphanum(c): def isAlphanum(c):
"""return true if the character is a letter, digit, underscore, """return true if the character is a letter, digit, underscore,
dollar sign, or non-ASCII character. dollar sign, or non-ASCII character.
""" """
return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or
(c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126));
class UnterminatedComment(Exception): class UnterminatedComment(Exception):
pass pass
class UnterminatedStringLiteral(Exception): class UnterminatedStringLiteral(Exception):
pass pass
class UnterminatedRegularExpression(Exception): class UnterminatedRegularExpression(Exception):
pass pass
class JavascriptMinify(object): class JavascriptMinify(object):
def _outA(self): def _outA(self):
self.outstream.write(self.theA) self.outstream.write(self.theA)
def _outB(self): def _outB(self):
self.outstream.write(self.theB) self.outstream.write(self.theB)
def _get(self): def _get(self):
"""return the next character from stdin. Watch out for lookahead. If """return the next character from stdin. Watch out for lookahead. If
the character is a control character, translate it to a space or the character is a control character, translate it to a space or
linefeed. linefeed.
""" """
c = self.theLookahead c = self.theLookahead
self.theLookahead = None self.theLookahead = None
if c == None: if c == None:
c = self.instream.read(1) c = self.instream.read(1)
if c >= ' ' or c == '\n': if c >= ' ' or c == '\n':
return c return c
if c == '': # EOF if c == '': # EOF
return '\000' return '\000'
if c == '\r': if c == '\r':
return '\n' return '\n'
return ' ' return ' '
def _peek(self): def _peek(self):
self.theLookahead = self._get() self.theLookahead = self._get()
return self.theLookahead return self.theLookahead
def _next(self): def _next(self):
"""get the next character, excluding comments. peek() is used to see """get the next character, excluding comments. peek() is used to see
if a '/' is followed by a '/' or '*'. if a '/' is followed by a '/' or '*'.
""" """
c = self._get() c = self._get()
if c == '/': if c == '/':
p = self._peek() p = self._peek()
if p == '/': if p == '/':
c = self._get() c = self._get()
while c > '\n': while c > '\n':
c = self._get() c = self._get()
return c return c
if p == '*': if p == '*':
c = self._get() c = self._get()
while 1: while 1:
c = self._get() c = self._get()
if c == '*': if c == '*':
if self._peek() == '/': if self._peek() == '/':
self._get() self._get()
return ' ' return ' '
if c == '\000': if c == '\000':
raise UnterminatedComment() raise UnterminatedComment()
return c return c
def _action(self, action): def _action(self, action):
"""do something! What you do is determined by the argument: """do something! What you do is determined by the argument:
1 Output A. Copy B to A. Get the next B. 1 Output A. Copy B to A. Get the next B.
2 Copy B to A. Get the next B. (Delete A). 2 Copy B to A. Get the next B. (Delete A).
3 Get the next B. (Delete B). 3 Get the next B. (Delete B).
action treats a string as a single character. Wow! action treats a string as a single character. Wow!
action recognizes a regular expression if it is preceded by ( or , or =. action recognizes a regular expression if it is preceded by ( or , or =.
""" """
if action <= 1: if action <= 1:
self._outA() self._outA()
if action <= 2: if action <= 2:
self.theA = self.theB self.theA = self.theB
if self.theA == "'" or self.theA == '"': if self.theA == "'" or self.theA == '"':
while 1: while 1:
self._outA() self._outA()
self.theA = self._get() self.theA = self._get()
if self.theA == self.theB: if self.theA == self.theB:
break break
if self.theA <= '\n': if self.theA <= '\n':
raise UnterminatedStringLiteral() raise UnterminatedStringLiteral()
if self.theA == '\\': if self.theA == '\\':
self._outA() self._outA()
self.theA = self._get() self.theA = self._get()
if action <= 3: if action <= 3:
self.theB = self._next() self.theB = self._next()
if self.theB == '/' and (self.theA == '(' or self.theA == ',' or self.theA == '='): if self.theB == '/' and (self.theA == '(' or self.theA == ',' or self.theA == '='):
self._outA() self._outA()
self._outB() self._outB()
while 1: while 1:
self.theA = self._get() self.theA = self._get()
if self.theA == '/': if self.theA == '/':
break break
elif self.theA == '\\': elif self.theA == '\\':
self._outA() self._outA()
self.theA = self._get() self.theA = self._get()
elif self.theA <= '\n': elif self.theA <= '\n':
raise UnterminatedRegularExpression() raise UnterminatedRegularExpression()
self._outA() self._outA()
self.theB = self._next() self.theB = self._next()
def _jsmin(self): def _jsmin(self):
"""Copy the input to the output, deleting the characters which are """Copy the input to the output, deleting the characters which are
insignificant to JavaScript. Comments will be removed. Tabs will be insignificant to JavaScript. Comments will be removed. Tabs will be
replaced with spaces. Carriage returns will be replaced with linefeeds. replaced with spaces. Carriage returns will be replaced with linefeeds.
Most spaces and linefeeds will be removed. Most spaces and linefeeds will be removed.
""" """
self.theA = '\n' self.theA = '\n'
self._action(3) self._action(3)
while self.theA != '\000': while self.theA != '\000':
if self.theA == ' ': if self.theA == ' ':
if isAlphanum(self.theB): if isAlphanum(self.theB):
self._action(1) self._action(1)
else: else:
self._action(2) self._action(2)
elif self.theA == '\n': elif self.theA == '\n':
if self.theB in ['{', '[', '(', '+', '-']: if self.theB in ['{', '[', '(', '+', '-']:
self._action(1) self._action(1)
elif self.theB == ' ': elif self.theB == ' ':
self._action(3) self._action(3)
else: else:
if isAlphanum(self.theB): if isAlphanum(self.theB):
self._action(1) self._action(1)
else: else:
self._action(2) self._action(2)
else: else:
if self.theB == ' ': if self.theB == ' ':
if isAlphanum(self.theA): if isAlphanum(self.theA):
self._action(1) self._action(1)
else: else:
self._action(3) self._action(3)
elif self.theB == '\n': elif self.theB == '\n':
if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: if self.theA in ['}', ']', ')', '+', '-', '"', '\'']:
self._action(1) self._action(1)
else: else:
if isAlphanum(self.theA): if isAlphanum(self.theA):
self._action(1) self._action(1)
else: else:
self._action(3) self._action(3)
else: else:
self._action(1) self._action(1)
def minify(self, instream, outstream): def minify(self, instream, outstream):
self.instream = instream self.instream = instream
self.outstream = outstream self.outstream = outstream
self.theA = None self.theA = None
self.thaB = None self.thaB = None
self.theLookahead = None self.theLookahead = None
self._jsmin() self._jsmin()
self.instream.close() self.instream.close()
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
jsm = JavascriptMinify() jsm = JavascriptMinify()
jsm.minify(sys.stdin, sys.stdout) jsm.minify(sys.stdin, sys.stdout)
+5 -5
View File
@@ -155,14 +155,14 @@ if __name__ == "__main__":
## Find all the Javascript source files ## Find all the Javascript source files
for root, dirs, files in os.walk(sourceDirectory): for root, dirs, files in os.walk(sourceDirectory):
for filename in files: for filename in files:
if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."): if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
filepath = os.path.join(root, filename)[len(sourceDirectory)+1:] filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
if cfg and cfg.include: if cfg and cfg.include:
if filepath in cfg.include or filepath in cfg.forceFirst: if filepath in cfg.include or filepath in cfg.forceFirst:
allFiles.append(filepath) allFiles.append(filepath)
elif (not cfg) or (filepath not in cfg.exclude): elif (not cfg) or (filepath not in cfg.exclude):
allFiles.append(filepath) allFiles.append(filepath)
## Header inserted at the start of each file in the output ## Header inserted at the start of each file in the output
HEADER = "/* " + "=" * 70 + " %s\n" + " " + "=" * 70 + " */\n\n" HEADER = "/* " + "=" * 70 + " %s\n" + " " + "=" * 70 + " */\n\n"
@@ -175,7 +175,7 @@ if __name__ == "__main__":
## TODO: Do import when we walk the directories above? ## TODO: Do import when we walk the directories above?
for filepath in allFiles: for filepath in allFiles:
print "Importing: %s" % filepath print "Importing: %s" % filepath
fullpath = os.path.join(sourceDirectory, filepath) fullpath = os.path.join(sourceDirectory, filepath)
content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF? content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
files[filepath] = SourceFile(filepath, content) # TODO: Chop path? files[filepath] = SourceFile(filepath, content) # TODO: Chop path?