diff options
author | Armin Le Grand <alg@apache.org> | 2014-10-10 15:52:52 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-10-13 17:31:17 +0100 |
commit | c18591107d9c856b15fa884eaed354d021ec4262 (patch) | |
tree | e26d7ca4a9d3ff026872fcef3b7805df0d4579e9 /svgio | |
parent | 4c31a0be1d8048bf3340acbb59248185e4b93041 (diff) |
Resolves: #i125325# added code to handle block comments...
in Css style definitions
(cherry picked from commit 7b071b828a5f602cc30c17ddd871a75426a53faf)
Conflicts:
svgio/source/svgreader/svgtools.cxx
Change-Id: I094228ea398686c5b39f5f279a964a2df7b00368
Diffstat (limited to 'svgio')
-rw-r--r-- | svgio/inc/svgio/svgreader/svgtools.hxx | 4 | ||||
-rw-r--r-- | svgio/source/svgreader/svgdocumenthandler.cxx | 11 | ||||
-rw-r--r-- | svgio/source/svgreader/svgtools.cxx | 51 |
3 files changed, 65 insertions, 1 deletions
diff --git a/svgio/inc/svgio/svgreader/svgtools.hxx b/svgio/inc/svgio/svgreader/svgtools.hxx index 555a075befa4..a2f194090bab 100644 --- a/svgio/inc/svgio/svgreader/svgtools.hxx +++ b/svgio/inc/svgio/svgreader/svgtools.hxx @@ -224,6 +224,10 @@ namespace svgio OUString whiteSpaceHandlingDefault(const OUString& rCandidate); OUString whiteSpaceHandlingPreserve(const OUString& rCandidate); + // #125325# removes block comment of the general form '/* ... */', returns + // an adapted string or the original if no comments included + OUString removeBlockComments(const OUString& rCandidate); + } // end of namespace svgreader } // end of namespace svgio diff --git a/svgio/source/svgreader/svgdocumenthandler.cxx b/svgio/source/svgreader/svgdocumenthandler.cxx index 1cb1a54af248..d816f5473263 100644 --- a/svgio/source/svgreader/svgdocumenthandler.cxx +++ b/svgio/source/svgreader/svgdocumenthandler.cxx @@ -519,7 +519,16 @@ namespace svgio if(maCssContents.size()) { // need to interpret css styles and remember them as StyleSheets - pCssStyle->addCssStyleSheet(*(maCssContents.end() - 1)); + // #125325# Caution! the Css content may contain block comments + // (see http://www.w3.org/wiki/CSS_basics#CSS_comments). These need + // to be removed first + const OUString aCommentFreeSource(removeBlockComments(*(maCssContents.end() - 1))); + + if(aCommentFreeSource.getLength()) + { + pCssStyle->addCssStyleSheet(aCommentFreeSource); + } + maCssContents.pop_back(); } else diff --git a/svgio/source/svgreader/svgtools.cxx b/svgio/source/svgreader/svgtools.cxx index f3faa470a679..a4d594a3d437 100644 --- a/svgio/source/svgreader/svgtools.cxx +++ b/svgio/source/svgreader/svgtools.cxx @@ -1513,6 +1513,57 @@ namespace svgio return rCandidate; } + // #i125325# + OUString removeBlockComments(const OUString& rCandidate) + { + const sal_Int32 nLen(rCandidate.getLength()); + + if(nLen) + { + sal_Int32 nPos(0); + OUStringBuffer aBuffer; + bool bChanged(false); + sal_Int32 nInsideComment(0); + const sal_Unicode aCommentSlash('/'); + const sal_Unicode aCommentStar('*'); + + while(nPos < nLen) + { + const sal_Unicode aChar(rCandidate[nPos]); + const bool bStart(aCommentSlash == aChar && nPos + 1 < nLen && aCommentStar == rCandidate[nPos + 1]); + const bool bEnd(aCommentStar == aChar && nPos + 1 < nLen && aCommentSlash == rCandidate[nPos + 1]); + + if(bStart) + { + nPos += 2; + nInsideComment++; + bChanged = true; + } + else if(bEnd) + { + nPos += 2; + nInsideComment--; + } + else + { + if(!nInsideComment) + { + aBuffer.append(aChar); + } + + nPos++; + } + } + + if(bChanged) + { + return aBuffer.makeStringAndClear(); + } + } + + return rCandidate; + } + OUString consolidateContiguosSpace(const OUString& rCandidate) { const sal_Int32 nLen(rCandidate.getLength()); |