Skip to content
Snippets Groups Projects
generate.go 2.16 KiB
Newer Older
  • Learn to ignore specific revisions
  • package html
    
    import (
    
    	"encoding/json"
    	"gitlab.schukai.com/oss/bob/types"
    
    	"gitlab.schukai.com/oss/libraries/go/markup/html/engine"
    	"gopkg.in/yaml.v3"
    	"os"
    	"path"
    	"strings"
    )
    
    func GenerateFiles(dataPath, out string) error {
    
    	dir := path.Dir(dataPath)
    
    	yamlFile, err := os.ReadFile(dataPath)
    	if err != nil {
    		return err
    	}
    
    	storage := types.NewPageDataStorage()
    	if err := yaml.Unmarshal(yamlFile, storage); err != nil {
    		return err
    	}
    
    	for name, page := range storage {
    		p := path.Join(dir, name)
    		html, err := Generate(page, p)
    		if err != nil {
    			return err
    		}
    
    
    Volker Schukai's avatar
    Volker Schukai committed
    		outFile := path.Join(out, page.Export)
    
    		dir := path.Dir(outFile)
    		if err := os.MkdirAll(dir, 0755); err != nil {
    			return err
    		}
    
    
    		err = os.WriteFile(outFile, []byte(html), 0644)
    		if err != nil {
    			return err
    		}
    
    	}
    
    	return nil
    }
    
    func Generate(data *types.PageData, name string) (string, error) {
    
    	dataset := make(map[any]any)
    	dataset["lang"] = data.Lang
    	dataset["title"] = data.Title
    	dataset["meta"] = make(map[any]any)
    	for k, v := range data.Meta {
    		dataset["meta"].(map[any]any)[k] = v
    	}
    	dataset["images"] = make(map[any]any, 0)
    	for _, v := range data.Images {
    		dataset["images"].(map[any]any)[v.Id] = map[any]any{
    			"source": v.Source,
    			"alt":    v.Alt,
    			"title":  v.Title,
    			"id":     v.Id,
    		}
    	}
    
    	dataset["anchors"] = make(map[any]any, 0)
    	for _, v := range data.Anchors {
    		dataset["anchors"].(map[any]any)[v.Id] = map[any]any{
    			"href":     v.Href,
    			"hreflang": v.HrefLang,
    			"title":    v.Title,
    			"id":       v.Id,
    		}
    	}
    
    	dataset["text"] = make(map[any]any, 0)
    	for _, v := range data.Text {
    		dataset["text"].(map[any]any)[v.Id] = map[any]any{"text": v.Text}
    	}
    
    
    	dataset["translations"] = make(map[string]any, 0)
    	for _, v := range data.Translations {
    		j, err := json.Marshal(v.KeyValues)
    		if err != nil {
    			return "", err
    		}
    		dataset["translations"].(map[string]any)[v.Id] = map[string]string{
    			"content": string(j),
    		}
    
    	}
    
    
    	e := engine.New(dataset)
    
    	template, err := os.ReadFile(name)
    	if err != nil {
    		return "", err
    	}
    
    	stringWriter := &strings.Builder{}
    	e.ProcessHtml(stringWriter, strings.NewReader(string(template)))
    
    	return stringWriter.String(), nil
    }