forked from Python-Markdown/markdown
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mdx_rss.py
120 lines (80 loc) · 3.65 KB
/
mdx_rss.py
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)