Bug tg-1668 #closed - Convert relative links to absolute links

remotes/origin/enhancement/email-actions
David Barragán Merino 2014-11-29 19:02:53 +01:00
parent 0798b5856b
commit 8b63dc8fa3
3 changed files with 46 additions and 13 deletions

View File

@ -17,10 +17,13 @@
from markdown import Extension
from markdown.inlinepatterns import Pattern
from markdown.treeprocessors import Treeprocessor
from markdown.util import etree
from taiga.front import resolve
import re
class WikiLinkExtension(Extension):
def __init__(self, project, *args, **kwargs):
@ -29,14 +32,18 @@ class WikiLinkExtension(Extension):
def extendMarkdown(self, md, md_globals):
WIKILINK_RE = r"\[\[([\w0-9_ -]+)(\|[\w0-9_ -]+)?\]\]"
wikilinkPattern = WikiLinksPattern(WIKILINK_RE, self.project)
wikilinkPattern.md = md
md.inlinePatterns.add("wikilink", wikilinkPattern, "<not_strong")
md.inlinePatterns.add("wikilinks",
WikiLinksPattern(md, WIKILINK_RE, self.project),
"<not_strong")
md.treeprocessors.add("relative_to_absolute_links",
RelativeLinksTreeprocessor(md, self.project),
"<prettify")
class WikiLinksPattern(Pattern):
def __init__(self, pattern, project):
def __init__(self, md, pattern, project):
self.project = project
self.md = md
super().__init__(pattern)
def handleMatch(self, m):
@ -54,3 +61,27 @@ class WikiLinksPattern(Pattern):
a.set("title", title)
a.set("class", "reference wiki")
return a
SLUG_RE = re.compile(r"^[-a-zA-Z0-9_]+$")
class RelativeLinksTreeprocessor(Treeprocessor):
def __init__(self, md, project):
self.project = project
super().__init__(md)
def run(self, root):
links = root.getiterator("a")
for a in links:
href = a.get("href", "")
if SLUG_RE.search(href):
# [wiki](wiki_page) -> <a href="FRONT_HOST/.../wiki/wiki_page" ...
url = resolve("wiki", self.project.slug, href)
a.set("href", url)
a.set("class", "reference wiki")
elif href and href[0] == "/":
# [some link](/some/link) -> <a href="FRONT_HOST/some/link" ...
url = "{}{}".format(resolve("home"), href[1:])
a.set("href", url)

View File

@ -33,7 +33,7 @@ dummy_project.slug = "test"
def test_proccessor_valid_user_mention():
factories.UserFactory(username="user1", full_name="test name")
result = render(dummy_project, "**@user1**")
expected_result = "<p><strong><a class=\"mention\" href=\"/profile/user1\" title=\"test name\">@user1</a></strong></p>"
expected_result = "<p><strong><a class=\"mention\" href=\"http://localhost:9001/profile/user1\" title=\"test name\">@user1</a></strong></p>"
assert result == expected_result

View File

@ -97,14 +97,6 @@ def test_render_wiki_strike():
assert render(dummy_project, "~~test~~") == "<p><del>test</del></p>"
def test_render_absolute_link():
assert render(dummy_project, "[test](/test)") == "<p><a href=\"/test\">test</a></p>"
def test_render_relative_link():
assert render(dummy_project, "[test](test)") == "<p><a href=\"test\">test</a></p>"
def test_render_wikilink():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>"
assert render(dummy_project, "[[test]]") == expected_result
@ -115,6 +107,16 @@ def test_render_wikilink_with_custom_title():
assert render(dummy_project, "[[test|custom]]") == expected_result
def test_render_wikilink_slug_to_wikipages():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/wiki_page\" title=\"wiki page\">wiki</a></p>"
assert render(dummy_project, "[wiki](wiki_page \"wiki page\")") == expected_result
def test_render_wikilink_relative_to_absolute():
expected_result = "<p><a href=\"http://localhost:9001/project/test/\">test project</a></p>"
assert render(dummy_project, "[test project](/project/test/)") == expected_result
def test_render_reference_links():
expected_result = "<p>An <a href=\"http://example.com/\" title=\"Title\">example</a> of reference link</p>"
source = "An [example][id] of reference link\n [id]: http://example.com/ \"Title\""