1 #include "html.h"
2 #include "iterators.h"
3 #include "html_tag.h"
4 
next(bool ret_parent)5 litehtml::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()40 void 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)58 bool 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)67 bool 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)78 bool 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)87 bool 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