diff options
author | Vasily Melenchuk <vasily.melenchuk@cib.de> | 2021-11-24 14:50:12 +0300 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2022-02-18 08:28:43 +0100 |
commit | 461491ef170675663e9d5396c74b04b7c051d0ac (patch) | |
tree | 180ad3e6270a6c6f1b3e5b8fdd4e7a0d5e3ad0c0 /filter | |
parent | 20c7e0355ed83bfb235b1b188171d7cb4c6664c9 (diff) |
tdf#104823: support for sdt plain text fields
This is a squashed commit containing set of changes:
* Create a input field from sdt text block.
* Advanced support for reading field data from data bindings
which can point to custom xml or properties xml. For this
XOOXMLDocumentPropertiesImporter idl interface was extrended
with extra getterrs to get properties as xml dom elements.
* Support for exporting of this feature back to docx. For this
some extra parameters for sdt block are kept in newly introduced
grabbag for input fields. If field does not contain grabbag it
being exported as before (FILLIN or whatsoever), otherwise
sdt block is counstructed based on data from grabbag.
* Basic support for updating custom xml values back into
custom xmls with usage of xslt transformations. To achieve
this extra parameters were introduced to XXSLTTransformer:
now it is able to support in-memory transformation stylesheets.
* plus some follow-up clean-ups
Some unittests were corrected: since sdt plain text edit area is
a field located inside paragraph in outout corresponding sdt is
also located inside paragraph (instead of Word's approach with
paragraph inside sdt). Seems this is not critical.
Change-Id: I1a73ef300db3619804f7adf18579bea708764c14
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127015
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127284
Tested-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Fix typos
Change-Id: Ib75af11e67cadd3522c2c4b94b0549c8a96b8464
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127150
Tested-by: Julien Nabet <serval2412@yahoo.fr>
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
crashtesting: set document reference only once
For SdtHelper we need to keep valid reference to main document
(in our case first call), not to any of substreams like header,
footer, etc.
Change-Id: Id9d99c1a9bff9a3392eea4cc6e2abe774e5868d2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127672
Tested-by: Jenkins
Reviewed-by: Vasily Melenchuk <vasily.melenchuk@cib.de>
be more exact about the type of pDocument
Change-Id: Iab0d23e8ee691ac6ed3381bd7e1ee02bb59dc64f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127661
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Recent XOOXMLDocumentPropertiesImporter changes went into 7.3
Adjust @since statement to new realities
Change-Id: I8a65b4bdd2ef2ffab95f8a934ff5e5e8ffb90f03
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127282
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130043
Tested-by: Miklos Vajna <vmiklos@collabora.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/xsltfilter/LibXSLTTransformer.cxx | 26 | ||||
-rw-r--r-- | filter/source/xsltfilter/LibXSLTTransformer.hxx | 3 |
2 files changed, 26 insertions, 3 deletions
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx index 42980eeeaff7..eb715230ce43 100644 --- a/filter/source/xsltfilter/LibXSLTTransformer.cxx +++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx @@ -270,7 +270,7 @@ namespace XSLT OSL_ASSERT(m_transformer != nullptr); OSL_ASSERT(m_transformer->getInputStream().is()); OSL_ASSERT(m_transformer->getOutputStream().is()); - OSL_ASSERT(!m_transformer->getStyleSheetURL().isEmpty()); + OSL_ASSERT(!m_transformer->getStyleSheetURL().isEmpty() || !m_transformer->getStyleSheetText().isEmpty()); ::std::map<const char*, OString> pmap = m_transformer->getParameters(); ::std::vector< const char* > params( pmap.size() * 2 + 1 ); // build parameters int paramIndex = 0; @@ -283,8 +283,25 @@ namespace XSLT xmlDocPtr doc = xmlReadIO(&ParserInputBufferCallback::on_read, &ParserInputBufferCallback::on_close, static_cast<void*> (this), nullptr, nullptr, 0); - xsltStylesheetPtr styleSheet = xsltParseStylesheetFile( + xsltStylesheetPtr styleSheet = nullptr; + if (m_transformer->getStyleSheetURL().getLength()) + styleSheet = xsltParseStylesheetFile( reinterpret_cast<const xmlChar *>(m_transformer->getStyleSheetURL().getStr())); + else if (m_transformer->getStyleSheetText().getLength()) + { + xmlDocPtr styleSheetDoc = xmlReadMemory( + m_transformer->getStyleSheetText().getStr(), + m_transformer->getStyleSheetText().getLength(), + "noname.xml", nullptr, 0); + + styleSheet = xsltParseStylesheetDoc(styleSheetDoc); + } + + if (!styleSheet) + { + m_transformer->error("No stylesheet was created"); + } + xmlDocPtr result = nullptr; exsltRegisterAll(); registerExtensionModule(); @@ -329,7 +346,6 @@ namespace XSLT m_transformer->error(msg); } - closeOutput(); oh.reset(); xsltFreeStylesheet(styleSheet); xsltTransformContextPtr tcontext = nullptr; @@ -501,6 +517,10 @@ namespace XSLT { m_styleSheetURL = valueUTF8; } + if (nameUTF8 == "StylesheetText") + { + m_styleSheetText = valueUTF8; + } else if (nameUTF8 == "SourceURL") { m_parameters.insert(pair<const char*, OString> ( diff --git a/filter/source/xsltfilter/LibXSLTTransformer.hxx b/filter/source/xsltfilter/LibXSLTTransformer.hxx index d646d5dbfc43..e527e2f84113 100644 --- a/filter/source/xsltfilter/LibXSLTTransformer.hxx +++ b/filter/source/xsltfilter/LibXSLTTransformer.hxx @@ -114,6 +114,7 @@ namespace XSLT ListenerList m_listeners; OString m_styleSheetURL; + OString m_styleSheetText; ::std::map<const char *, OString> m_parameters; @@ -164,6 +165,8 @@ namespace XSLT const OString& getStyleSheetURL() const { return m_styleSheetURL; } + const OString& getStyleSheetText() const { return m_styleSheetText; } + const ::std::map<const char*, OString>& getParameters() const { return m_parameters; } |