101 auto format = table->format();
103 auto colLengths = format.columnWidthConstraints();
105 auto tableWidth = format.width();
108 if (tableWidth.type() == QTextLength::PercentageLength) {
109 sWidth = QStringLiteral(
"%1%");
110 sWidth = sWidth.arg(tableWidth.rawValue());
111 }
else if (tableWidth.type() == QTextLength::FixedLength) {
112 sWidth = QStringLiteral(
"%1");
113 sWidth = sWidth.arg(tableWidth.rawValue());
116 m_builder->beginTable(format.cellPadding(), format.cellSpacing(), sWidth);
118 auto headerRowCount = format.headerRowCount();
120 QVector<QTextTableCell> alreadyProcessedCells;
122 for (
auto row = 0; row < table->rows(); ++row) {
136 for (
auto column = 0; column < table->columns(); ++column) {
138 auto tableCell = table->cellAt(row, column);
140 auto columnSpan = tableCell.columnSpan();
141 auto rowSpan = tableCell.rowSpan();
142 if ((rowSpan > 1) || (columnSpan > 1)) {
143 if (alreadyProcessedCells.contains(tableCell)) {
147 alreadyProcessedCells.append(tableCell);
151 auto cellWidth = colLengths.at(column);
155 if (cellWidth.type() == QTextLength::PercentageLength) {
156 sCellWidth = QStringLiteral(
"%1%");
157 sCellWidth = sCellWidth.arg(cellWidth.rawValue());
158 }
else if (cellWidth.type() == QTextLength::FixedLength) {
159 sCellWidth = QStringLiteral(
"%1");
160 sCellWidth = sCellWidth.arg(cellWidth.rawValue());
164 if (row < headerRowCount) {
165 m_builder->beginTableHeaderCell(sCellWidth, columnSpan, rowSpan);
167 m_builder->beginTableCell(sCellWidth, columnSpan, rowSpan);
172 if (row < headerRowCount) {
402 const QTextBlock &_block,
403 QTextBlockGroup *blockGroup)
406 auto lastBlock = _block;
408 auto obj = block.document()->objectForFormat(block.blockFormat());
409 QTextBlockGroup *nextGroup;
412 return {lastIt, lastBlock};
414 auto group = qobject_cast<QTextBlockGroup *>(obj);
416 return {lastIt, lastBlock};
418 while (block.isValid()) {
422 block = block.next();
426 obj = block.document()->objectForFormat(block.blockFormat());
430 nextGroup = qobject_cast<QTextBlockGroup *>(obj);
432 if (group == blockGroup || !nextGroup) {
438 return {lastIt, lastBlock};
496 if (d->m_openElements.isEmpty())
502 auto remainingSize = elementsToClose.size();
503 while (!elementsToClose.isEmpty()) {
504 auto tag = d->m_openElements.last();
505 if (elementsToClose.contains(tag)) {
544 d->m_openElements.removeLast();
545 elementsToClose.remove(tag);
547 previousSize = remainingSize;
548 remainingSize = elementsToClose.size();
550 if (previousSize == remainingSize) {
558 elementsToClose.insert(d->m_openElements.last());
566 auto fragment = it.fragment();
568 if (!fragment.isValid())
571 auto fragmentFormat = fragment.charFormat();
574 Q_FOREACH (
int tag, elementsToOpenList) {
589 m_builder->beginFontPointSize(fragmentFormat.font().pointSize());
590 d->m_openFontPointSize = fragmentFormat.font().pointSize();
593 d->m_openFontFamily = fragmentFormat.fontFamilies().toStringList().first();
594 m_builder->beginFontFamily(d->m_openFontFamily);
597 m_builder->beginBackground(fragmentFormat.background());
598 d->m_openBackground = fragmentFormat.background();
601 m_builder->beginForeground(fragmentFormat.foreground());
602 d->m_openForeground = fragmentFormat.foreground();
606 auto anchorNames = fragmentFormat.anchorNames();
607 if (!anchorNames.isEmpty()) {
608 while (!anchorNames.isEmpty()) {
609 auto n = anchorNames.last();
610 anchorNames.removeLast();
611 if (anchorNames.isEmpty()) {
613 m_builder->beginAnchor(fragmentFormat.anchorHref(), n);
623 m_builder->beginAnchor(fragmentFormat.anchorHref());
625 d->m_openAnchorHref = fragmentFormat.anchorHref();
637 d->m_openElements.append(tag);
638 d->m_elementsToOpen.remove(tag);
645 QSet<int> closedElements;
649 auto elementsToClose = QSet<int>(d->m_openElements.begin(), d->m_openElements.end());
650 return elementsToClose.unite(d->m_elementsToOpen);
653 auto fragment = it.fragment();
655 if (!fragment.isValid())
656 return closedElements;
658 auto fragmentFormat = fragment.charFormat();
660 auto fontWeight = fragmentFormat.fontWeight();
661 auto fontItalic = fragmentFormat.fontItalic();
662 auto fontUnderline = fragmentFormat.fontUnderline();
663 auto fontStrikeout = fragmentFormat.fontStrikeOut();
665 auto fontForeground = fragmentFormat.foreground();
666 auto fontBackground = fragmentFormat.background();
668 const QStringList fontFamilies = fragmentFormat.fontFamilies().toStringList();
669 auto fontFamily = !fontFamilies.empty() ? fontFamilies.first() :
QString();
670 auto fontPointSize = fragmentFormat.font().pointSize();
671 auto anchorHref = fragmentFormat.anchorHref();
673 auto vAlign = fragmentFormat.verticalAlignment();
674 auto superscript = (vAlign == QTextCharFormat::AlignSuperScript);
675 auto subscript = (vAlign == QTextCharFormat::AlignSubScript);
678 && (d->m_openElements.contains(
StrikeOut)
679 || d->m_elementsToOpen.contains(
StrikeOut))) {
684 && (d->m_openElements.contains(
Underline)
685 || d->m_elementsToOpen.contains(
Underline))
686 && !(d->m_openElements.contains(
Anchor)
687 || d->m_elementsToOpen.contains(
Anchor))) {
692 && (d->m_openElements.contains(
Emph)
693 || d->m_elementsToOpen.contains(
Emph))) {
694 closedElements.insert(
Emph);
697 if (fontWeight != QFont::Bold
698 && (d->m_openElements.contains(
Strong)
699 || d->m_elementsToOpen.contains(
Strong))) {
700 closedElements.insert(
Strong);
705 && (d->m_openFontPointSize != fontPointSize)) {
711 && (d->m_openFontFamily != fontFamily)) {
716 && (d->m_openBackground != fontBackground))
718 && (d->m_backgroundToOpen != fontBackground))) {
723 && (d->m_openForeground != fontForeground))
725 && (d->m_foregroundToOpen != fontForeground))) {
729 if ((d->m_openElements.contains(
Anchor)
730 && (d->m_openAnchorHref != anchorHref))
731 || (d->m_elementsToOpen.contains(
Anchor)
732 && (d->m_anchorHrefToOpen != anchorHref))) {
733 closedElements.insert(
Anchor);
737 && (d->m_openElements.contains(
SubScript)
738 || d->m_elementsToOpen.contains(
SubScript))) {
747 return closedElements;
753 auto fragment = it.fragment();
754 if (!fragment.isValid()) {
757 auto fragmentFormat = fragment.charFormat();
759 auto fontWeight = fragmentFormat.fontWeight();
760 auto fontItalic = fragmentFormat.fontItalic();
761 auto fontUnderline = fragmentFormat.fontUnderline();
762 auto fontStrikeout = fragmentFormat.fontStrikeOut();
764 auto fontForeground = fragmentFormat.foreground();
765 auto fontBackground = fragmentFormat.background();
767 const QStringList fontFamilies = fragmentFormat.fontFamilies().toStringList();
768 auto fontFamily = !fontFamilies.empty() ? fontFamilies.first() :
QString();
769 auto fontPointSize = fragmentFormat.font().pointSize();
770 auto anchorHref = fragmentFormat.anchorHref();
772 auto vAlign = fragmentFormat.verticalAlignment();
773 auto superscript = (vAlign == QTextCharFormat::AlignSuperScript);
774 auto subscript = (vAlign == QTextCharFormat::AlignSubScript);
776 if (superscript && !(d->m_openElements.contains(
SuperScript))) {
780 if (subscript && !(d->m_openElements.contains(
SubScript))) {
784 if (!anchorHref.isEmpty() && !(d->m_openElements.contains(
Anchor))
785 && (d->m_openAnchorHref != anchorHref)) {
786 d->m_elementsToOpen.insert(
Anchor);
787 d->m_anchorHrefToOpen = anchorHref;
790 if (fontForeground != Qt::NoBrush
794 && (fontForeground != d->m_openForeground)
795 && !((d->m_openElements.contains(
797 || d->m_elementsToOpen.contains(
Anchor)))) {
799 d->m_foregroundToOpen = fontForeground;
802 if (fontBackground != Qt::NoBrush
804 && (fontBackground != d->m_openBackground)) {
806 d->m_backgroundToOpen = fontBackground;
809 if (!fontFamily.isEmpty() && !(d->m_openElements.contains(
SpanFontFamily))
810 && (fontFamily != d->m_openFontFamily)) {
812 d->m_fontFamilyToOpen = fontFamily;
815 if ((QTextCharFormat().font().pointSize()
818 && (fontPointSize != d->m_openFontPointSize)) {
820 d->m_fontPointSizeToOpen = fontPointSize;
827 if (fontWeight == QFont::Bold && !(d->m_openElements.contains(
Strong))) {
828 d->m_elementsToOpen.insert(
Strong);
831 if (fontItalic && !(d->m_openElements.contains(
Emph))) {
832 d->m_elementsToOpen.insert(
Emph);
835 if (fontUnderline && !(d->m_openElements.contains(
Underline))
836 && !(d->m_openElements.contains(
Anchor)
837 || d->m_elementsToOpen.contains(
843 if (fontStrikeout && !(d->m_openElements.contains(
StrikeOut))) {
847 if (d->m_elementsToOpen.size() <= 1) {
848 return QList<int>(d->m_elementsToOpen.begin(), d->m_elementsToOpen.end());