0
|
1 package nabble.view.web.template;
|
|
2
|
|
3 import nabble.model.Site;
|
|
4 import nabble.naml.compiler.Command;
|
|
5 import nabble.naml.compiler.CommandSpec;
|
|
6 import nabble.naml.compiler.CompileException;
|
|
7 import nabble.naml.compiler.IPrintWriter;
|
|
8 import nabble.naml.compiler.Interpreter;
|
|
9 import nabble.naml.compiler.JavaCommand;
|
|
10 import nabble.naml.compiler.Meaning;
|
|
11 import nabble.naml.compiler.Namespace;
|
|
12 import nabble.naml.compiler.ScopedInterpreter;
|
|
13 import nabble.naml.namespaces.ListSequence;
|
|
14 import nabble.naml.namespaces.StringList;
|
|
15
|
|
16 import javax.servlet.ServletException;
|
|
17 import java.io.IOException;
|
|
18 import java.lang.reflect.Method;
|
|
19 import java.util.ArrayList;
|
|
20 import java.util.Arrays;
|
|
21 import java.util.Collection;
|
|
22 import java.util.Collections;
|
|
23 import java.util.HashMap;
|
|
24 import java.util.Iterator;
|
|
25 import java.util.List;
|
|
26 import java.util.Map;
|
|
27
|
|
28
|
|
29 @Namespace (
|
|
30 name = "doc",
|
|
31 global = true
|
|
32 )
|
|
33 public class DocNamespace {
|
|
34
|
|
35 static String getDocName(String macroName,Collection<String> requiredNamespaces) {
|
|
36 StringBuilder buf = new StringBuilder();
|
|
37 buf.append( "doc for " ).append( macroName );
|
|
38 if( !requiredNamespaces.isEmpty() ) {
|
|
39 Iterator<String> iter = requiredNamespaces.iterator();
|
|
40 buf.append( " requiring " ).append( iter.next() );
|
|
41 while( iter.hasNext() ) {
|
|
42 buf.append( "," ).append( iter.next() );
|
|
43 }
|
|
44 }
|
|
45 return buf.toString();
|
|
46 }
|
|
47
|
|
48
|
|
49 @Namespace (
|
|
50 name = "binary_doc",
|
|
51 global = true
|
|
52 )
|
|
53 public static final class BinaryDocNamespace extends DocNamespace {
|
|
54
|
|
55 private final Site site;
|
|
56 private final JavaCommand meaning;
|
|
57
|
|
58 private final String value;
|
|
59 private final String[] params;
|
|
60 private final String[] seeAlso;
|
|
61
|
|
62 BinaryDocNamespace(Site site, JavaCommand meaning,String value, String[] params, String[] seeAlso) {
|
|
63 this.site = site;
|
|
64 this.meaning = meaning;
|
|
65 this.value = value;
|
|
66 this.params = params;
|
|
67 this.seeAlso = seeAlso;
|
|
68 }
|
|
69
|
|
70 @Command("value") public void _value(IPrintWriter out,Interpreter interp) {
|
|
71 out.print(value);
|
|
72 }
|
|
73
|
|
74 @Command public void has_parameters(IPrintWriter out,Interpreter interp) {
|
|
75 out.print(params.length > 0 || meaning.getParameterNames().length > 0);
|
|
76 }
|
|
77
|
|
78 public static final CommandSpec parameter_list = CommandSpec.DO;
|
|
79
|
|
80 @Command public void parameter_list(IPrintWriter out, ScopedInterpreter<ParameterList> interp) {
|
|
81 String[] parameters = meaning.getParameterNames();
|
|
82 String[] requiredParameters = meaning.getRequiredParameterNames();
|
|
83 String dotParameter = meaning.getDotParameterName();
|
|
84
|
|
85 HashMap<String,String> all = new HashMap<String,String>();
|
|
86 for (String s : params) {
|
|
87 String[] keyValue = s.split("=");
|
|
88 String name = keyValue[0];
|
|
89 String description = keyValue[1];
|
|
90 all.put(name, description);
|
|
91 }
|
|
92 for (String s : parameters) {
|
|
93 if (!all.containsKey(s))
|
|
94 all.put(s, "");
|
|
95 }
|
|
96 List<ParameterInfo> infos = new ArrayList<ParameterInfo>();
|
|
97 for( Map.Entry<String,String> entry : all.entrySet() ) {
|
|
98 String name = entry.getKey();
|
|
99 String description = entry.getValue();
|
|
100 boolean isOptional = !contains(name, requiredParameters);
|
|
101 boolean isDotParameter = name.equals(dotParameter);
|
|
102 infos.add(new ParameterInfo(name, description, isOptional, isDotParameter));
|
|
103 }
|
|
104 out.print(interp.getArg(new ParameterList(infos),"do"));
|
|
105 }
|
|
106
|
|
107 private boolean contains(String name, String[] names) {
|
|
108 for (String s : names)
|
|
109 if (s.equals(name))
|
|
110 return true;
|
|
111 return false;
|
|
112 }
|
|
113
|
|
114 public static final CommandSpec see_also = CommandSpec.DO;
|
|
115
|
|
116 @Command public void see_also(IPrintWriter out, ScopedInterpreter<StringList> interp) {
|
|
117 out.print(interp.getArg(new StringList(Arrays.asList(seeAlso)),"do"));
|
|
118 }
|
|
119
|
|
120 @Command public void requires(IPrintWriter out, Interpreter interp) {
|
|
121 out.print( meaning.getRequiredNamespaces().iterator().next() );
|
|
122 }
|
|
123
|
|
124 @Command public void adds_namespace(IPrintWriter out, Interpreter interp) {
|
|
125 out.print( meaning.addsNamespace() != null );
|
|
126 }
|
|
127
|
|
128 @Command public void added_namespace(IPrintWriter out, Interpreter interp) {
|
|
129 out.print( meaning.addsNamespace() );
|
|
130 }
|
|
131
|
|
132 @Command public void binary_details(IPrintWriter out,Interpreter interp) {
|
|
133 out.print(meaning.getMethod());
|
|
134 }
|
|
135
|
|
136 public static final CommandSpec related_commands = CommandSpec.DO;
|
|
137
|
|
138 @Command public void related_commands(IPrintWriter out,ScopedInterpreter<MacroSourceNamespace.Commands> interp)
|
|
139 throws IOException, ServletException, CompileException
|
|
140 {
|
|
141 List<MacroSourceNamespace.CommandInfo> commands = relatedCommands();
|
|
142 Collections.sort(commands, MacroSourceNamespace.CommandInfo.MACRO_NAME_COMPARATOR);
|
|
143 Object block = interp.getArg(new MacroSourceNamespace.Commands(commands),"do");
|
|
144 out.print(block);
|
|
145 }
|
|
146
|
|
147 private List<MacroSourceNamespace.CommandInfo> relatedCommands() {
|
|
148 List<MacroSourceNamespace.CommandInfo> commands = new ArrayList<MacroSourceNamespace.CommandInfo>();
|
|
149 Class c = meaning.getMethod().getDeclaringClass();
|
|
150 for (Method method : c.getMethods()) {
|
|
151 if (method.getAnnotation(Command.class) != null) {
|
|
152 Meaning m = site.getProgram().getMeaning(c.getName() + '.' + method.getName());
|
|
153 if (m != null)
|
|
154 commands.add(new MacroSourceNamespace.CommandInfo(m, null, null));
|
|
155 }
|
|
156 }
|
|
157 return commands;
|
|
158 }
|
|
159 }
|
|
160
|
|
161 @Namespace (
|
|
162 name = "parameter_list",
|
|
163 global = true
|
|
164 )
|
|
165 public static final class ParameterList extends ListSequence<ParameterInfo> {
|
|
166
|
|
167 public ParameterList(List<ParameterInfo> elements) {
|
|
168 super(elements);
|
|
169 }
|
|
170
|
|
171 public static final CommandSpec current_parameter = CommandSpec.DO;
|
|
172
|
|
173 @Command public void current_parameter(IPrintWriter out,ScopedInterpreter<ParameterInfo> interp) {
|
|
174 out.print(interp.getArg(get(),"do"));
|
|
175 }
|
|
176 }
|
|
177
|
|
178 @Namespace (
|
|
179 name = "parameter_info",
|
|
180 global = true
|
|
181 )
|
|
182 public static final class ParameterInfo {
|
|
183
|
|
184 private final String name;
|
|
185 private final String description;
|
|
186 private final boolean isOptional;
|
|
187 private final boolean isDotParameter;
|
|
188
|
|
189 public ParameterInfo(String name, String description, boolean isOptional, boolean isDotParameter) {
|
|
190 this.name = name;
|
|
191 this.description = description;
|
|
192 this.isOptional = isOptional;
|
|
193 this.isDotParameter = isDotParameter;
|
|
194 }
|
|
195
|
|
196 @Command("name") public void _name(IPrintWriter out,Interpreter interp) {
|
|
197 out.print(name);
|
|
198 }
|
|
199
|
|
200 @Command("description") public void _description(IPrintWriter out,Interpreter interp) {
|
|
201 out.print(description);
|
|
202 }
|
|
203
|
|
204 @Command public void is_optional(IPrintWriter out,Interpreter interp) {
|
|
205 out.print(isOptional);
|
|
206 }
|
|
207
|
|
208 @Command public void is_dot_parameter(IPrintWriter out,Interpreter interp) {
|
|
209 out.print(isDotParameter);
|
|
210 }
|
|
211 }
|
|
212
|
|
213 }
|