From 3856eeac5b3bcdaf0dcbe622df875d71ed8c5c96 Mon Sep 17 00:00:00 2001
From: Antoine Lambert <antoine.lambert@inria.fr>
Date: Fri, 2 Feb 2018 15:20:11 +0100
Subject: [PATCH] browse: Improve link generation functions

---
 swh/web/browse/utils.py            | 57 +++++++++++++++++++++---------
 swh/web/browse/views/revision.py   | 20 ++++++-----
 swh/web/common/swh_templatetags.py |  2 +-
 3 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/swh/web/browse/utils.py b/swh/web/browse/utils.py
index 8bddf0a45..3dcbd7138 100644
--- a/swh/web/browse/utils.py
+++ b/swh/web/browse/utils.py
@@ -408,7 +408,7 @@ def get_origin_visit_occurrences(origin_info, visit_ts=None, visit_id=None):
     return branches, releases
 
 
-def gen_link(url, link_text):
+def gen_link(url, link_text, link_attrs={}):
     """
     Utility function for generating an HTML link to insert
     in Django templates.
@@ -416,16 +416,21 @@ def gen_link(url, link_text):
     Args:
         url (str): an url
         link_text (str): the text for the produced link
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form '<a href="url">link_text</a>'
 
     """
-    link = '<a href="%s">%s</a>' % (url, link_text)
+    attrs = ' '
+    for k, v in link_attrs.items():
+        attrs += '%s="%s" ' % (k, v)
+    link = '<a%shref="%s">%s</a>' % (attrs, url, link_text)
     return mark_safe(link)
 
 
-def gen_person_link(person_id, person_name):
+def gen_person_link(person_id, person_name, link_attrs={}):
     """
     Utility function for generating a link to a SWH person HTML view
     to insert in Django templates.
@@ -433,24 +438,31 @@ def gen_person_link(person_id, person_name):
     Args:
         person_id (int): a SWH person id
         person_name (str): the associated person name
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form '<a href="person_view_url">person_name</a>'
 
     """
     person_url = reverse('browse-person', kwargs={'person_id': person_id})
-    return gen_link(person_url, person_name)
+    return gen_link(person_url, person_name, link_attrs)
 
 
-def gen_revision_link(revision_id, shorten_id=False, origin_context=None):
+def gen_revision_link(revision_id, shorten_id=False, origin_context=None,
+                      link_attrs={}):
     """
     Utility function for generating a link to a SWH revision HTML view
     to insert in Django templates.
 
     Args:
-        revision_id (int): a SWH revision id
+        revision_id (str): a SWH revision id
         shorten_id (boolean): wheter to shorten the revision id to 7
             characters for the link text
+        origin_context (dict): if provided, generate origin-dependent browsing
+            link (see :func:`swh.web.browse.utils.get_origin_context`)
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form '<a href="revision_view_url">revision_id</a>'
@@ -472,12 +484,12 @@ def gen_revision_link(revision_id, shorten_id=False, origin_context=None):
                            kwargs={'sha1_git': revision_id},
                            query_params=query_params)
     if shorten_id:
-        return gen_link(revision_url, revision_id[:7])
+        return gen_link(revision_url, revision_id[:7], link_attrs)
     else:
-        return gen_link(revision_url, revision_id)
+        return gen_link(revision_url, revision_id, link_attrs)
 
 
-def gen_origin_link(origin_info):
+def gen_origin_link(origin_info, link_attrs={}):
     """
     Utility function for generating a link to a SWH origin HTML view
     to insert in Django templates.
@@ -485,6 +497,8 @@ def gen_origin_link(origin_info):
     Args:
         origin_info (dict): a dicted filled with origin information
             (id, type, url)
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form '<a href="origin_view_url">Origin: origin_url</a>'
@@ -494,10 +508,10 @@ def gen_origin_link(origin_info):
                                 kwargs={'origin_type': origin_info['type'],
                                         'origin_url': origin_info['url']})
     return gen_link(origin_browse_url,
-                    'Origin: ' + origin_info['url'])
+                    'Origin: ' + origin_info['url'], link_attrs)
 
 
-def gen_directory_link(sha1_git, link_text=None):
+def gen_directory_link(sha1_git, link_text=None, link_attrs={}):
     """
     Utility function for generating a link to a SWH directory HTML view
     to insert in Django templates.
@@ -506,6 +520,8 @@ def gen_directory_link(sha1_git, link_text=None):
         sha1_git (str): directory identifier
         link_text (str): optional text for the generated link
             (the generated url will be used by default)
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form '<a href="directory_view_url">link_text</a>'
@@ -515,11 +531,11 @@ def gen_directory_link(sha1_git, link_text=None):
                             kwargs={'sha1_git': sha1_git})
     if not link_text:
         link_text = directory_url
-    return gen_link(directory_url, link_text)
+    return gen_link(directory_url, link_text, link_attrs)
 
 
 def gen_origin_directory_link(origin_context, revision_id=None,
-                              link_text=None):
+                              link_text=None, link_attrs={}):
     """
     Utility function for generating a link to a SWH directory HTML view
     in the context of an origin to insert in Django templates.
