================ @@ -0,0 +1,446 @@ +//===-- Mustache.cpp ------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/Mustache.h" +#include "llvm/Support/Error.h" + +using namespace llvm; +using namespace llvm::json; +using namespace llvm::mustache; + +SmallString<128> escapeString(StringRef Input, + DenseMap<char, StringRef> &Escape) { + SmallString<128> EscapedString(""); + for (char C : Input) { + if (Escape.find(C) != Escape.end()) + EscapedString += Escape[C]; + else + EscapedString += C; + } + return EscapedString; +} + +std::vector<SmallString<128>> split(StringRef Str, char Delimiter) { + std::vector<SmallString<128>> Tokens; + if (Str == ".") { + Tokens.push_back(Str); + return Tokens; + } + StringRef Ref(Str); + while (!Ref.empty()) { + llvm::StringRef Part; + std::tie(Part, Ref) = Ref.split(Delimiter); + Tokens.push_back(Part.trim()); + } + return Tokens; +} + +Token::Token(StringRef RawBody, StringRef InnerBody, char Identifier) + : RawBody(RawBody), TokenBody(InnerBody) { + + TokenType = getTokenType(Identifier); + if (TokenType == Type::Comment) + return; + + StringRef AccessorStr = InnerBody; + if (TokenType != Type::Variable) + AccessorStr = InnerBody.substr(1); + + Accessor = split(AccessorStr.trim(), '.'); +} + +Token::Token(StringRef Str) + : RawBody(Str), TokenType(Type::Text), TokenBody(Str), Accessor({}) {} + +Token::Type Token::getTokenType(char Identifier) { + switch (Identifier) { + case '#': + return Type::SectionOpen; + case '/': + return Type::SectionClose; + case '^': + return Type::InvertSectionOpen; + case '!': + return Type::Comment; + case '>': + return Type::Partial; + case '&': + return Type::UnescapeVariable; + default: + return Type::Variable; + } +} + +std::vector<Token> tokenize(StringRef Template) { + // Simple tokenizer that splits the template into tokens + // the mustache spec allows {{{ }}} to unescape variables + // but we don't support that here unescape variable + // is represented only by {{& variable}} + std::vector<Token> Tokens; + SmallString<128> Open("{{"); + SmallString<128> Close("}}"); + std::size_t Start = 0; + std::size_t DelimiterStart = Template.find(Open); + if (DelimiterStart == StringRef::npos) { + Tokens.push_back(Token(Template)); ---------------- ilovepi wrote:
```suggestion Tokens.emplace_back(Template); ``` prefer `emplace_back()` when inserting somthing into a vector like container to avoid extra copies/temporaries. https://github.com/llvm/llvm-project/pull/105893 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits