The Battle for Wesnoth  1.19.0-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 "gettext.hpp"
39 #include <optional>
40 #include <list> // for list
41 #include <memory>
42 #include <sstream>
43 #include <string> // for string, allocator, etc
44 #include <utility> // for pair, make_pair
45 #include <vector> // for vector, etc
46 #include <boost/logic/tribool.hpp>
47 
48 class game_config_view;
49 class config;
50 class unit_type;
51 class terrain_type_data;
52 
53 namespace help {
54 
55 /**
56  * Generate the help contents from the configurations given to the manager.
57  */
58 void generate_contents();
59 
60 
61 /** Generate a topic text on the fly. */
63 {
64 public:
65  topic_generator() = default;
66  virtual std::string operator()() const = 0;
67  virtual ~topic_generator() {}
68 };
69 
71  std::string text_;
72 public:
73  text_topic_generator(const std::string& t): text_(t) {}
74  virtual std::string operator()() const { return text_; }
75 };
76 
77 /**
78  * The text displayed in a topic. It is generated on the fly with the information contained in generator_
79  */
81 {
82  mutable std::vector< std::string > parsed_text_;
83  mutable std::shared_ptr<topic_generator> generator_;
84 public:
85  topic_text() = default;
86  ~topic_text() = default;
87 
88  topic_text(const std::string& t):
89  parsed_text_(),
90  generator_(std::make_shared<text_topic_generator>(t))
91  {
92  }
93 
94  explicit topic_text(std::shared_ptr<topic_generator> g):
95  parsed_text_(),
96  generator_(g)
97  {
98  }
99 
100  topic_text(const topic_text& t) = default;
101  topic_text(topic_text&& t) = default;
103  topic_text& operator=(const topic_text& t) = default;
104  topic_text& operator=(std::shared_ptr<topic_generator> g);
105 
106  const std::vector<std::string>& parsed_text() const;
107 };
108 
109 /** A topic contains a title, an id and some text. */
110 struct topic
111 {
112  topic() :
113  title(),
114  id(),
115  text()
116  {
117  }
118 
119  topic(const std::string &_title, const std::string &_id) :
120  title(_title),
121  id(_id),
122  text()
123  {
124  }
125 
126  topic(const std::string &_title, const std::string &_id, const std::string &_text)
127  : title(_title), id(_id), text(_text) {}
128  topic(const std::string &_title, const std::string &_id, std::shared_ptr<topic_generator> g)
129  : title(_title), id(_id), text(g) {}
130  /** Two topics are equal if their IDs are equal. */
131  bool operator==(const topic &) const;
132  bool operator!=(const topic &t) const { return !operator==(t); }
133  /** Comparison on the ID. */
134  bool operator<(const topic &) const;
135  std::string title, id;
136  mutable topic_text text;
137 };
138 
139 struct section;
140 typedef std::list<section> section_list;
141 typedef std::list<topic> topic_list;
142 
143 /** A section contains topics and sections along with title and ID. */
144 struct section {
146  title(""),
147  id(""),
148  topics(),
149  sections()
150  {
151  }
152 
153  /** Two sections are equal if their IDs are equal. */
154  bool operator==(const section &) const;
155  /** Comparison on the ID. */
156  bool operator<(const section &) const;
157 
158  /** Allocate memory for and add the section. */
159  void add_section(const section &s);
160 
161  void clear();
162  std::string title, id;
165 };
166 
167 
168 /**
169  * To be used as a function object to locate sections and topics with a specified ID.
170  */
171 class has_id
172 {
173 public:
174  has_id(const std::string &id) : id_(id) {}
175  bool operator()(const topic &t) { return t.id == id_; }
176  bool operator()(const section &s) { return s.id == id_; }
177  bool operator()(const section *s) { return s != nullptr && s->id == id_; }
178 private:
179  const std::string id_;
180 };
181 
182 /** To be used as a function object when sorting topic lists on the title. */
184 {
185 public:
186  bool operator()(const topic &t1, const topic &t2)
187  {
188  return translation::compare(t1.title, t2.title) < 0;
189  }
190 };
191 
192 /** To be used as a function object when sorting section lists on the title. */
194 {
195 public:
196  bool operator()(const section& s1, const section& s2)
197  {
198  return translation::compare(s1.title, s2.title) < 0;
199  }
200 };
201 
203 {
204 public:
205  bool operator() (const std::string &s1, const std::string &s2) const {
206  return translation::compare(s1, s2) < 0;
207  }
208 };
209 
210 /** Thrown when the help system fails to parse something. */
211 struct parse_error : public game::error
212 {
213  parse_error(const std::string& msg) : game::error(msg) {}
214 };
215 
216 // Generator stuff below. Maybe move to a separate file? This one is
217 // getting crowded. Dunno if much more is needed though so I'll wait and
218 // see.
219 
220 /** Dispatch generators to their appropriate functions. */
221 void generate_sections(const config *help_cfg, const std::string &generator, section &sec, int level);
222 std::vector<topic> generate_topics(const bool sort_topics,const std::string &generator);
223 std::string generate_topic_text(const std::string &generator, const config *help_cfg,
224 const section &sec, const std::vector<topic>& generated_topics);
225 std::string generate_contents_links(const std::string& section_name, const config *help_cfg);
226 std::string generate_contents_links(const section &sec, const std::vector<topic>& topics);
227 
228 /**
229  * return a hyperlink with the unit's name and pointing to the unit page
230  * return empty string if this unit is hidden. If not yet discovered add the (?) suffix
231  */
232 std::string make_unit_link(const std::string& type_id);
233 /** return a list of hyperlinks to unit's pages (ordered or not) */
234 std::vector<std::string> make_unit_links_list(
235  const std::vector<std::string>& type_id_list, bool ordered = false);
236 
237 void generate_races_sections(const config *help_cfg, section &sec, int level);
238 void generate_terrain_sections(section &sec, int level);
239 std::vector<topic> generate_unit_topics(const bool, const std::string& race);
240 void generate_unit_sections(const config *help_cfg, section &sec, int level, const bool, const std::string& race);
243  /** Ignore this unit for documentation purposes. */
245  /**
246  * Although the unit itself is hidden, traits reachable via this unit are not hidden.
247  *
248  * This is a bug workaround - traits are defined by WML macros, and therefore the help
249  * system has to use a place where that macro is instanciated to provide the documentation.
250  * None of the normal unit types has the "loyal" trait, but there is a hidden unit which
251  * does, purely to support the help system.
252  */
254 };
255 /**
256  * Return the type of description that should be shown for a unit of
257  * the given kind. This method is intended to filter out information
258  * about units that should not be shown, for example due to not being
259  * encountered.
260  */
262 std::vector<topic> generate_ability_topics(const bool);
263 std::vector<topic> generate_time_of_day_topics(const bool);
264 std::vector<topic> generate_weapon_special_topics(const bool);
265 
266 void generate_era_sections(const config *help_cfg, section &sec, int level);
267 std::vector<topic> generate_faction_topics(const config &, const bool);
268 std::vector<topic> generate_era_topics(const bool, const std::string & era_id);
269 std::vector<topic> generate_trait_topics(const bool);
270 
271 /**
272  * Parse a help config, return the top level section. Return an empty
273  * section if cfg is nullptr.
274  */
275 section parse_config(const config *cfg);
276 /** Recursive function used by parse_config. */
277 void parse_config_internal(const config *help_cfg, const config *section_cfg,
278  section &sec, int level=0);
279 
280 /**
281  * Return true if the section with id section_id is referenced from
282  * another section in the config, or the toplevel.
283  */
284 bool section_is_referenced(const std::string &section_id, const config &cfg);
285 /**
286  * Return true if the topic with id topic_id is referenced from
287  * another section in the config, or the toplevel.
288  */
289 bool topic_is_referenced(const std::string &topic_id, const config &cfg);
290 
291 /**
292  * Search for the topic with the specified identifier in the section
293  * and its subsections. Return the found topic, or nullptr if none could
294  * be found.
295  */
296 const topic *find_topic(const section &sec, const std::string &id);
297 
298 /**
299  * Search for the section with the specified identifier in the section
300  * and its subsections. Return the found section or nullptr if none could
301  * be found.
302  */
303 const section *find_section(const section &sec, const std::string &id);
304 section *find_section(section &sec, const std::string &id);
305 
306 /**
307  * Parse a text string. Return a vector with the different parts of the
308  * text. Each markup item is a separate part while the text between
309  * markups are separate parts.
310  */
311 std::vector<std::string> parse_text(const std::string &text);
312 
313 /**
314  * Convert the contents to wml attributes, surrounded within
315  * [element_name]...[/element_name]. Return the resulting WML.
316  */
317 std::string convert_to_wml(const std::string &element_name, const std::string &contents);
318 
319 /**
320  * Return the color the string represents. Return font::NORMAL_COLOR if
321  * the string is empty or can't be matched against any other color.
322  */
323 color_t string_to_color(const std::string &s);
324 
325 /** Make a best effort to word wrap s. All parts are less than width. */
326 std::vector<std::string> split_in_width(const std::string &s, const int font_size, const unsigned width);
327 
328 std::string remove_first_space(const std::string& text);
329 
330 /** Prepend all chars with meaning inside attributes with a backslash. */
331 std::string escape(const std::string &s);
332 
333 /** Return the first word in s, not removing any spaces in the start of it. */
334 std::string get_first_word(const std::string &s);
335 
336 /** Load the appropriate terrain types data to use */
337 std::shared_ptr<terrain_type_data> load_terrain_types_data();
338 
339 extern const game_config_view *game_cfg;
340 // The default toplevel.
342 // All sections and topics not referenced from the default toplevel.
344 
345 extern int last_num_encountered_units;
347 extern boost::tribool last_debug_state;
348 
349 extern std::vector<std::string> empty_string_vector;
350 extern const int max_section_level;
351 extern const int title_size;
352 extern const int title2_size;
353 extern const int box_width;
354 extern const int normal_font_size;
355 extern const unsigned max_history;
356 extern const std::string topic_img;
357 extern const std::string closed_section_img;
358 extern const std::string open_section_img;
359 // The topic to open by default when opening the help dialog.
360 extern const std::string default_show_topic;
361 extern const std::string unknown_unit_topic;
362 extern const std::string unit_prefix;
363 extern const std::string terrain_prefix;
364 extern const std::string race_prefix;
365 extern const std::string faction_prefix;
366 extern const std::string era_prefix;
367 extern const std::string variation_prefix;
368 extern const std::string ability_prefix;
369 
370 // id starting with '.' are hidden
371 std::string hidden_symbol(bool hidden = true);
372 
373 bool is_visible_id(const std::string &id);
374 
375 /**
376  * Return true if the id is valid for user defined topics and
377  * sections. Some IDs are special, such as toplevel and may not be
378  * be defined in the config.
379  */
380 bool is_valid_id(const std::string &id);
381 
382  // Helpers for making generation of topics easier.
383 
384 inline std::string make_link(const std::string& text, const std::string& dst)
385  {
386  // some sorting done on list of links may rely on the fact that text is first
387  return "<ref>text='" + help::escape(text) + "' dst='" + help::escape(dst) + "'</ref>";
388  }
389 
390 inline std::string jump_to(const unsigned pos)
391  {
392  std::stringstream ss;
393  ss << "<jump>to=" << pos << "</jump>";
394  return ss.str();
395  }
396 
397 inline std::string jump(const unsigned amount)
398  {
399  std::stringstream ss;
400  ss << "<jump>amount=" << amount << "</jump>";
401  return ss.str();
402  }
403 
404 inline std::string bold(const std::string &s)
405  {
406  std::stringstream ss;
407  ss << "<bold>text='" << help::escape(s) << "'</bold>";
408  return ss.str();
409  }
410 
411 // A string to be displayed and its width.
412 typedef std::pair< std::string, unsigned > item;
413 
414 typedef std::vector<std::vector<help::item>> table_spec;
415 // Create a table using the table specs. Return markup with jumps
416 // that create a table. The table spec contains a vector with
417 // vectors with pairs. The pairs are the markup string that should
418 // be in a cell, and the width of that cell.
419 std::string generate_table(const table_spec &tab, const unsigned int spacing=font::relative_size(20));
420 
421 // Return the width for the image with filename.
422 unsigned image_width(const std::string &filename);
423 
424 // Add to the vector v an help::item for the string s, preceded by the given image if any.
425 void push_tab_pair(std::vector<help::item> &v, const std::string &s, const std::optional<std::string> &image = {}, unsigned padding = 0);
426 
427 } // 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:172
has_id(const std::string &id)
Definition: help_impl.hpp:174
const std::string id_
Definition: help_impl.hpp:179
bool operator()(const topic &t)
Definition: help_impl.hpp:175
bool operator()(const section &s)
Definition: help_impl.hpp:176
bool operator()(const section *s)
Definition: help_impl.hpp:177
To be used as a function object when sorting section lists on the title.
Definition: help_impl.hpp:194
bool operator()(const section &s1, const section &s2)
Definition: help_impl.hpp:196
bool operator()(const std::string &s1, const std::string &s2) const
Definition: help_impl.hpp:205
text_topic_generator(const std::string &t)
Definition: help_impl.hpp:73
virtual std::string operator()() const
Definition: help_impl.hpp:74
To be used as a function object when sorting topic lists on the title.
Definition: help_impl.hpp:184
bool operator()(const topic &t1, const topic &t2)
Definition: help_impl.hpp:186
Generate a topic text on the fly.
Definition: help_impl.hpp:63
virtual std::string operator()() const =0
virtual ~topic_generator()
Definition: help_impl.hpp:67
The text displayed in a topic.
Definition: help_impl.hpp:81
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:384
topic_text(std::shared_ptr< topic_generator > g)
Definition: help_impl.hpp:94
std::shared_ptr< topic_generator > generator_
Definition: help_impl.hpp:83
~topic_text()=default
topic_text & operator=(topic_text &&t)=default
std::vector< std::string > parsed_text_
Definition: help_impl.hpp:82
topic_text()=default
topic_text(const std::string &t)
Definition: help_impl.hpp:88
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:207
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:1501
std::vector< topic > generate_unit_topics(const bool sort_generated, const std::string &race)
Definition: help_impl.cpp:1049
std::string hidden_symbol(bool hidden)
Definition: help_impl.cpp:1588
void generate_unit_sections(const config *, section &sec, int, const bool, const std::string &race)
Definition: help_impl.cpp:1016
UNIT_DESCRIPTION_TYPE
Definition: help_impl.hpp:241
@ FULL_DESCRIPTION
Definition: help_impl.hpp:242
@ HIDDEN_BUT_SHOW_MACROS
Although the unit itself is hidden, traits reachable via this unit are not hidden.
Definition: help_impl.hpp:253
@ NO_DESCRIPTION
Ignore this unit for documentation purposes.
Definition: help_impl.hpp:244
std::string bold(const std::string &s)
Definition: help_impl.hpp:404
std::string make_link(const std::string &text, const std::string &dst)
Definition: help_impl.hpp:384
void generate_races_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:843
std::string escape(const std::string &s)
Prepend all chars with meaning inside attributes with a backslash.
Definition: help_impl.cpp:1689
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:174
std::vector< topic > generate_time_of_day_topics(const bool)
Definition: help_impl.cpp:399
int last_num_encountered_units
Definition: help_impl.cpp:70
void generate_terrain_sections(section &sec, int)
Definition: help_impl.cpp:964
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:802
const std::string open_section_img
Definition: help_impl.cpp:83
const std::string unit_prefix
Definition: help_impl.cpp:87
unsigned image_width(const std::string &filename)
Definition: help_impl.cpp:1622
const std::string variation_prefix
Definition: help_impl.cpp:92
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:198
bool is_visible_id(const std::string &id)
Definition: help_impl.cpp:1592
const std::string closed_section_img
Definition: help_impl.cpp:82
std::vector< topic > generate_faction_topics(const config &era, const bool sort_generated)
Definition: help_impl.cpp:645
const int box_width
Definition: help_impl.cpp:78
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:341
const std::string topic_img
Definition: help_impl.cpp:81
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:1180
const std::string race_prefix
Definition: help_impl.cpp:89
const std::string ability_prefix
Definition: help_impl.cpp:93
std::vector< std::vector< help::item > > table_spec
Definition: help_impl.hpp:414
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:828
std::vector< topic > generate_topics(const bool sort_generated, const std::string &generator)
Definition: help_impl.cpp:312
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:1305
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:1632
std::string convert_to_wml(const std::string &element_name, const std::string &contents)
Convert the contents to wml attributes, surrounded within [element_name]...[/element_name].
Definition: help_impl.cpp:1399
std::pair< std::string, unsigned > item
Definition: help_impl.hpp:412
const int title2_size
Definition: help_impl.cpp:77
const int normal_font_size
Definition: help_impl.cpp:79
void generate_contents()
Generate the help contents from the configurations given to the manager.
Definition: help_impl.cpp:1527
std::string generate_table(const table_spec &tab, const unsigned int spacing)
Definition: help_impl.cpp:1646
const std::string terrain_prefix
Definition: help_impl.cpp:88
std::vector< topic > generate_weapon_special_topics(const bool sort_generated)
Definition: help_impl.cpp:446
std::vector< topic > generate_ability_topics(const bool sort_generated)
Definition: help_impl.cpp:543
std::string remove_first_space(const std::string &text)
Definition: help_impl.cpp:1493
std::string jump_to(const unsigned pos)
Definition: help_impl.hpp:390
const std::string unknown_unit_topic
Definition: help_impl.cpp:86
const int max_section_level
Definition: help_impl.cpp:75
const unsigned max_history
Definition: help_impl.cpp:80
std::vector< std::string > empty_string_vector
Definition: help_impl.cpp:74
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:150
std::shared_ptr< terrain_type_data > load_terrain_types_data()
Load the appropriate terrain types data to use.
Definition: help_impl.cpp:1695
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:360
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:1601
boost::tribool last_debug_state
Definition: help_impl.cpp:72
std::string generate_contents_links(const std::string &section_name, config const *help_cfg)
Definition: help_impl.cpp:1200
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:1474
std::list< topic > topic_list
Definition: help_impl.hpp:141
help::section default_toplevel
Definition: help_impl.cpp:66
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:1289
color_t string_to_color(const std::string &cmp_str)
Return the color the string represents.
Definition: help_impl.cpp:1450
std::string jump(const unsigned amount)
Definition: help_impl.hpp:397
section parse_config(const config *cfg)
Parse a help config, return the top level section.
Definition: help_impl.cpp:302
std::vector< topic > generate_era_topics(const bool sort_generated, const std::string &era_id)
Definition: help_impl.cpp:609
const game_config_view * game_cfg
Definition: help_impl.cpp:64
int last_num_encountered_terrains
Definition: help_impl.cpp:71
std::list< section > section_list
Definition: help_impl.hpp:139
help::section hidden_sections
Definition: help_impl.cpp:68
std::vector< topic > generate_trait_topics(const bool sort_generated)
Definition: help_impl.cpp:720
std::vector< std::string > parse_text(const std::string &text)
Parse a text string.
Definition: help_impl.cpp:1326
const std::string default_show_topic
Definition: help_impl.cpp:85
void generate_era_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:941
const std::string era_prefix
Definition: help_impl.cpp:91
const int title_size
Definition: help_impl.cpp:76
const std::string faction_prefix
Definition: help_impl.cpp:90
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
The basic class for representing 8-bit RGB or RGBA colour values.
Definition: color.hpp:59
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:212
parse_error(const std::string &msg)
Definition: help_impl.hpp:213
A section contains topics and sections along with title and ID.
Definition: help_impl.hpp:144
section_list sections
Definition: help_impl.hpp:164
bool operator<(const section &) const
Comparison on the ID.
Definition: help_impl.cpp:1273
void add_section(const section &s)
Allocate memory for and add the section.
Definition: help_impl.cpp:1278
std::string id
Definition: help_impl.hpp:162
std::string title
Definition: help_impl.hpp:162
bool operator==(const section &) const
Two sections are equal if their IDs are equal.
Definition: help_impl.cpp:1268
topic_list topics
Definition: help_impl.hpp:163
A topic contains a title, an id and some text.
Definition: help_impl.hpp:111
topic(const std::string &_title, const std::string &_id, std::shared_ptr< topic_generator > g)
Definition: help_impl.hpp:128
bool operator==(const topic &) const
Two topics are equal if their IDs are equal.
Definition: help_impl.cpp:1258
std::string id
Definition: help_impl.hpp:135
topic(const std::string &_title, const std::string &_id, const std::string &_text)
Definition: help_impl.hpp:126
topic_text text
Definition: help_impl.hpp:136
bool operator!=(const topic &t) const
Definition: help_impl.hpp:132
bool operator<(const topic &) const
Comparison on the ID.
Definition: help_impl.cpp:1263
std::string title
Definition: help_impl.hpp:135
topic(const std::string &_title, const std::string &_id)
Definition: help_impl.hpp:119
static map_location::DIRECTION s