Initial commit

This commit is contained in:
Keith Solomon
2025-04-19 14:33:01 -05:00
commit 9654e9965c
9 changed files with 218 additions and 0 deletions

8
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,8 @@
{
"workbench.colorCustomizations": {
"tree.indentGuidesStroke": "#3d92ec",
"activityBar.background": "#0C188E",
"titleBar.activeBackground": "#1121C7",
"titleBar.activeForeground": "#F9F9FE"
}
}

3
content/about.md Normal file
View File

@@ -0,0 +1,3 @@
# About
Experimenting with Go. Seems pretty cool so far!

3
content/index.md Normal file
View File

@@ -0,0 +1,3 @@
# Welcome
This is your first static site built with Go!

5
go.mod Normal file
View File

@@ -0,0 +1,5 @@
module go-ssg
go 1.24.2
require github.com/russross/blackfriday/v2 v2.1.0 // indirect

2
go.sum Normal file
View File

@@ -0,0 +1,2 @@
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=

98
main.go Normal file
View File

@@ -0,0 +1,98 @@
package main
import (
"fmt"
"html/template"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/russross/blackfriday/v2"
)
// NavItem represents a link in the navigation menu
type NavItem struct {
Title string
URL string
}
func main() {
contentDir := "./content"
outputDir := "./public"
templateFile := "./templates/layout.html"
tpl, err := parseTemplate(templateFile)
if err != nil {
fmt.Printf("Template parsing error: %v\n", err)
return
}
files, err := readMarkdownFiles(contentDir)
if err != nil {
fmt.Printf("Failed to read content directory: %v\n", err)
return
}
nav := buildNavigation(files)
generatePages(files, contentDir, outputDir, tpl, nav)
fmt.Println("✅ Site generation complete.")
}
func parseTemplate(templateFile string) (*template.Template, error) {
return template.ParseFiles(templateFile)
}
func readMarkdownFiles(contentDir string) ([]os.FileInfo, error) {
return ioutil.ReadDir(contentDir)
}
func buildNavigation(files []os.FileInfo) []NavItem {
var nav []NavItem
for _, file := range files {
if filepath.Ext(file.Name()) == ".md" {
title := strings.Title(strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())))
filename := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())) + ".html"
nav = append(nav, NavItem{Title: title, URL: "/" + filename})
}
}
return nav
}
func generatePages(files []os.FileInfo, contentDir, outputDir string, tpl *template.Template, nav []NavItem) {
for _, file := range files {
if filepath.Ext(file.Name()) == ".md" {
mdPath := filepath.Join(contentDir, file.Name())
mdContent, err := ioutil.ReadFile(mdPath)
if err != nil {
fmt.Printf("Failed to read %s: %v\n", file.Name(), err)
continue
}
htmlContent := blackfriday.Run(mdContent)
outFile := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())) + ".html"
outPath := filepath.Join(outputDir, outFile)
out, err := os.Create(outPath)
if err != nil {
fmt.Printf("Failed to create %s: %v\n", outPath, err)
continue
}
data := map[string]interface{}{
"Content": template.HTML(htmlContent),
"Title": strings.Title(strings.TrimSuffix(file.Name(), filepath.Ext(file.Name()))),
"Nav": nav,
}
err = tpl.Execute(out, data)
if err != nil {
fmt.Printf("Template execution failed for %s: %v\n", file.Name(), err)
continue
}
fmt.Printf("Generated: %s\n", outPath)
}
}
}

35
public/about.html Normal file
View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>About</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/about.html">About</a></li>
<li><a href="/index.html">Index</a></li>
</ul>
</nav>
</header>
<main>
<h1>About
</h1>
<p>
Experimenting with Go. Seems pretty cool so far!
</p>
</main>
<footer>
<p>&copy; Keith Solomon</p>
</footer>
</body>

35
public/index.html Normal file
View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/about.html">About</a></li>
<li><a href="/index.html">Index</a></li>
</ul>
</nav>
</header>
<main>
<h1>Welcome
</h1>
<p>
This is your first static site built with Go!
</p>
</main>
<footer>
<p>&copy; Keith Solomon</p>
</footer>
</body>

29
templates/layout.html Normal file
View File

@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ .Title }}</title>
</head>
<body>
<header>
<nav>
<ul>
{{ range .Nav }}
<li><a href="{{ .URL }}">{{ .Title }}</a></li>
{{ end }}
</ul>
</nav>
</header>
<main>
{{ .Content }}
</main>
<footer>
<p>&copy; {{ .Year }} Keith Solomon</p>
</footer>
</body>
</html>