diff --git a/doc/scripts/wikiparser.py b/doc/scripts/wikiparser.py index e34430586..82e14e452 100644 --- a/doc/scripts/wikiparser.py +++ b/doc/scripts/wikiparser.py @@ -26,6 +26,8 @@ WIKI_ICONS = { '{*}': 'star_on', } +BASE_URL = 'https://wiki.debian.org/' + class Element: """Represents an element of a MoinMoin wiki page.""" @@ -189,19 +191,7 @@ class Link(Element): return rep def to_docbook(self, context=None): - target = escape(self.target) - if target.startswith('attachment:'): - target = target.lstrip('attachment:') - page_title = context.get('title', None) if context else None - if page_title: - target = f'https://wiki.debian.org/{page_title}' \ - + '?action=AttachFile&do=get&' + \ - urllib.parse.urlencode({'target': target}) - - if target.startswith('FreedomBox/') or \ - target.startswith('InstallingDebianOn/'): - target = 'https://wiki.debian.org/' + target + '#' - + target = escape(resolve_url(self.target, context)) link_text = '' if self.text: for element in self.text: @@ -226,7 +216,7 @@ class EmbeddedAttachment(EmbeddedLink): def to_docbook(self, context=None): if self.page_title: - target = 'https://wiki.debian.org/' + self.page_title \ + target = BASE_URL + self.page_title \ + '?action=AttachFile&do=get&target=' \ + escape(self.target) else: @@ -521,6 +511,43 @@ class Anchor(Element): return f'' +def resolve_url(url, context): + """Expand a URL into a full path.""" + if re.match(r'https?://', url) or url.startswith('mailto:') or \ + url.startswith('irc://'): + return url + + if url.startswith('attachment:'): + target = url.lstrip('attachment:') + page_title = context.get('title') if context else None + if page_title: + target = f'{BASE_URL}{page_title}?action=AttachFile&do=get&' + \ + urllib.parse.urlencode({'target': target}) + return target + + if url.startswith('DebianBug:'): + target = url.lstrip('DebianBug:') + return f'https://bugs.debian.org/{target}#' + + if url.startswith('DebianPkg:'): + target = url.lstrip('DebianPkg:') + return f'https://packages.debian.org/{target}#' + + if url.startswith('AliothList:'): + target = url.lstrip('AliothList:') + return f'https://lists.alioth.debian.org/mailman/listinfo/{target}#' + + if url.startswith('../'): + page_title = context.get('title', '') if context else '' + while url.startswith('../'): + url = url[3:] + page_title = page_title.rpartition('/')[0] + + return f'{BASE_URL}{page_title}/{url}#' + + return f'{BASE_URL}{url}#' + + def split_formatted(text, delimiter, end_delimiter=None): """ Split formatted text marked by delimiter, if it is found at beginning. @@ -1522,6 +1549,26 @@ PlainText('normal text followed by'), BoldText('bold text')])]) '\ Features introduction' + >>> generate_inner_docbook([Link('FreedomBox', [PlainText('FreedomBox')])]) + 'FreedomBox' + + >>> generate_inner_docbook([Link('../../Contribute', \ +[PlainText('Contribute')])], context={'title': 'FreedomBox/Manual/Hardware'}) + '\ +Contribute' + + >>> generate_inner_docbook([Link('DebianBug:1234', [PlainText('Bug')])]) + 'Bug' + + >>> generate_inner_docbook([Link('DebianPkg:plinth', \ +[PlainText('Plinth')])]) + 'Plinth' + + >>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \ +[PlainText('Discuss')])]) + 'Discuss' + >>> generate_inner_docbook([Link("attachment:Let's Encrypt.webm", \ [PlainText("Let's Encrypt")], 'do=get')], context={'title': \ 'FreedomBox/Manual/LetsEncrypt'})