in freemarker-core/src/main/java/freemarker/template/utility/DOMNodeModel.java [65:130]
public TemplateModel get(String key) throws TemplateModelException {
TemplateModel result = null;
if (equivalenceTable.containsKey(key)) {
key = (String) equivalenceTable.get(key);
}
if (cache.containsKey(key)) {
result = (TemplateModel) cache.get(key);
}
if (result == null) {
if ("attributes".equals(key)) {
NamedNodeMap attributes = node.getAttributes();
if (attributes != null) {
SimpleHash hash = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int i = 0; i < attributes.getLength(); i++) {
Attr att = (Attr) attributes.item(i);
hash.put(att.getName(), att.getValue());
}
result = hash;
}
} else if (key.charAt(0) == '@') {
if (node instanceof Element) {
String attValue = ((Element) node).getAttribute(key.substring(1));
result = new SimpleScalar(attValue);
} else {
throw new TemplateModelException("Trying to get an attribute value for a non-element node");
}
} else if ("is_element".equals(key)) {
result = (node instanceof Element) ?
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
} else if ("is_text".equals(key)) {
result = (node instanceof Text) ?
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
} else if ("name".equals(key)) {
result = new SimpleScalar(node.getNodeName());
} else if ("children".equals(key)) {
result = new NodeListTM(node.getChildNodes());
} else if ("parent".equals(key)) {
Node parent = node.getParentNode();
result = (parent == null) ? null : new DOMNodeModel(parent);
} else if ("ancestorByName".equals(key)) {
result = new AncestorByName();
} else if ("nextSibling".equals(key)) {
Node next = node.getNextSibling();
result = (next == null) ? null : new DOMNodeModel(next);
} else if ("previousSibling".equals(key)) {
Node previous = node.getPreviousSibling();
result = (previous == null) ? null : new DOMNodeModel(previous);
} else if ("nextSiblingElement".equals(key)) {
Node next = nextSiblingElement(node);
result = (next == null) ? null : new DOMNodeModel(next);
} else if ("previousSiblingElement".equals(key)) {
Node previous = previousSiblingElement(node);
result = (previous == null) ? null : new DOMNodeModel(previous);
} else if ("nextElement".equals(key)) {
Node next = nextElement(node);
result = (next == null) ? null : new DOMNodeModel(next);
} else if ("previousElement".equals(key)) {
Node previous = previousElement(node);
result = (previous == null) ? null : new DOMNodeModel(previous);
} else if ("text".equals(key)) {
result = new SimpleScalar(getText(node));
}
cache.put(key, result);
}
return result;
}