eric7/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a syntax highlighter for diff outputs.
8 """
9
10 from PyQt5.QtGui import QColor
11
12 from E5Gui.E5GenericDiffHighlighter import TERMINAL, E5GenericDiffHighlighter
13
14
15 class GitDiffHighlighter(E5GenericDiffHighlighter):
16 """
17 Class implementing a diff highlighter for Git.
18 """
19 def __init__(self, doc, whitespace=True):
20 """
21 Constructor
22
23 @param doc reference to the text document (QTextDocument)
24 @param whitespace flag indicating to highlight whitespace
25 at the end of a line (boolean)
26 """
27 self.whitespace = whitespace
28
29 super().__init__(doc)
30
31 def generateRules(self):
32 """
33 Public method to generate the rule set.
34 """
35 diffHeader = self.makeFormat(fg=self.textColor,
36 bg=self.headerColor)
37 diffHeaderBold = self.makeFormat(fg=self.textColor,
38 bg=self.headerColor,
39 bold=True)
40 diffContext = self.makeFormat(fg=self.textColor,
41 bg=self.contextColor)
42
43 diffAdded = self.makeFormat(fg=self.textColor,
44 bg=self.addedColor)
45 diffRemoved = self.makeFormat(fg=self.textColor,
46 bg=self.removedColor)
47
48 if self.whitespace:
49 try:
50 badWhitespace = self.makeFormat(fg=self.textColor,
51 bg=self.whitespaceColor)
52 except AttributeError:
53 badWhitespace = self.makeFormat(fg=self.textColor,
54 bg=QColor(255, 0, 0, 192))
55
56 # We specify the whitespace rule last so that it is
57 # applied after the diff addition/removal rules.
58 diffOldRegex = TERMINAL(r'^--- ')
59 diffNewRegex = TERMINAL(r'^\+\+\+ ')
60 diffContextRegex = TERMINAL(r'^@@ ')
61
62 diffHeader1Regex = TERMINAL(r'^diff --git a/.*b/.*')
63 diffHeader2Regex = TERMINAL(r'^index \S+\.\.\S+')
64 diffHeader3Regex = TERMINAL(r'^new file mode')
65 diffHeader4Regex = TERMINAL(r'^deleted file mode')
66
67 diffAddedRegex = TERMINAL(r'^\+')
68 diffRemovedRegex = TERMINAL(r'^-')
69 diffBarRegex = TERMINAL(r'^([ ]+.*)(\|[ ]+\d+[ ]+[+-]+)$')
70 diffStsRegex = (r'(.+\|.+?)(\d+)(.+?)([\+]*?)([-]*?)$')
71 diffSummaryRegex = (r'(\s+\d+ files changed[^\d]*)'
72 r'(:?\d+ insertions[^\d]*)'
73 r'(:?\d+ deletions.*)$')
74
75 if self.whitespace:
76 self.createRules((r'(..*?)(\s+)$', (None, badWhitespace)))
77 self.createRules((diffOldRegex, diffRemoved),
78 (diffNewRegex, diffAdded),
79 (diffContextRegex, diffContext),
80 (diffBarRegex, (diffHeaderBold, diffHeader)),
81 (diffHeader1Regex, diffHeader),
82 (diffHeader2Regex, diffHeader),
83 (diffHeader3Regex, diffHeader),
84 (diffHeader4Regex, diffHeader),
85 (diffAddedRegex, diffAdded),
86 (diffRemovedRegex, diffRemoved),
87 (diffStsRegex, (None, diffHeader,
88 None, diffHeader,
89 diffHeader)),
90 (diffSummaryRegex, (diffHeader,
91 diffHeader,
92 diffHeader))
93 )

eric ide

mercurial