id_placeholder* id_state::add_id_to_section( std::string const& id, id_category category, boost::intrusive_ptr<section_info> const& section) { std::string id_part = id; // Note: Normalizing id according to file compatibility version, but // adding to section according to section compatibility version. if (current_file->compatibility_version >= 106u && category.c < id_category::explicit_id) { id_part = normalize_id(id); } if(!section || section->compatibility_version >= 106u) { return add_placeholder(id_part, category, section ? section->placeholder_1_6 : 0); } else { std::string const& qualified_id = section->id_1_1; std::string new_id; if (!section->placeholder_1_6) new_id = current_file->doc_id_1_1; if (!new_id.empty() && !qualified_id.empty()) new_id += '.'; new_id += qualified_id; if (!new_id.empty() && !id_part.empty()) new_id += '.'; new_id += id_part; return add_placeholder(new_id, category, section->placeholder_1_6); } }
id_placeholder const* document_state_impl::add_id_to_section( boost::string_ref id, id_category category, boost::shared_ptr<section_info> const& section) { std::string id_part(id.begin(), id.end()); // Note: Normalizing id according to file compatibility version, but // adding to section according to section compatibility version. if (current_file->compatibility_version >= 106u && category.c < id_category::explicit_id) { id_part = normalize_id(id); } id_placeholder const* placeholder_1_6 = get_id_placeholder(section); if(!section || section->compatibility_version >= 106u) { return add_placeholder(id_part, category, placeholder_1_6); } else { std::string const& qualified_id = section->id_1_1; std::string new_id; if (!placeholder_1_6) new_id = current_file->doc_id_1_1; if (!new_id.empty() && !qualified_id.empty()) new_id += '.'; new_id += qualified_id; if (!new_id.empty() && !id_part.empty()) new_id += '.'; new_id += id_part; return add_placeholder(new_id, category, placeholder_1_6); } }
id_generation_data(std::string const& src_id) : child_start(src_id.rfind('.') + 1), id(normalize_id(src_id, child_start, max_size - 1)), // 'max_size - 1' leaves a character to append // a number. count(0) { if (std::isdigit(id[id.length() - 1])) { if (child_length() < max_size - 1) id += '_'; else reduce_id(); } }