void add_to_toc(int level, xml_node<char> *title, xml_attribute<char> *id, bool not_numbered) { char *style_class; char *fulltitle = doc.allocate_string(0, title->value_size() + 100); if (level == 0) { style_class = "toc1"; if (not_numbered) { sprintf(fulltitle, title->value()); } else { sprintf(fulltitle, "%i. %s", ++numbering[0], title->value()); numbering[1] = 0; numbering[2] = 0; } } else if (level == 1) { style_class = "toc2"; if (not_numbered) { sprintf(fulltitle, title->value()); } else { sprintf(fulltitle, "%i.%i %s", numbering[0], ++numbering[1], title->value()); numbering[2] = 0; } } else if (level == 2) { style_class = "toc3"; if (not_numbered) { sprintf(fulltitle, title->value()); } else { sprintf(fulltitle, "%i.%i.%i %s", numbering[0], numbering[1], ++numbering[2], title->value()); } } else throw std::exception("Invalid TOC level"); xml_node<char> *tocentry = doc.allocate_node(node_element, "a", fulltitle); char *link = doc.allocate_string(0, id->value_size() + 1); memcpy(link + 1, id->value(), id->value_size()); link[0] = '#'; tocentry->append_attribute(doc.allocate_attribute("href", link, 0, id->value_size() + 1)); tocentry->append_attribute(doc.allocate_attribute("class", style_class)); toc.append_node(tocentry); toc.append_node(doc.allocate_node(node_element, "br")); xml_node<char> *title_data = title->first_node(); if (title_data) title->remove_node(title_data); title->value(fulltitle); }
void XmlParse::AppendAttribute(const std::string &NewAttributeName, const std::string &NewAttributeValue, xml_document<> &doc, xml_node<> *ParentNode) { xml_attribute<> *attr = doc.allocate_attribute(doc.allocate_string(NewAttributeName.c_str()), doc.allocate_string(NewAttributeValue.c_str())); if (ParentNode) { ParentNode->append_attribute(attr); } }
void process_contextless(xml_node<char> *node) { // Translate contextless doxygen tags if (string(node->name()) == "ulink") { node->name("a"); xml_attribute<char> *attr = node->first_attribute("url"); if (attr) attr->name("href"); } else if (string(node->name()) == "ref") { node->name("a"); xml_attribute<char> *attr = node->first_attribute("refid"); if (attr) { attr->name("href"); char *value = doc.allocate_string(0, attr->value_size() + 1); std::memcpy(value + 1, attr->value(), attr->value_size()); value[0] = '#'; attr->value(value, attr->value_size() + 1); } } else if (string(node->name()) == "computeroutput") { node->name("code"); } else if (string(node->name()) == "verbatim") { node->name("pre"); } else if (string(node->name()) == "linebreak") { node->name("br"); } else if (string(node->name()) == "hruler") { node->name("hr"); } else if (string(node->name()) == "heading") { xml_attribute<char> *attr = node->first_attribute("level"); if (attr) { int level = atoi(attr->value()); if (level == 0) node->name("h0"); else if (level == 1) node->name("h1"); else if (level == 2) node->name("h2"); else if (level == 3) node->name("h3"); else if (level == 4) node->name("h4"); else if (level == 5) node->name("h5"); else if (level == 6) node->name("h6"); else if (level == 7) node->name("h7"); else if (level == 8) node->name("h8"); else node->name("h9"); } } else if (string(node->name()) == "toc") { if (toc.parent() != 0) throw std::exception("More than one <toc> tag found."); toc.name("toc-contents"); node->append_node(&toc); } else if (string(node->name()) == "sect1") { xml_node<char> *title = node->first_node("title"); if (title) { title->name("h2"); xml_attribute<char> *id = node->first_attribute("id"); if (id) { xml_attribute<char> *not_numbered = node->first_attribute("not-numbered"); add_to_toc(0, title, id, not_numbered != 0); id->parent()->remove_attribute(id); title->append_attribute(id); } } } else if (string(node->name()) == "sect2") { xml_node<char> *title = node->first_node("title"); if (title) { title->name("h3"); xml_attribute<char> *id = node->first_attribute("id"); if (id) { xml_attribute<char> *not_numbered = node->first_attribute("not-numbered"); add_to_toc(1, title, id, not_numbered != 0); id->parent()->remove_attribute(id); title->append_attribute(id); } } } else if (string(node->name()) == "sect3") { xml_node<char> *title = node->first_node("title"); if (title) { title->name("h4"); xml_attribute<char> *id = node->first_attribute("id"); if (id) { xml_attribute<char> *not_numbered = node->first_attribute("not-numbered"); add_to_toc(2, title, id, not_numbered != 0); id->parent()->remove_attribute(id); title->append_attribute(id); } } } else if (string(node->name()) == "itemizedlist") { node->name("ul"); } else if (string(node->name()) == "listitem") { node->name("li"); } else if (string(node->name()) == "table") { node->append_attribute(doc.allocate_attribute("border", "1")); node->append_attribute(doc.allocate_attribute("cellpadding", "3pt")); } else if (string(node->name()) == "row") { node->name("tr"); } else if (string(node->name()) == "entry") { if (node->first_attribute("thead") && string(node->first_attribute("thead")->value()) == "yes") node->name("th"); else node->name("td"); xml_node<char> *rowspan = node->first_node("rowspan"); if (rowspan) { xml_attribute<char> *attr = rowspan->first_attribute("count"); if (attr) { xml_attribute<char> *a = doc.allocate_attribute(); a->name("rowspan"); a->value(attr->value()); node->append_attribute(a); } } } else if (string(node->name()) == "emphasis") { node->name("i"); } else if (string(node->name()) == "bold") { node->name("b"); } else if (string(node->name()) == "space") { node->type(node_data); int n = 1; if (node->first_attribute("count")) n = atoi(node->first_attribute("count")->value()); char *data = doc.allocate_string(0, n); memset(data, ' ', n); node->value(data, n); } // Process recursively xml_node<char> *child = node->first_node(); while (child) { xml_node<char> *next = child->next_sibling(); process_contextless(child); child = next; } }