blob: 255b8575f5af97cd23ef08d21e375c0e80db1c27 [file] [log] [blame]
// 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 <boost/version.hpp>
#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 <boost/regex.hpp>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <fstream>
#include <cctype>
#include <map>
#include <set>
#include <sstream>
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> index_entry_ptr;
bool operator < (const index_entry_ptr& a, const index_entry_ptr& b);
typedef std::set<index_entry_ptr> 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> 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_info> index_terms;
extern std::set<std::pair<std::string, std::string> > 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_rule> id_rewrite_list;
extern bool internal_indexes;
extern std::string prefix;
extern std::string internal_index_type;
extern boost::regex debug;
#endif