Kaydet (Commit) be10607d authored tarafından Eike Rathke's avatar Eike Rathke

resolved fdo#67094 handle <text:s> in <text:p> and <text:span>

821521f7 introduced XML_SPAN but removed
handling of XML_S repeated U+0020, SPACE

Change-Id: Ic1b00c9dbc33c750b9a8cae910b4ca0bed42ab5a
üst 70e24773
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "xmlcelli.hxx" #include "xmlcelli.hxx"
#include "xmloff/nmspmap.hxx" #include "xmloff/nmspmap.hxx"
#include "comphelper/string.hxx"
#include <com/sun/star/xml/sax/XAttributeList.hpp> #include <com/sun/star/xml/sax/XAttributeList.hpp>
...@@ -53,6 +54,8 @@ SvXMLImportContext* ScXMLCellTextParaContext::CreateChildContext( ...@@ -53,6 +54,8 @@ SvXMLImportContext* ScXMLCellTextParaContext::CreateChildContext(
const SvXMLTokenMap& rTokenMap = GetScImport().GetCellTextParaElemTokenMap(); const SvXMLTokenMap& rTokenMap = GetScImport().GetCellTextParaElemTokenMap();
switch (rTokenMap.Get(nPrefix, rLocalName)) switch (rTokenMap.Get(nPrefix, rLocalName))
{ {
case XML_TOK_CELL_TEXT_S:
return new ScXMLCellFieldSContext(GetScImport(), nPrefix, rLocalName, *this);
case XML_TOK_CELL_TEXT_SPAN: case XML_TOK_CELL_TEXT_SPAN:
return new ScXMLCellTextSpanContext(GetScImport(), nPrefix, rLocalName, *this); return new ScXMLCellTextSpanContext(GetScImport(), nPrefix, rLocalName, *this);
case XML_TOK_CELL_TEXT_SHEET_NAME: case XML_TOK_CELL_TEXT_SHEET_NAME:
...@@ -179,6 +182,12 @@ SvXMLImportContext* ScXMLCellTextSpanContext::CreateChildContext( ...@@ -179,6 +182,12 @@ SvXMLImportContext* ScXMLCellTextSpanContext::CreateChildContext(
p->SetStyleName(maStyleName); p->SetStyleName(maStyleName);
return p; return p;
} }
case XML_TOK_CELL_TEXT_SPAN_ELEM_S:
{
ScXMLCellFieldSContext* p = new ScXMLCellFieldSContext(GetScImport(), nPrefix, rLocalName, mrParentCxt);
p->SetStyleName(maStyleName);
return p;
}
default: default:
; ;
} }
...@@ -338,4 +347,79 @@ SvXMLImportContext* ScXMLCellFieldURLContext::CreateChildContext( ...@@ -338,4 +347,79 @@ SvXMLImportContext* ScXMLCellFieldURLContext::CreateChildContext(
return new SvXMLImportContext(GetImport(), nPrefix, rLocalName); return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
} }
ScXMLCellFieldSContext::ScXMLCellFieldSContext(
ScXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLName, ScXMLCellTextParaContext& rParent) :
ScXMLImportContext(rImport, nPrefix, rLName),
mrParentCxt(rParent),
mnCount(1)
{
}
void ScXMLCellFieldSContext::SetStyleName(const OUString& rStyleName)
{
maStyleName = rStyleName;
}
void ScXMLCellFieldSContext::StartElement(const uno::Reference<xml::sax::XAttributeList>& xAttrList)
{
if (!xAttrList.is())
return;
OUString aLocalName;
sal_Int16 nAttrCount = xAttrList->getLength();
const SvXMLTokenMap& rTokenMap = GetScImport().GetCellTextSAttrTokenMap();
for (sal_Int16 i = 0; i < nAttrCount; ++i)
{
sal_uInt16 nAttrPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
xAttrList->getNameByIndex(i), &aLocalName);
const OUString& rAttrValue = xAttrList->getValueByIndex(i);
sal_uInt16 nToken = rTokenMap.Get(nAttrPrefix, aLocalName);
switch (nToken)
{
case XML_TOK_CELL_TEXT_S_ATTR_C:
mnCount = rAttrValue.toInt32();
if (mnCount <= 0)
mnCount = 1; // worth a warning?
break;
default:
;
}
}
}
void ScXMLCellFieldSContext::EndElement()
{
if (mnCount)
PushSpaces();
}
SvXMLImportContext* ScXMLCellFieldSContext::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& /*xAttrList*/)
{
// <text:s> does not have child elements, but ...
if (mnCount)
{
PushSpaces();
}
return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
}
void ScXMLCellFieldSContext::PushSpaces()
{
if (mnCount > 0)
{
if (mnCount == 1)
mrParentCxt.PushSpan(" ", maStyleName);
else
{
OUStringBuffer aBuf( mnCount);
comphelper::string::padToLength( aBuf, mnCount, ' ');
mrParentCxt.PushSpan( aBuf.makeStringAndClear(), maStyleName);
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -134,6 +134,27 @@ public: ...@@ -134,6 +134,27 @@ public:
sal_uInt16 nPrefix, const OUString& rLocalName, const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList>& xAttrList); sal_uInt16 nPrefix, const OUString& rLocalName, const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList>& xAttrList);
}; };
/**
* This context handles <text:s> element inside <text:p> or <text:span>.
*/
class ScXMLCellFieldSContext : public ScXMLImportContext
{
ScXMLCellTextParaContext& mrParentCxt;
OUString maStyleName;
sal_Int32 mnCount;
void PushSpaces();
public:
ScXMLCellFieldSContext(ScXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLName, ScXMLCellTextParaContext& rParent);
void SetStyleName(const OUString& rStyleName);
virtual void StartElement(const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList>& xAttrList);
virtual void EndElement();
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName, const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList>& xAttrList);
};
#endif #endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
...@@ -1850,6 +1850,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextParaElemTokenMap() ...@@ -1850,6 +1850,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextParaElemTokenMap()
{ {
static const SvXMLTokenMapEntry aMap[] = static const SvXMLTokenMapEntry aMap[] =
{ {
{ XML_NAMESPACE_TEXT, XML_S, XML_TOK_CELL_TEXT_S },
{ XML_NAMESPACE_TEXT, XML_SPAN, XML_TOK_CELL_TEXT_SPAN }, { XML_NAMESPACE_TEXT, XML_SPAN, XML_TOK_CELL_TEXT_SPAN },
{ XML_NAMESPACE_TEXT, XML_SHEET_NAME, XML_TOK_CELL_TEXT_SHEET_NAME }, { XML_NAMESPACE_TEXT, XML_SHEET_NAME, XML_TOK_CELL_TEXT_SHEET_NAME },
{ XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_CELL_TEXT_DATE }, { XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_CELL_TEXT_DATE },
...@@ -1873,6 +1874,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextSpanElemTokenMap() ...@@ -1873,6 +1874,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextSpanElemTokenMap()
{ XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_CELL_TEXT_SPAN_ELEM_DATE }, { XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_CELL_TEXT_SPAN_ELEM_DATE },
{ XML_NAMESPACE_TEXT, XML_TITLE, XML_TOK_CELL_TEXT_SPAN_ELEM_TITLE }, { XML_NAMESPACE_TEXT, XML_TITLE, XML_TOK_CELL_TEXT_SPAN_ELEM_TITLE },
{ XML_NAMESPACE_TEXT, XML_A, XML_TOK_CELL_TEXT_SPAN_ELEM_URL }, { XML_NAMESPACE_TEXT, XML_A, XML_TOK_CELL_TEXT_SPAN_ELEM_URL },
{ XML_NAMESPACE_TEXT, XML_S, XML_TOK_CELL_TEXT_SPAN_ELEM_S },
XML_TOKEN_MAP_END XML_TOKEN_MAP_END
}; };
...@@ -1912,6 +1914,21 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextURLAttrTokenMap() ...@@ -1912,6 +1914,21 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextURLAttrTokenMap()
return *pCellTextURLAttrTokenMap; return *pCellTextURLAttrTokenMap;
} }
const SvXMLTokenMap& ScXMLImport::GetCellTextSAttrTokenMap()
{
if (!pCellTextSAttrTokenMap)
{
static const SvXMLTokenMapEntry aMap[] =
{
{ XML_NAMESPACE_TEXT, XML_C, XML_TOK_CELL_TEXT_S_ATTR_C },
XML_TOKEN_MAP_END
};
pCellTextSAttrTokenMap = new SvXMLTokenMap(aMap);
}
return *pCellTextSAttrTokenMap;
}
SvXMLImportContext *ScXMLImport::CreateContext( sal_uInt16 nPrefix, SvXMLImportContext *ScXMLImport::CreateContext( sal_uInt16 nPrefix,
const OUString& rLocalName, const OUString& rLocalName,
const uno::Reference<xml::sax::XAttributeList>& xAttrList ) const uno::Reference<xml::sax::XAttributeList>& xAttrList )
...@@ -2037,6 +2054,7 @@ ScXMLImport::ScXMLImport( ...@@ -2037,6 +2054,7 @@ ScXMLImport::ScXMLImport(
pCellTextSpanElemTokenMap(NULL), pCellTextSpanElemTokenMap(NULL),
pCellTextSpanAttrTokenMap(NULL), pCellTextSpanAttrTokenMap(NULL),
pCellTextURLAttrTokenMap(NULL), pCellTextURLAttrTokenMap(NULL),
pCellTextSAttrTokenMap(NULL),
aTables(*this), aTables(*this),
pMyNamedExpressions(NULL), pMyNamedExpressions(NULL),
pMyLabelRanges(NULL), pMyLabelRanges(NULL),
...@@ -2178,6 +2196,7 @@ ScXMLImport::~ScXMLImport() throw() ...@@ -2178,6 +2196,7 @@ ScXMLImport::~ScXMLImport() throw()
delete pCellTextSpanElemTokenMap; delete pCellTextSpanElemTokenMap;
delete pCellTextSpanAttrTokenMap; delete pCellTextSpanAttrTokenMap;
delete pCellTextURLAttrTokenMap; delete pCellTextURLAttrTokenMap;
delete pCellTextSAttrTokenMap;
delete pChangeTrackingImportHelper; delete pChangeTrackingImportHelper;
delete pNumberFormatAttributesExportHelper; delete pNumberFormatAttributesExportHelper;
......
...@@ -690,6 +690,7 @@ enum ScXMLConsolidationAttrTokens ...@@ -690,6 +690,7 @@ enum ScXMLConsolidationAttrTokens
*/ */
enum ScXMLCellTextParaElemTokens enum ScXMLCellTextParaElemTokens
{ {
XML_TOK_CELL_TEXT_S,
XML_TOK_CELL_TEXT_SPAN, XML_TOK_CELL_TEXT_SPAN,
XML_TOK_CELL_TEXT_SHEET_NAME, XML_TOK_CELL_TEXT_SHEET_NAME,
XML_TOK_CELL_TEXT_DATE, XML_TOK_CELL_TEXT_DATE,
...@@ -705,7 +706,8 @@ enum ScXMLCellTextSpanElemTokens ...@@ -705,7 +706,8 @@ enum ScXMLCellTextSpanElemTokens
XML_TOK_CELL_TEXT_SPAN_ELEM_SHEET_NAME, XML_TOK_CELL_TEXT_SPAN_ELEM_SHEET_NAME,
XML_TOK_CELL_TEXT_SPAN_ELEM_DATE, XML_TOK_CELL_TEXT_SPAN_ELEM_DATE,
XML_TOK_CELL_TEXT_SPAN_ELEM_TITLE, XML_TOK_CELL_TEXT_SPAN_ELEM_TITLE,
XML_TOK_CELL_TEXT_SPAN_ELEM_URL XML_TOK_CELL_TEXT_SPAN_ELEM_URL,
XML_TOK_CELL_TEXT_SPAN_ELEM_S
}; };
/** /**
...@@ -722,6 +724,14 @@ enum ScXMLCellTextURLAttrTokens ...@@ -722,6 +724,14 @@ enum ScXMLCellTextURLAttrTokens
XML_TOK_CELL_TEXT_URL_ATTR_TYPE, XML_TOK_CELL_TEXT_URL_ATTR_TYPE,
}; };
/**
* Tokens for attributes for <text:s>
*/
enum ScXMLCellTextSAttrTokens
{
XML_TOK_CELL_TEXT_S_ATTR_C
};
class SvXMLTokenMap; class SvXMLTokenMap;
class XMLShapeImportHelper; class XMLShapeImportHelper;
class ScXMLChangeTrackingImportHelper; class ScXMLChangeTrackingImportHelper;
...@@ -894,6 +904,7 @@ class ScXMLImport: public SvXMLImport, boost::noncopyable ...@@ -894,6 +904,7 @@ class ScXMLImport: public SvXMLImport, boost::noncopyable
SvXMLTokenMap *pCellTextSpanElemTokenMap; SvXMLTokenMap *pCellTextSpanElemTokenMap;
SvXMLTokenMap *pCellTextSpanAttrTokenMap; SvXMLTokenMap *pCellTextSpanAttrTokenMap;
SvXMLTokenMap *pCellTextURLAttrTokenMap; SvXMLTokenMap *pCellTextURLAttrTokenMap;
SvXMLTokenMap *pCellTextSAttrTokenMap;
ScMyTables aTables; ScMyTables aTables;
...@@ -1063,6 +1074,7 @@ public: ...@@ -1063,6 +1074,7 @@ public:
const SvXMLTokenMap& GetCellTextSpanElemTokenMap(); const SvXMLTokenMap& GetCellTextSpanElemTokenMap();
const SvXMLTokenMap& GetCellTextSpanAttrTokenMap(); const SvXMLTokenMap& GetCellTextSpanAttrTokenMap();
const SvXMLTokenMap& GetCellTextURLAttrTokenMap(); const SvXMLTokenMap& GetCellTextURLAttrTokenMap();
const SvXMLTokenMap& GetCellTextSAttrTokenMap();
void AddNamedExpression(ScMyNamedExpression* pMyNamedExpression) void AddNamedExpression(ScMyNamedExpression* pMyNamedExpression)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment