From c91f003551542c2aab62dd8ef89a7894c7e50689 Mon Sep 17 00:00:00 2001
From: Kenneth Russel <kbrussel@alum.mit.edu>
Date: Mon, 15 Jun 2009 22:42:48 +0000
Subject: Copied JOGL_2_SANDBOX r145 on to trunk; JOGL_2_SANDBOX branch is now
 closed

git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@147 a78bb65f-1512-4460-ba86-f6dc96a7bf27
---
 .../net/highteq/nativetaglet/NativeTaglet.java     | 227 +++++++++++++++++++++
 1 file changed, 227 insertions(+)
 create mode 100755 src/java/net/highteq/nativetaglet/NativeTaglet.java

(limited to 'src/java/net/highteq')

diff --git a/src/java/net/highteq/nativetaglet/NativeTaglet.java b/src/java/net/highteq/nativetaglet/NativeTaglet.java
new file mode 100755
index 0000000..5744253
--- /dev/null
+++ b/src/java/net/highteq/nativetaglet/NativeTaglet.java
@@ -0,0 +1,227 @@
+package net.highteq.nativetaglet;
+
+import com.sun.tools.doclets.Taglet;
+import com.sun.javadoc.*;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.Iterator;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.MalformedURLException;
+
+public class NativeTaglet implements Taglet
+{
+  private Properties mapping= null;
+  private static final String NAME = "native";
+
+  /**
+   * Return the name of this custom tag.
+   */
+  public String getName()
+  {
+    return NAME;
+  }
+
+  /**
+   * @return true since this tag can be used in a field
+   *         doc comment
+   */
+  public boolean inField()
+  {
+    return true;
+  }
+
+  /**
+   * @return true since this tag can be used in a constructor
+   *         doc comment
+   */
+  public boolean inConstructor()
+  {
+    return true;
+  }
+
+  /**
+   * @return true since this tag can be used in a method
+   *         doc comment
+   */
+  public boolean inMethod()
+  {
+    return true;
+  }
+
+  /**
+   * @return true since this tag can be used in an overview
+   *         doc comment
+   */
+  public boolean inOverview()
+  {
+    return true;
+  }
+
+  /**
+   * @return true since this tag can be used in a package
+   *         doc comment
+   */
+  public boolean inPackage()
+  {
+    return true;
+  }
+
+  /**
+   * @return true since this
+   */
+  public boolean inType()
+  {
+    return true;
+  }
+
+  /**
+   * Will return true since this is an inline tag.
+   *
+   * @return true since this is an inline tag.
+   */
+
+  public boolean isInlineTag()
+  {
+    return true;
+  }
+
+  /**
+   * Register this Taglet.
+   *
+   * @param tagletMap the map to register this tag to.
+   */
+  public static void register(Map tagletMap)
+  {
+    NativeTaglet tag = new NativeTaglet();
+    Taglet t = (Taglet) tagletMap.get(tag.getName());
+    if (t != null)
+      {
+        tagletMap.remove(tag.getName());
+      }
+    tagletMap.put(tag.getName(), tag);
+  }
+
+  /**
+   * Given the <code>Tag</code> representation of this custom
+   * tag, return its string representation.
+   *
+   * @param tag the <code>Tag</code> representation of this custom tag.
+   */
+  public String toString(Tag tag)
+  {
+    String text= tag.text().trim();
+    if(mapping== null)
+      {
+        mapping= new Properties();
+        InputStream in= null;
+        try
+          {
+            URL url;
+            try
+              {
+                url = new URL(System.getProperty("nativetaglet.mapping","file:native-taglet.properties"));
+              }
+            catch (MalformedURLException e)
+              {
+                url = new URL("file:"+System.getProperty("nativetaglet.mapping","file:native-taglet.properties"));
+              }
+            in= url.openStream();
+            mapping.load(in);
+          }
+        catch (Exception e)
+          {
+            System.err.println("[NATIVE TAGLET] Could not read mapping file");
+            System.err.println("-->");
+            e.printStackTrace(System.err);
+            System.err.println("<--");
+            System.err.println("[NATIVE TAGLET] !!! NO LINKS WILL BE GENERATED !!!");
+          }
+        finally
+          {
+            if(in!=null) try{ in.close(); }catch(Exception ignore){}
+          }
+      }
+
+    if(mapping!=null)
+      {
+        // First check to see whether this key exists in the mapping
+        String url = mapping.getProperty(text);
+        if (url == null) {
+          // Try iterating the keySet seeing if we can find a partial match
+          // In the OpenGL spec this handles the case of glVertex -> glVertex3f
+          for(Iterator i= mapping.keySet().iterator(); i.hasNext();) {
+            String name= (String) i.next();
+            if (hasOpenGLSuffix(text, name)) {
+              url = mapping.getProperty(name);
+              break;
+            }
+          }
+        }
+        if (url != null) {
+          url = mapping.getProperty("nativetaglet.baseUrl", "") + url;
+          text = "<a href=\"" + url + "\">" + text + "</a>";
+        }
+      }
+    return text;
+  }
+
+  private static final String[] openGLSuffixes = {
+    "b",
+    "s",
+    "i",
+    "f",
+    "d",
+    "ub",
+    "us",
+    "ui",
+    "bv",
+    "sv",
+    "iv",
+    "fv",
+    "dv",
+    "ubv",
+    "usv",
+    "uiv"
+  };
+  private static boolean hasOpenGLSuffix(String name,
+                                         String baseName) {
+    if (!name.startsWith(baseName)) {
+      return false;
+    }
+    for (int i = 0; i < openGLSuffixes.length; i++) {
+      String suffix = openGLSuffixes[i];
+      if (name.endsWith(suffix)) {
+        // First see whether it's a simple concatenation
+        if (name.equals(baseName + suffix)) {
+          return true;
+        }
+        // Now chop prefix and suffix off and see whether the
+        // resulting is a number
+        try {
+          String tmp = name.substring(baseName.length(),
+                                      name.length() - suffix.length());
+          if (tmp.length() == 1 &&
+              Character.isDigit(tmp.charAt(0))) {
+            return true;
+          }
+        } catch (IndexOutOfBoundsException e) {
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This method should not be called since arrays of inline tags do not
+   * exist.  Method {@link #tostring(Tag)} should be used to convert this
+   * inline tag to a string.
+   *
+   * @param tags the array of <code>Tag</code>s representing of this custom tag.
+   */
+  public String toString(Tag[] tags)
+  {
+    return null;
+  }
+}
-- 
cgit v1.2.3