Advertisement
Guest User

Untitled

a guest
Jul 5th, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. QString prexml(QString input) {
  2.     QString result;
  3.     QStringRef tail(&input);
  4.     bool inTag = false;
  5.     QChar inAttr = 0;
  6.     bool rawTag = false;
  7.     QString rawEnd;
  8.     while (!tail.isEmpty()) {
  9.  
  10.         if (tail.startsWith("<![CDATA[")) {
  11.             int p = tail.indexOf("]]>", 9);
  12.             if (p == -1)
  13.                 return input;
  14.             p += 3;
  15.             result.append(tail.left(p));
  16.             tail = tail.mid(p);
  17.             continue;
  18.         }
  19.  
  20.         const QChar c = tail.at(0);
  21.         tail = tail.mid(1);
  22.         if (inTag) {
  23.             if (inAttr != 0) {
  24.                 if (c == '<') {
  25.                     result.append(QStringLiteral("&lt;"));
  26.                     continue;
  27.                 } else if (c == '>') {
  28.                     result.append(QStringLiteral("&gt;"));
  29.                     continue;
  30.                 } else if ((c == '\\') && (!tail.isEmpty()) && (tail.at(0) == inAttr)) {
  31.                     result.append(inAttr == '"'? QStringLiteral("&quot;"): QStringLiteral("&apos;"));
  32.                     tail = tail.mid(1);
  33.                     continue;
  34.                 } else if (c == inAttr)
  35.                     inAttr = 0;
  36.             } else {
  37.                 if ((c == '"') || (c == '\''))
  38.                     inAttr = c;
  39.                 else if (c == '>') {
  40.                     inTag = false;
  41.                 }
  42.             }
  43.         } else {
  44.             if (c == '<') {
  45.                 inTag = true;
  46.                 if ((!tail.isEmpty()) && (tail.at(0) == '!')) {
  47.                     rawTag = true;
  48.                     rawEnd = "</";
  49.                     for (;;) {
  50.                         tail = tail.mid(1);
  51.                         if (tail.at(0).isLetter())
  52.                             break;
  53.                         rawEnd.append(tail.at(0));
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.         result.append(c);
  59.         if ((c == '>') && rawTag) {
  60.             result.append("<![CDATA[");
  61.             while (!tail.isEmpty() && rawTag) {
  62.                 if (tail.startsWith(rawEnd)) {
  63.                     tail = tail.mid(rawEnd.size());
  64.                     result.append("]]></");
  65.                     while (!tail.isEmpty()) {
  66.                         const QChar cc = tail.at(0);
  67.                         tail = tail.mid(1);
  68.                         result.append(cc);
  69.                         if (cc == '>')
  70.                             break;
  71.                     }
  72.                     rawTag = false;
  73.                 } else if (tail.startsWith("<![CDATA[")) {
  74.                     result.append("]]>&lt;![CDATA[<![CDATA[");
  75.                     tail = tail.mid(9);
  76.                 } else if (tail.startsWith("]]>")) {
  77.                     result.append("]]>]]&gt;<![CDATA[");
  78.                     tail = tail.mid(3);
  79.                 } else {
  80.                     result.append(tail.at(0));
  81.                     tail = tail.mid(1);
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     return result;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement