diff options
Diffstat (limited to 'sw/source/filter/ww8/docxattributeoutput.cxx')
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c2776d461c89..7310e7d5f395 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -89,6 +89,7 @@ #include <editeng/charhiddenitem.hxx> #include <editeng/editobj.hxx> #include <editeng/keepitem.hxx> +#include <sax/tools/converter.hxx> #include <svx/xfillit0.hxx> #include <svx/xflgrit.hxx> #include <svx/fmglob.hxx> @@ -290,6 +291,15 @@ class FieldMarkParamsHelper return bResult; } }; + +// [ISO/IEC29500-1:2016] 17.18.50 ST_LongHexNumber (Eight Digit Hexadecimal Value) +static OUString NumberToHexBinary(sal_Int32 n) +{ + OUStringBuffer aBuf; + sax::Converter::convertNumberToHexBinary(aBuf, n); + return aBuf.makeStringAndClear(); +} + void DocxAttributeOutput::RTLAndCJKState( bool bIsRTL, sal_uInt16 /*nScript*/ ) { if (bIsRTL) @@ -379,7 +389,8 @@ static void checkAndWriteFloatingTables(DocxAttributeOutput& rDocxAttributeOutpu } } -void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo ) +sal_Int32 DocxAttributeOutput::StartParagraph(ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo, + bool bGenerateParaId) { // look ahead for floating tables that were put into a frame during import // floating tables in shapes are not supported: exclude this case @@ -468,7 +479,16 @@ void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pText // We will only know if we have to do that later. m_pSerializer->mark(Tag_StartParagraph_1); - m_pSerializer->startElementNS(XML_w, XML_p); + const char* pParaId = nullptr; + OString aParaId; + sal_Int32 nParaId = 0; + if (bGenerateParaId) + { + nParaId = m_nNextParaId++; + aParaId = OUStringToOString(NumberToHexBinary(nParaId), RTL_TEXTENCODING_UTF8); + pParaId = aParaId.getStr(); + } + m_pSerializer->startElementNS(XML_w, XML_p, FSNS(XML_w14, XML_paraId), pParaId); // postpone the output of the run (we get it before the paragraph // properties, but must write it after them) @@ -479,6 +499,8 @@ void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pText m_bParagraphOpened = true; m_bIsFirstParagraph = false; + + return nParaId; } static OString convertToOOXMLVertOrient(sal_Int16 nOrient) @@ -5794,7 +5816,7 @@ void DocxAttributeOutput::WriteOutliner(const OutlinerParaObject& rParaObj) sal_Int32 nCurrentPos = 0; sal_Int32 nEnd = aStr.getLength(); - StartParagraph(ww8::WW8TableNodeInfo::Pointer_t()); + StartParagraph(ww8::WW8TableNodeInfo::Pointer_t(), false); // Write paragraph properties. StartParagraphProperties(); @@ -7515,14 +7537,14 @@ void DocxAttributeOutput::PostitField( const SwField* pField ) else // Otherwise get a new one. nId = m_nNextAnnotationMarkId++; - m_postitFields.emplace_back(pPostItField, nId); + m_postitFields.emplace_back(pPostItField, PostItDOCXData{ nId }); } void DocxAttributeOutput::WritePostitFieldReference() { while( m_postitFieldsMaxId < m_postitFields.size()) { - OString idstr = OString::number(m_postitFields[m_postitFieldsMaxId].second); + OString idstr = OString::number(m_postitFields[m_postitFieldsMaxId].second.id); // In case this file is inside annotation marks, we want to write the // comment reference after the annotation mark is closed, not here. @@ -7534,27 +7556,39 @@ void DocxAttributeOutput::WritePostitFieldReference() } } -void DocxAttributeOutput::WritePostitFields() +DocxAttributeOutput::hasResolved DocxAttributeOutput::WritePostitFields() { - for (const auto& rPair : m_postitFields) + hasResolved eResult = hasResolved::no; + for (auto& [f, data] : m_postitFields) { - OString idstr = OString::number( rPair.second); - const SwPostItField* f = rPair.first; + OString idstr = OString::number(data.id); m_pSerializer->startElementNS( XML_w, XML_comment, FSNS( XML_w, XML_id ), idstr, FSNS( XML_w, XML_author ), f->GetPar1().toUtf8(), FSNS( XML_w, XML_date ), DateTimeToOString(f->GetDateTime()), FSNS( XML_w, XML_initials ), f->GetInitials().toUtf8() ); + const bool bNeedParaId = f->GetResolved(); + if (bNeedParaId) + eResult = hasResolved::yes; + if (f->GetTextObject() != nullptr) { // richtext - GetExport().WriteOutliner(*f->GetTextObject(), TXT_ATN); + data.lastParaId = GetExport().WriteOutliner(*f->GetTextObject(), TXT_ATN, bNeedParaId); } else { // just plain text - eg. when the field was created via the // .uno:InsertAnnotation API - m_pSerializer->startElementNS(XML_w, XML_p); + const char* pParaId = nullptr; + OString aParaId; + if (bNeedParaId) + { + data.lastParaId = m_nNextParaId++; + aParaId = OUStringToOString(NumberToHexBinary(data.lastParaId), RTL_TEXTENCODING_UTF8); + pParaId = aParaId.getStr(); + } + m_pSerializer->startElementNS(XML_w, XML_p, FSNS(XML_w14, XML_paraId), pParaId); m_pSerializer->startElementNS(XML_w, XML_r); RunText(f->GetText()); m_pSerializer->endElementNS(XML_w, XML_r); @@ -7563,6 +7597,19 @@ void DocxAttributeOutput::WritePostitFields() m_pSerializer->endElementNS( XML_w, XML_comment ); } + return eResult; +} + +void DocxAttributeOutput::WritePostItFieldsResolved() +{ + for (auto& [f, data] : m_postitFields) + { + if (!f->GetResolved()) + continue; + OString idstr = OUStringToOString(NumberToHexBinary(data.lastParaId), RTL_TEXTENCODING_UTF8); + m_pSerializer->singleElementNS(XML_w15, XML_commentEx, FSNS(XML_w15, XML_paraId), idstr, + FSNS(XML_w15, XML_done), "1"); + } } bool DocxAttributeOutput::DropdownField( const SwField* pField ) |