2016-09-20 5 views
1

Ich verwende Segmente, um Linien aus einer Datei hervorzuheben, aber ich möchte verschiedene Linien mit verschiedenen Farben hervorheben.Verwenden von mehr als einer Markierungsfarbe in den Segmenten

note Während ich diese Frage schrieb, probierte ich verschiedene Dinge aus, bis ich fand, was wie eine anständige Lösung aussieht, die mein Problem löst. Ich werde es in den Antworten posten.

Mein erster Versuch, die Standard-gelb zu verändern (was sehr blass) war:

HIGHLIGHT_COLOR = '#F4E004' 

formatter = HtmlFormatter(linenos='inline', hl_lines=hl_lines, lineanchors='foo') 
style = formatter.get_style_defs() 
with open(the_xml_fullpath) as f: 
    highlighted = highlight(f.read(), XmlLexer(), formatter) 
# make the yellow more ...yellow 
_style = re.sub(r'background-color: \#.+ ', 'background-color: {} '.format(HIGHLIGHT_COLOR), style) 

Jetzt bin ich voll und ganz bewusst the perils of using a regular expression to parse HTML aber ich dachte, die einzige Alternative die noclasses=True Möglichkeit highlight() zu verwenden war, das tut Verwenden Sie CSS-Klassen nicht inline CSS und durchlaufen Sie dann die gesamte Datei und ersetzen Sie die Hintergrundfarbe der Zeilen, die ich möchte.

Meine Frage ist also: Wie kann ich verschiedene Linien mit Hilfe von Segmenten mit unterschiedlichen Farben hervorheben?

Antwort

0

Meine Lösung subclassed die HtmlFormatter Klasse wie sie in der Dokumentation wie folgt vorgeschlagen:

class MyFormatter(HtmlFormatter): 
    """Overriding formatter to highlight more than one kind of lines""" 
    def __init__(self, **kwargs): 
     super(MyFormatter, self).__init__(**kwargs) 
     # a list of [ (highlight_colour, [lines]) ] 
     self.highlight_groups = kwargs.get('highlight_groups', []) 

    def wrap(self, source, outfile): 
     return self._wrap_code(source) 

    # generator: returns 0, html if it's not a source line; 1, line if it is 
    def _wrap_code(self, source): 
     _prefix = '' 
     if self.cssclass is not None: 
      _prefix += '<div class="highlight">' 
     if self.filename is not None: 
      _prefix += '<span class="filename">{}</span>'.format(self.filename) 
     yield 0, _prefix + '<pre>' 

     for count, _t in enumerate(source): 
      i, t = _t 
      if i == 1: 
       # it's a line of formatted code 
       for highlight_group in self.highlight_groups: 
        col, lines = highlight_group 
        # count starts from 0... 
        if (count + 1) in lines: 
         # it's a highlighted line - set the colour 
         _row = '<span style="background-color:{}">{}</span>'.format(col, t) 
         t = _row 
      yield i, t 

     # close open things 
     _postfix = '' 
     if self.cssclass is not None: 
      _postfix += '</div>' 
     yield 0, '</pre>' + _postfix 

es zu benutzen:

# dark yellow 
HIGHLIGHT_COLOUR = '#F4E004' 
# pinkish 
DEPRECATED_COLOUR = '#FF4ED1' 

formatter = MyFormatter(
    linenos='inline', 
    # no need to highlight lines - we take care of it in the formatter 
    # hl_lines=hl_lines, 
    filename="sourcefile", 
    # a list of tuples (color, [lines]) indicating which colur to use 
    highlight_groups=[ 
     (HIGHLIGHT_COLOR, hl_lines), 
     (DEPRECATED_COLOR, deprecated_lines), 
    ] 
) 
Verwandte Themen