@@ -28,84 +28,64 @@ using json = nlohmann::json;
2828 * \brief Class for changing the configuration. 
2929 */  
3030class  Environment  {
31-   class  Impl  {
32-    public: 
33-     std::string input_path;
34-     std::string output_path;
35- 
36-     LexerConfig lexer_config;
37-     ParserConfig parser_config;
38- 
39-     FunctionStorage callbacks;
40-     TemplateStorage included_templates;
41-   };
42- 
43-   std::unique_ptr<Impl> m_impl;
44- 
4531 public: 
4632  Environment (): Environment(" "  ) { }
4733
48-   explicit  Environment (const  std::string& global_path): m_impl(stdinja::make_unique<Impl>()) {
49-     m_impl->input_path  = global_path;
50-     m_impl->output_path  = global_path;
51-   }
34+   explicit  Environment (const  std::string& global_path): m_input_path(global_path), m_output_path(global_path) {}
5235
53-   explicit  Environment (const  std::string& input_path, const  std::string& output_path): m_impl(stdinja::make_unique<Impl>()) {
54-     m_impl->input_path  = input_path;
55-     m_impl->output_path  = output_path;
56-   }
36+   Environment (const  std::string& input_path, const  std::string& output_path): m_input_path(input_path), m_output_path(output_path) {}
5737
5838  // / Sets the opener and closer for template statements
5939  void  set_statement (const  std::string& open, const  std::string& close) {
60-     m_impl-> lexer_config .statement_open  = open;
61-     m_impl-> lexer_config .statement_close  = close;
62-     m_impl-> lexer_config .update_open_chars ();
40+     m_lexer_config .statement_open  = open;
41+     m_lexer_config .statement_close  = close;
42+     m_lexer_config .update_open_chars ();
6343  }
6444
6545  // / Sets the opener for template line statements
6646  void  set_line_statement (const  std::string& open) {
67-     m_impl-> lexer_config .line_statement  = open;
68-     m_impl-> lexer_config .update_open_chars ();
47+     m_lexer_config .line_statement  = open;
48+     m_lexer_config .update_open_chars ();
6949  }
7050
7151  // / Sets the opener and closer for template expressions
7252  void  set_expression (const  std::string& open, const  std::string& close) {
73-     m_impl-> lexer_config .expression_open  = open;
74-     m_impl-> lexer_config .expression_close  = close;
75-     m_impl-> lexer_config .update_open_chars ();
53+     m_lexer_config .expression_open  = open;
54+     m_lexer_config .expression_close  = close;
55+     m_lexer_config .update_open_chars ();
7656  }
7757
7858  // / Sets the opener and closer for template comments
7959  void  set_comment (const  std::string& open, const  std::string& close) {
80-     m_impl-> lexer_config .comment_open  = open;
81-     m_impl-> lexer_config .comment_close  = close;
82-     m_impl-> lexer_config .update_open_chars ();
60+     m_lexer_config .comment_open  = open;
61+     m_lexer_config .comment_close  = close;
62+     m_lexer_config .update_open_chars ();
8363  }
8464
8565  // / Sets whether to remove the first newline after a block
8666  void  set_trim_blocks (bool  trim_blocks) {
87-     m_impl-> lexer_config .trim_blocks  = trim_blocks;
67+     m_lexer_config .trim_blocks  = trim_blocks;
8868  }
8969
9070  // / Sets whether to strip the spaces and tabs from the start of a line to a block
9171  void  set_lstrip_blocks (bool  lstrip_blocks) {
92-     m_impl-> lexer_config .lstrip_blocks  = lstrip_blocks;
72+     m_lexer_config .lstrip_blocks  = lstrip_blocks;
9373  }
9474
9575  // / Sets the element notation syntax
9676  void  set_element_notation (ElementNotation notation) {
97-     m_impl-> parser_config .notation  = notation;
77+     m_parser_config .notation  = notation;
9878  }
9979
10080
10181  Template parse (nonstd::string_view input) {
102-     Parser parser (m_impl-> parser_config , m_impl-> lexer_config , m_impl-> included_templates );
82+     Parser parser (m_parser_config, m_lexer_config, m_included_templates );
10383    return  parser.parse (input);
10484  }
10585
10686  Template parse_template (const  std::string& filename) {
107-     Parser parser (m_impl-> parser_config , m_impl-> lexer_config , m_impl-> included_templates );
108-     return  parser.parse_template (m_impl-> input_path  + static_cast <std::string>(filename));
87+     Parser parser (m_parser_config, m_lexer_config, m_included_templates );
88+     return  parser.parse_template (m_input_path  + static_cast <std::string>(filename));
10989  }
11090
11191  std::string render (nonstd::string_view input, const  json& data) {
@@ -128,13 +108,13 @@ class Environment {
128108  }
129109
130110  void  write (const  std::string& filename, const  json& data, const  std::string& filename_out) {
131-     std::ofstream file (m_impl-> output_path  + filename_out);
111+     std::ofstream file (m_output_path  + filename_out);
132112    file << render_file (filename, data);
133113    file.close ();
134114  }
135115
136116  void  write (const  Template& temp, const  json& data, const  std::string& filename_out) {
137-     std::ofstream file (m_impl-> output_path  + filename_out);
117+     std::ofstream file (m_output_path  + filename_out);
138118    file << render (temp, data);
139119    file.close ();
140120  }
@@ -150,33 +130,43 @@ class Environment {
150130  }
151131
152132  std::ostream& render_to (std::ostream& os, const  Template& tmpl, const  json& data) {
153-     Renderer (m_impl-> included_templates , m_impl-> callbacks ).render_to (os, tmpl, data);
133+     Renderer (m_included_templates, m_callbacks ).render_to (os, tmpl, data);
154134    return  os;
155135  }
156136
157137  std::string load_file (const  std::string& filename) {
158-     Parser parser (m_impl-> parser_config , m_impl-> lexer_config , m_impl-> included_templates );
159-     return  parser.load_file (m_impl-> input_path  + filename);
138+     Parser parser (m_parser_config, m_lexer_config, m_included_templates );
139+     return  parser.load_file (m_input_path  + filename);
160140  }
161141
162142  json load_json (const  std::string& filename) {
163-     std::ifstream file = open_file_or_throw (m_impl-> input_path  + filename);
143+     std::ifstream file = open_file_or_throw (m_input_path  + filename);
164144    json j;
165145    file >> j;
166146    return  j;
167147  }
168148
169149  void  add_callback (const  std::string& name, unsigned  int  numArgs, const  CallbackFunction& callback) {
170-     m_impl-> callbacks .add_callback (name, numArgs, callback);
150+     m_callbacks .add_callback (name, numArgs, callback);
171151  }
172152
173153  /* * Includes a template with a given name into the environment.
174154   * Then, a template can be rendered in another template using the 
175155   * include "<name>" syntax. 
176156   */  
177157  void  include_template (const  std::string& name, const  Template& tmpl) {
178-     m_impl-> included_templates [name] = tmpl;
158+     m_included_templates [name] = tmpl;
179159  }
160+ 
161+  private: 
162+   std::string m_input_path;
163+   std::string m_output_path;
164+ 
165+   LexerConfig m_lexer_config;
166+   ParserConfig m_parser_config;
167+ 
168+   FunctionStorage m_callbacks;
169+   TemplateStorage m_included_templates;
180170};
181171
182172/* !
0 commit comments