/** * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) * * Copyright (C) 1999 Lars Knoll (knoll@kde.org) * (C) 1999 Antti Koivisto (koivisto@kde.org) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include "config.h" #if ENABLE(WML) #include "WMLPElement.h" #include "CSSPropertyNames.h" #include "CSSValueKeywords.h" #include "Document.h" #include "HTMLNames.h" #include "MappedAttribute.h" #include "NodeList.h" #include "WMLNames.h" namespace WebCore { using namespace WMLNames; WMLPElement::WMLPElement(const QualifiedName& tagName, Document* doc) : WMLElement(tagName, doc) { } bool WMLPElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const { if (attrName == HTMLNames::alignAttr) { result = eBlock; // We can share with DIV here. return false; } return WMLElement::mapToEntry(attrName, result); } void WMLPElement::parseMappedAttribute(MappedAttribute* attr) { if (attr->name() == HTMLNames::alignAttr) { const AtomicString& value = attr->value(); if (equalIgnoringCase(value, "middle") || equalIgnoringCase(value, "center")) addCSSProperty(attr, CSSPropertyTextAlign, CSSValueWebkitCenter); else if (equalIgnoringCase(value, "left")) addCSSProperty(attr, CSSPropertyTextAlign, CSSValueWebkitLeft); else if (equalIgnoringCase(value, "right")) addCSSProperty(attr, CSSPropertyTextAlign, CSSValueWebkitRight); else addCSSProperty(attr, CSSPropertyTextAlign, value); } else if (attr->name() == modeAttr) { m_mode = attr->value(); if (m_mode == "wrap") addCSSProperty(attr, CSSPropertyWordWrap, CSSValueBreakWord); else if (m_mode == "nowrap") addCSSProperty(attr, CSSPropertyWhiteSpace, CSSValueNowrap); } else WMLElement::parseMappedAttribute(attr); } void WMLPElement::insertedIntoDocument() { WMLElement::insertedIntoDocument(); // If not explicitly specified, the linewrap mode is identical to // the line-wrap mode of the previous paragraph in the text flow of // a card. The default mode for the first paragraph in a card is wrap. if (!m_mode.isEmpty()) return; RefPtr nodeList = document()->getElementsByTagName("p"); if (!nodeList) return; unsigned length = nodeList->length(); if (length < 2) return; // Assure we're the last inserted paragraph element // This only works while parsing, otherwhise this statement is never true. if (nodeList->item(length - 1) != this) return; WMLPElement* lastParagraph = static_cast(nodeList->item(length - 2)); ASSERT(lastParagraph); String lastMode = lastParagraph->getAttribute(modeAttr); if (lastMode.isEmpty() || lastMode == "wrap") // Default value, do nothing. return; setAttribute(modeAttr, lastMode); } } #endif