1.1 --- a/moinformat/links/common.py Thu Apr 11 23:13:56 2019 +0200
1.2 +++ b/moinformat/links/common.py Fri Apr 12 00:08:39 2019 +0200
1.3 @@ -19,6 +19,27 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 +class Link:
1.8 +
1.9 + "A link abstraction."
1.10 +
1.11 + def __init__(self, target, label, type):
1.12 +
1.13 + "Initialise the link with the given 'target', 'label' and 'type'."
1.14 +
1.15 + self.target = target
1.16 + self.label = label
1.17 + self.type = type
1.18 +
1.19 + def get_target(self):
1.20 + return self.target
1.21 +
1.22 + def get_label(self):
1.23 + return self.label or self.target
1.24 +
1.25 + def get_type(self):
1.26 + return self.type
1.27 +
1.28 class Linker:
1.29
1.30 "Translate Moin links into other forms."
1.31 @@ -41,6 +62,7 @@
1.32
1.33 self.mapping = metadata.get("mapping", {})
1.34 self.root_pagename = metadata.get("root_pagename", "FrontPage")
1.35 + self.attachments_dir = metadata.get("attachments", "attachments")
1.36
1.37 def resolve(path, pagename, root_pagename):
1.38
2.1 --- a/moinformat/links/html.py Thu Apr 11 23:13:56 2019 +0200
2.2 +++ b/moinformat/links/html.py Fri Apr 12 00:08:39 2019 +0200
2.3 @@ -19,7 +19,7 @@
2.4 this program. If not, see <http://www.gnu.org/licenses/>.
2.5 """
2.6
2.7 -from moinformat.links.common import Linker, resolve
2.8 +from moinformat.links.common import Link, Linker, resolve
2.9 from urllib import quote, quote_plus
2.10 from urlparse import urlparse
2.11
2.12 @@ -70,17 +70,17 @@
2.13 # Fragments. Remove the leading hash for the label.
2.14
2.15 if target.startswith("#"):
2.16 - return self.quote(target), target.lstrip("#")
2.17 + return Link(self.quote(target), target.lstrip("#"), "fragment")
2.18
2.19 # Sub-pages. Remove the leading slash for the label.
2.20
2.21 if target.startswith("/"):
2.22 - return self.translate_pagename(target), target.lstrip("/")
2.23 + return Link(self.translate_pagename(target), target.lstrip("/"), "page")
2.24
2.25 # Sibling (of ancestor) pages.
2.26
2.27 if target.startswith("../"):
2.28 - return self.translate_pagename(target), None
2.29 + return Link(self.translate_pagename(target), None, "page")
2.30
2.31 # Attachment or interwiki link.
2.32
2.33 @@ -92,11 +92,11 @@
2.34
2.35 rewritten = self.is_url(target)
2.36 if rewritten:
2.37 - return rewritten, None
2.38 + return Link(rewritten, None, "url")
2.39
2.40 # Top-level pages.
2.41
2.42 - return self.translate_pagename(target), None
2.43 + return Link(self.translate_pagename(target), None, "page")
2.44
2.45 def translate_pagename(self, target):
2.46
2.47 @@ -130,8 +130,8 @@
2.48 def translate_qualified_link(self, target):
2.49
2.50 """
2.51 - Translate a possible qualified link 'target', returning a tuple
2.52 - containing a rewritten target and a suitable default label.
2.53 + Translate a possible qualified link 'target', returning a link object
2.54 + retaining a rewritten target and a suitable default label.
2.55
2.56 Return None if the link is not suitable.
2.57 """
2.58 @@ -145,13 +145,13 @@
2.59 # Attachment links.
2.60
2.61 if prefix == "attachment":
2.62 - return self.translate_attachment(target), target
2.63 + return Link(self.translate_attachment(target), target, "attachment")
2.64
2.65 # Interwiki links.
2.66
2.67 url = self.mapping.get(prefix)
2.68 if url:
2.69 - return self.translate_interwiki(url, target), target
2.70 + return Link(self.translate_interwiki(url, target), target, "interwiki")
2.71
2.72 return None
2.73
2.74 @@ -161,7 +161,7 @@
2.75
2.76 "Return a translation of the given attachment 'target'."
2.77
2.78 - return self.quote("./attachments/%s" % target)
2.79 + return self.quote("./%s/%s" % (self.attachments_dir, target))
2.80
2.81 def translate_interwiki(self, url, target):
2.82
3.1 --- a/moinformat/serialisers/html/graphviz.py Thu Apr 11 23:13:56 2019 +0200
3.2 +++ b/moinformat/serialisers/html/graphviz.py Fri Apr 12 00:08:39 2019 +0200
3.3 @@ -121,7 +121,7 @@
3.4 # Make sure that page attachments can be stored.
3.5
3.6 self.output.ensure_attachments(pagename)
3.7 - target, _label = self.linker.translate("attachment:%s" % attachment)
3.8 + link = self.linker.translate("attachment:%s" % attachment)
3.9
3.10 # No filename is defined for inline output.
3.11
3.12 @@ -156,12 +156,12 @@
3.13 self.raw(graphviz.get_output())
3.14 attributes["usemap"] = "#%s" % im_attributes["id"]
3.15
3.16 - self.image(target, attributes)
3.17 + self.image(link.get_target(), attributes)
3.18
3.19 # For other output, create a file and embed the object.
3.20
3.21 elif not inline:
3.22 - self.object(target, attributes)
3.23 + self.object(link.get_target(), attributes)
3.24
3.25 # Or for inline output, emit it in the document itself.
3.26
4.1 --- a/moinformat/serialisers/html/moin.py Thu Apr 11 23:13:56 2019 +0200
4.2 +++ b/moinformat/serialisers/html/moin.py Fri Apr 12 00:08:39 2019 +0200
4.3 @@ -252,11 +252,9 @@
4.4 self.out("<br />")
4.5
4.6 def _link(self, target, nodes, tag, attr):
4.7 - label = None
4.8 - if self.linker:
4.9 - href, label = self.linker.translate(target)
4.10 + link = self.linker and self.linker.translate(target) or None
4.11
4.12 - self.out('<%s %s="%s"' % (tag, attr, escape_attr(href)))
4.13 + self.out('<%s %s="%s"' % (tag, attr, escape_attr(link.get_target())))
4.14
4.15 if nodes:
4.16 for node in nodes[1:]:
4.17 @@ -268,7 +266,7 @@
4.18 if nodes:
4.19 nodes[0].to_string(self)
4.20 else:
4.21 - self.out(escape_text(label or target))
4.22 + self.out(escape_text(link.get_label()))
4.23
4.24 self.out("</%s>" % tag)
4.25