diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-03-18 21:19:49 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-03-18 21:19:49 +0000 |
commit | 6a34083e9f74a45e2f79c9fab66f177809a5db66 (patch) | |
tree | f97793bee9cb46a4fc27d293873070ce7c937879 /lib/Rewrite/HTMLRewrite.cpp | |
parent | 886c8db545170850f7806f47b5f6120864effd09 (diff) |
Added the beginning of a set of rewriter functions for pretty-printing source
code as HTML. Added a new driver option "--emit-html" to dump the source
of the main input file as HTML.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48505 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Rewrite/HTMLRewrite.cpp')
-rw-r--r-- | lib/Rewrite/HTMLRewrite.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp new file mode 100644 index 0000000000..3beede8697 --- /dev/null +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -0,0 +1,77 @@ +//== 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 <sstream> + +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) { + + 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'; + R.InsertTextAfter(B, os.str().c_str(), os.str().size()); + } + + { // Generate the closing tag. + std::ostringstream os; + os << "</" << TagStr << '>'; + if (NewlineClose) os << '\n'; + R.InsertTextBefore(E, os.str().c_str(), os.str().size()); + } +} |