Merge pull request #178 from taigaio/bug/1668/fix-wiki-links-in-markdown-2

Bug tg-1668 #closed - Convert relative links to absolute links
remotes/origin/enhancement/email-actions
Jesús Espino 2014-12-01 10:32:23 +01:00
commit 929ab47249
3 changed files with 46 additions and 13 deletions

View File

@ -17,10 +17,13 @@
from markdown import Extension from markdown import Extension
from markdown.inlinepatterns import Pattern from markdown.inlinepatterns import Pattern
from markdown.treeprocessors import Treeprocessor
from markdown.util import etree from markdown.util import etree
from taiga.front import resolve from taiga.front import resolve
import re
class WikiLinkExtension(Extension): class WikiLinkExtension(Extension):
def __init__(self, project, *args, **kwargs): def __init__(self, project, *args, **kwargs):
@ -29,14 +32,18 @@ class WikiLinkExtension(Extension):
def extendMarkdown(self, md, md_globals): def extendMarkdown(self, md, md_globals):
WIKILINK_RE = r"\[\[([\w0-9_ -]+)(\|[\w0-9_ -]+)?\]\]" WIKILINK_RE = r"\[\[([\w0-9_ -]+)(\|[\w0-9_ -]+)?\]\]"
wikilinkPattern = WikiLinksPattern(WIKILINK_RE, self.project) md.inlinePatterns.add("wikilinks",
wikilinkPattern.md = md WikiLinksPattern(md, WIKILINK_RE, self.project),
md.inlinePatterns.add("wikilink", wikilinkPattern, "<not_strong") "<not_strong")
md.treeprocessors.add("relative_to_absolute_links",
RelativeLinksTreeprocessor(md, self.project),
"<prettify")
class WikiLinksPattern(Pattern): class WikiLinksPattern(Pattern):
def __init__(self, pattern, project): def __init__(self, md, pattern, project):
self.project = project self.project = project
self.md = md
super().__init__(pattern) super().__init__(pattern)
def handleMatch(self, m): def handleMatch(self, m):
@ -54,3 +61,27 @@ class WikiLinksPattern(Pattern):
a.set("title", title) a.set("title", title)
a.set("class", "reference wiki") a.set("class", "reference wiki")
return a 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(): def test_proccessor_valid_user_mention():
factories.UserFactory(username="user1", full_name="test name") factories.UserFactory(username="user1", full_name="test name")
result = render(dummy_project, "**@user1**") 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 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>" 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(): def test_render_wikilink():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>" 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 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 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(): def test_render_reference_links():
expected_result = "<p>An <a href=\"http://example.com/\" title=\"Title\">example</a> of reference link</p>" 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\"" source = "An [example][id] of reference link\n [id]: http://example.com/ \"Title\""