def parse(self, message): """Given a string of text in the original CIA commit format, return a <colorText> element representing it as a DOM tree. """ # Initialize our model of the current text format in the original message self.parsedState = ColorState() self.document = XML.createRootNode() # Initialize our stack of (element, ColorState) tuples representing # the state of the XML document being generated. This starts out with # our root element in it. self.elementStack = [ (XML.addElement(self.document, "colorText"), ColorState()) ] # Break up the message into lines, each with its whitespace stripped. # Run our lexical scanner on each line separately, turning it into # a stream of events. Insert <br/> tags between lines. lines = [] for line in message.split("\n"): # Ignore extra whitespace line = line.strip() # Ignore blank lines if line: lines.append(line) for i in xrange(len(lines)): if i != 0: XML.addElement(self.elementStack[-1][0], 'br') self.lex(lines[i]) self.closeTags() return self.document
def command_Announce(self, project): """Old-style announcements: Announce <project> in the subject line. The body of the email contained the message's text, marked up with {color} tags but with no metadata. """ xml = XML.createRootNode() # Convert the given project name to a <project> tag inside <source>, # after filtering it a bit... in the old CIA project names and IRC channel # names weren't particularly distinct, so preceeding "#" characters on # projects were ignored. We preserve this behaviour. if project[0] == "#": project = project[1:] XML.buryValue(xml, project, "message", "source", "project") # Since old-style commits didn't have any metadata, the best we can do # is to represent the log in a <colorText> element colorText = ColorTextParser().parse(self.message.get_payload()).documentElement XML.bury(xml, "message", "body").appendChild(xml.importNode(colorText, True)) return xml