import markdown DEFAULT_URL = "http://www.freewisdom.org/projects/python-markdown/" DEFAULT_CREATOR = "Yuri Takhteyev" DEFAULT_TITLE = "Markdown in Python" GENERATOR = "http://www.freewisdom.org/projects/python-markdown/markdown2rss" month_map = { "Jan" : "01", "Feb" : "02", "March" : "03", "April" : "04", "May" : "05", "June" : "06", "July" : "07", "August" : "08", "September" : "09", "October" : "10", "November" : "11", "December" : "12" } def get_time(heading) : heading = heading.split("-")[0] heading = heading.strip().replace(",", " ").replace(".", " ") month, date, year = heading.split() month = month_map[month] return rdftime(" ".join((month, date, year, "12:00:00 AM"))) def rdftime(time) : time = time.replace(":", " ") time = time.replace("/", " ") time = time.split() return "%s-%s-%sT%s:%s:%s-08:00" % (time[0], time[1], time[2], time[3], time[4], time[5]) def get_date(text) : return "date" class RssExtension (markdown.Extension): def extendMarkdown(self, md, md_globals) : self.config = { 'URL' : [DEFAULT_URL, "Main URL"], 'CREATOR' : [DEFAULT_CREATOR, "Feed creator's name"], 'TITLE' : [DEFAULT_TITLE, "Feed title"] } md.xml_mode = True # Insert a post-processor that would actually add the title tag postprocessor = RssPostProcessor(self) postprocessor.ext = self md.postprocessors.append(postprocessor) md.stripTopLevelTags = 0 md.docType = '\n' class RssPostProcessor (markdown.Postprocessor): def __init__(self, md) : pass def run (self, doc) : oldDocElement = doc.documentElement rss = doc.createElement("rss") rss.setAttribute('version', '2.0') doc.appendChild(rss) channel = doc.createElement("channel") rss.appendChild(channel) for tag, text in (("title", self.ext.getConfig("TITLE")), ("link", self.ext.getConfig("URL")), ("description", None)): channel.appendChild(doc.createElement(tag, textNode = text)) item = None for child in oldDocElement.childNodes : if child.type == "element" : if child.nodeName in ["h1", "h2", "h3", "h4", "h5"] : heading = child.childNodes[0].value.strip() item = doc.createElement("item") channel.appendChild(item) item.appendChild(doc.createElement("link", self.ext.getConfig("URL"))) item.appendChild(doc.createElement("title", heading)) guid = ''.join([x for x in heading if x.isalnum()]) guidElem = doc.createElement("guid", guid) guidElem.setAttribute("isPermaLink", "false") item.appendChild(guidElem) elif child.nodeName in ["p"] : description = doc.createElement("description") content = "\n".join([node.toxml() for node in child.childNodes]) cdata = doc.createCDATA(content) description.appendChild(cdata) if item : item.appendChild(description) def makeExtension(configs) : return RssExtension(configs)