navigation
This commit is contained in:
parent
849e8a945e
commit
223af0a42f
2
example/content/de/main/01_home/config.yml
Normal file
2
example/content/de/main/01_home/config.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
This:
|
||||||
|
Navname: HOME
|
@ -3,12 +3,36 @@
|
|||||||
<title>{{ Meta.Title }}</title>
|
<title>{{ Meta.Title }}</title>
|
||||||
<meta name="description" content="{{ Meta.Description }}" />
|
<meta name="description" content="{{ Meta.Description }}" />
|
||||||
<meta name="keywords" content="{{ Meta.Keywords }}" />
|
<meta name="keywords" content="{{ Meta.Keywords }}" />
|
||||||
|
<style>
|
||||||
|
a {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</meta>
|
</meta>
|
||||||
<body>
|
<body style="margin: 0; padding: 2;">
|
||||||
{{{ Body }}}
|
<header style="background-color: lightgrey; padding: 20px;">
|
||||||
<pre>
|
<div><b>main Level 1</b></div>
|
||||||
|
<ul>
|
||||||
|
{{#each NavMap.de.SubMap.main.SubSlice }}
|
||||||
|
<li><a href="{{ GoTo }}">{{ Navname }}</a></li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</header>
|
||||||
|
|
||||||
{{{ Data }}}
|
<div style="padding: 20px;">
|
||||||
</pre>
|
{{{ Body }}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer style="background-color: lightgrey; padding: 20px;">
|
||||||
|
<div><b>service Level 1</b></div>
|
||||||
|
<ul>
|
||||||
|
{{#each NavMap.de.SubMap.service.SubSlice }}
|
||||||
|
<li><a href="{{ GoTo }}">{{ Navname }}</a></li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
81
main.go
81
main.go
@ -8,6 +8,8 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/imdario/mergo"
|
||||||
|
|
||||||
"github.com/aymerick/raymond"
|
"github.com/aymerick/raymond"
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/op/go-logging"
|
"github.com/op/go-logging"
|
||||||
@ -147,12 +149,12 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
|||||||
tree.InputPath = inPath
|
tree.InputPath = inPath
|
||||||
|
|
||||||
// read config
|
// read config
|
||||||
var newConfig *PathConfig
|
newConfig := new(PathConfig)
|
||||||
log.Debug("looking for config.yml ...")
|
log.Debug("looking for config.yml ...")
|
||||||
configFile := inPath + "/config.yml"
|
configFile := inPath + "/config.yml"
|
||||||
if _, err = os.Stat(configFile); os.IsNotExist(err) {
|
if _, err = os.Stat(configFile); os.IsNotExist(err) {
|
||||||
log.Debug("no config.yml found in this directory, using upper configs")
|
log.Debug("no config.yml found in this directory, using upper configs")
|
||||||
newConfig = conf
|
mergo.Merge(newConfig, conf)
|
||||||
// remove this
|
// remove this
|
||||||
newConfig.This.GoTo = nil
|
newConfig.This.GoTo = nil
|
||||||
newConfig.This.Navname = nil
|
newConfig.This.Navname = nil
|
||||||
@ -162,7 +164,6 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("could not read file '%s': %s", configFile, err)
|
log.Panicf("could not read file '%s': %s", configFile, err)
|
||||||
}
|
}
|
||||||
newConfig = new(PathConfig)
|
|
||||||
err = yaml.Unmarshal(data, newConfig)
|
err = yaml.Unmarshal(data, newConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("could not parse YAML file '%s': %s", configFile, err)
|
log.Panicf("could not parse YAML file '%s': %s", configFile, err)
|
||||||
@ -191,6 +192,11 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
|||||||
log.Noticef("calculated output directory: %s", outPath)
|
log.Noticef("calculated output directory: %s", outPath)
|
||||||
tree.OutputPath = outPath
|
tree.OutputPath = outPath
|
||||||
|
|
||||||
|
if tree.Config.This.Navname == nil {
|
||||||
|
navname := strings.Replace(stripedDir, "_", " ", -1)
|
||||||
|
tree.Config.This.Navname = &navname
|
||||||
|
}
|
||||||
|
|
||||||
// first only files
|
// first only files
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
p := inPath + "/" + f.Name()
|
p := inPath + "/" + f.Name()
|
||||||
@ -218,6 +224,60 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type navElement struct {
|
||||||
|
Navname string
|
||||||
|
GoTo string
|
||||||
|
|
||||||
|
SubMap *map[string]*navElement
|
||||||
|
SubSlice *[]*navElement
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildNavigation(conf *PathConfigTree, curNavMap *map[string]*navElement, curNavSlice *[]*navElement, activeNav string) {
|
||||||
|
for _, el := range conf.Sub {
|
||||||
|
subMap := make(map[string]*navElement)
|
||||||
|
subSlice := make([]*navElement, 0)
|
||||||
|
navEl := navElement{
|
||||||
|
SubMap: &subMap,
|
||||||
|
SubSlice: &subSlice,
|
||||||
|
}
|
||||||
|
elPath := strings.TrimPrefix(el.OutputPath, *outDir+"/")
|
||||||
|
|
||||||
|
n := el.Config.This.Navname
|
||||||
|
if n != nil {
|
||||||
|
navEl.Navname = *n
|
||||||
|
}
|
||||||
|
g := el.Config.This.GoTo
|
||||||
|
if g != nil {
|
||||||
|
if strings.HasPrefix(*g, "/") {
|
||||||
|
// abslute
|
||||||
|
navEl.GoTo = *g
|
||||||
|
} else {
|
||||||
|
// relative
|
||||||
|
navEl.GoTo = elPath + "/" + *g
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
navEl.GoTo = elPath + "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
if activeNav != "" && activeNav != "/" {
|
||||||
|
// calculate relative path
|
||||||
|
tmpPath := ""
|
||||||
|
for i := len(strings.Split(activeNav, "/")); i > 0; i-- {
|
||||||
|
tmpPath += "../"
|
||||||
|
}
|
||||||
|
navEl.GoTo = tmpPath + navEl.GoTo
|
||||||
|
//navEl.GoTo = path.Clean(navEl.GoTo)
|
||||||
|
}
|
||||||
|
|
||||||
|
(*curNavMap)[navEl.Navname] = &navEl
|
||||||
|
if curNavSlice != nil {
|
||||||
|
*curNavSlice = append(*curNavSlice, &navEl)
|
||||||
|
}
|
||||||
|
|
||||||
|
buildNavigation(el, &subMap, &subSlice, activeNav)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func processContent(conf *PathConfigTree) {
|
func processContent(conf *PathConfigTree) {
|
||||||
log.Debugf("trying to create output directory: %s", conf.OutputPath)
|
log.Debugf("trying to create output directory: %s", conf.OutputPath)
|
||||||
|
|
||||||
@ -247,13 +307,12 @@ func processContent(conf *PathConfigTree) {
|
|||||||
}
|
}
|
||||||
log.Noticef("processing input file '%s'", inFile)
|
log.Noticef("processing input file '%s'", inFile)
|
||||||
|
|
||||||
var newConfig *PathConfig
|
newConfig := new(PathConfig)
|
||||||
|
|
||||||
regex := regexp.MustCompile("(?sm)^---(.*)^---")
|
regex := regexp.MustCompile("(?sm)^---(.*)^---")
|
||||||
yamlData := regex.Find(input)
|
yamlData := regex.Find(input)
|
||||||
if string(yamlData) != "" {
|
if string(yamlData) != "" {
|
||||||
log.Debugf("found yaml header in '%s', merging config", inFile)
|
log.Debugf("found yaml header in '%s', merging config", inFile)
|
||||||
newConfig = new(PathConfig)
|
|
||||||
err = yaml.Unmarshal(yamlData, newConfig)
|
err = yaml.Unmarshal(yamlData, newConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("could not parse YAML header from '%s': %s", inFile, err)
|
log.Panicf("could not parse YAML header from '%s': %s", inFile, err)
|
||||||
@ -265,7 +324,7 @@ func processContent(conf *PathConfigTree) {
|
|||||||
|
|
||||||
input = regex.ReplaceAll(input, []byte(""))
|
input = regex.ReplaceAll(input, []byte(""))
|
||||||
} else {
|
} else {
|
||||||
newConfig = conf.Config
|
mergo.Merge(newConfig, conf.Config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore ???
|
// ignore ???
|
||||||
@ -324,12 +383,17 @@ func processContent(conf *PathConfigTree) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// build navigation
|
||||||
|
curNavPath := strings.TrimPrefix(conf.OutputPath, *outDir+"/")
|
||||||
|
var navMap = make(map[string]*navElement)
|
||||||
|
buildNavigation(contentConfig, &navMap, nil, curNavPath)
|
||||||
|
|
||||||
// read yaml header as data for template
|
// read yaml header as data for template
|
||||||
ctx := make(map[string]interface{})
|
ctx := make(map[string]interface{})
|
||||||
ctx["Meta"] = newConfig.Meta
|
ctx["Meta"] = newConfig.Meta
|
||||||
ctx["Data"] = newConfig.Data
|
ctx["Data"] = newConfig.Data
|
||||||
|
ctx["NavMap"] = navMap
|
||||||
ctx["Body"] = string(html)
|
ctx["Body"] = string(html)
|
||||||
log.Warning(spew.Sdump(ctx))
|
|
||||||
|
|
||||||
result, err := template.Exec(ctx)
|
result, err := template.Exec(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -463,9 +527,10 @@ func main() {
|
|||||||
defaultPathConfig.Filename.OutputExtension = &defaultFilenameOutputExtension
|
defaultPathConfig.Filename.OutputExtension = &defaultFilenameOutputExtension
|
||||||
|
|
||||||
readContentDir(*inDir+"/content", *outDir, "", defaultPathConfig, contentConfig)
|
readContentDir(*inDir+"/content", *outDir, "", defaultPathConfig, contentConfig)
|
||||||
|
|
||||||
//spew.Dump(contentConfig)
|
//spew.Dump(contentConfig)
|
||||||
|
|
||||||
|
//spew.Dump(navMap)
|
||||||
|
|
||||||
processContent(contentConfig)
|
processContent(contentConfig)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user