// Copyright 2008 John Maddock // // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_AUTO_INDEX_HPP #define BOOST_AUTO_INDEX_HPP #include #if BOOST_VERSION < 104400 # error "This tool requires Boost 1.44 or later to build." #endif #define BOOST_FILESYSTEM_VERSION 3 #include "tiny_xml.hpp" #include #include #include #include #include #include #include #include struct index_info { std::string term; // The term goes in the index entry boost::regex search_text; // What to search for when indexing the term. boost::regex search_id; // What id's this term may be indexed in. std::string category; // Index category (function, class, macro etc). }; inline bool operator < (const index_info& a, const index_info& b) { return (a.term != b.term) ? (a.term < b.term) : (a.category < b.category); } struct index_entry; typedef boost::shared_ptr index_entry_ptr; bool operator < (const index_entry_ptr& a, const index_entry_ptr& b); typedef std::set index_entry_set; struct index_entry { std::string key; // The index term. std::string sort_key; // upper case version of term used for sorting. std::string id; // The id of the block that we will link to. std::string category; // The category of this entry (function, class, macro etc). index_entry_set sub_keys; // All our sub-keys. bool preferred; // This entry is the preferred one for this key index_entry() : preferred(false) {} index_entry(const std::string& k) : key(k), sort_key(k), preferred(false) { boost::to_upper(sort_key); } index_entry(const std::string& k, const std::string& i) : key(k), sort_key(k), id(i), preferred(false) { boost::to_upper(sort_key); } index_entry(const std::string& k, const std::string& i, const std::string& c) : key(k), sort_key(k), id(i), category(c), preferred(false) { boost::to_upper(sort_key); } }; inline bool operator < (const index_entry_ptr& a, const index_entry_ptr& b) { return ((a->sort_key != b->sort_key) ? (a->sort_key < b->sort_key) : (a->category < b->category)); } struct id_rewrite_rule { bool base_on_id; // rewrite the title if "id" matches the section id, otherwise rewrite if title matches "id". boost::regex id; // regex for the id or title to match std::string new_name; // either literal string or format string for the new name. id_rewrite_rule(const std::string& i, const std::string& n, bool b) : base_on_id(b), id(i), new_name(n) {} }; struct node_id { const std::string* id; node_id* prev; }; struct title_info { std::string title; title_info* prev; }; struct file_scanner { boost::regex scanner, file_name_filter, section_filter; std::string format_string, type, term_formatter; }; inline bool operator < (const file_scanner & a, const file_scanner& b) { return a.type < b.type; } typedef std::multiset file_scanner_set_type; void process_script(const std::string& script); void scan_dir(const std::string& dir, const std::string& mask, bool recurse); void scan_file(const std::string& file); void generate_indexes(); const std::string* find_attr(boost::tiny_xml::element_ptr node, const char* name); extern file_scanner_set_type file_scanner_set; inline void add_file_scanner(const std::string& type, const std::string& scanner, const std::string& format, const std::string& term_formatter, const std::string& id_filter, const std::string& file_filter) { file_scanner s; s.type = type; s.scanner = scanner; s.format_string = format; s.term_formatter = term_formatter; if(file_filter.size()) s.file_name_filter = file_filter; if(id_filter.size()) s.section_filter = id_filter; file_scanner_set.insert(s); } extern std::set index_terms; extern std::set > found_terms; extern bool no_duplicates; extern bool verbose; extern index_entry_set index_entries; extern boost::tiny_xml::element_list indexes; extern std::list id_rewrite_list; extern bool internal_indexes; extern std::string prefix; extern std::string internal_index_type; extern boost::regex debug; #endif