summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordante <dante19031999@gmail.com>2020-12-26 18:53:18 +0100
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-12-27 08:29:27 +0100
commit78552cb9b167a677952bf80eb0c7af62baaf015a (patch)
treef3f6a0fcd8168fc44091d258ec1b821fc017d4c8
parenta26504cb5790eff1ca8b932382f73ff3baaec50a (diff)
Preparations for customized xml entities on export
Change-Id: I8ad4af7e27ae5f8908f4c932242cb96abbf3de90 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108354 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r--include/editeng/editview.hxx2
-rw-r--r--offapi/com/sun/star/xml/sax/XWriter.idl7
-rw-r--r--sax/source/expatwrap/saxwriter.cxx44
-rw-r--r--starmath/source/mathmlexport.cxx2
-rw-r--r--starmath/source/xparsmlbase.cxx10
-rw-r--r--starmath/source/xparsmlbase.hxx10
6 files changed, 69 insertions, 6 deletions
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index ae6ebd521a2a..debc7b6efe71 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -177,7 +177,7 @@ public:
void InvalidateWindow(const tools::Rectangle& rClipRect);
void InvalidateOtherViewWindows( const tools::Rectangle& rInvRect );
void Invalidate();
- Pair Scroll( tools::Long nHorzScroll, tools::Long nVertScroll, ScrollRangeCheck nRangeCheck = ScrollRangeCheck::NoNegative );
+ ::Pair Scroll( tools::Long nHorzScroll, tools::Long nVertScroll, ScrollRangeCheck nRangeCheck = ScrollRangeCheck::NoNegative );
void SetBroadcastLOKViewCursor(bool bSet);
tools::Rectangle GetEditCursor() const;
diff --git a/offapi/com/sun/star/xml/sax/XWriter.idl b/offapi/com/sun/star/xml/sax/XWriter.idl
index a79e7b156a1a..62d3d74256af 100644
--- a/offapi/com/sun/star/xml/sax/XWriter.idl
+++ b/offapi/com/sun/star/xml/sax/XWriter.idl
@@ -21,7 +21,7 @@
#include <com/sun/star/io/XActiveDataSource.idl>
#include <com/sun/star/xml/sax/XExtendedDocumentHandler.idl>
-
+#include <com/sun/star/beans/Pair.idl>
module com { module sun { module star { module xml { module sax {
@@ -35,6 +35,11 @@ interface XWriter
{
interface com::sun::star::io::XActiveDataSource;
interface com::sun::star::xml::sax::XExtendedDocumentHandler;
+
+ /** Adds support for custom entity names list
+ * @since LibreOffice 7.2
+ */
+ void setCustomEntityNames( [in] sequence< com::sun::star::beans::Pair<string,string> > replacements );
};
diff --git a/sax/source/expatwrap/saxwriter.cxx b/sax/source/expatwrap/saxwriter.cxx
index 8566cab2b7e6..03ca1f765d82 100644
--- a/sax/source/expatwrap/saxwriter.cxx
+++ b/sax/source/expatwrap/saxwriter.cxx
@@ -22,6 +22,7 @@
#include <cassert>
#include <set>
#include <stack>
+#include <vector>
#include <com/sun/star/io/IOException.hpp>
#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
@@ -72,6 +73,17 @@ enum SaxInvalidCharacterError
SAX_ERROR
};
+// Stuff for custom entity names
+struct ReplacementPair
+{
+ OUString name;
+ OUString replacement;
+};
+inline bool operator<(const ReplacementPair& lhs, const ReplacementPair& rhs)
+{
+ return lhs.replacement.compareTo(rhs.replacement) < 0;
+}
+
class SaxWriterHelper
{
#ifdef DBG_UTIL
@@ -88,6 +100,8 @@ private:
sal_uInt32 nCurrentPos;
bool m_bStartElementFinished;
+ std::vector<ReplacementPair> m_Replacements;
+
/// @throws SAXException
sal_uInt32 writeSequence();
@@ -175,6 +189,10 @@ public:
/// @throws SAXException
void clearBuffer();
+
+ // Use custom entity names
+ void setCustomEntityNames(
+ const ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>& replacements);
};
const bool g_bValidCharsBelow32[32] =
@@ -239,6 +257,19 @@ void SaxWriterHelper::AddBytes(sal_Int8* pTarget, sal_uInt32& rPos,
AddBytes(pTarget, rPos, &pBytes[nCount], nRestCount);
}
+void SaxWriterHelper::setCustomEntityNames(
+ const ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>& replacements)
+{
+ m_Replacements.resize(replacements.size());
+ for (size_t i = 0; i < replacements.size(); ++i)
+ {
+ m_Replacements[i].name = replacements[i].First;
+ m_Replacements[i].replacement = replacements[i].Second;
+ }
+ if (replacements.size() > 1)
+ std::sort(m_Replacements.begin(), m_Replacements.end());
+}
+
/** Converts a UTF-16 string to UTF-8 and does XML normalization
@param pTarget
@@ -300,7 +331,7 @@ bool SaxWriterHelper::convertToXML( const sal_Unicode * pStr,
}
}
break;
- case 39: // 39 == '''
+ case '\'':
{
if ((rPos + 6) > SEQUENCESIZE)
AddBytes(pTarget, rPos, reinterpret_cast<sal_Int8 const *>("&apos;"), 6);
@@ -855,7 +886,7 @@ sal_Int32 calcXMLByteLength( const OUString& rStr,
case '>': // &gt;
nOutputLength +=4;
break;
- case 39: // 39 == ''', &apos;
+ case '\'': // &apos;
case '"': // &quot;
case 13: // &#x0d;
nOutputLength += 6;
@@ -988,6 +1019,9 @@ public: // XDocumentHandler
virtual void SAL_CALL processingInstruction(const OUString& aTarget,
const OUString& aData) override;
virtual void SAL_CALL setDocumentLocator(const Reference< XLocator > & xLocator) override;
+ virtual void SAL_CALL setCustomEntityNames(
+ const ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>& replacements)
+ override;
public: // XExtendedDocumentHandler
virtual void SAL_CALL startCDATA() override;
@@ -1304,6 +1338,12 @@ void SAXWriter::setDocumentLocator(const Reference< XLocator >&)
}
+void SAXWriter::setCustomEntityNames(
+ const ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>& replacements)
+{
+ m_pSaxWriterHelper->setCustomEntityNames(replacements);
+}
+
void SAXWriter::startCDATA()
{
if( ! m_bDocStarted || m_bIsCDATA)
diff --git a/starmath/source/mathmlexport.cxx b/starmath/source/mathmlexport.cxx
index 9a8f700af2ec..953bfb87f062 100644
--- a/starmath/source/mathmlexport.cxx
+++ b/starmath/source/mathmlexport.cxx
@@ -58,6 +58,7 @@
#include <stack>
#include "mathmlexport.hxx"
+#include "xparsmlbase.hxx"
#include <strings.hrc>
#include <smmod.hxx>
#include <unomodel.hxx>
@@ -240,6 +241,7 @@ bool SmXMLExportWrapper::WriteThroughComponent(const Reference<io::XOutputStream
// connect XML writer to output stream
xSaxWriter->setOutputStream(xOutputStream);
+ xSaxWriter->setCustomEntityNames(starmathdatabase::icustomMathmlHtmlEntitiesExport);
// prepare arguments (prepend doc handler to given arguments)
Sequence<Any> aArgs(2);
diff --git a/starmath/source/xparsmlbase.cxx b/starmath/source/xparsmlbase.cxx
index 4c5651ae2c55..519fab844465 100644
--- a/starmath/source/xparsmlbase.cxx
+++ b/starmath/source/xparsmlbase.cxx
@@ -2153,4 +2153,14 @@ const ::css::uno::Sequence<::css::beans::Pair<OUString, OUString>>
starmathdatabase::icustomMathmlHtmlEntities(
icustomMathmlHtmlEntitiesData, starmathdatabase::STARMATH_MATHMLHTML_ENTITY_NUMBER);
+static ::css::beans::Pair<::rtl::OUString, ::rtl::OUString>
+ icustomMathmlHtmlEntitiesNamesExportData[2] = {
+ // clang-format off
+ { u"&sigma;", u"\u03C3"},
+ { u"&infin;", u"\u221E"}
+ // clang-format on
+ };
+const ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>
+ starmathdatabase::icustomMathmlHtmlEntitiesExport(icustomMathmlHtmlEntitiesNamesExportData, 2);
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/source/xparsmlbase.hxx b/starmath/source/xparsmlbase.hxx
index 8ec7b48ccab4..83650382e31b 100644
--- a/starmath/source/xparsmlbase.hxx
+++ b/starmath/source/xparsmlbase.hxx
@@ -37,12 +37,18 @@ namespace starmathdatabase
constexpr sal_Int32 STARMATH_MATHMLHTML_ENTITY_NUMBER = 2125;
/**
- * Entity names for mathml. Example: &infin;
+ * Entity names for mathml. Example: &infin -> \u221E;
* These ones are to be used on import.
- * Must be in sync with customMathmlHtmlEntitiesNames.
*/
const extern ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>
icustomMathmlHtmlEntities;
+
+/**
+ * Entity names for mathml. Example: "\u221E"; -> &infin;
+ * These ones are to be used on file export.
+ */
+const extern ::css::uno::Sequence<::css::beans::Pair<::rtl::OUString, ::rtl::OUString>>
+ icustomMathmlHtmlEntitiesExport;
};
#endif /*XPARSEMLBASE*/