import java.io.IOException; import writers.ClassWriter; import writers.FieldWriter; import writers.FunctionWriter; import writers.IndexWriter; import writers.LibraryWriter; import writers.Shared; import writers.XMLReferenceWriter; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.FieldDoc; import com.sun.javadoc.MethodDoc; import com.sun.javadoc.RootDoc; import com.sun.javadoc.Tag; import com.sun.tools.doclets.standard.Standard; /* * @author David Wicks * ProcessingWeblet generates the web reference for processing.org and download * The source code of processing is parsed for webref tags to determine what gets included * Flags for javadoc when running include: * -templatedir where to find the html templates for output * -examplesdir where to find the xml describing the examples to go in the reference * -localref the local reference output directory * -webref the web reference output directory * -corepackage pass in as many of these as necessary to have things considered as part of the core (not a library) e.g -corepackage processing.xml * -includedir where to find things that aren't in the source, but only in xml e.g. [] (arrayaccess) */ public class ProcessingWeblet extends Standard { private static String examplesFlag = "-examplesdir"; private static String templateFlag = "-templatedir"; private static String outputFlag = "-webref"; private static String exceptionsFlag = "-includedir"; private static String imagesFlag = "-imagedir"; private static String localFlag = "-localref"; private static String coreFlag = "-corepackage"; //to allow for exceptions like XML being in the core private static String verboseFlag = "-noisy"; private static String rootFlag = "-rootclass"; private static String xmlDescriptionFlag = "-includeXMLTag"; private static IndexWriter indexWriter; public static boolean start(RootDoc root) { setConfig(root.options()); Shared.i().createBaseDirectories(); indexWriter = new IndexWriter(); try { // write out everything in the .java files: // Classes, Methods, Fields ... see specific XxxWriters System.out.println("\n===Writing .javadoc sourced reference.==="); writeContents(root); // write out everything in the include directory: // see: /api_en/include System.out.println("===Source code @webref files written.==="); if (!Shared.i().getIncludeDirectory().equals("")) { System.out.println("\n===Writing XML-sourced reference.==="); XMLReferenceWriter.write( Shared.i().getIncludeDirectory(), indexWriter); System.out.println("===Include directory files written.==="); } // write out the index file System.out.println("\n===Telling the index to write itself.==="); indexWriter.write(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("===All finished in the weblet.==="); return true; } private static void setConfig(String[][] configOptions) { // Shared.i().corePackages.add("processing.core"); Shared.i().rootClasses.add("PApplet"); Shared.i().rootClasses.add("PConstants"); // look at all possible options (this .equals thing kills switch statements...or does it?) for (String[] option : configOptions) { if (option[0].equals(templateFlag)) { Shared.i().setTemplateDirectory(option[1]); } else if (option[0].equals(examplesFlag)) { Shared.i().setExampleDirectory(option[1]); } else if (option[0].equals(outputFlag)) { Shared.i().setOutputDirectory(option[1]); } else if (option[0].equals(exceptionsFlag)) { // write out files based on exceptions index Shared.i().setIncludeDirectory( option[1] ); } else if (option[0].equals(imagesFlag)) { Shared.i().setImageDirectory(option[1]); } else if( option[0].equals(localFlag) ) { Shared.i().setLocalOutputDirectory(option[1]); } else if( option[0].equals(coreFlag)){ Shared.i().corePackages.add(option[1]); } else if(option[0].equals(verboseFlag)){ Shared.i().setNoisy(true); } else if( option[0].equals(rootFlag)){ Shared.i().rootClasses.add(option[1]); } else if( option[0].equals(xmlDescriptionFlag) ) { Shared.i().addDescriptionTag( option[1] ); } } } public static int optionLength(String option) { if (option.equals(templateFlag) || option.equals(examplesFlag) || option.equals(outputFlag) || option.equals(rootFlag) || option.equals(exceptionsFlag) || option.equals(imagesFlag) || option.equals(localFlag) || option.equals(coreFlag) || option.equals(xmlDescriptionFlag)) { return 2; } else if ( option.equals(verboseFlag) ){ return 1; } return 0; } private static void writeContents(RootDoc root) throws IOException { for( ClassDoc classDoc : root.classes() ){ if(Shared.i().isCore(classDoc)){ // Document the core functions and classes if(Shared.i().isRootLevel(classDoc)){ //if it is in PApplet, PConstants or other classes where users can get //the variables without using dot syntax // document functions MethodDoc[] functions = classDoc.methods(); for (MethodDoc fn : functions) { // write out html reference FunctionWriter.write(fn); Tag[] tags = fn.tags(Shared.i().getWebrefTagName()); if (tags.length != 0) { // add to the index under the @webref category:sub_category indexWriter.addItem(fn, tags[0]); } } //also need to add fields for(FieldDoc doc : classDoc.fields()){ if(Shared.i().isWebref(doc)){ FieldWriter.write(doc); indexWriter.addItem(doc, doc.tags(Shared.i().getWebrefTagName())[0] ); } } } else { // document a class and its public properties new ClassWriter().write( classDoc ); Tag[] classTags = classDoc.tags(Shared.i().getWebrefTagName()); if (classTags.length != 0) { // add to the index under the @webref category:sub_category indexWriter.addItem(classDoc, classTags[0]); } } } else { // Document the library passed in if(Shared.i().isNoisy()) { System.out.println("Loaded class: " + classDoc.name()); } LibraryWriter writer = new LibraryWriter(); writer.write(classDoc.containingPackage()); } } } }