1.1 --- a/moinformat/links/html.py Mon Aug 13 15:53:53 2018 +0200
1.2 +++ b/moinformat/links/html.py Mon Aug 13 17:10:07 2018 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from moinformat.links.common import Linker
1.8 +from moinformat.links.common import Linker, resolve
1.9 from urllib import quote, quote_plus
1.10 from urlparse import urlparse
1.11
1.12 @@ -33,7 +33,14 @@
1.13
1.14 "Return a relative link to the top level."
1.15
1.16 - levels = self.pagename.count("/")
1.17 + # The root page is at the top level already.
1.18 +
1.19 + if self.pagename == self.root_pagename:
1.20 + return ""
1.21 +
1.22 + # Siblings of the root page are actually one level below.
1.23 +
1.24 + levels = self.pagename.count("/") + 1
1.25 return "/".join([".."] * levels)
1.26
1.27 def is_url(self, target):
1.28 @@ -65,13 +72,13 @@
1.29
1.30 # Sub-pages. Remove the leading slash for the label.
1.31
1.32 - elif target.startswith("/"):
1.33 - return self.translate_subpage(target), target.lstrip("/")
1.34 + if target.startswith("/"):
1.35 + return self.translate_pagename(target), target.lstrip("/")
1.36
1.37 # Sibling (of ancestor) pages.
1.38
1.39 if target.startswith("../"):
1.40 - return self.translate_relative(target), None
1.41 + return self.translate_pagename(target), None
1.42
1.43 # Attachment or interwiki link.
1.44
1.45 @@ -87,8 +94,30 @@
1.46
1.47 # Top-level pages.
1.48
1.49 + return self.translate_pagename(target), None
1.50 +
1.51 + def translate_pagename(self, target):
1.52 +
1.53 + "Translate the pagename in 'target'."
1.54 +
1.55 + # Obtain the target pagename and the fragment.
1.56 + # Split the pagename into path components.
1.57 +
1.58 + t = target.split("#", 1)
1.59 + p = t[0].rstrip("/").split("/")
1.60 +
1.61 + # Determine the actual pagename referenced.
1.62 + # Replace the root pagename if it appears.
1.63 +
1.64 + resolved = resolve(t[0], self.pagename, self.root_pagename)
1.65 +
1.66 + # Rewrite the target using a relative link to the top level and then the
1.67 + # resolved pagename.
1.68 +
1.69 top_level = self.get_top_level()
1.70 - return self.quote("%s%s" % (top_level and "%s/" % top_level or "", target)), None
1.71 + t[0] = "%s%s" % (top_level and "%s/" % top_level or "", resolved)
1.72 +
1.73 + return self.quote("#".join(t))
1.74
1.75 def translate_qualified_link(self, target):
1.76
1.77 @@ -132,18 +161,6 @@
1.78
1.79 return "%s%s" % (self.normalise(url), self.quote(target))
1.80
1.81 - def translate_relative(self, target):
1.82 -
1.83 - "Return a translation of the given relative 'target'."
1.84 -
1.85 - return self.quote(target)
1.86 -
1.87 - def translate_subpage(self, target):
1.88 -
1.89 - "Return a translation of the given subpage 'target'."
1.90 -
1.91 - return self.quote(".%s" % target)
1.92 -
1.93 # Path encoding.
1.94
1.95 def quote(self, s):