]> granicus.if.org Git - clang/commitdiff
More cleanups to HTML rewriter API: remove the InsertTag method; was too complicated
authorTed Kremenek <kremenek@apple.com>
Wed, 19 Mar 2008 01:30:02 +0000 (01:30 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 19 Mar 2008 01:30:02 +0000 (01:30 +0000)
and clients can achieve a cleaner design just by inserting tags directly.  Reserve
the "html" namespace for meta-level operations (e.g., escaping text, etc.)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48524 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/HTMLPrint.cpp
include/clang/Rewrite/HTMLRewrite.h
lib/Rewrite/HTMLRewrite.cpp

index 6c8a1d1aadbe3ecd251d47151a3b73216529589d..acb011c2160f5d3247e94bd8f1068b6b19469a2d 100644 (file)
@@ -50,22 +50,32 @@ HTMLPrinter::~HTMLPrinter() {
   
   html::EscapeText(R, FileID);
   html::AddLineNumbers(R, FileID);
-  html::InsertOuterTag(R, html::PRE, StartLoc, EndLoc, 0, 0, true);
-  html::InsertOuterTag(R, html::BODY, StartLoc, EndLoc, NULL, "\n", true);
   
-  // Generate CSS.
+  // Generate header
+
+  {
+    std::ostringstream os;
   
-  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";
+    os << "<html>\n<head>\n"
+       << " <style type=\"text/css\">\n"
+       << "  .nums, .lines { vertical-align:top }\n"
+       << "  .nums { padding-right:.5em; width:2.5em }\n"
+       << " </style>\n"
+       << "</head>\n"
+       << "<body>\n<pre>";
 
+    R.InsertTextBefore(StartLoc, os.str().c_str(), os.str().size());
+  }
   
-  // Add <head> and <html> tags.
+  // Generate footer
   
-  html::InsertTagBefore(R, html::HEAD, StartLoc, StartLoc, 0,css.str().c_str());
-  html::InsertOuterTag(R, html::HTML, StartLoc, EndLoc, 0, "\n");
+  {
+    std::ostringstream os;
+    
+    os << "</pre>\n</body></html>\n";
+    R.InsertTextAfter(EndLoc, os.str().c_str(), os.str().size());
+  }
+    
   
   // Emit the HTML.
   
index dddde010685de41b440827a4c8cc5b0ecae2193c..01116026125eac28ef943c47eab088462b342012 100644 (file)
@@ -22,43 +22,8 @@ namespace clang {
 class Rewriter;
   
 namespace html {
-  
-  // Basic operations.
-  
-  enum Tags { BODY,
-              DIV,
-              HEAD,
-              HTML,
-              PRE,
-              SPAN,
-              STYLE };
-  
-  void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false);
 
-  void InsertTag(Rewriter& R, Tags tag,
-                 SourceLocation OpenLoc, SourceLocation CloseLoc,
-                 const char* Attrs = NULL, const char* Content = NULL,
-                 bool Newline = false,
-                 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.
+  void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false);
   
   void AddLineNumbers(Rewriter& R, unsigned FileID);  
 
index 79fff2885467fec2eeeb39a1397c193484033aa1..32d20dfa04ca7ad40d4a4e91e6bde6eab2e1a0a4 100644 (file)
 
 using namespace clang;
 
-//===----------------------------------------------------------------------===//
-// Basic operations.
-//===----------------------------------------------------------------------===//
-
 void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) {
   
   const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID);
@@ -50,83 +46,19 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) {
   }
 }
 
-
-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(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* Attr, const char* Content, bool Newline,
-                     bool OpenInsertBefore, bool CloseInsertBefore) {
-  
-  const char* TagStr = 0;
-  
-  switch (tag) {
-    default: break;      
-    case BODY: TagStr = "body"; break;
-    case DIV:  TagStr = "div";  break;
-    case HEAD: TagStr = "head"; break;
-    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.");
-
-  // Generate the opening tag.  We also generate the closing
-  // tag of the start and end SourceLocations are the same.
-
-  if (OpenInsertBefore) {    
-    TagClose(R, TagStr, E, Newline, CloseInsertBefore);
-    TagOpen(R, TagStr, Attr, Content, B, true);
-  }
-  else {
-    TagOpen(R, TagStr, Attr, Content, B, false);
-    TagClose(R, TagStr, E, Newline, true);
-  }
-}
-
-//===----------------------------------------------------------------------===//
-// High-level operations.
-//===----------------------------------------------------------------------===//
-
 static void AddLineNumber(Rewriter& R, unsigned LineNo,
                           SourceLocation B, SourceLocation E) {
+    
+  // Surround the line with a span tag.
+  
+  R.InsertTextBefore(E, "</span>", 7);
+  R.InsertTextBefore(B, "<span style=lines>", 18);
   
-  // Add two "div" tags: one to contain the line number, and the other
-  // to contain the content of the line.
+  // Insert a span tag for the line number.
 
   std::ostringstream os;
-  os << LineNo;
-  html::InsertTag(R, html::SPAN, B, E, "style=lines");  
-  html::InsertTag(R, html::SPAN, B, B, "style=nums", os.str().c_str());  
+  os << "<span style=nums>" << LineNo << "</span>";
+  R.InsertTextBefore(B, os.str().c_str(), os.str().size());
 }
 
 void html::AddLineNumbers(Rewriter& R, unsigned FileID) {