From: <ko...@us...> - 2010-02-17 17:30:29
|
Revision: 17306 http://jedit.svn.sourceforge.net/jedit/?rev=17306&view=rev Author: kog13 Date: 2010-02-17 17:30:22 +0000 (Wed, 17 Feb 2010) Log Message: ----------- Re-tagging 0.1 Modified Paths: -------------- plugins/CodeBook/trunk/src/codebook/CodeBookPlugin.java plugins/CodeBook/trunk/src/codebook/java/JavaRunner.java Added Paths: ----------- plugins/CodeBook/tags/0.1/trunk/ plugins/CodeBook/tags/0.1/trunk/CodeBook.props plugins/CodeBook/tags/0.1/trunk/description.html plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/JavaRunner.java Removed Paths: ------------- plugins/CodeBook/tags/0.1/trunk/CodeBook.props plugins/CodeBook/tags/0.1/trunk/description.html plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java plugins/CodeBook/tags/0.1/trunk/src/codebook/java/JavaRunner.java Deleted: plugins/CodeBook/tags/0.1/trunk/CodeBook.props =================================================================== --- plugins/CodeBook/trunk/CodeBook.props 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/CodeBook.props 2010-02-17 17:30:22 UTC (rev 17306) @@ -1,42 +0,0 @@ -# ::mode=properties:: # -# Basic Plugin Information {{{ -plugin.codebook.CodeBookPlugin.activate=defer -plugin.codebook.CodeBookPlugin.author=Damien Radtke -plugin.codebook.CodeBookPlugin.description=Fill this in -plugin.codebook.CodeBookPlugin.docs=docs/CodeBook.html -plugin.codebook.CodeBookPlugin.longdescription=description.html -plugin.codebook.CodeBookPlugin.name=Code Book -plugin.codebook.CodeBookPlugin.usePluginHome=true -plugin.codebook.CodeBookPlugin.version=0.1 -# }}} Basic Plugin Information - -# Dependencies {{{ -plugin.codebook.CodeBookPlugin.depend.0=jedit 04.03.99.00 -plugin.codebook.CodeBookPlugin.depend.1=jdk 1.5 -#plugin.codebook.CodeBookPlugin.depend.2=plugin superabbrevs.SuperAbbrevsPlugin 0.32 -# FIXME: This dependency causes issues when jEdit boots up, but not when loaded manually -# }}} Dependencies - -# Messages {{{ -codebook.msg.invalid-api-download-url.title=Invalid URL -codebook.msg.invalid-api-download-url.message=Unable to find package list.\n\ - Please verify that you spelled the URL correctly. -codebook.msg.cannot-load-java-object.title=Can't load Java object -codebook.msg.cannot-load-java-object.message=Unable to load the requested java object. \ - See the activity log for details. -codebook.msg.download-api.title=Download Java Api -codebook.msg.download-api.message=Api Root URL: -codebook.msg.parse-remote-api.title=Parse Remote Api -codebook.msg.parse-remote-api.message=Api Root URL: -# }}} Messages - -# Menu {{{ -plugin.codebook.CodeBookPlugin.menu=codebook-run - codebook-java-download-api \ - codebook-java-parse-api-local codebook-java-parse-api-remote -plugin.codebook.CodeBookPlugin.menu.label=Code Book -codebook-run.label=Run Completion -codebook-java-download-api.label=Download Java Api -codebook-java-parse-api-local.label=Parse Local Java Api -codebook-java-parse-api-remote.label=Parse Remote Java Api -# }}} Menu - Copied: plugins/CodeBook/tags/0.1/trunk/CodeBook.props (from rev 17277, plugins/CodeBook/trunk/CodeBook.props) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/CodeBook.props (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/CodeBook.props 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,43 @@ +# ::mode=properties:: # +# Basic Plugin Information {{{ +plugin.codebook.CodeBookPlugin.activate=defer +plugin.codebook.CodeBookPlugin.author=Damien Radtke +plugin.codebook.CodeBookPlugin.description=Code Book is a reference and code-completion plugin \ + that parses language documentation to make it available within jEdit. Currently only Java \ + is supported. +plugin.codebook.CodeBookPlugin.docs=docs/CodeBook.html +plugin.codebook.CodeBookPlugin.longdescription=description.html +plugin.codebook.CodeBookPlugin.name=Code Book +plugin.codebook.CodeBookPlugin.usePluginHome=true +plugin.codebook.CodeBookPlugin.version=0.1 +# }}} Basic Plugin Information + +# Dependencies {{{ +plugin.codebook.CodeBookPlugin.depend.0=jedit 04.03.99.00 +plugin.codebook.CodeBookPlugin.depend.1=jdk 1.5 +plugin.codebook.CodeBookPlugin.depend.2=plugin SuperAbbrevsPlugin 0.32 +# }}} Dependencies + +# Messages {{{ +codebook.msg.invalid-api-download-url.title=Invalid URL +codebook.msg.invalid-api-download-url.message=Unable to find package list.\n\ + Please verify that you spelled the URL correctly. +codebook.msg.cannot-load-java-object.title=Can't load Java object +codebook.msg.cannot-load-java-object.message=Unable to load the requested java object. \ + See the activity log for details. +codebook.msg.download-api.title=Download Java Api +codebook.msg.download-api.message=Api Root URL: +codebook.msg.parse-remote-api.title=Parse Remote Api +codebook.msg.parse-remote-api.message=Api Root URL: +# }}} Messages + +# Menu {{{ +plugin.codebook.CodeBookPlugin.menu=codebook-run - codebook-java-download-api \ + codebook-java-parse-api-local codebook-java-parse-api-remote +plugin.codebook.CodeBookPlugin.menu.label=Code Book +codebook-run.label=Run Completion +codebook-java-download-api.label=Download Java Api +codebook-java-parse-api-local.label=Parse Local Java Api +codebook-java-parse-api-remote.label=Parse Remote Java Api +# }}} Menu + Deleted: plugins/CodeBook/tags/0.1/trunk/description.html =================================================================== --- plugins/CodeBook/trunk/description.html 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/description.html 2010-02-17 17:30:22 UTC (rev 17306) @@ -1 +0,0 @@ -<html><p>Fill this in.</p></html> Copied: plugins/CodeBook/tags/0.1/trunk/description.html (from rev 17276, plugins/CodeBook/trunk/description.html) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/description.html (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/description.html 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,5 @@ +<html><p> +Code Book provides referencing and code-completion for a potentially unlimited number +of languages, although currently only Java is supported. The plugin parses Api documents +and uses that information to provide extremely robust completion. +</p></html> Deleted: plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html =================================================================== Copied: plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html (from rev 17276, plugins/CodeBook/trunk/docs/CodeBook.html) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/docs/CodeBook.html 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <!-- a comment --> + <head> + <title>Code Book Plugin</title> + </head> + <body bgcolor="#FFFFFF"> + <table summary="Header" bgcolor="#CCCCFF" cellspacing=0 border=0 width="100%" cols=2> + <tr width="100%"> + <td valign=TOP> + <strong><font size="+2">Code Book</font></strong> + </td> + <td valign=TOP align=RIGHT> + <font size="-1"><p /><strong>Version 0.1</strong><p />Damien Radtke</font> + </td> + </tr> + </table> + <table summary="Introduction" border=0 cellspacing=0 cellpadding=3 width="100%"> + <tr align=CENTER width="100%"> + <td bgcolor="#7FB2FF" width="100%"> + <strong><font color="#FFFFFF" size="+1"><a name=intro>Introduction</a></font></strong> + </td> + </tr> + </table> + <p> + Code Book is a reference and code-completion plugin that depends on the parsing + of Api documents for its source. Currently only Java is supported, but future releases + will add support for other languages such as C, C++ and Python. + <p> + For suggestions on what languages to add support for, provided the language has some + form of consistent documentation that can be automatically parsed, my e-mail is + dam...@gm.... I am always looking for ways to improve this plugin, + so general feedback is also welcome. + <p> + <table summary="Features" border=0 cellspacing=0 cellpadding=3 width="100%"> + <tr align=CENTER width="100%"> + <td bgcolor="#7FB2FF" width="100%"> + <strong><font color="#FFFFFF" size="+1"><a name=intro>Features</a></font></strong> + </td> + </tr> + </table> + <p> + This being the first release, the features list is fairly minimal. + <p> + Supported languages: + <ul> + <li> Java + <ul> + <li> Code Completion + <li> Api Downloading + </ul> + </ul> + <p> + Planned features: + <ul> + <li> Api Lookup <i>(for quick Api referencing through InfoViewer)</i> + <li> Project support <i>(full reference of the active project)</i> + <li> SideKick variable parsing + <li> More languages + </ul> + <p> + <table summary="Code Completion" border=0 cellspacing=0 cellpadding=3 width="100%"> + <tr align=CENTER width="100%"> + <td bgcolor="#7FB2FF" width="100%"> + <strong><font color="#FFFFFF" size="+1"><a name=intro>Code Completion</a></font></strong> + </td> + </tr> + </table> + <p> + Before code completion can be used, the plugin needs to parse some Api documents. + It is highly recommended that you parse the standard Java documents (http://java.sun.com/javase/6/docs/api/), + and for jEdit developers the jEdit api (http://www.jedit.org/api, or in doc/api of the + jEdit installation directory). Be aware, though, that the parsing process can take + some time, depending on the size of the Api and the internet speed. The Java Api, while + extremely useful, is also quite large. Patience is a virtue. + <p> + To parse some documents go to Plugins -> Code Book, and then you have two options: + <ul> + <li> Parse Local Java Api + <li> Parse Remote Java Api + </ul> + You can choose to parse Api documents on the internet, or if you + have them saved locally you can parse them from your hard drive. + If you parse a remote Api, all you need to do is enter in the URL of the root folder + for the documents in the pop-up window. For parsing locally, a file browser will let you + locate the root directory on your system. NOTE: both of these methods require selecting the + root directory, which is the directory that includes "index.html", but do not include the + file itself. + <p> + Once the plugin is done parsing, you can now activate code-completion. Completion is activated + via the "Run Completion" action in the plugin menu, and it is highly recommended that you + assign this to a shortcut key. + <p> + The Java completion has three modes, depending on what is in front of the cursor: + <ul> + <li> "." : If the character in front of the cursor is a dot, then methods and fields + will be displayed. + <li> "(" : If it's an opening parenthese, constructors will be displayed. + <li> If none of these, then the package will be inserted, provided the word at the cursor + is a valid classname. + </ul> + <p> + Basic buffer parsing for local variables is supported, but it is very limited, and only + variables defined recently in the local scope will be found. + <p> + <table summary="Api Downloading" border=0 cellspacing=0 cellpadding=3 width="100%"> + <tr align=CENTER width="100%"> + <td bgcolor="#7FB2FF" width="100%"> + <strong><font color="#FFFFFF" size="+1"><a name=intro>Api Downloading</a></font></strong> + </td> + </tr> + </table> + <p> + Because sometimes internet can be slow, it may be better to download an Api and then parse + it locally rather than parsing it remotely. This will also become extremely handy if you ever + find yourself without internet but need to look up something in the Api. For these reasons, + Code Book includes the ability to download a remote set of Api documents to your computer. + <p> + The downloading process is fairly simple. From the plugin menu select "Download Java Api". + You will need to specify the URL for the remote Api, and then a file browser + will pop up for you to choose where to save it. It is recommended that you create a new + folder to save the documents to, otherwise there may be an explosion of files + where you didn't expect there to be. + <p> + </body> +</html> \ No newline at end of file Deleted: plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java =================================================================== --- plugins/CodeBook/trunk/src/codebook/CodeBookPlugin.java 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -1,75 +0,0 @@ -package codebook; -// imports {{{ -import org.gjt.sp.util.Log; -import org.gjt.sp.jedit.EditPlugin; -import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.Macros; -import org.gjt.sp.jedit.MiscUtilities; -import org.gjt.sp.jedit.Buffer; -import org.gjt.sp.jedit.textarea.JEditTextArea; - -import javax.swing.tree.DefaultMutableTreeNode; -import java.util.Collection; -import java.util.HashSet; -import java.io.File; -import java.io.FilenameFilter; -// }}} imports -public class CodeBookPlugin extends EditPlugin { - //public static final String HOME = getPluginHome(jEdit.getPlugin("codebook.CodeBookPlugin")).getPath(); - public static final String HOME = "/home/damien/.jedit/plugins/codebook.CodeBookPlugin/"; - - public void start() {} - public void stop() {} - - /* - public static void javadocTest() { - final String pkgRegex = "^package\\s*.*;$"; // Used to find a buffer's package - new Thread(new Runnable() { - public void run() { - try { - if (!MiscUtilities.isToolsJarAvailable()) { - Macros.message(jEdit.getActiveView(), "Tools.jar not found. Aborting."); - return; - } - Macros.message(jEdit.getActiveView(), "Generating javadocs for the current project..."); - projectviewer.vpt.VPTProject proj = projectviewer.ProjectViewer.getActiveProject(jEdit.getActiveView()); - Collection<projectviewer.vpt.VPTNode> nodes = proj.getOpenableNodes(); - for (projectviewer.vpt.VPTNode node : nodes) { - if (node == null || node.isDirectory()) continue; - String path = node.getNodePath(); - if (!path.endsWith(".java")) continue; - // Save this in a temporary directory - new File("/tmp/javadoc").mkdir(); - String[] args = {"-d", "/tmp/javadoc", path}; - com.sun.tools.javadoc.Main.execute(args); - } - Macros.message(jEdit.getActiveView(), "Javadocs created in /tmp/javadoc"); - } catch (Exception e) { - System.out.print("Caught an exception: "); - e.printStackTrace(); - } - } - }).start(); - } - */ - - public static void run(JEditTextArea textArea) { - String mode = textArea.getBuffer().getMode().getName(); - try { - // Call the appropriate runner class - if (mode.equals("java") || mode.equals("groovy") || mode.equals("beanshell")) { - codebook.java.JavaRunner.run(textArea); - } - } catch (Exception e) { - Log.log(Log.ERROR,CodeBookPlugin.class,"Error running. "+e+" ("+e.getMessage()+")"); - } - } - public static void complete(JEditTextArea textArea, String complete) { - String mode = textArea.getBuffer().getMode().getName(); - // Call the appropriate complete method - if (mode.equals("java") || mode.equals("groovy") || mode.equals("beanshell")) { - codebook.java.JavaRunner.complete(textArea, complete); - } - } -} -/* ::mode=java:: */ \ No newline at end of file Copied: plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java (from rev 17276, plugins/CodeBook/trunk/src/codebook/CodeBookPlugin.java) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/CodeBookPlugin.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,74 @@ +package codebook; +// imports {{{ +import org.gjt.sp.util.Log; +import org.gjt.sp.jedit.EditPlugin; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.Macros; +import org.gjt.sp.jedit.MiscUtilities; +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.textarea.JEditTextArea; + +import javax.swing.tree.DefaultMutableTreeNode; +import java.util.Collection; +import java.util.HashSet; +import java.io.File; +import java.io.FilenameFilter; +// }}} imports +public class CodeBookPlugin extends EditPlugin { + public static final String HOME = getPluginHome(jEdit.getPlugin("codebook.CodeBookPlugin")).getPath()+File.separator; + + public void start() {} + public void stop() {} + + /* + public static void javadocTest() { + final String pkgRegex = "^package\\s*.*;$"; // Used to find a buffer's package + new Thread(new Runnable() { + public void run() { + try { + if (!MiscUtilities.isToolsJarAvailable()) { + Macros.message(jEdit.getActiveView(), "Tools.jar not found. Aborting."); + return; + } + Macros.message(jEdit.getActiveView(), "Generating javadocs for the current project..."); + projectviewer.vpt.VPTProject proj = projectviewer.ProjectViewer.getActiveProject(jEdit.getActiveView()); + Collection<projectviewer.vpt.VPTNode> nodes = proj.getOpenableNodes(); + for (projectviewer.vpt.VPTNode node : nodes) { + if (node == null || node.isDirectory()) continue; + String path = node.getNodePath(); + if (!path.endsWith(".java")) continue; + // Save this in a temporary directory + new File("/tmp/javadoc").mkdir(); + String[] args = {"-d", "/tmp/javadoc", path}; + com.sun.tools.javadoc.Main.execute(args); + } + Macros.message(jEdit.getActiveView(), "Javadocs created in /tmp/javadoc"); + } catch (Exception e) { + System.out.print("Caught an exception: "); + e.printStackTrace(); + } + } + }).start(); + } + */ + + public static void run(JEditTextArea textArea) { + String mode = textArea.getBuffer().getMode().getName(); + try { + // Call the appropriate runner class + if (mode.equals("java") || mode.equals("groovy") || mode.equals("beanshell")) { + codebook.java.JavaRunner.run(textArea); + } + } catch (Exception e) { + Log.log(Log.ERROR,CodeBookPlugin.class,"Error running. "+e+" ("+e.getMessage()+")"); + } + } + public static void complete(JEditTextArea textArea, String complete) { + String mode = textArea.getBuffer().getMode().getName(); + // Call the appropriate complete method + if (mode.equals("java") || mode.equals("groovy") || mode.equals("beanshell")) { + codebook.java.JavaRunner.complete(textArea, complete); + } + } +} +/* ::mode=java:: */ \ No newline at end of file Deleted: plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java =================================================================== --- plugins/CodeBook/trunk/src/codebook/java/ApiParser.java 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -1,333 +0,0 @@ -package codebook.java; -// imports {{{ -import org.gjt.sp.jedit.View; -import java.net.URL; -import java.io.InputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.io.InputStreamReader; -import java.util.Scanner; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -// }}} imports -/** - * @author Damien Radtke - * class ApiParser - * A class that extracts data from Java Api pages - */ -public class ApiParser { - // NOTE: This modifier list may not be complete - public static final String[] MODIFIERS = new String[] { "final", "synchronized" }; - public static final String[] VISIBILITY = new String[] { "public", "protected", "private" }; - // parseAPI() {{{ - /** - * Parses an entire API by reading through the class list and calling parse() on each class - * @param path the location of the api to parse (root folder) - * @param remote true if the api is online, false if local - */ - public static void parseAPI(final View view, String _path, final boolean remote) { - final String sep = (remote) ? "/" : File.separator; - final String path = (_path.endsWith(sep)) ? _path : _path+sep; - view.getStatus().setMessage("Preparing to parse..."); - new Thread(new Runnable() { - public void run() { - LinkedList<String> clsList = new LinkedList<String>(); - try { - String classlist = readPage(path+"allclasses-frame.html", remote); - Pattern p = Pattern.compile("<A HREF=\".*?>.*?</A>"); - Matcher m = p.matcher(classlist); - while (m.find()) { - String page = classlist.substring(m.start()+9, classlist.indexOf("\"", m.start()+9)); - clsList.add(path+page); - } - int total = clsList.size(); - int i = 1; - for (final String cls : clsList) { - view.getStatus().setMessage("("+i+" / "+total+") Parsing "+cls+"..."); - parse(cls, remote); - i++; - } - } catch (Exception e) { - // Unable to parse API - view.getStatus().setMessage("Ran into an error parsing api."); - e.printStackTrace(); - System.exit(0); - } - view.getStatus().setMessageAndClear("Api parsing complete"); - } - }).start(); - } - public static void parseAPI(View view, String path) { - parseAPI(view, path, path.startsWith("http://")); - } - // }}} parseAPI() - // parse() {{{ - /** - * Parses an api page - * @param path the location of the page to parse - * @param remote true if the page is online, false if local - */ - public static void parse(String path, boolean remote) { - JavaClass jcl = new JavaClass(); - String text = null; - try { - text = readPage(path, remote); - } catch (Exception e) { - // Couldn't read page - //view.getStatus().setMessage("Couldn't read page: "+e); - e.printStackTrace(); - System.exit(0); - //return; - } - // Parse class data - String classData = pullSection(text, "<!-- ======== START OF CLASS DATA ======== -->", false); - if (!classData.isEmpty()) { - int br = classData.indexOf("<BR>"); - String pkg = clearTags(classData.substring(0, br)).trim(); - int pre = classData.indexOf("</H2>", br); - String title = clearTags(classData.substring(br, pre)).trim(); - String name = title.substring(title.indexOf(" ")+1); - if (name.indexOf("<") != -1) name = name.substring(0, name.indexOf("<")); - //view.getStatus().setMessage("Name: "+name); - jcl.setPackage(pkg); - jcl.setName(name); - //view.getStatus().setMessage(name); - } - // Parse field data - String fieldData = pullSection(text, "<!-- =========== FIELD SUMMARY =========== -->", true); - if (!fieldData.isEmpty()) { - Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); - Matcher m = p.matcher(fieldData); - while (m.find()) { - String field = fieldData.substring(m.start(), m.end()); - if (field.indexOf("Deprecated.") != -1 || field.indexOf("Field Summary") != -1) continue; - int br = field.indexOf("<BR>"); - String field_value = clearTags(field.substring(0, br)).trim(); - String field_desc = clearTags(field.substring(br, field.length())).trim(); - boolean is_static = false; - if (field_value.startsWith("static ")) { - is_static = true; - field_value = field_value.substring(7); - } - String vis = "public"; - for (int i=0; i<VISIBILITY.length; i++) { - if (field_value.startsWith(VISIBILITY[i]+" ")) { - vis = VISIBILITY[i]; - field_value = field_value.substring(VISIBILITY[i].length()+1); - } - } - int space = field_value.indexOf(" "); - String field_type = field_value.substring(0, space); - field_value = field_value.substring(space+1); - - //view.getStatus().setMessage(field_value+" : "+field_type+" ["+field_desc+"] ("+is_static+")"); - jcl.addField(field_value, field_type, field_desc, vis, is_static); - } - } - // Parse constructor data - String constructorData = pullSection(text, "<!-- ======== CONSTRUCTOR SUMMARY ======== -->", true); - if (!constructorData.isEmpty()) { - Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); - Matcher m = p.matcher(constructorData); - while (m.find()) { - String con = constructorData.substring(m.start(), m.end()); - if (con.indexOf("Deprecated.") != -1 || con.indexOf("Constructor Summary") != -1) continue; - int br = con.indexOf("<BR>"); - String con_value = clearTags(con.substring(0, br)).trim(); - String con_desc = clearTags(con.substring(br, con.length())).trim(); - //view.getStatus().setMessage(con_value+" ["+con_desc+"]"); - jcl.addConstructor(con_value, con_desc); - } - } - // Parse method data - String methodData = pullSection(text, "<!-- ========== METHOD SUMMARY =========== -->", true); - if (!methodData.isEmpty()) { - Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); - Matcher m = p.matcher(methodData); - while (m.find()) { - String method = methodData.substring(m.start(), m.end()); - if (method.indexOf("Deprecated.") != -1 || method.indexOf("Method Summary") != -1) continue; - int br = method.indexOf("<BR>", method.indexOf("</FONT>")); - if (br == -1) { - int end = methodData.indexOf("</TR>", m.end()+1); - method = methodData.substring(m.start(), end); - br = method.indexOf("<BR>", method.indexOf("</FONT>")); - } - String method_value = clearTags(method.substring(0, br)).trim(); - String method_desc = clearTags(method.substring(br, method.length())).trim(); - boolean is_static = false; - if (method_value.startsWith("static ")) { - method_value = method_value.substring(7); - is_static = true; - } - String vis = "public"; - for (int i=0; i<VISIBILITY.length; i++) { - if (method_value.startsWith(VISIBILITY[i]+" ")) { - vis = VISIBILITY[i]; - method_value = method_value.substring(VISIBILITY[i].length()+1); - } - } - int space = method_value.lastIndexOf(" ", method_value.indexOf("(")); - String method_type = method_value.substring(0, space); - method_value = method_value.substring(space+1); - jcl.addMethod(method_value, method_type, method_desc, vis, is_static); - //view.getStatus().setMessage(method_value+" : "+method_type+" ["+method_desc+"] ("+is_static+")"); - } - } - jcl.save(); - } - public static void parse(String path) { - parse(path, path.startsWith("http://")); - } - // }}} parse - // pullSection() {{{ - /** - * Reads the section with the given comment header and returns it - * @param text the text to pull a section from - * @param header the comment header (such as <!-- ======== START OF CLASS DATA ======== -->) - * @param isTable true if the information under the header is stored in a table. - * This is necessary in order to be able to correctly determine the end of the section - * @return the text contained in this section - */ - private static String pullSection(String text, String header, boolean isTable) { - // This method determines the end of the section by searching for the next comment - // if "isTable" is true, the search must begin after the first <TABLE> tag - int i = text.indexOf(header); - if (i == -1) - return ""; - i += header.length(); - int j = (isTable) ? text.indexOf("<!--", text.indexOf("<TABLE ", i)) : text.indexOf("<!--", i); - return text.substring(i, j); - } - // }}} pullSection() - // clearTags() {{{ - /** - * Removes all HTML tags from the supplied text and converts from XML code (e.g. <) to ASCII characters - * @param text the text to remove HTML tags from - * @return the cleared text - */ - private static String clearTags(String text) { - text = text.replace("</CODE>", " "); - text = text.replace(" ", " "); - text = text.replaceAll("<.*?>", ""); - text = text.replace(">", ">"); - text = text.replace("<", "<"); - text = text.replaceAll("\\s{2,}", " "); // Remove large spaces - // Remove any potential modifiers we don't need - text = text.replace("abstract ", ""); - text = text.replace("synchronized ", ""); - text = text.replace("native ", ""); - text = text.replace("final ", ""); - text = text.replace("strictfp ", ""); - return text; - } - // }}} clearTags() - // readPage() {{{ - /** - * Reads a single Api page and returns its text - * @param path the location of the page to read - * @param remote true if the page is online, false if local - */ - private static String readPage(String path, boolean remote) throws Exception { - StringBuffer text = new StringBuffer(""); - InputStream in = null; - if (remote) - in = new URL(path).openConnection().getInputStream(); - else - in = new FileInputStream(new File(path)); - Scanner read = new Scanner(new InputStreamReader(in)); - while (read.hasNext()) { - text.append(read.next()+" "); - } - // Convert all HTML tags to uppercase, but ignore quoted literals inside those tags - final String tagRegex = "<.*?>"; - Pattern tagPattern = Pattern.compile(tagRegex); - Matcher tagMatcher = tagPattern.matcher(text); - while (tagMatcher.find()) { - StringBuffer str = new StringBuffer(text.substring(tagMatcher.start(), - tagMatcher.end())); - final String quoteRegex = "\".*?\"|'.*?'"; - Pattern quotePattern = Pattern.compile(quoteRegex); - Matcher quoteMatcher = quotePattern.matcher(str); - int i = 0; - while (quoteMatcher.find()) { - String toCaps = str.substring(i, quoteMatcher.start()); - str.replace(i, quoteMatcher.start(), toCaps.toUpperCase()); - i = quoteMatcher.end(); - } - text.replace(tagMatcher.start(), tagMatcher.end(), str.toString()); - } - return text.toString(); - } - // }}} readPage() - // class JavaClass {{{ - /** - * @author Damien Radtke - * class JavaClass - * This class stores parsed data, which is written out to .dat files - */ - public static class JavaClass implements Serializable { - private String pkg; - private String name; - private ArrayList<String[]> fields; // {val, type, desc, vis, static | instance} - private ArrayList<String[]> constructors; // {val, desc} - private ArrayList<String[]> methods; // {val, type, desc, vis, static | instance} - - JavaClass() { - fields = new ArrayList<String[]>(); - constructors = new ArrayList<String[]>(); - methods = new ArrayList<String[]>(); - } - - public void setPackage(String pkg) { this.pkg = pkg; } - public void setName(String name) { this.name = name; } - - public void addField(String val, String type, String desc, String vis, boolean is_static) { - String[] field = new String[] { val, type, desc, vis, is_static ? "static" : "instance" }; - fields.add(field); - } - - public void addConstructor(String val, String desc) { - String[] con = new String[] { val, desc }; - constructors.add(con); - } - - public void addMethod(String val, String type, String desc, String vis, boolean is_static) { - String[] method = new String[] { val, type, desc, vis, is_static ? "static" : "instance" }; - methods.add(method); - } - - public String getPackage() { return this.pkg; } - public String getName() { return this.name; } - public ArrayList<String[]> getFields() { return this.fields; } - public ArrayList<String[]> getConstructors() { return this.constructors; } - public ArrayList<String[]> getMethods() { return this.methods; } - - public void save() { - String _name = new String(name); - int lt = -1; - if ((lt = _name.indexOf("<")) != -1) _name = _name.substring(0, lt); - String s = File.separator; - String classDir = codebook.CodeBookPlugin.HOME+"java"+s+"api"+s+_name+s; - try { - File classDirFile = new File(classDir); - if (!classDirFile.exists()) classDirFile.mkdirs(); - File dat = new File(classDir+pkg); - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dat)); - out.writeObject(this); - out.close(); - //view.getStatus().setMessage("Class data saved to "+dat.getPath()); - } catch (Exception e) { - // Couldn't save data - e.printStackTrace(); - System.exit(0); - } - } - } - // }}} JavaClass -} Copied: plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java (from rev 17276, plugins/CodeBook/trunk/src/codebook/java/ApiParser.java) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/java/ApiParser.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,336 @@ +package codebook.java; +// imports {{{ +import org.gjt.sp.jedit.View; +import org.gjt.sp.util.Log; + +import java.net.URL; +import java.io.InputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.io.InputStreamReader; +import java.util.Scanner; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +// }}} imports +/** + * @author Damien Radtke + * class ApiParser + * A class that extracts data from Java Api pages + */ +public class ApiParser { + // NOTE: This modifier list may not be complete + public static final String[] MODIFIERS = new String[] { "final", "synchronized" }; + public static final String[] VISIBILITY = new String[] { "public", "protected", "private" }; + // parseAPI() {{{ + /** + * Parses an entire API by reading through the class list and calling parse() on each class + * @param path the location of the api to parse (root folder) + * @param remote true if the api is online, false if local + */ + public static void parseAPI(final View view, String _path, final boolean remote) { + final String sep = (remote) ? "/" : File.separator; + final String path = (_path.endsWith(sep)) ? _path : _path+sep; + view.getStatus().setMessage("Preparing to parse..."); + new Thread(new Runnable() { + public void run() { + LinkedList<String> clsList = new LinkedList<String>(); + try { + String classlist = readPage(path+"allclasses-frame.html", remote); + Pattern p = Pattern.compile("<A HREF=\".*?>.*?</A>"); + Matcher m = p.matcher(classlist); + while (m.find()) { + String page = classlist.substring(m.start()+9, classlist.indexOf("\"", m.start()+9)); + clsList.add(path+page); + } + int total = clsList.size(); + int i = 1; + for (final String cls : clsList) { + view.getStatus().setMessage("("+i+" / "+total+") Parsing "+cls+"..."); + parse(cls, remote); + i++; + } + } catch (Exception e) { + // Unable to parse API + view.getStatus().setMessage("Ran into an error parsing api."); + e.printStackTrace(); + System.exit(0); + } + view.getStatus().setMessageAndClear("Api parsing complete"); + } + }).start(); + } + public static void parseAPI(View view, String path) { + parseAPI(view, path, path.startsWith("http://")); + } + // }}} parseAPI() + // parse() {{{ + /** + * Parses an api page + * @param path the location of the page to parse + * @param remote true if the page is online, false if local + */ + public static void parse(String path, boolean remote) { + JavaClass jcl = new JavaClass(); + String text = null; + try { + text = readPage(path, remote); + } catch (Exception e) { + // Couldn't read page + //view.getStatus().setMessage("Couldn't read page: "+e); + e.printStackTrace(); + System.exit(0); + //return; + } + // Parse class data + String classData = pullSection(text, "<!-- ======== START OF CLASS DATA ======== -->", false); + if (!classData.isEmpty()) { + int br = classData.indexOf("<BR>"); + String pkg = clearTags(classData.substring(0, br)).trim(); + int pre = classData.indexOf("</H2>", br); + String title = clearTags(classData.substring(br, pre)).trim(); + String name = title.substring(title.indexOf(" ")+1); + if (name.indexOf("<") != -1) name = name.substring(0, name.indexOf("<")); + //view.getStatus().setMessage("Name: "+name); + jcl.setPackage(pkg); + jcl.setName(name); + //view.getStatus().setMessage(name); + } + // Parse field data + String fieldData = pullSection(text, "<!-- =========== FIELD SUMMARY =========== -->", true); + if (!fieldData.isEmpty()) { + Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); + Matcher m = p.matcher(fieldData); + while (m.find()) { + String field = fieldData.substring(m.start(), m.end()); + if (field.indexOf("Deprecated.") != -1 || field.indexOf("Field Summary") != -1) continue; + int br = field.indexOf("<BR>"); + String field_value = clearTags(field.substring(0, br)).trim(); + String field_desc = clearTags(field.substring(br, field.length())).trim(); + boolean is_static = false; + if (field_value.startsWith("static ")) { + is_static = true; + field_value = field_value.substring(7); + } + String vis = "public"; + for (int i=0; i<VISIBILITY.length; i++) { + if (field_value.startsWith(VISIBILITY[i]+" ")) { + vis = VISIBILITY[i]; + field_value = field_value.substring(VISIBILITY[i].length()+1); + } + } + int space = field_value.indexOf(" "); + String field_type = field_value.substring(0, space); + field_value = field_value.substring(space+1); + + //view.getStatus().setMessage(field_value+" : "+field_type+" ["+field_desc+"] ("+is_static+")"); + jcl.addField(field_value, field_type, field_desc, vis, is_static); + } + } + // Parse constructor data + String constructorData = pullSection(text, "<!-- ======== CONSTRUCTOR SUMMARY ======== -->", true); + if (!constructorData.isEmpty()) { + Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); + Matcher m = p.matcher(constructorData); + while (m.find()) { + String con = constructorData.substring(m.start(), m.end()); + if (con.indexOf("Deprecated.") != -1 || con.indexOf("Constructor Summary") != -1) continue; + int br = con.indexOf("<BR>"); + String con_value = clearTags(con.substring(0, br)).trim(); + String con_desc = clearTags(con.substring(br, con.length())).trim(); + //view.getStatus().setMessage(con_value+" ["+con_desc+"]"); + jcl.addConstructor(con_value, con_desc); + } + } + // Parse method data + String methodData = pullSection(text, "<!-- ========== METHOD SUMMARY =========== -->", true); + if (!methodData.isEmpty()) { + Pattern p = Pattern.compile("<TR .*?>.*?</TR>"); + Matcher m = p.matcher(methodData); + while (m.find()) { + String method = methodData.substring(m.start(), m.end()); + if (method.indexOf("Deprecated.") != -1 || method.indexOf("Method Summary") != -1) continue; + int br = method.indexOf("<BR>", method.indexOf("</FONT>")); + if (br == -1) { + int end = methodData.indexOf("</TR>", m.end()+1); + method = methodData.substring(m.start(), end); + br = method.indexOf("<BR>", method.indexOf("</FONT>")); + } + String method_value = clearTags(method.substring(0, br)).trim(); + String method_desc = clearTags(method.substring(br, method.length())).trim(); + boolean is_static = false; + if (method_value.startsWith("static ")) { + method_value = method_value.substring(7); + is_static = true; + } + String vis = "public"; + for (int i=0; i<VISIBILITY.length; i++) { + if (method_value.startsWith(VISIBILITY[i]+" ")) { + vis = VISIBILITY[i]; + method_value = method_value.substring(VISIBILITY[i].length()+1); + } + } + int space = method_value.lastIndexOf(" ", method_value.indexOf("(")); + String method_type = method_value.substring(0, space); + method_value = method_value.substring(space+1); + jcl.addMethod(method_value, method_type, method_desc, vis, is_static); + //view.getStatus().setMessage(method_value+" : "+method_type+" ["+method_desc+"] ("+is_static+")"); + } + } + jcl.save(); + } + public static void parse(String path) { + parse(path, path.startsWith("http://")); + } + // }}} parse + // pullSection() {{{ + /** + * Reads the section with the given comment header and returns it + * @param text the text to pull a section from + * @param header the comment header (such as <!-- ======== START OF CLASS DATA ======== -->) + * @param isTable true if the information under the header is stored in a table. + * This is necessary in order to be able to correctly determine the end of the section + * @return the text contained in this section + */ + private static String pullSection(String text, String header, boolean isTable) { + // This method determines the end of the section by searching for the next comment + // if "isTable" is true, the search must begin after the first <TABLE> tag + int i = text.indexOf(header); + if (i == -1) + return ""; + i += header.length(); + int j = (isTable) ? text.indexOf("<!--", text.indexOf("<TABLE ", i)) : text.indexOf("<!--", i); + return text.substring(i, j); + } + // }}} pullSection() + // clearTags() {{{ + /** + * Removes all HTML tags from the supplied text and converts from XML code (e.g. <) to ASCII characters + * @param text the text to remove HTML tags from + * @return the cleared text + */ + private static String clearTags(String text) { + text = text.replace("</CODE>", " "); + text = text.replace(" ", " "); + text = text.replaceAll("<.*?>", ""); + text = text.replace(">", ">"); + text = text.replace("<", "<"); + text = text.replaceAll("\\s{2,}", " "); // Remove large spaces + // Remove any potential modifiers we don't need + text = text.replace("abstract ", ""); + text = text.replace("synchronized ", ""); + text = text.replace("native ", ""); + text = text.replace("final ", ""); + text = text.replace("strictfp ", ""); + return text; + } + // }}} clearTags() + // readPage() {{{ + /** + * Reads a single Api page and returns its text + * @param path the location of the page to read + * @param remote true if the page is online, false if local + */ + private static String readPage(String path, boolean remote) throws Exception { + StringBuffer text = new StringBuffer(""); + InputStream in = null; + if (remote) + in = new URL(path).openConnection().getInputStream(); + else + in = new FileInputStream(new File(path)); + Scanner read = new Scanner(new InputStreamReader(in)); + while (read.hasNext()) { + text.append(read.next()+" "); + } + // Convert all HTML tags to uppercase, but ignore quoted literals inside those tags + final String tagRegex = "<.*?>"; + Pattern tagPattern = Pattern.compile(tagRegex); + Matcher tagMatcher = tagPattern.matcher(text); + while (tagMatcher.find()) { + StringBuffer str = new StringBuffer(text.substring(tagMatcher.start(), + tagMatcher.end())); + final String quoteRegex = "\".*?\"|'.*?'"; + Pattern quotePattern = Pattern.compile(quoteRegex); + Matcher quoteMatcher = quotePattern.matcher(str); + int i = 0; + while (quoteMatcher.find()) { + String toCaps = str.substring(i, quoteMatcher.start()); + str.replace(i, quoteMatcher.start(), toCaps.toUpperCase()); + i = quoteMatcher.end(); + } + text.replace(tagMatcher.start(), tagMatcher.end(), str.toString()); + } + return text.toString(); + } + // }}} readPage() + // class JavaClass {{{ + /** + * @author Damien Radtke + * class JavaClass + * This class stores parsed data, which is written out to .dat files + */ + public static class JavaClass implements Serializable { + private String pkg; + private String name; + private ArrayList<String[]> fields; // {val, type, desc, vis, static | instance} + private ArrayList<String[]> constructors; // {val, desc} + private ArrayList<String[]> methods; // {val, type, desc, vis, static | instance} + + JavaClass() { + fields = new ArrayList<String[]>(); + constructors = new ArrayList<String[]>(); + methods = new ArrayList<String[]>(); + } + + public void setPackage(String pkg) { this.pkg = pkg; } + public void setName(String name) { this.name = name; } + + public void addField(String val, String type, String desc, String vis, boolean is_static) { + String[] field = new String[] { val, type, desc, vis, is_static ? "static" : "instance" }; + fields.add(field); + } + + public void addConstructor(String val, String desc) { + String[] con = new String[] { val, desc }; + constructors.add(con); + } + + public void addMethod(String val, String type, String desc, String vis, boolean is_static) { + String[] method = new String[] { val, type, desc, vis, is_static ? "static" : "instance" }; + methods.add(method); + } + + public String getPackage() { return this.pkg; } + public String getName() { return this.name; } + public ArrayList<String[]> getFields() { return this.fields; } + public ArrayList<String[]> getConstructors() { return this.constructors; } + public ArrayList<String[]> getMethods() { return this.methods; } + + public void save() { + String _name = new String(name); + int lt = -1; + if ((lt = _name.indexOf("<")) != -1) _name = _name.substring(0, lt); + String s = File.separator; + String classDir = codebook.CodeBookPlugin.HOME+"java"+s+"api"+s+_name+s; + Log.log(Log.DEBUG,ApiParser.class,"classdir = "+classDir); + try { + File classDirFile = new File(classDir); + if (!classDirFile.exists()) classDirFile.mkdirs(); + File dat = new File(classDir+pkg); + ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dat)); + out.writeObject(this); + out.close(); + //view.getStatus().setMessage("Class data saved to "+dat.getPath()); + } catch (Exception e) { + // Couldn't save data + e.printStackTrace(); + System.exit(0); + } + } + } + // }}} JavaClass +} Deleted: plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java =================================================================== --- plugins/CodeBook/trunk/src/codebook/java/BufferParser.java 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -1,59 +0,0 @@ -package codebook.java; -// imports {{{ -import java.util.HashMap; - -import org.gjt.sp.jedit.textarea.TextArea; -import org.gjt.sp.util.StandardUtilities; -import org.gjt.sp.util.Log; -// }}} imports -/** - * @author Damien Radtke - * class BufferParser - * Handles buffer parsing for java and related modes - */ -public class BufferParser { - // TODO: Implement buffer parsing on save via sidekick - // getScopeVars() {{{ - /** - * This method starts at the cursor and reads up the buffer as long as indentation remains the same. - * @param textArea the currently editing text area - * @return a var->class hashmap of variables found in this scope - */ - public static HashMap<String, String> getScopeVars(TextArea textArea) { - HashMap<String, String> map = new HashMap<String, String>(); - int i = textArea.getCaretLine(); - String line = textArea.getLineText(i); - int space = StandardUtilities.getLeadingWhiteSpace(line); - final String regex = "^\\w+?(<.*?>)*?\\s+?\\w*?(\\s*?=.*?|\\s*?;)"; - while (StandardUtilities.getLeadingWhiteSpace(line = textArea.getLineText(i)) == space) { - // Parse this line - Log.log(Log.DEBUG,BufferParser.class,"Starting line: "+line); - line = line.trim(); - for (int j=0; j<ApiParser.MODIFIERS.length; j++) { - if (line.startsWith(ApiParser.MODIFIERS[j]+" ")) { - line = line.substring(ApiParser.MODIFIERS[j].length()+1); - } - } - if (line.matches(regex)) { - try { - // Add the var to map - int end = line.indexOf("="); - if (end == -1) end = line.indexOf(";"); - do { - end--; - } while (line.charAt(end) == ' '); - int sp = line.lastIndexOf(" ", end); - String var = line.substring(sp+1, end+1); - String cls = line.substring(0, sp).trim(); - if (cls.indexOf("<") != -1) cls = cls.substring(0, cls.indexOf("<")); - //org.gjt.sp.jedit.Macros.message(org.gjt.sp.jedit.jEdit.getActiveView(), var+" : "+cls); - map.put(var, cls); - } catch (Exception e) {} - } - Log.log(Log.DEBUG,BufferParser.class,"Ending line: "+line); - i--; - } - return map; - } - // }}} getScopeVars() -} Copied: plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java (from rev 17276, plugins/CodeBook/trunk/src/codebook/java/BufferParser.java) =================================================================== --- plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java (rev 0) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/java/BufferParser.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -0,0 +1,57 @@ +package codebook.java; +// imports {{{ +import java.util.HashMap; + +import org.gjt.sp.jedit.textarea.TextArea; +import org.gjt.sp.util.StandardUtilities; +import org.gjt.sp.util.Log; +// }}} imports +/** + * @author Damien Radtke + * class BufferParser + * Handles buffer parsing for java and related modes + */ +public class BufferParser { + // TODO: Implement buffer parsing on save via sidekick + // getScopeVars() {{{ + /** + * This method starts at the cursor and reads up the buffer as long as indentation remains the same. + * @param textArea the currently editing text area + * @return a var->class hashmap of variables found in this scope + */ + public static HashMap<String, String> getScopeVars(TextArea textArea) { + HashMap<String, String> map = new HashMap<String, String>(); + int i = textArea.getCaretLine(); + String line = textArea.getLineText(i); + int space = StandardUtilities.getLeadingWhiteSpace(line); + final String regex = "^\\w+?(<.*?>)*?\\s+?\\w*?(\\s*?=.*?|\\s*?;)"; + while (StandardUtilities.getLeadingWhiteSpace(line = textArea.getLineText(i)) == space) { + // Parse this line + line = line.trim(); + for (int j=0; j<ApiParser.MODIFIERS.length; j++) { + if (line.startsWith(ApiParser.MODIFIERS[j]+" ")) { + line = line.substring(ApiParser.MODIFIERS[j].length()+1); + } + } + if (line.matches(regex)) { + try { + // Add the var to map + int end = line.indexOf("="); + if (end == -1) end = line.indexOf(";"); + do { + end--; + } while (line.charAt(end) == ' '); + int sp = line.lastIndexOf(" ", end); + String var = line.substring(sp+1, end+1); + String cls = line.substring(0, sp).trim(); + if (cls.indexOf("<") != -1) cls = cls.substring(0, cls.indexOf("<")); + //org.gjt.sp.jedit.Macros.message(org.gjt.sp.jedit.jEdit.getActiveView(), var+" : "+cls); + map.put(var, cls); + } catch (Exception e) {} + } + i--; + } + return map; + } + // }}} getScopeVars() +} Deleted: plugins/CodeBook/tags/0.1/trunk/src/codebook/java/JavaRunner.java =================================================================== --- plugins/CodeBook/trunk/src/codebook/java/JavaRunner.java 2010-02-15 03:26:11 UTC (rev 17273) +++ plugins/CodeBook/tags/0.1/trunk/src/codebook/java/JavaRunner.java 2010-02-17 17:30:22 UTC (rev 17306) @@ -1,247 +0,0 @@ -package codebook.java; -// imports {{{ -import codebook.gui.ChooserDialog; - -import java.io.File; -import java.io.FileInputStream; -import java.io.ObjectInputStream; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.StringTokenizer; - -import org.gjt.sp.util.Log; -import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.textarea.JEditTextArea; -import org.gjt.sp.jedit.TextUtilities; -// }}} imports -/** - * @author Damien Radtke - * class JavaRunner - * This class is called when the keystroke is activated on a java (or similar) file - */ -public class JavaRunner { - // TODO: Replace this - public static final String dir = "/home/damien/.jedit/plugins/codebook.CodeBookPlugin/java/"; - public static enum Trigger { DOT, PARENTHESE, NONE }; - // run() {{{ - /** - * The main run method - * @param textArea the text area instance - */ - public static void run(JEditTextArea textArea) { - int line = textArea.getCaretLine(); - int pos = textArea.getCaretPosition()-textArea.getLineStartOffset(line); - String text = textArea.getLineText(line).substring(0, pos); - // See if it's a class or nested class first - int beg = TextUtilities.findWordStart(text, pos-1, "._("); - String cls = text.substring(beg, pos); - Trigger trigger = Trigger.NONE; - if (cls.endsWith(".")) { - trigger = Trigger.DOT; - cls = cls.substring(0, cls.length()-1); - pos--; - } else if (cls.endsWith("(")) { - trigger = Trigger.PARENTHESE; - cls = cls.substring(0, cls.length()-1); - pos--; - } - String[] pkgs = getPackages(cls); - if (pkgs == null) { - // Variable? - beg = TextUtilities.findWordStart(text, pos-1, "_"); - String var = text.substring(beg, pos); - HashMap<String, String> scopeVars = BufferParser.getScopeVars(textArea); - if ((cls = scopeVars.get(var)) != null) { - // Found it within the scope - pkgs = getPackages(cls); - if (pkgs == null) return; - if (trigger == Trigger.DOT) { - // TODO: Display instance methods/fields - ApiParser.JavaClass ob = getClassOb(textArea, cls, pkgs); - if (ob == null) return; - if (trigger == Trigger.DOT) { - // Display instance methods/fields - ArrayList<String[]> methods = ob.getMethods(); - ArrayList<String[]> fields = ob.getFields(); - ArrayList<String[]> complete = new ArrayList<String[]>(); - for (String[] method : methods) { - if (method[4].equals("instance") && method[3].equals("public")) { - String[] m = new String[2]; - m[0] = method[0]+" : "+method[1]; - m[1] = method[2]; - complete.add(m); - } - } - for (String[] field : fields) { - if (field[4].equals("instance") && field[3].equals("public")) { - String[] f = new String[2]; - f[0] = field[0]+" : "+field[1]; - f[1] = field[2]; - complete.add(f); - } - } - Log.log(Log.DEBUG,JavaRunner.class,"Complete list: "+complete+", size: "+complete.size()); - new codebook.gui.Popup(textArea, complete); - } - } - } else { - // TODO: Search vars parsed from sidekick on save - } - } else { - // It was a class - ApiParser.JavaClass ob = (ApiParser.JavaClass) getClassOb(textArea, cls, pkgs); - if (trigger == Trigger.DOT) { - // Display static methods/fields - ArrayList<String[]> methods = ob.getMethods(); - ArrayList<String[]> fields = ob.getFields(); - ArrayList<String[]> complete = new ArrayList<String[]>(); - for (String[] method : methods) { - if (method[4].equals("static") && method[3].equals("public")) { - String[] m = new String[2]; - m[0] = method[0]+" : "+method[1]; - m[1] = method[2]; - complete.add(m); - } - } - for (String[] field : fields) { - if (field[4].equals("static") && field[3].equals("public")) { - String[] f = new String[2]; - f[0] = field[0]+" : "+field[1]; - f[1] = field[2]; - complete.add(f); - } - } - Log.log(Log.DEBUG,JavaRunner.class,"Complete list: "+complete+", size: "+complete.size()); - new codebook.gui.Popup(textArea, complete); - } else if (trigger == Trigger.PARENTHESE) { - // Display constructors - new codebook.gui.Popup(textArea, ob.getConstructors()); - } else { - // Insert package - textArea.getBuffer().insert(textArea.getLineStartOffset(line)+beg, ob.getPackage()+"."); - } - } - } - // }}} run() - // getClassOb() {{{ - /** - * Takes a class name and list of potential packages and returns the appropriate data object. - * @param cls the name of the class - * @param pkgs a list of packages associated with the class - */ - private static ApiParser.JavaClass getClassOb(JEditTextArea textArea, String cls, String[] pkgs) { - // TODO: Show a dialog to choose which package if there are multiples - Log.log(Log.DEBUG,JavaRunner.class,"Packages: "+java.util.Arrays.toString(pkgs)); - String pkg = (pkgs.length <= 1) ? pkgs[0] : (new ChooserDialog(textArea, pkgs)).getChosen(); - String s = File.separator; - try { - String path = getClassObjectDir(cls)+s+pkg; - File dat = new File(path); - Log.log(Log.DEBUG,JavaRunner.class,"Loading Java class ob at "+path); - ObjectInputStream in = new ObjectInputStream(new FileInputStream(dat)); - ApiParser.JavaClass ob = (ApiParser.JavaClass) in.readObject(); - return ob; - } catch (Exception e) { - Log.log(Log.ERROR,JavaRunner.class, - "Error loading class object "+cls+": "+e+" ("+e.getMessage()+")"); - return null; - } - } - // }}} getClassOb() - // getPackages() {{{ - /** - * Returns an arraylist of valid package names for the given class, or null if not a valid class - * @param cls the classname to test - * @return an arraylist of valid packages, or null if the class was not found - */ - public static String[] getPackages(String cls) { - Log.log(Log.DEBUG,JavaRunner.class,"Fetching packages for class "+cls); - try { - ArrayList<String> pkgs = new ArrayList<String>(); - String[] pkgArray = new File(getClassObjectDir(cls)).list(); - for (String s : pkgArray) { - pkgs.add(s); - } - return pkgs.toArray(pkgArray); - } catch (Exception e) { - return null; - } - } - // }}} getPackages() - // getClassObjectDir() {{{ - /** - * Convenience method to locate the directory of a given class - * @param cls the classname to locate - * @return the directory of this class - */ - private static String getClassObjectDir(String cls) { - String s = File.separator; - try { - File fdir = null; - String path = null; - if (jEdit.getPlugin("projectviewer.ProjectPlugin") != null) { - // If projectviewer is installed, look in the active project - String proj = projectviewer.ProjectViewer.getActiveProject( - jEdit.getActiveView()).getName(); - path = dir+s+"project"+s+proj+s+cls; - fdir = new File(path); - } - if (fdir == null || !fdir.exists()) { - path = dir+"api"+s+cls; - Log.log(Log.DEBUG,JavaRunner.class,"Class ob dir: "+path); - fdir = new File(path); - } - if (fdir == null || !fdir.exists()) return null; - return path; - } catch (Exception e) { - return null; - } - } - // }}} getClassObjectDir() - // complete() {{{ - /** - * Insert text into the textarea - */ - public static void complete(JEditTextArea textArea, String complete) { - // If complete has parameters, modify string for use with superabbrevs - int p1 = complete.indexOf("("); - if (p1 != -1) { - int p2 = complete.indexOf(")", p1); - if (p2 != -1) { - String params = complete.substring(p1+1, p2); - String new_params = ""; - ArrayList<Integer> seps = new ArrayList<Integer>(); - int index = 0; - int comma = -1; - while ((comma = params.indexOf(",", index)) != -1) { - int b1 = 0, b2 = 0; - for (int i = 0; i<comma; i++) { - char c = params.charAt(i); - if (c == '<') b1++; - else if (c == '>') b2++; - } - if (b1 == b2) seps.add(comma); - index = comma+1; - } - for (int j=0; j<seps.size(); j++) { - int beg = (j == 0) ? 0 : seps.get(j-1)+1; - String param = params.substring(beg, seps.get(j))... [truncated message content] |