You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

158 lines
4.8 KiB

package main
import (
"bufio"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
"github.com/fatih/color"
)
//dataEntry is the map used to create the array of maps, where the templatejson data is stored
type dataEntry map[string]string
func readFile(path string) string {
dat, err := ioutil.ReadFile(path)
check(err)
return string(dat)
}
func getDataFromJson(path string) []dataEntry {
var entries []dataEntry
file, err := ioutil.ReadFile(path)
check(err)
content := string(file)
var rawEntries []*json.RawMessage
json.Unmarshal([]byte(content), &rawEntries)
for i := 0; i < len(rawEntries); i++ {
rawEntryMarshaled, err := json.Marshal(rawEntries[i])
check(err)
var newDataEntry map[string]string
json.Unmarshal(rawEntryMarshaled, &newDataEntry)
entries = append(entries, newDataEntry)
}
return entries
}
func replaceEntries(templateContent string, entries []dataEntry) string {
var newContent string
//replace {{}} for data
for i := 0; i < len(entries); i++ {
var entryContent string
entryContent = templateContent
//first, get the map keys
var keys []string
for key, _ := range entries[i] {
keys = append(keys, key)
}
//now, replace the keys with the values
for j := 0; j < len(keys); j++ {
entryContent = strings.Replace(entryContent, "{{"+keys[j]+"}}", entries[i][keys[j]], -1)
entryContent = strings.Replace(entryContent, "[[i]]", strconv.Itoa(i), -1)
}
newContent = newContent + entryContent
}
return newContent
}
func putDataInTemplate(templateContent string, entries []dataEntry) string {
var newContent string
newContent = templateContent
//replace <konstrui-repeat>
if strings.Contains(newContent, "<konstrui-repeat") && strings.Contains(newContent, "</konstrui-repeat>") {
//repeat, _ := getTagParameters(newContent, "konstrui-repeat", "repeat", "nil")
color.Blue("repeat data")
//fmt.Println(repeat)
//get content inside tags
//get tags, and split by tags, get the content between tags
extracted := extractText(newContent, "<konstrui-repeat", "</konstrui-repeat>")
fmt.Println(extracted)
//for each project, putDataInTemplate data:entries, template: content inside tags
fragment := replaceEntries(extracted, entries)
color.Blue(fragment)
//afegir fragment al newContent
//esborrar les línies dels tags
}
newContent = replaceEntries(templateContent, entries)
return newContent
}
func getTagParameters(line string, tagname string, param1 string, param2 string) (string, string) {
var param1content string
var param2content string
line = strings.Replace(line, "<"+tagname+" ", "", -1)
line = strings.Replace(line, "></"+tagname+">", "", -1)
attributes := strings.Split(line, " ")
//fmt.Println(attributes)
for i := 0; i < len(attributes); i++ {
attSplitted := strings.Split(attributes[i], "=")
if attSplitted[0] == param1 {
param1content = strings.Replace(attSplitted[1], `"`, "", -1)
param1content = strings.Replace(param1content, ">", "", -1)
}
if attSplitted[0] == param2 {
param2content = strings.Replace(attSplitted[1], `"`, "", -1)
param2content = strings.Replace(param2content, ">", "", -1)
}
}
return param1content, param2content
}
func useTemplate(templatePath string, dataPath string) string {
filepath := rawFolderPath + "/" + templatePath
templateContent := readFile(filepath)
entries := getDataFromJson(rawFolderPath + "/" + dataPath)
generated := putDataInTemplate(templateContent, entries)
return generated
}
func putTemplates(folderPath string, filename string) string {
var fileContent string
f, err := os.Open(folderPath + "/" + filename)
check(err)
scanner := bufio.NewScanner(f)
lineCount := 1
for scanner.Scan() {
currentLine := scanner.Text()
if strings.Contains(currentLine, "<konstrui-template") && strings.Contains(currentLine, "</konstrui-template>") {
templatePath, data := getTagParameters(currentLine, "konstrui-template", "html", "data")
fileContent = fileContent + useTemplate(templatePath, data)
} else {
fileContent = fileContent + currentLine
}
lineCount++
}
return fileContent
}
func writeFile(path string, newContent string) {
err := ioutil.WriteFile(path, []byte(newContent), 0644)
check(err)
}
/*func generatePageFromTemplateAndData(templateContent string, entry dataEntry) string {
var entryContent string
entryContent = templateContent
//first, get the map keys
var keys []string
for key, _ := range entry {
keys = append(keys, key)
}
//now, replace the keys with the values
for j := 0; j < len(keys); j++ {
entryContent = strings.Replace(entryContent, "{{"+keys[j]+"}}", entry[keys[j]], -1)
}
return entryContent
}*/
func getHtmlAndDataFromRepeatPages(page RepeatPages) (string, []dataEntry) {
templateContent := readFile(rawFolderPath + "/" + page.HtmlPage)
data := getDataFromJson(rawFolderPath + "/" + page.Data)
return templateContent, data
}