Advertisement
ijontichy

well that was easy

May 9th, 2012
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.81 KB | None | 0 0
  1. indentChar = " "
  2.  
  3.  
  4. def charCount(string, char):
  5.     if len(char) != 1:
  6.         raise ValueError("\"{}\" isn't one character long".format(char))
  7.  
  8.     ret = 0
  9.  
  10.     for c in string:
  11.         if c == char:
  12.             ret += 1
  13.  
  14.     return ret
  15.  
  16. class DECORATEIndenter(object):
  17.     """It indents DECORATE and ACS! Sweet jesus."""
  18.  
  19.     def __init__(self, indentWidth=4, colonUnindent=2):
  20.         self.indentWidth = indentWidth
  21.         self.colonUnindent = colonUnindent
  22.  
  23.     def __repr__(self):
  24.         return "{}({})".format(self.__class__.__name__,
  25.                                ", ".join([self.indentWidth, self.colonUnindent])
  26.                               )
  27.    
  28.     def processFile(self, fileName):
  29.         return self.processText(open(fileName).read())
  30.  
  31.     def processText(self, text):
  32.         indentLevel = 0
  33.         nextIndentLevel = 0
  34.        
  35.         ret = []
  36.        
  37.         for line in text.splitlines():
  38.             indentLevel = nextIndentLevel
  39.  
  40.             newLine, indentLevel, nextIndentLevel = self.processLine(line, indentLevel)
  41.            
  42.             ret.append(newLine)
  43.  
  44.         return "\n".join(ret)
  45.  
  46.     def processLine(self, line, indentLevel):
  47.         line = line.lstrip()
  48.  
  49.         openBraceCount  = charCount(line, "{")
  50.         closeBraceCount = charCount(line, "}")
  51.  
  52.         indentDiff = (openBraceCount - closeBraceCount)
  53.  
  54.         if indentDiff < 0:
  55.             indentLevel = max(indentLevel + indentDiff, 0)
  56.             nextIndentLevel = indentLevel
  57.         else:
  58.             nextIndentLevel = indentLevel + indentDiff
  59.  
  60.         retLine = (indentChar * (indentLevel * self.indentWidth)) + line
  61.  
  62.         if line.rpartition("//")[2].endswith(":"):
  63.             whitespaceCut = min(indentLevel * self.indentWidth, self.colonUnindent)
  64.             retLine = retLine[whitespaceCut:]
  65.  
  66.         return retLine, indentLevel, nextIndentLevel
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement