source: trunk/lib/Configuration.h @ 1155

Last change on this file since 1155 was 1155, checked in by Peter Johansson, 13 years ago

new config option: tab_size. fixes #229

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.9 KB
Line 
1#ifndef _theplu_svndigest_configuration_
2#define _theplu_svndigest_configuration_
3
4// $Id: Configuration.h 1155 2010-08-09 03:41:59Z peter $
5
6/*
7  Copyright (C) 2007, 2008, 2009 Jari Häkkinen, Peter Johansson
8  Copyright (C) 2010 Peter Johansson
9
10  This file is part of svndigest, http://dev.thep.lu.se/svndigest
11
12  svndigest is free software; you can redistribute it and/or modify it
13  under the terms of the GNU General Public License as published by
14  the Free Software Foundation; either version 3 of the License, or
15  (at your option) any later version.
16
17  svndigest is distributed in the hope that it will be useful, but
18  WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  General Public License for more details.
21
22  You should have received a copy of the GNU General Public License
23  along with svndigest. If not, see <http://www.gnu.org/licenses/>.
24*/
25
26#include "Alias.h"
27
28#include <iostream>
29#include <map>
30#include <stdexcept>
31#include <string>
32#include <utility>
33#include <vector>
34
35namespace theplu{
36namespace svndigest{
37
38  ///
39  /// Configuration class takes care of all setting defined in the
40  /// configuration file.
41  ///
42  class Configuration
43  {
44  public:
45    static Configuration& instance(void);
46
47    /**
48       \return Hexadecimal color code (e.g. 5aee4a) that is used in
49       blame output and as line colors in plots. If no color is
50       configured for \a author, an empty string is returned.
51     */
52    std::string author_str_color(const std::string& author) const;
53
54    /**
55       The map to lookup the author-color mapping set in the
56       configuration file. The color code is a six digit hexadecimal
57       number rrggbb.
58
59       \return The author-color map
60    */
61    const std::map<std::string, std::string>& author_colors(void) const;
62
63    /**
64       \return vector of parse codons for the given \a file_name
65     */
66    const std::vector<std::pair<std::string, std::string> >* 
67    codon(std::string file_name) const;
68
69    ///
70    /// @brief Aliases for Copyright
71    ///
72    const std::map<std::string, Alias>& copyright_alias(void) const;
73
74    /**
75       @return copyright string e.g. 'Copyright (C)' (default)
76    */
77    const std::string& copyright_string(void) const;
78
79    /**
80       \return pdf, png, none, or svg
81     */
82    const std::string& image_anchor_format(void) const;
83
84    /**
85       \brief set image_anchor_format
86     */
87    void image_anchor_format(const std::string&);
88
89    /**
90       \return png, none, svg, or svgz
91     */
92    const std::string& image_format(void) const;
93
94    /**
95       \brief set image_format
96     */
97    void image_format(const std::string&);
98
99    ///
100    /// throw if stream is not a valid config
101    ///
102    /// @brief load configuration from stream
103    ///
104    void load(std::istream&);
105
106    ///
107    /// @return true if we should warn about missing copyright statement
108    ///
109    bool  missing_copyright_warning(void) const;
110
111    /**
112       \return true (default) if we wanna output blame information
113     */
114    bool output_blame_information(void) const;
115
116    /**
117       \return true (default) if we wanna output stats for file
118     */
119    bool output_file(void) const;
120
121    /**
122       svn properties set in config file
123
124       This is supposed to be used only in SVNproperty class
125
126       \return NULL if there is no prop for \a filename in config
127     */
128    const std::map<std::string, std::string>& 
129    svn_properties(const std::string& filename) const;
130
131    /**
132       \return size of a tab, i.e., how many spaces are ued to display
133       a space (in blame output)
134     */
135    size_t tab_size(void) const;
136
137    ///
138    /// @return root for the trac envrionment, e.g.,
139    /// http://dev.thep.lu.se/svndigest/
140    ///
141    std::string trac_root(void) const;
142
143  private:
144    ///
145    /// Creates a Config object with default settings.
146    ///
147    /// @brief Default Constructor
148    ///
149    Configuration(void);
150    // Copy Constructor not implemented
151    Configuration(const Configuration&);
152    // assignment not implemented because assignment is always self-assignment
153    Configuration& operator=(const Configuration&);
154    // destructor not implemented
155    ~Configuration(void);
156
157    friend std::ostream& operator<<(std::ostream&, const Configuration&);
158
159    void add_codon(std::string, std::string, std::string);
160
161    void clear(void);
162    const std::pair<std::string,std::string>* dictionary(std::string lhs) const;
163    bool equal_false(std::string) const;
164    bool equal_true(std::string) const;
165
166    /**
167       find first element in range, [first, last) for which
168       element->first matches filename.
169
170       Iterator->first must return string, i.e., [first, last) is
171       often a range of pair<string, T>
172
173       If no match is found, last is returned.
174     */
175    template<typename Iterator>
176    Iterator find_fn(Iterator first, Iterator last,
177                     const std::string& filename) const;
178
179    ///
180    /// @brief load deafult configuration
181    ///
182    void load(void);
183
184    void set_default(void);
185    /**
186       Translate string \a str using dictionary \a dict
187
188       \note \a str must be equal to d.first (see regexp(5)),
189       or behavior is unspecified.
190
191       \throw if a '$' character is not followed by a positive integer
192       that is not larger than number of wildcards in dictionary \a d.
193     */
194    std::string translate(const std::string& str,
195                          const std::pair<std::string, std::string>& d) const;
196   
197    void validate_dictionary(void) const;
198
199    static Configuration* instance_;
200
201    std::map<std::string, std::string> author_color_;
202    std::map<std::string, Alias> copyright_alias_;
203    std::string copyright_string_;
204
205    bool missing_copyright_warning_;
206   
207    typedef std::vector<std::pair<std::string, std::string> > VectorPair;
208    typedef std::vector<std::pair<std::string, VectorPair> > String2Codons; 
209    String2Codons string2codons_;
210
211    VectorPair dictionary_;
212    std::string image_anchor_format_;
213    std::string image_format_;
214    bool output_blame_information_;
215    bool output_file_;
216    std::string trac_root_;
217    size_t tab_size_;
218
219    typedef std::map<std::string, std::string> str_map;
220    typedef std::pair<std::string, str_map> props;
221    std::vector<props> svn_props_;
222    const str_map empty_str_map_;
223  };
224
225  ///
226  /// @brief Output operator
227  ///
228  std::ostream& operator<<(std::ostream&, const Configuration&);
229
230  /**
231     If first character is '\n' replace it with "<NEWLINE>"
232   */
233  std::string trans_end_code(std::string);
234
235  /**
236     If last character is '\n' replace it with "<NEWLINE>"
237   */
238  std::string trans_beg_code(std::string);
239
240  /**
241     Trim \a c from beginning and end of string \a str;
242     
243     \return resulting string
244
245     \throw if first or last character of \a str is NOT character \a c
246  */
247  std::string trim(std::string str, char c);
248
249  /**
250     \brief Class for errors when reading config file.
251   */
252  class Config_error : public std::runtime_error
253  {
254  public:
255    Config_error(const std::string& line, const std::string& message);
256  };
257
258  // template implementation
259
260  template<typename Iterator>
261  Iterator Configuration::find_fn(Iterator first, Iterator last,
262                                  const std::string& filename) const
263  {
264    for( ; first!=last; ++first) {
265      if (fnmatch(first->first.c_str(), filename.c_str()))
266        return first;
267    }
268    return last;
269  }
270
271
272}} // end of namespace svndigest and namespace theplu
273
274#endif
275
276
Note: See TracBrowser for help on using the repository browser.