Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/litehtml/document.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ namespace litehtml
void append_children_from_string(element& parent, const char* str);
void dump(dumper& cout);

void update();

static litehtml::document::ptr createFromString(const char* str, litehtml::document_container* objPainter, const char* master_styles = litehtml::master_css, const char* user_styles = "");

private:
Expand Down
108 changes: 56 additions & 52 deletions src/document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,61 @@ litehtml::document::~document()
}
}

void litehtml::document::update()
{
container()->get_media_features(m_media);

//// apply master CSS
m_root->apply_stylesheet(m_master_css);
//
//// parse elements attributes
m_root->parse_attributes();
//
//// parse style sheets linked in document
media_query_list::ptr media;
for (const auto& css : m_css)
{
if (!css.media.empty())
{
media = media_query_list::create_from_string(css.media, shared_from_this());
}
else
{
media = nullptr;
}
m_styles.parse_stylesheet(css.text.c_str(), css.baseurl.c_str(), shared_from_this(), media);
}
//// Sort css selectors using CSS rules.
m_styles.sort_selectors();
//
//// get current media features
if (!m_media_lists.empty())
{
update_media_lists(m_media);
}
//
//// Apply parsed styles.
m_root->apply_stylesheet(m_styles);
//
//// Apply user styles if any
m_root->apply_stylesheet(m_user_css);
//
//// Initialize m_css
m_root->compute_styles();
//
//// Create rendering tree
m_root_render = m_root->create_render_item(nullptr);
//
//// Now the m_tabular_elements is filled with tabular elements.
//// We have to check the tabular elements for missing table elements
//// and create the anonymous boxes in visual table layout
fix_tables_layout();

// Finally initialize elements
// init() return pointer to the render_init element because it can change its type
m_root_render = m_root_render->init();
}

litehtml::document::ptr litehtml::document::createFromString( const char* str, document_container* objPainter, const char* master_styles, const char* user_styles )
{
// parse document into GumboOutput
Expand Down Expand Up @@ -79,59 +134,8 @@ litehtml::document::ptr litehtml::document::createFromString( const char* str, d
// Let's process created elements tree
if (doc->m_root)
{
doc->container()->get_media_features(doc->m_media);

doc->m_root->set_pseudo_class(_root_, true);

// apply master CSS
doc->m_root->apply_stylesheet(doc->m_master_css);

// parse elements attributes
doc->m_root->parse_attributes();

// parse style sheets linked in document
media_query_list::ptr media;
for (const auto& css : doc->m_css)
{
if (!css.media.empty())
{
media = media_query_list::create_from_string(css.media, doc);
}
else
{
media = nullptr;
}
doc->m_styles.parse_stylesheet(css.text.c_str(), css.baseurl.c_str(), doc, media);
}
// Sort css selectors using CSS rules.
doc->m_styles.sort_selectors();

// get current media features
if (!doc->m_media_lists.empty())
{
doc->update_media_lists(doc->m_media);
}

// Apply parsed styles.
doc->m_root->apply_stylesheet(doc->m_styles);

// Apply user styles if any
doc->m_root->apply_stylesheet(doc->m_user_css);

// Initialize m_css
doc->m_root->compute_styles();

// Create rendering tree
doc->m_root_render = doc->m_root->create_render_item(nullptr);

// Now the m_tabular_elements is filled with tabular elements.
// We have to check the tabular elements for missing table elements
// and create the anonymous boxes in visual table layout
doc->fix_tables_layout();

// Finally initialize elements
// init() return pointer to the render_init element because it can change its type
doc->m_root_render = doc->m_root_render->init();
doc->update();
}

return doc;
Expand Down