Index: clang-tools-extra/clang-doc/HTMLGenerator.cpp =================================================================== --- clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -71,7 +71,12 @@ std::string Text; // Content of node bool Indented; // Indicates if an indentation must be rendered before the text + + void FixText(); void Render(llvm::raw_ostream &OS, int IndentationLevel) override; + +private: + std::string getHTMLEntity(const char &C); }; struct TagNode : public HTMLNode { @@ -173,7 +178,30 @@ llvm_unreachable("Unhandled HTMLTag::TagType"); } +std::string TextNode::getHTMLEntity(const char &C) { + switch (C) { + case '<': + return "<"; + case '>': + return ">"; + case '"': + return """; + default: + return std::string(&C, 1); + } +} + +void TextNode::FixText() { + static const std::string CharactersToReplace = "<>\""; + std::size_t found = Text.find_first_of(CharactersToReplace); + while (found != std::string::npos) { + Text.replace(found, 1, getHTMLEntity(Text[found])); + found = Text.find_first_of(CharactersToReplace, found + 1); + } +} + void TextNode::Render(llvm::raw_ostream &OS, int IndentationLevel) { + FixText(); if (Indented) OS.indent(IndentationLevel * 2); OS << Text; Index: clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp +++ clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp @@ -258,6 +258,14 @@ Extended->Children.back()->Kind = "TextComment"; Extended->Children.back()->Text = " continues onto the next line."; + Top.Children.emplace_back(llvm::make_unique()); + CommentInfo *Entities = Top.Children.back().get(); + Entities->Kind = "ParagraphComment"; + Entities->Children.emplace_back(llvm::make_unique()); + Entities->Children.back()->Kind = "TextComment"; + Entities->Children.back()->Name = "ParagraphComment"; + Entities->Children.back()->Text = " Comment with html entities: <, > and \"."; + I.Description.emplace_back(std::move(Top)); auto G = getHTMLGenerator(); @@ -285,6 +293,9 @@

Extended description that continues onto the next line.

+

+ Comment with html entities: <, > and ". +