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))))
|