LCOV - code coverage report
Current view: top level - src/lib - InlineFormatter.cpp (source / functions) Hit Total Coverage
Test: mediawiki/php/wikidiff2 test coverage report Lines: 74 114 64.9 %
Date: 2023-07-04 10:20:16 Functions: 6 9 66.7 %

          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 << "\">&#9650;</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 << "\">&#9660;</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 << "&#160;";
     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

Generated by: LCOV version 1.13