tdf#101022 Export Greek symbol to MathML with correct mathvariant
In StarMath notation "{ital %GAMMA}" is recognized as italic, and "{nitalic %iGAMMA}" is non-italic. That is, the ital/nitalic directive takes priority over special characters' flavor. On the other hand, in MathML a mathvariant attribute given in <mi> overwrites inherited value. This does not handle "bold-italic" case etc. yet. Change-Id: I9c72dc4472f8cec553417d516d9d82aebd43d15c Reviewed-on: https://gerrit.libreoffice.org/27604 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
committed by
Caolán McNamara
parent
d1d1109fd7
commit
ff4217e9e4
89
starmath/CppunitTest_starmath_export.mk
Normal file
89
starmath/CppunitTest_starmath_export.mk
Normal file
@@ -0,0 +1,89 @@
|
||||
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||
#
|
||||
# This file is part of the LibreOffice project.
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
|
||||
$(eval $(call gb_CppunitTest_CppunitTest,starmath_export))
|
||||
|
||||
$(eval $(call gb_CppunitTest_set_include,starmath_export,\
|
||||
-I$(SRCDIR)/starmath/inc \
|
||||
$$(INCLUDE) \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_externals,starmath_export,\
|
||||
boost_headers \
|
||||
libxml2 \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_sdk_api,starmath_export))
|
||||
|
||||
$(eval $(call gb_CppunitTest_add_exception_objects,starmath_export,\
|
||||
starmath/qa/extras/mmlexport-test \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_libraries,starmath_export,\
|
||||
comphelper \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
editeng \
|
||||
i18nlangtag \
|
||||
i18nutil \
|
||||
msfilter \
|
||||
oox \
|
||||
sal \
|
||||
salhelper \
|
||||
sax \
|
||||
sfx \
|
||||
sm \
|
||||
smd \
|
||||
sot \
|
||||
svl \
|
||||
svt \
|
||||
svx \
|
||||
svxcore \
|
||||
test \
|
||||
tk \
|
||||
tl \
|
||||
unotest \
|
||||
unoxml \
|
||||
utl \
|
||||
vcl \
|
||||
xo \
|
||||
$(gb_UWINAPI) \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_ure,starmath_export))
|
||||
$(eval $(call gb_CppunitTest_use_vcl,starmath_export))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_components,starmath_export,\
|
||||
configmgr/source/configmgr \
|
||||
framework/util/fwk \
|
||||
i18npool/util/i18npool \
|
||||
package/source/xstor/xstor \
|
||||
package/util/package2 \
|
||||
sfx2/util/sfx \
|
||||
starmath/util/sm \
|
||||
starmath/util/smd \
|
||||
toolkit/util/tk \
|
||||
ucb/source/core/ucb1 \
|
||||
ucb/source/ucp/file/ucpfile1 \
|
||||
unotools/util/utl \
|
||||
comphelper/util/comphelp \
|
||||
filter/source/config/cache/filterconfig1 \
|
||||
oox/util/oox \
|
||||
sax/source/expatwrap/expwrap \
|
||||
svl/source/fsstor/fsstorage \
|
||||
svl/util/svl \
|
||||
svx/util/svx \
|
||||
unoxml/source/service/unoxml \
|
||||
uui/util/uui \
|
||||
xmloff/util/xo \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_configuration,starmath_export))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
@@ -21,6 +21,7 @@ $(eval $(call gb_Module_add_l10n_targets,starmath,\
|
||||
))
|
||||
|
||||
$(eval $(call gb_Module_add_check_targets,starmath,\
|
||||
CppunitTest_starmath_export \
|
||||
CppunitTest_starmath_import \
|
||||
CppunitTest_starmath_qa_cppunit \
|
||||
))
|
||||
|
@@ -124,7 +124,6 @@ class SM_DLLPUBLIC SmDocShell : public SfxObjectShell, public SfxListener
|
||||
virtual bool Load( SfxMedium& rMedium ) override;
|
||||
virtual bool Save() override;
|
||||
virtual bool SaveAs( SfxMedium& rMedium ) override;
|
||||
virtual bool ConvertTo( SfxMedium &rMedium ) override;
|
||||
virtual bool SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage ) override;
|
||||
|
||||
Printer *GetPrt();
|
||||
@@ -152,6 +151,11 @@ public:
|
||||
explicit SmDocShell( SfxModelFlags i_nSfxCreationFlags );
|
||||
virtual ~SmDocShell();
|
||||
|
||||
virtual bool ConvertTo( SfxMedium &rMedium ) override;
|
||||
|
||||
// For unit tests, not intended to use in other context
|
||||
void SetGreekCharStyle(sal_Int16 nVal) { maFormat.SetGreekCharStyle(nVal); }
|
||||
|
||||
static void LoadSymbols();
|
||||
static void SaveSymbols();
|
||||
|
||||
|
130
starmath/qa/extras/mmlexport-test.cxx
Normal file
130
starmath/qa/extras/mmlexport-test.cxx
Normal file
@@ -0,0 +1,130 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include <sal/config.h>
|
||||
#include <test/bootstrapfixture.hxx>
|
||||
#include <test/xmltesttools.hxx>
|
||||
#include <unotools/tempfile.hxx>
|
||||
|
||||
#include <sfx2/docfile.hxx>
|
||||
#include <sfx2/docfilt.hxx>
|
||||
#include <sfx2/sfxmodelfactory.hxx>
|
||||
|
||||
#include "document.hxx"
|
||||
#include "smdll.hxx"
|
||||
#include "node.hxx"
|
||||
#include "parse.hxx"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace ::com::sun::star;
|
||||
|
||||
typedef tools::SvRef<SmDocShell> SmDocShellRef;
|
||||
|
||||
class MathMLExportTest : public test::BootstrapFixture, public XmlTestTools
|
||||
{
|
||||
public:
|
||||
virtual void setUp() override;
|
||||
virtual void tearDown() override;
|
||||
|
||||
void testTdf101022();
|
||||
|
||||
CPPUNIT_TEST_SUITE(MathMLExportTest);
|
||||
CPPUNIT_TEST(testTdf101022);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
protected:
|
||||
virtual void registerNamespaces(xmlXPathContextPtr &pXmlXPathCtx) override;
|
||||
|
||||
private:
|
||||
xmlDocPtr exportAndParse();
|
||||
|
||||
SmDocShellRef mxDocShell;
|
||||
};
|
||||
|
||||
void MathMLExportTest::setUp()
|
||||
{
|
||||
BootstrapFixture::setUp();
|
||||
SmGlobals::ensure();
|
||||
mxDocShell = new SmDocShell(SfxModelFlags::EMBEDDED_OBJECT |
|
||||
SfxModelFlags::DISABLE_EMBEDDED_SCRIPTS |
|
||||
SfxModelFlags::DISABLE_DOCUMENT_RECOVERY);
|
||||
}
|
||||
|
||||
void MathMLExportTest::tearDown()
|
||||
{
|
||||
if (mxDocShell)
|
||||
mxDocShell->DoClose();
|
||||
BootstrapFixture::tearDown();
|
||||
}
|
||||
|
||||
void MathMLExportTest::registerNamespaces(xmlXPathContextPtr &pXmlXPathCtx)
|
||||
{
|
||||
xmlXPathRegisterNs(pXmlXPathCtx, BAD_CAST("m"), BAD_CAST("http://www.w3.org/1998/Math/MathML"));
|
||||
}
|
||||
|
||||
xmlDocPtr MathMLExportTest::exportAndParse()
|
||||
{
|
||||
utl::TempFile aTempFile;
|
||||
aTempFile.EnableKillingFile();
|
||||
SfxMedium aStoreMedium(aTempFile.GetURL(), STREAM_STD_WRITE);
|
||||
std::shared_ptr<const SfxFilter> pExportFilter = SfxFilter::GetFilterByName(MATHML_XML);
|
||||
aStoreMedium.SetFilter(pExportFilter);
|
||||
CPPUNIT_ASSERT(mxDocShell->ConvertTo(aStoreMedium));
|
||||
aStoreMedium.Commit();
|
||||
xmlDocPtr pDoc = parseXml(aTempFile);
|
||||
CPPUNIT_ASSERT(pDoc);
|
||||
return pDoc;
|
||||
}
|
||||
|
||||
void MathMLExportTest::testTdf101022()
|
||||
{
|
||||
#define CHECK_MATHVARIANT(capital, small) do \
|
||||
{ \
|
||||
mxDocShell->SetText("%GAMMA %iGAMMA {ital %GAMMA} {nitalic %iGAMMA} " \
|
||||
"%gamma %igamma {ital %gamma} {nitalic %igamma}"); \
|
||||
xmlDocPtr pDoc = exportAndParse(); \
|
||||
if (capital) \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mi[1]", "mathvariant"); \
|
||||
else \
|
||||
assertXPath(pDoc, "/m:math/m:semantics/m:mrow/m:mi[1]", "mathvariant", "normal"); \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mstyle[1]/m:mi[1]", "mathvariant"); \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mi[2]", "mathvariant"); \
|
||||
assertXPath(pDoc, "/m:math/m:semantics/m:mrow/m:mstyle[2]/m:mi[1]", "mathvariant", "normal"); \
|
||||
if (small) \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mi[3]", "mathvariant"); \
|
||||
else \
|
||||
assertXPath(pDoc, "/m:math/m:semantics/m:mrow/m:mi[3]", "mathvariant", "normal"); \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mstyle[3]/m:mi[1]", "mathvariant"); \
|
||||
assertXPathNoAttribute(pDoc, "/m:math/m:semantics/m:mrow/m:mi[4]", "mathvariant"); \
|
||||
assertXPath(pDoc, "/m:math/m:semantics/m:mrow/m:mstyle[4]/m:mi[1]", "mathvariant", "normal"); \
|
||||
mxDocShell->SetText(""); \
|
||||
} \
|
||||
while (false)
|
||||
|
||||
CHECK_MATHVARIANT(false, false); // default mode 0
|
||||
|
||||
mxDocShell->SetGreekCharStyle(1); // mode 1
|
||||
CHECK_MATHVARIANT(true, true);
|
||||
|
||||
mxDocShell->SetGreekCharStyle(2); // mode 2
|
||||
CHECK_MATHVARIANT(false, true);
|
||||
|
||||
#undef CHECK_MATHVARIANT
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(MathMLExportTest);
|
||||
|
||||
}
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -804,6 +804,13 @@ void SmXMLExport::ExportMath(const SmNode *pNode, int /*nLevel*/)
|
||||
// Export NMATH and NGLYPH_SPECIAL symbols as <mo> elements
|
||||
pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MO, true, false);
|
||||
}
|
||||
else if (pNode->GetType() == NSPECIAL)
|
||||
{
|
||||
bool bIsItalic = IsItalic(pNode->GetFont());
|
||||
if (!bIsItalic)
|
||||
AddAttribute(XML_NAMESPACE_MATH, XML_MATHVARIANT, XML_NORMAL);
|
||||
pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MI, true, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Export NMATHIDENT and NPLACE symbols as <mi> elements:
|
||||
|
Reference in New Issue
Block a user