summaryrefslogtreecommitdiff
path: root/sw/source/filter/ww8/docxattributeoutput.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/ww8/docxattributeoutput.cxx')
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx69
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 )