org.jsoup.nodes.LeafNode Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jsoup Show documentation
Show all versions of jsoup Show documentation
jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jquery-like methods. jsoup implements the WHATWG HTML5 specification, and parses HTML to the same DOM as modern browsers do.
package org.jsoup.nodes;
import org.jsoup.helper.Validate;
import java.util.Collections;
import java.util.List;
abstract class LeafNode extends Node {
Object value; // either a string value, or an attribute map (in the rare case multiple attributes are set)
protected final boolean hasAttributes() {
return value instanceof Attributes;
}
@Override
public final Attributes attributes() {
ensureAttributes();
return (Attributes) value;
}
private void ensureAttributes() {
if (!hasAttributes()) {
Object coreValue = value;
Attributes attributes = new Attributes();
value = attributes;
if (coreValue != null)
attributes.put(nodeName(), (String) coreValue);
}
}
String coreValue() {
return attr(nodeName());
}
void coreValue(String value) {
attr(nodeName(), value);
}
@Override
public String attr(String key) {
Validate.notNull(key);
if (!hasAttributes()) {
return key.equals(nodeName()) ? (String) value : EmptyString;
}
return super.attr(key);
}
@Override
public Node attr(String key, String value) {
if (!hasAttributes() && key.equals(nodeName())) {
this.value = value;
} else {
ensureAttributes();
super.attr(key, value);
}
return this;
}
@Override
public boolean hasAttr(String key) {
ensureAttributes();
return super.hasAttr(key);
}
@Override
public Node removeAttr(String key) {
ensureAttributes();
return super.removeAttr(key);
}
@Override
public String absUrl(String key) {
ensureAttributes();
return super.absUrl(key);
}
@Override
public String baseUri() {
return hasParent() ? parent().baseUri() : "";
}
@Override
protected void doSetBaseUri(String baseUri) {
// noop
}
@Override
public int childNodeSize() {
return 0;
}
@Override
public Node empty() {
return this;
}
@Override
protected List ensureChildNodes() {
return EmptyNodes;
}
@Override
protected LeafNode doClone(Node parent) {
LeafNode clone = (LeafNode) super.doClone(parent);
// Object value could be plain string or attributes - need to clone
if (hasAttributes())
clone.value = ((Attributes) value).clone();
return clone;
}
}