Mercurial > kallithea
changeset 8115:2c7308652445
vcs: drop unused kallithea/lib/vcs/utils/annotate.py
Some of it seems to live on in kallithea/lib/annotate.py.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Thu, 02 Jan 2020 22:09:13 +0100 |
parents | 2c224062eba7 |
children | e4f743999d5c |
files | kallithea/lib/vcs/utils/annotate.py |
diffstat | 1 files changed, 0 insertions(+), 176 deletions(-) [+] |
line wrap: on
line diff
--- a/kallithea/lib/vcs/utils/annotate.py Wed Dec 25 15:30:11 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +0,0 @@ -from pygments import highlight -from pygments.formatters import HtmlFormatter - -from kallithea.lib.vcs.exceptions import VCSError -from kallithea.lib.vcs.nodes import FileNode -from kallithea.lib.vcs.utils import safe_unicode - - -def annotate_highlight(filenode, annotate_from_changeset_func=None, - order=None, headers=None, **options): - """ - Returns html portion containing annotated table with 3 columns: line - numbers, changeset information and pygmentized line of code. - - :param filenode: FileNode object - :param annotate_from_changeset_func: function taking changeset and - returning single annotate cell; needs break line at the end - :param order: ordered sequence of ``ls`` (line numbers column), - ``annotate`` (annotate column), ``code`` (code column); Default is - ``['ls', 'annotate', 'code']`` - :param headers: dictionary with headers (keys are whats in ``order`` - parameter) - """ - options['linenos'] = True - formatter = AnnotateHtmlFormatter(filenode=filenode, order=order, - headers=headers, - annotate_from_changeset_func=annotate_from_changeset_func, **options) - return highlight(safe_unicode(filenode.content), filenode.lexer, formatter) - - -class AnnotateHtmlFormatter(HtmlFormatter): - - def __init__(self, filenode, annotate_from_changeset_func=None, - order=None, **options): - """ - If ``annotate_from_changeset_func`` is passed it should be a function - which returns string from the given changeset. For example, we may pass - following function as ``annotate_from_changeset_func``:: - - def changeset_to_anchor(changeset): - return '<a href="/changesets/%s/">%s</a>\n' % \ - (changeset.id, changeset.id) - - :param annotate_from_changeset_func: see above - :param order: (default: ``['ls', 'annotate', 'code']``); order of - columns; - :param options: standard pygment's HtmlFormatter options, there is - extra option tough, ``headers``. For instance we can pass:: - - formatter = AnnotateHtmlFormatter(filenode, headers={ - 'ls': '#', - 'annotate': 'Annotate', - 'code': 'Code', - }) - - """ - super(AnnotateHtmlFormatter, self).__init__(**options) - self.annotate_from_changeset_func = annotate_from_changeset_func - self.order = order or ('ls', 'annotate', 'code') - headers = options.pop('headers', None) - if headers and not ('ls' in headers and 'annotate' in headers and - 'code' in headers - ): - raise ValueError("If headers option dict is specified it must " - "all 'ls', 'annotate' and 'code' keys") - self.headers = headers - if isinstance(filenode, FileNode): - self.filenode = filenode - else: - raise VCSError("This formatter expect FileNode parameter, not %r" - % type(filenode)) - - def annotate_from_changeset(self, changeset): - """ - Returns full html line for single changeset per annotated line. - """ - if self.annotate_from_changeset_func: - return self.annotate_from_changeset_func(changeset) - else: - return ''.join((changeset.id, '\n')) - - def _wrap_tablelinenos(self, inner): - inner_lines = [] - lncount = 0 - for t, line in inner: - if t: - lncount += 1 - inner_lines.append(line) - - fl = self.linenostart - mw = len(str(lncount + fl - 1)) - sp = self.linenospecial - st = self.linenostep - la = self.lineanchors - aln = self.anchorlinenos - if sp: - lines = [] - - for i in range(fl, fl + lncount): - if i % st == 0: - if i % sp == 0: - if aln: - lines.append('<a href="#%s-%d" class="special">' - '%*d</a>' % - (la, i, mw, i)) - else: - lines.append('<span class="special">' - '%*d</span>' % (mw, i)) - else: - if aln: - lines.append('<a href="#%s-%d">' - '%*d</a>' % (la, i, mw, i)) - else: - lines.append('%*d' % (mw, i)) - else: - lines.append('') - ls = '\n'.join(lines) - else: - lines = [] - for i in range(fl, fl + lncount): - if i % st == 0: - if aln: - lines.append('<a href="#%s-%d">%*d</a>' - % (la, i, mw, i)) - else: - lines.append('%*d' % (mw, i)) - else: - lines.append('') - ls = '\n'.join(lines) - - annotate_changesets = [tup[1] for tup in self.filenode.annotate] - # If pygments cropped last lines break we need do that too - ln_cs = len(annotate_changesets) - ln_ = len(ls.splitlines()) - if ln_cs > ln_: - annotate_changesets = annotate_changesets[:ln_ - ln_cs] - annotate = ''.join((self.annotate_from_changeset(changeset) - for changeset in annotate_changesets)) - # in case you wonder about the seemingly redundant <div> here: - # since the content in the other cell also is wrapped in a div, - # some browsers in some configurations seem to mess up the formatting. - ''' - yield 0, ('<table class="%stable">' % self.cssclass + - '<tr><td class="linenos"><div class="linenodiv"><pre>' + - ls + '</pre></div></td>' + - '<td class="code">') - yield 0, ''.join(inner_lines) - yield 0, '</td></tr></table>' - - ''' - headers_row = [] - if self.headers: - headers_row = ['<tr class="annotate-header">'] - for key in self.order: - td = ''.join(('<td>', self.headers[key], '</td>')) - headers_row.append(td) - headers_row.append('</tr>') - - body_row_start = ['<tr>'] - for key in self.order: - if key == 'ls': - body_row_start.append( - '<td class="linenos"><div class="linenodiv"><pre>' + - ls + '</pre></div></td>') - elif key == 'annotate': - body_row_start.append( - '<td class="annotate"><div class="annotatediv"><pre>' + - annotate + '</pre></div></td>') - elif key == 'code': - body_row_start.append('<td class="code">') - yield 0, ('<table class="%stable">' % self.cssclass + - ''.join(headers_row) + - ''.join(body_row_start) - ) - yield 0, ''.join(inner_lines) - yield 0, '</td></tr></table>'