diff options
author | Stef Walter <stef@memberwebs.com> | 2004-07-22 22:30:48 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2004-07-22 22:30:48 +0000 |
commit | 879f4addd4c94492c21c36c0be98122a879907bf (patch) | |
tree | 81dba160573131e476cad13e8421aff07ccb5d11 /src/xmlfixups.cpp | |
parent | 7c93b2bab50b1ee28aee190a064b11daed247d83 (diff) |
- Comments and formatting changes.
Diffstat (limited to 'src/xmlfixups.cpp')
-rw-r--r-- | src/xmlfixups.cpp | 859 |
1 files changed, 401 insertions, 458 deletions
diff --git a/src/xmlfixups.cpp b/src/xmlfixups.cpp index c3fd8b6..6efe6f4 100644 --- a/src/xmlfixups.cpp +++ b/src/xmlfixups.cpp @@ -59,636 +59,585 @@ static const char* kConsolidateEnd[] = static const char* kConsolidateStart[] = { kElStylesheet, kElInfo, NULL }; + void RtfFixups::breakBreak(DOM::Document& doc, const string& contain, const string& tag) { - DOM::NodeList els = doc.getElementsByTagName(tag); - if(els != NULL) + DOM::NodeList els = doc.getElementsByTagName(tag); + if(els != NULL) { - for(int i = 0; i < els->getLength(); i++) - { - DOM::Element el = (const DOM::Element&)els->item(i); -#if 0 - // See if parent node only has this break tag - // in it. If so then replace parent with this - - DOM::Node parent = el.getParentNode(); - - if(parent != NULL) - { - DOM::Node grandparent = parent.getParentNode(); - - if(grandparent != NULL && - el.getPreviousSibling() == NULL && - el.getNextSibling() == NULL) - { - grandparent.replaceChild(parent.removeChild(el), parent); - } - } -#endif - - breakElement(el, contain); - } - } + for(int i = 0; i < els->getLength(); i++) + { + DOM::Element el = (const DOM::Element&)els->item(i); + breakElement(el, contain); + } + } } -/** - * Breaks a paragraph up through a previous level. Calls itself - * recursively to break paragraphs totally free up to containing - * destination. - * - * For example: - * - * <dest> - * This is <b> a <block fix="para"/> - * test of </b> your concentration. - * </dest> - * - * Becomes: - * - * <dest> - * This is <b> a </b><block fix="para"/> - * <b>test of </b> your concentration. - * </dest> - */ bool RtfFixups::breakElement(const DOM::Element& el, const string& contain) { - ASSERT(el != NULL); + ASSERT(el != NULL); - DOM::Element parent = (const DOM::Element&)el.getParentNode(); - DOM::Element grandparent; + DOM::Element parent = (const DOM::Element&)el.getParentNode(); + DOM::Element grandparent; - string s = el.getNodeName(); - s = parent.getNodeName(); + string s = el.getNodeName(); + s = parent.getNodeName(); - // Get the parent node - if(parent != NULL) - grandparent = (const DOM::Element&)parent.getParentNode(); + // Get the parent node + if(parent != NULL) + grandparent = (const DOM::Element&)parent.getParentNode(); // Make sure we have something to work with before continuing - if(grandparent == NULL || parent == NULL || - DOMHelpers::isElement(parent, contain)) + if(grandparent == NULL || parent == NULL || + DOMHelpers::isElement(parent, contain)) return true; - DOM::Node e; + DOM::Node e; - // Check to see if this is the first node in the parent. - // If so then just move out to before - if(el.getPreviousSibling() == NULL) + // Check to see if this is the first node in the parent. + // If so then just move out to before + if(el.getPreviousSibling() == NULL) { - e = grandparent.insertBefore(parent.removeChild(el), parent); - } + e = grandparent.insertBefore(parent.removeChild(el), parent); + } // Check to see if this is the last node in the parent. // If so then just move out to after the parent else if(el.getNextSibling() == NULL) - { - DOM::Node next = parent.getNextSibling(); - if(next == NULL) - e = grandparent.appendChild(parent.removeChild(el)); - else - e = grandparent.insertBefore(parent.removeChild(el), next); + { + DOM::Node next = parent.getNextSibling(); + if(next == NULL) + e = grandparent.appendChild(parent.removeChild(el)); + else + e = grandparent.insertBefore(parent.removeChild(el), next); } // Otherwise it's in the middle so split the parent // element etc... - else - { - // Clone it but not deep - DOM::Element parent2 = (const DOM::Element&)parent.cloneNode(false); + else + { + // Clone it but not deep + DOM::Element parent2 = (const DOM::Element&)parent.cloneNode(false); - if(parent2 == NULL) + if(parent2 == NULL) return false; - // Flag that tells us whether we moved anything up to parent - bool moved = false; + // Flag that tells us whether we moved anything up to parent + bool moved = false; - // Now move all nodes after this one to the second parent. - while((e = el.getNextSibling()) != NULL) - { - parent2.appendChild(parent.removeChild(e)); + // Now move all nodes after this one to the second parent. + while((e = el.getNextSibling()) != NULL) + { + parent2.appendChild(parent.removeChild(e)); moved = true; - } + } - // Remove the element from it's parent - e = parent.removeChild(el); + // Remove the element from it's parent + e = parent.removeChild(el); - // Okay now we move the paragraph up to the parent - DOMHelpers::insertAfter(grandparent, e, parent); - if(moved) - DOMHelpers::insertAfter(grandparent, parent2, e); - } + // Okay now we move the paragraph up to the parent + DOMHelpers::insertAfter(grandparent, e, parent); + if(moved) + DOMHelpers::insertAfter(grandparent, parent2, e); + } - // Now call it again with the paragraph in the new position - // untill everything's cut through! + // Now call it again with the paragraph in the new position + // until everything's cut through! return breakElement((DOM::Element&)e, contain); } -/** - * Changes from a marker based paragraph system to a contained - * paragraph system. Also applies paragraph attributes to the - * appropriate paragraph. - * - * For example: - * - * <dest> - * This <blockattr style="10"> is <b> a <block fix="para"/> - * test of </b> your concentration. - * </dest> - * - * Becomes: - * - * <para style="10"> This is <b> a </b></para> - * <para><b>test of </b> your concentration.</para> - */ void RtfFixups::breakBlocks(DOM::Document& document) { // First break out all the paragraphs to the destination level DOM::NodeList blocks = document.getElementsByTagName(kElBlock); if(blocks != NULL) { - for(int i = 0; i < blocks->getLength(); i++) - { - DOM::Element block = (const DOM::Element&)blocks->item(i); + for(int i = 0; i < blocks->getLength(); i++) + { + DOM::Element block = (const DOM::Element&)blocks->item(i); // If it's the single closed style para then break it - if(block != NULL && !block.hasChildNodes()) + if(block != NULL && !block.hasChildNodes()) breakElement(block, kElDest); - } + } } // Now group stuff in destinations into paras or other blocks - DOM::NodeList destinations = document.getElementsByTagName(kElDest); - if(destinations != NULL) - { - for(int i = 0; i < destinations->getLength(); i++) - { - DOM::Element dest = (const DOM::Element&)destinations->item(i); - - // Sanity Check + DOM::NodeList destinations = document.getElementsByTagName(kElDest); + if(destinations != NULL) + { + for(int i = 0; i < destinations->getLength(); i++) + { + DOM::Element dest = (const DOM::Element&)destinations->item(i); + + // Sanity Check if(dest == NULL || !dest.hasChildNodes()) - continue; + continue; - // Go through the children of this destination - DOM::Node child = dest.getFirstChild(); + // Go through the children of this destination + DOM::Node child = dest.getFirstChild(); - DOM::Element block; + DOM::Element block; - while(child != NULL) - { - // If it's a block - if(DOMHelpers::isElement(child, kElBlock)) - { - block = (DOM::Element&)child; - child = child.getNextSibling(); + while(child != NULL) + { + // If it's a block + if(DOMHelpers::isElement(child, kElBlock)) + { + block = (DOM::Element&)child; + child = child.getNextSibling(); continue; - } - - // If it's already a real block element - for(const char** t = kBlockTags; *t != NULL; t++) - { - if(DOMHelpers::isElement(child, *t)) - { - block = NULL; - break; - } - } - - // If there's a block then add to it - if(block != NULL) - { - block.appendChild(dest.removeChild(child)); + } + + // If it's already a real block element + for(const char** t = kBlockTags; *t != NULL; t++) + { + if(DOMHelpers::isElement(child, *t)) + { + block = NULL; + break; + } + } + + // If there's a block then add to it + if(block != NULL) + { + block.appendChild(dest.removeChild(child)); child = block; - } + } - child = child.getNextSibling(); + child = child.getNextSibling(); } - } - } + } + } } void RtfFixups::wrapTags(DOM::Document& doc, const string& tagName, - const string& wrapName) + const string& wrapName) { - DOM::NodeList tags = doc.getElementsByTagName(tagName); + DOM::NodeList tags = doc.getElementsByTagName(tagName); if(tags != NULL) - { - for(int i = 0; i < tags->getLength(); i++) - { - DOM::Element tag = (const DOM::Element&)tags->item(i); + { + for(int i = 0; i < tags->getLength(); i++) + { + DOM::Element tag = (const DOM::Element&)tags->item(i); DOM::Element wrap = doc.createElement(wrapName); - while(tag.hasChildNodes()) - wrap.appendChild(tag.removeChild(tag.getFirstChild())); + while(tag.hasChildNodes()) + wrap.appendChild(tag.removeChild(tag.getFirstChild())); - tag.appendChild(wrap); - } - } + tag.appendChild(wrap); + } + } } void RtfFixups::breakTags(DOM::Document& doc, const string& parentName, - const string& tagName) + const string& tagName) { - DOM::NodeList parents = doc.getElementsByTagName(parentName); - if(parents != NULL) + DOM::NodeList parents = doc.getElementsByTagName(parentName); + if(parents != NULL) { - for(int i = 0; i < parents->getLength(); i++) - { - DOM::Element parent = (const DOM::Element&)parents->item(i); + for(int i = 0; i < parents->getLength(); i++) + { + DOM::Element parent = (const DOM::Element&)parents->item(i); - if(!parent.hasChildNodes()) + if(!parent.hasChildNodes()) continue; - DOM::NodeList tags = parent.getElementsByTagName(tagName); - if(tags != NULL) - { - for(int i = 0; i < tags->getLength(); i++) - breakElement((const DOM::Element&)tags->item(i), parentName); - } + // First perform the breaks + DOM::NodeList tags = parent.getElementsByTagName(tagName); + if(tags != NULL) + { + for(int i = 0; i < tags->getLength(); i++) + breakElement((const DOM::Element&)tags->item(i), parentName); + } - DOM::Node tag = doc.createElement(tagName); + DOM::Node tag = doc.createElement(tagName); parent.insertBefore(tag, parent.getFirstChild()); - DOM::Node child = tag; + DOM::Node child = tag; while(child != NULL && (child = child.getNextSibling()) != NULL) - { - if(DOMHelpers::isElement(child, kElBlock)) - { - DOM::Node next = child.getNextSibling(); - if(next == NULL) - { - parent.removeChild(child); - continue; - } - - if(DOMHelpers::isElement(next, tagName)) - { - DOM::Node twodown = next.getNextSibling(); - if(!DOMHelpers::isElement(twodown, kElBlock)) - { - child = parent.insertBefore(parent.removeChild(next), child); - } - else - { - parent.removeChild(child); - child = next; - } - } - } - - if(DOMHelpers::isElement(child, tagName)) - { - if(!tag.hasChildNodes()) - parent.removeChild(tag); - tag = child; - } - else - { - tag.appendChild(parent.removeChild(child)); + { + if(DOMHelpers::isElement(child, kElBlock)) + { + DOM::Node next = child.getNextSibling(); + if(next == NULL) + { + parent.removeChild(child); + continue; + } + + if(DOMHelpers::isElement(next, tagName)) + { + DOM::Node twodown = next.getNextSibling(); + if(!DOMHelpers::isElement(twodown, kElBlock)) + { + child = parent.insertBefore(parent.removeChild(next), child); + } + else + { + parent.removeChild(child); + child = next; + } + } + } + + if(DOMHelpers::isElement(child, tagName)) + { + if(!tag.hasChildNodes()) + parent.removeChild(tag); + tag = child; + } + else + { + tag.appendChild(parent.removeChild(child)); child = tag; - } - } + } + } - if(!tag.hasChildNodes()) - parent.removeChild(tag); - } - } + if(!tag.hasChildNodes()) + parent.removeChild(tag); + } + } - DOM::NodeList tags = doc.getElementsByTagName(tagName); + DOM::NodeList tags = doc.getElementsByTagName(tagName); if(tags != NULL) - { - for(int i = 0; i < tags->getLength(); i++) - { - DOM::Element tag = (const DOM::Element&)tags->item(i); - DOM::Node parent = tag.getParentNode(); - - if(parent != NULL && !DOMHelpers::isElement(parent, parentName)) - parent.removeChild(tag); + { + for(int i = 0; i < tags->getLength(); i++) + { + DOM::Element tag = (const DOM::Element&)tags->item(i); + DOM::Node parent = tag.getParentNode(); + if(parent != NULL && !DOMHelpers::isElement(parent, parentName)) + parent.removeChild(tag); #if 0 else if(tag.hasChildNodes()) - { - DOM::NodeList children = tag.getChildNodes(); - if(children != NULL && children->getLength() == 1) - { - DOM::Node child = children->item(0); - if(child != NULL && !child.hasChildNodes() && - DOMHelpers::isElement(child, kElBlock)) - parent.removeChild(tag); - } - } + { + DOM::NodeList children = tag.getChildNodes(); + if(children != NULL && children->getLength() == 1) + { + DOM::Node child = children->item(0); + if(child != NULL && !child.hasChildNodes() && + DOMHelpers::isElement(child, kElBlock)) + parent.removeChild(tag); + } + } #endif - - } - } + } + } } void RtfFixups::breakLists(DOM::Document& doc) { - // Now group stuff in destinations into tables - DOM::NodeList destinations = doc.getElementsByTagName(kElDest); + DOM::NodeList destinations = doc.getElementsByTagName(kElDest); if(destinations != NULL) - { - for(int i = 0; i < destinations->getLength(); i++) - { - DOM::Element dest = (const DOM::Element&)destinations->item(i); + { + for(int i = 0; i < destinations->getLength(); i++) + { + DOM::Element dest = (const DOM::Element&)destinations->item(i); - // Sanity Check + // Sanity Check if(dest == NULL) continue; - // Go through the children of this destination - DOM::Node child = dest.getFirstChild(); + // Go through the children of this destination + DOM::Node child = dest.getFirstChild(); - DOM::Element list; - DOM::Element e; + DOM::Element list; + DOM::Element e; - wstring previd; + wstring previd; - while(child != NULL) - { - // If it's a block and has a cell attribute + while(child != NULL) + { + // If it's a block ... if(DOMHelpers::isElement(child, kElBlock)) - { - e = (DOM::Element&)child; + { + e = (DOM::Element&)child; - // if it has a cell attribute - wstring listid = e.getAttribute(kAtList); - if(listid.length() > 0) + // ... and has a list attribute + wstring listid = e.getAttribute(kAtList); + if(listid.length() > 0) { - e.removeAttribute(kAtList); + e.removeAttribute(kAtList); - if(list == NULL || previd != listid) - { - list = doc.createElement(kElList); - list.setAttribute(kAtList, listid); + if(list == NULL || previd != listid) + { + list = doc.createElement(kElList); + list.setAttribute(kAtList, listid); dest.insertBefore(list, child); previd = listid; - } - } - else - { - list = NULL; - previd.erase(); + } } - } + else + { + list = NULL; + previd.erase(); + } + } - // It's not a block + // It's not a block if(list != NULL) - { - list.appendChild(dest.removeChild(child)); - child = list; - } + { + list.appendChild(dest.removeChild(child)); + child = list; + } - child = child.getNextSibling(); + child = child.getNextSibling(); } - } - } + } + } } void RtfFixups::fixStyles(const DOM::Document doc) { - DOM::NodeList styles = doc.getElementsByTagName(kElStyle); - if(styles != NULL) - { - DOM::NodeList blocks = doc.getElementsByTagName(kElBlock); - if(blocks != NULL) - { - for(int i = 0; i < blocks->getLength(); i++) - { - DOM::Element block = (const DOM::Element&)blocks->item(i); + // Get all stylesheet styles + DOM::NodeList styles = doc.getElementsByTagName(kElStyle); + if(styles != NULL) + { + // Get list of blocks in the document + DOM::NodeList blocks = doc.getElementsByTagName(kElBlock); + if(blocks != NULL) + { + for(int i = 0; i < blocks->getLength(); i++) + { + DOM::Element block = (const DOM::Element&)blocks->item(i); if(block == NULL || !block.hasAttribute(kElStyle)) - continue; - - for(int j = 0; j < styles->getLength(); j++) - { - DOM::Element style = (const DOM::Element&)styles->item(j); - if(style != NULL) - { - if(style.getAttribute(kAtId) == block.getAttribute(kElStyle)) - { - wstring name = style.getAttribute(kAtName); + continue; + + // Lookup block styles + for(int j = 0; j < styles->getLength(); j++) + { + DOM::Element style = (const DOM::Element&)styles->item(j); + if(style != NULL) + { + if(style.getAttribute(kAtId) == block.getAttribute(kElStyle)) + { + // And change to the name + wstring name = style.getAttribute(kAtName); if(name.length() > 0) - block.setAttribute(kElStyle, name); + block.setAttribute(kElStyle, name); } - } - } - } - } - - for(int i = 0; i < styles->getLength(); i++) - { - DOM::Element style = (const DOM::Element&)styles->item(i); - if(style != NULL) - style.removeAttribute(kAtId); - } - } - + } + } + } + } + // A little cleanup of the stylesheet styles + for(int i = 0; i < styles->getLength(); i++) + { + DOM::Element style = (const DOM::Element&)styles->item(i); + if(style != NULL) + style.removeAttribute(kAtId); + } + } } void RtfFixups::breakTables(DOM::Document& doc) { - DOM::NodeList rows = doc.getElementsByTagName(kElRow); - if(rows != NULL) - { - for(int i = 0; i < rows->getLength(); i++) - { - DOM::Element row = (const DOM::Element&)rows->item(i); - DOM::Node parent = row.getParentNode(); - - if(parent == NULL) - continue; - - if(DOMHelpers::isElement(parent, kElBlock)) + // Break rows out to destinations + DOM::NodeList rows = doc.getElementsByTagName(kElRow); + if(rows != NULL) + { + for(int i = 0; i < rows->getLength(); i++) + { + DOM::Element row = (const DOM::Element&)rows->item(i); + DOM::Node parent = row.getParentNode(); + + if(parent == NULL) + continue; + + if(DOMHelpers::isElement(parent, kElBlock)) { - DOM::Node grandparent = parent.getParentNode(); + DOM::Node grandparent = parent.getParentNode(); - if(grandparent != NULL && !row.hasChildNodes()) + if(grandparent != NULL && !row.hasChildNodes()) { - if(row.getPreviousSibling() == NULL) - grandparent.insertBefore(parent.removeChild(row), parent); - else if(row.getNextSibling() == NULL) - DOMHelpers::insertAfter(grandparent, parent.removeChild(row), parent); - } - } - - breakElement(row, kElDest); - } - } - + if(row.getPreviousSibling() == NULL) + grandparent.insertBefore(parent.removeChild(row), parent); + else if(row.getNextSibling() == NULL) + DOMHelpers::insertAfter(grandparent, parent.removeChild(row), parent); + } + } + breakElement(row, kElDest); + } + } - // Now group stuff in destinations into tables - DOM::NodeList destinations = doc.getElementsByTagName(kElDest); + // Now group stuff in destinations into tables + DOM::NodeList destinations = doc.getElementsByTagName(kElDest); if(destinations != NULL) - { - for(int i = 0; i < destinations->getLength(); i++) - { - DOM::Element dest = (const DOM::Element&)destinations->item(i); + { + for(int i = 0; i < destinations->getLength(); i++) + { + DOM::Element dest = (const DOM::Element&)destinations->item(i); - // Sanity Check + // Sanity Check if(dest == NULL) continue; - // Go through the children of this destination - DOM::Node child = dest.getFirstChild(); + // Go through the children of this destination + DOM::Node child = dest.getFirstChild(); - DOM::Element table; + DOM::Element table; DOM::Element e; - while(child != NULL) - { - // If it's a block and has a cell attribute + while(child != NULL) + { + // If it's a block and has a cell attribute if(DOMHelpers::isElement(child, kElBlock)) - { - e = (DOM::Element&)child; - - // if it has a cell attribute - if(e.getAttribute(kAtCell).length() > 0) - { - e.removeAttribute(kAtCell); - - if(table == NULL) - { - table = doc.createElement(kElTable); - dest.insertBefore(table, child); - } - } - else - { - table = NULL; - } - } - - // It's not a block + { + e = (DOM::Element&)child; + + // if it has a cell attribute + if(e.getAttribute(kAtCell).length() > 0) + { + e.removeAttribute(kAtCell); + + if(table == NULL) + { + table = doc.createElement(kElTable); + dest.insertBefore(table, child); + } + } + else + { + table = NULL; + } + } + + // It's not a block if(table != NULL) - { - table.appendChild(dest.removeChild(child)); + { + table.appendChild(dest.removeChild(child)); child = table; - } + } - child = child.getNextSibling(); + child = child.getNextSibling(); } - } - } + } + } } void RtfFixups::removeTags(const DOM::Document& doc) { - // Go through the list of nodes + // Go through the list of nodes for(const char** t = kRemoveTags; *t != NULL; t++) - { - DOM::NodeList elements = doc.getElementsByTagName(*t); - if(elements != NULL) - { - for(int j = 0; j < elements->getLength(); j++) - { - DOM::Element el = (const DOM::Element&)elements->item(j); - DOM::Node parent = el->getParentNode(); - - if(parent == NULL) - continue; - - while(el.hasChildNodes()) - parent.insertBefore(el.removeChild(el.getFirstChild()), el); - - parent.removeChild(el); + { + DOM::NodeList elements = doc.getElementsByTagName(*t); + if(elements != NULL) + { + for(int j = 0; j < elements->getLength(); j++) + { + DOM::Element el = (const DOM::Element&)elements->item(j); + DOM::Node parent = el->getParentNode(); + + if(parent == NULL) + continue; + + while(el.hasChildNodes()) + parent.insertBefore(el.removeChild(el.getFirstChild()), el); + + parent.removeChild(el); } - } - } + } + } } void RtfFixups::fixLists(const DOM::Document doc) { - DOM::NodeList lists = doc.getElementsByTagName(kElList); - if(lists != NULL) - { - DOM::NodeList listdefs = doc.getElementsByTagName(kElListdef); - if(listdefs != NULL) - { - for(int i = 0; i < listdefs->getLength(); i++) - { - DOM::Element listdef = (const DOM::Element&)listdefs->item(i); + // Get all the lists + DOM::NodeList lists = doc.getElementsByTagName(kElList); + if(lists != NULL) + { + // And all the list definitions + DOM::NodeList listdefs = doc.getElementsByTagName(kElListdef); + if(listdefs != NULL) + { + for(int i = 0; i < listdefs->getLength(); i++) + { + DOM::Element listdef = (const DOM::Element&)listdefs->item(i); if(listdef == NULL || !listdef.hasAttribute(kAtList)) - continue; + continue; - for(int j = 0; j < lists->getLength(); j++) + for(int j = 0; j < lists->getLength(); j++) { - DOM::Element list = (const DOM::Element&)lists->item(j); - if(list != NULL) - { - if(list.getAttribute(kAtList) == listdef.getAttribute(kAtList)) + DOM::Element list = (const DOM::Element&)lists->item(j); + if(list != NULL) + { + if(list.getAttribute(kAtList) == listdef.getAttribute(kAtList)) { - DOMHelpers::copyAttributes(listdef, list, kHideList); - list.removeAttribute(kAtList); - } - } - } - } - } - } + // And copy all the attributes from the list definition to the list + DOMHelpers::copyAttributes(listdef, list, kHideList); + list.removeAttribute(kAtList); + } + } + } + } + } + } } void RtfFixups::fixBlocks(const DOM::Document doc) { - // First break out all the paragraphs to the destination level - DOM::NodeList blocks = doc.getElementsByTagName(kElBlock); - if(blocks != NULL) - { - string fix; + // Get all the blocks + DOM::NodeList blocks = doc.getElementsByTagName(kElBlock); + if(blocks != NULL) + { + string fix; wstring val; - for(int i = 0; i < blocks->getLength(); i++) - { - DOM::Element block = (const DOM::Element&)blocks->item(i); - DOM::Node parent = block.getParentNode(); - - if(parent == NULL) - continue; + for(int i = 0; i < blocks->getLength(); i++) + { + DOM::Element block = (const DOM::Element&)blocks->item(i); + DOM::Node parent = block.getParentNode(); - fix.resize(0); - val.resize(0); + if(parent == NULL) + continue; - val = block.getAttribute(kAtFix); - if(val.length() > 0) - block.removeAttribute(kAtFix); + fix.resize(0); + val.resize(0); + // Figure out what kind of element they want block fixed to + val = block.getAttribute(kAtFix); + if(val.length() > 0) + block.removeAttribute(kAtFix); - if(val.length() > 0) - { - val = block.getAttributeNS("", kAtFix); + // BUG: Sablotron bug work around + if(val.length() > 0) + { + val = block.getAttributeNS("", kAtFix); if(val.length() > 0) - block.removeAttributeNS("", kAtFix); - } + block.removeAttributeNS("", kAtFix); + } - if(val.length() > 0) - DOM::transcode16to8(val, fix); + if(val.length() > 0) + DOM::transcode16to8(val, fix); if(fix.length() == 0) - fix = kElPara; + fix = kElPara; + // Create duplicate of the 'fix' element DOM::Element el = doc.createElement(fix); - DOMHelpers::copyAttributes(block, el, NULL); + DOMHelpers::copyAttributes(block, el, NULL); - while(block.hasChildNodes()) - el.appendChild(block.removeChild(block.getFirstChild())); + // Replace block with the given 'fix' element + while(block.hasChildNodes()) + el.appendChild(block.removeChild(block.getFirstChild())); - parent.replaceChild(el, block); + parent.replaceChild(el, block); } - } + } } -/** - * Consolidates a certain tag types at the end of the document - */ void RtfFixups::consolidateEndTags(DOM::Document& doc) { DOM::Element top = doc.getDocumentElement(); @@ -721,9 +670,6 @@ void RtfFixups::consolidateEndTags(DOM::Document& doc) } } -/** - * Consolidates a certain tag types at the start of the document - */ void RtfFixups::consolidateStartTags(DOM::Document& doc) { DOM::Element top = doc.getDocumentElement(); @@ -759,10 +705,7 @@ void RtfFixups::consolidateStartTags(DOM::Document& doc) } } -/** - * Removes adjacent duplicate nodes of certain names - */ -void RtfFixups::removeDuplicates(const DOM::Document& doc) +void RtfFixups::combineDuplicates(const DOM::Document& doc) { bool found; |