Merge pull request #39 from bollu/feb-21-relative-paths-manual-depth
Add support for relative pathsmain
commit
00837fd089
|
@ -80,8 +80,8 @@ def sourceLinker (ws : Lake.Workspace) (leanHash : String): IO (Name → Option
|
||||||
| some range => s!"{basic}#L{range.pos.line}-L{range.endPos.line}"
|
| some range => s!"{basic}#L{range.pos.line}-L{range.endPos.line}"
|
||||||
| none => basic
|
| none => basic
|
||||||
|
|
||||||
def htmlOutput (result : AnalyzerResult) (root : String) (ws : Lake.Workspace) (leanHash: String) : IO Unit := do
|
def htmlOutput (result : AnalyzerResult) (ws : Lake.Workspace) (leanHash: String) : IO Unit := do
|
||||||
let config := { root := root, result := result, currentName := none, sourceLinker := ←sourceLinker ws leanHash}
|
let config : SiteContext := { depthToRoot := 0, result := result, currentName := none, sourceLinker := ←sourceLinker ws leanHash}
|
||||||
let basePath := FilePath.mk "." / "build" / "doc"
|
let basePath := FilePath.mk "." / "build" / "doc"
|
||||||
let indexHtml := ReaderT.run index config
|
let indexHtml := ReaderT.run index config
|
||||||
let findHtml := ReaderT.run find config
|
let findHtml := ReaderT.run find config
|
||||||
|
@ -94,8 +94,10 @@ def htmlOutput (result : AnalyzerResult) (root : String) (ws : Lake.Workspace) (
|
||||||
for (_, mod) in result.moduleInfo.toArray do
|
for (_, mod) in result.moduleInfo.toArray do
|
||||||
for decl in filterMapDocInfo mod.members do
|
for decl in filterMapDocInfo mod.members do
|
||||||
let name := decl.getName.toString
|
let name := decl.getName.toString
|
||||||
|
let config := { config with depthToRoot := 2 }
|
||||||
let doc := decl.getDocString.getD ""
|
let doc := decl.getDocString.getD ""
|
||||||
let link := root ++ s!"semantic/{decl.getName.hash}.xml#"
|
let root := Id.run <| ReaderT.run (getRoot) config
|
||||||
|
let link := root ++ s!"../semantic/{decl.getName.hash}.xml#"
|
||||||
let docLink := Id.run <| ReaderT.run (declNameToLink decl.getName) config
|
let docLink := Id.run <| ReaderT.run (declNameToLink decl.getName) config
|
||||||
let sourceLink := Id.run <| ReaderT.run (getSourceUrl mod.name decl.getDeclarationRange) config
|
let sourceLink := Id.run <| ReaderT.run (getSourceUrl mod.name decl.getDeclarationRange) config
|
||||||
let obj := Json.mkObj [("name", name), ("doc", doc), ("link", link), ("docLink", docLink), ("sourceLink", sourceLink)]
|
let obj := Json.mkObj [("name", name), ("doc", doc), ("link", link), ("docLink", docLink), ("sourceLink", sourceLink)]
|
||||||
|
@ -116,7 +118,8 @@ def htmlOutput (result : AnalyzerResult) (root : String) (ws : Lake.Workspace) (
|
||||||
FS.writeFile declarationDataPath json.compress
|
FS.writeFile declarationDataPath json.compress
|
||||||
FS.writeFile (basePath / "declaration-data.timestamp") <| toString (←declarationDataPath.metadata).modified.sec
|
FS.writeFile (basePath / "declaration-data.timestamp") <| toString (←declarationDataPath.metadata).modified.sec
|
||||||
|
|
||||||
FS.writeFile (basePath / "site-root.js") (siteRootJs.replace "{siteRoot}" config.root)
|
let root := Id.run <| ReaderT.run (getRoot) config
|
||||||
|
FS.writeFile (basePath / "site-root.js") (siteRootJs.replace "{siteRoot}" root)
|
||||||
FS.writeFile (basePath / "declaration-data.js") declarationDataCenterJs
|
FS.writeFile (basePath / "declaration-data.js") declarationDataCenterJs
|
||||||
FS.writeFile (basePath / "nav.js") navJs
|
FS.writeFile (basePath / "nav.js") navJs
|
||||||
FS.writeFile (basePath / "find" / "find.js") findJs
|
FS.writeFile (basePath / "find" / "find.js") findJs
|
||||||
|
@ -125,10 +128,14 @@ def htmlOutput (result : AnalyzerResult) (root : String) (ws : Lake.Workspace) (
|
||||||
FS.writeFile (basePath / "mathjax-config.js") mathjaxConfigJs
|
FS.writeFile (basePath / "mathjax-config.js") mathjaxConfigJs
|
||||||
|
|
||||||
for (module, content) in result.moduleInfo.toArray do
|
for (module, content) in result.moduleInfo.toArray do
|
||||||
|
let fileDir := moduleNameToDirectory basePath module
|
||||||
|
let filePath := moduleNameToFile basePath module
|
||||||
|
-- path: 'basePath/module/components/till/last.html'
|
||||||
|
-- The last component is the file name, so we drop it from the depth to root.
|
||||||
|
let config := { config with depthToRoot := module.components.dropLast.length }
|
||||||
let moduleHtml := ReaderT.run (moduleToHtml content) config
|
let moduleHtml := ReaderT.run (moduleToHtml content) config
|
||||||
let path := moduleNameToFile basePath module
|
FS.createDirAll $ fileDir
|
||||||
FS.createDirAll $ moduleNameToDirectory basePath module
|
FS.writeFile filePath moduleHtml.toString
|
||||||
FS.writeFile path moduleHtml.toString
|
|
||||||
|
|
||||||
end DocGen4
|
end DocGen4
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,9 @@ open scoped DocGen4.Jsx
|
||||||
open Lean System Widget Elab
|
open Lean System Widget Elab
|
||||||
|
|
||||||
structure SiteContext where
|
structure SiteContext where
|
||||||
root : String
|
|
||||||
result : AnalyzerResult
|
result : AnalyzerResult
|
||||||
|
depthToRoot: Nat
|
||||||
currentName : Option Name
|
currentName : Option Name
|
||||||
-- Generates a URL pointing to the source of the given module Name
|
|
||||||
sourceLinker : Name → Option DeclarationRange → String
|
sourceLinker : Name → Option DeclarationRange → String
|
||||||
|
|
||||||
def setCurrentName (name : Name) (ctx : SiteContext) := {ctx with currentName := some name}
|
def setCurrentName (name : Name) (ctx : SiteContext) := {ctx with currentName := some name}
|
||||||
|
@ -25,7 +24,13 @@ def setCurrentName (name : Name) (ctx : SiteContext) := {ctx with currentName :=
|
||||||
abbrev HtmlT := ReaderT SiteContext
|
abbrev HtmlT := ReaderT SiteContext
|
||||||
abbrev HtmlM := HtmlT Id
|
abbrev HtmlM := HtmlT Id
|
||||||
|
|
||||||
def getRoot : HtmlM String := do pure (←read).root
|
def getRoot : HtmlM String := do
|
||||||
|
let rec go: Nat -> String
|
||||||
|
| 0 => "./"
|
||||||
|
| Nat.succ n' => "../" ++ go n'
|
||||||
|
let d <- SiteContext.depthToRoot <$> read
|
||||||
|
return (go d)
|
||||||
|
|
||||||
def getResult : HtmlM AnalyzerResult := do pure (←read).result
|
def getResult : HtmlM AnalyzerResult := do pure (←read).result
|
||||||
def getCurrentName : HtmlM (Option Name) := do pure (←read).currentName
|
def getCurrentName : HtmlM (Option Name) := do pure (←read).currentName
|
||||||
def getSourceUrl (module : Name) (range : Option DeclarationRange): HtmlM String := do pure $ (←read).sourceLinker module range
|
def getSourceUrl (module : Name) (range : Option DeclarationRange): HtmlM String := do pure $ (←read).sourceLinker module range
|
||||||
|
|
|
@ -5,7 +5,6 @@ import Cli
|
||||||
open DocGen4 Lean Cli
|
open DocGen4 Lean Cli
|
||||||
|
|
||||||
def runDocGenCmd (p : Parsed) : IO UInt32 := do
|
def runDocGenCmd (p : Parsed) : IO UInt32 := do
|
||||||
let root := p.positionalArg! "root" |>.as! String
|
|
||||||
let modules : List String := p.variableArgsAs! String |>.toList
|
let modules : List String := p.variableArgsAs! String |>.toList
|
||||||
let res ← lakeSetup modules
|
let res ← lakeSetup modules
|
||||||
match res with
|
match res with
|
||||||
|
@ -13,7 +12,7 @@ def runDocGenCmd (p : Parsed) : IO UInt32 := do
|
||||||
IO.println s!"Loading modules from: {←searchPathRef.get}"
|
IO.println s!"Loading modules from: {←searchPathRef.get}"
|
||||||
let doc ← load $ modules.map Name.mkSimple
|
let doc ← load $ modules.map Name.mkSimple
|
||||||
IO.println "Outputting HTML"
|
IO.println "Outputting HTML"
|
||||||
htmlOutput doc root ws leanHash
|
htmlOutput doc ws leanHash
|
||||||
pure 0
|
pure 0
|
||||||
| Except.error rc => pure rc
|
| Except.error rc => pure rc
|
||||||
|
|
||||||
|
@ -22,7 +21,6 @@ def docGenCmd : Cmd := `[Cli|
|
||||||
"A documentation generator for Lean 4."
|
"A documentation generator for Lean 4."
|
||||||
|
|
||||||
ARGS:
|
ARGS:
|
||||||
root : String; "The root URL to generate the HTML for (will be relative in the future)"
|
|
||||||
...modules : String; "The modules to generate the HTML for"
|
...modules : String; "The modules to generate the HTML for"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@ Document Generator for Lean 4
|
||||||
## Usage
|
## Usage
|
||||||
You can call `doc-gen4` from the top of a Lake project like this:
|
You can call `doc-gen4` from the top of a Lake project like this:
|
||||||
```sh
|
```sh
|
||||||
$ /path/to/doc-gen4 / Module
|
$ /path/to/doc-gen4 Module
|
||||||
```
|
```
|
||||||
Where the `/` is the root URL the HTML will refer to and `Module` is one or
|
|
||||||
more of the top level modules you want to document.
|
where `Module` is one or more of the top level modules you want to document.
|
||||||
The tool will then proceed to compile the project using lake (if that hasn't happened yet),
|
The tool will then proceed to compile the project using lake (if that hasn't happened yet),
|
||||||
analyze it and put the result in `./build/doc`.
|
analyze it and put the result in `./build/doc`.
|
||||||
You could e.g. host the files locally with the built-in Python webserver:
|
You could e.g. host the files locally with the built-in Python webserver:
|
||||||
|
|
|
@ -23,7 +23,7 @@ fi
|
||||||
|
|
||||||
# generate the docs
|
# generate the docs
|
||||||
cd $1
|
cd $1
|
||||||
../$2/build/bin/doc-gen4 /mathlib4_docs/ Mathlib
|
../$2/build/bin/doc-gen4 Mathlib
|
||||||
|
|
||||||
if [ "$3" = "true" ]; then
|
if [ "$3" = "true" ]; then
|
||||||
cd ..
|
cd ..
|
||||||
|
|
Loading…
Reference in New Issue