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