forked from OSchip/llvm-project
More HTML rewriter cleanups. Preliminary CSS support in code pretty-printing.
llvm-svn: 48518
This commit is contained in:
parent
2f6ab65d77
commit
8800ae68a0
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue