void OXMLi_ListenerState_Styles::endElement (OXMLi_EndElementRequest * rqst) { UT_return_if_fail( _error_if_fail(rqst != NULL) ); if (nameMatches(rqst->pName, NS_W_KEY, "docDefaults") || nameMatches(rqst->pName, NS_W_KEY, "style")) { UT_return_if_fail(_error_if_fail(m_pCurrentStyle != NULL)); OXML_Document * doc = OXML_Document::getInstance(); UT_return_if_fail( _error_if_fail(doc != NULL) ); OXML_SharedStyle styl(m_pCurrentStyle); doc->addStyle(styl); m_pCurrentStyle = NULL; rqst->handled = true; } else if (nameMatches(rqst->pName, NS_W_KEY, "rPr") || nameMatches(rqst->pName, NS_W_KEY, "pPr") || nameMatches(rqst->pName, NS_W_KEY, "tblPr") || nameMatches(rqst->pName, NS_W_KEY, "trPr") || nameMatches(rqst->pName, NS_W_KEY, "tcPr")) { //Retrieve the formatting collected by the Common listener state. OXML_SharedElement dummy = rqst->stck->top(); const gchar ** props = dummy->getProperties(); if (props != NULL) { //Pass the retrieved properties to a new style object UT_return_if_fail(_error_if_fail(UT_OK == m_pCurrentStyle->appendProperties(props))); } rqst->stck->pop(); rqst->handled = !nameMatches(rqst->pName, NS_W_KEY, "tblPr") && !nameMatches(rqst->pName, NS_W_KEY, "trPr") && !nameMatches(rqst->pName, NS_W_KEY, "tcPr"); } }
void OXMLi_ListenerState_Footnote::endElement (OXMLi_EndElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "footnotes")) { rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "footnote")) { if(rqst->sect_stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedSection sect = rqst->sect_stck->top(); rqst->sect_stck->pop(); OXML_Document* pDoc = OXML_Document::getInstance(); if(pDoc) { if(pDoc->addFootnote(sect) != UT_OK) return; } rqst->handled = true; } }
void OXMLi_ListenerState_HdrFtr::startElement (OXMLi_StartElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "hdr") || nameMatches(rqst->pName, NS_W_KEY, "ftr")) { OXML_SharedElement dummy(new OXML_Element("", P_TAG, BLOCK)); rqst->stck->push(dummy); rqst->handled = true; } }
void OXMLi_ListenerState_Textbox::endElement (OXMLi_EndElementRequest * rqst) { if(nameMatches(rqst->pName, NS_V_KEY, "shape")) { m_style = ""; rqst->handled = true; } else if(nameMatches(rqst->pName, NS_V_KEY, "textbox")) { rqst->handled = (_flushTopLevel(rqst->stck, rqst->sect_stck) == UT_OK); } else if(nameMatches(rqst->pName, NS_W_KEY, "txbxContent")) { rqst->handled = true; } }
void OXMLi_ListenerState_DocSettings::startElement (OXMLi_StartElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "themeFontLang")) { const gchar * val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); const gchar * eastAsia = attrMatches(NS_W_KEY, "eastAsia", rqst->ppAtts); const gchar * bidi = attrMatches(NS_W_KEY, "bidi", rqst->ppAtts); OXML_Document * doc = OXML_Document::getInstance(); UT_return_if_fail( this->_error_if_fail(doc != NULL) ); OXML_SharedFontManager fmgr = doc->getFontManager(); UT_return_if_fail( this->_error_if_fail(fmgr.get() != NULL) ); if (val != NULL) { std::string val_str = _convert_ST_LANG(val); fmgr->mapRangeToScript(ASCII_RANGE, val_str); fmgr->mapRangeToScript(HANSI_RANGE, val_str); } if (eastAsia != NULL) { std::string eastAsia_str = _convert_ST_LANG(eastAsia); fmgr->mapRangeToScript(EASTASIAN_RANGE, eastAsia_str); } if (bidi != NULL) { std::string bidi_str = _convert_ST_LANG(bidi); fmgr->mapRangeToScript(COMPLEX_RANGE, bidi_str); } rqst->handled = true; } }
void OXMLi_ListenerState_Footnote::startElement (OXMLi_StartElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "footnotes")) { rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "footnote")) { const gchar* id = attrMatches(NS_W_KEY, "id", rqst->ppAtts); if(id) { OXML_SharedSection sect(new OXML_Section(id)); rqst->sect_stck->push(sect); } rqst->handled = true; } }
/* Determine whether the name matches with the search specification according to OS/2's meta-character rules. !!! Time complexity is probably exponential in the worst case. */ static BOOL nameMatches(char * pszExp, char * pszName) { switch (*pszExp) { case 0: while (*pszName == '.') pszName++; return !*pszName; case '*': return (*pszName && nameMatches(pszExp, pszName + 1)) || nameMatches(pszExp + 1, pszName); case '?': return (!*pszName) || ((*pszName == '.') && nameMatches(pszExp + 1, pszName)) || ((*pszName != '.') && nameMatches(pszExp + 1, pszName + 1)); case '.': return ((!*pszName) && nameMatches(pszExp + 1, pszName)) || ((*pszName == '.') && nameMatches(pszExp + 1, pszName + 1)); default: return (tolower(*pszExp) == tolower(*pszName)) && nameMatches(pszExp + 1, pszName + 1); } }
void OXMLi_ListenerState_HdrFtr::endElement (OXMLi_EndElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "hdr") || nameMatches(rqst->pName, NS_W_KEY, "ftr")) { OXML_SharedSection s(new OXML_Section(m_partId)); if(!rqst->stck->empty()) { OXML_SharedElement container = rqst->stck->top(); s->setChildren( container->getChildren() ); } OXML_Document * doc = OXML_Document::getInstance(); UT_return_if_fail( this->_error_if_fail(doc != NULL) ); if (nameMatches(rqst->pName, NS_W_KEY, "hdr")) doc->addHeader(s); else doc->addFooter(s); rqst->handled = true; } }
/* Check whether the directory entry matches the search criteria. */ static BOOL entryMatches(SearchData * pSearchData, IsoDirEntry * pEntry) { if ((pEntry->flFlags & CDF_HIDDEN) && !(pSearchData->flAttr & FILE_HIDDEN)) return FALSE; if (!(pEntry->flFlags & CDF_HIDDEN) && (pSearchData->flAttr & (FILE_HIDDEN << 8))) return FALSE; if (!(pSearchData->flAttr & FILE_NON83) && hasNon83Name((char *) pEntry->chrName)) return FALSE; return nameMatches(pSearchData->szName, (char *) pEntry->chrName); }
void OXMLi_ListenerState_Textbox::startElement (OXMLi_StartElementRequest * rqst) { if(nameMatches(rqst->pName, NS_V_KEY, "shape")) { const gchar* style = attrMatches(NS_V_KEY, "style", rqst->ppAtts); if(style) { m_style = style; } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_V_KEY, "textbox")) { OXML_SharedElement textboxElem(new OXML_Element_TextBox("")); if(m_style.compare("")) { //parse and apply style here std::string attrName(""); std::string attrValue(""); size_t attrStart = 0; size_t attrEnd = 0; while(attrStart < m_style.length()) { attrEnd = m_style.find(';', attrStart); if(attrEnd == std::string::npos) { //this should be the last attribute attrEnd = m_style.length(); } std::string attrNameValPair = m_style.substr(attrStart, attrEnd-attrStart); size_t seperator = attrNameValPair.find(':'); if(seperator != std::string::npos) { attrName = attrNameValPair.substr(0, seperator); attrValue = attrNameValPair.substr(seperator+1); //convert and apply attributes here if(!attrName.compare("width")) { textboxElem->setProperty("frame-width", attrValue); } else if(!attrName.compare("height")) { textboxElem->setProperty("frame-height", attrValue); } //TODO: more attributes coming } //finally update the start point for the next attribute attrStart = attrEnd+1; } } rqst->stck->push(textboxElem); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "txbxContent")) { rqst->handled = true; } }
void OXMLi_ListenerState_Numbering::startElement (OXMLi_StartElementRequest * rqst) { if ( nameMatches(rqst->pName, NS_W_KEY, "numbering") || nameMatches(rqst->pName, NS_W_KEY, "multiLevelType") || nameMatches(rqst->pName, NS_W_KEY, "name") || nameMatches(rqst->pName, NS_W_KEY, "nsid") || nameMatches(rqst->pName, NS_W_KEY, "numStyleLink") || nameMatches(rqst->pName, NS_W_KEY, "styleLink") || nameMatches(rqst->pName, NS_W_KEY, "tmpl") || nameMatches(rqst->pName, NS_W_KEY, "isLgl") || nameMatches(rqst->pName, NS_W_KEY, "legacy") || nameMatches(rqst->pName, NS_W_KEY, "lvlJc") || nameMatches(rqst->pName, NS_W_KEY, "lvlPicBulletId") || nameMatches(rqst->pName, NS_W_KEY, "lvlRestart") || nameMatches(rqst->pName, NS_W_KEY, "suff") ) { //TODO: add functionality here rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "abstractNum")) { const gchar* abstractNumId = attrMatches(NS_W_KEY, "abstractNumId", rqst->ppAtts); if(abstractNumId) { m_parentListId = std::string("1"); m_parentListId += abstractNumId; } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "lvl")) { const gchar* ilvl = attrMatches(NS_W_KEY, "ilvl", rqst->ppAtts); if(ilvl) { handleLevel(ilvl); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "start")) { const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && m_currentList) { m_currentList->setStartValue(atoi(val)); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "numFmt")) { const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val) { handleFormattingType(val); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "lvlText")) { const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && m_currentList) { std::string delim(val); m_currentList->setDelim(delim); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "num")) { const gchar* numId = attrMatches(NS_W_KEY, "numId", rqst->ppAtts); if(numId) { m_currentNumId = std::string(numId); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "abstractNumId")) { const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && !m_currentNumId.empty()) { std::string abstractNumId("1"); //starts at 10 instead of zero abstractNumId += val; OXML_Document* doc = OXML_Document::getInstance(); if(doc) doc->setMappedNumberingId(m_currentNumId, abstractNumId); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "pPr")) { //insert a dummy paragraph element to stack //so that we can collect the properties from common listener OXML_SharedElement dummy(new OXML_Element_Paragraph("")); rqst->stck->push(dummy); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "rPr")) { OXML_SharedElement dummy(new OXML_Element_Run("")); rqst->stck->push(dummy); rqst->handled = true; } }
void OXMLi_ListenerState_Numbering::endElement (OXMLi_EndElementRequest * rqst) { if ( nameMatches(rqst->pName, NS_W_KEY, "numbering") || nameMatches(rqst->pName, NS_W_KEY, "abstractNum") || nameMatches(rqst->pName, NS_W_KEY, "multiLevelType") || nameMatches(rqst->pName, NS_W_KEY, "name") || nameMatches(rqst->pName, NS_W_KEY, "nsid") || nameMatches(rqst->pName, NS_W_KEY, "numStyleLink") || nameMatches(rqst->pName, NS_W_KEY, "styleLink") || nameMatches(rqst->pName, NS_W_KEY, "tmpl") || nameMatches(rqst->pName, NS_W_KEY, "isLgl") || nameMatches(rqst->pName, NS_W_KEY, "legacy") || nameMatches(rqst->pName, NS_W_KEY, "lvlJc") || nameMatches(rqst->pName, NS_W_KEY, "lvlPicBulletId") || nameMatches(rqst->pName, NS_W_KEY, "lvlRestart") || nameMatches(rqst->pName, NS_W_KEY, "lvlText") || nameMatches(rqst->pName, NS_W_KEY, "numFmt") || nameMatches(rqst->pName, NS_W_KEY, "start") || nameMatches(rqst->pName, NS_W_KEY, "suff") || nameMatches(rqst->pName, NS_W_KEY, "abstractNumId") ) { //TODO: add functionality here rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "lvl")) { OXML_Document * doc = OXML_Document::getInstance(); if(!doc) { doc = OXML_Document::getNewInstance(); } OXML_SharedList sharedList(m_currentList); doc->addList(sharedList); m_currentList = NULL; rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "num")) { m_currentNumId.clear(); //set it to empty string rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "pPr") || nameMatches(rqst->pName, NS_W_KEY, "rPr")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement dummy = rqst->stck->top(); if(m_currentList) { m_currentList->setAttributes(dummy->getAttributes()); m_currentList->setProperties(dummy->getProperties()); } rqst->stck->pop(); //remove the dummy element rqst->handled = true; } }
void OXMLi_ListenerState_DocSettings::endElement (OXMLi_EndElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "themeFontLang")) { rqst->handled = true; } }
void OXMLi_ListenerState_Table::startElement (OXMLi_StartElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "tbl")) { OXML_Element_Table* pTable = new OXML_Element_Table(""); m_tableStack.push(pTable); OXML_SharedElement table(pTable); rqst->stck->push(table); rqst->handled = true; pTable->setCurrentRowNumber(-1); pTable->setCurrentColNumber(-1); } else if(nameMatches(rqst->pName, NS_W_KEY, "tr")) { if(m_tableStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); OXML_Element_Row* pRow = new OXML_Element_Row("", table); m_rowStack.push(pRow); OXML_SharedElement row(pRow); rqst->stck->push(row); rqst->handled = true; table->incrementCurrentRowNumber(); table->setCurrentColNumber(0); pRow->setRowNumber(table->getCurrentRowNumber()); } else if(nameMatches(rqst->pName, NS_W_KEY, "tc")) { if(m_tableStack.empty() || m_rowStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); OXML_Element_Row* row = m_rowStack.top(); OXML_Element_Cell* pCell = new OXML_Element_Cell("", table, row, table->getCurrentColNumber(), table->getCurrentColNumber()+1, //left right table->getCurrentRowNumber(), table->getCurrentRowNumber()+1); //top,bottom m_cellStack.push(pCell); OXML_SharedElement cell(pCell); rqst->stck->push(cell); rqst->handled = true; table->incrementCurrentColNumber(); } else if(nameMatches(rqst->pName, NS_W_KEY, "gridSpan")) { if(m_tableStack.empty() || m_cellStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val) { int span = atoi(val); int left = table->getCurrentColNumber()-1; int right = left + span; //change current cell's right index OXML_Element_Cell* cell = m_cellStack.top(); cell->setRight(right); //update column index of current table table->setCurrentColNumber(right); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "vMerge")) { if(m_cellStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Cell* cell = m_cellStack.top(); cell->setVerticalMergeStart(false); //default to continue if the attribute is missing const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && !strcmp(val, "restart")) { cell->setVerticalMergeStart(true); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "hMerge")) { if(m_cellStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Cell* cell = m_cellStack.top(); cell->setHorizontalMergeStart(false); //default to continue if the attribute is missing const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && !strcmp(val, "restart")) { cell->setHorizontalMergeStart(true); } rqst->handled = true; } //Table Properties else if(nameMatches(rqst->pName, NS_W_KEY, "gridCol") && contextMatches(rqst->context->back(), NS_W_KEY, "tblGrid")) { if(m_tableStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); const gchar* w = attrMatches(NS_W_KEY, "w", rqst->ppAtts); if(w) { //append this width to table-column-props property const gchar* tableColumnProps = NULL; UT_Error ret = table->getProperty("table-column-props", tableColumnProps); if((ret != UT_OK) || !tableColumnProps) tableColumnProps = ""; std::string cols(tableColumnProps); cols += _TwipsToPoints(w); cols += "pt/"; ret = table->setProperty("table-column-props", cols); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set table-column-props:%s\n", cols.c_str())); } } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "trHeight") && contextMatches(rqst->context->back(), NS_W_KEY, "trPr")) { if(m_tableStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val) { const gchar* tableRowHeights = NULL; UT_Error ret = table->getProperty("table-row-heights", tableRowHeights); if((ret != UT_OK) || !tableRowHeights) tableRowHeights = ""; std::string rowHeights(tableRowHeights); rowHeights += _TwipsToPoints(val); rowHeights += "pt/"; ret = table->setProperty("table-row-heights", rowHeights); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set table-row-heights:%s\n", rowHeights.c_str())); } } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "left") || nameMatches(rqst->pName, NS_W_KEY, "right") || nameMatches(rqst->pName, NS_W_KEY, "top") || nameMatches(rqst->pName, NS_W_KEY, "bottom")) { rqst->handled = true; const gchar* color = attrMatches(NS_W_KEY, "color", rqst->ppAtts); const gchar* sz = attrMatches(NS_W_KEY, "sz", rqst->ppAtts); const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); UT_Error ret = UT_OK; std::string borderName(rqst->pName); borderName = borderName.substr(strlen(NS_W_KEY)+1); if(!borderName.compare("bottom")) borderName = "bot"; std::string borderStyle = borderName + "-style"; std::string borderColor = borderName + "-color"; std::string borderThickness = borderName + "-thickness"; OXML_Element* element = NULL; if(rqst->context->empty()) { rqst->handled = false; rqst->valid = false; return; } if(contextMatches(rqst->context->back(), NS_W_KEY, "tcBorders")) element = m_cellStack.empty() ? NULL : m_cellStack.top(); else if(contextMatches(rqst->context->back(), NS_W_KEY, "tblBorders")) element = m_tableStack.empty() ? NULL : m_tableStack.top(); if(!element) { rqst->handled = false; rqst->valid = false; return; } if(color && strcmp(color, "auto")) { ret = element->setProperty(borderColor, color); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set %s:%s\n", borderColor.c_str(), color)); } } if(sz) { std::string szVal(_EighthPointsToPoints(sz)); szVal += "pt"; ret = element->setProperty(borderThickness, szVal); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set %s:%s\n", borderThickness.c_str(), color)); } } std::string styleValue = "1"; //single line border by default if(val) { if(!strcmp(val, "dashed")) styleValue = "0"; } ret = element->setProperty(borderStyle, styleValue); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set %s:0\n", borderStyle.c_str())); } } else if(nameMatches(rqst->pName, NS_W_KEY, "shd")) { const gchar* fill = attrMatches(NS_W_KEY, "fill", rqst->ppAtts); UT_Error ret = UT_OK; OXML_Element* element = NULL; if(rqst->context->empty()) { rqst->handled = false; rqst->valid = false; return; } if(contextMatches(rqst->context->back(), NS_W_KEY, "tcPr")) element = m_cellStack.empty() ? NULL : m_cellStack.top(); else if(contextMatches(rqst->context->back(), NS_W_KEY, "tblPr")) element = m_tableStack.empty() ? NULL : m_tableStack.top(); if(!element) { rqst->handled = false; rqst->valid = false; return; } if(fill && strcmp(fill, "auto")) { ret = element->setProperty("background-color", fill); if(ret != UT_OK) { UT_DEBUGMSG(("FRT:OpenXML importer can't set background-color:%s\n", fill)); } } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tblStyle")) { if(m_tableStack.empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_Element_Table* table = m_tableStack.top(); const gchar* val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); if(val && table) { std::string styleName(val); OXML_Document* doc = OXML_Document::getInstance(); if(doc) table->applyStyle(doc->getStyleById(styleName)); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tblPr")) { if(m_tableStack.empty()) { //we must be in tblStyle in styles, so let's push the table instance to m_tableStack OXML_Element_Table* tbl = static_cast<OXML_Element_Table*>(get_pointer(rqst->stck->top())); m_tableStack.push(tbl); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "trPr")) { if(m_rowStack.empty()) { //we must be in styles, so let's push the row instance to m_rowStack OXML_Element_Row* row = static_cast<OXML_Element_Row*>(get_pointer(rqst->stck->top())); m_rowStack.push(row); } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tcPr")) { if(m_cellStack.empty()) { //we must be in styles, so let's push the cell instance to m_cellStack OXML_Element_Cell* cell = static_cast<OXML_Element_Cell*>(get_pointer(rqst->stck->top())); m_cellStack.push(cell); } rqst->handled = true; } //TODO: more coming here }
void OXMLi_ListenerState_Table::endElement (OXMLi_EndElementRequest * rqst) { if (nameMatches(rqst->pName, NS_W_KEY, "tbl")) { if(m_tableStack.empty() || rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement table = rqst->stck->top(); rqst->stck->pop(); //pop table if(rqst->stck->empty()) { OXML_SharedSection last = rqst->sect_stck->top(); last->appendElement(table); } else { OXML_SharedElement container = rqst->stck->top(); container->appendElement(table); } m_tableStack.pop(); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tr")) { if(m_rowStack.empty() || (rqst->stck->size() < 2)) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement row = rqst->stck->top(); rqst->stck->pop(); //pop row OXML_SharedElement table = rqst->stck->top(); table->appendElement(row); m_rowStack.pop(); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tc")) { if(m_tableStack.empty() || m_cellStack.empty() || (rqst->stck->size() < 2)) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement cell = rqst->stck->top(); rqst->stck->pop(); //pop cell OXML_SharedElement row = rqst->stck->top(); OXML_Element_Cell* pCell = m_cellStack.top(); if(!pCell->startsHorizontalMerge() && !pCell->startsVerticalMerge()) { //do nothing in this case } else if(!pCell->startsVerticalMerge()) { OXML_Element_Table* table = m_tableStack.top(); if(!table->incrementBottomVerticalMergeStart(pCell)) { //this means there is no cell before this starting a vertical merge //revert back to vertical merge start instead of continue pCell->setVerticalMergeStart(true); UT_DEBUGMSG(("FRT:OpenXML importer, invalid <vMerge val=continue> attribute.\n")); } } else if(!pCell->startsHorizontalMerge()) { OXML_Element_Table* table = m_tableStack.top(); if(!table->incrementRightHorizontalMergeStart(pCell)) { //this means there is no cell before this starting a horizontal merge //revert back to horizontal merge start instead of continue pCell->setHorizontalMergeStart(true); UT_DEBUGMSG(("FRT:OpenXML importer, invalid <hMerge val=continue> attribute.\n")); } } else //(pCell->startsHorizontalMerge() && pCell->startsVerticalMerge()) { OXML_Element_Row* pRow = m_rowStack.top(); row->appendElement(cell); } m_cellStack.pop(); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "gridSpan") || nameMatches(rqst->pName, NS_W_KEY, "vMerge") || nameMatches(rqst->pName, NS_W_KEY, "hMerge") || nameMatches(rqst->pName, NS_W_KEY, "gridCol") || nameMatches(rqst->pName, NS_W_KEY, "trHeight") || nameMatches(rqst->pName, NS_W_KEY, "left") || nameMatches(rqst->pName, NS_W_KEY, "right") || nameMatches(rqst->pName, NS_W_KEY, "top") || nameMatches(rqst->pName, NS_W_KEY, "bottom") || nameMatches(rqst->pName, NS_W_KEY, "tblStyle")) { rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tblPr")) { if(!rqst->context->empty() && !contextMatches(rqst->context->back(), NS_W_KEY, "tbl") && !m_tableStack.empty()) { m_tableStack.pop(); //pop the dummy table } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "trPr")) { if(!rqst->context->empty() && !contextMatches(rqst->context->back(), NS_W_KEY, "tr") && !m_rowStack.empty()) { m_rowStack.pop(); //pop the dummy row } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "tcPr")) { if(!rqst->context->empty() && !contextMatches(rqst->context->back(), NS_W_KEY, "tc") && !m_cellStack.empty()) { m_cellStack.pop(); //pop the dummy cell } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_W_KEY, "shd")) { std::string contextTag = rqst->context->empty() ? "" : rqst->context->back(); rqst->handled = contextMatches(contextTag, NS_W_KEY, "tcPr") || contextMatches(contextTag, NS_W_KEY, "tblPr"); } //TODO: more coming here }
bool XMLElement::nextSibling(const std::string &targetNodeName) { while (nextSibling() && !nameMatches(targetNodeName)); return isValid(); }
void OXMLi_ListenerState_Image::startElement (OXMLi_StartElementRequest * rqst) { if(nameMatches(rqst->pName, NS_W_KEY, "object")) { // Abiword doesn't support embedded objects, enable this boolean lock when needed m_isEmbeddedObject = true; rqst->handled = true; } if(m_isEmbeddedObject) { return; } if(nameMatches(rqst->pName, NS_W_KEY, "drawing")) { OXML_SharedElement imgElem(new OXML_Element_Image("")); rqst->stck->push(imgElem); rqst->handled = true; } else if(nameMatches(rqst->pName, NS_WP_KEY, "inline")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } std::string contextTag = ""; if(!rqst->context->empty()) { contextTag = rqst->context->back(); } int drawing = contextMatches(contextTag, NS_W_KEY, "drawing"); if(drawing) { m_isInlineImage = true; rqst->handled = true; } } else if(nameMatches(rqst->pName, NS_WP_KEY, "anchor")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } std::string contextTag = ""; if(!rqst->context->empty()) { contextTag = rqst->context->back(); } int drawing = contextMatches(contextTag, NS_W_KEY, "drawing"); if(drawing) { m_isInlineImage = false; rqst->handled = true; } } else if(nameMatches(rqst->pName, NS_WP_KEY, "positionH")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } std::string contextTag = ""; if(!rqst->context->empty()) { contextTag = rqst->context->back(); } int anchor = contextMatches(contextTag, NS_WP_KEY, "anchor"); if(anchor) { rqst->handled = true; } } else if(nameMatches(rqst->pName, NS_WP_KEY, "positionV")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } std::string contextTag = ""; if(!rqst->context->empty()) { contextTag = rqst->context->back(); } int anchor = contextMatches(contextTag, NS_WP_KEY, "anchor"); if(anchor) { rqst->handled = true; } } else if(nameMatches(rqst->pName, NS_WP_KEY, "posOffset")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } std::string contextTag = ""; if(!rqst->context->empty()) { contextTag = rqst->context->back(); } int positionH = contextMatches(contextTag, NS_WP_KEY, "positionH"); int positionV = contextMatches(contextTag, NS_WP_KEY, "positionV"); if(positionH || positionV) { rqst->handled = true; } } else if(nameMatches(rqst->pName, NS_WP_KEY, "extent")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement imgElem = rqst->stck->top(); if(!imgElem) return; const gchar * cx = attrMatches(NS_WP_KEY, "cx", rqst->ppAtts); //width if(cx) { std::string width(_EmusToInches(cx)); width += "in"; if(m_isInlineImage) { if(imgElem->setProperty("width", width) != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer inline image width property can't be set\n")); } } else { if(imgElem->setProperty("frame-width", width) != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer positioned image width property can't be set\n")); } } } const gchar * cy = attrMatches(NS_WP_KEY, "cy", rqst->ppAtts); //height if(cy) { std::string height(_EmusToInches(cy)); height += "in"; if(m_isInlineImage) { if(imgElem->setProperty("height", height) != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer inline image height property can't be set\n")); } } else { if(imgElem->setProperty("frame-height", height) != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer positioned image height property can't be set\n")); } } } rqst->handled = true; } else if(nameMatches(rqst->pName, NS_WP_KEY, "wrapSquare")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement imgElem = rqst->stck->top(); if(!imgElem) return; const gchar * wrapText = attrMatches(NS_WP_KEY, "wrapText", rqst->ppAtts); if(wrapText) { if(!strcmp(wrapText, "bothSides")) { if(imgElem->setProperty("wrap-mode", "wrapped-both") != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer image wrap-mode property can't be set\n")); } } else if(!strcmp(wrapText, "right")) { if(imgElem->setProperty("wrap-mode", "wrapped-to-right") != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer image wrap-mode property can't be set\n")); } } else if(!strcmp(wrapText, "left")) { if(imgElem->setProperty("wrap-mode", "wrapped-to-left") != UT_OK) { UT_DEBUGMSG(("SERHAT:OpenXML importer image wrap-mode property can't be set\n")); } } } rqst->handled = true; } else if (nameMatches(rqst->pName, NS_A_KEY, "blip")) { if(rqst->stck->empty()) { rqst->handled = false; rqst->valid = false; return; } OXML_SharedElement imgElem = rqst->stck->top(); if(!imgElem) return; const gchar * id = attrMatches(NS_R_KEY, "embed", rqst->ppAtts); if(id) { std::string imageId(id); imgElem->setId(id); rqst->handled = addImage(imageId); } } else if(nameMatches(rqst->pName, NS_V_KEY, "shape")) { const gchar* style = attrMatches(NS_V_KEY, "style", rqst->ppAtts); if(style) { m_style = style; } //don't handle the request here in case shape contains some other structure, ex: textbox } else if(nameMatches(rqst->pName, NS_V_KEY, "imagedata")) { const gchar* id = attrMatches(NS_R_KEY, "id", rqst->ppAtts); if(id) { std::string imageId(id); OXML_SharedElement imgElem(new OXML_Element_Image(imageId)); rqst->stck->push(imgElem); if(!addImage(imageId)) return; if(m_style.compare("")) { //parse and apply style here std::string attrName(""); std::string attrValue(""); size_t attrStart = 0; size_t attrEnd = 0; while(attrStart < m_style.length()) { attrEnd = m_style.find(';', attrStart); if(attrEnd == std::string::npos) { //this should be the last attribute attrEnd = m_style.length(); } std::string attrNameValPair = m_style.substr(attrStart, attrEnd-attrStart); size_t seperator = attrNameValPair.find(':'); if(seperator != std::string::npos) { attrName = attrNameValPair.substr(0, seperator); attrValue = attrNameValPair.substr(seperator+1); //convert and apply attributes here if(!attrName.compare("width")) { imgElem->setProperty("width", attrValue); } else if(!attrName.compare("height")) { imgElem->setProperty("height", attrValue); } //TODO: more attributes coming } //finally update the start point for the next attribute attrStart = attrEnd+1; } } rqst->handled = true; } } //TODO: more coming here }
void OXMLi_ListenerState_Image::endElement (OXMLi_EndElementRequest * rqst) { if(nameMatches(rqst->pName, NS_W_KEY, "object")) { m_isEmbeddedObject = false; rqst->handled = true; return; } if(m_isEmbeddedObject) { return; } if(nameMatches(rqst->pName, NS_W_KEY, "drawing") || nameMatches(rqst->pName, NS_V_KEY, "imagedata")) { //image is done rqst->handled = (_flushTopLevel(rqst->stck, rqst->sect_stck) == UT_OK); } else if(nameMatches(rqst->pName, NS_A_KEY, "blip") || nameMatches(rqst->pName, NS_WP_KEY, "extent") || nameMatches(rqst->pName, NS_WP_KEY, "wrapSquare") || nameMatches(rqst->pName, NS_WP_KEY, "posOffset") || nameMatches(rqst->pName, NS_WP_KEY, "positionH") || nameMatches(rqst->pName, NS_WP_KEY, "positionV")) { rqst->handled = true; } else if(nameMatches(rqst->pName, NS_WP_KEY, "anchor") || nameMatches(rqst->pName, NS_WP_KEY, "inline")) { m_isInlineImage = false; rqst->handled = true; } else if(nameMatches(rqst->pName, NS_V_KEY, "shape")) { m_style = ""; } //TODO: more coming here }
void OXMLi_ListenerState_Styles::startElement (OXMLi_StartElementRequest * rqst) { UT_return_if_fail( _error_if_fail(rqst != NULL) ); if (nameMatches(rqst->pName, NS_W_KEY, "docDefaults")) { m_pCurrentStyle = new OXML_Style("Normal", "Normal"); m_pCurrentStyle->setAttribute(PT_TYPE_ATTRIBUTE_NAME, "P"); m_pCurrentStyle->setAttribute(PT_FOLLOWEDBY_ATTRIBUTE_NAME, "Current Settings"); rqst->handled = true; } else if (nameMatches(rqst->pName, NS_W_KEY, "rPr") || nameMatches(rqst->pName, NS_W_KEY, "pPr")) { //Push a dummy element onto the stack to collect the formatting for the current style. OXML_SharedElement dummy(new OXML_Element_Paragraph("")); rqst->stck->push(dummy); rqst->handled = true; } else if (nameMatches(rqst->pName, NS_W_KEY, "tblPr")) { //Push a dummy element onto the stack to collect the formatting for the current style. OXML_SharedElement dummy(new OXML_Element_Table("")); rqst->stck->push(dummy); //don't handle the request so that table listener state can adjust its internal state } else if (nameMatches(rqst->pName, NS_W_KEY, "trPr")) { //Push a dummy element onto the stack to collect the formatting for the current style. OXML_SharedElement dummy(new OXML_Element_Row("", NULL)); rqst->stck->push(dummy); //don't handle the request so that table listener state can adjust its internal state } else if (nameMatches(rqst->pName, NS_W_KEY, "tcPr")) { //Push a dummy element onto the stack to collect the formatting for the current style. OXML_SharedElement dummy(new OXML_Element_Cell("", NULL, NULL, 0,0,0,0)); rqst->stck->push(dummy); //don't handle the request so that table listener state can adjust its internal state } else if (nameMatches(rqst->pName, NS_W_KEY, "style")) { const gchar * id = attrMatches(NS_W_KEY, "styleId", rqst->ppAtts); const gchar * type = attrMatches(NS_W_KEY, "type", rqst->ppAtts); UT_return_if_fail( _error_if_fail( id != NULL )); if (!strcmp(id, "Normal")) id = "_Normal"; //Cannot interfere with document defaults m_pCurrentStyle = new OXML_Style(id, ""); //TODO: wrap this in try/catch if (!type || !*type) { // default to paragraph in the case of a missing/blank attribute // (as specified by the spec: 2.7.3.17) type = "P"; } else if (!strcmp(type, "character")) { type = "C"; //Type is C for "character" } else { type = "P"; //Type is P for "paragraph", "numbering", and "table" } m_pCurrentStyle->setAttribute(PT_TYPE_ATTRIBUTE_NAME, type); rqst->handled = true; } else if ( nameMatches(rqst->pName, NS_W_KEY, "name") || nameMatches(rqst->pName, NS_W_KEY, "basedOn") || nameMatches(rqst->pName, NS_W_KEY, "next")) { const gchar * val = attrMatches(NS_W_KEY, "val", rqst->ppAtts); UT_return_if_fail( _error_if_fail( m_pCurrentStyle != NULL && val != NULL )); if (!strcmp(val, "Normal")) val = "_Normal"; //Cannot interfere with document defaults if (nameMatches(rqst->pName, NS_W_KEY, "name")) { m_pCurrentStyle->setName(val); } else if (nameMatches(rqst->pName, NS_W_KEY, "basedOn")) { //For now, we use the ID as reference, until all styles have been parsed m_pCurrentStyle->setAttribute(PT_BASEDON_ATTRIBUTE_NAME, val); } else if (nameMatches(rqst->pName, NS_W_KEY, "next")) { //For now, we use the ID as reference, until all styles have been parsed m_pCurrentStyle->setAttribute(PT_FOLLOWEDBY_ATTRIBUTE_NAME, val); } rqst->handled = true; } }