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,\
|
$(eval $(call gb_Module_add_check_targets,starmath,\
|
||||||
|
CppunitTest_starmath_export \
|
||||||
CppunitTest_starmath_import \
|
CppunitTest_starmath_import \
|
||||||
CppunitTest_starmath_qa_cppunit \
|
CppunitTest_starmath_qa_cppunit \
|
||||||
))
|
))
|
||||||
|
@@ -124,7 +124,6 @@ class SM_DLLPUBLIC SmDocShell : public SfxObjectShell, public SfxListener
|
|||||||
virtual bool Load( SfxMedium& rMedium ) override;
|
virtual bool Load( SfxMedium& rMedium ) override;
|
||||||
virtual bool Save() override;
|
virtual bool Save() override;
|
||||||
virtual bool SaveAs( SfxMedium& rMedium ) 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;
|
virtual bool SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage ) override;
|
||||||
|
|
||||||
Printer *GetPrt();
|
Printer *GetPrt();
|
||||||
@@ -152,6 +151,11 @@ public:
|
|||||||
explicit SmDocShell( SfxModelFlags i_nSfxCreationFlags );
|
explicit SmDocShell( SfxModelFlags i_nSfxCreationFlags );
|
||||||
virtual ~SmDocShell();
|
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 LoadSymbols();
|
||||||
static void SaveSymbols();
|
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
|
// Export NMATH and NGLYPH_SPECIAL symbols as <mo> elements
|
||||||
pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MO, true, false);
|
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
|
else
|
||||||
{
|
{
|
||||||
// Export NMATHIDENT and NPLACE symbols as <mi> elements:
|
// Export NMATHIDENT and NPLACE symbols as <mi> elements:
|
||||||
|
Reference in New Issue
Block a user