static const gchar * s_evalProperty (const PP_Property * pProp, const PP_AttrProp * pAttrProp, const PD_Document * pDoc, bool bExpandStyles) { const gchar * szValue = NULL; if (pAttrProp->getProperty (pProp->getName(), szValue)) { return szValue; } if (!bExpandStyles) return NULL; PD_Style * pStyle = _getStyle (pAttrProp, pDoc); int i = 0; while (pStyle && (i < pp_BASEDON_DEPTH_LIMIT)) { if (pStyle->getProperty (pProp->getName (), szValue)) { return szValue; } pStyle = pStyle->getBasedOn (); i++; } return NULL; }
const gchar * PP_evalProperty (const gchar * pszName, const PP_AttrProp * pSpanAttrProp, const PP_AttrProp * pBlockAttrProp, const PP_AttrProp * pSectionAttrProp, const PD_Document * pDoc, bool bExpandStyles) { // find the value for the given property // by evaluating it in the contexts given. // use the CSS inheritance as necessary. if (!pszName || !*pszName) { UT_DEBUGMSG(("PP_evalProperty: null property given\n")); return NULL; } if (pDoc == 0) bExpandStyles = false; const PP_Property * pProp = PP_lookupProperty(pszName); if (!pProp) { UT_DEBUGMSG(("PP_evalProperty: unknown property \'%s\'\n",pszName)); return NULL; } /* Not all properties can have a value of inherit, but we're not validating here. * This is not to be confused with automatic inheritance - the difference is whether * to take the default value (for when no value is specified). */ bool bInherit = false; // see if the property is on the Span item. const gchar * szValue = NULL; // TODO: ?? make lookup more efficient by tagging each property with scope (block, char, section) if (pSpanAttrProp) { szValue = s_evalProperty (pProp, pSpanAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { bInherit = false; if (pBlockAttrProp) { szValue = s_evalProperty (pProp, pBlockAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { bInherit = false; if (pSectionAttrProp) { szValue = s_evalProperty (pProp, pSectionAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { const PP_AttrProp * pDocAP = pDoc->getAttrProp (); if (pDocAP) pDocAP->getProperty (pszName, szValue); } } } } } } else if (pBlockAttrProp) { szValue = s_evalProperty (pProp, pBlockAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { bInherit = false; if (pSectionAttrProp) { szValue = s_evalProperty (pProp, pSectionAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { const PP_AttrProp * pDocAP = pDoc->getAttrProp (); if (pDocAP) pDocAP->getProperty (pszName, szValue); } } } } else if (pSectionAttrProp) { szValue = s_evalProperty (pProp, pSectionAttrProp, pDoc, bExpandStyles); if (szValue) if (strcmp (szValue, "inherit") == 0) { szValue = NULL; bInherit = true; } if ((szValue == NULL) && (bInherit || pProp->canInherit ())) { const PP_AttrProp * pDocAP = pDoc->getAttrProp (); if (pDocAP) pDocAP->getProperty (pszName, szValue); } } else { const PP_AttrProp * pDocAP = pDoc->getAttrProp (); if (pDocAP) { pDocAP->getProperty (pszName, szValue); // dom-dir requires special treatment at document level if(szValue && strcmp(pszName, "dom-dir") == 0) { if( strcmp(szValue, "logical-ltr") == 0 || strcmp(szValue, "logical-rtl") == 0) szValue += 8; } } } if (szValue) if (strcmp (szValue, "inherit") == 0) // shouldn't happen, but doesn't hurt to check szValue = NULL; if (szValue == NULL) if (bExpandStyles) { PD_Style * pStyle = 0; if (pDoc->getStyle ("Normal", &pStyle)) { /* next to last resort -- check for this property in the Normal style */ pStyle->getProperty (pszName, szValue); if (szValue) if (strcmp (szValue, "inherit") == 0) szValue = NULL; } } if(szValue == NULL && pDoc && (bInherit || pProp->canInherit ())) { // see if the doc has a value for this prop const PP_AttrProp * pAP = pDoc->getAttrProp(); if(pAP) { pAP->getProperty(pszName, szValue); } } if (szValue == NULL) szValue = pProp->getInitial (); // which may itself be NULL, but that is a bad thing - FIXME!! return szValue; }