clang-format
diff --git a/.clang-format b/.clang-format
index 5486ac5..3a48294 100644
--- a/.clang-format
+++ b/.clang-format
@@ -1,7 +1,14 @@
---
+BasedOnStyle: LLVM
+IndentWidth: 2
+ColumnLimit: 160
+
+---
Language: Cpp
-BasedOnStyle: LLVM
-ColumnLimit: 120
SpaceBeforeCpp11BracedList: true
+PointerAlignment: Left
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortBlocksOnASingleLine: Empty
+SpaceBeforeCtorInitializerColon: false
...
diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp
index 9e6f7c4..a652935 100644
--- a/include/inja/environment.hpp
+++ b/include/inja/environment.hpp
@@ -32,12 +32,11 @@
TemplateStorage template_storage;
public:
- Environment() : Environment("") {}
+ Environment(): Environment("") {}
- explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
+ explicit Environment(const std::string& global_path): input_path(global_path), output_path(global_path) {}
- Environment(const std::string& input_path, const std::string& output_path)
- : input_path(input_path), output_path(output_path) {}
+ Environment(const std::string& input_path, const std::string& output_path): input_path(input_path), output_path(output_path) {}
/// Sets the opener and closer for template statements
void set_statement(const std::string& open, const std::string& close) {
@@ -109,7 +108,9 @@
return parse_template(filename);
}
- std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
+ std::string render(std::string_view input, const json& data) {
+ return render(parse(input), data);
+ }
std::string render(const Template& tmpl, const json& data) {
std::stringstream os;
@@ -138,8 +139,7 @@
file.close();
}
- void write_with_json_file(const std::string& filename, const std::string& filename_data,
- const std::string& filename_out) {
+ void write_with_json_file(const std::string& filename, const std::string& filename_data, const std::string& filename_out) {
const json data = load_json(filename_data);
write(filename, data, filename_out);
}
@@ -195,7 +195,10 @@
@brief Adds a void callback with given number or arguments
*/
void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
- function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
+ function_storage.add_callback(name, num_args, [callback](Arguments& args) {
+ callback(args);
+ return json();
+ });
}
/** Includes a template with a given name into the environment.
diff --git a/include/inja/exceptions.hpp b/include/inja/exceptions.hpp
index b1458b4..f0dc8aa 100644
--- a/include/inja/exceptions.hpp
+++ b/include/inja/exceptions.hpp
@@ -17,30 +17,29 @@
const SourceLocation location;
- explicit InjaError(const std::string &type, const std::string &message)
+ explicit InjaError(const std::string& type, const std::string& message)
: std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {}
- explicit InjaError(const std::string &type, const std::string &message, SourceLocation location)
- : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" +
- std::to_string(location.column) + ") " + message),
+ explicit InjaError(const std::string& type, const std::string& message, SourceLocation location)
+ : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + std::to_string(location.column) + ") " + message),
type(type), message(message), location(location) {}
};
struct ParserError : public InjaError {
- explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {}
+ explicit ParserError(const std::string& message, SourceLocation location): InjaError("parser_error", message, location) {}
};
struct RenderError : public InjaError {
- explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {}
+ explicit RenderError(const std::string& message, SourceLocation location): InjaError("render_error", message, location) {}
};
struct FileError : public InjaError {
- explicit FileError(const std::string &message) : InjaError("file_error", message) {}
- explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {}
+ explicit FileError(const std::string& message): InjaError("file_error", message) {}
+ explicit FileError(const std::string& message, SourceLocation location): InjaError("file_error", message, location) {}
};
struct DataError : public InjaError {
- explicit DataError(const std::string &message, SourceLocation location) : InjaError("data_error", message, location) {}
+ explicit DataError(const std::string& message, SourceLocation location): InjaError("data_error", message, location) {}
};
} // namespace inja
diff --git a/include/inja/function_storage.hpp b/include/inja/function_storage.hpp
index 1a6641f..891e45f 100644
--- a/include/inja/function_storage.hpp
+++ b/include/inja/function_storage.hpp
@@ -4,7 +4,6 @@
#include <string_view>
#include <vector>
-
namespace inja {
using Arguments = std::vector<const json*>;
@@ -69,7 +68,7 @@
};
struct FunctionData {
- explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
+ explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
const Operation operation;
const CallbackFunction callback;
};
@@ -78,44 +77,44 @@
const int VARIADIC {-1};
std::map<std::pair<std::string, int>, FunctionData> function_storage = {
- {std::make_pair("at", 2), FunctionData { Operation::At }},
- {std::make_pair("default", 2), FunctionData { Operation::Default }},
- {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }},
- {std::make_pair("even", 1), FunctionData { Operation::Even }},
- {std::make_pair("exists", 1), FunctionData { Operation::Exists }},
- {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }},
- {std::make_pair("first", 1), FunctionData { Operation::First }},
- {std::make_pair("float", 1), FunctionData { Operation::Float }},
- {std::make_pair("int", 1), FunctionData { Operation::Int }},
- {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }},
- {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }},
- {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }},
- {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }},
- {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }},
- {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }},
- {std::make_pair("isString", 1), FunctionData { Operation::IsString }},
- {std::make_pair("last", 1), FunctionData { Operation::Last }},
- {std::make_pair("length", 1), FunctionData { Operation::Length }},
- {std::make_pair("lower", 1), FunctionData { Operation::Lower }},
- {std::make_pair("max", 1), FunctionData { Operation::Max }},
- {std::make_pair("min", 1), FunctionData { Operation::Min }},
- {std::make_pair("odd", 1), FunctionData { Operation::Odd }},
- {std::make_pair("range", 1), FunctionData { Operation::Range }},
- {std::make_pair("round", 2), FunctionData { Operation::Round }},
- {std::make_pair("sort", 1), FunctionData { Operation::Sort }},
- {std::make_pair("upper", 1), FunctionData { Operation::Upper }},
- {std::make_pair("super", 0), FunctionData { Operation::Super }},
- {std::make_pair("super", 1), FunctionData { Operation::Super }},
- {std::make_pair("join", 2), FunctionData { Operation::Join }},
+ {std::make_pair("at", 2), FunctionData {Operation::At}},
+ {std::make_pair("default", 2), FunctionData {Operation::Default}},
+ {std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
+ {std::make_pair("even", 1), FunctionData {Operation::Even}},
+ {std::make_pair("exists", 1), FunctionData {Operation::Exists}},
+ {std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
+ {std::make_pair("first", 1), FunctionData {Operation::First}},
+ {std::make_pair("float", 1), FunctionData {Operation::Float}},
+ {std::make_pair("int", 1), FunctionData {Operation::Int}},
+ {std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
+ {std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
+ {std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
+ {std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
+ {std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
+ {std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
+ {std::make_pair("isString", 1), FunctionData {Operation::IsString}},
+ {std::make_pair("last", 1), FunctionData {Operation::Last}},
+ {std::make_pair("length", 1), FunctionData {Operation::Length}},
+ {std::make_pair("lower", 1), FunctionData {Operation::Lower}},
+ {std::make_pair("max", 1), FunctionData {Operation::Max}},
+ {std::make_pair("min", 1), FunctionData {Operation::Min}},
+ {std::make_pair("odd", 1), FunctionData {Operation::Odd}},
+ {std::make_pair("range", 1), FunctionData {Operation::Range}},
+ {std::make_pair("round", 2), FunctionData {Operation::Round}},
+ {std::make_pair("sort", 1), FunctionData {Operation::Sort}},
+ {std::make_pair("upper", 1), FunctionData {Operation::Upper}},
+ {std::make_pair("super", 0), FunctionData {Operation::Super}},
+ {std::make_pair("super", 1), FunctionData {Operation::Super}},
+ {std::make_pair("join", 2), FunctionData {Operation::Join}},
};
public:
void add_builtin(std::string_view name, int num_args, Operation op) {
- function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
}
void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
- function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
}
FunctionData find_function(std::string_view name, int num_args) const {
@@ -123,7 +122,7 @@
if (it != function_storage.end()) {
return it->second;
- // Find variadic function
+ // Find variadic function
} else if (num_args > 0) {
it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
if (it != function_storage.end()) {
@@ -131,7 +130,7 @@
}
}
- return FunctionData { Operation::None };
+ return FunctionData {Operation::None};
}
};
diff --git a/include/inja/inja.hpp b/include/inja/inja.hpp
index 1434f57..381da4b 100644
--- a/include/inja/inja.hpp
+++ b/include/inja/inja.hpp
@@ -4,7 +4,7 @@
| || '_ \ | |/ _` | Licensed under the MIT License <http://opensource.org/licenses/MIT>.
| || | | || | (_| |
|___|_| |_|/ |\__,_| Copyright (c) 2018-2021 Lars Berscheid
- |__/
+ |__/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
@@ -29,24 +29,26 @@
namespace inja {
#ifndef INJA_DATA_TYPE
- using json = nlohmann::json;
+using json = nlohmann::json;
#else
- using json = INJA_DATA_TYPE;
+using json = INJA_DATA_TYPE;
#endif
-}
+} // namespace inja
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
- #ifndef INJA_THROW
- #define INJA_THROW(exception) throw exception
- #endif
+#ifndef INJA_THROW
+#define INJA_THROW(exception) throw exception
+#endif
#else
- #include <cstdlib>
- #ifndef INJA_THROW
- #define INJA_THROW(exception) std::abort(); std::ignore = exception
- #endif
- #ifndef INJA_NOEXCEPTION
- #define INJA_NOEXCEPTION
- #endif
+#include <cstdlib>
+#ifndef INJA_THROW
+#define INJA_THROW(exception) \
+ std::abort(); \
+ std::ignore = exception
+#endif
+#ifndef INJA_NOEXCEPTION
+#define INJA_NOEXCEPTION
+#endif
#endif
#include "environment.hpp"
diff --git a/include/inja/lexer.hpp b/include/inja/lexer.hpp
index 5f45da1..c777600 100644
--- a/include/inja/lexer.hpp
+++ b/include/inja/lexer.hpp
@@ -43,7 +43,6 @@
size_t tok_start;
size_t pos;
-
Token scan_body(std::string_view close, Token::Kind closeKind, std::string_view close_trim = std::string_view(), bool trim = false) {
again:
// skip whitespace (except for \n as it might be a close)
@@ -224,7 +223,9 @@
return make_token(Token::Kind::String);
}
- Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); }
+ Token make_token(Token::Kind kind) const {
+ return Token(kind, string_view::slice(m_in, tok_start, pos));
+ }
void skip_whitespaces_and_newlines() {
if (pos < m_in.size()) {
@@ -270,7 +271,7 @@
}
public:
- explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+ explicit Lexer(const LexerConfig& config): config(config), state(State::Text), minus_state(MinusState::Number) {}
SourceLocation current_position() const {
return get_source_location(m_in, tok_start);
@@ -322,7 +323,7 @@
} else if (inja::string_view::starts_with(open_str, config.statement_open)) {
if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) {
state = State::StatementStartNoLstrip;
- } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) {
+ } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip)) {
state = State::StatementStartForceLstrip;
must_lstrip = true;
} else {
diff --git a/include/inja/node.hpp b/include/inja/node.hpp
index 2df0054..1946805 100644
--- a/include/inja/node.hpp
+++ b/include/inja/node.hpp
@@ -8,7 +8,6 @@
#include "function_storage.hpp"
#include "utils.hpp"
-
namespace inja {
class NodeVisitor;
@@ -29,7 +28,6 @@
class BlockStatementNode;
class SetStatementNode;
-
class NodeVisitor {
public:
virtual ~NodeVisitor() = default;
@@ -61,16 +59,15 @@
size_t pos;
- AstNode(size_t pos) : pos(pos) { }
- virtual ~AstNode() { }
+ AstNode(size_t pos): pos(pos) {}
+ virtual ~AstNode() {}
};
-
class BlockNode : public AstNode {
public:
std::vector<std::shared_ptr<AstNode>> nodes;
- explicit BlockNode() : AstNode(0) {}
+ explicit BlockNode(): AstNode(0) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -81,7 +78,7 @@
public:
const size_t length;
- explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { }
+ explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -90,7 +87,7 @@
class ExpressionNode : public AstNode {
public:
- explicit ExpressionNode(size_t pos) : AstNode(pos) {}
+ explicit ExpressionNode(size_t pos): AstNode(pos) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -101,7 +98,7 @@
public:
const json value;
- explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
+ explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -124,7 +121,7 @@
return result;
}
- explicit DataNode(std::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) { }
+ explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -150,98 +147,99 @@
std::vector<std::shared_ptr<ExpressionNode>> arguments;
CallbackFunction callback;
- explicit FunctionNode(std::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
- explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) {
+ explicit FunctionNode(std::string_view name, size_t pos)
+ : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) {}
+ explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos), operation(operation), number_args(1) {
switch (operation) {
- case Op::Not: {
- number_args = 1;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::And: {
- number_args = 2;
- precedence = 1;
- associativity = Associativity::Left;
- } break;
- case Op::Or: {
- number_args = 2;
- precedence = 1;
- associativity = Associativity::Left;
- } break;
- case Op::In: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Equal: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::NotEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Greater: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::GreaterEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Less: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::LessEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Add: {
- number_args = 2;
- precedence = 3;
- associativity = Associativity::Left;
- } break;
- case Op::Subtract: {
- number_args = 2;
- precedence = 3;
- associativity = Associativity::Left;
- } break;
- case Op::Multiplication: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::Division: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::Power: {
- number_args = 2;
- precedence = 5;
- associativity = Associativity::Right;
- } break;
- case Op::Modulo: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::AtId: {
- number_args = 2;
- precedence = 8;
- associativity = Associativity::Left;
- } break;
- default: {
- precedence = 1;
- associativity = Associativity::Left;
- }
+ case Op::Not: {
+ number_args = 1;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::And: {
+ number_args = 2;
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Or: {
+ number_args = 2;
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::In: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Equal: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::NotEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Greater: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::GreaterEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Less: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::LessEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Add: {
+ number_args = 2;
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Subtract: {
+ number_args = 2;
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Multiplication: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Division: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Power: {
+ number_args = 2;
+ precedence = 5;
+ associativity = Associativity::Right;
+ } break;
+ case Op::Modulo: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::AtId: {
+ number_args = 2;
+ precedence = 8;
+ associativity = Associativity::Left;
+ } break;
+ default: {
+ precedence = 1;
+ associativity = Associativity::Left;
+ }
}
}
@@ -254,8 +252,8 @@
public:
std::shared_ptr<ExpressionNode> root;
- explicit ExpressionListNode() : AstNode(0) { }
- explicit ExpressionListNode(size_t pos) : AstNode(pos) { }
+ explicit ExpressionListNode(): AstNode(0) {}
+ explicit ExpressionListNode(size_t pos): AstNode(pos) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -264,7 +262,7 @@
class StatementNode : public AstNode {
public:
- StatementNode(size_t pos) : AstNode(pos) { }
+ StatementNode(size_t pos): AstNode(pos) {}
virtual void accept(NodeVisitor& v) const = 0;
};
@@ -273,9 +271,9 @@
public:
ExpressionListNode condition;
BlockNode body;
- BlockNode *const parent;
+ BlockNode* const parent;
- ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { }
+ ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {}
virtual void accept(NodeVisitor& v) const = 0;
};
@@ -284,7 +282,7 @@
public:
const std::string value;
- explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { }
+ explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -296,7 +294,8 @@
const std::string key;
const std::string value;
- explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { }
+ explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos)
+ : ForStatementNode(parent, pos), key(key), value(value) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -308,13 +307,13 @@
ExpressionListNode condition;
BlockNode true_statement;
BlockNode false_statement;
- BlockNode *const parent;
+ BlockNode* const parent;
const bool is_nested;
bool has_false_statement {false};
- explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { }
- explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { }
+ explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {}
+ explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -325,7 +324,7 @@
public:
const std::string file;
- explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+ explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -336,7 +335,7 @@
public:
const std::string file;
- explicit ExtendsStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+ explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -347,9 +346,9 @@
public:
const std::string name;
BlockNode block;
- BlockNode *const parent;
+ BlockNode* const parent;
- explicit BlockStatementNode(BlockNode *const parent, const std::string& name, size_t pos) : StatementNode(pos), name(name), parent(parent) { }
+ explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -361,7 +360,7 @@
const std::string key;
ExpressionListNode expression;
- explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { }
+ explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
diff --git a/include/inja/parser.hpp b/include/inja/parser.hpp
index 61e2aa8..3ea1793 100644
--- a/include/inja/parser.hpp
+++ b/include/inja/parser.hpp
@@ -16,7 +16,6 @@
#include "token.hpp"
#include "utils.hpp"
-
namespace inja {
/*!
@@ -38,8 +37,8 @@
std::string_view literal_start;
- BlockNode *current_block {nullptr};
- ExpressionListNode *current_expression_list {nullptr};
+ BlockNode* current_block {nullptr};
+ ExpressionListNode* current_expression_list {nullptr};
std::stack<std::pair<FunctionNode*, size_t>> function_stack;
std::vector<std::shared_ptr<ExpressionNode>> arguments;
@@ -110,7 +109,6 @@
template_storage.emplace(template_name, include_template);
parse_into_template(template_storage[template_name], template_name);
return;
-
} else if (!config.include_callback) {
INJA_THROW(FileError("failed accessing file at '" + template_name + "'"));
}
@@ -137,7 +135,7 @@
return std::string {tok.text.substr(1, tok.text.length() - 2)};
}
- bool parse_expression(Template &tmpl, Token::Kind closing) {
+ bool parse_expression(Template& tmpl, Token::Kind closing) {
while (tok.kind != closing && tok.kind != Token::Kind::Eof) {
// Literals
switch (tok.kind) {
@@ -146,28 +144,24 @@
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::Number: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::LeftBracket: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
}
current_bracket_level += 1;
-
} break;
case Token::Kind::LeftBrace: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
}
current_brace_level += 1;
-
} break;
case Token::Kind::RightBracket: {
if (current_bracket_level == 0) {
@@ -178,7 +172,6 @@
if (current_brace_level == 0 && current_bracket_level == 0) {
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::RightBrace: {
if (current_brace_level == 0) {
@@ -189,33 +182,33 @@
if (current_brace_level == 0 && current_bracket_level == 0) {
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::Id: {
get_peek_token();
// Data Literal
- if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") || tok.text == static_cast<decltype(tok.text)>("null")) {
+ if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") ||
+ tok.text == static_cast<decltype(tok.text)>("null")) {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
- // Operator
+ // Operator
} else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") {
goto parse_operator;
- // Functions
+ // Functions
} else if (peek_tok.kind == Token::Kind::LeftParen) {
operator_stack.emplace(std::make_shared<FunctionNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
- function_stack.emplace(operator_stack.top().get(), current_paren_level);
+ function_stack.emplace(operator_stack.top().get(), current_paren_level);
- // Variables
+ // Variables
} else {
arguments.emplace_back(std::make_shared<DataNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
}
- // Operators
+ // Operators
} break;
case Token::Kind::Equal:
case Token::Kind::NotEqual:
@@ -231,7 +224,7 @@
case Token::Kind::Percent:
case Token::Kind::Dot: {
- parse_operator:
+ parse_operator:
FunctionStorage::Operation operation;
switch (tok.kind) {
case Token::Kind::Id: {
@@ -292,12 +285,14 @@
}
auto function_node = std::make_shared<FunctionNode>(operation, tok.text.data() - tmpl.content.c_str());
- while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
+ while (!operator_stack.empty() &&
+ ((operator_stack.top()->precedence > function_node->precedence) ||
+ (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) &&
+ (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
add_operator();
}
operator_stack.emplace(function_node);
-
} break;
case Token::Kind::Comma: {
if (current_brace_level == 0 && current_bracket_level == 0) {
@@ -307,13 +302,11 @@
function_stack.top().first->number_args += 1;
}
-
} break;
case Token::Kind::Colon: {
if (current_brace_level == 0 && current_bracket_level == 0) {
throw_parser_error("unexpected ':'");
}
-
} break;
case Token::Kind::LeftParen: {
current_paren_level += 1;
@@ -325,7 +318,6 @@
function_stack.top().first->number_args = 0;
}
}
-
} break;
case Token::Kind::RightParen: {
current_paren_level -= 1;
@@ -370,15 +362,14 @@
if (arguments.size() == 1) {
current_expression_list->root = arguments[0];
arguments = {};
-
} else if (arguments.size() > 1) {
throw_parser_error("malformed expression");
}
-
+
return true;
}
- bool parse_statement(Template &tmpl, Token::Kind closing, std::string_view path) {
+ bool parse_statement(Template& tmpl, Token::Kind closing, std::string_view path) {
if (tok.kind != Token::Kind::Id) {
return false;
}
@@ -395,12 +386,11 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("else")) {
if (if_statement_stack.empty()) {
throw_parser_error("else without matching if");
}
- auto &if_statement_data = if_statement_stack.top();
+ auto& if_statement_data = if_statement_stack.top();
get_next_token();
if_statement_data->has_false_statement = true;
@@ -420,7 +410,6 @@
return false;
}
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("endif")) {
if (if_statement_stack.empty()) {
throw_parser_error("endif without matching if");
@@ -431,12 +420,11 @@
if_statement_stack.pop();
}
- auto &if_statement_data = if_statement_stack.top();
+ auto& if_statement_data = if_statement_stack.top();
get_next_token();
current_block = if_statement_data->parent;
if_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("block")) {
get_next_token();
@@ -456,18 +444,16 @@
}
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("endblock")) {
if (block_statement_stack.empty()) {
throw_parser_error("endblock without matching block");
}
- auto &block_statement_data = block_statement_stack.top();
+ auto& block_statement_data = block_statement_stack.top();
get_next_token();
current_block = block_statement_data->parent;
block_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("for")) {
get_next_token();
@@ -491,11 +477,13 @@
value_token = tok;
get_next_token();
- for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+ for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text),
+ current_block, tok.text.data() - tmpl.content.c_str());
- // Array type
+ // Array type
} else {
- for_statement_node = std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+ for_statement_node =
+ std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
}
current_block->nodes.emplace_back(for_statement_node);
@@ -511,18 +499,16 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("endfor")) {
if (for_statement_stack.empty()) {
throw_parser_error("endfor without matching for");
}
- auto &for_statement_data = for_statement_stack.top();
+ auto& for_statement_data = for_statement_stack.top();
get_next_token();
current_block = for_statement_data->parent;
for_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("include")) {
get_next_token();
@@ -532,7 +518,6 @@
current_block->nodes.emplace_back(std::make_shared<IncludeStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("extends")) {
get_next_token();
@@ -542,7 +527,6 @@
current_block->nodes.emplace_back(std::make_shared<ExtendsStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("set")) {
get_next_token();
@@ -565,14 +549,13 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else {
return false;
}
return true;
}
- void parse_into(Template &tmpl, std::string_view path) {
+ void parse_into(Template& tmpl, std::string_view path) {
lexer.start(tmpl.content);
current_block = &tmpl.root;
@@ -586,7 +569,8 @@
if (!for_statement_stack.empty()) {
throw_parser_error("unmatched for");
}
- } return;
+ }
+ return;
case Token::Kind::Text: {
current_block->nodes.emplace_back(std::make_shared<TextNode>(tok.text.data() - tmpl.content.c_str(), tok.text.size()));
} break;
@@ -636,11 +620,10 @@
}
}
-
public:
- explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
- TemplateStorage& template_storage, const FunctionStorage& function_storage)
- : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
+ explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config, TemplateStorage& template_storage,
+ const FunctionStorage& function_storage)
+ : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) {}
Template parse(std::string_view input, std::string_view path) {
auto result = Template(static_cast<std::string>(input));
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index 67dc09d..f24bb91 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -18,7 +18,7 @@
/*!
* \brief Class for rendering a Template with data.
*/
-class Renderer : public NodeVisitor {
+class Renderer : public NodeVisitor {
using Op = FunctionStorage::Operation;
const RenderConfig config;
@@ -104,8 +104,7 @@
data_eval_stack.push(result_ptr.get());
}
- template<size_t N, size_t N_start = 0, bool throw_not_found=true>
- std::array<const json*, N> get_arguments(const FunctionNode& node) {
+ template <size_t N, size_t N_start = 0, bool throw_not_found = true> std::array<const json*, N> get_arguments(const FunctionNode& node) {
if (node.arguments.size() < N_start + N) {
throw_renderer_error("function needs " + std::to_string(N_start + N) + " variables, but has only found " + std::to_string(node.arguments.size()), node);
}
@@ -135,10 +134,9 @@
return result;
}
- template<bool throw_not_found=true>
- Arguments get_argument_vector(const FunctionNode& node) {
+ template <bool throw_not_found = true> Arguments get_argument_vector(const FunctionNode& node) {
const size_t N = node.arguments.size();
- for (auto a: node.arguments) {
+ for (auto a : node.arguments) {
a->accept(*this);
}
@@ -177,7 +175,7 @@
output_stream->write(current_template->content.c_str() + node.pos, node.length);
}
- void visit(const ExpressionNode&) { }
+ void visit(const ExpressionNode&) {}
void visit(const LiteralNode& node) {
data_eval_stack.push(&node.value);
@@ -186,10 +184,8 @@
void visit(const DataNode& node) {
if (additional_data.contains(node.ptr)) {
data_eval_stack.push(&(additional_data[node.ptr]));
-
} else if (data_input->contains(node.ptr)) {
data_eval_stack.push(&(*data_input)[node.ptr]);
-
} else {
// Try to evaluate as a no-argument callback
const auto function_data = function_storage.find_function(node.name, 0);
@@ -198,7 +194,6 @@
const auto value = std::make_shared<json>(function_data.callback(empty_args));
data_tmp_stack.push_back(value);
data_eval_stack.push(value.get());
-
} else {
data_eval_stack.push(nullptr);
not_found_stack.emplace(&node);
@@ -325,12 +320,12 @@
make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
} break;
case Op::Exists: {
- auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
+ auto&& name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
} break;
case Op::ExistsInObject: {
const auto args = get_arguments<2>(node);
- auto &&name = args[1]->get_ref<const std::string&>();
+ auto&& name = args[1]->get_ref<const std::string&>();
make_result(args[0]->find(name) != args[0]->end());
} break;
case Op::First: {
@@ -480,9 +475,9 @@
print_data(eval_expression_list(node));
}
- void visit(const StatementNode&) { }
+ void visit(const StatementNode&) {}
- void visit(const ForStatementNode&) { }
+ void visit(const ForStatementNode&) {}
void visit(const ForArrayStatementNode& node) {
const auto result = eval_expression_list(node.condition);
@@ -584,7 +579,7 @@
void visit(const ExtendsStatementNode& node) {
const auto included_template_it = template_storage.find(node.file);
if (included_template_it != template_storage.end()) {
- const Template *parent_template = &included_template_it->second;
+ const Template* parent_template = &included_template_it->second;
render_to(*output_stream, *parent_template, *data_input, &additional_data);
break_rendering = true;
} else if (config.throw_at_missing_includes) {
@@ -600,7 +595,7 @@
if (block_it != current_template->block_storage.end()) {
block_statement_stack.emplace_back(&node);
block_it->second->block.accept(*this);
- block_statement_stack.pop_back();
+ block_statement_stack.pop_back();
}
current_level = old_level;
current_template = template_stack.back();
@@ -615,7 +610,7 @@
public:
Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage)
- : config(config), template_storage(template_storage), function_storage(function_storage) { }
+ : config(config), template_storage(template_storage), function_storage(function_storage) {}
void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) {
output_stream = &os;
diff --git a/include/inja/statistics.hpp b/include/inja/statistics.hpp
index f9b3f88..da33593 100644
--- a/include/inja/statistics.hpp
+++ b/include/inja/statistics.hpp
@@ -3,7 +3,6 @@
#include "node.hpp"
-
namespace inja {
/*!
@@ -16,9 +15,9 @@
}
}
- void visit(const TextNode&) { }
- void visit(const ExpressionNode&) { }
- void visit(const LiteralNode&) { }
+ void visit(const TextNode&) {}
+ void visit(const ExpressionNode&) {}
+ void visit(const LiteralNode&) {}
void visit(const DataNode&) {
variable_counter += 1;
@@ -34,8 +33,8 @@
node.root->accept(*this);
}
- void visit(const StatementNode&) { }
- void visit(const ForStatementNode&) { }
+ void visit(const StatementNode&) {}
+ void visit(const ForStatementNode&) {}
void visit(const ForArrayStatementNode& node) {
node.condition.accept(*this);
@@ -53,20 +52,20 @@
node.false_statement.accept(*this);
}
- void visit(const IncludeStatementNode&) { }
+ void visit(const IncludeStatementNode&) {}
- void visit(const ExtendsStatementNode&) { }
+ void visit(const ExtendsStatementNode&) {}
void visit(const BlockStatementNode& node) {
node.block.accept(*this);
}
- void visit(const SetStatementNode&) { }
+ void visit(const SetStatementNode&) {}
public:
unsigned int variable_counter;
- explicit StatisticsVisitor() : variable_counter(0) { }
+ explicit StatisticsVisitor(): variable_counter(0) {}
};
} // namespace inja
diff --git a/include/inja/template.hpp b/include/inja/template.hpp
index 45b276b..a396dd5 100644
--- a/include/inja/template.hpp
+++ b/include/inja/template.hpp
@@ -9,7 +9,6 @@
#include "node.hpp"
#include "statistics.hpp"
-
namespace inja {
/*!
@@ -20,8 +19,8 @@
std::string content;
std::map<std::string, std::shared_ptr<BlockStatementNode>> block_storage;
- explicit Template() { }
- explicit Template(const std::string& content): content(content) { }
+ explicit Template() {}
+ explicit Template(const std::string& content): content(content) {}
/// Return number of variables (total number, not distinct ones) in the template
int count_variables() {
diff --git a/include/inja/token.hpp b/include/inja/token.hpp
index 5391342..207e78e 100644
--- a/include/inja/token.hpp
+++ b/include/inja/token.hpp
@@ -4,7 +4,6 @@
#include <string>
#include <string_view>
-
namespace inja {
/*!
@@ -48,12 +47,12 @@
Unknown,
Eof,
};
-
+
Kind kind {Kind::Unknown};
std::string_view text;
explicit constexpr Token() = default;
- explicit constexpr Token(Kind kind, std::string_view text) : kind(kind), text(text) {}
+ explicit constexpr Token(Kind kind, std::string_view text): kind(kind), text(text) {}
std::string describe() const {
switch (kind) {
diff --git a/include/inja/utils.hpp b/include/inja/utils.hpp
index c1d13d5..4de05fd 100644
--- a/include/inja/utils.hpp
+++ b/include/inja/utils.hpp
@@ -9,7 +9,6 @@
#include "exceptions.hpp"
-
namespace inja {
namespace string_view {
@@ -55,14 +54,14 @@
return {count_lines + 1, sliced.length() - last_newline};
}
-inline void replace_substring(std::string& s, const std::string& f,
- const std::string& t)
-{
- if (f.empty()) return;
- for (auto pos = s.find(f); // find first occurrence of f
- pos != std::string::npos; // make sure f was found
- s.replace(pos, f.size(), t), // replace with t, and
- pos = s.find(f, pos + t.size())) // find next occurrence of f
+inline void replace_substring(std::string& s, const std::string& f, const std::string& t) {
+ if (f.empty()) {
+ return;
+ }
+ for (auto pos = s.find(f); // find first occurrence of f
+ pos != std::string::npos; // make sure f was found
+ s.replace(pos, f.size(), t), // replace with t, and
+ pos = s.find(f, pos + t.size())) // find next occurrence of f
{}
}
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index 0273fd4..6aad870 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -4,7 +4,7 @@
| || '_ \ | |/ _` | Licensed under the MIT License <http://opensource.org/licenses/MIT>.
| || | | || | (_| |
|___|_| |_|/ |\__,_| Copyright (c) 2018-2021 Lars Berscheid
- |__/
+ |__/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
@@ -29,24 +29,26 @@
namespace inja {
#ifndef INJA_DATA_TYPE
- using json = nlohmann::json;
+using json = nlohmann::json;
#else
- using json = INJA_DATA_TYPE;
+using json = INJA_DATA_TYPE;
#endif
-}
+} // namespace inja
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
- #ifndef INJA_THROW
- #define INJA_THROW(exception) throw exception
- #endif
+#ifndef INJA_THROW
+#define INJA_THROW(exception) throw exception
+#endif
#else
- #include <cstdlib>
- #ifndef INJA_THROW
- #define INJA_THROW(exception) std::abort(); std::ignore = exception
- #endif
- #ifndef INJA_NOEXCEPTION
- #define INJA_NOEXCEPTION
- #endif
+#include <cstdlib>
+#ifndef INJA_THROW
+#define INJA_THROW(exception) \
+ std::abort(); \
+ std::ignore = exception
+#endif
+#ifndef INJA_NOEXCEPTION
+#define INJA_NOEXCEPTION
+#endif
#endif
// #include "environment.hpp"
@@ -91,7 +93,6 @@
#include <string_view>
#include <vector>
-
namespace inja {
using Arguments = std::vector<const json*>;
@@ -156,7 +157,7 @@
};
struct FunctionData {
- explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
+ explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
const Operation operation;
const CallbackFunction callback;
};
@@ -165,44 +166,44 @@
const int VARIADIC {-1};
std::map<std::pair<std::string, int>, FunctionData> function_storage = {
- {std::make_pair("at", 2), FunctionData { Operation::At }},
- {std::make_pair("default", 2), FunctionData { Operation::Default }},
- {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }},
- {std::make_pair("even", 1), FunctionData { Operation::Even }},
- {std::make_pair("exists", 1), FunctionData { Operation::Exists }},
- {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }},
- {std::make_pair("first", 1), FunctionData { Operation::First }},
- {std::make_pair("float", 1), FunctionData { Operation::Float }},
- {std::make_pair("int", 1), FunctionData { Operation::Int }},
- {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }},
- {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }},
- {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }},
- {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }},
- {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }},
- {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }},
- {std::make_pair("isString", 1), FunctionData { Operation::IsString }},
- {std::make_pair("last", 1), FunctionData { Operation::Last }},
- {std::make_pair("length", 1), FunctionData { Operation::Length }},
- {std::make_pair("lower", 1), FunctionData { Operation::Lower }},
- {std::make_pair("max", 1), FunctionData { Operation::Max }},
- {std::make_pair("min", 1), FunctionData { Operation::Min }},
- {std::make_pair("odd", 1), FunctionData { Operation::Odd }},
- {std::make_pair("range", 1), FunctionData { Operation::Range }},
- {std::make_pair("round", 2), FunctionData { Operation::Round }},
- {std::make_pair("sort", 1), FunctionData { Operation::Sort }},
- {std::make_pair("upper", 1), FunctionData { Operation::Upper }},
- {std::make_pair("super", 0), FunctionData { Operation::Super }},
- {std::make_pair("super", 1), FunctionData { Operation::Super }},
- {std::make_pair("join", 2), FunctionData { Operation::Join }},
+ {std::make_pair("at", 2), FunctionData {Operation::At}},
+ {std::make_pair("default", 2), FunctionData {Operation::Default}},
+ {std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
+ {std::make_pair("even", 1), FunctionData {Operation::Even}},
+ {std::make_pair("exists", 1), FunctionData {Operation::Exists}},
+ {std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
+ {std::make_pair("first", 1), FunctionData {Operation::First}},
+ {std::make_pair("float", 1), FunctionData {Operation::Float}},
+ {std::make_pair("int", 1), FunctionData {Operation::Int}},
+ {std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
+ {std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
+ {std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
+ {std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
+ {std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
+ {std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
+ {std::make_pair("isString", 1), FunctionData {Operation::IsString}},
+ {std::make_pair("last", 1), FunctionData {Operation::Last}},
+ {std::make_pair("length", 1), FunctionData {Operation::Length}},
+ {std::make_pair("lower", 1), FunctionData {Operation::Lower}},
+ {std::make_pair("max", 1), FunctionData {Operation::Max}},
+ {std::make_pair("min", 1), FunctionData {Operation::Min}},
+ {std::make_pair("odd", 1), FunctionData {Operation::Odd}},
+ {std::make_pair("range", 1), FunctionData {Operation::Range}},
+ {std::make_pair("round", 2), FunctionData {Operation::Round}},
+ {std::make_pair("sort", 1), FunctionData {Operation::Sort}},
+ {std::make_pair("upper", 1), FunctionData {Operation::Upper}},
+ {std::make_pair("super", 0), FunctionData {Operation::Super}},
+ {std::make_pair("super", 1), FunctionData {Operation::Super}},
+ {std::make_pair("join", 2), FunctionData {Operation::Join}},
};
public:
void add_builtin(std::string_view name, int num_args, Operation op) {
- function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
}
void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
- function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
}
FunctionData find_function(std::string_view name, int num_args) const {
@@ -210,7 +211,7 @@
if (it != function_storage.end()) {
return it->second;
- // Find variadic function
+ // Find variadic function
} else if (num_args > 0) {
it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
if (it != function_storage.end()) {
@@ -218,7 +219,7 @@
}
}
- return FunctionData { Operation::None };
+ return FunctionData {Operation::None};
}
};
@@ -256,30 +257,29 @@
const SourceLocation location;
- explicit InjaError(const std::string &type, const std::string &message)
+ explicit InjaError(const std::string& type, const std::string& message)
: std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {}
- explicit InjaError(const std::string &type, const std::string &message, SourceLocation location)
- : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" +
- std::to_string(location.column) + ") " + message),
+ explicit InjaError(const std::string& type, const std::string& message, SourceLocation location)
+ : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + std::to_string(location.column) + ") " + message),
type(type), message(message), location(location) {}
};
struct ParserError : public InjaError {
- explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {}
+ explicit ParserError(const std::string& message, SourceLocation location): InjaError("parser_error", message, location) {}
};
struct RenderError : public InjaError {
- explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {}
+ explicit RenderError(const std::string& message, SourceLocation location): InjaError("render_error", message, location) {}
};
struct FileError : public InjaError {
- explicit FileError(const std::string &message) : InjaError("file_error", message) {}
- explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {}
+ explicit FileError(const std::string& message): InjaError("file_error", message) {}
+ explicit FileError(const std::string& message, SourceLocation location): InjaError("file_error", message, location) {}
};
struct DataError : public InjaError {
- explicit DataError(const std::string &message, SourceLocation location) : InjaError("data_error", message, location) {}
+ explicit DataError(const std::string& message, SourceLocation location): InjaError("data_error", message, location) {}
};
} // namespace inja
@@ -287,7 +287,6 @@
#endif // INCLUDE_INJA_EXCEPTIONS_HPP_
-
namespace inja {
namespace string_view {
@@ -333,14 +332,14 @@
return {count_lines + 1, sliced.length() - last_newline};
}
-inline void replace_substring(std::string& s, const std::string& f,
- const std::string& t)
-{
- if (f.empty()) return;
- for (auto pos = s.find(f); // find first occurrence of f
- pos != std::string::npos; // make sure f was found
- s.replace(pos, f.size(), t), // replace with t, and
- pos = s.find(f, pos + t.size())) // find next occurrence of f
+inline void replace_substring(std::string& s, const std::string& f, const std::string& t) {
+ if (f.empty()) {
+ return;
+ }
+ for (auto pos = s.find(f); // find first occurrence of f
+ pos != std::string::npos; // make sure f was found
+ s.replace(pos, f.size(), t), // replace with t, and
+ pos = s.find(f, pos + t.size())) // find next occurrence of f
{}
}
@@ -349,7 +348,6 @@
#endif // INCLUDE_INJA_UTILS_HPP_
-
namespace inja {
class NodeVisitor;
@@ -370,7 +368,6 @@
class BlockStatementNode;
class SetStatementNode;
-
class NodeVisitor {
public:
virtual ~NodeVisitor() = default;
@@ -402,16 +399,15 @@
size_t pos;
- AstNode(size_t pos) : pos(pos) { }
- virtual ~AstNode() { }
+ AstNode(size_t pos): pos(pos) {}
+ virtual ~AstNode() {}
};
-
class BlockNode : public AstNode {
public:
std::vector<std::shared_ptr<AstNode>> nodes;
- explicit BlockNode() : AstNode(0) {}
+ explicit BlockNode(): AstNode(0) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -422,7 +418,7 @@
public:
const size_t length;
- explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { }
+ explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -431,7 +427,7 @@
class ExpressionNode : public AstNode {
public:
- explicit ExpressionNode(size_t pos) : AstNode(pos) {}
+ explicit ExpressionNode(size_t pos): AstNode(pos) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -442,7 +438,7 @@
public:
const json value;
- explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
+ explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -465,7 +461,7 @@
return result;
}
- explicit DataNode(std::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) { }
+ explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -491,98 +487,99 @@
std::vector<std::shared_ptr<ExpressionNode>> arguments;
CallbackFunction callback;
- explicit FunctionNode(std::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
- explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) {
+ explicit FunctionNode(std::string_view name, size_t pos)
+ : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) {}
+ explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos), operation(operation), number_args(1) {
switch (operation) {
- case Op::Not: {
- number_args = 1;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::And: {
- number_args = 2;
- precedence = 1;
- associativity = Associativity::Left;
- } break;
- case Op::Or: {
- number_args = 2;
- precedence = 1;
- associativity = Associativity::Left;
- } break;
- case Op::In: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Equal: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::NotEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Greater: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::GreaterEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Less: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::LessEqual: {
- number_args = 2;
- precedence = 2;
- associativity = Associativity::Left;
- } break;
- case Op::Add: {
- number_args = 2;
- precedence = 3;
- associativity = Associativity::Left;
- } break;
- case Op::Subtract: {
- number_args = 2;
- precedence = 3;
- associativity = Associativity::Left;
- } break;
- case Op::Multiplication: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::Division: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::Power: {
- number_args = 2;
- precedence = 5;
- associativity = Associativity::Right;
- } break;
- case Op::Modulo: {
- number_args = 2;
- precedence = 4;
- associativity = Associativity::Left;
- } break;
- case Op::AtId: {
- number_args = 2;
- precedence = 8;
- associativity = Associativity::Left;
- } break;
- default: {
- precedence = 1;
- associativity = Associativity::Left;
- }
+ case Op::Not: {
+ number_args = 1;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::And: {
+ number_args = 2;
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Or: {
+ number_args = 2;
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::In: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Equal: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::NotEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Greater: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::GreaterEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Less: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::LessEqual: {
+ number_args = 2;
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Add: {
+ number_args = 2;
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Subtract: {
+ number_args = 2;
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Multiplication: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Division: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Power: {
+ number_args = 2;
+ precedence = 5;
+ associativity = Associativity::Right;
+ } break;
+ case Op::Modulo: {
+ number_args = 2;
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::AtId: {
+ number_args = 2;
+ precedence = 8;
+ associativity = Associativity::Left;
+ } break;
+ default: {
+ precedence = 1;
+ associativity = Associativity::Left;
+ }
}
}
@@ -595,8 +592,8 @@
public:
std::shared_ptr<ExpressionNode> root;
- explicit ExpressionListNode() : AstNode(0) { }
- explicit ExpressionListNode(size_t pos) : AstNode(pos) { }
+ explicit ExpressionListNode(): AstNode(0) {}
+ explicit ExpressionListNode(size_t pos): AstNode(pos) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -605,7 +602,7 @@
class StatementNode : public AstNode {
public:
- StatementNode(size_t pos) : AstNode(pos) { }
+ StatementNode(size_t pos): AstNode(pos) {}
virtual void accept(NodeVisitor& v) const = 0;
};
@@ -614,9 +611,9 @@
public:
ExpressionListNode condition;
BlockNode body;
- BlockNode *const parent;
+ BlockNode* const parent;
- ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { }
+ ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {}
virtual void accept(NodeVisitor& v) const = 0;
};
@@ -625,7 +622,7 @@
public:
const std::string value;
- explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { }
+ explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -637,7 +634,8 @@
const std::string key;
const std::string value;
- explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { }
+ explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos)
+ : ForStatementNode(parent, pos), key(key), value(value) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -649,13 +647,13 @@
ExpressionListNode condition;
BlockNode true_statement;
BlockNode false_statement;
- BlockNode *const parent;
+ BlockNode* const parent;
const bool is_nested;
bool has_false_statement {false};
- explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { }
- explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { }
+ explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {}
+ explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -666,7 +664,7 @@
public:
const std::string file;
- explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+ explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -677,7 +675,7 @@
public:
const std::string file;
- explicit ExtendsStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+ explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -688,9 +686,9 @@
public:
const std::string name;
BlockNode block;
- BlockNode *const parent;
+ BlockNode* const parent;
- explicit BlockStatementNode(BlockNode *const parent, const std::string& name, size_t pos) : StatementNode(pos), name(name), parent(parent) { }
+ explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -702,7 +700,7 @@
const std::string key;
ExpressionListNode expression;
- explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { }
+ explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {}
void accept(NodeVisitor& v) const {
v.visit(*this);
@@ -720,7 +718,6 @@
// #include "node.hpp"
-
namespace inja {
/*!
@@ -733,9 +730,9 @@
}
}
- void visit(const TextNode&) { }
- void visit(const ExpressionNode&) { }
- void visit(const LiteralNode&) { }
+ void visit(const TextNode&) {}
+ void visit(const ExpressionNode&) {}
+ void visit(const LiteralNode&) {}
void visit(const DataNode&) {
variable_counter += 1;
@@ -751,8 +748,8 @@
node.root->accept(*this);
}
- void visit(const StatementNode&) { }
- void visit(const ForStatementNode&) { }
+ void visit(const StatementNode&) {}
+ void visit(const ForStatementNode&) {}
void visit(const ForArrayStatementNode& node) {
node.condition.accept(*this);
@@ -770,20 +767,20 @@
node.false_statement.accept(*this);
}
- void visit(const IncludeStatementNode&) { }
+ void visit(const IncludeStatementNode&) {}
- void visit(const ExtendsStatementNode&) { }
+ void visit(const ExtendsStatementNode&) {}
void visit(const BlockStatementNode& node) {
node.block.accept(*this);
}
- void visit(const SetStatementNode&) { }
+ void visit(const SetStatementNode&) {}
public:
unsigned int variable_counter;
- explicit StatisticsVisitor() : variable_counter(0) { }
+ explicit StatisticsVisitor(): variable_counter(0) {}
};
} // namespace inja
@@ -791,7 +788,6 @@
#endif // INCLUDE_INJA_STATISTICS_HPP_
-
namespace inja {
/*!
@@ -802,8 +798,8 @@
std::string content;
std::map<std::string, std::shared_ptr<BlockStatementNode>> block_storage;
- explicit Template() { }
- explicit Template(const std::string& content): content(content) { }
+ explicit Template() {}
+ explicit Template(const std::string& content): content(content) {}
/// Return number of variables (total number, not distinct ones) in the template
int count_variables() {
@@ -928,7 +924,6 @@
#include <string>
#include <string_view>
-
namespace inja {
/*!
@@ -972,12 +967,12 @@
Unknown,
Eof,
};
-
+
Kind kind {Kind::Unknown};
std::string_view text;
explicit constexpr Token() = default;
- explicit constexpr Token(Kind kind, std::string_view text) : kind(kind), text(text) {}
+ explicit constexpr Token(Kind kind, std::string_view text): kind(kind), text(text) {}
std::string describe() const {
switch (kind) {
@@ -1035,7 +1030,6 @@
size_t tok_start;
size_t pos;
-
Token scan_body(std::string_view close, Token::Kind closeKind, std::string_view close_trim = std::string_view(), bool trim = false) {
again:
// skip whitespace (except for \n as it might be a close)
@@ -1216,7 +1210,9 @@
return make_token(Token::Kind::String);
}
- Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); }
+ Token make_token(Token::Kind kind) const {
+ return Token(kind, string_view::slice(m_in, tok_start, pos));
+ }
void skip_whitespaces_and_newlines() {
if (pos < m_in.size()) {
@@ -1262,7 +1258,7 @@
}
public:
- explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+ explicit Lexer(const LexerConfig& config): config(config), state(State::Text), minus_state(MinusState::Number) {}
SourceLocation current_position() const {
return get_source_location(m_in, tok_start);
@@ -1314,7 +1310,7 @@
} else if (inja::string_view::starts_with(open_str, config.statement_open)) {
if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) {
state = State::StatementStartNoLstrip;
- } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) {
+ } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip)) {
state = State::StatementStartForceLstrip;
must_lstrip = true;
} else {
@@ -1434,7 +1430,6 @@
// #include "utils.hpp"
-
namespace inja {
/*!
@@ -1456,8 +1451,8 @@
std::string_view literal_start;
- BlockNode *current_block {nullptr};
- ExpressionListNode *current_expression_list {nullptr};
+ BlockNode* current_block {nullptr};
+ ExpressionListNode* current_expression_list {nullptr};
std::stack<std::pair<FunctionNode*, size_t>> function_stack;
std::vector<std::shared_ptr<ExpressionNode>> arguments;
@@ -1528,7 +1523,6 @@
template_storage.emplace(template_name, include_template);
parse_into_template(template_storage[template_name], template_name);
return;
-
} else if (!config.include_callback) {
INJA_THROW(FileError("failed accessing file at '" + template_name + "'"));
}
@@ -1555,7 +1549,7 @@
return std::string {tok.text.substr(1, tok.text.length() - 2)};
}
- bool parse_expression(Template &tmpl, Token::Kind closing) {
+ bool parse_expression(Template& tmpl, Token::Kind closing) {
while (tok.kind != closing && tok.kind != Token::Kind::Eof) {
// Literals
switch (tok.kind) {
@@ -1564,28 +1558,24 @@
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::Number: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::LeftBracket: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
}
current_bracket_level += 1;
-
} break;
case Token::Kind::LeftBrace: {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
}
current_brace_level += 1;
-
} break;
case Token::Kind::RightBracket: {
if (current_bracket_level == 0) {
@@ -1596,7 +1586,6 @@
if (current_brace_level == 0 && current_bracket_level == 0) {
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::RightBrace: {
if (current_brace_level == 0) {
@@ -1607,33 +1596,33 @@
if (current_brace_level == 0 && current_bracket_level == 0) {
add_literal(tmpl.content.c_str());
}
-
} break;
case Token::Kind::Id: {
get_peek_token();
// Data Literal
- if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") || tok.text == static_cast<decltype(tok.text)>("null")) {
+ if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") ||
+ tok.text == static_cast<decltype(tok.text)>("null")) {
if (current_brace_level == 0 && current_bracket_level == 0) {
literal_start = tok.text;
add_literal(tmpl.content.c_str());
}
- // Operator
+ // Operator
} else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") {
goto parse_operator;
- // Functions
+ // Functions
} else if (peek_tok.kind == Token::Kind::LeftParen) {
operator_stack.emplace(std::make_shared<FunctionNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
- function_stack.emplace(operator_stack.top().get(), current_paren_level);
+ function_stack.emplace(operator_stack.top().get(), current_paren_level);
- // Variables
+ // Variables
} else {
arguments.emplace_back(std::make_shared<DataNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
}
- // Operators
+ // Operators
} break;
case Token::Kind::Equal:
case Token::Kind::NotEqual:
@@ -1649,7 +1638,7 @@
case Token::Kind::Percent:
case Token::Kind::Dot: {
- parse_operator:
+ parse_operator:
FunctionStorage::Operation operation;
switch (tok.kind) {
case Token::Kind::Id: {
@@ -1710,12 +1699,14 @@
}
auto function_node = std::make_shared<FunctionNode>(operation, tok.text.data() - tmpl.content.c_str());
- while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
+ while (!operator_stack.empty() &&
+ ((operator_stack.top()->precedence > function_node->precedence) ||
+ (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) &&
+ (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
add_operator();
}
operator_stack.emplace(function_node);
-
} break;
case Token::Kind::Comma: {
if (current_brace_level == 0 && current_bracket_level == 0) {
@@ -1725,13 +1716,11 @@
function_stack.top().first->number_args += 1;
}
-
} break;
case Token::Kind::Colon: {
if (current_brace_level == 0 && current_bracket_level == 0) {
throw_parser_error("unexpected ':'");
}
-
} break;
case Token::Kind::LeftParen: {
current_paren_level += 1;
@@ -1743,7 +1732,6 @@
function_stack.top().first->number_args = 0;
}
}
-
} break;
case Token::Kind::RightParen: {
current_paren_level -= 1;
@@ -1788,15 +1776,14 @@
if (arguments.size() == 1) {
current_expression_list->root = arguments[0];
arguments = {};
-
} else if (arguments.size() > 1) {
throw_parser_error("malformed expression");
}
-
+
return true;
}
- bool parse_statement(Template &tmpl, Token::Kind closing, std::string_view path) {
+ bool parse_statement(Template& tmpl, Token::Kind closing, std::string_view path) {
if (tok.kind != Token::Kind::Id) {
return false;
}
@@ -1813,12 +1800,11 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("else")) {
if (if_statement_stack.empty()) {
throw_parser_error("else without matching if");
}
- auto &if_statement_data = if_statement_stack.top();
+ auto& if_statement_data = if_statement_stack.top();
get_next_token();
if_statement_data->has_false_statement = true;
@@ -1838,7 +1824,6 @@
return false;
}
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("endif")) {
if (if_statement_stack.empty()) {
throw_parser_error("endif without matching if");
@@ -1849,12 +1834,11 @@
if_statement_stack.pop();
}
- auto &if_statement_data = if_statement_stack.top();
+ auto& if_statement_data = if_statement_stack.top();
get_next_token();
current_block = if_statement_data->parent;
if_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("block")) {
get_next_token();
@@ -1874,18 +1858,16 @@
}
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("endblock")) {
if (block_statement_stack.empty()) {
throw_parser_error("endblock without matching block");
}
- auto &block_statement_data = block_statement_stack.top();
+ auto& block_statement_data = block_statement_stack.top();
get_next_token();
current_block = block_statement_data->parent;
block_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("for")) {
get_next_token();
@@ -1909,11 +1891,13 @@
value_token = tok;
get_next_token();
- for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+ for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text),
+ current_block, tok.text.data() - tmpl.content.c_str());
- // Array type
+ // Array type
} else {
- for_statement_node = std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+ for_statement_node =
+ std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
}
current_block->nodes.emplace_back(for_statement_node);
@@ -1929,18 +1913,16 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else if (tok.text == static_cast<decltype(tok.text)>("endfor")) {
if (for_statement_stack.empty()) {
throw_parser_error("endfor without matching for");
}
- auto &for_statement_data = for_statement_stack.top();
+ auto& for_statement_data = for_statement_stack.top();
get_next_token();
current_block = for_statement_data->parent;
for_statement_stack.pop();
-
} else if (tok.text == static_cast<decltype(tok.text)>("include")) {
get_next_token();
@@ -1950,7 +1932,6 @@
current_block->nodes.emplace_back(std::make_shared<IncludeStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("extends")) {
get_next_token();
@@ -1960,7 +1941,6 @@
current_block->nodes.emplace_back(std::make_shared<ExtendsStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
get_next_token();
-
} else if (tok.text == static_cast<decltype(tok.text)>("set")) {
get_next_token();
@@ -1983,14 +1963,13 @@
if (!parse_expression(tmpl, closing)) {
return false;
}
-
} else {
return false;
}
return true;
}
- void parse_into(Template &tmpl, std::string_view path) {
+ void parse_into(Template& tmpl, std::string_view path) {
lexer.start(tmpl.content);
current_block = &tmpl.root;
@@ -2004,7 +1983,8 @@
if (!for_statement_stack.empty()) {
throw_parser_error("unmatched for");
}
- } return;
+ }
+ return;
case Token::Kind::Text: {
current_block->nodes.emplace_back(std::make_shared<TextNode>(tok.text.data() - tmpl.content.c_str(), tok.text.size()));
} break;
@@ -2054,11 +2034,10 @@
}
}
-
public:
- explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
- TemplateStorage& template_storage, const FunctionStorage& function_storage)
- : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
+ explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config, TemplateStorage& template_storage,
+ const FunctionStorage& function_storage)
+ : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) {}
Template parse(std::string_view input, std::string_view path) {
auto result = Template(static_cast<std::string>(input));
@@ -2119,7 +2098,7 @@
/*!
* \brief Class for rendering a Template with data.
*/
-class Renderer : public NodeVisitor {
+class Renderer : public NodeVisitor {
using Op = FunctionStorage::Operation;
const RenderConfig config;
@@ -2205,8 +2184,7 @@
data_eval_stack.push(result_ptr.get());
}
- template<size_t N, size_t N_start = 0, bool throw_not_found=true>
- std::array<const json*, N> get_arguments(const FunctionNode& node) {
+ template <size_t N, size_t N_start = 0, bool throw_not_found = true> std::array<const json*, N> get_arguments(const FunctionNode& node) {
if (node.arguments.size() < N_start + N) {
throw_renderer_error("function needs " + std::to_string(N_start + N) + " variables, but has only found " + std::to_string(node.arguments.size()), node);
}
@@ -2236,10 +2214,9 @@
return result;
}
- template<bool throw_not_found=true>
- Arguments get_argument_vector(const FunctionNode& node) {
+ template <bool throw_not_found = true> Arguments get_argument_vector(const FunctionNode& node) {
const size_t N = node.arguments.size();
- for (auto a: node.arguments) {
+ for (auto a : node.arguments) {
a->accept(*this);
}
@@ -2278,7 +2255,7 @@
output_stream->write(current_template->content.c_str() + node.pos, node.length);
}
- void visit(const ExpressionNode&) { }
+ void visit(const ExpressionNode&) {}
void visit(const LiteralNode& node) {
data_eval_stack.push(&node.value);
@@ -2287,10 +2264,8 @@
void visit(const DataNode& node) {
if (additional_data.contains(node.ptr)) {
data_eval_stack.push(&(additional_data[node.ptr]));
-
} else if (data_input->contains(node.ptr)) {
data_eval_stack.push(&(*data_input)[node.ptr]);
-
} else {
// Try to evaluate as a no-argument callback
const auto function_data = function_storage.find_function(node.name, 0);
@@ -2299,7 +2274,6 @@
const auto value = std::make_shared<json>(function_data.callback(empty_args));
data_tmp_stack.push_back(value);
data_eval_stack.push(value.get());
-
} else {
data_eval_stack.push(nullptr);
not_found_stack.emplace(&node);
@@ -2426,12 +2400,12 @@
make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
} break;
case Op::Exists: {
- auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
+ auto&& name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
} break;
case Op::ExistsInObject: {
const auto args = get_arguments<2>(node);
- auto &&name = args[1]->get_ref<const std::string&>();
+ auto&& name = args[1]->get_ref<const std::string&>();
make_result(args[0]->find(name) != args[0]->end());
} break;
case Op::First: {
@@ -2581,9 +2555,9 @@
print_data(eval_expression_list(node));
}
- void visit(const StatementNode&) { }
+ void visit(const StatementNode&) {}
- void visit(const ForStatementNode&) { }
+ void visit(const ForStatementNode&) {}
void visit(const ForArrayStatementNode& node) {
const auto result = eval_expression_list(node.condition);
@@ -2685,7 +2659,7 @@
void visit(const ExtendsStatementNode& node) {
const auto included_template_it = template_storage.find(node.file);
if (included_template_it != template_storage.end()) {
- const Template *parent_template = &included_template_it->second;
+ const Template* parent_template = &included_template_it->second;
render_to(*output_stream, *parent_template, *data_input, &additional_data);
break_rendering = true;
} else if (config.throw_at_missing_includes) {
@@ -2701,7 +2675,7 @@
if (block_it != current_template->block_storage.end()) {
block_statement_stack.emplace_back(&node);
block_it->second->block.accept(*this);
- block_statement_stack.pop_back();
+ block_statement_stack.pop_back();
}
current_level = old_level;
current_template = template_stack.back();
@@ -2716,7 +2690,7 @@
public:
Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage)
- : config(config), template_storage(template_storage), function_storage(function_storage) { }
+ : config(config), template_storage(template_storage), function_storage(function_storage) {}
void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) {
output_stream = &os;
@@ -2760,12 +2734,11 @@
TemplateStorage template_storage;
public:
- Environment() : Environment("") {}
+ Environment(): Environment("") {}
- explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
+ explicit Environment(const std::string& global_path): input_path(global_path), output_path(global_path) {}
- Environment(const std::string& input_path, const std::string& output_path)
- : input_path(input_path), output_path(output_path) {}
+ Environment(const std::string& input_path, const std::string& output_path): input_path(input_path), output_path(output_path) {}
/// Sets the opener and closer for template statements
void set_statement(const std::string& open, const std::string& close) {
@@ -2837,7 +2810,9 @@
return parse_template(filename);
}
- std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
+ std::string render(std::string_view input, const json& data) {
+ return render(parse(input), data);
+ }
std::string render(const Template& tmpl, const json& data) {
std::stringstream os;
@@ -2866,8 +2841,7 @@
file.close();
}
- void write_with_json_file(const std::string& filename, const std::string& filename_data,
- const std::string& filename_out) {
+ void write_with_json_file(const std::string& filename, const std::string& filename_data, const std::string& filename_out) {
const json data = load_json(filename_data);
write(filename, data, filename_out);
}
@@ -2923,7 +2897,10 @@
@brief Adds a void callback with given number or arguments
*/
void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
- function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
+ function_storage.add_callback(name, num_args, [callback](Arguments& args) {
+ callback(args);
+ return json();
+ });
}
/** Includes a template with a given name into the environment.
diff --git a/test/benchmark.cpp b/test/benchmark.cpp
index 2cfc07b..92c696f 100644
--- a/test/benchmark.cpp
+++ b/test/benchmark.cpp
@@ -3,7 +3,6 @@
#include "hayai/hayai.hpp"
#include <inja/inja.hpp>
-
inja::Environment env;
const std::string test_file_directory {"../test/data/benchmark/"};
@@ -13,11 +12,15 @@
std::string medium_template = env.load_file(test_file_directory + "medium_template.txt");
std::string large_template = env.load_file(test_file_directory + "large_template.txt");
-
-BENCHMARK(SmallDataMediumTemplate, render, 5, 30) { env.render(medium_template, small_data); }
-BENCHMARK(LargeDataMediumTemplate, render, 5, 15) { env.render(medium_template, large_data); }
-BENCHMARK(LargeDataLargeTemplate, render, 5, 5) { env.render(large_template, large_data); }
-
+BENCHMARK(SmallDataMediumTemplate, render, 5, 30) {
+ env.render(medium_template, small_data);
+}
+BENCHMARK(LargeDataMediumTemplate, render, 5, 15) {
+ env.render(medium_template, large_data);
+}
+BENCHMARK(LargeDataLargeTemplate, render, 5, 5) {
+ env.render(large_template, large_data);
+}
int main() {
hayai::ConsoleOutputter consoleOutputter;
diff --git a/test/test-files.cpp b/test/test-files.cpp
index 2de97fc..aa01cff 100644
--- a/test/test-files.cpp
+++ b/test/test-files.cpp
@@ -5,7 +5,9 @@
inja::json data;
data["name"] = "Jeff";
- SUBCASE("Files should be loaded") { CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}."); }
+ SUBCASE("Files should be loaded") {
+ CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}.");
+ }
SUBCASE("Files should be rendered") {
CHECK(env.render_file(test_file_directory + "simple.txt", data) == "Hello Jeff.");
@@ -29,8 +31,7 @@
for (std::string test_name : {"simple-file", "nested", "nested-line", "html", "html-extend"}) {
SUBCASE(test_name.c_str()) {
- CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") ==
- env.load_file(test_name + "/result.txt"));
+ CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
}
}
@@ -49,8 +50,7 @@
for (std::string test_name : {"nested-whitespace"}) {
SUBCASE(test_name.c_str()) {
- CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") ==
- env.load_file(test_name + "/result.txt"));
+ CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
}
}
}
@@ -73,7 +73,8 @@
inja::Environment env {test_file_directory};
env.set_search_included_templates_in_files(false);
- CHECK_THROWS_WITH(env.render_file_with_json_file("html/template.txt", "html/data.json"), "[inja.exception.render_error] (at 3:14) include 'header.txt' not found");
+ CHECK_THROWS_WITH(env.render_file_with_json_file("html/template.txt", "html/data.json"),
+ "[inja.exception.render_error] (at 3:14) include 'header.txt' not found");
}
TEST_CASE("include-in-memory-and-file-template") {
diff --git a/test/test-functions.cpp b/test/test-functions.cpp
index 92eca89..667f553 100644
--- a/test/test-functions.cpp
+++ b/test/test-functions.cpp
@@ -56,8 +56,8 @@
SUBCASE("length") {
CHECK(env.render("{{ length(names) }}", data) == "4"); // Length of array
CHECK(env.render("{{ length(name) }}", data) == "5"); // Length of string
- // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error]
- // [json.exception.type_error.302] type must be array, but is number" );
+ // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error]
+ // [json.exception.type_error.302] type must be array, but is number" );
}
SUBCASE("sort") {
@@ -150,8 +150,7 @@
CHECK(env.render("{{ default(name, \"nobody\") }}", data) == "Peter");
CHECK(env.render("{{ default(surname, \"nobody\") }}", data) == "nobody");
CHECK(env.render("{{ default(surname, \"{{ surname }}\") }}", data) == "{{ surname }}");
- CHECK_THROWS_WITH(env.render("{{ default(surname, lastname) }}", data),
- "[inja.exception.render_error] (at 1:21) variable 'lastname' not found");
+ CHECK_THROWS_WITH(env.render("{{ default(surname, lastname) }}", data), "[inja.exception.render_error] (at 1:21) variable 'lastname' not found");
}
SUBCASE("exists") {
@@ -159,7 +158,7 @@
CHECK(env.render("{{ exists(\"zipcode\") }}", data) == "false");
CHECK(env.render("{{ exists(name) }}", data) == "false");
CHECK(env.render("{{ exists(property) }}", data) == "true");
-
+
// CHECK(env.render("{{ exists(\"keywords\") and length(keywords) > 0 }}", data) == "false");
}
@@ -168,10 +167,8 @@
CHECK(env.render("{{ existsIn(brother, \"parents\") }}", data) == "false");
CHECK(env.render("{{ existsIn(brother, property) }}", data) == "true");
CHECK(env.render("{{ existsIn(brother, name) }}", data) == "false");
- CHECK_THROWS_WITH(env.render("{{ existsIn(sister, \"lastname\") }}", data),
- "[inja.exception.render_error] (at 1:13) variable 'sister' not found");
- CHECK_THROWS_WITH(env.render("{{ existsIn(brother, sister) }}", data),
- "[inja.exception.render_error] (at 1:22) variable 'sister' not found");
+ CHECK_THROWS_WITH(env.render("{{ existsIn(sister, \"lastname\") }}", data), "[inja.exception.render_error] (at 1:13) variable 'sister' not found");
+ CHECK_THROWS_WITH(env.render("{{ existsIn(brother, sister) }}", data), "[inja.exception.render_error] (at 1:22) variable 'sister' not found");
}
SUBCASE("join") {
@@ -212,7 +209,7 @@
inja::json data;
data["age"] = 28;
- env.add_callback("double", 1, [](inja::Arguments &args) {
+ env.add_callback("double", 1, [](inja::Arguments& args) {
int number = args.at(0)->get<int>();
return 2 * number;
});
@@ -244,7 +241,7 @@
});
env.add_void_callback("log", 1, [](inja::Arguments) {
-
+
});
env.add_callback("multiply", 0, [](inja::Arguments) { return 1.0; });
@@ -262,7 +259,7 @@
SUBCASE("Variadic") {
env.add_callback("argmax", [](inja::Arguments& args) {
- auto result = std::max_element(args.begin(), args.end(), [](const inja::json* a, const inja::json* b) { return *a < *b;});
+ auto result = std::max_element(args.begin(), args.end(), [](const inja::json* a, const inja::json* b) { return *a < *b; });
return std::distance(args.begin(), result);
});
diff --git a/test/test-renderer.cpp b/test/test-renderer.cpp
index 2801ed0..2089791 100644
--- a/test/test-renderer.cpp
+++ b/test/test-renderer.cpp
@@ -50,25 +50,20 @@
SUBCASE("loops") {
CHECK(env.render("{% for name in names %}a{% endfor %}", data) == "aa");
CHECK(env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !");
- CHECK(env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) ==
- "Hello 0: Jeff, 1: Seb, !");
+ CHECK(env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !");
CHECK(env.render("{% for type, name in relatives %}{{ loop.index1 }}: {{ type }}: {{ name }}{% if loop.is_last == "
"false %}, {% endif %}{% endfor %}",
data) == "1: brother: Chris, 2: mother: Maria, 3: sister: Jenny");
CHECK(env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++");
- CHECK(env.render(
- "{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!",
- data) == "0: Jeff, 1: Seb!");
+ CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!");
CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% "
"endfor %}!",
data) == "0: Jeff, 1: Seb!");
CHECK(env.render("{% for name in [] %}a{% endfor %}", data) == "");
- CHECK_THROWS_WITH(env.render("{% for name ins names %}a{% endfor %}", data),
- "[inja.exception.parser_error] (at 1:13) expected 'in', got 'ins'");
- CHECK_THROWS_WITH(env.render("{% for name in empty_loop %}a{% endfor %}", data),
- "[inja.exception.render_error] (at 1:16) variable 'empty_loop' not found");
+ CHECK_THROWS_WITH(env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] (at 1:13) expected 'in', got 'ins'");
+ CHECK_THROWS_WITH(env.render("{% for name in empty_loop %}a{% endfor %}", data), "[inja.exception.render_error] (at 1:16) variable 'empty_loop' not found");
// CHECK_THROWS_WITH( env.render("{% for name in relatives %}{{ name }}{% endfor %}", data),
// "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is object" );
}
@@ -112,12 +107,10 @@
CHECK(env.render("{% if age >= 30 %}Right{% else %}Wrong{% endif %}", data) == "Wrong");
CHECK(env.render("{% if age in [28, 29, 30] %}True{% endif %}", data) == "True");
CHECK(env.render("{% if age == 28 %}28{% else if age == 29 %}29{% endif %}", data) == "29");
- CHECK(env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}",
- data) == "29");
+ CHECK(env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}", data) == "29");
CHECK(env.render("{% if age == 25 %}+{% endif %}{% if age == 29 %}+{% else %}-{% endif %}", data) == "+");
- CHECK_THROWS_WITH(env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data),
- "[inja.exception.parser_error] (at 1:46) unmatched if");
+ CHECK_THROWS_WITH(env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data), "[inja.exception.parser_error] (at 1:46) unmatched if");
CHECK_THROWS_WITH(env.render("{% if is_happy %}{% else if is_happy %}{% end if %}", data),
"[inja.exception.parser_error] (at 1:43) expected statement, got 'end'");
}
@@ -128,8 +121,7 @@
CHECK(env.render("{% set age=30 %}{{age}}", data) == "30");
CHECK(env.render("{% set predefined.value=1 %}{% if existsIn(predefined, \"value\") %}{{predefined.value}}{% endif %}", data) == "1");
CHECK(env.render("{% set brother.name=\"Bob\" %}{{brother.name}}", data) == "Bob");
- CHECK_THROWS_WITH(env.render("{% if predefined %}{% endif %}", data),
- "[inja.exception.render_error] (at 1:7) variable 'predefined' not found");
+ CHECK_THROWS_WITH(env.render("{% if predefined %}{% endif %}", data), "[inja.exception.render_error] (at 1:7) variable 'predefined' not found");
CHECK(env.render("{{age}}", data) == "29");
CHECK(env.render("{{brother.name}}", data) == "Chris");
}
@@ -181,31 +173,24 @@
inja::Template t2 = env.parse("{% include \"greeting\" %}!");
CHECK(env.render(t2, data) == "Hello Peter!");
- CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"),
- "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
+ CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
- CHECK_THROWS_WITH(env.parse("{% include does-not-exist %}!"),
- "[inja.exception.parser_error] (at 1:12) expected string, got 'does-not-exist'");
+ CHECK_THROWS_WITH(env.parse("{% include does-not-exist %}!"), "[inja.exception.parser_error] (at 1:12) expected string, got 'does-not-exist'");
}
SUBCASE("include-callback") {
inja::Environment env;
- CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"),
- "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
+ CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
env.set_search_included_templates_in_files(false);
- env.set_include_callback([&env](const std::string&, const std::string&) {
- return env.parse("Hello {{ name }}");
- });
+ env.set_include_callback([&env](const std::string&, const std::string&) { return env.parse("Hello {{ name }}"); });
inja::Template t1 = env.parse("{% include \"greeting\" %}!");
CHECK(env.render(t1, data) == "Hello Peter!");
env.set_search_included_templates_in_files(true);
- env.set_include_callback([&env](const std::string&, const std::string& name) {
- return env.parse("Bye " + name);
- });
+ env.set_include_callback([&env](const std::string&, const std::string& name) { return env.parse("Bye " + name); });
inja::Template t2 = env.parse("{% include \"Jeff\" %}!");
CHECK(env.render(t2, data) == "Bye Jeff!");
@@ -218,8 +203,7 @@
inja::Environment env;
env.include_template("city.tpl", env.parse("{{ loop.index }}:{{ city.name }};"));
- CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) ==
- "0:Munich;1:New York;");
+ CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) == "0:Munich;1:New York;");
}
SUBCASE("count variables") {
diff --git a/test/test-units.cpp b/test/test-units.cpp
index 2366dde..bbef190 100644
--- a/test/test-units.cpp
+++ b/test/test-units.cpp
@@ -27,7 +27,7 @@
TEST_CASE("copy environment") {
inja::Environment env;
- env.add_callback("double", 1, [](inja::Arguments &args) {
+ env.add_callback("double", 1, [](inja::Arguments& args) {
int number = args.at(0)->get<int>();
return 2 * number;
});