160
main.go
160
main.go
@@ -6,6 +6,7 @@ import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
@@ -67,37 +68,42 @@ type ThisPathConfig struct {
|
||||
Data interface{} `yaml:"Data"`
|
||||
}
|
||||
|
||||
type indexStruct struct {
|
||||
InputFile *string `yaml:"InputFile"`
|
||||
OutputFile *string `yaml:"OutputFile"`
|
||||
}
|
||||
|
||||
type metaStruct struct {
|
||||
Title *string `yaml:"Title"`
|
||||
Description *string `yaml:"Description"`
|
||||
Keywords *string `yaml:"Keywords"`
|
||||
}
|
||||
|
||||
type pathStruct struct {
|
||||
Strip *string `yaml:"Strip"`
|
||||
IgnoreForNav *string `yaml:"IgnoreForNav"`
|
||||
}
|
||||
|
||||
type filenameStruct struct {
|
||||
Strip *string `yaml:"Strip"`
|
||||
Ignore *string `yaml:"Ignore"`
|
||||
OutputExtension *string `yaml:"OutputExtension"`
|
||||
}
|
||||
|
||||
type markdownStruct struct {
|
||||
ChromaRenderer *bool `yaml:"ChromaRenderer"`
|
||||
ChromaStyle *string `yaml:"ChromaStyle"`
|
||||
}
|
||||
|
||||
// PathConfig of subdir
|
||||
type PathConfig struct {
|
||||
This ThisPathConfig `yaml:"This"`
|
||||
|
||||
Template *string `yaml:"Template"`
|
||||
|
||||
Index struct {
|
||||
InputFile *string `yaml:"InputFile"`
|
||||
OutputFile *string `yaml:"OutputFile"`
|
||||
} `yaml:"Index"`
|
||||
|
||||
Meta struct {
|
||||
Title *string `yaml:"Title"`
|
||||
Description *string `yaml:"Description"`
|
||||
Keywords *string `yaml:"Keywords"`
|
||||
} `yaml:"Meta"`
|
||||
|
||||
Path struct {
|
||||
Strip *string `yaml:"Strip"`
|
||||
IgnoreForNav *string `yaml:"IgnoreForNav"`
|
||||
} `yaml:"Path"`
|
||||
|
||||
Filename struct {
|
||||
Strip *string `yaml:"Strip"`
|
||||
Ignore *string `yaml:"Ignore"`
|
||||
OutputExtension *string `yaml:"OutputExtension"`
|
||||
} `yaml:"Filename"`
|
||||
|
||||
Markdown struct {
|
||||
SyntaxHighlight *bool `yaml:"SyntaxHighlight"`
|
||||
} `yaml:"Markdown"`
|
||||
This ThisPathConfig `yaml:"This"`
|
||||
Template *string `yaml:"Template"`
|
||||
Index *indexStruct `yaml:"Index"`
|
||||
Meta *metaStruct `yaml:"Meta"`
|
||||
Path *pathStruct `yaml:"Path"`
|
||||
Filename *filenameStruct `yaml:"Filename"`
|
||||
Markdown *markdownStruct `yaml:"Markdown"`
|
||||
|
||||
Data interface{} `yaml:"Data"`
|
||||
}
|
||||
@@ -116,6 +122,26 @@ type PathConfigTree struct {
|
||||
|
||||
var contentConfig = new(PathConfigTree)
|
||||
|
||||
type ptrTransformer struct{}
|
||||
|
||||
func (t ptrTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error {
|
||||
if typ.Kind() == reflect.Ptr {
|
||||
return func(dst, src reflect.Value) error {
|
||||
if dst.CanSet() {
|
||||
if dst.IsNil() {
|
||||
dst.Set(src)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func merge(dst, src interface{}) error {
|
||||
return mergo.Merge(dst, src, mergo.WithTransformers(ptrTransformer{}))
|
||||
}
|
||||
|
||||
func backToRoot(curNavPath string) string {
|
||||
tmpPath := ""
|
||||
if curNavPath != "" {
|
||||
@@ -147,7 +173,7 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
||||
configFile := inPath + "/config.yml"
|
||||
if _, err = os.Stat(configFile); os.IsNotExist(err) {
|
||||
log.Debug("no config.yml found in this directory, using upper configs")
|
||||
mergo.Merge(newConfig, conf)
|
||||
merge(newConfig, conf)
|
||||
// remove this
|
||||
newConfig.This = ThisPathConfig{}
|
||||
} else {
|
||||
@@ -163,7 +189,7 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
||||
|
||||
log.Debug("merging config with upper config")
|
||||
oldThis := newConfig.This
|
||||
mergo.Merge(newConfig, conf)
|
||||
merge(newConfig, conf)
|
||||
newConfig.This = oldThis
|
||||
|
||||
log.Debug(spew.Sdump(newConfig))
|
||||
@@ -173,7 +199,10 @@ func readContentDir(inBase string, outBase string, dir string, conf *PathConfig,
|
||||
|
||||
// calc outDir
|
||||
stripedDir := dir
|
||||
regexStr := newConfig.Path.Strip
|
||||
var regexStr *string
|
||||
if newConfig.Path != nil {
|
||||
regexStr = newConfig.Path.Strip
|
||||
}
|
||||
if regexStr != nil && *regexStr != "" {
|
||||
if regex, err := regexp.Compile(*regexStr); err != nil {
|
||||
log.Panicf("error compiling path.strip regex '%s' from '%s': %s", *regexStr, inBase+"/"+dir, err)
|
||||
@@ -246,7 +275,10 @@ type navElement struct {
|
||||
|
||||
func buildNavigation(conf *PathConfigTree, curNavMap *map[string]*navElement, curNavSlice *[]*navElement, navActive *[]*navElement, activeNav string) {
|
||||
for _, el := range conf.Sub {
|
||||
ignNav := el.Config.Path.IgnoreForNav
|
||||
var ignNav *string
|
||||
if p := el.Config.Path; p != nil {
|
||||
ignNav = p.IgnoreForNav
|
||||
}
|
||||
if ignNav != nil && *ignNav != "" {
|
||||
regex, err := regexp.Compile(*ignNav)
|
||||
if err != nil {
|
||||
@@ -384,19 +416,26 @@ RewriteRule ^$ %{REQUEST_URI}`+goToFixed+`/ [R,L]
|
||||
|
||||
log.Debug("merging config with upper config")
|
||||
oldThis := newConfig.This
|
||||
mergo.Merge(newConfig, conf.Config)
|
||||
merge(newConfig, conf.Config)
|
||||
newConfig.This = oldThis
|
||||
|
||||
log.Debug(spew.Sdump(newConfig))
|
||||
|
||||
input = regex.ReplaceAll(input, []byte(""))
|
||||
} else {
|
||||
mergo.Merge(newConfig, conf.Config)
|
||||
merge(newConfig, conf.Config)
|
||||
}
|
||||
|
||||
// ignore ???
|
||||
ignoreFile := false
|
||||
ignoreRegex := newConfig.Filename.Ignore
|
||||
var ignoreRegex *string
|
||||
var stripRegex *string
|
||||
var outputExt *string
|
||||
if f := newConfig.Filename; f != nil {
|
||||
ignoreRegex = f.Ignore
|
||||
stripRegex = f.Strip
|
||||
outputExt = f.OutputExtension
|
||||
}
|
||||
if ignoreRegex != nil && *ignoreRegex != "" {
|
||||
regex, err := regexp.Compile(*ignoreRegex)
|
||||
if err != nil {
|
||||
@@ -412,13 +451,16 @@ RewriteRule ^$ %{REQUEST_URI}`+goToFixed+`/ [R,L]
|
||||
// build output filename
|
||||
outputFilename := file
|
||||
|
||||
indexInputFile := conf.Config.Index.InputFile
|
||||
indexOutputFile := conf.Config.Index.OutputFile
|
||||
var indexInputFile *string
|
||||
var indexOutputFile *string
|
||||
if i := newConfig.Index; i != nil {
|
||||
indexInputFile = i.InputFile
|
||||
indexOutputFile = i.OutputFile
|
||||
}
|
||||
|
||||
if indexInputFile != nil && *indexInputFile == file && indexOutputFile != nil && *indexOutputFile != "" {
|
||||
outputFilename = *indexOutputFile
|
||||
} else {
|
||||
stripRegex := newConfig.Filename.Strip
|
||||
if stripRegex != nil && *stripRegex != "" {
|
||||
regex, err := regexp.Compile(*stripRegex)
|
||||
if err != nil {
|
||||
@@ -426,7 +468,6 @@ RewriteRule ^$ %{REQUEST_URI}`+goToFixed+`/ [R,L]
|
||||
}
|
||||
outputFilename = regex.ReplaceAllString(outputFilename, "$1")
|
||||
}
|
||||
outputExt := newConfig.Filename.OutputExtension
|
||||
if outputExt != nil && *outputExt != "" {
|
||||
outputFilename += "." + *outputExt
|
||||
}
|
||||
@@ -437,10 +478,23 @@ RewriteRule ^$ %{REQUEST_URI}`+goToFixed+`/ [R,L]
|
||||
|
||||
var options []blackfriday.Option
|
||||
|
||||
synH := conf.Config.Markdown.SyntaxHighlight
|
||||
if synH != nil && *synH {
|
||||
var chromaRenderer *bool
|
||||
var chromaStyle *string
|
||||
if m := newConfig.Markdown; m != nil {
|
||||
chromaRenderer = m.ChromaRenderer
|
||||
chromaStyle = m.ChromaStyle
|
||||
}
|
||||
if chromaStyle == nil {
|
||||
style := "monokai"
|
||||
chromaStyle = &style
|
||||
}
|
||||
if chromaRenderer != nil && *chromaRenderer {
|
||||
options = []blackfriday.Option{
|
||||
blackfriday.WithRenderer(bfchroma.NewRenderer()),
|
||||
blackfriday.WithRenderer(
|
||||
bfchroma.NewRenderer(
|
||||
bfchroma.Style(*chromaStyle),
|
||||
),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -665,13 +719,19 @@ func main() {
|
||||
|
||||
defaultPathConfig := new(PathConfig)
|
||||
defaultPathConfig.Template = &defaultTemplate
|
||||
defaultPathConfig.Index.InputFile = &defaultInputFile
|
||||
defaultPathConfig.Index.OutputFile = &defaultOutputFile
|
||||
defaultPathConfig.Path.Strip = &defaultPathStrip
|
||||
defaultPathConfig.Path.IgnoreForNav = &defaultPathIgnoreForNav
|
||||
defaultPathConfig.Filename.Strip = &defaultFilenameStrip
|
||||
defaultPathConfig.Filename.Ignore = &defaultFilenameIgnore
|
||||
defaultPathConfig.Filename.OutputExtension = &defaultFilenameOutputExtension
|
||||
defaultPathConfig.Index = &indexStruct{
|
||||
InputFile: &defaultInputFile,
|
||||
OutputFile: &defaultOutputFile,
|
||||
}
|
||||
defaultPathConfig.Path = &pathStruct{
|
||||
Strip: &defaultPathStrip,
|
||||
IgnoreForNav: &defaultPathIgnoreForNav,
|
||||
}
|
||||
defaultPathConfig.Filename = &filenameStruct{
|
||||
Strip: &defaultFilenameStrip,
|
||||
Ignore: &defaultFilenameIgnore,
|
||||
OutputExtension: &defaultFilenameOutputExtension,
|
||||
}
|
||||
|
||||
readContentDir(*inDir+"/content", *outDir, "", defaultPathConfig, contentConfig)
|
||||
//spew.Dump(contentConfig)
|
||||
|
||||
Reference in New Issue
Block a user