void XmlWriter::readFragment(const QTextBlock ¤tBlock, QDomElement blockElement, QDomDocument *document) { //! [3] //! [4] QTextBlock::iterator it; for (it = currentBlock.begin(); !(it.atEnd()); ++it) { QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid()) //! [3] //! [5] processFragment(currentFragment); //! [4] //! [5] if (currentFragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", currentFragment.length()); QDomText fragmentText = document->createTextNode(currentFragment.text()); fragmentElement.appendChild(fragmentText); } //! [6] //! [7] } //! [7] //! [6] }
void FlatTextarea::getMentionHashtagStart(QString &start) const { int32 pos = textCursor().position(); if (textCursor().anchor() != pos) return; QTextDocument *doc(document()); QTextBlock block = doc->findBlock(pos); for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { QTextFragment fr(iter.fragment()); if (!fr.isValid()) continue; int32 p = fr.position(), e = (p + fr.length()); if (p >= pos || e < pos) continue; QTextCharFormat f = fr.charFormat(); if (f.isImageFormat()) continue; QString t(fr.text()); for (int i = pos - p; i > 0; --i) { if (t.at(i - 1) == '@') { if ((pos - p - i < 1 || t.at(i).isLetter()) && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_'))) { start = t.mid(i - 1, pos - p - i + 1); } return; } else if (t.at(i - 1) == '#') { if (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_')) { start = t.mid(i - 1, pos - p - i + 1); } return; } if (pos - p - i > 63) break; if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; } return; } }
void TextDocumentModel::fillBlock(const QTextBlock &block, QStandardItem *parent) { for (auto it = block.begin(); it != block.end(); ++it) { QStandardItem *item = new QStandardItem(tr("Fragment: %1").arg(it.fragment().text())); const QRectF b = m_document->documentLayout()->blockBoundingRect(block); appendRow(parent, item, it.fragment().charFormat(), b); if (!block.layout()) continue; #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) foreach (const auto &range, block.layout()->formats()) { const auto start = std::max(range.start, it.fragment().position() - block.position()); const auto end = std::min(range.start + range.length, it.fragment().position() + it.fragment().length() - block.position()); if (start >= end) continue; auto child = new QStandardItem(tr("Layout Range: %1").arg(it.fragment().text().mid(start, end -start))); appendRow(item, child, range.format, QRectF()); } #endif } }
void Text::spatiumChanged(qreal oldVal, qreal newVal) { Element::spatiumChanged(oldVal, newVal); if (!sizeIsSpatiumDependent() || styled()) return; qreal v = newVal / oldVal; QTextCursor c(_doc); QTextBlock cb = _doc->begin(); while (cb.isValid()) { QTextBlock::iterator i(cb.begin()); for (; !i.atEnd(); ++i) { QTextFragment f = i.fragment(); if (f.isValid()) { int pos = f.position(); int len = f.length(); c.setPosition(pos, QTextCursor::MoveAnchor); c.setPosition(pos + len, QTextCursor::KeepAnchor); QTextCharFormat cf = c.charFormat(); QFont font = cf.font(); font.setPointSizeF(font.pointSizeF() * v); cf.setFont(font); c.setCharFormat(cf); } } cb = cb.next(); } }
void TextDocument::replaceImageUrl(const QUrl &oldName, const QString &newName) { QList <QPair<int, int> > fragments; QTextBlock block = begin(); while(block.isValid()) { QTextBlock::iterator iterator; for(iterator = block.begin(); !(iterator.atEnd()); ++iterator) { QTextFragment fragment = iterator.fragment(); if(fragment.isValid() && fragment.charFormat().isImageFormat()) { QTextImageFormat format = fragment.charFormat().toImageFormat(); if (QUrl::fromEncoded(format.name().toUtf8()) != oldName) {continue;} fragments.append(QPair<int, int>(fragment.position(), fragment.length())); } } block = block.next(); } QTextCursor cursor(this); cursor.beginEditBlock(); QPair<int, int> pair; foreach (pair, fragments) { cursor.setPosition(pair.first); cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, pair.second); QTextImageFormat format = cursor.charFormat().toImageFormat(); format.setName(newName); cursor.mergeCharFormat(format); }
virtual void visitBlock(QTextBlock &block, const QTextCursor &caret) { m_formats.clear(); m_cursors.clear(); for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QTextCursor fragmentSelection(caret); fragmentSelection.setPosition(it.fragment().position()); fragmentSelection.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor); if (fragmentSelection.anchor() >= fragmentSelection.position()) { continue; } visitFragmentSelection(fragmentSelection); } QTextCursor cursor(caret); cursor.mergeBlockFormat(m_deltaBlockFormat); cursor.mergeBlockCharFormat(m_deltaCharFormat); QList<QTextCharFormat>::Iterator it = m_formats.begin(); foreach(QTextCursor cursor, m_cursors) { cursor.setCharFormat(*it); ++it; }
void TextDocumentModel::fillBlock(const QTextBlock &block, QStandardItem *parent) { for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QStandardItem *item = new QStandardItem(tr("Fragment: %1").arg(it.fragment().text())); const QRectF b = m_document->documentLayout()->blockBoundingRect(block); appendRow(parent, item, it.fragment().charFormat(), b); } }
void ChangeFollower::processUpdates(const QList<int> &changedStyles) { KoStyleManager *sm = m_styleManager.data(); if (!sm) { // since the stylemanager would be the one calling this method, I doubt this // will ever happen. But better safe than sorry.. deleteLater(); return; } // optimization strategy; store the formatid of the formats we checked into // a qset for 'hits' and 'ignores' and avoid the copying of the format // (fragment.charFormat() / block.blockFormat()) when the formatId is // already checked previosly QTextCursor cursor(m_document); QTextBlock block = cursor.block(); while (block.isValid()) { QTextBlockFormat bf = block.blockFormat(); int id = bf.intProperty(KoParagraphStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { cursor.setPosition(block.position()); KoParagraphStyle *style = sm->paragraphStyle(id); Q_ASSERT(style); style->applyStyle(bf); cursor.setBlockFormat(bf); } QTextCharFormat cf = block.charFormat(); id = cf.intProperty(KoCharacterStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { KoCharacterStyle *style = sm->characterStyle(id); Q_ASSERT(style); style->applyStyle(block); } QTextBlock::iterator iter = block.begin(); while (! iter.atEnd()) { QTextFragment fragment = iter.fragment(); cf = fragment.charFormat(); id = cf.intProperty(KoCharacterStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { // create selection cursor.setPosition(fragment.position()); cursor.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); KoCharacterStyle *style = sm->characterStyle(id); Q_ASSERT(style); style->applyStyle(cf); cursor.mergeCharFormat(cf); } iter++; } block = block.next(); } }
void FlatTextarea::processDocumentContentsChange(int position, int charsAdded) { int32 emojiPosition = 0, emojiLen = 0; const EmojiData *emoji = 0; QTextDocument *doc(document()); while (true) { int32 start = position, end = position + charsAdded; QTextBlock from = doc->findBlock(start), till = doc->findBlock(end); if (till.isValid()) till = till.next(); for (QTextBlock b = from; b != till; b = b.next()) { for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) { QTextFragment fragment(iter.fragment()); if (!fragment.isValid()) continue; int32 fp = fragment.position(), fe = fp + fragment.length(); if (fp >= end || fe <= start) { continue; } QString t(fragment.text()); const QChar *ch = t.constData(), *e = ch + t.size(); for (; ch != e; ++ch) { emoji = emojiFromText(ch, e, emojiLen); if (emoji) { emojiPosition = fp + (ch - t.constData()); break; } if (ch + 1 < e && ch->isHighSurrogate() && (ch + 1)->isLowSurrogate()) ++ch; } if (emoji) break; } if (emoji) break; } if (emoji) { if (!document()->pageSize().isNull()) { document()->setPageSize(QSizeF(0, 0)); } QTextCursor c(doc->docHandle(), emojiPosition); c.setPosition(emojiPosition + emojiLen, QTextCursor::KeepAnchor); int32 removedUpto = c.position(); insertEmoji(emoji, c); charsAdded -= removedUpto - position; position = emojiPosition + 1; emoji = 0; emojiPosition = 0; } else { break; } } }
void OdtWriter::writeAutomaticStyles(const QTextDocument* document) { m_xml.writeStartElement(QString::fromLatin1("office:automatic-styles")); QVector<QTextFormat> formats = document->allFormats(); // Find all used styles QVector<int> text_styles; QVector<int> paragraph_styles; int index = 0; for (QTextBlock block = document->begin(); block.isValid(); block = block.next()) { index = block.blockFormatIndex(); if (!paragraph_styles.contains(index)) { int heading = block.blockFormat().property(QTextFormat::UserProperty).toInt(); if (!heading) { paragraph_styles.append(index); } else { m_styles.insert(index, QString("Heading-%1").arg(heading)); } } for (QTextBlock::iterator iter = block.begin(); !(iter.atEnd()); ++iter) { index = iter.fragment().charFormatIndex(); if (!text_styles.contains(index) && formats.at(index).propertyCount()) { text_styles.append(index); } } } // Write text styles int text_style = 1; for (int i = 0; i < text_styles.size(); ++i) { int index = text_styles.at(i); const QTextFormat& format = formats.at(index); QString name = QString::fromLatin1("T") + QString::number(text_style); if (writeTextStyle(format.toCharFormat(), name)) { m_styles.insert(index, name); ++text_style; } } // Write paragraph styles int paragraph_style = 1; for (int i = 0; i < paragraph_styles.size(); ++i) { int index = paragraph_styles.at(i); const QTextFormat& format = formats.at(index); QString name = QString::fromLatin1("P") + QString::number(paragraph_style); if (writeParagraphStyle(format.toBlockFormat(), name)) { m_styles.insert(index, name); ++paragraph_style; } else { m_styles.insert(index, "Normal"); } } m_xml.writeEndElement(); }
FontDia::FontDia(QTextCursor* cursor, QWidget* parent) : KDialog(parent), m_cursor(cursor) { //First find out if we have more than one charFormat in our selection. If so, m_initialFormat/m_style will get initialised with the charFormat at the cursor's position. The tabs will get informed of this. if (m_cursor->hasSelection()) { int begin = qMin(m_cursor->anchor(), m_cursor->position()); int end = qMax(m_cursor->anchor(), m_cursor->position()); QTextBlock block = m_cursor->block().document()->findBlock(begin); m_uniqueFormat = true; QTextCursor caret(*m_cursor); caret.setPosition(begin+1); m_initialFormat = caret.charFormat(); while (block.isValid() && block.position() < end) { QTextBlock::iterator iter = block.begin(); while (! iter.atEnd()) { QTextFragment fragment = iter.fragment(); if (fragment.position() >= end) break; if (fragment.position() + fragment.length() <= begin) { iter++; continue; } if (!(m_uniqueFormat = (fragment.charFormat() == m_initialFormat))) break; iter++; } if (!m_uniqueFormat) break; block = block.next(); } } else { m_initialFormat = cursor->charFormat(); m_uniqueFormat = true; } setCaption(i18n("Select Font")); setModal(true); setButtons(Ok | Cancel | Reset | Apply); setDefaultButton(Ok); m_characterGeneral = new CharacterGeneral(this, m_uniqueFormat); m_characterGeneral->hideStyleName(true); setMainWidget(m_characterGeneral); connect(this, SIGNAL(applyClicked()), this, SLOT(slotApply())); connect(this, SIGNAL(okClicked()), this, SLOT(slotOk())); connect(this, SIGNAL(resetClicked()), this, SLOT(slotReset())); initTabs(); }
QString FlatTextarea::getMentionHashtagBotCommandPart(bool &start) const { start = false; int32 pos = textCursor().position(); if (textCursor().anchor() != pos) return QString(); // check mention / hashtag / bot command QTextDocument *doc(document()); QTextBlock block = doc->findBlock(pos); for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { QTextFragment fr(iter.fragment()); if (!fr.isValid()) continue; int32 p = fr.position(), e = (p + fr.length()); if (p >= pos || e < pos) continue; QTextCharFormat f = fr.charFormat(); if (f.isImageFormat()) continue; bool mentionInCommand = false; QString t(fr.text()); for (int i = pos - p; i > 0; --i) { if (t.at(i - 1) == '@') { if ((pos - p - i < 1 || t.at(i).isLetter()) && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_'))) { start = (i == 1) && (p == 0); return t.mid(i - 1, pos - p - i + 1); } else if ((pos - p - i < 1 || t.at(i).isLetter()) && i > 2 && (t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_') && !mentionInCommand) { mentionInCommand = true; --i; continue; } return QString(); } else if (t.at(i - 1) == '#') { if (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_')) { start = (i == 1) && (p == 0); return t.mid(i - 1, pos - p - i + 1); } return QString(); } else if (t.at(i - 1) == '/') { if (i < 2) { start = (i == 1) && (p == 0); return t.mid(i - 1, pos - p - i + 1); } return QString(); } if (pos - p - i > 127 || (!mentionInCommand && (pos - p - i > 63))) break; if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; } break; } return QString(); }
bool FlatTextarea::hasText() const { QTextDocument *doc(document()); QTextBlock from = doc->begin(), till = doc->end(); if (from == till) return false; for (QTextBlock::Iterator iter = from.begin(); !iter.atEnd(); ++iter) { QTextFragment fragment(iter.fragment()); if (!fragment.isValid()) continue; if (!fragment.text().isEmpty()) return true; } return (from.next() != till); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; QTextDocument *document = new QTextDocument(editor); QTextCursor cursor(document); QTextImageFormat imageFormat; imageFormat.setName(":/images/advert.png"); cursor.insertImage(imageFormat); QTextBlock block = cursor.block(); QTextFragment fragment; QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { fragment = it.fragment(); if (fragment.contains(cursor.position())) break; } //! [0] if (fragment.isValid()) { QTextImageFormat newImageFormat = fragment.charFormat().toImageFormat(); if (newImageFormat.isValid()) { newImageFormat.setName(":/images/newimage.png"); QTextCursor helper = cursor; helper.setPosition(fragment.position()); helper.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); helper.setCharFormat(newImageFormat); //! [0] //! [1] } //! [1] //! [2] } //! [2] cursor.insertBlock(); cursor.insertText("Code less. Create more."); editor->setDocument(document); editor->setWindowTitle(tr("Text Document Image Format")); editor->resize(320, 480); editor->show(); return app.exec(); }
QString MercurialEditor::fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const { const QString filechangeId(QLatin1String("+++ b/")); QTextBlock::iterator iterator; for (iterator = diffFileSpec.begin(); !(iterator.atEnd()); iterator++) { QTextFragment fragment = iterator.fragment(); if(fragment.isValid()) { if (fragment.text().startsWith(filechangeId)) { const QString filename = fragment.text().remove(0, filechangeId.size()); return findDiffFile(filename, MercurialPlugin::instance()->versionControl()); } } } return QString(); }
void FlatTextarea::onMentionHashtagOrBotCommandInsert(QString str) { QTextCursor c(textCursor()); int32 pos = c.position(); QTextDocument *doc(document()); QTextBlock block = doc->findBlock(pos); for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { QTextFragment fr(iter.fragment()); if (!fr.isValid()) continue; int32 p = fr.position(), e = (p + fr.length()); if (p >= pos || e < pos) continue; QTextCharFormat f = fr.charFormat(); if (f.isImageFormat()) continue; bool mentionInCommand = false; QString t(fr.text()); for (int i = pos - p; i > 0; --i) { if (t.at(i - 1) == '@' || t.at(i - 1) == '#' || t.at(i - 1) == '/') { if ((i == pos - p || (t.at(i - 1) == '/' ? t.at(i).isLetterOrNumber() : t.at(i).isLetter()) || t.at(i - 1) == '#') && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_'))) { c.setPosition(p + i - 1, QTextCursor::MoveAnchor); int till = p + i; for (; (till < e) && (till - p - i + 1 < str.size()); ++till) { if (t.at(till - p).toLower() != str.at(till - p - i + 1).toLower()) { break; } } if (till - p - i + 1 == str.size() && till < e && t.at(till - p) == ' ') { ++till; } c.setPosition(till, QTextCursor::KeepAnchor); c.insertText(str + ' '); return; } else if ((i == pos - p || t.at(i).isLetter()) && t.at(i - 1) == '@' && i > 2 && (t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_') && !mentionInCommand) { mentionInCommand = true; --i; continue; } break; } if (pos - p - i > 127 || (!mentionInCommand && (pos - p - i > 63))) break; if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; } break; } c.insertText(str + ' '); }
/*! Replaces the entire contents of the document with the given HTML-formatted text in the \a text string */ void RichString::setHtml(const QString &text) { QTextDocument doc; doc.setHtml(text); QTextBlock block = doc.firstBlock(); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment textFragment = it.fragment(); if (textFragment.isValid()) { Format fmt; fmt.setFont(textFragment.charFormat().font()); fmt.setFontColor(textFragment.charFormat().foreground().color()); addFragment(textFragment.text(), fmt); } } }
QStringList ContactListEdit::getListOfImageNames() const { QStringList image_names; QTextBlock block = document()->begin(); while (block.isValid()) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { QTextCharFormat format = i.fragment().charFormat(); bool isImage = format.isImageFormat(); if (isImage) image_names << format.toImageFormat().name(); } block = block.next(); } return image_names; }
void FlatTextarea::onMentionOrHashtagInsert(QString mentionOrHashtag) { QTextCursor c(textCursor()); int32 pos = c.position(); QTextDocument *doc(document()); QTextBlock block = doc->findBlock(pos); for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { QTextFragment fr(iter.fragment()); if (!fr.isValid()) continue; int32 p = fr.position(), e = (p + fr.length()); if (p >= pos || e < pos) continue; QTextCharFormat f = fr.charFormat(); if (f.isImageFormat()) continue; QString t(fr.text()); for (int i = pos - p; i > 0; --i) { if (t.at(i - 1) == '@' || t.at(i - 1) == '#') { if ((i == pos - p || t.at(i).isLetter() || t.at(i - 1) == '#') && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_'))) { c.setPosition(p + i - 1, QTextCursor::MoveAnchor); int till = p + i; for (; (till < e) && (till - p - i + 1 < mentionOrHashtag.size()); ++till) { if (t.at(till - p).toLower() != mentionOrHashtag.at(till - p - i + 1).toLower()) { break; } } if (till - p - i + 1 == mentionOrHashtag.size() && till < e && t.at(till - p) == ' ') { ++till; } c.setPosition(till, QTextCursor::KeepAnchor); c.insertText(mentionOrHashtag + ' '); return; } break; } if (pos - p - i > 63) break; if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; } } c.insertText(mentionOrHashtag + ' '); }
QString TextDocumentSerializer::processBlockContent(QTextBlock block) { QTextBlock::iterator it = block.begin(); QString text; while(!it.atEnd()){ QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid()) text += processFragment(currentFragment); ++it; } if(block.textList()) return QString("<li>%1</li>").arg(text); else return QString("%1<br>").arg(text); }
FormattedMessage FormattedMessage::parse(const QTextDocument *document) { FormattedMessage result; QString text; QTextBlock block = document->firstBlock(); bool firstParagraph = true; while (block.isValid()) { bool firstFragment = true; for (QTextBlock::iterator it = block.begin(); !it.atEnd(); ++it) { QTextFragment fragment = it.fragment(); if (!fragment.isValid()) continue; if (!firstParagraph && firstFragment) text = '\n' + fragment.text(); else text = fragment.text(); QTextCharFormat format = fragment.charFormat(); parseImages(result, text, format.font().bold(), format.font().italic(), format.font().underline(), format.foreground().color()); firstFragment = false; } if (firstFragment) parseImages(result, "\n", false, false, false, QColor()); block = block.next(); firstParagraph = false; } return result; }
QString Text::extractSanitizedText(int from, int to) const { if (!doc) return ""; QString txt; QTextBlock begin = doc->findBlock(from); QTextBlock end = doc->findBlock(to); for (QTextBlock block = begin; block != end.next() && block.isValid(); block = block.next()) { for (QTextBlock::Iterator itr = block.begin(); itr != block.end(); ++itr) { int pos = itr.fragment() .position(); // fragment position -> position of the first character in the fragment if (itr.fragment().charFormat().isImageFormat()) { QTextImageFormat imgFmt = itr.fragment().charFormat().toImageFormat(); QString key = imgFmt.name(); // img key (eg. key::D for :D) QString rune = key.mid(4); if (pos >= from && pos < to) { txt += rune; ++pos; } } else { for (QChar c : itr.fragment().text()) { if (pos >= from && pos < to) txt += c; ++pos; } } } txt += '\n'; } txt.chop(1); return txt; }
void MoveViewController::selectAndMarkAnchor(const QString& link) { QTextBlock block = this->document->begin(); while(block != this->document->end()) { QTextBlock::iterator it; for(it = block.begin(); !it.atEnd(); ++it) { QTextFragment fragment = it.fragment(); if(!fragment.isValid()) { continue; } QTextCharFormat format = fragment.charFormat(); if(format.isAnchor() && format.anchorHref() == link) { QTextCursor cursor = this->textCursor(); cursor.setPosition(fragment.position()); int len = 0; bool finished = false; // we want to mark (highlight) everything from the // start of the anchor until the end of the move // the end of the move is indicated by an empty space // (there is always an empty space after a move) while(!finished && !it.atEnd()) { if(it.fragment().text().startsWith(" ") || len >= 6) { finished = true; } else { len+= it.fragment().text().length(); it++; } } cursor.setPosition(fragment.position() + len, QTextCursor::KeepAnchor); setTextCursor(cursor); ensureCursorVisible(); return; } } block = block.next(); } }
virtual void visitBlock(QTextBlock &block, const QTextCursor &caret) { for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QTextCursor fragmentSelection(caret); fragmentSelection.setPosition(it.fragment().position()); fragmentSelection.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor); if (fragmentSelection.anchor() >= fragmentSelection.position()) { continue; } visitFragmentSelection(fragmentSelection); } QList<QTextCharFormat>::Iterator it = m_formats.begin(); Q_FOREACH (QTextCursor cursor, m_cursors) { QTextFormat prevFormat(cursor.charFormat()); cursor.setCharFormat(*it); editor()->registerTrackedChange(cursor, KoGenChange::FormatChange, kundo2_i18n("Formatting"), *it, prevFormat, false); ++it; }
void FlatTextarea::getSingleEmojiFragment(QString &text, QTextFragment &fragment) const { int32 end = textCursor().position(), start = end - 1; if (textCursor().anchor() != end) return; if (start < 0) start = 0; QTextDocument *doc(document()); QTextBlock from = doc->findBlock(start), till = doc->findBlock(end); if (till.isValid()) till = till.next(); for (QTextBlock b = from; b != till; b = b.next()) { for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) { QTextFragment fr(iter.fragment()); if (!fr.isValid()) continue; int32 p = fr.position(), e = (p + fr.length()); if (p >= end || e <= start) { continue; } QTextCharFormat f = fr.charFormat(); QString t(fr.text()); if (p < start) { t = t.mid(start - p, end - start); } else if (e > end) { t = t.mid(0, end - p); } if (f.isImageFormat() && !t.isEmpty() && t.at(0).unicode() == QChar::ObjectReplacementCharacter) { QString imageName = static_cast<QTextImageFormat*>(&f)->name(); if (imageName.startsWith(QLatin1String("emoji://e."))) { fragment = fr; text = t; return; } } return; } } return; }
QString Dialog::toStringFromDocument() { QTextDocument *doc = message()->document(); QString txt; for (QTextBlock bl = doc->begin(); bl != doc->end(); bl = bl.next()) if (bl.isValid()) { for (QTextBlock::iterator it = bl.begin(); !it.atEnd(); ++it) { QTextFragment fragm = it.fragment(); if (fragm.isValid() && fragm.charFormat().isImageFormat()) { QString imgName = fragm.charFormat().toImageFormat().name(); txt += imgName; } else if (fragm.isValid()) txt += fragm.text(); } if (bl != doc->begin()) txt += "\n"; } int i = (int)txt.size() - 1; while (i >= 0 && (txt[i] == ' ' || txt[i] == '\n')) --i; txt.remove(i + 1, txt.size() - i - 1); return txt; }
void XmlWriter::processBlock(QDomElement &parent, const QTextBlock &block) { QDomElement blockElement = document->createElement("block"); blockElement.setAttribute("position", block.position()); blockElement.setAttribute("length", block.length()); parent.appendChild(blockElement); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment fragment = it.fragment(); if (fragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", fragment.length()); QDomText fragmentText = document->createTextNode(fragment.text()); fragmentElement.appendChild(fragmentText); } } }
QTextDocument* Converter::convert( const QString &fileName ) { MobiDocument* newDocument=new MobiDocument(fileName); if (!newDocument->mobi()->isValid()) { emit error(i18n("Error while opening the Mobipocket document."), -1); delete newDocument; return NULL; } if (newDocument->mobi()->hasDRM()) { emit error(i18n("This book is protected by DRM and can be displayed only on designated device"), -1); delete newDocument; return NULL; } handleMetadata(newDocument->mobi()->metadata()); newDocument->setPageSize(QSizeF(600, 800)); QTextFrameFormat frameFormat; frameFormat.setMargin( 20 ); QTextFrame *rootFrame = newDocument->rootFrame(); rootFrame->setFrameFormat( frameFormat ); QMap<QString,QPair<int,int> > links; QMap<QString,QTextBlock> targets; // go over whole document and add all <a> tags to links or targets map for (QTextBlock it = newDocument->begin(); it != newDocument->end(); it = it.next()) for (QTextBlock::iterator fit=it.begin(); !fit.atEnd(); ++fit) { QTextFragment frag=fit.fragment(); QTextCharFormat format=frag.charFormat(); if (!format.isAnchor()) continue; //link if (!format.anchorHref().isEmpty()) links[format.anchorHref()]= QPair<int,int>(frag.position(), frag.position()+frag.length()); if (!format.anchorNames().isEmpty()) { // link targets Q_FOREACH(const QString& name, format.anchorNames()) targets['#'+name]=it; } }
QString RichTextLineEdit::toSimpleHtml() const { QString html; for (QTextBlock block = document()->begin(); block.isValid(); block = block.next()) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { QTextFragment fragment = i.fragment(); if (fragment.isValid()) { QTextCharFormat format = fragment.charFormat(); QColor color = format.foreground().color(); //QString text = Qt::escape(fragment.text()); //deleted for Qt5 QString text = QString(fragment.text()).toHtmlEscaped(); //added for Qt5 QStringList tags; if (format.verticalAlignment() == QTextCharFormat::AlignSubScript) tags << "sub"; else if (format.verticalAlignment() == QTextCharFormat::AlignSuperScript) tags << "sup"; if (format.fontItalic()) tags << "i"; if (format.fontWeight() > QFont::Normal) tags << "b"; if (format.fontStrikeOut()) tags << "s"; while (!tags.isEmpty()) text = QString("<%1>%2</%1>") .arg(tags.takeFirst()).arg(text); if (color != QColor(Qt::black)) text = QString("<font color=\"%1\">%2</font>") .arg(color.name()).arg(text); html += text; } } } return html; }
QMimeData *ContactListEdit::createMimeDataFromSelection() const { //QTextEdit::createMimeDataFromSelection(); QString textMime; QMimeData *mimeData = new QMimeData (); QTextCursor cursor = textCursor(); int posStart = cursor.selectionStart(); int posEnd = cursor.selectionEnd(); QTextBlock block = this->document()->findBlock(posStart); QTextBlock endBlock = this->document()->findBlock(posEnd); endBlock = endBlock.next(); while (block.isValid() && block != endBlock) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { int position = i.fragment().position(); //qDebug() << i.fragment().position(); if (position >= posEnd) break; if (position >= posStart) { QTextCharFormat format = i.fragment().charFormat(); bool isImage = format.isImageFormat(); if (isImage) { //qDebug() << format.toImageFormat().name(); textMime += format.toImageFormat().name(); } else textMime += i.fragment().text(); } } block = block.next(); } mimeData->setText(textMime); return mimeData; }