diff src/nabble/view/web/template/DocNamespace.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/DocNamespace.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,213 @@
+package nabble.view.web.template;
+
+import nabble.model.Site;
+import nabble.naml.compiler.Command;
+import nabble.naml.compiler.CommandSpec;
+import nabble.naml.compiler.CompileException;
+import nabble.naml.compiler.IPrintWriter;
+import nabble.naml.compiler.Interpreter;
+import nabble.naml.compiler.JavaCommand;
+import nabble.naml.compiler.Meaning;
+import nabble.naml.compiler.Namespace;
+import nabble.naml.compiler.ScopedInterpreter;
+import nabble.naml.namespaces.ListSequence;
+import nabble.naml.namespaces.StringList;
+
+import javax.servlet.ServletException;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+@Namespace (
+	name = "doc",
+	global = true
+)
+public class DocNamespace {
+
+	static String getDocName(String macroName,Collection<String> requiredNamespaces) {
+		StringBuilder buf = new StringBuilder();
+		buf.append( "doc for " ).append( macroName );
+		if( !requiredNamespaces.isEmpty() ) {
+			Iterator<String> iter = requiredNamespaces.iterator();
+			buf.append( " requiring " ).append( iter.next() );
+			while( iter.hasNext() ) {
+				buf.append( "," ).append( iter.next() );
+			}
+		}
+		return buf.toString();
+	}
+
+
+	@Namespace (
+		name = "binary_doc",
+		global = true
+	)
+	public static final class BinaryDocNamespace extends DocNamespace {
+
+		private final Site site;
+		private final JavaCommand meaning;
+
+		private final String value;
+		private final String[] params;
+		private final String[] seeAlso;
+
+		BinaryDocNamespace(Site site, JavaCommand meaning,String value, String[] params, String[] seeAlso) {
+			this.site = site;
+			this.meaning = meaning;
+			this.value = value;
+			this.params = params;
+			this.seeAlso = seeAlso;
+		}
+
+		@Command("value") public void _value(IPrintWriter out,Interpreter interp) {
+			out.print(value);
+		}
+
+		@Command public void has_parameters(IPrintWriter out,Interpreter interp) {
+			out.print(params.length > 0 || meaning.getParameterNames().length > 0);
+		}
+
+		public static final CommandSpec parameter_list = CommandSpec.DO;
+
+		@Command public void parameter_list(IPrintWriter out, ScopedInterpreter<ParameterList> interp) {
+			String[] parameters = meaning.getParameterNames();
+			String[] requiredParameters = meaning.getRequiredParameterNames();
+			String dotParameter = meaning.getDotParameterName();
+
+			HashMap<String,String> all = new HashMap<String,String>();
+			for (String s : params) {
+				String[] keyValue = s.split("=");
+				String name = keyValue[0];
+				String description = keyValue[1];
+				all.put(name, description);
+			}
+			for (String s : parameters) {
+				if (!all.containsKey(s))
+					all.put(s, "");
+			}
+			List<ParameterInfo> infos = new ArrayList<ParameterInfo>();
+			for( Map.Entry<String,String> entry : all.entrySet() ) {
+				String name = entry.getKey();
+				String description = entry.getValue();
+				boolean isOptional = !contains(name, requiredParameters);
+				boolean isDotParameter = name.equals(dotParameter);
+				infos.add(new ParameterInfo(name, description, isOptional, isDotParameter));
+			}
+			out.print(interp.getArg(new ParameterList(infos),"do"));
+		}
+
+		private boolean contains(String name, String[] names) {
+			for (String s : names)
+				if (s.equals(name))
+					return true;
+			return false;
+		}
+
+		public static final CommandSpec see_also = CommandSpec.DO;
+
+		@Command public void see_also(IPrintWriter out, ScopedInterpreter<StringList> interp) {
+			out.print(interp.getArg(new StringList(Arrays.asList(seeAlso)),"do"));
+		}
+
+		@Command public void requires(IPrintWriter out, Interpreter interp) {
+			out.print( meaning.getRequiredNamespaces().iterator().next() );
+		}
+
+		@Command public void adds_namespace(IPrintWriter out, Interpreter interp) {
+			out.print( meaning.addsNamespace() != null );
+		}
+
+		@Command public void added_namespace(IPrintWriter out, Interpreter interp) {
+			out.print( meaning.addsNamespace() );
+		}
+
+		@Command public void binary_details(IPrintWriter out,Interpreter interp) {
+			out.print(meaning.getMethod());
+		}
+
+		public static final CommandSpec related_commands = CommandSpec.DO;
+
+		@Command public void related_commands(IPrintWriter out,ScopedInterpreter<MacroSourceNamespace.Commands> interp)
+			throws IOException, ServletException, CompileException
+		{
+			List<MacroSourceNamespace.CommandInfo> commands = relatedCommands();
+			Collections.sort(commands, MacroSourceNamespace.CommandInfo.MACRO_NAME_COMPARATOR);
+			Object block = interp.getArg(new MacroSourceNamespace.Commands(commands),"do");
+			out.print(block);
+		}
+
+		private List<MacroSourceNamespace.CommandInfo> relatedCommands() {
+			List<MacroSourceNamespace.CommandInfo> commands = new ArrayList<MacroSourceNamespace.CommandInfo>();
+			Class c = meaning.getMethod().getDeclaringClass();
+			for (Method method : c.getMethods()) {
+				if (method.getAnnotation(Command.class) != null) {
+					Meaning m = site.getProgram().getMeaning(c.getName() + '.' + method.getName());
+					if (m != null)
+						commands.add(new MacroSourceNamespace.CommandInfo(m, null, null));
+				}
+			}
+			return commands;
+		}
+	}
+
+	@Namespace (
+		name = "parameter_list",
+		global = true
+	)
+	public static final class ParameterList extends ListSequence<ParameterInfo> {
+		
+		public ParameterList(List<ParameterInfo> elements) {
+			super(elements);
+		}
+
+		public static final CommandSpec current_parameter = CommandSpec.DO;
+
+		@Command public void current_parameter(IPrintWriter out,ScopedInterpreter<ParameterInfo> interp) {
+			out.print(interp.getArg(get(),"do"));
+		}
+	}
+
+	@Namespace (
+		name = "parameter_info",
+		global = true
+	)
+	public static final class ParameterInfo {
+
+		private final String name;
+		private final String description;
+		private final boolean isOptional;
+		private final boolean isDotParameter;
+
+		public ParameterInfo(String name, String description, boolean isOptional, boolean isDotParameter) {
+			this.name = name;
+			this.description = description;
+			this.isOptional = isOptional;
+			this.isDotParameter = isDotParameter;
+		}
+
+		@Command("name") public void _name(IPrintWriter out,Interpreter interp) {
+			out.print(name);
+		}
+
+		@Command("description") public void _description(IPrintWriter out,Interpreter interp) {
+			out.print(description);
+		}
+
+		@Command public void is_optional(IPrintWriter out,Interpreter interp) {
+			out.print(isOptional);
+		}
+		
+		@Command public void is_dot_parameter(IPrintWriter out,Interpreter interp) {
+			out.print(isDotParameter);
+		}
+	}
+
+}