diff src/nabble/view/web/template/NodeList.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/web/template/NodeList.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,192 @@
+package nabble.view.web.template;
+
+import fschmidt.util.java.Filter;
+import nabble.model.ModelHome;
+import nabble.model.Node;
+import nabble.model.NodeIterator;
+import nabble.model.NodeSearcher;
+import nabble.model.User;
+import nabble.naml.compiler.Command;
+import nabble.naml.compiler.CommandSpec;
+import nabble.naml.compiler.IPrintWriter;
+import nabble.naml.compiler.Interpreter;
+import nabble.naml.compiler.Namespace;
+import nabble.naml.compiler.ScopedInterpreter;
+import nabble.naml.namespaces.ListSequence;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+
+@Namespace (
+	name = "node_list",
+	global = true
+)
+public final class NodeList extends ListSequence<Node> {
+
+	static void subapps(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,String filter) {
+		List<Node> nodes = loopNode.getChildApps(filter).get(0, 100);
+		NodeList loop = new NodeList(nodes, loopNode, false);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	static void descendantApps(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode) {
+		List<Node> nodes = loopNode.getDescendantApps().get(0, 1000);
+		NodeList loop = new NodeList(nodes, loopNode, false);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	static void ancestors(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,String order) {
+		Node parent = loopNode.getParent();
+		List<Node> nodes = parent != null? parent.getAncestors().get(0, 1000) : Collections.<Node>emptyList();
+		if ("reverse".equalsIgnoreCase(order) && nodes.size() > 1)
+			Collections.reverse(nodes);
+		NodeList loop = new NodeList(nodes, loopNode, false);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	private static boolean hasMore(List<Node> nodes,int size) {
+		if( nodes.size() <= size )
+			return false;
+		nodes.remove(size);
+		return true;
+	}
+
+	public static void children(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,NodeIterator<? extends Node> nodeIter,int indexRecord,int length) {
+		List<Node> nodes = nodeIter.get(indexRecord, length+1);
+		boolean hasMore = hasMore(nodes,length);
+		NodeList loop = new NodeList(nodes, loopNode, hasMore);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	public static void topics(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,NodeIterator<? extends Node> nodeIter,int indexRecord,int length) {
+		List<Node> nodes = nodeIter.get(indexRecord, length+1);
+		boolean hasMore = hasMore(nodes,length);
+		NodeList loop = new NodeList(nodes, loopNode, hasMore);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	public static void posts(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,int indexRecord,int length,String sortBy,Filter<Node> filter) {
+		List<Node> nodes;
+		if ("date-ascending".equals(sortBy)) {
+			nodes = loopNode.getPostsByDateAscending(filter).get(indexRecord, length+1);
+		} else if ("date-descending".equals(sortBy)) {
+			nodes = loopNode.getPostsByDate(filter).get(indexRecord, length+1);
+		} else {
+			throw new RuntimeException("'sort' attribute not set");
+		}
+		boolean hasMore = hasMore(nodes,length);
+		NodeList loop = new NodeList(nodes, loopNode, hasMore);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+	static void userNodes(IPrintWriter out,ScopedInterpreter<NodeList> interp, NodeIterator<? extends Node> nodeIter, int indexRecord,int length) {
+		List<Node> nodes = nodeIter.get(indexRecord,length+1);
+		boolean hasMore = hasMore(nodes,length);
+		NodeList loop = new NodeList(nodes, null, hasMore);
+		Object block = interp.getArg(loop,"do");
+		out.print(block);
+	}
+
+
+	private final Node loopNode;
+	private final boolean hasMore;
+
+	/**
+	 * Cache the lastNodes to prevent them from being
+	 * garbage collected so that there aren't multiple
+	 * database accesses.  This is an optimization.
+	 */
+	private final Collection<Node> lastNodes;
+
+	public NodeList(List<Node> nodes, Node loopNode,boolean hasMore) {
+		super(nodes);
+		this.loopNode = loopNode;
+		this.hasMore = hasMore;
+		lastNodes = NabbleNamespace.current().site().cacheLastNodes(nodes);
+	}
+
+	public static final CommandSpec preload_messages = CommandSpec.NO_OUTPUT;
+
+	@Command public void preload_messages(IPrintWriter out,Interpreter interp) {
+		ModelHome.preloadMessages(elements);
+	}
+
+	@Command public void there_is_more(IPrintWriter out,Interpreter interp) {
+		out.print( hasMore );
+	}
+
+	@Command public void has_loop_node(IPrintWriter out,Interpreter interp) {
+		out.print( loopNode != null );
+	}
+
+	public static final CommandSpec loop_node = CommandSpec.DO;
+
+	@Command public void loop_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+ 		out.print( interp.getArg(new NodeNamespace(loopNode),"do") );
+	}
+
+	public static final CommandSpec current_node = CommandSpec.DO;
+
+	@Command public void current_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+		NodeNamespace row = new NodeNamespace(get());
+		Object block = interp.getArg(row,"do");
+		out.print(block);
+	}
+
+	public static final CommandSpec node_at = CommandSpec.DO()
+		.parameters("index")
+		.build()
+	;
+
+	@Command public void node_at(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+		int index = interp.getArgAsInt("index");
+		NodeNamespace row = new NodeNamespace(elements.get(index));
+		Object block = interp.getArg(row,"do");
+		out.print(block);
+	}
+
+	@Command public void next_node(IPrintWriter out,Interpreter interp) {
+		next_element(out,interp);
+	}
+
+	@Command public void has_previous_node(IPrintWriter out,Interpreter interp) {
+		out.print( getPrevious() != null );
+	}
+
+	public static final CommandSpec previous_node = CommandSpec.DO;
+
+	@Command public void previous_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+		NodeNamespace row = new NodeNamespace(getPrevious());
+		Object block = interp.getArg(row,"do");
+		out.print(block);
+	}
+
+	public static final CommandSpec sub_list = CommandSpec.DO()
+		.parameters("length")
+		.optionalParameters("start")
+		.build()
+	;
+
+	@Command public void sub_list(IPrintWriter out,ScopedInterpreter<NodeList> interp) {
+		int start = interp.getArgAsInt("start",0);
+		int length = interp.getArgAsInt("length");
+		NodeList ns ;
+		if( start==0 && length >= elements.size() ) {
+			ns = this;
+		} else {
+			ns = new NodeList( elements.subList(start,Math.min(elements.size(),start+length)), loopNode, false );
+		}
+		out.print( interp.getArg(ns,"do") );
+	}
+
+}