//== HTMLRewrite.cpp - Translate source code into prettified HTML --*- C++ -*-// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the HTMLRewriter clas, which is used to translate the // text of a source file into prettified HTML. // //===----------------------------------------------------------------------===// #include "clang/Rewrite/Rewriter.h" #include "clang/Rewrite/HTMLRewrite.h" #include "clang/Basic/SourceManager.h" #include "llvm/Support/MemoryBuffer.h" #include using namespace clang; void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID); const char* C = Buf->getBufferStart(); const char* FileEnd = Buf->getBufferEnd(); assert (C <= FileEnd); for (unsigned FilePos = 0; C != FileEnd ; ++C, ++FilePos) { SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); switch (*C) { default: break; case ' ': if (EscapeSpaces) R.ReplaceText(Loc, 1, " ", 5); break; case '<': R.ReplaceText(Loc, 1, "<", 4); break; case '>': R.ReplaceText(Loc, 1, ">", 4); break; case '&': R.ReplaceText(Loc, 1, "&", 5); break; } } } void html::InsertTag(Rewriter& R, html::Tags tag, SourceLocation B, SourceLocation E, bool NewlineOpen, bool NewlineClose, bool OutermostTag) { const char* TagStr = 0; switch (tag) { default: break; case PRE: TagStr = "pre"; break; case HEAD: TagStr = "head"; break; case BODY: TagStr = "body"; break; } assert (TagStr && "Tag not supported."); { // Generate the opening tag. std::ostringstream os; os << '<' << TagStr << '>'; if (NewlineOpen) os << '\n'; const char* s = os.str().c_str(); unsigned n = os.str().size(); if (OutermostTag) R.InsertTextBefore(B, s, n); else R.InsertTextAfter(B, s, n); } { // Generate the closing tag. std::ostringstream os; os << "'; if (NewlineClose) os << '\n'; const char* s = os.str().c_str(); unsigned n = os.str().size(); if (OutermostTag) R.InsertTextAfter(E, s, n); else R.InsertTextBefore(E, s, n); } }