QString KNHelper::rewrapStringList(QStringList text, int wrapAt, QChar quoteChar, bool stopAtSig, bool alwaysSpace) { QString quoted, lastPrefix, thisPrefix, leftover, thisLine; int breakPos; for(QStringList::Iterator line = text.begin(); line != text.end(); ++line) { if(stopAtSig && (*line) == "-- ") break; thisLine = (*line); if(!alwaysSpace && (thisLine[0] == quoteChar)) thisLine.prepend(quoteChar); // second quote level without space else thisLine.prepend(quoteChar + ' '); thisPrefix = QString::null; QChar c; for(int idx = 0; idx < (int)(thisLine.length()); idx++) { c = thisLine.at(idx); if((c == ' ') || (c == quoteChar) || (c == '>') || (c == '|') || (c == ':') || (c == '#') || (c == '[') || (c == '{')) thisPrefix.append(c); else break; } thisLine.remove(0, thisPrefix.length()); thisLine = thisLine.stripWhiteSpace(); if(!leftover.isEmpty()) // don't break paragraphs, tables and quote levels { if(thisLine.isEmpty() || (thisPrefix != lastPrefix) || thisLine.contains(" ") || thisLine.contains('\t')) appendTextWPrefix(quoted, leftover, wrapAt, lastPrefix); else thisLine.prepend(leftover + " "); leftover = QString::null; } if((int)(thisPrefix.length() + thisLine.length()) > wrapAt) { breakPos = findBreakPos(thisLine, wrapAt - thisPrefix.length()); if(breakPos < (int)(thisLine.length())) { leftover = thisLine.right(thisLine.length() - breakPos - 1); thisLine.truncate(breakPos); } } quoted += thisPrefix + thisLine + "\n"; lastPrefix = thisPrefix; } if(!leftover.isEmpty()) appendTextWPrefix(quoted, leftover, wrapAt, lastPrefix); return quoted; }
void appendTextWPrefix(QString &result, const QString &text, int wrapAt, const QString &prefix) { QString txt=text; int breakPos; while(!txt.isEmpty()) { if((int)(prefix.length()+txt.length()) > wrapAt) { breakPos=findBreakPos(txt,wrapAt-prefix.length()); result+=(prefix+txt.left(breakPos)+'\n'); txt.remove(0,breakPos+1); } else { result+=(prefix+txt+'\n'); txt.clear(); } } }