From 1b3188cfc2bfaeb14d40c43c1df62097b79016d1 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 18 Mar 2008 23:55:46 +0000 Subject: [PATCH] More HTML rewriter cleanups. Preliminary CSS support in code pretty-printing. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48518 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/HTMLPrint.cpp | 21 ++++++++-- include/clang/Rewrite/HTMLRewrite.h | 24 +++++++++-- lib/Rewrite/HTMLRewrite.cpp | 63 ++++++++++++++--------------- 3 files changed, 68 insertions(+), 40 deletions(-) diff --git a/Driver/HTMLPrint.cpp b/Driver/HTMLPrint.cpp index 940016afd2..6c8a1d1aad 100644 --- a/Driver/HTMLPrint.cpp +++ b/Driver/HTMLPrint.cpp @@ -18,6 +18,7 @@ #include "clang/Basic/SourceManager.h" #include "llvm/Support/MemoryBuffer.h" #include "clang/AST/ASTContext.h" +#include using namespace clang; @@ -49,10 +50,22 @@ HTMLPrinter::~HTMLPrinter() { html::EscapeText(R, FileID); html::AddLineNumbers(R, FileID); - html::InsertTag(R, html::PRE, StartLoc, EndLoc, 0, 0, true); - html::InsertTag(R, html::BODY, StartLoc, EndLoc, NULL, "\n", true); - html::InsertTag(R, html::HEAD, StartLoc, StartLoc, 0, 0, true); - html::InsertTag(R, html::HTML, StartLoc, EndLoc, NULL, "\n", true); + html::InsertOuterTag(R, html::PRE, StartLoc, EndLoc, 0, 0, true); + html::InsertOuterTag(R, html::BODY, StartLoc, EndLoc, NULL, "\n", true); + + // Generate CSS. + + std::ostringstream css; + css << "\n \n"; + + + // Add and tags. + + html::InsertTagBefore(R, html::HEAD, StartLoc, StartLoc, 0,css.str().c_str()); + html::InsertOuterTag(R, html::HTML, StartLoc, EndLoc, 0, "\n"); // Emit the HTML. diff --git a/include/clang/Rewrite/HTMLRewrite.h b/include/clang/Rewrite/HTMLRewrite.h index 3f821cc1fd..dddde01068 100644 --- a/include/clang/Rewrite/HTMLRewrite.h +++ b/include/clang/Rewrite/HTMLRewrite.h @@ -30,15 +30,33 @@ namespace html { HEAD, HTML, PRE, - SPAN }; + SPAN, + STYLE }; void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false); void InsertTag(Rewriter& R, Tags tag, SourceLocation OpenLoc, SourceLocation CloseLoc, - const char* Attributes = NULL, const char* Content = NULL, + const char* Attrs = NULL, const char* Content = NULL, bool Newline = false, - bool OpenInsertBefore = true, bool CloseInsertAfter = true); + bool OpenInsertBefore = true, bool CloseInsertBefore = false); + + static inline + void InsertTagBefore(Rewriter& R, Tags tag, + SourceLocation OpenLoc, SourceLocation CloseLoc, + const char* Attrs = NULL, const char* Content = NULL, + bool Newline = false) { + InsertTag(R, tag, OpenLoc, CloseLoc, Attrs, Content, Newline, true, true); + } + + static inline + void InsertOuterTag(Rewriter& R, Tags tag, + SourceLocation OpenLoc, SourceLocation CloseLoc, + const char* Attrs = NULL, const char* Content = NULL, + bool Newline = false) { + + InsertTag(R, tag, OpenLoc, CloseLoc, Attrs, Content, Newline, true, false); + } // High-level operations. diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp index f8c96cca39..79fff28854 100644 --- a/lib/Rewrite/HTMLRewrite.cpp +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -51,24 +51,39 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { } -static void TagOpen(std::ostringstream& os, const char* TagStr, - const char* Attr, const char* Content) { +static void TagOpen(Rewriter& R, const char* TagStr, + const char* Attr, const char* Content, + SourceLocation L, bool InsertBefore) { + std::ostringstream os; os << '<' << TagStr; if (Attr) os << ' ' << Attr; os << '>'; if (Content) os << Content; + + if (InsertBefore) + R.InsertTextBefore(L, os.str().c_str(), os.str().size()); + else + R.InsertTextAfter(L, os.str().c_str(), os.str().size()); } -static void TagClose(std::ostringstream& os, const char* TagStr) { +static void TagClose(Rewriter& R, const char* TagStr, SourceLocation L, + bool Newline, bool InsertBefore) { + + std::ostringstream os; os << ""; + if (Newline) os << '\n'; + + if (InsertBefore) + R.InsertTextBefore(L, os.str().c_str(), os.str().size()); + else + R.InsertTextAfter(L, os.str().c_str(), os.str().size()); } void html::InsertTag(Rewriter& R, html::Tags tag, SourceLocation B, SourceLocation E, - const char* Attributes, - const char* Content, bool Newline, - bool OpenInsertBefore, bool CloseInsertAfter) { + const char* Attr, const char* Content, bool Newline, + bool OpenInsertBefore, bool CloseInsertBefore) { const char* TagStr = 0; @@ -80,6 +95,7 @@ void html::InsertTag(Rewriter& R, html::Tags tag, case HTML: TagStr = "html"; break; case PRE: TagStr = "pre"; break; case SPAN: TagStr = "span"; break; + case STYLE: TagStr = "style"; break; } assert (TagStr && "Tag not supported."); @@ -87,32 +103,13 @@ void html::InsertTag(Rewriter& R, html::Tags tag, // Generate the opening tag. We also generate the closing // tag of the start and end SourceLocations are the same. - { - std::ostringstream os; - TagOpen(os, TagStr, Attributes, Content); - if (B == E) { - TagClose(os, TagStr); - if (Newline) os << '\n'; - } - - if (OpenInsertBefore) - R.InsertTextBefore(B, os.str().c_str(), os.str().size()); - else - R.InsertTextAfter(B, os.str().c_str(), os.str().size()); + if (OpenInsertBefore) { + TagClose(R, TagStr, E, Newline, CloseInsertBefore); + TagOpen(R, TagStr, Attr, Content, B, true); } - - // Generate the closing tag if the start and end SourceLocations - // are different. - - if (B != E) { - std::ostringstream os; - TagClose(os, TagStr); - if (Newline) os << '\n'; - - if (CloseInsertAfter) - R.InsertTextAfter(E, os.str().c_str(), os.str().size()); - else - R.InsertTextBefore(E, os.str().c_str(), os.str().size()); + else { + TagOpen(R, TagStr, Attr, Content, B, false); + TagClose(R, TagStr, E, Newline, true); } } @@ -128,8 +125,8 @@ static void AddLineNumber(Rewriter& R, unsigned LineNo, std::ostringstream os; os << LineNo; - html::InsertTag(R, html::SPAN, B, E, "class=Line"); - html::InsertTag(R, html::SPAN, B, B, "class=Num", os.str().c_str()); + html::InsertTag(R, html::SPAN, B, E, "style=lines"); + html::InsertTag(R, html::SPAN, B, B, "style=nums", os.str().c_str()); } void html::AddLineNumbers(Rewriter& R, unsigned FileID) { -- 2.40.0