Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- QString prexml(QString input) {
- QString result;
- QStringRef tail(&input);
- bool inTag = false;
- QChar inAttr = 0;
- bool rawTag = false;
- QString rawEnd;
- while (!tail.isEmpty()) {
- if (tail.startsWith("<![CDATA[")) {
- int p = tail.indexOf("]]>", 9);
- if (p == -1)
- return input;
- p += 3;
- result.append(tail.left(p));
- tail = tail.mid(p);
- continue;
- }
- const QChar c = tail.at(0);
- tail = tail.mid(1);
- if (inTag) {
- if (inAttr != 0) {
- if (c == '<') {
- result.append(QStringLiteral("<"));
- continue;
- } else if (c == '>') {
- result.append(QStringLiteral(">"));
- continue;
- } else if ((c == '\\') && (!tail.isEmpty()) && (tail.at(0) == inAttr)) {
- result.append(inAttr == '"'? QStringLiteral("""): QStringLiteral("'"));
- tail = tail.mid(1);
- continue;
- } else if (c == inAttr)
- inAttr = 0;
- } else {
- if ((c == '"') || (c == '\''))
- inAttr = c;
- else if (c == '>') {
- inTag = false;
- }
- }
- } else {
- if (c == '<') {
- inTag = true;
- if ((!tail.isEmpty()) && (tail.at(0) == '!')) {
- rawTag = true;
- rawEnd = "</";
- for (;;) {
- tail = tail.mid(1);
- if (tail.at(0).isLetter())
- break;
- rawEnd.append(tail.at(0));
- }
- }
- }
- }
- result.append(c);
- if ((c == '>') && rawTag) {
- result.append("<![CDATA[");
- while (!tail.isEmpty() && rawTag) {
- if (tail.startsWith(rawEnd)) {
- tail = tail.mid(rawEnd.size());
- result.append("]]></");
- while (!tail.isEmpty()) {
- const QChar cc = tail.at(0);
- tail = tail.mid(1);
- result.append(cc);
- if (cc == '>')
- break;
- }
- rawTag = false;
- } else if (tail.startsWith("<![CDATA[")) {
- result.append("]]><![CDATA[<![CDATA[");
- tail = tail.mid(9);
- } else if (tail.startsWith("]]>")) {
- result.append("]]>]]><![CDATA[");
- tail = tail.mid(3);
- } else {
- result.append(tail.at(0));
- tail = tail.mid(1);
- }
- }
- }
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement