source: trunk/lib/Configuration.h @ 1152

Last change on this file since 1152 was 1152, checked in by Peter Johansson, 11 years ago

allow config file to override svn property (fixes #326). Adding two new files (split.h and split.cc) from yat.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.6 KB
Line 
1#ifndef _theplu_svndigest_configuration_
2#define _theplu_svndigest_configuration_
3
4// $Id: Configuration.h 1152 2010-08-07 14:31:18Z 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 pdf, png, none, or svg
76     */
77    const std::string& image_anchor_format(void) const;
78
79    /**
80       \brief set image_anchor_format
81     */
82    void image_anchor_format(const std::string&);
83
84    /**
85       \return png, none, svg, or svgz
86     */
87    const std::string& image_format(void) const;
88
89    /**
90       \brief set image_format
91     */
92    void image_format(const std::string&);
93
94    ///
95    /// throw if stream is not a valid config
96    ///
97    /// @brief load configuration from stream
98    ///
99    void load(std::istream&);
100
101    ///
102    /// @return true if we should warn about missing copyright statement
103    ///
104    bool  missing_copyright_warning(void) const;
105
106    /**
107       \return true (default) if we wanna output blame information
108     */
109    bool output_blame_information(void) const;
110
111    /**
112       \return true (default) if we wanna output stats for file
113     */
114    bool output_file(void) const;
115
116    /**
117       svn properties set in config file
118
119       This is supposed to be used only in SVNproperty class
120
121       \return NULL if there is no prop for \a filename in config
122     */
123    const std::map<std::string, std::string>& 
124    svn_properties(const std::string& filename) const;
125
126    ///
127    /// @return root for the trac envrionment, e.g.,
128    /// http://dev.thep.lu.se/svndigest/
129    ///
130    std::string trac_root(void) const;
131
132  private:
133    ///
134    /// Creates a Config object with default settings.
135    ///
136    /// @brief Default Constructor
137    ///
138    Configuration(void);
139    // Copy Constructor not implemented
140    Configuration(const Configuration&);
141    // assignment not implemented because assignment is always self-assignment
142    Configuration& operator=(const Configuration&);
143    // destructor not implemented
144    ~Configuration(void);
145
146    friend std::ostream& operator<<(std::ostream&, const Configuration&);
147
148    void add_codon(std::string, std::string, std::string);
149
150    void clear(void);
151    const std::pair<std::string,std::string>* dictionary(std::string lhs) const;
152    bool equal_false(std::string) const;
153    bool equal_true(std::string) const;
154
155    /**
156       find first element in range, [first, last) for which
157       element->first matches filename.
158
159       Iterator->first must return string, i.e., [first, last) is
160       often a range of pair<string, T>
161
162       If no match is found, last is returned.
163     */
164    template<typename Iterator>
165    Iterator find_fn(Iterator first, Iterator last,
166                     const std::string& filename) const;
167
168    ///
169    /// @brief load deafult configuration
170    ///
171    void load(void);
172
173    void set_default(void);
174    /**
175       Translate string \a str using dictionary \a dict
176
177       \note \a str must be equal to d.first (see regexp(5)),
178       or behavior is unspecified.
179
180       \throw if a '$' character is not followed by a positive integer
181       that is not larger than number of wildcards in dictionary \a d.
182     */
183    std::string translate(const std::string& str,
184                          const std::pair<std::string, std::string>& d) const;
185   
186    void validate_dictionary(void) const;
187
188    static Configuration* instance_;
189
190    std::map<std::string, std::string> author_color_;
191    std::map<std::string, Alias> copyright_alias_;
192
193    bool missing_copyright_warning_;
194   
195    typedef std::vector<std::pair<std::string, std::string> > VectorPair;
196    typedef std::vector<std::pair<std::string, VectorPair> > String2Codons; 
197    String2Codons string2codons_;
198
199    VectorPair dictionary_;
200    std::string image_anchor_format_;
201    std::string image_format_;
202    bool output_blame_information_;
203    bool output_file_;
204    std::string trac_root_;
205
206    typedef std::map<std::string, std::string> str_map;
207    typedef std::pair<std::string, str_map> props;
208    std::vector<props> svn_props_;
209    const str_map empty_str_map_;
210  };
211
212  ///
213  /// @brief Output operator
214  ///
215  std::ostream& operator<<(std::ostream&, const Configuration&);
216
217  /**
218     If first character is '\n' replace it with "<NEWLINE>"
219   */
220  std::string trans_end_code(std::string);
221
222  /**
223     If last character is '\n' replace it with "<NEWLINE>"
224   */
225  std::string trans_beg_code(std::string);
226
227  /**
228     Trim \a c from beginning and end of string \a str;
229     
230     \return resulting string
231
232     \throw if first or last character of \a str is NOT character \a c
233  */
234  std::string trim(std::string str, char c);
235
236  /**
237     \brief Class for errors when reading config file.
238   */
239  class Config_error : public std::runtime_error
240  {
241  public:
242    Config_error(const std::string& line, const std::string& message);
243  };
244
245  // template implementation
246
247  template<typename Iterator>
248  Iterator Configuration::find_fn(Iterator first, Iterator last,
249                                  const std::string& filename) const
250  {
251    for( ; first!=last; ++first) {
252      if (fnmatch(first->first.c_str(), filename.c_str()))
253        return first;
254    }
255    return last;
256  }
257
258
259}} // end of namespace svndigest and namespace theplu
260
261#endif
262
263
Note: See TracBrowser for help on using the repository browser.