/// HighlightRange - This is the same as the above method, but takes /// decomposed file locations. void html::HighlightRange(RewriteBuffer &RB, unsigned B, unsigned E, const char *BufferStart, const char *StartTag, const char *EndTag) { // Insert the tag at the absolute start/end of the range. RB.InsertTextAfter(B, StartTag); RB.InsertTextBefore(E, EndTag); // Scan the range to see if there is a \r or \n. If so, and if the line is // not blank, insert tags on that line as well. bool HadOpenTag = true; unsigned LastNonWhiteSpace = B; for (unsigned i = B; i != E; ++i) { switch (BufferStart[i]) { case '\r': case '\n': // Okay, we found a newline in the range. If we have an open tag, we need // to insert a close tag at the first non-whitespace before the newline. if (HadOpenTag) RB.InsertTextBefore(LastNonWhiteSpace+1, EndTag); // Instead of inserting an open tag immediately after the newline, we // wait until we see a non-whitespace character. This prevents us from // inserting tags around blank lines, and also allows the open tag to // be put *after* whitespace on a non-blank line. HadOpenTag = false; break; case '\0': case ' ': case '\t': case '\f': case '\v': // Ignore whitespace. break; default: // If there is no tag open, do it now. if (!HadOpenTag) { RB.InsertTextAfter(i, StartTag); HadOpenTag = true; } // Remember this character. LastNonWhiteSpace = i; break; } } }
static void AddLineNumber(RewriteBuffer &RB, unsigned LineNo, unsigned B, unsigned E) { SmallString<256> Str; llvm::raw_svector_ostream OS(Str); OS << "<tr><td class=\"num\" id=\"LN" << LineNo << "\">" << LineNo << "</td><td class=\"line\">"; if (B == E) { // Handle empty lines. OS << " </td></tr>"; RB.InsertTextBefore(B, OS.str()); } else { RB.InsertTextBefore(B, OS.str()); RB.InsertTextBefore(E, "</td></tr>"); } }
static void AddLineNumber(RewriteBuffer &RB, unsigned LineNo, unsigned B, unsigned E) { llvm::SmallString<100> Str; Str += "<tr><td class=\"num\" id=\"LN"; Str.append_uint(LineNo); Str += "\">"; Str.append_uint(LineNo); Str += "</td><td class=\"line\">"; if (B == E) { // Handle empty lines. Str += " </td></tr>"; RB.InsertTextBefore(B, &Str[0], Str.size()); } else { RB.InsertTextBefore(B, &Str[0], Str.size()); RB.InsertTextBefore(E, "</td></tr>", strlen("</td></tr>")); } }