summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/auto_index/src/auto_index.hpp
blob: 255b8575f5af97cd23ef08d21e375c0e80db1c27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// 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