📄 html_blockimpl.cpp
字号:
/**
* This file is part of the DOM implementation for KDE.
*
* Copyright (C) 1999 Lars Knoll (knoll@kde.org)
* (C) 1999 Antti Koivisto (koivisto@kde.org)
* Copyright (C) 2003 Apple Computer, Inc.
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
// -------------------------------------------------------------------------
//#define DEBUG
#include "html_blockimpl.h"
#include "html_documentimpl.h"
#include "css/cssstyleselector.h"
#include "css/cssproperties.h"
#include "css/cssvalues.h"
#include "misc/htmlhashes.h"
#include <kdebug.h>
using namespace khtml;
using namespace DOM;
HTMLBlockquoteElementImpl::HTMLBlockquoteElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc)
{
}
HTMLBlockquoteElementImpl::~HTMLBlockquoteElementImpl()
{
}
NodeImpl::Id HTMLBlockquoteElementImpl::id() const
{
return ID_BLOCKQUOTE;
}
// -------------------------------------------------------------------------
HTMLDivElementImpl::HTMLDivElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc)
{
}
HTMLDivElementImpl::~HTMLDivElementImpl()
{
}
NodeImpl::Id HTMLDivElementImpl::id() const
{
return ID_DIV;
}
bool HTMLDivElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
if (attr == ATTR_ALIGN) {
result = eBlock;
return false;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLDivElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_ALIGN:
{
DOMString v = attr->value();
if ( strcasecmp( attr->value(), "middle" ) == 0 || strcasecmp( attr->value(), "center" ) == 0 )
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_CENTER);
else if (strcasecmp(attr->value(), "left") == 0)
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_LEFT);
else if (strcasecmp(attr->value(), "right") == 0)
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_RIGHT);
else
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, v);
break;
}
default:
HTMLElementImpl::parseHTMLAttribute(attr);
}
}
// -------------------------------------------------------------------------
HTMLHRElementImpl::HTMLHRElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc)
{
}
HTMLHRElementImpl::~HTMLHRElementImpl()
{
}
NodeImpl::Id HTMLHRElementImpl::id() const
{
return ID_HR;
}
bool HTMLHRElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
switch (attr) {
case ATTR_ALIGN:
case ATTR_WIDTH:
case ATTR_COLOR:
case ATTR_SIZE:
case ATTR_NOSHADE:
result = eHR;
return false;
default:
break;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLHRElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch( attr->id() )
{
case ATTR_ALIGN: {
if (strcasecmp(attr->value(), "left") == 0) {
addCSSProperty(attr, CSS_PROP_MARGIN_LEFT, "0");
addCSSProperty(attr, CSS_PROP_MARGIN_RIGHT, CSS_VAL_AUTO);
}
else if (strcasecmp(attr->value(), "right") == 0) {
addCSSProperty(attr, CSS_PROP_MARGIN_LEFT, CSS_VAL_AUTO);
addCSSProperty(attr, CSS_PROP_MARGIN_RIGHT, "0");
}
else {
addCSSProperty(attr, CSS_PROP_MARGIN_LEFT, CSS_VAL_AUTO);
addCSSProperty(attr, CSS_PROP_MARGIN_RIGHT, CSS_VAL_AUTO);
}
break;
}
case ATTR_WIDTH:
{
// cheap hack to cause linebreaks
// khtmltests/html/strange_hr.html
bool ok;
int v = attr->value().implementation()->toInt(&ok);
if(ok && !v)
addCSSLength(attr, CSS_PROP_WIDTH, "1");
else
addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
break;
}
case ATTR_COLOR:
addCSSProperty(attr, CSS_PROP_BORDER_TOP_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_RIGHT_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_BOTTOM_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_LEFT_STYLE, CSS_VAL_SOLID);
addHTMLColor(attr, CSS_PROP_BORDER_COLOR, attr->value());
addHTMLColor(attr, CSS_PROP_BACKGROUND_COLOR, attr->value());
break;
case ATTR_NOSHADE:
addCSSProperty(attr, CSS_PROP_BORDER_TOP_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_RIGHT_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_BOTTOM_STYLE, CSS_VAL_SOLID);
addCSSProperty(attr, CSS_PROP_BORDER_LEFT_STYLE, CSS_VAL_SOLID);
addHTMLColor(attr, CSS_PROP_BORDER_COLOR, DOMString("grey"));
addHTMLColor(attr, CSS_PROP_BACKGROUND_COLOR, DOMString("grey"));
break;
case ATTR_SIZE: {
DOMStringImpl* si = attr->value().implementation();
int size = si->toInt();
if (size <= 1)
addCSSProperty(attr, CSS_PROP_BORDER_BOTTOM_WIDTH, DOMString("0"));
else
addCSSLength(attr, CSS_PROP_HEIGHT, DOMString(QString::number(size-2)));
break;
}
default:
HTMLElementImpl::parseHTMLAttribute(attr);
}
}
// -------------------------------------------------------------------------
HTMLHeadingElementImpl::HTMLHeadingElementImpl(DocumentPtr *doc, ushort _tagid)
: HTMLGenericElementImpl(doc, _tagid)
{
}
// -------------------------------------------------------------------------
HTMLParagraphElementImpl::HTMLParagraphElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc)
{
}
NodeImpl::Id HTMLParagraphElementImpl::id() const
{
return ID_P;
}
bool HTMLParagraphElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
if (attr == ATTR_ALIGN) {
result = eBlock; // We can share with DIV here.
return false;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLParagraphElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_ALIGN:
{
DOMString v = attr->value();
if ( strcasecmp( attr->value(), "middle" ) == 0 || strcasecmp( attr->value(), "center" ) == 0 )
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_CENTER);
else if (strcasecmp(attr->value(), "left") == 0)
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_LEFT);
else if (strcasecmp(attr->value(), "right") == 0)
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, CSS_VAL__KHTML_RIGHT);
else
addCSSProperty(attr, CSS_PROP_TEXT_ALIGN, v);
break;
}
default:
HTMLElementImpl::parseHTMLAttribute(attr);
}
}
// -------------------------------------------------------------------------
HTMLPreElementImpl::HTMLPreElementImpl(DocumentPtr *doc, unsigned short _tagid)
: HTMLGenericElementImpl(doc, _tagid)
{
}
long HTMLPreElementImpl::width() const
{
// ###
return 0;
}
void HTMLPreElementImpl::setWidth( long /*w*/ )
{
// ###
}
// -------------------------------------------------------------------------
// WinIE uses 60ms as the minimum delay by default.
const int defaultMinimumDelay = 60;
HTMLMarqueeElementImpl::HTMLMarqueeElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc),
m_minimumDelay(defaultMinimumDelay)
{
}
NodeImpl::Id HTMLMarqueeElementImpl::id() const
{
return ID_MARQUEE;
}
bool HTMLMarqueeElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
switch (attr) {
case ATTR_WIDTH:
case ATTR_HEIGHT:
case ATTR_BGCOLOR:
case ATTR_VSPACE:
case ATTR_HSPACE:
case ATTR_SCROLLAMOUNT:
case ATTR_SCROLLDELAY:
case ATTR_LOOP:
case ATTR_BEHAVIOR:
case ATTR_DIRECTION:
result = eUniversal;
return false;
default:
break;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLMarqueeElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_WIDTH:
if (!attr->value().isEmpty())
addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
break;
case ATTR_HEIGHT:
if (!attr->value().isEmpty())
addCSSLength(attr, CSS_PROP_HEIGHT, attr->value());
break;
case ATTR_BGCOLOR:
if (!attr->value().isEmpty())
addHTMLColor(attr, CSS_PROP_BACKGROUND_COLOR, attr->value());
break;
case ATTR_VSPACE:
if (!attr->value().isEmpty()) {
addCSSLength(attr, CSS_PROP_MARGIN_TOP, attr->value());
addCSSLength(attr, CSS_PROP_MARGIN_BOTTOM, attr->value());
}
break;
case ATTR_HSPACE:
if (!attr->value().isEmpty()) {
addCSSLength(attr, CSS_PROP_MARGIN_LEFT, attr->value());
addCSSLength(attr, CSS_PROP_MARGIN_RIGHT, attr->value());
}
break;
case ATTR_SCROLLAMOUNT:
if (!attr->value().isEmpty())
addCSSLength(attr, CSS_PROP__KHTML_MARQUEE_INCREMENT, attr->value());
break;
case ATTR_SCROLLDELAY:
if (!attr->value().isEmpty())
addCSSLength(attr, CSS_PROP__KHTML_MARQUEE_SPEED, attr->value());
break;
case ATTR_LOOP:
if (!attr->value().isEmpty()) {
if (attr->value() == "-1" || strcasecmp(attr->value(), "infinite") == 0)
addCSSProperty(attr, CSS_PROP__KHTML_MARQUEE_REPETITION, CSS_VAL_INFINITE);
else
addCSSLength(attr, CSS_PROP__KHTML_MARQUEE_REPETITION, attr->value());
}
break;
case ATTR_BEHAVIOR:
if (!attr->value().isEmpty())
addCSSProperty(attr, CSS_PROP__KHTML_MARQUEE_STYLE, attr->value());
break;
case ATTR_DIRECTION:
if (!attr->value().isEmpty())
addCSSProperty(attr, CSS_PROP__KHTML_MARQUEE_DIRECTION, attr->value());
break;
case ATTR_TRUESPEED:
m_minimumDelay = !attr->isNull() ? 0 : defaultMinimumDelay;
break;
default:
HTMLElementImpl::parseHTMLAttribute(attr);
}
}
// ------------------------------------------------------------------------
HTMLLayerElementImpl::HTMLLayerElementImpl(DocumentPtr *doc)
: HTMLDivElementImpl( doc )
{
}
HTMLLayerElementImpl::~HTMLLayerElementImpl()
{
}
NodeImpl::Id HTMLLayerElementImpl::id() const
{
return ID_LAYER;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -