这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions assets/css/custom.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
body {
font-family: Arial, sans-serif;
}

header {
background-color: #f8f8f8;
padding: 10px 0;
text-align: center;
}

footer {
background-color: #f8f8f8;
padding: 10px 0;
text-align: center;
}

main {
padding: 20px;
}
Binary file added assets/img/BachErik.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 65 additions & 0 deletions companies/BachErik.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
[
{
"name": "AnkiLang",
"description": "",
"link": "https://ankilang.bacherik.de",
"type": "software",
"company": "BachErik",
"dateOpen": "2024.06.05",
"dateClose": "2024.06.08"
},
{
"name": "Websitetool",
"description": "",
"link": "https://github.com/BachErik/Websitetool",
"type": "software",
"company": "BachErik",
"dateOpen": "2023.01.31",
"dateClose": "2023.03.20"
},
{
"name": "PABW",
"description": "",
"link": "https://github.com/BachErik/PABW",
"type": "software",
"company": "BachErik",
"dateOpen": "2022.12.20",
"dateClose": "2023.03.18"
},
{
"name": "WinDoofOS",
"description": "",
"link": "https://github.com/BachErik/WinDoofOS",
"type": "software",
"company": "BachErik",
"dateOpen": "2022.01.14",
"dateClose": "2023.03.18"
},
{
"name": "PC",
"description": "",
"link": "https://github.com/BachErik/PC",
"type": "software",
"company": "BachErik",
"dateOpen": "2024.06.08",
"dateClose": "2024.06.09"
},
{
"name": "Partner-Bot",
"description": "",
"link": "https://github.com/BachErik/Partner-Bot",
"type": "software",
"company": "BachErik",
"dateOpen": "2022.03.17",
"dateClose": "2023.02.19"
},
{
"name": "BanSystem",
"description": "",
"link": "https://github.com/BachErik-Team/BanSystem",
"type": "software",
"company": "BachErik",
"dateOpen": "2023.09.08",
"dateClose": "2024.01.08"
}
]
3 changes: 0 additions & 3 deletions content/page1.html

This file was deleted.

3 changes: 0 additions & 3 deletions content/page2.html

This file was deleted.

2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
module bacherik/killedby

go 1.22.4

require github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
203 changes: 173 additions & 30 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,56 +1,199 @@
package main

import (
"fmt"
"encoding/json"
"html/template"
"image"
"image/png"
"log"
"os"
"path/filepath"

_ "image/jpeg"
_ "image/png"
"io"

"github.com/nfnt/resize"
)

func main() {
// Define the directory paths
contentDir := "content"
templatesDir := "templates"
outputDir := "output"
type Type struct {
Types map[string]string `json:"types"`
Companies map[string]string `json:"companies"`
}

type Project struct {
Name string `json:"name"`
Description string `json:"description"`
Link string `json:"link"`
Type string `json:"type"`
Company string `json:"company"`
DateOpen string `json:"dateOpen"`
DateClose string `json:"dateClose"`
}

type Data struct {
Projects []Project
Types map[string]string
Companies map[string]string
}

// Read header and footer templates
header, err := os.ReadFile(filepath.Join(templatesDir, "header.html"))
func main() {
typesFile, err := os.ReadFile("types_and_companies.json")
if err != nil {
log.Fatalf("Error reading header: %v", err)
log.Fatalf("Error reading types and companies file: %v", err)
}

footer, err := os.ReadFile(filepath.Join(templatesDir, "footer.html"))
var types Type
err = json.Unmarshal(typesFile, &types)
if err != nil {
log.Fatalf("Error reading footer: %v", err)
log.Fatalf("Error unmarshaling types and companies JSON: %v", err)
}

data := Data{
Types: types.Types,
Companies: types.Companies,
}

// Read company project files
for company := range types.Companies {
companyProjectsFile := filepath.Join("companies", company+".json")
projectsFile, err := os.ReadFile(companyProjectsFile)
if err != nil {
log.Fatalf("Error reading projects file for company %s: %v", company, err)
}

var companyProjects []Project
err = json.Unmarshal(projectsFile, &companyProjects)
if err != nil {
log.Fatalf("Error unmarshaling projects JSON for company %s: %v", company, err)
}

data.Projects = append(data.Projects, companyProjects...)
}

indexTmpl := template.Must(template.ParseFiles("templates/indexTemplate.html"))
projectTmpl := template.Must(template.New("project").Parse(projectTemplate))

// Create output directory if it doesn't exist
if _, err := os.Stat(outputDir); os.IsNotExist(err) {
os.Mkdir(outputDir, os.ModePerm)
err = os.MkdirAll("output", os.ModePerm)
if err != nil {
log.Fatalf("Error creating output directory: %v", err)
}

// Read the content directory
files, err := os.ReadDir(contentDir)
// Copy and resize assets to output directory
err = copyAndResizeAssets("assets", "output/assets", 100) // Resize to 100px width
if err != nil {
log.Fatalf("Error reading content directory: %v", err)
log.Fatalf("Error copying and resizing assets: %v", err)
}

for _, file := range files {
if filepath.Ext(file.Name()) == ".html" {
content, err := os.ReadFile(filepath.Join(contentDir, file.Name()))
if err != nil {
log.Printf("Error reading content file %s: %v", file.Name(), err)
continue
}
f, err := os.Create("output/index.html")
if err != nil {
log.Fatalf("Error creating output file: %v", err)
}
defer f.Close()

outputFilePath := filepath.Join(outputDir, file.Name())
err = os.WriteFile(outputFilePath, append(append(header, content...), footer...), 0644)
if err != nil {
log.Printf("Error writing output file %s: %v", outputFilePath, err)
continue
}
err = indexTmpl.Execute(f, data)
if err != nil {
log.Fatalf("Error executing index template: %v", err)
}

fmt.Printf("Generated %s\n", outputFilePath)
for _, project := range data.Projects {
companyDir := filepath.Join("output", project.Company)
err = os.MkdirAll(companyDir, os.ModePerm)
if err != nil {
log.Fatalf("Error creating company directory: %v", err)
}

projectFile, err := os.Create(filepath.Join(companyDir, project.Name+".html"))
if err != nil {
log.Fatalf("Error creating project file: %v", err)
}
defer projectFile.Close()

err = projectTmpl.Execute(projectFile, project)
if err != nil {
log.Fatalf("Error executing project template: %v", err)
}
}
}

func copyAndResizeAssets(src, dst string, width uint) error {
return filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
relPath := path[len(src):]
targetPath := filepath.Join(dst, relPath)
if info.IsDir() {
return os.MkdirAll(targetPath, info.Mode())
} else {
if filepath.Ext(path) == ".png" || filepath.Ext(path) == ".jpg" || filepath.Ext(path) == ".jpeg" {
return resizeImage(path, targetPath, width)
}
return copyFile(path, targetPath)
}
})
}

func resizeImage(src, dst string, width uint) error {
file, err := os.Open(src)
if err != nil {
return err
}
defer file.Close()

img, _, err := image.Decode(file)
if err != nil {
return err
}

m := resize.Resize(width, 0, img, resize.Lanczos3)

out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()

return png.Encode(out, m)
}

func copyFile(src, dst string) error {
sourceFile, err := os.Open(src)
if err != nil {
return err
}
defer sourceFile.Close()

destFile, err := os.Create(dst)
if err != nil {
return err
}
defer destFile.Close()

_, err = io.Copy(destFile, sourceFile)
return err
}

const projectTemplate = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ .Name }}</title>
<link rel="stylesheet" href="/assets/css/custom.css">
</head>
<body>
<header>
<h1>{{ .Name }}</h1>
</header>
<main>
<p>{{ .Description }}</p>
<p><a href="{{ .Link }}">{{ .Link }}</a></p>
<p>Opened: {{ .DateOpen }} Closed: {{ .DateClose }}</p>
</main>
<footer>
<p>&copy; 2024 {{ .Company }}</p>
</footer>
</body>
</html>`
37 changes: 37 additions & 0 deletions templates/indexTemplate.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Projects</title>
</head>
<body>
<header>
<h1>Companies</h1>
<ul>
{{ range $company, $logo := .Companies }}
<li><a href="{{ $company }}/"><img src="{{ $logo }}" alt="{{ $company }}" /></a></li>
{{ end }}
</ul>
</header>
<main>
<h1>Projects</h1>
<ul>
{{ range .Projects }}
<li>
<a href="{{ .Company }}/{{ .Name }}.html" style="color: {{ index $.Types .Type }}">
{{ .Name }}
</a> - {{ .Description }}
<br>
<a href="{{ .Link }}">{{ .Link }}</a>
<br>
Opened: {{ .DateOpen }} Closed: {{ .DateClose }}
</li>
{{ end }}
</ul>
</main>
<footer>
<p>&copy; 2024 My Static Site</p>
</footer>
</body>
</html>
10 changes: 10 additions & 0 deletions types_and_companies.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"types": {
"software": "#ff0000",
"hardware": "#00ff00",
"other": "#0000ff"
},
"companies": {
"BachErik": "assets/img/BachErik.png"
}
}