org.python.indexer.demos.HtmlDemo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-slim Show documentation
Show all versions of jython-slim Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
/**
* Copyright 2009, Google Inc. All rights reserved.
* Licensed to PSF under a Contributor Agreement.
*/
package org.python.indexer.demos;
import org.python.indexer.Indexer;
import org.python.indexer.NBinding;
import org.python.indexer.StyleRun;
import org.python.indexer.Util;
import java.io.File;
import java.util.List;
/**
* Simple proof-of-concept demo app for the indexer. Generates a static-html
* cross-referenced view of the code in a file or directory, using the index to
* create links and outlines.
*
* The demo not attempt to show general cross references (declarations and uses
* of a symbol) from the index, nor does it display the inferred type
* information or generated error/warning diagnostics. It could be made to do
* these things, as well as be made more configurable and generally useful, with
* additional effort.
*
* Run it from jython source tree root dir with; e.g., to index /usr/lib/python2.4/email
*
* ant jar && java -classpath ./dist/jython.jar org.python.indexer.demos.HtmlDemo /usr/lib/python2.4 /usr/lib/python2.4/email
*
*
* Fully indexing the Python standard library may require a more complete build to pick up all the dependencies:
*
* rm -rf ./html/ && ant clean && ant jar && ant jar-complete && java -classpath ./dist/jython.jar org.python.indexer.demos.HtmlDemo /usr/lib/python2.4 /usr/lib/python2.4
*
*
* You can alternately use Jython's version of the Python library.
* The following command will index the whole thing:
*
* ant jar-complete && java -classpath ./dist/jython.jar org.python.indexer.demos.HtmlDemo ./CPythonLib ./CPythonLib
*
*/
public class HtmlDemo {
private static final File OUTPUT_DIR =
new File(new File("./html").getAbsolutePath());
private static final String CSS =
".builtin {color: #5b4eaf;}\n" +
".comment, .block-comment {color: #005000; font-style: italic;}\n" +
".constant {color: #888888;}\n" +
".decorator {color: #778899;}\n" +
".doc-string {color: #005000;}\n" +
".error {border-bottom: 1px solid red;}\n" +
".field-name {color: #2e8b57;}\n" +
".function {color: #880000;}\n" +
".identifier {color: #8b7765;}\n" +
".info {border-bottom: 1px dotted RoyalBlue;}\n" +
".keyword {color: #0000cd;}\n" +
".lineno {color: #aaaaaa;}\n" +
".number {color: #483d8b;}\n" +
".parameter {color: #2e8b57;}\n" +
".string {color: #4169e1;}\n" +
".type-name {color: #4682b4;}\n" +
".warning {border-bottom: 1px dotted orange;}\n";
private Indexer indexer;
private File rootDir;
private String rootPath;
private Linker linker;
private void makeOutputDir() throws Exception {
if (!OUTPUT_DIR.exists()) {
OUTPUT_DIR.mkdirs();
info("created directory: " + OUTPUT_DIR.getAbsolutePath());
}
}
private void start(File stdlib, File fileOrDir) throws Exception {
rootDir = fileOrDir.isFile() ? fileOrDir.getParentFile() : fileOrDir;
rootPath = rootDir.getCanonicalPath();
indexer = new Indexer();
indexer.addPath(stdlib.getCanonicalPath());
info("building index...");
indexer.loadFileRecursive(fileOrDir.getCanonicalPath());
indexer.ready();
info(indexer.getStatusReport());
generateHtml();
}
private void generateHtml() throws Exception {
info("generating html...");
makeOutputDir();
linker = new Linker(rootPath, OUTPUT_DIR);
linker.findLinks(indexer);
int rootLength = rootPath.length();
for (String path : indexer.getLoadedFiles()) {
if (!path.startsWith(rootPath)) {
continue;
}
File destFile = Util.joinPath(OUTPUT_DIR, path.substring(rootLength));
destFile.getParentFile().mkdirs();
String destPath = destFile.getAbsolutePath() + ".html";
String html = markup(path);
Util.writeFile(destPath, html);
}
info("wrote " + indexer.getLoadedFiles().size() + " files to " + OUTPUT_DIR);
}
private String markup(String path) throws Exception {
String source = Util.readFile(path);
List styles = new Styler(indexer, linker).addStyles(path, source);
styles.addAll(linker.getStyles(path));
source = new StyleApplier(path, source, styles).apply();
String outline = new HtmlOutline(indexer).generate(path);
return ""
+ "\n"
+ "\n\n"
+ ""
+ outline
+ " "
+ "" + addLineNumbers(source) + "
"
+ "
";
}
private String addLineNumbers(String source) {
StringBuilder result = new StringBuilder((int)(source.length() * 1.2));
int count = 1;
for (String line : source.split("\n")) {
result.append("");
result.append(count++);
result.append(" ");
result.append(line);
result.append("\n");
}
return result.toString();
}
private static void abort(String msg) {
System.err.println(msg);
System.exit(1);
}
private static void info(Object msg) {
System.out.println(msg);
}
private static void usage() {
info("Usage: java org.python.indexer.HtmlDemo ");
info(" first arg specifies the root of the python standard library");
info(" second arg specifies file or directory for which to generate the index");
info("Example that generates an index for just the email libraries:");
info(" java org.python.indexer.HtmlDemo ./CPythonLib ./CPythonLib/email");
System.exit(0);
}
private static File checkFile(String path) {
File f = new File(path);
if (!f.canRead()) {
abort("Path not found or not readable: " + path);
}
return f;
}
public static void main(String[] args) throws Exception {
if (args.length != 2) {
usage();
}
File fileOrDir = checkFile(args[1]);
File stdlib = checkFile(args[0]);
if (!stdlib.isDirectory()) {
abort("Not a directory: " + stdlib);
}
new HtmlDemo().start(stdlib, fileOrDir);
}
}