mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-30 07:03:02 +00:00 
			
		
		
		
	 2d7df6b78e
			
		
	
	2d7df6b78e
	
	
	
		
			
			- Allow passing a table to fibers, which make fiber level scope easier. - Add fiber/getenv, fiber/setenv, dyn, and setdyn - Remove meta, *env*, and *doc-width* - Some functions changed dignatures, and no longer take an env
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Clojure
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Clojure
		
	
	
	
	
	
| # Generate documentation
 | |
| 
 | |
| (def- prelude
 | |
| ```
 | |
| <!doctype html>
 | |
| <html lang="en">
 | |
| <head>
 | |
| <meta charset="utf-8">
 | |
| <title>Janet Language Documentation</title>
 | |
| <meta name="description" content="API Documentation for the janet programming language.">
 | |
| <style>
 | |
| .docstring {
 | |
|   font-family: monospace;
 | |
| }
 | |
| .binding-type {
 | |
|   color: blue;
 | |
| }
 | |
| .source-map {
 | |
|   color: steelblue;
 | |
|   font-size: 0.8em;
 | |
| }
 | |
| </style>
 | |
| </head>
 | |
| ```)
 | |
| 
 | |
| (def- postlude
 | |
| ```
 | |
| </html>
 | |
| ```)
 | |
| 
 | |
| (def- escapes
 | |
|   {10 "<br>"
 | |
|    09 "    "
 | |
|    38 "&"
 | |
|    60 "<"
 | |
|    62 ">"
 | |
|    34 """
 | |
|    39 "'"
 | |
|    47 "/"})
 | |
| 
 | |
| (defn- trim-lead
 | |
|   "Trim leading newlines"
 | |
|   [str]
 | |
|   (var i 0)
 | |
|   (while (= 10 (get str i)) (++ i))
 | |
|   (string/slice str i))
 | |
| 
 | |
| (defn- html-escape
 | |
|   "Escape special characters for HTML encoding."
 | |
|   [str]
 | |
|   (def buf @"")
 | |
|   (loop [byte :in str]
 | |
|     (if-let [rep (get escapes byte)]
 | |
|       (buffer/push-string buf rep)
 | |
|       (buffer/push-byte buf byte)))
 | |
|   buf)
 | |
| 
 | |
| (def- months '("January" "February" "March" "April" "May" "June" "July" "August" "September"
 | |
|                         "October" "November" "December"))
 | |
| (defn nice-date
 | |
|   "Get the current date nicely formatted"
 | |
|   []
 | |
|   (let [date (os/date)
 | |
|         M (months (date :month))
 | |
|         D (+ (date :month-day) 1)
 | |
|         Y (date :year)
 | |
|         HH (date :hours)
 | |
|         MM (date :minutes)
 | |
|         SS (date :seconds)]
 | |
|     (string/format "%s %d, %d at %.2d:%.2d:%.2d"
 | |
|                    M D Y HH MM SS)))
 | |
| 
 | |
| (defn- make-title
 | |
|   "Generate title"
 | |
|   []
 | |
|   (string "<h1>Janet Core API</h1>"
 | |
|           "<p>Version " janet/version "-" janet/build "</p>"
 | |
|           "<p>Generated "
 | |
|           (nice-date)
 | |
|           "</p>"
 | |
|           "<hr>"))
 | |
| 
 | |
| (defn- emit-item
 | |
|   "Generate documentation for one entry."
 | |
|   [key env-entry]
 | |
|   (let [{:macro macro
 | |
|          :value val
 | |
|          :ref ref
 | |
|          :source-map sm
 | |
|          :doc docstring} env-entry
 | |
|         html-key (html-escape key)
 | |
|         binding-type (cond
 | |
|                        macro :macro
 | |
|                        ref (string :var " (" (type (get ref 0)) ")")
 | |
|                        (type val))
 | |
|         source-ref (if-let [[path start end] sm]
 | |
|                      (string "<span class=\"source-map\">" path " (" start ":" end ")</span>")
 | |
|                      "")]
 | |
|     (string "<h2 class=\"binding\"><a id=\"" key "\">" html-key "</a></h2>\n"
 | |
|             "<span class=\"binding-type\">" binding-type "</span>\n"
 | |
|             "<p class=\"docstring\">" (trim-lead (html-escape docstring)) "</p>\n"
 | |
|             source-ref)))
 | |
| 
 | |
| # Generate parts and print them to stdout
 | |
| (def parts (seq [[k entry]
 | |
|                  :in (sort (pairs (table/getproto (fiber/getenv (fiber/current)))))
 | |
|                  :when (and (get entry :doc) (not (get entry :private)))]
 | |
|                 (emit-item k entry)))
 | |
| (print
 | |
|   prelude
 | |
|   (make-title)
 | |
|   ;(interpose "<hr>\n" parts)
 | |
|   postlude)
 |