diff options
author | Eike Rathke <erack@redhat.com> | 2013-07-23 17:17:18 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-07-23 17:18:13 +0200 |
commit | be10607d358f7587f10e76084893ceed3a4c9215 (patch) | |
tree | e47a7b8a2da7d4398157862f04522ec3feb944de | |
parent | 70e247733e762ed7b20645c8c843e78294b38f0f (diff) |
resolved fdo#67094 handle <text:s> in <text:p> and <text:span>
821521f757569c96ded6004bb2cb0d003481b55b introduced XML_SPAN but removed
handling of XML_S repeated U+0020, SPACE
Change-Id: Ic1b00c9dbc33c750b9a8cae910b4ca0bed42ab5a
-rw-r--r-- | sc/source/filter/xml/celltextparacontext.cxx | 84 | ||||
-rw-r--r-- | sc/source/filter/xml/celltextparacontext.hxx | 23 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlimprt.cxx | 19 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlimprt.hxx | 14 |
4 files changed, 138 insertions, 2 deletions
diff --git a/sc/source/filter/xml/celltextparacontext.cxx b/sc/source/filter/xml/celltextparacontext.cxx index fbbcf6f771b5..f251f110363a 100644 --- a/sc/source/filter/xml/celltextparacontext.cxx +++ b/sc/source/filter/xml/celltextparacontext.cxx @@ -12,6 +12,7 @@ #include "xmlcelli.hxx" #include "xmloff/nmspmap.hxx" +#include "comphelper/string.hxx" #include <com/sun/star/xml/sax/XAttributeList.hpp> @@ -53,6 +54,8 @@ SvXMLImportContext* ScXMLCellTextParaContext::CreateChildContext( const SvXMLTokenMap& rTokenMap = GetScImport().GetCellTextParaElemTokenMap(); switch (rTokenMap.Get(nPrefix, rLocalName)) { + case XML_TOK_CELL_TEXT_S: + return new ScXMLCellFieldSContext(GetScImport(), nPrefix, rLocalName, *this); case XML_TOK_CELL_TEXT_SPAN: return new ScXMLCellTextSpanContext(GetScImport(), nPrefix, rLocalName, *this); case XML_TOK_CELL_TEXT_SHEET_NAME: @@ -179,6 +182,12 @@ SvXMLImportContext* ScXMLCellTextSpanContext::CreateChildContext( p->SetStyleName(maStyleName); return p; } + case XML_TOK_CELL_TEXT_SPAN_ELEM_S: + { + ScXMLCellFieldSContext* p = new ScXMLCellFieldSContext(GetScImport(), nPrefix, rLocalName, mrParentCxt); + p->SetStyleName(maStyleName); + return p; + } default: ; } @@ -338,4 +347,79 @@ SvXMLImportContext* ScXMLCellFieldURLContext::CreateChildContext( 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: */ diff --git a/sc/source/filter/xml/celltextparacontext.hxx b/sc/source/filter/xml/celltextparacontext.hxx index 10e5a23f8d8f..68adaae1f4ab 100644 --- a/sc/source/filter/xml/celltextparacontext.hxx +++ b/sc/source/filter/xml/celltextparacontext.hxx @@ -134,6 +134,27 @@ public: 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 -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index ba46743b744e..3396b01b8235 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -1850,6 +1850,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextParaElemTokenMap() { 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_SHEET_NAME, XML_TOK_CELL_TEXT_SHEET_NAME }, { XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_CELL_TEXT_DATE }, @@ -1873,6 +1874,7 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextSpanElemTokenMap() { 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_A, XML_TOK_CELL_TEXT_SPAN_ELEM_URL }, + { XML_NAMESPACE_TEXT, XML_S, XML_TOK_CELL_TEXT_SPAN_ELEM_S }, XML_TOKEN_MAP_END }; @@ -1912,6 +1914,21 @@ const SvXMLTokenMap& ScXMLImport::GetCellTextURLAttrTokenMap() 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, const OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList ) @@ -2037,6 +2054,7 @@ ScXMLImport::ScXMLImport( pCellTextSpanElemTokenMap(NULL), pCellTextSpanAttrTokenMap(NULL), pCellTextURLAttrTokenMap(NULL), + pCellTextSAttrTokenMap(NULL), aTables(*this), pMyNamedExpressions(NULL), pMyLabelRanges(NULL), @@ -2178,6 +2196,7 @@ ScXMLImport::~ScXMLImport() throw() delete pCellTextSpanElemTokenMap; delete pCellTextSpanAttrTokenMap; delete pCellTextURLAttrTokenMap; + delete pCellTextSAttrTokenMap; delete pChangeTrackingImportHelper; delete pNumberFormatAttributesExportHelper; diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx index 6203b61658c6..db952dbd510f 100644 --- a/sc/source/filter/xml/xmlimprt.hxx +++ b/sc/source/filter/xml/xmlimprt.hxx @@ -690,6 +690,7 @@ enum ScXMLConsolidationAttrTokens */ enum ScXMLCellTextParaElemTokens { + XML_TOK_CELL_TEXT_S, XML_TOK_CELL_TEXT_SPAN, XML_TOK_CELL_TEXT_SHEET_NAME, XML_TOK_CELL_TEXT_DATE, @@ -705,7 +706,8 @@ enum ScXMLCellTextSpanElemTokens XML_TOK_CELL_TEXT_SPAN_ELEM_SHEET_NAME, XML_TOK_CELL_TEXT_SPAN_ELEM_DATE, 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 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 XMLShapeImportHelper; class ScXMLChangeTrackingImportHelper; @@ -894,6 +904,7 @@ class ScXMLImport: public SvXMLImport, boost::noncopyable SvXMLTokenMap *pCellTextSpanElemTokenMap; SvXMLTokenMap *pCellTextSpanAttrTokenMap; SvXMLTokenMap *pCellTextURLAttrTokenMap; + SvXMLTokenMap *pCellTextSAttrTokenMap; ScMyTables aTables; @@ -1063,6 +1074,7 @@ public: const SvXMLTokenMap& GetCellTextSpanElemTokenMap(); const SvXMLTokenMap& GetCellTextSpanAttrTokenMap(); const SvXMLTokenMap& GetCellTextURLAttrTokenMap(); + const SvXMLTokenMap& GetCellTextSAttrTokenMap(); void AddNamedExpression(ScMyNamedExpression* pMyNamedExpression) { |