1717#include < nonstd/expected.hpp>
1818
1919#include < list>
20- #include < regex>
2120#include < sstream>
2221#include < string>
2322#include < vector>
2423
24+ #ifdef JINJA2CPP_USE_REGEX_BOOST
25+ #include < boost/regex.hpp>
26+ template <typename CharType>
27+ using BasicRegex = boost::basic_regex<CharType>;
28+ using Regex = boost::regex;
29+ using WideRegex = boost::wregex;
30+ template <typename CharIterator>
31+ using RegexIterator = boost::regex_iterator<CharIterator>;
32+ #else
33+ #include < regex>
34+ template <typename CharType>
35+ using BasicRegex = std::basic_regex<CharType>;
36+ using Regex = std::regex;
37+ using WideRegex = std::wregex;
38+ template <typename CharIterator>
39+ using RegexIterator = std::regex_iterator<CharIterator>;
40+ #endif
41+
2542namespace jinja2
2643{
2744template <typename CharT>
@@ -58,9 +75,9 @@ MultiStringLiteral ParserTraitsBase<T>::s_regexp = UNIVERSAL_STR(
5875template <>
5976struct ParserTraits <char > : public ParserTraitsBase<>
6077{
61- static std::regex GetRoughTokenizer ()
62- { return std::regex (s_regexp.GetValueStr <char >()); }
63- static std::regex GetKeywords ()
78+ static Regex GetRoughTokenizer ()
79+ { return Regex (s_regexp.GetValueStr <char >()); }
80+ static Regex GetKeywords ()
6481 {
6582 std::string pattern;
6683 std::string prefix (" (^" );
@@ -76,7 +93,7 @@ struct ParserTraits<char> : public ParserTraitsBase<>
7693
7794 pattern += prefix + info.name .charValue + postfix;
7895 }
79- return std::regex (pattern);
96+ return Regex (pattern);
8097 }
8198 static std::string GetAsString (const std::string& str, CharRange range) { return str.substr (range.startOffset , range.size ()); }
8299 static InternalValue RangeToNum (const std::string& str, CharRange range, Token::Type hint)
@@ -109,9 +126,9 @@ struct ParserTraits<char> : public ParserTraitsBase<>
109126template <>
110127struct ParserTraits <wchar_t > : public ParserTraitsBase<>
111128{
112- static std::wregex GetRoughTokenizer ()
113- { return std::wregex (s_regexp.GetValueStr <wchar_t >()); }
114- static std::wregex GetKeywords ()
129+ static WideRegex GetRoughTokenizer ()
130+ { return WideRegex (s_regexp.GetValueStr <wchar_t >()); }
131+ static WideRegex GetKeywords ()
115132 {
116133 std::wstring pattern;
117134 std::wstring prefix (L" (^" );
@@ -127,7 +144,7 @@ struct ParserTraits<wchar_t> : public ParserTraitsBase<>
127144
128145 pattern += prefix + info.name .wcharValue + postfix;
129146 }
130- return std::wregex (pattern);
147+ return WideRegex (pattern);
131148 }
132149 static std::string GetAsString (const std::wstring& str, CharRange range)
133150 {
@@ -248,7 +265,7 @@ class TemplateParser : public LexerHelper
248265public:
249266 using string_t = std::basic_string<CharT>;
250267 using traits_t = ParserTraits<CharT>;
251- using sregex_iterator = std::regex_iterator <typename string_t ::const_iterator>;
268+ using sregex_iterator = RegexIterator <typename string_t ::const_iterator>;
252269 using ErrorInfo = ErrorInfoTpl<CharT>;
253270 using ParseResult = nonstd::expected<RendererPtr, std::vector<ErrorInfo>>;
254271
@@ -437,7 +454,7 @@ class TemplateParser : public LexerHelper
437454 FinishCurrentLine (match.position () + 2 );
438455 return MakeParseError (ErrorCode::UnexpectedCommentEnd, MakeToken (Token::CommentEnd, { matchStart, matchStart + 2 }));
439456 }
440-
457+
441458 m_currentBlockInfo.range .startOffset = FinishCurrentBlock (matchStart, TextBlockType::RawText);
442459 break ;
443460 case RM_ExprBegin:
@@ -925,8 +942,8 @@ class TemplateParser : public LexerHelper
925942 std::string m_templateName;
926943 const Settings& m_settings;
927944 TemplateEnv* m_env = nullptr ;
928- std::basic_regex <CharT> m_roughTokenizer;
929- std::basic_regex <CharT> m_keywords;
945+ BasicRegex <CharT> m_roughTokenizer;
946+ BasicRegex <CharT> m_keywords;
930947 std::vector<LineInfo> m_lines;
931948 std::vector<TextBlockInfo> m_textBlocks;
932949 LineInfo m_currentLineInfo = {};
0 commit comments