-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtktext.py
129 lines (99 loc) · 4.65 KB
/
tktext.py
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import re
from diffvisitor import DiffLineVisitor
# TODO: move to DiffGeneratorSettings
INDENT_TAB_SIZE=2
# TODO: DRY this is duplicated in odt.py
RX_LEADTABS = re.compile("^(.)(\t+)")
def _expandIndentTabs( text ):
def expand(tabs: re.Match):
spaces = " " * len(tabs.group(2)) * INDENT_TAB_SIZE
return f"{tabs.group(1)}{spaces}"
return RX_LEADTABS.sub(expand, text)
class TkTextDiffFormatter(DiffLineVisitor):
def __init__(self, tkText):
self.tkText = tkText
def _insertLineNumbers( self, addOldNum, addNewNum ):
width = max(3, len("{}".format( self.oldLineNumber )))
style = 'removedLineNum' if addOldNum and not addNewNum else 'keptLineNum'
value = self.oldLineNumber if addOldNum else ''
self.tkText.insert( 'end', "{:{}}".format(value, width), ( style, ) )
width = max(3, len("{}".format( self.newLineNumber )))
style = 'addedLineNum' if not addOldNum and addNewNum else 'keptLineNum'
value = self.newLineNumber if addNewNum else ''
self.tkText.insert( 'end', " {:{}}".format(value, width), ( style, ) )
def _insertNewLine( self ):
self.tkText.insert( 'end', "\n" )
def onStart(self):
red = 'red'
green = 'green'
grey = 'lightgrey'
black = 'black'
blue = 'blue'
def courier( size ):
return 'courier {}'.format( size )
def helvetica( size, extra=None ):
return 'helvetica {}{}'.format( size, " " + extra if extra is not None else "" )
self.tkText.tag_configure( 'standard', foreground=black, font=helvetica(10) )
self.tkText.tag_configure( 'heading1', font=helvetica(16, "bold") )
self.tkText.tag_configure( 'heading2', font=helvetica(14, "bold") )
self.tkText.tag_configure( 'heading3', foreground=blue, font=helvetica(10, "bold") )
self.tkText.tag_configure( 'diffFilenameRemove', foreground=red, background=grey, font=courier(10) )
self.tkText.tag_configure( 'diffFilenameAdd', foreground=green, background=grey, font=courier(10) )
self.tkText.tag_configure( 'diffRemove', foreground=red, font=courier(10) )
self.tkText.tag_configure( 'diffAdd', foreground=green, font=courier(10) )
self.tkText.tag_configure( 'diffKeep', foreground=black, font=courier(10) )
self.tkText.tag_configure( 'removedLineNum', foreground=red, font=courier(9) )
self.tkText.tag_configure( 'addedLineNum', foreground=green, font=courier(9) )
self.tkText.tag_configure( 'keptLineNum', foreground=black, font=courier(9) )
def onStartSection(self, prevSection, newSection):
pass
def onEndSection(self, section):
pass
def onCommandStart(self, line):
self.tkText.insert( 'end', line, ( 'heading1', ) )
self._insertNewLine()
def onFileStart(self, line):
self.tkText.insert( 'end', line, ( 'heading2', ) )
self._insertNewLine()
def onChunkStart(self, line):
self.tkText.insert( 'end', line, ( 'heading3', ) )
self._insertNewLine()
def onFileRemove(self, line):
self.tkText.insert( 'end', line, ( 'diffFilenameRemove', ) )
self._insertNewLine()
def onFileAdd(self, line):
self.tkText.insert( 'end', line, ( 'diffFilenameAdd', ) )
self._insertNewLine()
def onLineRemove(self, line):
self._insertLineNumbers( True, False )
line = _expandIndentTabs(line)
self.tkText.insert( 'end', line, ( 'diffRemove', ) )
self._insertNewLine()
def onLineAdd(self, line):
self._insertLineNumbers( False, True )
line = _expandIndentTabs(line)
self.tkText.insert( 'end', line, ( 'diffAdd', ) )
self._insertNewLine()
def onLineUnchanged(self, line):
self._insertLineNumbers( True, True )
line = _expandIndentTabs(line)
self.tkText.insert( 'end', line, ( 'diffKeep', ) )
self._insertNewLine()
def onOtherLine(self, line):
if len(line) > 0:
self.tkText.insert( 'end', line, ( 'standard', ) )
self._insertNewLine()
def onEnd(self): pass
def getFormattedDiff( self, text ):
self.visitLines( text )
return []
class TkTextGenerator:
def __init__(self, settings, tkText):
self.settings = settings
self.tkText = tkText
def writeDocument(self, diffGenerator, overviewGenerator=None):
if overviewGenerator is not None:
overviewText = overviewGenerator.generateOverview()
diffText = diffGenerator.generateDiff()
# TkTextOverviewFormatter(tkText).getFormattedDiff( diffText )
TkTextDiffFormatter(self.tkText).getFormattedDiff( diffText )