Bug tg-1668 #closed - Convert relative links to absolute links
parent
0798b5856b
commit
8b63dc8fa3
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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\""
|
||||||
|
|
Loading…
Reference in New Issue