Line data Source code
1 : #include "InlineFormatter.h"
2 :
3 : namespace wikidiff2 {
4 :
5 0 : const char * InlineFormatter::getName()
6 : {
7 0 : return "inline";
8 : }
9 :
10 30 : void InlineFormatter::printAdd(const String& line, int leftLine, int rightLine, int offsetFrom,
11 : int offsetTo)
12 : {
13 30 : if(line.empty()) {
14 3 : printWrappedLine("<div class=\"mw-diff-inline-added mw-diff-empty-line\"><ins>", line, "</ins></div>\n");
15 : } else {
16 27 : printWrappedLine("<div class=\"mw-diff-inline-added\"><ins>", line, "</ins></div>\n");
17 : }
18 30 : }
19 :
20 29 : void InlineFormatter::printDelete(const String& line, int leftLine, int rightLine,
21 : int offsetFrom, int offsetTo)
22 : {
23 29 : if(line.empty()) {
24 6 : printWrappedLine("<div class=\"mw-diff-inline-deleted mw-diff-empty-line\"><del>", line, "</del></div>\n");
25 : } else {
26 23 : printWrappedLine("<div class=\"mw-diff-inline-deleted\"><del>", line, "</del></div>\n");
27 : }
28 29 : }
29 :
30 65 : void InlineFormatter::printWordDiff(const WordDiff & worddiff, int leftLine, int rightLine,
31 : int offsetFrom, int offsetTo, bool printLeft, bool printRight,
32 : const String & srcAnchor, const String & dstAnchor, bool moveDirectionDownwards)
33 : {
34 65 : bool moved = printLeft != printRight,
35 65 : isMoveSrc = moved && printLeft,
36 65 : isMoveDest = moved && printRight;
37 :
38 65 : if (moved) {
39 : result << "<div class=\"mw-diff-inline-moved mw-diff-inline-moved-"
40 : << (printLeft ? "source" : "destination")
41 : << " mw-diff-inline-moved-"
42 : << (moveDirectionDownwards ? "downwards" : "upwards")
43 44 : << "\">";
44 44 : result << "<a name=\"" << srcAnchor << "\"></a>";
45 44 : if (!moveDirectionDownwards) {
46 : result << "<a class=\"mw-diff-movedpara-"
47 : << (printLeft ? "left" : "right")
48 : << "\" data-title-tag=\"" << (printRight ? "new" : "old")
49 22 : << "\" href=\"#" << dstAnchor << "\">▲</a>";
50 : }
51 : } else {
52 21 : result << "<div class=\"mw-diff-inline-changed\">";
53 : }
54 :
55 423 : for (unsigned i = 0; i < worddiff.size(); ++i) {
56 358 : const DiffOp<Word> & op = worddiff[i];
57 : int n, j;
58 358 : if (op.op == DiffOp<Word>::copy) {
59 195 : n = op.from.size();
60 7256 : for (j=0; j<n; j++) {
61 7061 : printHtmlEncodedText(*op.from[j]);
62 : }
63 163 : } else if (op.op == DiffOp<Word>::del) {
64 32 : n = op.from.size();
65 32 : if (!isMoveSrc)
66 22 : result << "<del>";
67 146 : for (j=0; j<n; j++) {
68 114 : printHtmlEncodedText(*op.from[j]);
69 : }
70 32 : if (!isMoveSrc)
71 22 : result << "</del>";
72 131 : } else if (op.op == DiffOp<Word>::add) {
73 51 : if (isMoveSrc)
74 19 : continue;
75 32 : n = op.to.size();
76 32 : result << "<ins>";
77 125 : for (j=0; j<n; j++) {
78 93 : printHtmlEncodedText(*op.to[j]);
79 : }
80 32 : result << "</ins>";
81 80 : } else if (op.op == DiffOp<Word>::change) {
82 80 : n = op.from.size();
83 80 : if (!isMoveSrc)
84 62 : result << "<del>";
85 13231 : for (j=0; j<n; j++) {
86 13151 : printHtmlEncodedText(*op.from[j]);
87 : }
88 80 : if (isMoveSrc)
89 18 : continue;
90 62 : result << "</del>";
91 62 : n = op.to.size();
92 62 : result << "<ins>";
93 12147 : for (j=0; j<n; j++) {
94 12085 : printHtmlEncodedText(*op.to[j]);
95 : }
96 62 : result << "</ins>";
97 : }
98 : }
99 65 : if (moved && moveDirectionDownwards) {
100 : result << "<a class=\"mw-diff-movedpara-"
101 : << (printLeft ? "left" : "right") << "\" data-title-tag=\""
102 22 : << (printRight ? "new" : "old") << "\" href=\"#" << dstAnchor << "\">▼</a>";
103 : }
104 65 : result << "</div>\n";
105 65 : }
106 :
107 27 : void InlineFormatter::printBlockHeader(int leftLine, int rightLine)
108 : {
109 27 : result << "<div class=\"mw-diff-inline-header\"><!-- LINES "
110 27 : << leftLine << "," << rightLine << " --></div>\n";
111 27 : }
112 :
113 81 : void InlineFormatter::printContext(const String & input, int leftLine, int rightLine,
114 : int offsetFrom, int offsetTo)
115 : {
116 81 : printWrappedLine("<div class=\"mw-diff-inline-context\">", input, "</div>\n");
117 81 : }
118 :
119 : /**
120 : * HTML-encode and output a line with some text before and after it
121 : */
122 140 : void InlineFormatter::printWrappedLine(const char* pre, const String& line, const char* post)
123 : {
124 140 : result << pre;
125 140 : if (line.empty()) {
126 24 : result << " ";
127 : } else {
128 116 : printHtmlEncodedText(line);
129 : }
130 140 : result << post;
131 140 : }
132 :
133 0 : void InlineFormatter::printConcatDiff(
134 : const WordDiff & wordDiff,
135 : int leftLine, int rightLine,
136 : int offsetFrom, int offsetTo)
137 : {
138 0 : result << "<div class=\"mw-diff-inline-changed\">";
139 :
140 0 : for (unsigned i = 0; i < wordDiff.size(); ++i) {
141 0 : const DiffOp<Word> & op = wordDiff[i];
142 : int n, j;
143 0 : if (isNewlineMarker(op)) {
144 0 : printNewlineMarker();
145 0 : } else if (op.op == DiffOp<Word>::copy) {
146 0 : n = op.from.size();
147 0 : for (j=0; j<n; j++) {
148 0 : printHtmlEncodedText(*op.from[j]);
149 : }
150 0 : } else if (op.op == DiffOp<Word>::del) {
151 0 : n = op.from.size();
152 0 : result << "<del>";
153 0 : for (j=0; j<n; j++) {
154 0 : printHtmlEncodedText(*op.from[j]);
155 : }
156 0 : result << "</del>";
157 0 : } else if (op.op == DiffOp<Word>::add) {
158 0 : n = op.to.size();
159 0 : result << "<ins>";
160 0 : for (j=0; j<n; j++) {
161 0 : printHtmlEncodedText(*op.to[j]);
162 : }
163 0 : result << "</ins>";
164 0 : } else if (op.op == DiffOp<Word>::change) {
165 0 : n = op.from.size();
166 0 : result << "<del>";
167 0 : for (j=0; j<n; j++) {
168 0 : printHtmlEncodedText(*op.from[j]);
169 : }
170 0 : result << "</del>";
171 0 : n = op.to.size();
172 0 : result << "<ins>";
173 0 : for (j=0; j<n; j++) {
174 0 : printHtmlEncodedText(*op.to[j]);
175 : }
176 0 : result << "</ins>";
177 : }
178 : }
179 0 : result << "</div>\n";
180 0 : }
181 :
182 0 : void InlineFormatter::printNewlineMarker() {
183 0 : result << "<span class=\"mw-inline-diff-newline\"></span><br>";
184 0 : }
185 :
186 : } // namespace wikidiff2
|