More HTML rewriter cleanups. Preliminary CSS support in code pretty-printing.

llvm-svn: 48518
This commit is contained in:
Ted Kremenek 2008-03-18 23:55:46 +00:00
parent 2f6ab65d77
commit 8800ae68a0
3 changed files with 68 additions and 40 deletions

View File

@ -18,6 +18,7 @@
#include "clang/Basic/SourceManager.h"
#include "llvm/Support/MemoryBuffer.h"
#include "clang/AST/ASTContext.h"
#include <sstream>
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 <style type=\"text/css\">\n";
css << " .nums, .lines { vertical-align:top }\n";
css << " .nums { padding-right:.5em; width:2.5em }\n";
css << " </style>\n";
// Add <head> and <html> 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.

View File

@ -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.

View File

@ -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 << "</" << TagStr << ">";
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) {