sw content controls, date: add ODT filter

Map the PlainText UNO property to:

	<loext:content-control loext:plain-text="...">

on export, and do the opposite on import.

Change-Id: Icec0c35b2b9fca53104e6526c98083db52df5d42
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137340
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
This commit is contained in:
Miklos Vajna 2022-07-22 08:35:10 +02:00
parent 2d1df9f3dc
commit 33cf26c8b6
9 changed files with 106 additions and 0 deletions

View File

@ -3501,6 +3501,7 @@ namespace xmloff::token {
XML_PICTURE, XML_PICTURE,
XML_DATE_FORMAT, XML_DATE_FORMAT,
XML_DATE_RFC_LANGUAGE_TAG, XML_DATE_RFC_LANGUAGE_TAG,
XML_PLAIN_TEXT,
XML_FILL_USE_SLIDE_BACKGROUND, XML_FILL_USE_SLIDE_BACKGROUND,

View File

@ -2916,6 +2916,12 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.
<rng:ref name="string"/> <rng:ref name="string"/>
</rng:attribute> </rng:attribute>
</rng:optional> </rng:optional>
<rng:optional>
<!-- default value: false -->
<rng:attribute name="loext:plain-text">
<rng:ref name="boolean"/>
</rng:attribute>
</rng:optional>
<rng:zeroOrMore> <rng:zeroOrMore>
<rng:element name="loext:list-item"> <rng:element name="loext:list-item">
<rng:attribute name="loext:display-text"> <rng:attribute name="loext:display-text">

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<office:document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
<office:body>
<office:text>
<text:p><loext:content-control loext:plain-text="true">test</loext:content-control></text:p>
</office:text>
</office:body>
</office:document>

View File

@ -796,6 +796,72 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testDateContentControlImport)
CPPUNIT_ASSERT_EQUAL(OUString("2022-05-25T00:00:00Z"), aCurrentDate); CPPUNIT_ASSERT_EQUAL(OUString("2022-05-25T00:00:00Z"), aCurrentDate);
} }
CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testPlainTextContentControlExport)
{
// Given a document with a plain text content control around a text portion:
getComponent() = loadFromDesktop("private:factory/swriter");
uno::Reference<lang::XMultiServiceFactory> xMSF(getComponent(), uno::UNO_QUERY);
uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY);
uno::Reference<text::XText> xText = xTextDocument->getText();
uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor();
xText->insertString(xCursor, "test", /*bAbsorb=*/false);
xCursor->gotoStart(/*bExpand=*/false);
xCursor->gotoEnd(/*bExpand=*/true);
uno::Reference<text::XTextContent> xContentControl(
xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
xContentControlProps->setPropertyValue("PlainText", uno::Any(true));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When exporting to ODT:
uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY);
uno::Sequence<beans::PropertyValue> aStoreProps = comphelper::InitPropertySequence({
{ "FilterName", uno::Any(OUString("writer8")) },
});
utl::TempFile aTempFile;
aTempFile.EnableKillingFile();
xStorable->storeToURL(aTempFile.GetURL(), aStoreProps);
validate(aTempFile.GetFileName(), test::ODF);
// Then make sure the expected markup is used:
std::unique_ptr<SvStream> pStream = parseExportStream(aTempFile, "content.xml");
xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
// Without the accompanying fix in place, this test would have failed with:
// - XPath '//loext:content-control' no attribute 'plain-text' exist
// i.e. the plain text content control was turned into a rich text one on export.
assertXPath(pXmlDoc, "//loext:content-control", "plain-text", "true");
}
CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testPlainTextContentControlImport)
{
// Given an ODF document with a plain-text content control:
OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "content-control-plain-text.fodt";
// When loading that document:
getComponent() = loadFromDesktop(aURL);
// Then make sure that the content control is not lost on import:
uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParagraphsAccess(xTextDocument->getText(),
uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParagraphs = xParagraphsAccess->createEnumeration();
uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(),
uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration();
uno::Reference<beans::XPropertySet> xTextPortion(xPortions->nextElement(), uno::UNO_QUERY);
OUString aPortionType;
xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType;
CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType);
uno::Reference<text::XTextContent> xContentControl;
xTextPortion->getPropertyValue("ContentControl") >>= xContentControl;
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
bool bPlainText{};
xContentControlProps->getPropertyValue("PlainText") >>= bPlainText;
// Without the accompanying fix in place, this test would have failed, the import result was a
// rich text content control (not a plain text one).
CPPUNIT_ASSERT(bPlainText);
}
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@ -3504,6 +3504,7 @@ namespace xmloff::token {
TOKEN("picture", XML_PICTURE), TOKEN("picture", XML_PICTURE),
TOKEN("date-format", XML_DATE_FORMAT), TOKEN("date-format", XML_DATE_FORMAT),
TOKEN("date-rfc-language-tag", XML_DATE_RFC_LANGUAGE_TAG), TOKEN("date-rfc-language-tag", XML_DATE_RFC_LANGUAGE_TAG),
TOKEN("plain-text", XML_PLAIN_TEXT),
TOKEN("fill-use-slide-background", XML_FILL_USE_SLIDE_BACKGROUND), TOKEN("fill-use-slide-background", XML_FILL_USE_SLIDE_BACKGROUND),

View File

@ -4008,6 +4008,15 @@ void XMLTextParagraphExport::ExportContentControl(
{ {
GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_CURRENT_DATE, aCurrentDate); GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_CURRENT_DATE, aCurrentDate);
} }
bool bPlainText = false;
xPropertySet->getPropertyValue("PlainText") >>= bPlainText;
if (bPlainText)
{
OUStringBuffer aBuffer;
sax::Converter::convertBool(aBuffer, bPlainText);
GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_PLAIN_TEXT, aBuffer.makeStringAndClear());
}
} }
SvXMLElementExport aElem(GetExport(), bExport, XML_NAMESPACE_LO_EXT, XML_CONTENT_CONTROL, false, SvXMLElementExport aElem(GetExport(), bExport, XML_NAMESPACE_LO_EXT, XML_CONTENT_CONTROL, false,

View File

@ -117,6 +117,14 @@ void XMLContentControlContext::startFastElement(
m_aCurrentDate = rIter.toString(); m_aCurrentDate = rIter.toString();
break; break;
} }
case XML_ELEMENT(LO_EXT, XML_PLAIN_TEXT):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bPlainText = bTmp;
}
break;
}
default: default:
XMLOFF_WARN_UNKNOWN("xmloff", rIter); XMLOFF_WARN_UNKNOWN("xmloff", rIter);
} }
@ -202,6 +210,11 @@ void XMLContentControlContext::endFastElement(sal_Int32)
{ {
xPropertySet->setPropertyValue("CurrentDate", uno::Any(m_aCurrentDate)); xPropertySet->setPropertyValue("CurrentDate", uno::Any(m_aCurrentDate));
} }
if (m_bPlainText)
{
xPropertySet->setPropertyValue("PlainText", uno::Any(m_bPlainText));
}
} }
css::uno::Reference<css::xml::sax::XFastContextHandler> css::uno::Reference<css::xml::sax::XFastContextHandler>

View File

@ -48,6 +48,7 @@ class XMLContentControlContext : public SvXMLImportContext
OUString m_aDateFormat; OUString m_aDateFormat;
OUString m_aDateLanguage; OUString m_aDateLanguage;
OUString m_aCurrentDate; OUString m_aCurrentDate;
bool m_bPlainText = false;
public: public:
XMLContentControlContext(SvXMLImport& rImport, sal_Int32 nElement, XMLHints_Impl& rHints, XMLContentControlContext(SvXMLImport& rImport, sal_Int32 nElement, XMLHints_Impl& rHints,

View File

@ -3247,5 +3247,6 @@ display-text
picture picture
date-format date-format
date-rfc-language-tag date-rfc-language-tag
plain-text
fill-use-slide-background fill-use-slide-background
TOKEN_END_DUMMY TOKEN_END_DUMMY