Skip to content

Commit 7126d25

Browse files
committed
Prerelease edits
* Avoid naming clash with existing auto referred javadoc * Add useful exception when using less than minimum java version * Separate namespaces into impl and api
1 parent e5218d8 commit 7126d25

File tree

5 files changed

+99
-271
lines changed

5 files changed

+99
-271
lines changed

README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# java.javadocs
1+
# clojure.java.doc
22

33
A Clojure library for accessing JDK javadocs in your REPL
44

@@ -7,8 +7,8 @@ A Clojure library for accessing JDK javadocs in your REPL
77
### deps.edn
88

99
```clojure
10-
{:deps {org.clojure/java.javadoc {:git/url "https://github.com/clojure/java.javadoc"
11-
:git/sha "b98dfbc6360964ae5831ed21f4b794f05568e8d0"}}}
10+
{:deps {org.clojure/clojure.java.doc {:git/url "https://github.com/clojure/java.javadoc"
11+
:git/sha "b98dfbc6360964ae5831ed21f4b794f05568e8d0"}}}
1212
```
1313

1414
### In the REPL with add-libs
@@ -19,53 +19,53 @@ For usage without modifying your project deps:
1919
;; This require is only necessary if not in user namespace
2020
(require '[clojure.repl.deps :refer [add-lib]])
2121

22-
(add-lib 'org.clojure/java.javadoc)
22+
(add-lib 'org.clojure/clojure.java.doc)
2323

24-
(require '[java-javadocs.core :refer [javadoc javadoc-data]])
24+
(require '[clojure.java.doc.api :refer [jdoc jdoc-data]])
2525

2626
;; Now you can use it
27-
(javadoc String)
27+
(jdoc String)
2828
```
2929

3030
### From the Command Line
3131

3232
Invoke directly from the command line, useful for piping into a .md file to display in your editor:
3333

3434
```bash
35-
clojure -Sdeps '{:deps {org.clojure/java.javadoc {:git/url "https://github.com/clojure/java.javadoc" :git/sha "b98dfbc6360964ae5831ed21f4b794f05568e8d0"}}}' \
36-
-M -e "(require '[java-javadocs.core :refer [javadoc]]) (javadoc String)"
35+
clojure -Sdeps '{:deps {org.clojure/clojure.java.doc {:git/url "https://github.com/clojure/clojure.java.doc" :git/sha "b98dfbc6360964ae5831ed21f4b794f05568e8d0"}}}' \
36+
-M -e "(require '[clojure.java.doc.api :refer [jdoc]]) (jdoc String)"
3737
```
3838

3939
## Usage
4040

4141
The core namespace provides two functions:
4242

43-
### javadoc
43+
### jdoc
4444

4545
Prints a markdown formatted version of the javadoc description:
4646

4747
```clojure
48-
(require '[java-javadocs.core :refer [javadoc javadoc-data]])
48+
(require '[clojure.java.doc.api :refer [jdoc jdoc-data]])
4949

5050
;; Print class description
51-
(javadoc String)
51+
(jdoc String)
5252

5353
;; Print all overloads of a method
54-
(javadoc String/valueOf)
54+
(jdoc String/valueOf)
5555

5656
;; Specify a specific overload using param-tags
57-
(javadoc ^[char/1] String/valueOf)
57+
(jdoc ^[char/1] String/valueOf)
5858

5959
;; Use _ to match any type:
60-
(javadoc ^[_ int int] String/.substring)
60+
(jdoc ^[_ int] String/.substring)
6161
```
6262

63-
### javadoc-md
63+
### jdoc-data
6464

6565
Returns structured data instead of printing:
6666

6767
```clojure
68-
(javadoc-data String)
68+
(jdoc-data String)
6969
;; => {:classname "java.lang.String"
7070
;; :class-description-html "..."
7171
;; :class-description-md "..."
@@ -75,7 +75,7 @@ Returns structured data instead of printing:
7575
;; :clojure-call "^[int] String/valueOf"}
7676
;; ...]}
7777

78-
(javadoc-data ^[char/1] String/valueOf)
78+
(jdoc-data ^[char/1] String/valueOf)
7979
;; => {:classname "java.lang.String"
8080
;; :class-description-html "..."
8181
;; :class-description-md "..."

src/clojure/java/doc/api.clj

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
(ns clojure.java.doc.api
2+
(:require
3+
[clojure.java.doc.impl :refer [parse-javadoc print-javadoc]]))
4+
5+
(defn javadoc-data-fn [s param-tags]
6+
(parse-javadoc s param-tags))
7+
8+
(defn javadoc-fn [s param-tags]
9+
(print-javadoc (javadoc-data-fn s param-tags)))
10+
11+
(defmacro jdoc-data
12+
"a map containg javadoc data for a class or method
13+
Examples:
14+
(jdoc-data String) ; Get class data
15+
(jdoc-data String/valueOf) ; Get data for all valueOf overloads
16+
(jdoc-data ^[char/1] String/valueOf) ; Get data for specific overload"
17+
[class-or-method]
18+
`(javadoc-data-fn ~(str class-or-method) '~(:param-tags (meta class-or-method))))
19+
20+
(defmacro jdoc
21+
"print javadoc for a class or method
22+
Examples:
23+
(jdoc String) ; Print class description
24+
(jdoc String/valueOf) ; Print all valueOf overloads
25+
(jdoc ^[char/1] String/valueOf) ; Print specific overload"
26+
[class-or-method]
27+
`(javadoc-fn ~(str class-or-method) '~(:param-tags (meta class-or-method))))

src/java_javadocs/core.clj renamed to src/clojure/java/doc/impl.clj

Lines changed: 53 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
1-
(ns java-javadocs.core
1+
(ns clojure.java.doc.impl
22
(:require
33
[clojure.string :as str])
44
(:import [com.vladsch.flexmark.html2md.converter FlexmarkHtmlConverter]
55
[org.jsoup Jsoup]))
66

77
(set! *warn-on-reflection* true)
88

9-
(defn javadoc-url [^String classname]
9+
(defn- check-java-version [^String version-str]
10+
(let [version (Integer/parseInt version-str)
11+
min-version 17]
12+
(when (< version min-version)
13+
(throw (ex-info
14+
(str "Java " min-version " or higher is required. Current version: " version-str)
15+
{:current-version version-str
16+
:minimum-version min-version})))))
17+
18+
(defn- javadoc-url [^String classname]
1019
(let [java-version (System/getProperty "java.specification.version")
20+
_ (check-java-version java-version)
1121
classname (str/replace classname #"\$.*" "")
1222
klass (Class/forName classname)
1323
module-name (.getName (.getModule klass))
1424
url-path (.replace classname \. \/)]
1525
(str "https://docs.oracle.com/en/java/javase/" java-version "/docs/api/" module-name "/" url-path ".html")))
1626

17-
(defn html-to-md [^String html]
27+
(defn- html-to-md [^String html]
1828
(.convert ^FlexmarkHtmlConverter (.build (FlexmarkHtmlConverter/builder)) html))
1929

2030
(defn- resolve-class-name [class-part]
@@ -105,71 +115,47 @@
105115
(str "^[" (str/join " " clojure-types) "] " class-part separator method-name))
106116
(str class-part separator method-name))))
107117

108-
(defn parse-javadoc
109-
"parse the javadoc HTML for a class or method into a data structure:
110-
{:classname 'java.lang.String'
111-
:class-description-html '...'
112-
:class-description-md '...'
113-
:methods [...]
114-
:selected-method [{:signature 'valueOf(char[] data)'
115-
:description 'Returns the string representation...'
116-
:static? true
117-
:clojure-call '^[char/1] String/valueOf'
118-
:method-description-html '...'
119-
:method-description-md '...'}]}"
120-
[s param-tags]
121-
(let [[class-part method-part] (str/split s #"/\.?" 2)
122-
class-name (resolve-class-name class-part)
123-
doc (Jsoup/parse (slurp (javadoc-url class-name)))
124-
class-desc-section (.selectFirst doc "section.class-description")
125-
method-rows (.select doc "div.method-summary-table.col-second")
126-
all-methods (vec (for [^org.jsoup.nodes.Element method-div method-rows]
127-
(let [desc-div ^org.jsoup.nodes.Element (.nextElementSibling method-div)
128-
signature (.text (.select method-div "code"))
129-
modifier-div ^org.jsoup.nodes.Element (.previousElementSibling method-div)
130-
modifier-html (when modifier-div (.html modifier-div))
131-
is-static? (and modifier-html (str/includes? modifier-html "static"))]
132-
{:signature signature
133-
:description (.text (.select desc-div ".block"))
134-
:static? is-static?
135-
:clojure-call (clojure-call-syntax class-part signature is-static?)})))
136-
class-html (.outerHtml class-desc-section)
137-
result {:classname class-name
138-
:class-description-html class-html
139-
:class-description-md (html-to-md class-html)
140-
:methods all-methods}]
141-
(if method-part
142-
(let [filtered (filter-methods all-methods method-part param-tags)]
143-
(assoc result :selected-method
144-
(mapv #(get-method-detail doc %) filtered)))
145-
result)))
146-
147-
(defn javadoc-data-fn [s param-tags]
148-
(parse-javadoc s param-tags))
149-
150-
(defn- print-javadoc [{:keys [class-description-md selected-method]}]
118+
(defn parse-javadoc
119+
"parse the javadoc HTML for a class or method into a data structure:
120+
{:classname 'java.lang.String'
121+
:class-description-html '...'
122+
:class-description-md '...'
123+
:methods [...]
124+
:selected-method [{:signature 'valueOf(char[] data)'
125+
:description 'Returns the string representation...'
126+
:static? true
127+
:clojure-call '^[char/1] String/valueOf'
128+
:method-description-html '...'
129+
:method-description-md '...'}]}"
130+
[s param-tags]
131+
(let [[class-part method-part] (str/split s #"/\.?" 2)
132+
class-name (resolve-class-name class-part)
133+
doc (Jsoup/parse (slurp (javadoc-url class-name)))
134+
class-desc-section (.selectFirst doc "section.class-description")
135+
method-rows (.select doc "div.method-summary-table.col-second")
136+
all-methods (vec (for [^org.jsoup.nodes.Element method-div method-rows]
137+
(let [desc-div ^org.jsoup.nodes.Element (.nextElementSibling method-div)
138+
signature (.text (.select method-div "code"))
139+
modifier-div ^org.jsoup.nodes.Element (.previousElementSibling method-div)
140+
modifier-html (when modifier-div (.html modifier-div))
141+
is-static? (and modifier-html (str/includes? modifier-html "static"))]
142+
{:signature signature
143+
:description (.text (.select desc-div ".block"))
144+
:static? is-static?
145+
:clojure-call (clojure-call-syntax class-part signature is-static?)})))
146+
class-html (.outerHtml class-desc-section)
147+
result {:classname class-name
148+
:class-description-html class-html
149+
:class-description-md (html-to-md class-html)
150+
:methods all-methods}]
151+
(if method-part
152+
(let [filtered (filter-methods all-methods method-part param-tags)]
153+
(assoc result :selected-method
154+
(mapv #(get-method-detail doc %) filtered)))
155+
result)))
156+
157+
(defn print-javadoc [{:keys [class-description-md selected-method]}]
151158
(if selected-method
152159
(doseq [{:keys [method-description-md]} selected-method]
153160
(println method-description-md))
154161
(println class-description-md)))
155-
156-
(defn javadoc-fn [s param-tags]
157-
(print-javadoc (javadoc-data-fn s param-tags)))
158-
159-
(defmacro javadoc-data
160-
"a map containg javadoc data for a class or method
161-
Examples:
162-
(javadoc-data String) ; Get class data
163-
(javadoc-data String/valueOf) ; Get data for all valueOf overloads
164-
(javadoc-data ^[char/1] String/valueOf) ; Get data for specific overload"
165-
[class-or-method]
166-
`(javadoc-data-fn ~(str class-or-method) '~(:param-tags (meta class-or-method))))
167-
168-
(defmacro javadoc
169-
"print javadoc for a class or method
170-
Examples:
171-
(javadoc String) ; Print class description
172-
(javadoc String/valueOf) ; Print all valueOf overloads
173-
(javadoc ^[char/1] String/valueOf) ; Print specific overload"
174-
[class-or-method]
175-
`(javadoc-fn ~(str class-or-method) '~(:param-tags (meta class-or-method))))

0 commit comments

Comments
 (0)