|
73 | 73 | (str/replace "{end-row}" (str (:end-row var))) |
74 | 74 | (str/replace "{end-col}" (str (:end-col var)))))) |
75 | 75 |
|
76 | | -(defn print-var [var _source {:keys [collapse-vars] :as opts}] |
| 76 | +(defn print-docstring [ns->vars current-ns docstring opts] |
| 77 | + (println |
| 78 | + (if-some [var-regex (:var-regex opts)] |
| 79 | + (reduce (fn [docstring [raw inner]] |
| 80 | + (cond |
| 81 | + ;; Looks qualified |
| 82 | + (str/includes? inner "/") |
| 83 | + (let [split (str/split inner #"/")] |
| 84 | + (if (and (= (count split) 2) |
| 85 | + (get-in ns->vars [(symbol (first split)) |
| 86 | + (symbol (second split))])) |
| 87 | + (str/replace docstring raw (format "[`%s`](#%s)" inner inner)) |
| 88 | + docstring)) |
| 89 | + ;; Not qualified, maybe a namespace |
| 90 | + (contains? ns->vars (symbol inner)) |
| 91 | + (str/replace docstring raw (format "[`%s`](#%s)" inner inner)) |
| 92 | + ;; Not qualified, maybe a var in the current namespace |
| 93 | + (get-in ns->vars [current-ns (symbol inner)]) |
| 94 | + (str/replace docstring raw (format "[`%s`](#%s/%s)" inner current-ns inner)) |
| 95 | + ;; Just regular markdown backticks |
| 96 | + :else |
| 97 | + docstring)) |
| 98 | + docstring |
| 99 | + (re-seq var-regex docstring)) |
| 100 | + docstring))) |
| 101 | + |
| 102 | +(defn print-var [ns->vars ns-name var _source {:keys [collapse-vars] :as opts}] |
77 | 103 | (when (var-filter var) |
78 | 104 | (when collapse-vars (println "<details>\n\n")) |
79 | 105 | (when collapse-vars |
80 | 106 | (println (str "<summary><code>" (:name var) "</code>" |
81 | 107 | (when-let [summary (var-summary var)] |
82 | 108 | (str " - " summary))) |
83 | 109 | "</summary>\n\n")) |
84 | | - (println "##" (format "`%s`" (:name var))) |
| 110 | + (println "##" (format "<a name=\"%s/%s\">`%s`</a>" |
| 111 | + ns-name |
| 112 | + (:name var) |
| 113 | + (:name var))) |
85 | 114 | (when-let [arg-lists (or (when-let [quoted-arglists (-> var :meta :arglists)] |
86 | 115 | (if (and (seq? quoted-arglists) |
87 | 116 | (= 'quote (first quoted-arglists))) |
|
105 | 134 | (println) |
106 | 135 | (when (:macro var) |
107 | 136 | (println "Macro.\n\n")) |
108 | | - (println doc) |
| 137 | + (print-docstring ns->vars ns-name doc opts) |
109 | 138 | (print "<br>")) |
110 | 139 | (println (var-source var opts)) |
111 | 140 | (when collapse-vars (println "</details>\n\n")))) |
112 | 141 |
|
113 | | -(defn with-idx [s memo] |
114 | | - (let [v (swap! memo update s (fnil inc -1)) |
115 | | - c (get v s)] |
116 | | - (if (zero? c) |
117 | | - s |
118 | | - (str s "-" c)))) |
119 | | - |
120 | | -(defn print-namespace [ns-defs ns-name vars opts overrides] |
| 142 | +(defn print-namespace [ns-defs ns->vars ns-name vars opts overrides] |
121 | 143 | (let [ns (get-in ns-defs [ns-name 0]) |
122 | 144 | filename (:filename ns) |
123 | 145 | source (try (slurp filename) |
|
134 | 156 | collapse-nss (:collapse-nss opts)] |
135 | 157 | (when collapse-nss (println "<details>\n\n")) |
136 | 158 | (when collapse-nss (println "<summary><code>" ns-name "</code></summary>\n\n")) |
137 | | - (println "#" ns-name "\n\n") |
| 159 | + (println (format "# <a name=\"%s\">%s</a>\n\n" ns-name ns-name)) |
138 | 160 | (when-let [doc (:doc ns)] |
139 | | - (println doc)) |
| 161 | + (print-docstring ns->vars ns-name doc opts)) |
140 | 162 | (println "\n\n") |
141 | 163 | (run! (fn [[_ vars]] |
142 | 164 | (let [var (last vars)] |
143 | | - (print-var var source opts))) |
| 165 | + (print-var ns->vars ns-name var source opts))) |
144 | 166 | (sort-by first ana)) |
145 | 167 | (when collapse-nss (println "</details>\n\n")))))))) |
146 | 168 |
|
147 | | -(defn md-munge [s] |
148 | | - (str/replace s #"[\*\.!]" "")) |
149 | | - |
150 | | -(defn print-toc* [memo nss ns-defs _opts overrides] |
| 169 | +(defn print-toc* [nss ns-defs _opts overrides] |
151 | 170 | (println "# Table of contents") |
152 | 171 | (doseq [[ns-name vars] (sort-by first nss)] |
153 | 172 | (let [ns (get-in ns-defs [ns-name 0]) |
|
156 | 175 | mns (merge mns overriden-ns)] |
157 | 176 | (when (and (not (:no-doc mns)) |
158 | 177 | (not (:skip-wiki mns))) |
159 | | - (println "- " (format "[`%s`](#%s) %s" ns-name |
160 | | - (str (with-idx (md-munge ns-name) memo)) |
| 178 | + (println "- " (format "[`%s`](#%s) %s" |
| 179 | + ns-name |
| 180 | + ns-name |
161 | 181 | (str (when-let [summary (var-summary ns)] |
162 | 182 | (str " - " summary))))) |
163 | 183 | (let [vars (group-by :name vars) |
|
167 | 187 | (when (var-filter (merge v (get overriden-ns var-name))) |
168 | 188 | (println |
169 | 189 | " - " |
170 | | - (str (format "[`%s`](#%s)" var-name (with-idx (md-munge var-name) memo)) |
| 190 | + (str (format "[`%s`](#%s)" |
| 191 | + var-name |
| 192 | + (str ns-name "/" var-name)) |
171 | 193 | (when-let [summary (var-summary v)] |
172 | 194 | (str " - " summary)))))))))))) |
173 | 195 |
|
174 | | -(defn print-toc [memo nss ns-defs opts overrides] |
175 | | - (if (:toc opts) |
176 | | - (print-toc* memo nss ns-defs opts overrides) |
177 | | - (when (:var-links opts) |
178 | | - ;; we run toc anyway to populate memo, but suppress output |
179 | | - (with-out-str (print-toc* memo nss ns-defs opts overrides))))) |
| 196 | +(defn print-toc [nss ns-defs opts overrides] |
| 197 | + (when (:toc opts) |
| 198 | + (print-toc* nss ns-defs opts overrides))) |
0 commit comments