Cogs.Core
iterators.cpp
1#include "html.h"
2#include "iterators.h"
3#include "html_tag.h"
4
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
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
56
57
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
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
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
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}