📄 dom_textimpl.cpp
字号:
}
CommentImpl::CommentImpl(DocumentPtr *doc)
: CharacterDataImpl(doc)
{
}
CommentImpl::~CommentImpl()
{
}
DOMString CommentImpl::nodeName() const
{
return "#comment";
}
unsigned short CommentImpl::nodeType() const
{
return Node::COMMENT_NODE;
}
NodeImpl *CommentImpl::cloneNode(bool /*deep*/)
{
return getDocument()->createComment( str );
}
NodeImpl::Id CommentImpl::id() const
{
return ID_COMMENT;
}
// DOM Section 1.1.1
bool CommentImpl::childTypeAllowed( unsigned short /*type*/ )
{
return false;
}
DOMString CommentImpl::toString() const
{
// FIXME: substitute entity references as needed!
return DOMString("<!--") + nodeValue() + "-->";
}
// ---------------------------------------------------------------------------
// ### allow having children in text nodes for entities, comments etc.
TextImpl::TextImpl(DocumentPtr *doc, const DOMString &_text)
: CharacterDataImpl(doc, _text)
{
}
TextImpl::TextImpl(DocumentPtr *doc)
: CharacterDataImpl(doc)
{
}
TextImpl::~TextImpl()
{
}
TextImpl *TextImpl::splitText( const unsigned long offset, int &exceptioncode )
{
exceptioncode = 0;
// INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than
// the number of 16-bit units in data.
// ### we explicitly check for a negative long that has been cast to an unsigned long
// ... this can happen if JS code passes in -1 - we need to catch this earlier! (in the
// kjs bindings)
if (offset > str->l || (long)offset < 0) {
exceptioncode = DOMException::INDEX_SIZE_ERR;
return 0;
}
// NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
if (isReadOnly()) {
exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
return 0;
}
DOMStringImpl *oldStr = str;
TextImpl *newText = createNew(str->substring(offset,str->l-offset));
str = str->copy();
str->ref();
str->remove(offset,str->l-offset);
dispatchModifiedEvent(oldStr);
oldStr->deref();
if (parentNode())
parentNode()->insertBefore(newText,nextSibling(), exceptioncode );
if ( exceptioncode )
return 0;
if (m_render)
(static_cast<RenderText*>(m_render))->setText(str);
return newText;
}
DOMString TextImpl::nodeName() const
{
return "#text";
}
unsigned short TextImpl::nodeType() const
{
return Node::TEXT_NODE;
}
NodeImpl *TextImpl::cloneNode(bool /*deep*/)
{
return getDocument()->createTextNode(str);
}
bool TextImpl::rendererIsNeeded(RenderStyle *style)
{
if (!CharacterDataImpl::rendererIsNeeded(style))
return false;
bool onlyWS = containsOnlyWhitespace();
if (!onlyWS)
return true;
RenderObject *par = parentNode()->renderer();
if (par->isTable() || par->isTableRow() || par->isTableSection() || par->isTableCol())
return false;
if (style->whiteSpace() == PRE)
return true;
RenderObject *prev = previousRenderer();
if (prev && prev->isBR()) // <span><br/> <br/></span>
return false;
if (par->isInline()) {
// <span><div/> <div/></span>
if (prev && prev->isRenderBlock())
return false;
} else {
if (par->isRenderBlock() && !par->childrenInline() && (!prev || !prev->isInline()))
return false;
RenderObject *first = par->firstChild();
while (first && first->isFloatingOrPositioned())
first = first->nextSibling();
RenderObject *next = nextRenderer();
if (!first || next == first)
// Whitespace at the start of a block just goes away. Don't even
// make a render object for this text.
return false;
}
return true;
}
RenderObject *TextImpl::createRenderer(RenderArena *arena, RenderStyle *style)
{
return new (arena) RenderText(this, str);
}
void TextImpl::attach()
{
createRendererIfNeeded();
CharacterDataImpl::attach();
}
NodeImpl::Id TextImpl::id() const
{
return ID_TEXT;
}
void TextImpl::recalcStyle( StyleChange change )
{
// qDebug("textImpl::recalcStyle");
if (change != NoChange && parentNode()) {
// qDebug("DomText::recalcStyle");
if(m_render)
m_render->setStyle(parentNode()->renderer()->style());
}
if ( changed() && m_render && m_render->isText() )
static_cast<RenderText*>(m_render)->setText(str);
setChanged( false );
}
// DOM Section 1.1.1
bool TextImpl::childTypeAllowed( unsigned short /*type*/ )
{
return false;
}
TextImpl *TextImpl::createNew(DOMStringImpl *_str)
{
return new TextImpl(docPtr(),_str);
}
DOMString TextImpl::toString() const
{
// FIXME: substitute entity references as needed!
return nodeValue();
}
#ifndef NDEBUG
void TextImpl::formatForDebugger(char *buffer, unsigned length) const
{
DOMString result;
DOMString s;
s = nodeName();
if (s.length() > 0) {
result += s;
}
s = nodeValue();
if (s.length() > 0) {
if (result.length() > 0)
result += "; ";
result += "value=";
result += s;
}
strncpy(buffer, result.string().latin1(), length - 1);
}
#endif
// ---------------------------------------------------------------------------
CDATASectionImpl::CDATASectionImpl(DocumentPtr *impl, const DOMString &_text) : TextImpl(impl,_text)
{
}
CDATASectionImpl::CDATASectionImpl(DocumentPtr *impl) : TextImpl(impl)
{
}
CDATASectionImpl::~CDATASectionImpl()
{
}
DOMString CDATASectionImpl::nodeName() const
{
return "#cdata-section";
}
unsigned short CDATASectionImpl::nodeType() const
{
return Node::CDATA_SECTION_NODE;
}
NodeImpl *CDATASectionImpl::cloneNode(bool /*deep*/)
{
return getDocument()->createCDATASection(str);
}
// DOM Section 1.1.1
bool CDATASectionImpl::childTypeAllowed( unsigned short /*type*/ )
{
return false;
}
TextImpl *CDATASectionImpl::createNew(DOMStringImpl *_str)
{
return new CDATASectionImpl(docPtr(),_str);
}
DOMString CDATASectionImpl::toString() const
{
// FIXME: substitute entity references as needed!
return DOMString("<![CDATA[") + nodeValue() + "]]>";
}
// ---------------------------------------------------------------------------
EditingTextImpl::EditingTextImpl(DocumentPtr *impl, const DOMString &text)
: TextImpl(impl, text)
{
}
EditingTextImpl::EditingTextImpl(DocumentPtr *impl)
: TextImpl(impl)
{
}
EditingTextImpl::~EditingTextImpl()
{
}
bool EditingTextImpl::rendererIsNeeded(RenderStyle *style)
{
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -