void THtmlParser::parseTag() { // Close-tag if (txt.at(pos) == QLatin1Char('/')) { parseCloseTag(); return; } // p : parent index int p = lastIndex(); while (p > 0) { if (!at(p).tag.isEmpty() && !isElementClosed(p)) { break; } p = at(p).parent; } THtmlElement &he = appendNewElement(p); he.tag = parseWord(); // Parses the attributes he.attributes.clear(); if (pos < txt.length()) { he.attributes = parseAttributes(); } // Tag closed? if (txt.at(pos) == QLatin1Char('/')) { const QRegExp rx("(\\s*/[^>]*)>"); // "/>" or "//-->" int idx = rx.indexIn(txt, pos - 1); if (idx == pos || idx == pos - 1) { he.selfCloseMark = rx.cap(1); pos = idx + rx.cap(1).length(); } } if (txt.at(pos) == QLatin1Char('>')) { ++pos; } else { // coding error Q_ASSERT(0); } if (isElementClosed(lastIndex())) { appendNewElement(he.parent); } }
void QDeclarativeStyledTextPrivate::parse() { QList<QTextLayout::FormatRange> ranges; QStack<QTextCharFormat> formatStack; QString drawText; drawText.reserve(text.count()); int textStart = 0; int textLength = 0; int rangeStart = 0; const QChar *ch = text.constData(); while (!ch->isNull()) { if (*ch == lessThan) { if (textLength) drawText.append(QStringRef(&text, textStart, textLength)); if (rangeStart != drawText.length() && formatStack.count()) { QTextLayout::FormatRange formatRange; formatRange.format = formatStack.top(); formatRange.start = rangeStart; formatRange.length = drawText.length() - rangeStart; ranges.append(formatRange); } rangeStart = drawText.length(); ++ch; if (*ch == slash) { ++ch; if (parseCloseTag(ch, text)) { if (formatStack.count()) formatStack.pop(); } } else { QTextCharFormat format; if (formatStack.count()) format = formatStack.top(); if (parseTag(ch, text, drawText, format)) formatStack.push(format); } textStart = ch - text.constData() + 1; textLength = 0; } else if (*ch == ampersand) { ++ch; drawText.append(QStringRef(&text, textStart, textLength)); parseEntity(ch, text, drawText); textStart = ch - text.constData() + 1; textLength = 0; } else { ++textLength; } if (!ch->isNull()) ++ch; } if (textLength) drawText.append(QStringRef(&text, textStart, textLength)); if (rangeStart != drawText.length() && formatStack.count()) { QTextLayout::FormatRange formatRange; formatRange.format = formatStack.top(); formatRange.start = rangeStart; formatRange.length = drawText.length() - rangeStart; ranges.append(formatRange); } layout.setText(drawText); layout.setAdditionalFormats(ranges); }
void QQuickStyledTextPrivate::parse() { QList<QTextLayout::FormatRange> ranges; QStack<QTextCharFormat> formatStack; QString drawText; drawText.reserve(text.count()); updateImagePositions = !imgTags->isEmpty(); int textStart = 0; int textLength = 0; int rangeStart = 0; bool formatChanged = false; const QChar *ch = text.constData(); while (!ch->isNull()) { if (*ch == lessThan) { if (textLength) { appendText(text, textStart, textLength, drawText); } else if (prependSpace) { drawText.append(space); prependSpace = false; hasSpace = true; } if (rangeStart != drawText.length() && formatStack.count()) { if (formatChanged) { QTextLayout::FormatRange formatRange; formatRange.format = formatStack.top(); formatRange.start = rangeStart; formatRange.length = drawText.length() - rangeStart; ranges.append(formatRange); formatChanged = false; } else if (ranges.count()) { ranges.last().length += drawText.length() - rangeStart; } } rangeStart = drawText.length(); ++ch; if (*ch == slash) { ++ch; if (parseCloseTag(ch, text, drawText)) { if (formatStack.count()) { formatChanged = true; formatStack.pop(); } } } else { QTextCharFormat format; if (formatStack.count()) format = formatStack.top(); if (parseTag(ch, text, drawText, format)) { formatChanged = true; formatStack.push(format); } } textStart = ch - text.constData() + 1; textLength = 0; } else if (*ch == ampersand) { ++ch; appendText(text, textStart, textLength, drawText); parseEntity(ch, text, drawText); textStart = ch - text.constData() + 1; textLength = 0; } else if (ch->isSpace()) { if (textLength) appendText(text, textStart, textLength, drawText); if (!preFormat) { prependSpace = !hasSpace; for (const QChar *n = ch + 1; !n->isNull() && n->isSpace(); ++n) ch = n; hasNewLine = false; } else if (*ch == lineFeed) { drawText.append(QChar(QChar::LineSeparator)); hasNewLine = true; } else { drawText.append(QChar(QChar::Nbsp)); hasNewLine = false; } textStart = ch - text.constData() + 1; textLength = 0; } else { ++textLength; } if (!ch->isNull()) ++ch; } if (textLength) appendText(text, textStart, textLength, drawText); if (rangeStart != drawText.length() && formatStack.count()) { if (formatChanged) { QTextLayout::FormatRange formatRange; formatRange.format = formatStack.top(); formatRange.start = rangeStart; formatRange.length = drawText.length() - rangeStart; ranges.append(formatRange); } else if (ranges.count()) { ranges.last().length += drawText.length() - rangeStart; } } layout.setText(drawText); layout.setAdditionalFormats(ranges); }