diff options
Diffstat (limited to 'WebCore/html/HTMLViewSourceDocument.cpp')
-rw-r--r-- | WebCore/html/HTMLViewSourceDocument.cpp | 294 |
1 files changed, 0 insertions, 294 deletions
diff --git a/WebCore/html/HTMLViewSourceDocument.cpp b/WebCore/html/HTMLViewSourceDocument.cpp deleted file mode 100644 index 7b141d1..0000000 --- a/WebCore/html/HTMLViewSourceDocument.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "HTMLViewSourceDocument.h" - -#include "DOMImplementation.h" -#include "HTMLTokenizer.h" -#include "HTMLHtmlElement.h" -#include "HTMLAnchorElement.h" -#include "HTMLBodyElement.h" -#include "HTMLDivElement.h" -#include "HTMLTableElement.h" -#include "HTMLTableCellElement.h" -#include "HTMLTableRowElement.h" -#include "HTMLTableSectionElement.h" -#include "Text.h" -#include "TextDocument.h" -#include "HTMLNames.h" - -namespace WebCore { - -using namespace HTMLNames; - -HTMLViewSourceDocument::HTMLViewSourceDocument(Frame* frame, const String& mimeType) - : HTMLDocument(frame) - , m_type(mimeType) - , m_current(0) - , m_tbody(0) - , m_td(0) -{ -} - -Tokenizer* HTMLViewSourceDocument::createTokenizer() -{ - if (implementation()->isTextMIMEType(m_type)) - return createTextTokenizer(this); - return new HTMLTokenizer(this); -} - -void HTMLViewSourceDocument::createContainingTable() -{ - RefPtr<Element> html = new HTMLHtmlElement(this); - addChild(html); - html->attach(); - RefPtr<Element> body = new HTMLBodyElement(this); - html->addChild(body); - body->attach(); - - // Create a line gutter div that can be used to make sure the gutter extends down the height of the whole - // document. - RefPtr<Element> div = new HTMLDivElement(this); - RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create(); - attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-gutter-backdrop"), true); - div->setAttributeMap(attrs.release()); - body->addChild(div); - div->attach(); - - RefPtr<Element> table = new HTMLTableElement(this); - body->addChild(table); - table->attach(); - m_tbody = new HTMLTableSectionElement(tbodyTag, this); - table->addChild(m_tbody); - m_tbody->attach(); - m_current = m_tbody; -} - -void HTMLViewSourceDocument::addViewSourceText(const String& text) -{ - if (!m_current) - createContainingTable(); - addText(text, ""); -} - -void HTMLViewSourceDocument::addViewSourceToken(Token* token) -{ - if (!m_current) - createContainingTable(); - - if (token->tagName == textAtom) - addText(token->text.get(), ""); - else if (token->tagName == commentAtom) { - if (token->beginTag) { - m_current = addSpanWithClassName("webkit-html-comment"); - addText(String("<!--") + token->text.get() + "-->", "webkit-html-comment"); - } - } else { - // Handle the tag. - String classNameStr = "webkit-html-tag"; - m_current = addSpanWithClassName(classNameStr); - - String text = "<"; - if (!token->beginTag) - text += "/"; - text += token->tagName; - Vector<UChar>* guide = token->m_sourceInfo.get(); - if (!guide || !guide->size()) - text += ">"; - - addText(text, classNameStr); - - // Walk our guide string that tells us where attribute names/values should go. - if (guide && guide->size()) { - unsigned size = guide->size(); - unsigned begin = 0; - unsigned currAttr = 0; - RefPtr<Attribute> attr = 0; - for (unsigned i = 0; i < size; i++) { - if (guide->at(i) == 'a' || guide->at(i) == 'x' || guide->at(i) == 'v') { - // Add in the string. - addText(String(static_cast<UChar*>(guide->data()) + begin, i - begin), classNameStr); - - begin = i + 1; - - if (guide->at(i) == 'a') { - if (token->attrs && currAttr < token->attrs->length()) - attr = token->attrs->attributeItem(currAttr++); - else - attr = 0; - } - if (attr) { - if (guide->at(i) == 'a') { - String name = attr->name().toString(); - - m_current = addSpanWithClassName("webkit-html-attribute-name"); - addText(name, "webkit-html-attribute-name"); - if (m_current != m_tbody) - m_current = static_cast<Element*>(m_current->parent()); - } else { - const String& value = attr->value().string(); - // FIXME: XML could use namespace prefixes and confuse us. - if (equalIgnoringCase(attr->name().localName(), "src") || equalIgnoringCase(attr->name().localName(), "href")) - m_current = addLink(value, equalIgnoringCase(token->tagName, "a")); - else - m_current = addSpanWithClassName("webkit-html-attribute-value"); - addText(value, "webkit-html-attribute-value"); - if (m_current != m_tbody) - m_current = static_cast<Element*>(m_current->parent()); - } - } - } - } - - // Add in any string that might be left. - if (begin < size) - addText(String(static_cast<UChar*>(guide->data()) + begin, size - begin), classNameStr); - - // Add in the end tag. - addText(">", classNameStr); - } - - m_current = m_td; - } -} - -void HTMLViewSourceDocument::addViewSourceDoctypeToken(DoctypeToken* doctypeToken) -{ - if (!m_current) - createContainingTable(); - m_current = addSpanWithClassName("webkit-html-doctype"); - String text = "<"; - text += String::adopt(doctypeToken->m_source); - text += ">"; - addText(text, "webkit-html-doctype"); -} - -Element* HTMLViewSourceDocument::addSpanWithClassName(const String& className) -{ - if (m_current == m_tbody) { - addLine(className); - return m_current; - } - - Element* span = new HTMLElement(spanTag, this); - RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create(); - attrs->insertAttribute(MappedAttribute::create(classAttr, className), true); - span->setAttributeMap(attrs.release()); - m_current->addChild(span); - span->attach(); - return span; -} - -void HTMLViewSourceDocument::addLine(const String& className) -{ - // Create a table row. - RefPtr<Element> trow = new HTMLTableRowElement(this); - m_tbody->addChild(trow); - trow->attach(); - - // Create a cell that will hold the line number (it is generated in the stylesheet using counters). - Element* td = new HTMLTableCellElement(tdTag, this); - RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create(); - attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-number"), true); - td->setAttributeMap(attrs.release()); - trow->addChild(td); - td->attach(); - - // Create a second cell for the line contents - td = new HTMLTableCellElement(tdTag, this); - attrs = NamedMappedAttrMap::create(); - attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-content"), true); - td->setAttributeMap(attrs.release()); - trow->addChild(td); - td->attach(); - m_current = m_td = td; - -#ifdef DEBUG_LINE_NUMBERS - RefPtr<Text> lineNumberText = new Text(this, String::number(tokenizer()->lineNumber() + 1) + " "); - td->addChild(lineNumberText); - lineNumberText->attach(); -#endif - - // Open up the needed spans. - if (!className.isEmpty()) { - if (className == "webkit-html-attribute-name" || className == "webkit-html-attribute-value") - m_current = addSpanWithClassName("webkit-html-tag"); - m_current = addSpanWithClassName(className); - } -} - -void HTMLViewSourceDocument::addText(const String& text, const String& className) -{ - if (text.isEmpty()) - return; - - // Add in the content, splitting on newlines. - Vector<String> lines; - text.split('\n', true, lines); - unsigned size = lines.size(); - for (unsigned i = 0; i < size; i++) { - String substring = lines[i]; - if (substring.isEmpty()) { - if (i == size - 1) - break; - substring = " "; - } - if (m_current == m_tbody) - addLine(className); - RefPtr<Text> t = new Text(this, substring); - m_current->addChild(t); - t->attach(); - if (i < size - 1) - m_current = m_tbody; - } - - // Set current to m_tbody if the last character was a newline. - if (text[text.length() - 1] == '\n') - m_current = m_tbody; -} - -Element* HTMLViewSourceDocument::addLink(const String& url, bool isAnchor) -{ - if (m_current == m_tbody) - addLine("webkit-html-tag"); - - // Now create a link for the attribute value instead of a span. - Element* anchor = new HTMLAnchorElement(aTag, this); - RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create(); - const char* classValue; - if (isAnchor) - classValue = "webkit-html-attribute-value webkit-html-external-link"; - else - classValue = "webkit-html-attribute-value webkit-html-resource-link"; - attrs->insertAttribute(MappedAttribute::create(classAttr, classValue), true); - attrs->insertAttribute(MappedAttribute::create(targetAttr, "_blank"), true); - attrs->insertAttribute(MappedAttribute::create(hrefAttr, url), true); - anchor->setAttributeMap(attrs.release()); - m_current->addChild(anchor); - anchor->attach(); - return anchor; -} - -} |