comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:7ecd1a4ef557
1 package nabble.view.web.template;
2
3 import fschmidt.util.java.Filter;
4 import nabble.model.ModelHome;
5 import nabble.model.Node;
6 import nabble.model.NodeIterator;
7 import nabble.model.NodeSearcher;
8 import nabble.model.User;
9 import nabble.naml.compiler.Command;
10 import nabble.naml.compiler.CommandSpec;
11 import nabble.naml.compiler.IPrintWriter;
12 import nabble.naml.compiler.Interpreter;
13 import nabble.naml.compiler.Namespace;
14 import nabble.naml.compiler.ScopedInterpreter;
15 import nabble.naml.namespaces.ListSequence;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.List;
22
23
24 @Namespace (
25 name = "node_list",
26 global = true
27 )
28 public final class NodeList extends ListSequence<Node> {
29
30 static void subapps(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,String filter) {
31 List<Node> nodes = loopNode.getChildApps(filter).get(0, 100);
32 NodeList loop = new NodeList(nodes, loopNode, false);
33 Object block = interp.getArg(loop,"do");
34 out.print(block);
35 }
36
37 static void descendantApps(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode) {
38 List<Node> nodes = loopNode.getDescendantApps().get(0, 1000);
39 NodeList loop = new NodeList(nodes, loopNode, false);
40 Object block = interp.getArg(loop,"do");
41 out.print(block);
42 }
43
44 static void ancestors(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,String order) {
45 Node parent = loopNode.getParent();
46 List<Node> nodes = parent != null? parent.getAncestors().get(0, 1000) : Collections.<Node>emptyList();
47 if ("reverse".equalsIgnoreCase(order) && nodes.size() > 1)
48 Collections.reverse(nodes);
49 NodeList loop = new NodeList(nodes, loopNode, false);
50 Object block = interp.getArg(loop,"do");
51 out.print(block);
52 }
53
54 private static boolean hasMore(List<Node> nodes,int size) {
55 if( nodes.size() <= size )
56 return false;
57 nodes.remove(size);
58 return true;
59 }
60
61 public static void children(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,NodeIterator<? extends Node> nodeIter,int indexRecord,int length) {
62 List<Node> nodes = nodeIter.get(indexRecord, length+1);
63 boolean hasMore = hasMore(nodes,length);
64 NodeList loop = new NodeList(nodes, loopNode, hasMore);
65 Object block = interp.getArg(loop,"do");
66 out.print(block);
67 }
68
69 public static void topics(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,NodeIterator<? extends Node> nodeIter,int indexRecord,int length) {
70 List<Node> nodes = nodeIter.get(indexRecord, length+1);
71 boolean hasMore = hasMore(nodes,length);
72 NodeList loop = new NodeList(nodes, loopNode, hasMore);
73 Object block = interp.getArg(loop,"do");
74 out.print(block);
75 }
76
77 public static void posts(IPrintWriter out,ScopedInterpreter<NodeList> interp,Node loopNode,int indexRecord,int length,String sortBy,Filter<Node> filter) {
78 List<Node> nodes;
79 if ("date-ascending".equals(sortBy)) {
80 nodes = loopNode.getPostsByDateAscending(filter).get(indexRecord, length+1);
81 } else if ("date-descending".equals(sortBy)) {
82 nodes = loopNode.getPostsByDate(filter).get(indexRecord, length+1);
83 } else {
84 throw new RuntimeException("'sort' attribute not set");
85 }
86 boolean hasMore = hasMore(nodes,length);
87 NodeList loop = new NodeList(nodes, loopNode, hasMore);
88 Object block = interp.getArg(loop,"do");
89 out.print(block);
90 }
91
92 static void userNodes(IPrintWriter out,ScopedInterpreter<NodeList> interp, NodeIterator<? extends Node> nodeIter, int indexRecord,int length) {
93 List<Node> nodes = nodeIter.get(indexRecord,length+1);
94 boolean hasMore = hasMore(nodes,length);
95 NodeList loop = new NodeList(nodes, null, hasMore);
96 Object block = interp.getArg(loop,"do");
97 out.print(block);
98 }
99
100
101 private final Node loopNode;
102 private final boolean hasMore;
103
104 /**
105 * Cache the lastNodes to prevent them from being
106 * garbage collected so that there aren't multiple
107 * database accesses. This is an optimization.
108 */
109 private final Collection<Node> lastNodes;
110
111 public NodeList(List<Node> nodes, Node loopNode,boolean hasMore) {
112 super(nodes);
113 this.loopNode = loopNode;
114 this.hasMore = hasMore;
115 lastNodes = NabbleNamespace.current().site().cacheLastNodes(nodes);
116 }
117
118 public static final CommandSpec preload_messages = CommandSpec.NO_OUTPUT;
119
120 @Command public void preload_messages(IPrintWriter out,Interpreter interp) {
121 ModelHome.preloadMessages(elements);
122 }
123
124 @Command public void there_is_more(IPrintWriter out,Interpreter interp) {
125 out.print( hasMore );
126 }
127
128 @Command public void has_loop_node(IPrintWriter out,Interpreter interp) {
129 out.print( loopNode != null );
130 }
131
132 public static final CommandSpec loop_node = CommandSpec.DO;
133
134 @Command public void loop_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
135 out.print( interp.getArg(new NodeNamespace(loopNode),"do") );
136 }
137
138 public static final CommandSpec current_node = CommandSpec.DO;
139
140 @Command public void current_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
141 NodeNamespace row = new NodeNamespace(get());
142 Object block = interp.getArg(row,"do");
143 out.print(block);
144 }
145
146 public static final CommandSpec node_at = CommandSpec.DO()
147 .parameters("index")
148 .build()
149 ;
150
151 @Command public void node_at(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
152 int index = interp.getArgAsInt("index");
153 NodeNamespace row = new NodeNamespace(elements.get(index));
154 Object block = interp.getArg(row,"do");
155 out.print(block);
156 }
157
158 @Command public void next_node(IPrintWriter out,Interpreter interp) {
159 next_element(out,interp);
160 }
161
162 @Command public void has_previous_node(IPrintWriter out,Interpreter interp) {
163 out.print( getPrevious() != null );
164 }
165
166 public static final CommandSpec previous_node = CommandSpec.DO;
167
168 @Command public void previous_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
169 NodeNamespace row = new NodeNamespace(getPrevious());
170 Object block = interp.getArg(row,"do");
171 out.print(block);
172 }
173
174 public static final CommandSpec sub_list = CommandSpec.DO()
175 .parameters("length")
176 .optionalParameters("start")
177 .build()
178 ;
179
180 @Command public void sub_list(IPrintWriter out,ScopedInterpreter<NodeList> interp) {
181 int start = interp.getArgAsInt("start",0);
182 int length = interp.getArgAsInt("length");
183 NodeList ns ;
184 if( start==0 && length >= elements.size() ) {
185 ns = this;
186 } else {
187 ns = new NodeList( elements.subList(start,Math.min(elements.size(),start+length)), loopNode, false );
188 }
189 out.print( interp.getArg(ns,"do") );
190 }
191
192 }