package main import ( "bufio" "encoding/json" "fmt" "io/ioutil" "os" "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 duplicateText(original string, count int) string { var result string for i := 0; i < count; i++ { result = result + original } return result } func replaceEntry(templateContent string, entry 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 entry { keys = append(keys, key) } //now, replace the keys with the values for j := 0; j < len(keys); j++ { templateContent = strings.Replace(templateContent, "{{"+keys[j]+"}}", entry[keys[j]], -1) //templateContent = strings.Replace(templateContent, "[[i]]", strconv.Itoa(i), -1) } //newContent = newContent + entryContent //newContent = newContent + "\n" //} return templateContent } func putDataInTemplate(templateContent string, entries []dataEntry) string { var newContent string newContent = templateContent //replace if strings.Contains(newContent, "") { //repeat, _ := getTagParameters(newContent, "konstrui-repeat", "repeat", "nil") //get content inside tags //get tags, and split by tags, get the content between tags extracted := extractText(newContent, "") //for each project, putDataInTemplate data:entries, template: content inside tags //var fragment string var replaced string for _, entry := range entries { color.Green(extracted) fmt.Println(entry) replaced = replaced + replaceEntry(extracted, entry) } fragmentLines := getLines(replaced) fragmentLines = deleteArrayElementsWithString(fragmentLines, "konstrui-repeat") //afegir fragment al newContent, substituint el fragment original lines := getLines(templateContent) p := locateStringInArray(lines, "konstrui-repeat") lines = deleteLinesBetween(lines, p[0], p[1]) lines = addElementsToArrayPosition(lines, fragmentLines, p[0]) /*lines = deleteArrayElementsWithString(lines, "konstrui-repeat") fmt.Println(lines)*/ templateContent = concatStringsWithJumps(lines) fmt.Println(templateContent) newContent = templateContent } color.Red(newContent) result := templateContent for _, entry := range entries { result = replaceEntry(result, entry) } color.Blue(result) return result } 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, ">", "", -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 useTemplateContent(templateContent string, dataPath string) string { 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, "") { templatePath, data := getTagParameters(currentLine, "konstrui-template", "html", "data") fileContent = fileContent + useTemplate(templatePath, data) + "\n" } else { fileContent = fileContent + currentLine + "\n" } lineCount++ } if strings.Contains(fileContent, "