aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/javadoc.clj
blob: d4f65ea3309f8d8277a505c3c995d8cecd3a8835 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
;   Copyright (c) Christophe Grand, November 2008. All rights reserved.

;   The use and distribution terms for this software are covered by the
;   Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
;   which can be found in the file CPL.TXT at the root of this distribution.
;   By using this software in any fashion, you are agreeing to be bound by
;   the terms of this license.
;   You must not remove this notice, or any other, from this software.

; thanks to Stuart Sierra

; a repl helper to quickly open javadocs.

(ns clojure.contrib.javadoc
    (:use clojure.contrib.javadoc.browse)
    (:import (java.io File)))

(def
 #^{:doc "Ref to a list of local paths for Javadoc-generated HTML
  files."}
 *local-javadocs* (ref (list)))
 
(def *core-java-api*
     "http://java.sun.com/javase/6/docs/api/")

(def
 #^{:doc "Ref to a map from package name prefixes to URLs for remote
  Javadocs."}
 *remote-javadocs*
 (ref (sorted-map
       "java." *core-java-api*
       "javax." *core-java-api*
       "org.ietf.jgss." *core-java-api*
       "org.omg." *core-java-api*
       "org.w3c.dom." *core-java-api*
       "org.xml.sax." *core-java-api*
       "org.apache.commons.codec." "http://commons.apache.org/codec/api-release/"
       "org.apache.commons.io." "http://commons.apache.org/io/api-release/"
       "org.apache.commons.lang." "http://commons.apache.org/lang/api-release/")))

(defn add-local-javadoc
  "Adds to the list of local Javadoc paths."
  [path]
  (dosync (commute *local-javadocs* conj path)))

(defn add-remote-javadoc
  "Adds to the list of remote Javadoc URLs.  package-prefix is the
  beginning of the package name that has docs at this URL."
  [package-prefix url]
  (dosync (commute *remote-javadocs* assoc package-prefix url)))

(defn find-javadoc-url
  "Searches for a URL for the given class name.  Tries
  *local-javadocs* first, then *remote-javadocs*.  Returns a string."
  [classname]
  (let [file-path (.replace classname \. File/separatorChar)
        url-path (.replace classname \. \/)]
    (if-let [file (first
                   (filter #(.exists %)
                           (map #(File. % (str file-path ".html"))
                                @*local-javadocs*)))]
      (str "file://" (.getAbsolutePath file))
      ;; If no local file, try remote URLs:
      (some (fn [[prefix url]]
                (when (.startsWith classname prefix)
                  (str url url-path ".html")))
            @*remote-javadocs*))))

(defn javadoc
  "Opens a browser window displaying the javadoc for the argument.
  Tries *local-javadocs* first, then *remote-javadocs*."
  [class-or-object]
  (let [c (if (instance? Class class-or-object) 
            class-or-object 
            (class class-or-object))]
    (if-let [url (find-javadoc-url (.getName c))]
        (browse-url url)
      (println "Could not find Javadoc for" c))))