File: mdx_rss.py

package info (click to toggle)
python-markdown 1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 148 kB
  • ctags: 271
  • sloc: python: 1,353; makefile: 9
file content (120 lines) | stat: -rw-r--r-- 3,740 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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 = '<?xml version="1.0" encoding="utf-8"?>\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))

        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)