⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 html_miscimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/** * 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. * */// -------------------------------------------------------------------------#include "html/html_miscimpl.h"#include "html/html_formimpl.h"#include "misc/htmlhashes.h"#include "dom/dom_node.h"using namespace DOM;#include <kdebug.h>HTMLBaseFontElementImpl::HTMLBaseFontElementImpl(DocumentPtr *doc)    : HTMLElementImpl(doc){}HTMLBaseFontElementImpl::~HTMLBaseFontElementImpl(){}NodeImpl::Id HTMLBaseFontElementImpl::id() const{    return ID_BASEFONT;}// -------------------------------------------------------------------------HTMLCollectionImpl::HTMLCollectionImpl(NodeImpl *_base, int _type){    base = _base;    base->ref();    type = _type;    currentItem = 0L;    idsDone = false;}HTMLCollectionImpl::~HTMLCollectionImpl(){    base->deref();}unsigned long HTMLCollectionImpl::calcLength(NodeImpl *current) const{    unsigned long len = 0;    while(current)    {        if(current->nodeType() == Node::ELEMENT_NODE)        {            bool deep = true;            HTMLElementImpl *e = static_cast<HTMLElementImpl *>(current);            switch(type)            {            case DOC_IMAGES:                if(e->id() == ID_IMG)                    len++;                break;            case DOC_FORMS:                if(e->id() == ID_FORM)                    len++;                break;            case TABLE_TBODIES:                if(e->id() == ID_TBODY)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case TR_CELLS:                if(e->id() == ID_TD || e->id() == ID_TH)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case TABLE_ROWS:            case TSECTION_ROWS:                if(e->id() == ID_TR)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case SELECT_OPTIONS:                if(e->id() == ID_OPTION)                    len++;                break;            case MAP_AREAS:                if(e->id() == ID_AREA)                    len++;                break;            case DOC_APPLETS:   // all OBJECT and APPLET elements                if(e->id() == ID_OBJECT || e->id() == ID_APPLET)                    len++;                break;            case DOC_EMBEDS:   // all EMBED elements                if(e->id() == ID_EMBED)                    len++;                break;            case DOC_LINKS:     // all A _and_ AREA elements with a value for href                if(e->id() == ID_A || e->id() == ID_AREA)                    if(!e->getAttribute(ATTR_HREF).isNull())                        len++;                break;            case DOC_ANCHORS:      // all A elements with a value for name and all elements with an id attribute                if(e->id() == ID_A) {                    if(!e->getAttribute(ATTR_NAME).isNull())                        len++;                }                break;            case DOC_ALL:      // "all" elements                len++;                break;            case NODE_CHILDREN: // first-level children                len++;                deep = false;                break;            default:                kdDebug( 6030 ) << "Error in HTMLCollection, wrong tagId!" << endl;            }            if(deep && current->firstChild())                len += calcLength(current->firstChild());        }        current = current->nextSibling();    }    return len;}// since the collections are to be "live", we have to do the// calculation every time...unsigned long HTMLCollectionImpl::length() const{    return calcLength(base->firstChild());}NodeImpl *HTMLCollectionImpl::getItem(NodeImpl *current, int index, int &len) const{    while(current)    {        if(current->nodeType() == Node::ELEMENT_NODE)        {            bool deep = true;            HTMLElementImpl *e = static_cast<HTMLElementImpl *>(current);            switch(type)            {            case DOC_IMAGES:                if(e->id() == ID_IMG)                    len++;                break;            case DOC_FORMS:                if(e->id() == ID_FORM)                    len++;                break;            case TABLE_TBODIES:                if(e->id() == ID_TBODY)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case TR_CELLS:                if(e->id() == ID_TD || e->id() == ID_TH)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case TABLE_ROWS:            case TSECTION_ROWS:                if(e->id() == ID_TR)                    len++;                else if(e->id() == ID_TABLE)                    deep = false;                break;            case SELECT_OPTIONS:                if(e->id() == ID_OPTION)                    len++;                break;            case MAP_AREAS:                if(e->id() == ID_AREA)                    len++;                break;            case DOC_APPLETS:   // all OBJECT and APPLET elements                if(e->id() == ID_OBJECT || e->id() == ID_APPLET)                    len++;                break;            case DOC_EMBEDS:   // all EMBED elements                if(e->id() == ID_EMBED)                    len++;                break;            case DOC_LINKS:     // all A _and_ AREA elements with a value for href                if(e->id() == ID_A || e->id() == ID_AREA)                    if(!e->getAttribute(ATTR_HREF).isNull())                        len++;                break;            case DOC_ANCHORS:      // all A elements with a value for name or an id attribute                if(e->id() == ID_A)                    if(!e->getAttribute(ATTR_NAME).isNull())                        len++;                break;            case DOC_ALL:                len++;                break;            case NODE_CHILDREN:                len++;                deep = false;                break;            default:                kdDebug( 6030 ) << "Error in HTMLCollection, wrong tagId!" << endl;            }            if(len == (index + 1)) return current;            NodeImpl *retval=0;            if(deep && current->firstChild())                retval = getItem(current->firstChild(), index, len);            if(retval) return retval;        }        current = current->nextSibling();    }    return 0;}NodeImpl *HTMLCollectionImpl::item( unsigned long index ) const{    int pos = 0;    return getItem(base->firstChild(), index, pos);}NodeImpl *HTMLCollectionImpl::firstItem() const{    int pos = 0;    currentItem = getItem(base->firstChild(), 0, pos);    return currentItem;}NodeImpl *HTMLCollectionImpl::nextItem() const{    int pos = 0;    // Look for the 'second' item. The first one is currentItem, already given back.    NodeImpl *retval = getItem(currentItem, 1, pos);    if (retval)    {        currentItem = retval;        return retval;    }    // retval was 0, means we have to go up    while( !retval && currentItem && currentItem->parentNode()           && currentItem->parentNode() != base )    {        currentItem = currentItem->parentNode();        if (currentItem->nextSibling())        {            // ... and to take the first one from there            pos = 0;            retval = getItem(currentItem->nextSibling(), 0, pos);        }    }    currentItem = retval;    return currentItem;}NodeImpl *HTMLCollectionImpl::getNamedItem( NodeImpl *current, int attr_id,                                            const DOMString &name, bool caseSensitive ) const{    if(name.isEmpty())        return 0;    while(current)    {        if(current->nodeType() == Node::ELEMENT_NODE)        {            bool deep = true;            bool check = false;            HTMLElementImpl *e = static_cast<HTMLElementImpl *>(current);            switch(type)            {            case DOC_IMAGES:                if(e->id() == ID_IMG)                    check = true;                break;            case DOC_FORMS:                if(e->id() == ID_FORM)                    check = true;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -