aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Pygments/py3/pygments/formatters/pangomarkup.py
blob: 222cf775ba4e5e8ab3e08352505b376b78115d22 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
""" 
    pygments.formatters.pangomarkup 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
    Formatter for Pango markup output. 
 
    :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS. 
    :license: BSD, see LICENSE for details. 
""" 
 
from pygments.formatter import Formatter 
 
 
__all__ = ['PangoMarkupFormatter'] 
 
 
_escape_table = { 
    ord('&'): '&', 
    ord('<'): '&lt;', 
} 
 
 
def escape_special_chars(text, table=_escape_table): 
    """Escape & and < for Pango Markup.""" 
    return text.translate(table) 
 
 
class PangoMarkupFormatter(Formatter): 
    """ 
    Format tokens as Pango Markup code. It can then be rendered to an SVG. 
 
    .. versionadded:: 2.9 
    """ 
 
    name = 'Pango Markup' 
    aliases = ['pango', 'pangomarkup'] 
    filenames = [] 
 
    def __init__(self, **options): 
        Formatter.__init__(self, **options) 
 
        self.styles = {} 
 
        for token, style in self.style: 
            start = '' 
            end = '' 
            if style['color']: 
                start += '<span fgcolor="#%s">' % style['color'] 
                end = '</span>' + end 
            if style['bold']: 
                start += '<b>' 
                end = '</b>' + end 
            if style['italic']: 
                start += '<i>' 
                end = '</i>' + end 
            if style['underline']: 
                start += '<u>' 
                end = '</u>' + end 
            self.styles[token] = (start, end) 
 
    def format_unencoded(self, tokensource, outfile): 
        lastval = '' 
        lasttype = None 
 
        outfile.write('<tt>') 
 
        for ttype, value in tokensource: 
            while ttype not in self.styles: 
                ttype = ttype.parent 
            if ttype == lasttype: 
                lastval += escape_special_chars(value) 
            else: 
                if lastval: 
                    stylebegin, styleend = self.styles[lasttype] 
                    outfile.write(stylebegin + lastval + styleend) 
                lastval = escape_special_chars(value) 
                lasttype = ttype 
 
        if lastval: 
            stylebegin, styleend = self.styles[lasttype] 
            outfile.write(stylebegin + lastval + styleend) 
 
        outfile.write('</tt>')