The Battle for Wesnoth  1.19.1+dev
help_impl.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2024
3  by David White <dave@whitevine.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 /**
17  * Note:
18  * Prior to the creation of this file, all the code associated to the help
19  * browser existed in a single file src/help.cpp, including all of the
20  * widgets, topic generators, and implementation details. This totaled
21  * ~4000 lines of code.
22  *
23  * I have split it all up now, so that the gui aspects are separated from
24  * the content, the "front facing" part which the rest of the code base
25  * interacts with is in src/help/help.?pp, and the topic generators are
26  * separated. The remaining "guts" are here. It is implemented in a static
27  * singleton pattern, using "extern"'d variables, simply for ease of translation
28  * from the previous state. It would probably be a good idea to rewrite this
29  * guy as a proper C++ object. Feel free to do so, or to adopt some other
30  * design pattern.
31  */
32 
33 #pragma once
34 
35 #include "color.hpp"
36 #include "exceptions.hpp" // for error
37 #include "font/constants.hpp"
38 #include "font/standard_colors.hpp"
39 #include "gettext.hpp"
40 #include <optional>
41 #include <list> // for list
42 #include <memory>
43 #include <sstream>
44 #include <string> // for string, allocator, etc
45 #include <utility> // for pair, make_pair
46 #include <vector> // for vector, etc
47 #include <boost/logic/tribool.hpp>
48 
49 class game_config_view;
50 class config;
51 class unit_type;
52 class terrain_type_data;
53 
54 namespace help {
55 
56 /**
57  * Generate the help contents from the configurations given to the manager.
58  */
59 void generate_contents();
60 
61 
62 /** Generate a topic text on the fly. */
64 {
65 public:
66  topic_generator() = default;
67  virtual std::string operator()() const = 0;
68  virtual ~topic_generator() {}
69 };
70 
72  std::string text_;
73 public:
74  text_topic_generator(const std::string& t): text_(t) {}
75  virtual std::string operator()() const { return text_; }
76 };
77 
78 /**
79  * The text displayed in a topic. It is generated on the fly with the information contained in generator_
80  */
82 {
83  mutable std::vector< std::string > parsed_text_;
84  mutable std::shared_ptr<topic_generator> generator_;
85 public:
86  topic_text() = default;
87  ~topic_text() = default;
88 
89  topic_text(const std::string& t):
90  parsed_text_(),
91  generator_(std::make_shared<text_topic_generator>(t))
92  {
93  }
94 
95  explicit topic_text(std::shared_ptr<topic_generator> g):
96  parsed_text_(),
97  generator_(g)
98  {
99  }
100 
101  topic_text(const topic_text& t) = default;
102  topic_text(topic_text&& t) = default;
104  topic_text& operator=(const topic_text& t) = default;
105  topic_text& operator=(std::shared_ptr<topic_generator> g);
106 
107  const std::vector<std::string>& parsed_text() const;
108 };
109 
110 /** A topic contains a title, an id and some text. */
111 struct topic
112 {
113  topic() :
114  title(),
115  id(),
116  text()
117  {
118  }
119 
120  topic(const std::string &_title, const std::string &_id) :
121  title(_title),
122  id(_id),
123  text()
124  {
125  }
126 
127  topic(const std::string &_title, const std::string &_id, const std::string &_text)
128  : title(_title), id(_id), text(_text) {}
129  topic(const std::string &_title, const std::string &_id, std::shared_ptr<topic_generator> g)
130  : title(_title), id(_id), text(g) {}
131  /** Two topics are equal if their IDs are equal. */
132  bool operator==(const topic &) const;
133  bool operator!=(const topic &t) const { return !operator==(t); }
134  /** Comparison on the ID. */
135  bool operator<(const topic &) const;
136  std::string title, id;
137  mutable topic_text text;
138 };
139 
140 struct section;
141 typedef std::list<section> section_list;
142 typedef std::list<topic> topic_list;
143 
144 /** A section contains topics and sections along with title and ID. */
145 struct section {
147  title(""),
148  id(""),
149  topics(),
150  sections()
151  {
152  }
153 
154  /** Two sections are equal if their IDs are equal. */
155  bool operator==(const section &) const;
156  /** Comparison on the ID. */
157  bool operator<(const section &) const;
158 
159  /** Allocate memory for and add the section. */
160  void add_section(const section &s);
161 
162  void clear();
163  std::string title, id;
166 };
167 
168 
169 /**
170  * To be used as a function object to locate sections and topics with a specified ID.
171  */
172 class has_id
173 {
174 public:
175  has_id(const std::string &id) : id_(id) {}
176  bool operator()(const topic &t) { return t.id == id_; }
177  bool operator()(const section &s) { return s.id == id_; }
178  bool operator()(const section *s) { return s != nullptr && s->id == id_; }
179 private:
180  const std::string id_;
181 };
182 
183 /** To be used as a function object when sorting topic lists on the title. */
185 {
186 public:
187  bool operator()(const topic &t1, const topic &t2)
188  {
189  return translation::compare(t1.title, t2.title) < 0;
190  }
191 };
192 
193 /** To be used as a function object when sorting section lists on the title. */
195 {
196 public:
197  bool operator()(const section& s1, const section& s2)
198  {
199  return translation::compare(s1.title, s2.title) < 0;
200  }
201 };
202 
204 {
205 public:
206  bool operator() (const std::string &s1, const std::string &s2) const {
207  return translation::compare(s1, s2) < 0;
208  }
209 };
210 
211 /** Thrown when the help system fails to parse something. */
212 struct parse_error : public game::error
213 {
214  parse_error(const std::string& msg) : game::error(msg) {}
215 };
216 
217 // Generator stuff below. Maybe move to a separate file? This one is
218 // getting crowded. Dunno if much more is needed though so I'll wait and
219 // see.
220 
221 /** Dispatch generators to their appropriate functions. */
222 void generate_sections(const config *help_cfg, const std::string &generator, section &sec, int level);
223 std::vector<topic> generate_topics(const bool sort_topics,const std::string &generator);
224 std::string generate_topic_text(const std::string &generator, const config *help_cfg,
225 const section &sec, const std::vector<topic>& generated_topics);
226 std::string generate_contents_links(const std::string& section_name, const config *help_cfg);
227 std::string generate_contents_links(const section &sec, const std::vector<topic>& topics);
228 
229 /**
230  * return a hyperlink with the unit's name and pointing to the unit page
231  * return empty string if this unit is hidden. If not yet discovered add the (?) suffix
232  */
233 std::string make_unit_link(const std::string& type_id);
234 /** return a list of hyperlinks to unit's pages (ordered or not) */
235 std::vector<std::string> make_unit_links_list(
236  const std::vector<std::string>& type_id_list, bool ordered = false);
237 
238 void generate_races_sections(const config *help_cfg, section &sec, int level);
239 void generate_terrain_sections(section &sec, int level);
240 std::vector<topic> generate_unit_topics(const bool, const std::string& race);
241 void generate_unit_sections(const config *help_cfg, section &sec, int level, const bool, const std::string& race);
244  /** Ignore this unit for documentation purposes. */
246  /**
247  * Although the unit itself is hidden, traits reachable via this unit are not hidden.
248  *
249  * This is a bug workaround - traits are defined by WML macros, and therefore the help
250  * system has to use a place where that macro is instanciated to provide the documentation.
251  * None of the normal unit types has the "loyal" trait, but there is a hidden unit which
252  * does, purely to support the help system.
253  */
255 };
256 /**
257  * Return the type of description that should be shown for a unit of
258  * the given kind. This method is intended to filter out information
259  * about units that should not be shown, for example due to not being
260  * encountered.
261  */
263 std::vector<topic> generate_ability_topics(const bool);
264 std::vector<topic> generate_time_of_day_topics(const bool);
265 std::vector<topic> generate_weapon_special_topics(const bool);
266 
267 void generate_era_sections(const config *help_cfg, section &sec, int level);
268 std::vector<topic> generate_faction_topics(const config &, const bool);
269 std::vector<topic> generate_era_topics(const bool, const std::string & era_id);
270 std::vector<topic> generate_trait_topics(const bool);
271 
272 /**
273  * Parse a help config, return the top level section. Return an empty
274  * section if cfg is nullptr.
275  */
276 section parse_config(const config *cfg);
277 /** Recursive function used by parse_config. */
278 void parse_config_internal(const config *help_cfg, const config *section_cfg,
279  section &sec, int level=0);
280 
281 /**
282  * Return true if the section with id section_id is referenced from
283  * another section in the config, or the toplevel.
284  */
285 bool section_is_referenced(const std::string &section_id, const config &cfg);
286 /**
287  * Return true if the topic with id topic_id is referenced from
288  * another section in the config, or the toplevel.
289  */
290 bool topic_is_referenced(const std::string &topic_id, const config &cfg);
291 
292 /**
293  * Search for the topic with the specified identifier in the section
294  * and its subsections. Return the found topic, or nullptr if none could
295  * be found.
296  */
297 const topic *find_topic(const section &sec, const std::string &id);
298 
299 /**
300  * Search for the section with the specified identifier in the section
301  * and its subsections. Return the found section or nullptr if none could
302  * be found.
303  */
304 const section *find_section(const section &sec, const std::string &id);
305 section *find_section(section &sec, const std::string &id);
306 
307 /**
308  * Parse a xml style marked up text string. Return a vector with
309  * the different parts of the text. Each markup item and the text
310  * between markups are separate parts. Each line of returned vector
311  * is valid WML.
312  */
313 std::vector<std::string> parse_text(const std::string &text);
314 
315 /**
316  * Convert the the text between start and end xml tags for element_name to
317  * valid wml attributes, surrounded between [element_name]...[/element_name].
318  * The attributes in the start tag are also used.
319  * @return the resulting WML.
320  */
321 std::string convert_to_wml(std::string &element_name, const std::string &contents);
322 
323 /** Make a best effort to word wrap s. All parts are less than width. */
324 std::vector<std::string> split_in_width(const std::string &s, const int font_size, const unsigned width);
325 
326 std::string remove_first_space(const std::string& text);
327 
328 /** Prepend all chars with meaning inside attributes with a backslash. */
329 std::string escape(const std::string &s);
330 
331 /** Return the first word in s, not removing any spaces in the start of it. */
332 std::string get_first_word(const std::string &s);
333 
334 /** Load the appropriate terrain types data to use */
335 std::shared_ptr<terrain_type_data> load_terrain_types_data();
336 
337 extern const game_config_view *game_cfg;
338 // The default toplevel.
340 // All sections and topics not referenced from the default toplevel.
342 
343 extern int last_num_encountered_units;
345 extern boost::tribool last_debug_state;
346 
347 extern std::vector<std::string> empty_string_vector;
348 extern const int max_section_level;
349 extern const int title_size;
350 extern const int title2_size;
351 extern const int box_width;
352 extern const int normal_font_size;
353 extern const unsigned max_history;
354 extern const std::string topic_img;
355 extern const std::string closed_section_img;
356 extern const std::string open_section_img;
357 // The topic to open by default when opening the help dialog.
358 extern const std::string default_show_topic;
359 extern const std::string unknown_unit_topic;
360 extern const std::string unit_prefix;
361 extern const std::string terrain_prefix;
362 extern const std::string race_prefix;
363 extern const std::string faction_prefix;
364 extern const std::string era_prefix;
365 extern const std::string variation_prefix;
366 extern const std::string ability_prefix;
367 
368 // id starting with '.' are hidden
369 std::string hidden_symbol(bool hidden = true);
370 
371 bool is_visible_id(const std::string &id);
372 
373 /**
374  * Return true if the id is valid for user defined topics and
375  * sections. Some IDs are special, such as toplevel and may not be
376  * be defined in the config.
377  */
378 bool is_valid_id(const std::string &id);
379 
380  // Helpers for making generation of topics easier.
381 
382 inline std::string make_link(const std::string& text, const std::string& dst)
383  {
384  // some sorting done on list of links may rely on the fact that text is first
385  return "<ref>text='" + help::escape(text) + "' dst='" + help::escape(dst) + "'</ref>";
386  }
387 
388 inline std::string jump_to(const unsigned pos)
389  {
390  std::stringstream ss;
391  ss << "<jump>to=" << pos << "</jump>";
392  return ss.str();
393  }
394 
395 inline std::string jump(const unsigned amount)
396  {
397  std::stringstream ss;
398  ss << "<jump>amount=" << amount << "</jump>";
399  return ss.str();
400  }
401 
402 inline std::string bold(const std::string &s)
403  {
404  std::stringstream ss;
405  ss << "<bold>text='" << help::escape(s) << "'</bold>";
406  return ss.str();
407  }
408 
409 // A string to be displayed and its width.
410 typedef std::pair< std::string, unsigned > item;
411 
412 typedef std::vector<std::vector<help::item>> table_spec;
413 // Create a table using the table specs. Return markup with jumps
414 // that create a table. The table spec contains a vector with
415 // vectors with pairs. The pairs are the markup string that should
416 // be in a cell, and the width of that cell.
417 std::string generate_table(const table_spec &tab, const unsigned int spacing=font::relative_size(20));
418 
419 // Return the width for the image with filename.
420 unsigned image_width(const std::string &filename);
421 
422 // Add to the vector v an help::item for the string s, preceded by the given image if any.
423 void push_tab_pair(std::vector<help::item> &v, const std::string &s, const std::optional<std::string> &image = {}, unsigned padding = 0);
424 
425 } // end namespace help
double t
Definition: astarsearch.cpp:63
double g
Definition: astarsearch.cpp:63
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:159
A class grating read only view to a vector of config objects, viewed as one config with all children ...
To be used as a function object to locate sections and topics with a specified ID.
Definition: help_impl.hpp:173
has_id(const std::string &id)
Definition: help_impl.hpp:175
const std::string id_
Definition: help_impl.hpp:180
bool operator()(const topic &t)
Definition: help_impl.hpp:176
bool operator()(const section &s)
Definition: help_impl.hpp:177
bool operator()(const section *s)
Definition: help_impl.hpp:178
To be used as a function object when sorting section lists on the title.
Definition: help_impl.hpp:195
bool operator()(const section &s1, const section &s2)
Definition: help_impl.hpp:197
bool operator()(const std::string &s1, const std::string &s2) const
Definition: help_impl.hpp:206
text_topic_generator(const std::string &t)
Definition: help_impl.hpp:74
virtual std::string operator()() const
Definition: help_impl.hpp:75
To be used as a function object when sorting topic lists on the title.
Definition: help_impl.hpp:185
bool operator()(const topic &t1, const topic &t2)
Definition: help_impl.hpp:187
Generate a topic text on the fly.
Definition: help_impl.hpp:64
virtual std::string operator()() const =0
virtual ~topic_generator()
Definition: help_impl.hpp:68
The text displayed in a topic.
Definition: help_impl.hpp:82
topic_text(const topic_text &t)=default
topic_text & operator=(const topic_text &t)=default
const std::vector< std::string > & parsed_text() const
Definition: help_impl.cpp:386
topic_text(std::shared_ptr< topic_generator > g)
Definition: help_impl.hpp:95
std::shared_ptr< topic_generator > generator_
Definition: help_impl.hpp:84
~topic_text()=default
topic_text & operator=(topic_text &&t)=default
std::vector< std::string > parsed_text_
Definition: help_impl.hpp:83
topic_text()=default
topic_text(const std::string &t)
Definition: help_impl.hpp:89
topic_text(topic_text &&t)=default
Contains the database of all known terrain types, both those defined explicitly by WML [terrain_type]...
Definition: type_data.hpp:40
A single unit type that the player may recruit.
Definition: types.hpp:43
std::string id
Text to match against addon_info.tags()
Definition: manager.cpp:205
int relative_size(int size)
Definition: constants.hpp:30
Definition: help.cpp:53
std::string get_first_word(const std::string &s)
Return the first word in s, not removing any spaces in the start of it.
Definition: help_impl.cpp:1539
std::vector< topic > generate_unit_topics(const bool sort_generated, const std::string &race)
Definition: help_impl.cpp:1058
std::string hidden_symbol(bool hidden)
Definition: help_impl.cpp:1626
void generate_unit_sections(const config *, section &sec, int, const bool, const std::string &race)
Definition: help_impl.cpp:1025
UNIT_DESCRIPTION_TYPE
Definition: help_impl.hpp:242
@ FULL_DESCRIPTION
Definition: help_impl.hpp:243
@ HIDDEN_BUT_SHOW_MACROS
Although the unit itself is hidden, traits reachable via this unit are not hidden.
Definition: help_impl.hpp:254
@ NO_DESCRIPTION
Ignore this unit for documentation purposes.
Definition: help_impl.hpp:245
std::string bold(const std::string &s)
Definition: help_impl.hpp:402
std::string make_link(const std::string &text, const std::string &dst)
Definition: help_impl.hpp:382
void generate_races_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:845
std::string escape(const std::string &s)
Prepend all chars with meaning inside attributes with a backslash.
Definition: help_impl.cpp:1727
bool topic_is_referenced(const std::string &topic_id, const config &cfg)
Return true if the topic with id topic_id is referenced from another section in the config,...
Definition: help_impl.cpp:176
std::vector< topic > generate_time_of_day_topics(const bool)
Definition: help_impl.cpp:401
int last_num_encountered_units
Definition: help_impl.cpp:72
void generate_terrain_sections(section &sec, int)
Definition: help_impl.cpp:966
std::string make_unit_link(const std::string &type_id)
return a hyperlink with the unit's name and pointing to the unit page return empty string if this uni...
Definition: help_impl.cpp:804
const std::string open_section_img
Definition: help_impl.cpp:85
const std::string unit_prefix
Definition: help_impl.cpp:89
unsigned image_width(const std::string &filename)
Definition: help_impl.cpp:1660
const std::string variation_prefix
Definition: help_impl.cpp:94
void parse_config_internal(const config *help_cfg, const config *section_cfg, section &sec, int level)
Recursive function used by parse_config.
Definition: help_impl.cpp:200
bool is_visible_id(const std::string &id)
Definition: help_impl.cpp:1630
const std::string closed_section_img
Definition: help_impl.cpp:84
std::vector< topic > generate_faction_topics(const config &era, const bool sort_generated)
Definition: help_impl.cpp:647
const int box_width
Definition: help_impl.cpp:80
void generate_sections(const config *help_cfg, const std::string &generator, section &sec, int level)
Dispatch generators to their appropriate functions.
Definition: help_impl.cpp:343
const std::string topic_img
Definition: help_impl.cpp:83
UNIT_DESCRIPTION_TYPE description_type(const unit_type &type)
Return the type of description that should be shown for a unit of the given kind.
Definition: help_impl.cpp:1189
const std::string race_prefix
Definition: help_impl.cpp:91
const std::string ability_prefix
Definition: help_impl.cpp:95
std::vector< std::vector< help::item > > table_spec
Definition: help_impl.hpp:412
std::vector< std::string > make_unit_links_list(const std::vector< std::string > &type_id_list, bool ordered)
return a list of hyperlinks to unit's pages (ordered or not)
Definition: help_impl.cpp:830
std::vector< topic > generate_topics(const bool sort_generated, const std::string &generator)
Definition: help_impl.cpp:314
const section * find_section(const section &sec, const std::string &id)
Search for the section with the specified identifier in the section and its subsections.
Definition: help_impl.cpp:1314
void push_tab_pair(std::vector< help::item > &v, const std::string &s, const std::optional< std::string > &image, unsigned padding)
Definition: help_impl.cpp:1670
std::pair< std::string, unsigned > item
Definition: help_impl.hpp:410
const int title2_size
Definition: help_impl.cpp:79
const int normal_font_size
Definition: help_impl.cpp:81
void generate_contents()
Generate the help contents from the configurations given to the manager.
Definition: help_impl.cpp:1565
std::string generate_table(const table_spec &tab, const unsigned int spacing)
Definition: help_impl.cpp:1684
const std::string terrain_prefix
Definition: help_impl.cpp:90
std::vector< topic > generate_weapon_special_topics(const bool sort_generated)
Definition: help_impl.cpp:448
std::vector< topic > generate_ability_topics(const bool sort_generated)
Definition: help_impl.cpp:545
std::string remove_first_space(const std::string &text)
Definition: help_impl.cpp:1531
std::string jump_to(const unsigned pos)
Definition: help_impl.hpp:388
const std::string unknown_unit_topic
Definition: help_impl.cpp:88
const int max_section_level
Definition: help_impl.cpp:77
const unsigned max_history
Definition: help_impl.cpp:82
std::vector< std::string > empty_string_vector
Definition: help_impl.cpp:76
bool section_is_referenced(const std::string &section_id, const config &cfg)
Return true if the section with id section_id is referenced from another section in the config,...
Definition: help_impl.cpp:152
std::shared_ptr< terrain_type_data > load_terrain_types_data()
Load the appropriate terrain types data to use.
Definition: help_impl.cpp:1733
std::string generate_topic_text(const std::string &generator, const config *help_cfg, const section &sec, const std::vector< topic > &generated_topics)
Definition: help_impl.cpp:362
std::string convert_to_wml(std::string &element_name, const std::string &contents)
Convert the the text between start and end xml tags for element_name to valid wml attributes,...
Definition: help_impl.cpp:1431
bool is_valid_id(const std::string &id)
Return true if the id is valid for user defined topics and sections.
Definition: help_impl.cpp:1639
boost::tribool last_debug_state
Definition: help_impl.cpp:74
std::string generate_contents_links(const std::string &section_name, config const *help_cfg)
Definition: help_impl.cpp:1209
std::vector< std::string > split_in_width(const std::string &s, const int font_size, const unsigned width)
Make a best effort to word wrap s.
Definition: help_impl.cpp:1512
std::list< topic > topic_list
Definition: help_impl.hpp:142
help::section default_toplevel
Definition: help_impl.cpp:68
const topic * find_topic(const section &sec, const std::string &id)
Search for the topic with the specified identifier in the section and its subsections.
Definition: help_impl.cpp:1298
std::string jump(const unsigned amount)
Definition: help_impl.hpp:395
section parse_config(const config *cfg)
Parse a help config, return the top level section.
Definition: help_impl.cpp:304
std::vector< topic > generate_era_topics(const bool sort_generated, const std::string &era_id)
Definition: help_impl.cpp:611
const game_config_view * game_cfg
Definition: help_impl.cpp:66
int last_num_encountered_terrains
Definition: help_impl.cpp:73
std::list< section > section_list
Definition: help_impl.hpp:140
help::section hidden_sections
Definition: help_impl.cpp:70
std::vector< topic > generate_trait_topics(const bool sort_generated)
Definition: help_impl.cpp:722
std::vector< std::string > parse_text(const std::string &text)
Parse a xml style marked up text string.
Definition: help_impl.cpp:1335
const std::string default_show_topic
Definition: help_impl.cpp:87
void generate_era_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:943
const std::string era_prefix
Definition: help_impl.cpp:93
const int title_size
Definition: help_impl.cpp:78
const std::string faction_prefix
Definition: help_impl.cpp:92
Functions to load and save images from/to disk.
rng * generator
This generator is automatically synced during synced context.
Definition: random.cpp:60
int compare(const std::string &s1, const std::string &s2)
Case-sensitive lexicographical comparison.
Definition: gettext.cpp:502
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
Definition: debugger.cpp:109
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:29
Thrown when the help system fails to parse something.
Definition: help_impl.hpp:213
parse_error(const std::string &msg)
Definition: help_impl.hpp:214
A section contains topics and sections along with title and ID.
Definition: help_impl.hpp:145
section_list sections
Definition: help_impl.hpp:165
bool operator<(const section &) const
Comparison on the ID.
Definition: help_impl.cpp:1282
void add_section(const section &s)
Allocate memory for and add the section.
Definition: help_impl.cpp:1287
std::string id
Definition: help_impl.hpp:163
std::string title
Definition: help_impl.hpp:163
bool operator==(const section &) const
Two sections are equal if their IDs are equal.
Definition: help_impl.cpp:1277
topic_list topics
Definition: help_impl.hpp:164
A topic contains a title, an id and some text.
Definition: help_impl.hpp:112
topic(const std::string &_title, const std::string &_id, std::shared_ptr< topic_generator > g)
Definition: help_impl.hpp:129
bool operator==(const topic &) const
Two topics are equal if their IDs are equal.
Definition: help_impl.cpp:1267
std::string id
Definition: help_impl.hpp:136
topic(const std::string &_title, const std::string &_id, const std::string &_text)
Definition: help_impl.hpp:127
topic_text text
Definition: help_impl.hpp:137
bool operator!=(const topic &t) const
Definition: help_impl.hpp:133
bool operator<(const topic &) const
Comparison on the ID.
Definition: help_impl.cpp:1272
std::string title
Definition: help_impl.hpp:136
topic(const std::string &_title, const std::string &_id)
Definition: help_impl.hpp:120
static map_location::DIRECTION s