src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py

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

eric ide

mercurial