Repository: incubator-freemarker Updated Branches: refs/heads/2.3-gae 6750d92be -> fbd6fa5f9
merging the commit to 2.3-gae Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/d66cf48d Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/d66cf48d Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/d66cf48d Branch: refs/heads/2.3-gae Commit: d66cf48dbaf31428dd41abfe88a2f79b98f647d5 Parents: 6166efe Author: Pradeep <[email protected]> Authored: Sat Oct 24 01:33:15 2015 +0530 Committer: Pradeep <[email protected]> Committed: Mon Jan 11 17:21:42 2016 +0530 ---------------------------------------------------------------------- src/main/java/freemarker/core/BuiltIn.java | 12 ++++++--- .../java/freemarker/core/BuiltInExtForNode.java | 21 ++++++++++++++++ .../freemarker/core/BuiltInExtForNodes.java | 26 ++++++++++++++++++++ .../java/freemarker/core/BuiltinVariable.java | 6 ++++- .../java/freemarker/ext/dom/ElementModel.java | 14 +++++++++++ src/main/java/freemarker/ext/dom/NodeModel.java | 23 +++++++++++++++-- .../template/TemplateNodeModelExt.java | 17 +++++++++++++ 7 files changed, 113 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltIn.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltIn.java b/src/main/java/freemarker/core/BuiltIn.java index ab796b0..63f2574 100644 --- a/src/main/java/freemarker/core/BuiltIn.java +++ b/src/main/java/freemarker/core/BuiltIn.java @@ -62,6 +62,8 @@ import freemarker.core.BuiltInsForSequences.seq_index_ofBI; import freemarker.core.BuiltInsForSequences.sortBI; import freemarker.core.BuiltInsForSequences.sort_byBI; import freemarker.core.BuiltInsForStringsMisc.evalBI; +import freemarker.core.BuiltInExtForNodes.previousSiblingBI; +import freemarker.core.BuiltInExtForNodes.nextSiblingBI; import freemarker.template.Configuration; import freemarker.template.TemplateDateModel; import freemarker.template.TemplateModel; @@ -81,9 +83,10 @@ abstract class BuiltIn extends Expression implements Cloneable { static final Set<String> CAMEL_CASE_NAMES = new TreeSet<String>(); static final Set<String> SNAKE_CASE_NAMES = new TreeSet<String>(); - - static final int NUMBER_OF_BIS = 259; - static final HashMap<String, BuiltIn> BUILT_INS_BY_NAME = new HashMap(NUMBER_OF_BIS * 3 / 2 + 1, 1f); + + static final int NUMBER_OF_BIS = 261; + static final HashMap builtins = new HashMap(NUMBER_OF_BIS * 3 / 2 + 1, 1f); + static { // Note that you must update NUMBER_OF_BIS if you add new items here! @@ -246,6 +249,8 @@ abstract class BuiltIn extends Expression implements Cloneable { putBI("number_to_time", "numberToTime", new number_to_dateBI(TemplateDateModel.TIME)); putBI("number_to_datetime", "numberToDatetime", new number_to_dateBI(TemplateDateModel.DATETIME)); putBI("parent", new parentBI()); + putBI("previousSibling", new previousSiblingBI()); + putBI("nextSibling", new nextSiblingBI()); putBI("item_parity", "itemParity", new BuiltInsForLoopVariables.item_parityBI()); putBI("item_parity_cap", "itemParityCap", new BuiltInsForLoopVariables.item_parity_capBI()); putBI("reverse", new reverseBI()); @@ -284,6 +289,7 @@ abstract class BuiltIn extends Expression implements Cloneable { putBI("matches", new BuiltInsForStringsRegexp.matchesBI()); putBI("groups", new BuiltInsForStringsRegexp.groupsBI()); putBI("replace", new BuiltInsForStringsRegexp.replace_reBI()); + if (NUMBER_OF_BIS < BUILT_INS_BY_NAME.size()) { throw new AssertionError("Update NUMBER_OF_BIS! Should be: " + BUILT_INS_BY_NAME.size()); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltInExtForNode.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltInExtForNode.java b/src/main/java/freemarker/core/BuiltInExtForNode.java new file mode 100644 index 0000000..7e859b8 --- /dev/null +++ b/src/main/java/freemarker/core/BuiltInExtForNode.java @@ -0,0 +1,21 @@ +package freemarker.core; + +import freemarker.template.*; + +/** + * Created by Pmuruge on 10/23/2015. + */ +public abstract class BuiltInExtForNode extends BuiltIn { + @Override + TemplateModel _eval(Environment env) + throws TemplateException { + TemplateModel model = target.eval(env); + if (model instanceof TemplateNodeModelExt) { + return calculateResult((TemplateNodeModelExt) model, env); + } else { + throw new NonNodeException(target, model, env); + } + } + abstract TemplateModel calculateResult(TemplateNodeModelExt nodeModel, Environment env) + throws TemplateModelException; +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltInExtForNodes.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltInExtForNodes.java b/src/main/java/freemarker/core/BuiltInExtForNodes.java new file mode 100644 index 0000000..eeb20a8 --- /dev/null +++ b/src/main/java/freemarker/core/BuiltInExtForNodes.java @@ -0,0 +1,26 @@ +package freemarker.core; + +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateNodeModelExt; + +/** + * Created by Pmuruge on 10/23/2015. + */ +public class BuiltInExtForNodes { + + static class previousSiblingBI extends BuiltInExtForNode { + @Override + TemplateModel calculateResult(TemplateNodeModelExt nodeModel, Environment env) throws TemplateModelException { + return nodeModel.getPreviousSibling(); + } + } + + static class nextSiblingBI extends BuiltInExtForNode { + @Override + TemplateModel calculateResult(TemplateNodeModelExt nodeModel, Environment env) throws TemplateModelException { + return nodeModel.getNextSibling(); + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltinVariable.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/src/main/java/freemarker/core/BuiltinVariable.java index 5b0f4d2..0afea07 100644 --- a/src/main/java/freemarker/core/BuiltinVariable.java +++ b/src/main/java/freemarker/core/BuiltinVariable.java @@ -72,6 +72,8 @@ final class BuiltinVariable extends Expression { static final String URL_ESCAPING_CHARSET_CC = "urlEscapingCharset"; static final String URL_ESCAPING_CHARSET = "url_escaping_charset"; static final String NOW = "now"; + static final String PREVIOUS_SIBLING = "previous"; + static final String NEXT_SIBLING = "next"; static final String[] SPEC_VAR_NAMES = new String[] { AUTO_ESC_CC, @@ -107,7 +109,9 @@ final class BuiltinVariable extends Expression { URL_ESCAPING_CHARSET_CC, URL_ESCAPING_CHARSET, VARS, - VERSION + VERSION, + PREVIOUS_SIBLING, + NEXT_SIBLING }; private final String name; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/ext/dom/ElementModel.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/ext/dom/ElementModel.java b/src/main/java/freemarker/ext/dom/ElementModel.java index fb6fccd..95e13fc 100644 --- a/src/main/java/freemarker/ext/dom/ElementModel.java +++ b/src/main/java/freemarker/ext/dom/ElementModel.java @@ -89,6 +89,20 @@ class ElementModel extends NodeModel implements TemplateScalarModel { nu.outputContent(node.getAttributes(), buf); return new SimpleScalar(buf.toString().trim()); } + if (key.equals("@@previous")) { + XPathSupport xps = getXPathSupport(); + if (xps != null) { + return xps.executeQuery(node, "preceding-sibling::*[position()=1]"); + } + } + if (key.equals("@@next")) { + XPathSupport xps = getXPathSupport(); + if (xps != null) { + TemplateModel next = xps.executeQuery(node, "following-sibling::*[position()=1]"); + System.out.println(next.toString()); + return next; + } + } if (StringUtil.isXMLID(key.substring(1))) { Attr att = getAttribute(key.substring(1)); if (att == null) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/ext/dom/NodeModel.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/src/main/java/freemarker/ext/dom/NodeModel.java index c338664..c518333 100644 --- a/src/main/java/freemarker/ext/dom/NodeModel.java +++ b/src/main/java/freemarker/ext/dom/NodeModel.java @@ -59,6 +59,7 @@ import freemarker.template.TemplateHashModel; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.TemplateNodeModel; +import freemarker.template.TemplateNodeModelExt; import freemarker.template.TemplateNumberModel; import freemarker.template.TemplateSequenceModel; @@ -75,7 +76,7 @@ import freemarker.template.TemplateSequenceModel; * then), but should be used to represent a node set of exactly 1 node. */ abstract public class NodeModel -implements TemplateNodeModel, TemplateHashModel, TemplateSequenceModel, +implements TemplateNodeModel, TemplateNodeModelExt, TemplateHashModel, TemplateSequenceModel, AdapterTemplateModel, WrapperTemplateModel, _UnexpectedTypeErrorExplainerTemplateModel { static private final Logger LOG = Logger.getLogger("freemarker.dom"); @@ -109,6 +110,8 @@ implements TemplateNodeModel, TemplateHashModel, TemplateSequenceModel, final Node node; private TemplateSequenceModel children; private NodeModel parent; + private NodeModel previousSibling; + private NodeModel nextSibling; /** * Sets the DOM Parser implementation to be used when building NodeModel @@ -307,7 +310,23 @@ implements TemplateNodeModel, TemplateHashModel, TemplateSequenceModel, } return parent; } - + + public TemplateNodeModel getPreviousSibling() throws TemplateModelException { + if (previousSibling == null) { + Node previous = node.getPreviousSibling(); + previousSibling = wrap(previous); + } + return previousSibling; + } + + public TemplateNodeModel getNextSibling() throws TemplateModelException { + if (nextSibling == null) { + Node next = node.getNextSibling(); + nextSibling = wrap(next); + } + return nextSibling; + } + public TemplateSequenceModel getChildNodes() { if (children == null) { children = new NodeListModel(node.getChildNodes(), this); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/template/TemplateNodeModelExt.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/template/TemplateNodeModelExt.java b/src/main/java/freemarker/template/TemplateNodeModelExt.java new file mode 100644 index 0000000..d2c8be0 --- /dev/null +++ b/src/main/java/freemarker/template/TemplateNodeModelExt.java @@ -0,0 +1,17 @@ +package freemarker.template; + +/** + * Created by Pmuruge on 10/22/2015. + */ +public interface TemplateNodeModelExt extends TemplateNodeModel { + + /** + * @return the immediate Previous Sibling of this node + */ + TemplateNodeModel getPreviousSibling() throws TemplateModelException; + + /** + * @return the immediate next Sibling of this node + */ + TemplateNodeModel getNextSibling() throws TemplateModelException; +}
