1 #include "html.h" 2 #include "iterators.h" 3 #include "html_tag.h" 4 next(bool ret_parent)5litehtml::element::ptr litehtml::elements_iterator::next(bool ret_parent) 6 { 7 next_idx(); 8 9 while(m_idx < (int) m_el->get_children_count()) 10 { 11 element::ptr el = m_el->get_child(m_idx); 12 if( el->get_children_count() && m_go_inside && m_go_inside->select(el) ) 13 { 14 stack_item si; 15 si.idx = m_idx; 16 si.el = m_el; 17 m_stack.push_back(si); 18 m_el = el; 19 m_idx = -1; 20 if(ret_parent) 21 { 22 return el; 23 } 24 next_idx(); 25 } else 26 { 27 if( !m_select || (m_select && m_select->select(m_el->get_child(m_idx))) ) 28 { 29 return m_el->get_child(m_idx); 30 } else 31 { 32 next_idx(); 33 } 34 } 35 } 36 37 return 0; 38 } 39 next_idx()40void litehtml::elements_iterator::next_idx() 41 { 42 m_idx++; 43 while(m_idx >= (int) m_el->get_children_count() && m_stack.size()) 44 { 45 stack_item si = m_stack.back(); 46 m_stack.pop_back(); 47 m_idx = si.idx; 48 m_el = si.el; 49 m_idx++; 50 continue; 51 } 52 } 53 54 ////////////////////////////////////////////////////////////////////////// 55 ////////////////////////////////////////////////////////////////////////// 56 57 select(const element::ptr & el)58bool litehtml::go_inside_inline::select(const element::ptr& el) 59 { 60 if(el->get_display() == display_inline || el->get_display() == display_inline_text) 61 { 62 return true; 63 } 64 return false; 65 } 66 select(const element::ptr & el)67bool litehtml::go_inside_table::select(const element::ptr& el) 68 { 69 if( el->get_display() == display_table_row_group || 70 el->get_display() == display_table_header_group || 71 el->get_display() == display_table_footer_group) 72 { 73 return true; 74 } 75 return false; 76 } 77 select(const element::ptr & el)78bool litehtml::table_rows_selector::select(const element::ptr& el) 79 { 80 if( el->get_display() == display_table_row) 81 { 82 return true; 83 } 84 return false; 85 } 86 select(const element::ptr & el)87bool litehtml::table_cells_selector::select(const element::ptr& el) 88 { 89 if( el->get_display() == display_table_cell) 90 { 91 return true; 92 } 93 return false; 94 } 95