Author: alg
Date: Tue Jul 29 14:36:29 2014
New Revision: 1614365
URL: http://svn.apache.org/r1614365
Log:
i125293 More unified (still simple) CssStyles and solvers
Modified:
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgdocument.hxx
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstylenode.hxx
openoffice/trunk/main/svgio/source/svgreader/svgdocument.cxx
openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgstylenode.cxx
Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgdocument.hxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgdocument.hxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgdocument.hxx (original)
+++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgdocument.hxx Tue Jul 29
14:36:29 2014
@@ -71,8 +71,8 @@ namespace svgio
void removeSvgStyleAttributesFromMapper(const rtl::OUString& rStr);
/// find a style by it's Id
- bool hasSvgStyleAttributesById() const { return
!maIdStyleTokenMapperList.empty(); }
- const SvgStyleAttributes* findSvgStyleAttributesById(const
rtl::OUString& rStr) const;
+ bool hasGlobalCssStyleAttributes() const { return
!maIdStyleTokenMapperList.empty(); }
+ const SvgStyleAttributes* findGlobalCssStyleAttributes(const
rtl::OUString& rStr) const;
/// data read access
const SvgNodeVector& getSvgNodeVector() const { return maNodes; }
Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx (original)
+++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx Tue Jul 29
14:36:29 2014
@@ -129,6 +129,10 @@ namespace svgio
/// helper for filling the CssStyle vector once dependent on
mbCssStyleVectorBuilt
void fillCssStyleVector(const rtl::OUString& rClassStr);
+ void fillCssStyleVectorUsingHierarchyAndSelectors(
+ const rtl::OUString& rClassStr,
+ const SvgNode& rCurrent,
+ rtl::OUString aConcatenated);
public:
SvgNode(
Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstylenode.hxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstylenode.hxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstylenode.hxx (original)
+++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstylenode.hxx Tue Jul 29
14:36:29 2014
@@ -51,7 +51,11 @@ namespace svgio
virtual bool supportsParentStyle() const;
virtual void parseAttribute(const rtl::OUString& rTokenName,
SVGToken aSVGToken, const rtl::OUString& aContent);
- void addCssStyleSheet(const rtl::OUString& aContent);
+
+ /// CssStyleSheet add helpers
+ void addCssStyleSheet(const rtl::OUString& aSelectors, const
SvgStyleAttributes& rNewStyle);
+ void addCssStyleSheet(const rtl::OUString& aSelectors, const
rtl::OUString& aContent);
+ void addCssStyleSheet(const rtl::OUString& aSelectorsAndContent);
/// textCss access
bool isTextCss() const { return mbTextCss; }
Modified: openoffice/trunk/main/svgio/source/svgreader/svgdocument.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgdocument.cxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgdocument.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgdocument.cxx Tue Jul 29
14:36:29 2014
@@ -100,7 +100,7 @@ namespace svgio
}
}
- const SvgStyleAttributes*
SvgDocument::findSvgStyleAttributesById(const rtl::OUString& rStr) const
+ const SvgStyleAttributes*
SvgDocument::findGlobalCssStyleAttributes(const rtl::OUString& rStr) const
{
const IdStyleTokenMapper::const_iterator
aResult(maIdStyleTokenMapperList.find(rStr));
Modified: openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx Tue Jul 29
14:36:29 2014
@@ -47,102 +47,96 @@ namespace svgio
return 0;
}
- void SvgNode::fillCssStyleVector(const rtl::OUString& rClassStr)
+ void SvgNode::fillCssStyleVectorUsingHierarchyAndSelectors(
+ const rtl::OUString& rClassStr,
+ const SvgNode& rCurrent,
+ rtl::OUString aConcatenated)
{
- OSL_ENSURE(!mbCssStyleVectorBuilt, "OOps, fillCssStyleVector
called double ?!?");
- mbCssStyleVectorBuilt = true;
-
- // #125293# If we have CssStyles we need to buuild a linked list
of SvgStyleAttributes
- // which represent this for the current object. There are various
methods to
- // specify CssStyles which need to be taken into account in a
given order:
- // - local CssStyle (independent from global CssStyles at
SvgDocument)
- // - 'id' CssStyle
- // - 'class' CssStyle(s)
- // - type-dependent elements (e..g. 'rect' for all rect elements)
- // - local attributes (rOriginal)
- // - inherited attributes (up the hierarchy)
- // The first four will be collected in maCssStyleVector for the
current element
- // (once, this will not change) and be linked in the needed order
using the
- // get/setCssStyleParent at the SvgStyleAttributes which will be
used preferred in
- // member evaluation over the existing parent hierarchy
-
- // check for local CssStyle with highest priority
- if(mpLocalCssStyle)
- {
- // if we have one, use as first entry
- maCssStyleVector.push_back(mpLocalCssStyle);
- }
-
const SvgDocument& rDocument = getDocument();
- if(rDocument.hasSvgStyleAttributesById())
+ if(rDocument.hasGlobalCssStyleAttributes())
{
- // check for 'id' references
- if(getId())
+ const SvgNode* pParent = rCurrent.getParent();
+
+ // check for ID (highest priority)
+ if(rCurrent.getId())
{
- // concatenate combined style name during search for CSS
style equal to Id
- // when travelling over node parents
- rtl::OUString aConcatenatedStyleName;
- const SvgNode* pCurrent = this;
- const SvgStyleAttributes* pNew = 0;
-
- while(!pNew && pCurrent)
- {
- if(pCurrent->getId())
- {
- aConcatenatedStyleName = *pCurrent->getId() +
aConcatenatedStyleName;
- }
+ const rtl::OUString& rId = *rCurrent.getId();
+
+ if(rId.getLength())
+ {
+ const rtl::OUString aNewConcatenated(
+ rtl::OUString::createFromAscii("#") +
+ rId +
+ aConcatenated);
+
+ if(pParent)
+ {
+ // check for combined selectors at parent firstso
that higher specificity will be in front
+
fillCssStyleVectorUsingHierarchyAndSelectors(rClassStr, *pParent,
aNewConcatenated);
+ }
+
+ const SvgStyleAttributes* pNew =
rDocument.findGlobalCssStyleAttributes(aNewConcatenated);
- if(aConcatenatedStyleName.getLength())
+ if(pNew)
{
- pNew =
rDocument.findSvgStyleAttributesById(aConcatenatedStyleName);
+ // add CssStyle if found
+ maCssStyleVector.push_back(pNew);
}
-
- pCurrent = pCurrent->getParent();
}
-
- if(pNew)
- {
- maCssStyleVector.push_back(pNew);
- }
}
- // check for 'class' references
- if(getClass())
+ // check for 'class' references (a list of entries is allowed)
+ if(rCurrent.getClass())
{
- // find all referenced CSS styles (a list of entries is
allowed)
- const rtl::OUString* pClassList = getClass();
- const sal_Int32 nLen(pClassList->getLength());
- sal_Int32 nPos(0);
- const SvgStyleAttributes* pNew = 0;
+ const rtl::OUString& rClassList = *rCurrent.getClass();
+ const sal_Int32 nLen(rClassList.getLength());
- skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
-
- while(nPos < nLen)
+ if(nLen)
{
- rtl::OUStringBuffer aTokenValue;
+ std::vector< rtl::OUString > aParts;
+ sal_Int32 nPos(0);
+ rtl::OUStringBuffer aToken;
- copyToLimiter(*pClassList, sal_Unicode(' '), nPos,
aTokenValue, nLen);
- skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
+ while(nPos < nLen)
+ {
+ const sal_Int32 nInitPos(nPos);
+ copyToLimiter(rClassList, sal_Unicode(' '), nPos,
aToken, nLen);
+ skip_char(rClassList, sal_Unicode(' '), nPos,
nLen);
+ const rtl::OUString
aPart(aToken.makeStringAndClear().trim());
- rtl::OUString aId(rtl::OUString::createFromAscii("."));
- const rtl::OUString
aOUTokenValue(aTokenValue.makeStringAndClear());
+ if(aPart.getLength())
+ {
+ aParts.push_back(aPart);
+ }
- // look for CSS style common to token
- aId = aId + aOUTokenValue;
- pNew = rDocument.findSvgStyleAttributesById(aId);
+ if(nInitPos == nPos)
+ {
+ OSL_ENSURE(false, "Could not interpret on
current position (!)");
+ nPos++;
+ }
+ }
- if(!pNew && rClassStr.getLength())
+ for(sal_uInt32 a(0); a < aParts.size(); a++)
{
- // look for CSS style common to class.token
- aId = rClassStr + aId;
+ const rtl::OUString aNewConcatenated(
+ rtl::OUString::createFromAscii(".") +
+ aParts[a] +
+ aConcatenated);
- pNew = rDocument.findSvgStyleAttributesById(aId);
- }
+ if(pParent)
+ {
+ // check for combined selectors at parent
firstso that higher specificity will be in front
+
fillCssStyleVectorUsingHierarchyAndSelectors(rClassStr, *pParent,
aNewConcatenated);
+ }
- if(pNew)
- {
- maCssStyleVector.push_back(pNew);
+ const SvgStyleAttributes* pNew =
rDocument.findGlobalCssStyleAttributes(aNewConcatenated);
+
+ if(pNew)
+ {
+ // add CssStyle if found
+ maCssStyleVector.push_back(pNew);
+ }
}
}
}
@@ -150,17 +144,65 @@ namespace svgio
// check for class-dependent references to CssStyles
if(rClassStr.getLength())
{
- // search for CSS style equal to class type
- const SvgStyleAttributes* pNew =
rDocument.findSvgStyleAttributesById(rClassStr);
+ rtl::OUString aNewConcatenated(aConcatenated);
- if(pNew)
+ if(!rCurrent.getId() && !rCurrent.getClass() && 0 ==
aConcatenated.indexOf(rClassStr))
{
- maCssStyleVector.push_back(pNew);
+ // no new CssStyle Selector and already starts with
rClassStr, do not concatenate;
+ // we pass an 'empty' node (in the sense of CssStyle
Selector)
+ }
+ else
+ {
+ aNewConcatenated = rClassStr + aConcatenated;
+ }
+
+ if(pParent)
+ {
+ // check for combined selectors at parent firstso that
higher specificity will be in front
+
fillCssStyleVectorUsingHierarchyAndSelectors(rClassStr, *pParent,
aNewConcatenated);
}
+
+ const SvgStyleAttributes* pNew =
rDocument.findGlobalCssStyleAttributes(aNewConcatenated);
+
+ if(pNew)
+ {
+ // add CssStyle if found
+ maCssStyleVector.push_back(pNew);
+ }
}
}
}
+ void SvgNode::fillCssStyleVector(const rtl::OUString& rClassStr)
+ {
+ OSL_ENSURE(!mbCssStyleVectorBuilt, "OOps, fillCssStyleVector
called double ?!?");
+ mbCssStyleVectorBuilt = true;
+
+ // #125293# If we have CssStyles we need to buuild a linked list
of SvgStyleAttributes
+ // which represent this for the current object. There are various
methods to
+ // specify CssStyles which need to be taken into account in a
given order:
+ // - local CssStyle (independent from global CssStyles at
SvgDocument)
+ // - 'id' CssStyle
+ // - 'class' CssStyle(s)
+ // - type-dependent elements (e..g. 'rect' for all rect elements)
+ // - local attributes (rOriginal)
+ // - inherited attributes (up the hierarchy)
+ // The first four will be collected in maCssStyleVector for the
current element
+ // (once, this will not change) and be linked in the needed order
using the
+ // get/setCssStyleParent at the SvgStyleAttributes which will be
used preferred in
+ // member evaluation over the existing parent hierarchy
+
+ // check for local CssStyle with highest priority
+ if(mpLocalCssStyle)
+ {
+ // if we have one, use as first entry
+ maCssStyleVector.push_back(mpLocalCssStyle);
+ }
+
+ // check the hierarchy for concatenated patterns of Selectors
+ fillCssStyleVectorUsingHierarchyAndSelectors(rClassStr, *this,
rtl::OUString());
+ }
+
const SvgStyleAttributes* SvgNode::checkForCssStyle(const
rtl::OUString& rClassStr, const SvgStyleAttributes& rOriginal) const
{
if(!mbCssStyleVectorBuilt)
Modified: openoffice/trunk/main/svgio/source/svgreader/svgstylenode.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgstylenode.cxx?rev=1614365&r1=1614364&r2=1614365&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgstylenode.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgstylenode.cxx Tue Jul 29
14:36:29 2014
@@ -90,74 +90,140 @@ namespace svgio
}
}
- void SvgStyleNode::addCssStyleSheet(const rtl::OUString& aContent)
+ void SvgStyleNode::addCssStyleSheet(const rtl::OUString& aSelectors,
const SvgStyleAttributes& rNewStyle)
{
- const sal_Int32 nLen(aContent.getLength());
-
- if(nLen)
+ // aSelectors: CssStyle selectors, any combination, no comma
separations, no spaces at start/end
+ // rNewStyle: the already preapared style to register on that name
+ if(aSelectors.getLength())
{
+ std::vector< rtl::OUString > aSelectorParts;
+ const sal_Int32 nLen(aSelectors.getLength());
sal_Int32 nPos(0);
- rtl::OUStringBuffer aTokenValue;
+ rtl::OUStringBuffer aToken;
+ // split into single tokens (currently only space separator)
while(nPos < nLen)
{
- // read the full style node names (may be multiple) and
put to aStyleName
const sal_Int32 nInitPos(nPos);
- skip_char(aContent, sal_Unicode(' '), nPos, nLen);
- copyToLimiter(aContent, sal_Unicode('{'), nPos,
aTokenValue, nLen);
- skip_char(aContent, sal_Unicode(' '), sal_Unicode('{'),
nPos, nLen);
+ copyToLimiter(aSelectors, sal_Unicode(' '), nPos, aToken,
nLen);
+ skip_char(aSelectors, sal_Unicode(' '), nPos, nLen);
+ const rtl::OUString
aSelectorPart(aToken.makeStringAndClear().trim());
+
+ if(aSelectorPart.getLength())
+ {
+ aSelectorParts.push_back(aSelectorPart);
+ }
+
+ if(nInitPos == nPos)
+ {
+ OSL_ENSURE(false, "Could not interpret on current
position (!)");
+ nPos++;
+ }
+ }
- const rtl::OUString
aStyleName(aTokenValue.makeStringAndClear().trim());
- const sal_Int32 nLen2(aStyleName.getLength());
- std::vector< rtl::OUString > aStyleNames;
+ if(aSelectorParts.size())
+ {
+ rtl::OUString aConcatenatedSelector;
- if(nLen2)
+ // re-combine without spaces, create a unique name (for
now)
+ for(sal_uInt32 a(0); a < aSelectorParts.size(); a++)
{
- // extract names
- sal_Int32 nPos2(0);
- rtl::OUStringBuffer aSingleName;
+ aConcatenatedSelector += aSelectorParts[a];
+ }
+
+ // CssStyles in SVG are currently not completely
supported; the current idea for
+ // supporting the needed minimal set is to register
CssStyles associated to a string
+ // which is just the space-char cleaned, concatenated
Selectors. The part to 'match'
+ // these is in
fillCssStyleVectorUsingHierarchyAndSelectors. There, the same string is
+ // built up using the priorities of local CssStyle, Id,
Class and other info combined
+ // with the existing hierarchy. This creates a
specificity- and priority-sorted local
+ // list for each node which is then chained using
get/setCssStyleParent.
+ // The current solution is capable of solving
space-separated selectors which can be
+ // mixed between Id, Class and type specifiers.
+ // When CssStyles need more specific solving, the start
point is here; remember the
+ // needed infos not in maIdStyleTokenMapperList at the
document, but select evtl.
+ // more specific infos there in a class capable of
handling more complex matchings.
+ // Additionally fillCssStyleVector (or the mechanism above
that when a linked list of
+ // SvgStyleAttributes will not do it) will have to be
adapted to make use of it.
+
+ // register new style at document for (evtl. concatenated)
stylename
+ const_cast< SvgDocument&
>(getDocument()).addSvgStyleAttributesToMapper(aConcatenatedSelector,
rNewStyle);
+ }
+ }
+ }
+
+ void SvgStyleNode::addCssStyleSheet(const rtl::OUString& aSelectors,
const rtl::OUString& aContent)
+ {
+ // aSelectors: possible comma-separated list of CssStyle
definitions, no spaces at start/end
+ // aContent: the svg style definitions as string
+ if(aSelectors.getLength() && aContent.getLength())
+ {
+ // create new style and add to local list (for ownership
control)
+ SvgStyleAttributes* pNewStyle = new SvgStyleAttributes(*this);
+ maSvgStyleAttributes.push_back(pNewStyle);
+
+ // fill with content
+ pNewStyle->readStyle(aContent);
+
+ // comma-separated split (Css abbreviation for same style for
multiple selectors)
+ const sal_Int32 nLen(aSelectors.getLength());
+ sal_Int32 nPos(0);
+ rtl::OUStringBuffer aToken;
- while(nPos2 < nLen2)
- {
- skip_char(aStyleName, sal_Unicode('#'), nPos2,
nLen2);
- copyToLimiter(aStyleName, sal_Unicode(' '), nPos2,
aSingleName, nLen2);
- skip_char(aStyleName, sal_Unicode(' '), nPos2,
nLen2);
+ while(nPos < nLen)
+ {
+ const sal_Int32 nInitPos(nPos);
+ copyToLimiter(aSelectors, sal_Unicode(','), nPos, aToken,
nLen);
+ skip_char(aSelectors, sal_Unicode(' '), sal_Unicode(','),
nPos, nLen);
- const rtl::OUString
aOUSingleName(aSingleName.makeStringAndClear().trim());
+ const rtl::OUString
aSingleName(aToken.makeStringAndClear().trim());
- if(aOUSingleName.getLength())
- {
- aStyleNames.push_back(aOUSingleName);
- }
- }
+ if(aSingleName.getLength())
+ {
+ addCssStyleSheet(aSingleName, *pNewStyle);
}
- if(aStyleNames.size() && nPos < nLen)
+ if(nInitPos == nPos)
{
- copyToLimiter(aContent, sal_Unicode('}'), nPos,
aTokenValue, nLen);
- skip_char(aContent, sal_Unicode(' '),
sal_Unicode('}'), nPos, nLen);
- const rtl::OUString
aStyleContent(aTokenValue.makeStringAndClear().trim());
+ OSL_ENSURE(false, "Could not interpret on current
position (!)");
+ nPos++;
+ }
+ }
+ }
+ }
- if(aStyleContent.getLength())
- {
- // create new style
- SvgStyleAttributes* pNewStyle = new
SvgStyleAttributes(*this);
- maSvgStyleAttributes.push_back(pNewStyle);
+ void SvgStyleNode::addCssStyleSheet(const rtl::OUString&
aSelectorsAndContent)
+ {
+ const sal_Int32 nLen(aSelectorsAndContent.getLength());
+
+ if(nLen)
+ {
+ sal_Int32 nPos(0);
+ rtl::OUStringBuffer aToken;
+
+ while(nPos < nLen)
+ {
+ // read the full selectors (may be multiple,
comma-separated)
+ const sal_Int32 nInitPos(nPos);
+ skip_char(aSelectorsAndContent, sal_Unicode(' '), nPos,
nLen);
+ copyToLimiter(aSelectorsAndContent, sal_Unicode('{'),
nPos, aToken, nLen);
+ skip_char(aSelectorsAndContent, sal_Unicode(' '),
sal_Unicode('{'), nPos, nLen);
- // fill with content
- pNewStyle->readStyle(aStyleContent);
+ const rtl::OUString
aSelectors(aToken.makeStringAndClear().trim());
+ rtl::OUString aContent;
- // concatenate combined style name
- rtl::OUString aConcatenatedStyleName;
+ if(aSelectors.getLength() && nPos < nLen)
+ {
+ // isolate content as text, embraced by '{' and '}'
+ copyToLimiter(aSelectorsAndContent, sal_Unicode('}'),
nPos, aToken, nLen);
+ skip_char(aSelectorsAndContent, sal_Unicode(' '),
sal_Unicode('}'), nPos, nLen);
- for(sal_uInt32 a(0); a < aStyleNames.size(); a++)
- {
- aConcatenatedStyleName += aStyleNames[a];
- }
+ aContent = aToken.makeStringAndClear().trim();
+ }
- // register new style at document for (evtl.
concatenated) stylename
- const_cast< SvgDocument&
>(getDocument()).addSvgStyleAttributesToMapper(aConcatenatedStyleName,
*pNewStyle);
- }
+ if(aSelectors.getLength() && aContent.getLength())
+ {
+ addCssStyleSheet(aSelectors, aContent);
}
if(nInitPos == nPos)