A simple blog generator for your ~
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

135 linhas
2.9 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "time"
  6. "strconv"
  7. "text/template"
  8. "os"
  9. "bufio"
  10. "regexp"
  11. "flag"
  12. "encoding/json"
  13. )
  14. var outputPath string = os.Getenv("HOME") + "/public_html/"
  15. const entriesPath = "./entries/"
  16. const templatesPath = "./templates/"
  17. const defaultTemplateFile = "log"
  18. const defaultOutFile = "~log"
  19. type Entry struct {
  20. Date string
  21. Body []byte
  22. }
  23. func loadEntry(rawDate string) (*Entry, error) {
  24. filename := entriesPath + rawDate
  25. body, err := ioutil.ReadFile(filename)
  26. if err != nil {
  27. return nil, err
  28. }
  29. // Get raw date parts for formatting
  30. year := rawDate[:4]
  31. month, moErr := strconv.Atoi(rawDate[4:6])
  32. if moErr != nil {
  33. return nil, moErr
  34. }
  35. date, dateErr := strconv.Atoi(rawDate[6:8])
  36. if dateErr != nil {
  37. return nil, dateErr
  38. }
  39. formattedDate := fmt.Sprintf("%d %s %s", date, time.Month(month).String(), year)
  40. return &Entry{Date: formattedDate, Body: body}, nil
  41. }
  42. func main() {
  43. fmt.Println()
  44. fmt.Println(" ~log generator v1.1")
  45. fmt.Println()
  46. // Get any arguments
  47. templateFilePtr := flag.String("t", defaultTemplateFile, "Squigglelog template file (defined name).")
  48. outFilePtr := flag.String("o", defaultOutFile, "Squigglelog template file (defined name).")
  49. flag.Parse()
  50. entryFiles := getEntries()
  51. entries := make([]Entry, len(*entryFiles))
  52. i := 0
  53. for _, file := range *entryFiles {
  54. entry, err := loadEntry(file)
  55. if err != nil {
  56. fmt.Printf("Error, skipping entry %s: %s\n", file, err)
  57. continue
  58. }
  59. fmt.Printf("Adding entry %s...\n", file)
  60. entries[i] = *entry
  61. i++
  62. }
  63. fmt.Printf("Using template %s...\n", *templateFilePtr)
  64. generateLog(entries, *templateFilePtr, *outFilePtr)
  65. fmt.Printf("Finished! Saved to %s%s.html\n", outputPath, *outFilePtr)
  66. }
  67. type Config struct {
  68. EntriesPath string
  69. TemplateFile string
  70. }
  71. func configuration() *Config {
  72. file, err := os.Open(os.Getenv("HOME") + "/.tildelog")
  73. if err != nil {
  74. return nil
  75. }
  76. d := json.NewDecoder(file)
  77. c := Config{}
  78. err = d.Decode(&c)
  79. if err != nil {
  80. fmt.Printf("Couldn't decode configuration: %s\n", err)
  81. }
  82. return &c
  83. }
  84. var validFileFormat = regexp.MustCompile("^[0-9]{8}$")
  85. func getEntries() *[]string {
  86. files, _ := ioutil.ReadDir(entriesPath)
  87. fileList := make([]string, len(files))
  88. fileCount := 0
  89. // Traverse file list in reverse, i.e. newest to oldest
  90. for i := len(files)-1; i >= 0; i-- {
  91. file := files[i]
  92. if validFileFormat.Match([]byte(file.Name())) {
  93. fileList[fileCount] = file.Name()
  94. fileCount++
  95. }
  96. }
  97. fileList = fileList[:fileCount]
  98. return &fileList
  99. }
  100. func generateLog(entries []Entry, templateFile string, outFile string) {
  101. file, err := os.Create(outputPath + outFile + ".html")
  102. if err != nil {
  103. panic(err)
  104. }
  105. defer file.Close()
  106. writer := bufio.NewWriter(file)
  107. template, err := template.ParseGlob(templatesPath + "*.html")
  108. if err != nil {
  109. panic(err)
  110. }
  111. template.ExecuteTemplate(writer, templateFile, entries)
  112. writer.Flush()
  113. }