@@ -528,6 +544,9 @@ def gen_origin_directory_link(origin_context, revision_id=None,
         origin_info (dict): the origin information (type and url)
         revision_id (str): optional revision identifier in order
             to use the associated directory
+        link_text (str): optional text to use for the generated link
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form
@@ -548,18 +567,22 @@ def gen_origin_directory_link(origin_context, revision_id=None,
                             query_params=query_params)
     if not link_text:
         link_text = directory_url
-    return gen_link(directory_url, link_text)
+    return gen_link(directory_url, link_text, link_attrs)
 
 
-def gen_revision_log_link(revision_id, origin_context=None, link_text=None):
+def gen_revision_log_link(revision_id, origin_context=None, link_text=None,
+                          link_attrs={}):
     """
     Utility function for generating a link to a SWH revision log HTML view
     (possibly in the context of an origin) to insert in Django templates.
 
     Args:
         revision_id (str): revision identifier the history heads to
-        origin_info (dict): optional origin information
+        origin_context (dict): if provided, generate origin-dependent browsing
+            link (see :func:`swh.web.browse.utils.get_origin_context`)
         link_text (str): optional text to use for the generated link
+        link_attrs (dict): optional attributes (e.g. class)
+            to add to the link
 
     Returns:
         An HTML link in the form
@@ -584,7 +607,7 @@ def gen_revision_log_link(revision_id, origin_context=None, link_text=None):
                                    kwargs={'sha1_git': revision_id})
     if not link_text:
         link_text = revision_log_url
-    return gen_link(revision_log_url, link_text)
+    return gen_link(revision_log_url, link_text, link_attrs)
 
 
 def _format_log_entries(revision_log, per_page, origin_context=None):
diff --git a/swh/web/browse/views/revision.py b/swh/web/browse/views/revision.py
index 80a580ab8..117b5fe36 100644
--- a/swh/web/browse/views/revision.py
+++ b/swh/web/browse/views/revision.py
@@ -102,19 +102,21 @@ def revision_browse(request, sha1_git):
     browse_link_text = '<i class="fa fa-folder-open fa-fw" '\
                        'aria-hidden="true"></i>Browse files'
 
+    browse_files_link_attrs = {
+        'class': 'btn btn-md btn-swh pull-right',
+        'role': 'button'
+    }
+
     if origin_context:
-        browse_files_url = \
+        browse_files_button = \
             gen_origin_directory_link(origin_context, sha1_git,
-                                      link_text=browse_link_text)
+                                      link_text=browse_link_text,
+                                      link_attrs=browse_files_link_attrs)
     else:
-        browse_files_url = \
+        browse_files_button = \
             gen_directory_link(revision['directory'],
-                               link_text=browse_link_text)
-
-    pos = browse_files_url.find('href')
-    browse_files_button = browse_files_url[0:pos] + \
-        'class="btn btn-md btn-swh pull-right" role="button" ' + \
-        browse_files_url[pos:]
+                               link_text=browse_link_text,
+                               link_attrs=browse_files_link_attrs)
 
     parents_links = '<b>%s parent%s</b> ' %  \
         (len(revision['parents']),
diff --git a/swh/web/common/swh_templatetags.py b/swh/web/common/swh_templatetags.py
index 83300c3e4..c352f114e 100644
--- a/swh/web/common/swh_templatetags.py
+++ b/swh/web/common/swh_templatetags.py
@@ -58,7 +58,7 @@ def urlize_links_and_mails(text):
         The text as is otherwise.
 
     """
-    if '<a href="' not in text:
+    if 'href="' not in text:
         text = re.sub(r'(/api/[^"<]*|/browse/[^"<]*|http.*$)',
                       r'<a href="\1">\1</a>',
                       text)
-- 
GitLab