-
Notifications
You must be signed in to change notification settings - Fork 8
/
tocs.nim
81 lines (69 loc) · 2.79 KB
/
tocs.nim
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
79
80
81
import std / [os, strformat, macros]
import nimibook / [types, defaults, paths]
proc inc(levels: var seq[int]) =
levels[levels.high] = levels[levels.high] + 1
# TODO comment debugEcho before merge
proc add(toc: var Toc, entry: Entry) =
let fullPath = entry.path
# debugEcho "==> toc.add Entry <==\n fullPath>", fullPath
if not fileExists(fullPath):
raise newException(IOError, fmt"Error entry {fullpath} doesn't exist.")
toc.entries.add entry
template populateAssets*(rootfolder: string, force: bool = false) =
const baseRessources = currentSourcePath().parentDir() / "resources"
let
assetsSrc = baseRessources / "assets"
assetsTarget = getCurrentDir() / "docs" / "assets"
mustacheSrc = baseRessources / "templates/"
mustacheTarget = getCurrentDir() / rootfolder
# debugEcho("assetsSrc >> ", assetsSrc)
# debugEcho("assetsTarget >> ", assetsTarget)
# debugEcho("mustacheSrc >> ", mustacheSrc)
# debugEcho("mustacheTarget >> ", mustacheTarget)
for file in walkDir(mustacheSrc):
let file = file.path
let name = file.splitPath().tail
# Copy default mustache file
if not fileExists(mustacheTarget / name) or force:
# debugEcho "copyFile(", file , ", ", mustacheTarget, ") "
copyFile(file, mustacheTarget / name)
if not dirExists(assetsTarget):
# debugEcho "==> copyDir(", assetsSrc, ", ", assetsTarget, ")"
copyDir(assetsSrc, assetsTarget)
else:
if force:
removeDir(assetsTarget)
# debugEcho "==> copyDir(", assetsSrc, ", ", assetsTarget, ")"
copyDir(assetsSrc, assetsTarget)
template newBookFromToc*(booklabel: string, rootfolder: string, body: untyped): Book =
populateAssets(rootfolder, false)
var book = Book(book_title: booklabel)
book.setDefaults
book.path_to_root = rootfolder
putEnv("nimibSrcDir", getCurrentDir() / rootfolder)
var toc = Toc(path: rootfolder)
var levels: seq[int] = @[1]
var folders: seq[string] = @[rootfolder]
template entry(label, rfile: string, numbered = true) =
let inputs = rfile.splitFile
let file = inputs.dir / formatFileName(inputs)
toc.add Entry(title: label, path: joinPath(folders, file).normalizedPath(), levels: levels, isNumbered: numbered)
if numbered:
inc levels
template draft(label, rfile: string) = entry(label, rfile, numbered = false)
template section(label, rfile: string, sectionBody: untyped) =
let inputs = rfile.splitFile
let curfolder = inputs.dir
let file = formatFileName(inputs)
folders.add curfolder
toc.add Entry(title: label, path: joinPath(folders, file).normalizedPath(), levels: levels, isNumbered: true)
levels.add 1
sectionBody
discard pop levels
discard pop folders
inc levels
body
book.toc = toc
# Dump json here so we avoid having to use Nimble in use Nimibook
dump(book)
book