/* * WikiDocumentationHandler.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.xml; import dr.app.beast.BeastParser; import dr.app.tools.BeastParserDoc; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; /** * A subclass of XMLDocumentationHandler that creates output in MediaWiki format */ public class WikiDocumentationHandler extends XMLDocumentationHandler { private final static String WIKILINK = "[[Main Page|BEAST Documentation]]-> BEAST v1.5.x XML Reference"; public WikiDocumentationHandler(BeastParser parser) { super(parser); } public void outputElements(PrintWriter writer) { printDocWikiTitle(writer); Iterator iterator = parser.getParsers(); while (iterator.hasNext()) { XMLObjectParser xmlParser = (XMLObjectParser)iterator.next(); writer.println(xmlParser.toWiki(this)); // convert the html into wiki... System.out.println(" outputting Wiki for element " + xmlParser.getParserName()); } } private void printDocWikiTitle(PrintWriter writer) { Calendar date = Calendar.getInstance(); SimpleDateFormat dateformatter = new SimpleDateFormat("'updated on' d MMMM yyyy zzz"); writer.println(WIKILINK + "\n"); writer.println("==" + BeastParserDoc.TITTLE + "==\n"); if (parser.parsers != null) { if (parser.parsers.equalsIgnoreCase(BeastParser.RELEASE)) { writer.println("Release Version (" + dateformatter.format(date.getTime()) + ")"); System.out.println("Release Version"); } else if (parser.parsers.equalsIgnoreCase(BeastParser.DEV)) { writer.println("Development Version (" + dateformatter.format(date.getTime()) + ")"); System.out.println("Development Version"); } } writer.println(""); writer.println("The following is a list of valid elements in a beast file."); writer.println(""); } /** * Outputs all types that appear as required attributes or elements in an HTML table to the given writer. * @param writer PrintWriter */ public void outputTypes(PrintWriter writer) { writer.println("==BEAST types=="); writer.println(""); writer.println("The following is a list of generic types that elements represent in a beast file."); writer.println(""); // iterate through the types //Iterator iterator = requiredTypes.iterator(); for (Class requiredType : requiredTypes) { if (requiredType != Object.class) { String name = ClassComparator.getName(requiredType); System.out.println(" outputting Wiki for generic type " + name); TreeSet<String> matchingParserNames = new TreeSet<String>(); // find all parsers that match this required type Iterator i = parser.getParsers(); while (i.hasNext()) { XMLObjectParser xmlParser = (XMLObjectParser) i.next(); Class returnType = xmlParser.getReturnType(); if (requiredType.isAssignableFrom(returnType)) { matchingParserNames.add(xmlParser.getParserName()); } } if (!(matchingParserNames.size() == 1 && matchingParserNames.iterator().next().equals(name))) { // output table row containing the type and the matching parser names writer.println("===" + name + "==="); writer.println(); writer.println("Elements of this type include:"); writer.println(); i = matchingParserNames.iterator(); while (i.hasNext()) { String parserName = (String) i.next(); writer.println(":*" + getWikiLink(parserName)); } writer.println(); } } } } public String getHTMLForClass(Class c) { return getWikiLink(ClassComparator.getName(c)); } public String getWikiLink(String name) { if (Character.isUpperCase(name.charAt(0))) { // linking to a 'type' return "[[#" + name + "|" + name + "]]"; } else { // linking to an 'element' return "[[#<" + name + "> element|" + name + "]]"; } } }