From 1a0b2fe62cbfd2c0cb3a162787017dce98ed9dc6 Mon Sep 17 00:00:00 2001 From: Stef Date: Sat, 24 Jul 2004 22:32:14 +0000 Subject: - Bug fixes to new fixup scheme --- src/domhelpers.cpp | 103 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 31 deletions(-) (limited to 'src/domhelpers.cpp') diff --git a/src/domhelpers.cpp b/src/domhelpers.cpp index ac93f10..7ecf963 100644 --- a/src/domhelpers.cpp +++ b/src/domhelpers.cpp @@ -186,6 +186,8 @@ DOM::Element DOMHelpers::getChildElement(const DOM::Node& parent, const string& { if(isElement(child, name)) return (DOM::Element&)child; + + child = child.getNextSibling(); } return DOM::Element(); @@ -226,6 +228,8 @@ void ElementTable::load(const DOM::Node& parent, const string& name) if(!id.empty()) insert(make_pair(id, el)); } + + child = child.getNextSibling(); } } @@ -250,30 +254,55 @@ void ElementTable::removeIds() void ElementIterator::next() { - if(m_current == NULL) - return; + if(m_flags == AFTER_LAST) + return; + + if(m_flags == BEFORE_FIRST) + m_current = m_top; + + ASSERT(m_current != NULL); DOM::Node n; // Always descend into children first if(m_current.hasChildNodes()) { - m_current = nextel(m_current.getFirstChild()); - if(m_current != NULL) + n = nextel(m_current.getFirstChild()); + if(n != NULL) + { + m_current = n; + m_flags = ITERATING; return; + } } // Look for siblings along the current level - m_current = nextel(m_current.getNextSibling()); - if(m_current != NULL) + n = nextel(m_current.getNextSibling()); + if(n != NULL) + { + m_current = n; + m_flags = ITERATING; return; - - // Go back up to parent - m_current = m_current.getParentNode(); - - // But check top against parent - if(m_current == NULL || m_current == m_top) - m_current = NULL; + } + + for(;;) + { + // Go back up to parent, and get it's next sibling + m_current = m_current.getParentNode(); + if(m_current == NULL || m_current == m_top) + break; + + n = nextel(m_current.getNextSibling()); + if(n != NULL) + { + m_current = n; + m_flags = ITERATING; + return; + } + } + + m_flags = AFTER_LAST; + m_current = NULL; } DOM::Element ElementIterator::nextel(DOM::Node node) @@ -291,29 +320,41 @@ DOM::Element ElementIterator::nextel(DOM::Node node) void ElementIterator::prev() { - /* Allow backing into the iterator */ - if(m_current == NULL) - m_current = m_top; + if(m_flags == BEFORE_FIRST) + return; DOM::Node n; - // Always descend into children first - if(m_current.hasChildNodes()) - { - m_current = prevel(m_current.getLastChild()); - if(m_current != NULL) - return; - } + if(m_flags == AFTER_LAST) + n = m_top; + else + n = prevel(m_current.getPreviousSibling()); + + while(n != NULL) + { + m_current = n; + + n = n.hasChildNodes() ? + prevel(m_current.getLastChild()) : DOM::Node(); + + if(n == NULL) + { + m_flags = ITERATING; + return; + } + } + + // Go back up to parent + m_current = m_current.getParentNode(); + + if(m_current == NULL || m_current == m_top) + { + m_flags = BEFORE_FIRST; + m_current = NULL; + return; + } - // Look for siblings along the current level - m_current = prevel(m_current.getPreviousSibling()); - if(m_current != NULL) - return; - // Go back up to parent - DOM::Node parent = m_current.getParentNode(); - if(parent != m_top) - m_current = (DOM::Element&)parent; } -- cgit v1.2.3