SimonSarasovaWebsite/main.go

252 lines
6.6 KiB
Go
Raw Normal View History

2024-05-01 09:38:23 +02:00
// This package exports Simon Sarasova's website into the ExportedWebsite folder
// The website is deployed to the SimonSarasova.eth IPFS domain.
package main
import "bytes"
import "errors"
import "log"
import "os"
import "strings"
import "text/template"
import goFilepath "path/filepath"
func main(){
exportWebsite := func()error{
websiteFolderpath := "./ExportedWebsite"
err := os.RemoveAll(websiteFolderpath)
if (err != nil){ return err }
err = os.Mkdir(websiteFolderpath, os.ModePerm)
if (err != nil) { return err }
// We create the style.css file
cssPageBytes, err := os.ReadFile("./resources/style.css")
if (err != nil) { return err }
cssPageString := string(cssPageBytes)
cssFilepath := goFilepath.Join(websiteFolderpath, "style.css")
err = createFile(cssFilepath, cssPageString)
if (err != nil) { return err }
// We copy various folders
copyFolder := func(folderName string)error{
sourceFolderPath := goFilepath.Join("./resources/", folderName)
destinationFolderPath := goFilepath.Join(websiteFolderpath, folderName)
err := copyFolderRecursively(sourceFolderPath, destinationFolderPath)
if (err != nil) { return err }
return nil
}
err = copyFolder("images")
if (err != nil) { return err }
err = copyFolder("memos")
if (err != nil) { return err }
templateDefinitionsMap := make(map[string]string)
// We add code snippets to the templateDefinitionsMap
fileList, err := os.ReadDir("./resources/codeSnippets")
if (err != nil) { return err }
for _, fileObject := range fileList{
fileName := fileObject.Name()
filePath := goFilepath.Join("./resources/codeSnippets/", fileName)
fileBytes, err := os.ReadFile(filePath)
if (err != nil) { return err }
snippetString := string(fileBytes)
snippetName := strings.TrimSuffix(fileName, ".html")
codeSnippetKey := "CodeSnippet_" + snippetName
_, exists := templateDefinitionsMap[codeSnippetKey]
if (exists == true){
return errors.New("Cannot export website: name conflict found within codeSnippets")
}
templateDefinitionsMap[codeSnippetKey] = snippetString
}
// We use this function to parse the .html files to replace the internal template values with actual values
// For example, {{.BaseURL}} will be replaced with either "." or ".."
// We have to parse twice for the web pages.
// Code snippets have fields that need to be parsed
// So to process the code snippets, we have to:
// 1. First parse the html page files to add the code snippets
// 2. Then parse again to replace any instances of fields such as {{.BaseURL}} within the code snippets we just added
//
parseTemplateObjectToStringTwice := func(templateObject *template.Template, definitionsMap map[string]string)(string, error){
parseTemplateObjectToString := func(inputTemplateObject *template.Template)(string, error){
inputTemplateObject.Option("missingkey=error")
parsedTemplateBuffer := new(bytes.Buffer)
err = inputTemplateObject.Execute(parsedTemplateBuffer, definitionsMap)
if (err != nil){ return "", err }
parsedTemplateString := parsedTemplateBuffer.String()
return parsedTemplateString, nil
}
parsedTemplateString_Round1, err := parseTemplateObjectToString(templateObject)
if (err != nil) { return "", err }
templateObject2 := template.New("Round2")
_, err = templateObject2.Parse(parsedTemplateString_Round1)
if (err != nil) { return "", err }
parsedTemplateString_Round2, err := parseTemplateObjectToString(templateObject2)
if (err != nil) { return "", err }
return parsedTemplateString_Round2, nil
}
templateDefinitionsMap["BaseURL"] = "."
pageFilenamesList := []string{
"index.html",
"blog.html",
2024-06-14 12:01:11 +02:00
"blog-archive.html",
2024-05-01 09:38:23 +02:00
"contact.html",
"donate.html",
"keys.html",
"links.html",
"proof.html",
"posts.html",
2024-06-20 08:29:40 +02:00
"posts-archive.html",
2024-05-01 09:38:23 +02:00
}
for _, pageFilename := range pageFilenamesList{
pageTemplateFilepath := goFilepath.Join("./resources/pages/", pageFilename)
pageTemplateObject, err := template.ParseFiles(pageTemplateFilepath)
if (err != nil){ return err }
pageString, err := parseTemplateObjectToStringTwice(pageTemplateObject, templateDefinitionsMap)
if (err != nil) { return err }
pageFilepath := goFilepath.Join(websiteFolderpath, pageFilename)
err = createFile(pageFilepath, pageString)
if (err != nil) { return err }
}
// Now we create the blog post pages
blogPostsFolderpath := goFilepath.Join(websiteFolderpath, "blog")
err = os.Mkdir(blogPostsFolderpath, os.ModePerm)
if (err != nil) { return err }
templateDefinitionsMap["BaseURL"] = ".."
blogPostPageFilenamesList := []string{
"hello-world.html",
"why-race-extinction-matters.html",
"beauty-extinction-is-unlikely.html",
"de-emphasizing-race.html",
2024-05-01 09:38:23 +02:00
}
for _, pageFilename := range blogPostPageFilenamesList{
pageTemplateFilepath := goFilepath.Join("./resources/pages/blog", pageFilename)
pageTemplateObject, err := template.ParseFiles(pageTemplateFilepath)
if (err != nil){ return err }
pageString, err := parseTemplateObjectToStringTwice(pageTemplateObject, templateDefinitionsMap)
if (err != nil) { return err }
pageFilepath := goFilepath.Join(blogPostsFolderpath, pageFilename)
err = createFile(pageFilepath, pageString)
if (err != nil) { return err }
}
return nil
}
err := exportWebsite()
if (err != nil){
log.Println("Failed to export website: " + err.Error())
return
}
log.Println("Simon Sarasova's website has been exported!")
}
// This function will copy a folder and its subfolders
func copyFolderRecursively(sourceFolderPath string, destinationFolderPath string)error{
err := os.Mkdir(destinationFolderPath, os.ModePerm)
if (err != nil) { return err }
filesystemPathsList, err := os.ReadDir(sourceFolderPath)
if (err != nil) { return err }
for _, filesystemObject := range filesystemPathsList{
pathName := filesystemObject.Name()
sourcePathName := goFilepath.Join(sourceFolderPath, pathName)
destinationPathName := goFilepath.Join(destinationFolderPath, pathName)
isDirectory := filesystemObject.IsDir()
if (isDirectory == true){
err := copyFolderRecursively(sourcePathName, destinationPathName)
if (err != nil) { return err }
} else {
fileBytes, err := os.ReadFile(sourcePathName)
if (err != nil) { return err }
fileString := string(fileBytes)
err = createFile(destinationPathName, fileString)
if (err != nil) { return err }
}
}
return nil
}
func createFile(filePath string, fileContents string)error{
newFile, err := os.Create(filePath)
_, err = newFile.WriteString(fileContents)
if (err != nil) { return err }
newFile.Close()
return nil
}