summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrédéric Mangano-Tarumi <fmang@mg0.fr>2020-01-30 03:35:12 +0100
committerLukas Fleischer <lfleischer@archlinux.org>2020-02-02 12:12:43 +0100
commitc277a3de8f3255be31a2c3f08cd49fe2f6c36aa3 (patch)
treecc3efc8cf88bc2d8edf1a130e0d6207f64c79880
parent8ff21fd39c537ef930e2bd32f76cd28d40fa3b67 (diff)
downloadaur-c277a3de8f3255be31a2c3f08cd49fe2f6c36aa3.tar.gz
aur-c277a3de8f3255be31a2c3f08cd49fe2f6c36aa3.tar.xz
rendercomment: respectful linkification of Git commits
Turn the git-commits markdown processor into an inline processor, which is smart enough not to convert Git hashes contained in code blocks or links. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rwxr-xr-xaurweb/scripts/rendercomment.py36
1 files changed, 20 insertions, 16 deletions
diff --git a/aurweb/scripts/rendercomment.py b/aurweb/scripts/rendercomment.py
index 5e18fd59..5c597481 100755
--- a/aurweb/scripts/rendercomment.py
+++ b/aurweb/scripts/rendercomment.py
@@ -40,19 +40,26 @@ class FlysprayLinksExtension(markdown.extensions.Extension):
md.preprocessors.add('flyspray-links', preprocessor, '_end')
-class GitCommitsPreprocessor(markdown.preprocessors.Preprocessor):
- _oidre = re.compile(r'(\b)([0-9a-f]{7,40})(\b)')
+class GitCommitsInlineProcessor(markdown.inlinepatterns.InlineProcessor):
+ """
+ Turn Git hashes like f7f5152be5ab into links to AUR's cgit.
+
+ Only commit references that do exist are linkified. Hashes are shortened to
+ shorter non-ambiguous prefixes. Only hashes with at least 7 digits are
+ considered.
+ """
+
_repo = pygit2.Repository(repo_path)
- _head = None
def __init__(self, md, head):
self._head = head
- super(markdown.preprocessors.Preprocessor, self).__init__(md)
+ super().__init__(r'\b([0-9a-f]{7,40})\b', md)
- def handleMatch(self, m):
- oid = m.group(2)
+ def handleMatch(self, m, data):
+ oid = m.group(1)
if oid not in self._repo:
- return oid
+ # Unkwown OID; preserve the orginal text.
+ return None, None, None
prefixlen = 12
while prefixlen < 40:
@@ -60,13 +67,10 @@ class GitCommitsPreprocessor(markdown.preprocessors.Preprocessor):
break
prefixlen += 1
- html = '[`' + oid[:prefixlen] + '`]'
- html += '(' + commit_uri % (self._head, oid[:prefixlen]) + ')'
-
- return html
-
- def run(self, lines):
- return [self._oidre.sub(self.handleMatch, line) for line in lines]
+ el = markdown.util.etree.Element('a')
+ el.set('href', commit_uri % (self._head, oid[:prefixlen]))
+ el.text = markdown.util.AtomicString(oid[:prefixlen])
+ return el, m.start(0), m.end(0)
class GitCommitsExtension(markdown.extensions.Extension):
@@ -77,8 +81,8 @@ class GitCommitsExtension(markdown.extensions.Extension):
super(markdown.extensions.Extension, self).__init__()
def extendMarkdown(self, md, md_globals):
- preprocessor = GitCommitsPreprocessor(md, self._head)
- md.preprocessors.add('git-commits', preprocessor, '_end')
+ processor = GitCommitsInlineProcessor(md, self._head)
+ md.inlinePatterns.add('git-commits', processor, '_end')
class HeadingTreeprocessor(markdown.treeprocessors.Treeprocessor):