summaryrefslogtreecommitdiff
path: root/pygments/formatters/html.py
diff options
context:
space:
mode:
authorPepijn de Vos <pepijndevos@gmail.com>2012-07-14 14:33:01 -0400
committerPepijn de Vos <pepijndevos@gmail.com>2012-07-14 14:33:01 -0400
commitcc2a9d413902998dd338633ff587945e60b8e600 (patch)
tree74fdb876ac5feed3902a9e07ab0231cf3d93a0a6 /pygments/formatters/html.py
parent0b274e8e0f611761060b4a68250fd81ecde9d158 (diff)
downloadpygments-cc2a9d413902998dd338633ff587945e60b8e600.tar.gz
single file ctags
Diffstat (limited to 'pygments/formatters/html.py')
-rw-r--r--pygments/formatters/html.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/pygments/formatters/html.py b/pygments/formatters/html.py
index 85a16ff8..2a5454b2 100644
--- a/pygments/formatters/html.py
+++ b/pygments/formatters/html.py
@@ -17,6 +17,10 @@ from pygments.formatter import Formatter
from pygments.token import Token, Text, STANDARD_TYPES
from pygments.util import get_bool_opt, get_int_opt, get_list_opt, bytes
+try:
+ from ctags import CTags, TagEntry
+except ImportError:
+ pass
__all__ = ['HtmlFormatter']
@@ -351,6 +355,13 @@ class HtmlFormatter(Formatter):
self.prestyles = self._decodeifneeded(options.get('prestyles', ''))
self.cssfile = self._decodeifneeded(options.get('cssfile', ''))
self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False)
+ self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
+
+ if self.tagsfile:
+ try:
+ self.ct = CTags(self.tagsfile)
+ except NameError:
+ print >> sys.stderr, 'Hey! ctags doesn\'t seem to be installed. Try \'pip install python-ctags\'.'
linenos = options.get('linenos', False)
if linenos == 'inline':
@@ -642,6 +653,7 @@ class HtmlFormatter(Formatter):
# for <span style=""> lookup only
getcls = self.ttype2class.get
c2s = self.class2style
+ tagsfile = self.tagsfile
escape_table = _escape_html_table
lspan = ''
@@ -659,6 +671,12 @@ class HtmlFormatter(Formatter):
parts = value.translate(escape_table).split('\n')
+ if tagsfile and ttype in Token.Name:
+ filename, lineNumber = self._lookup_ctag(value)
+ if filename:
+ parts[0] = "<a href=\"#%s-%s\">%s" % (self.lineanchors, lineNumber, parts[0])
+ parts[-1] = "%s</a>" % parts[-1]
+
# for all but the last line
for part in parts[:-1]:
if line:
@@ -688,6 +706,13 @@ class HtmlFormatter(Formatter):
if line:
yield 1, line + (lspan and '</span>') + lsep
+ def _lookup_ctag(self, token):
+ entry = TagEntry()
+ if self.ct.find(entry, token, 0):
+ return entry['file'], entry['lineNumber']
+ else:
+ return None, None
+
def _highlight_lines(self, tokensource):
"""
Highlighted the lines specified in the `hl_lines` option by