]>
git.ipfire.org Git - ipfire.org.git/blob - src/backend/wiki.py
8 from .decorators
import *
10 # Used to automatically link some things
13 (re
.compile(r
"(?:#(\d+))", re
.I
), r
"https://bugzilla.ipfire.org/show_bug.cgi?id=\1"),
16 (re
.compile(r
"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"), r
"mailto:\1"),
19 (re
.compile(r
"(?:CVE)[\s\-](\d{4}\-\d+)"), r
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=\1"),
22 class Wiki(misc
.Object
):
23 def _get_pages(self
, query
, *args
):
24 res
= self
.db
.query(query
, *args
)
27 yield Page(self
.backend
, row
.id, data
=row
)
29 def get_page(self
, page
, revision
=None):
30 page
= Page
.sanitise_page_name(page
)
34 res
= self
.db
.get("SELECT * FROM wiki WHERE page = %s \
35 AND timestamp = %s", page
, revision
)
37 res
= self
.db
.get("SELECT * FROM wiki WHERE page = %s \
38 ORDER BY timestamp DESC LIMIT 1", page
)
41 return Page(self
.backend
, res
.id, data
=res
)
43 def get_recent_changes(self
):
44 return self
._get
_pages
("SELECT * FROM wiki \
45 WHERE timestamp >= NOW() - INTERVAL '4 weeks' ORDER BY timestamp DESC")
47 def create_page(self
, page
, author
, markdown
):
48 page
= Page
.sanitise_page_name(page
)
50 res
= self
.db
.get("INSERT INTO wiki(page, author_id, markdown) \
51 VALUES(%s, %s, %s) RETURNING id", page
, author
.id, markdown
)
54 return self
.get_page_by_id(res
.id)
56 def delete_page(self
, page
, author
):
57 # Do nothing if the page does not exist
58 if not self
.get_page(page
):
61 # Just creates a blank last version of the page
62 self
.create_page(page
, author
, None)
66 parts
= list(e
for e
in url
.split("/") if e
)
68 num_parts
= len(parts
)
69 for i
in range(num_parts
):
70 yield "/".join(parts
[:i
])
72 def make_breadcrumbs(self
, url
):
73 for part
in self
._split
_url
(url
):
74 title
= self
.get_page_title(part
, os
.path
.basename(part
))
76 yield ("/%s" % part
, title
)
79 class Page(misc
.Object
):
80 def init(self
, id, data
=None):
84 def __lt__(self
, other
):
85 if isinstance(other
, self
.__class
__):
86 if self
.page
== other
.page
:
87 return self
.timestamp
< other
.timestamp
89 return self
.page
< other
.page
92 def sanitise_page_name(page
):
96 # Make sure that the page name does NOT end with a /
97 if page
.endswith("/"):
100 # Make sure the page name starts with a /
101 if not page
.startswith("/"):
104 # Remove any double slashes
105 page
= page
.replace("//", "/")
111 return "/%s" % self
.page
115 return self
.data
.page
119 return self
._title
or self
.page
[1:]
123 if not self
.markdown
:
126 # Find first H1 headline in markdown
127 markdown
= self
.markdown
.splitlines()
129 m
= re
.match(r
"^# (.*)( #)?$", markdown
[0])
133 def _render(self
, text
):
134 logging
.debug("Rendering %s" % self
)
136 return markdown2
.markdown(text
, link_patterns
=link_patterns
,
137 extras
=["footnotes", "link-patterns", "wiki-tables"])
141 return self
.data
.markdown
145 return self
.data
.html
or self
._render
(self
.markdown
)
149 return self
.data
.timestamp
151 def was_deleted(self
):
152 return self
.markdown
is None
155 def breadcrumbs(self
):
156 return self
.backend
.wiki
.make_breadcrumbs(self
.page
)
158 def get_latest_revision(self
):
159 return self
.backend
.wiki
.get_page(self
.page
)