mirror of
https://github.com/thebaer/tildes.git
synced 2018-07-20 07:15:21 +00:00
Create a <table> from a delimited text file
This commit is contained in:
parent
869f9dc27c
commit
caf129870d
120
tablizer.go
Normal file
120
tablizer.go
Normal file
@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"time"
|
||||
"sort"
|
||||
"bufio"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("Starting...")
|
||||
|
||||
headers := []string{ "User", "Tildes", "Last Collection" }
|
||||
generate("tilde collectors", sortScore(readData("/home/krowbar/Code/irc/tildescores.txt", "&^%", headers)), "tildes")
|
||||
}
|
||||
|
||||
type Table struct {
|
||||
Headers []string
|
||||
Rows []Row
|
||||
}
|
||||
|
||||
type Row struct {
|
||||
Data []string
|
||||
}
|
||||
|
||||
type By func(r1, r2 *Row) bool
|
||||
func (by By) Sort(rows []Row) {
|
||||
rs := &rowSorter {
|
||||
rows: rows,
|
||||
by: by,
|
||||
}
|
||||
sort.Sort(rs)
|
||||
}
|
||||
type rowSorter struct {
|
||||
rows []Row
|
||||
by func(r1, r2 *Row) bool
|
||||
}
|
||||
func (r *rowSorter) Len() int {
|
||||
return len(r.rows)
|
||||
}
|
||||
func (r *rowSorter) Swap(i, j int) {
|
||||
r.rows[i], r.rows[j] = r.rows[j], r.rows[i]
|
||||
}
|
||||
func (r *rowSorter) Less(i, j int) bool {
|
||||
return r.by(&r.rows[i], &r.rows[j])
|
||||
}
|
||||
|
||||
func sortScore(table *Table) *Table {
|
||||
score := func(r1, r2 *Row) bool {
|
||||
s1, _ := strconv.Atoi(r1.Data[1])
|
||||
s2, _ := strconv.Atoi(r2.Data[1])
|
||||
return s1 < s2
|
||||
}
|
||||
decScore := func(r1, r2 *Row) bool {
|
||||
return !score(r1, r2)
|
||||
}
|
||||
By(decScore).Sort(table.Rows)
|
||||
|
||||
return table
|
||||
}
|
||||
|
||||
func readData(path string, delimiter string, headers []string) *Table {
|
||||
f, _ := os.Open(path)
|
||||
|
||||
defer f.Close()
|
||||
|
||||
rows := []Row{}
|
||||
table := &Table{Headers: headers, Rows: nil}
|
||||
s := bufio.NewScanner(f)
|
||||
s.Split(bufio.ScanLines)
|
||||
|
||||
for s.Scan() {
|
||||
data := strings.Split(s.Text(), delimiter)
|
||||
row := &Row{Data: data}
|
||||
rows = append(rows, *row)
|
||||
}
|
||||
table.Rows = rows
|
||||
|
||||
return table
|
||||
}
|
||||
|
||||
type Page struct {
|
||||
Title string
|
||||
Table Table
|
||||
Updated string
|
||||
UpdatedForHumans string
|
||||
}
|
||||
|
||||
func generate(title string, table *Table, outputFile string) {
|
||||
fmt.Println("Generating page.")
|
||||
|
||||
f, err := os.Create(os.Getenv("HOME") + "/public_html/" + outputFile + ".html")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
|
||||
w := bufio.NewWriter(f)
|
||||
template, err := template.ParseFiles("templates/table.html")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Extra page data
|
||||
curTime := time.Now().UTC()
|
||||
updatedReadable := curTime.Format(time.RFC1123)
|
||||
updated := curTime.Format(time.RFC3339)
|
||||
|
||||
// Generate the page
|
||||
page := &Page{Title: title, Table: *table, UpdatedForHumans: updatedReadable, Updated: updated}
|
||||
template.ExecuteTemplate(w, "table", page)
|
||||
w.Flush()
|
||||
|
||||
fmt.Println("DONE!")
|
||||
}
|
31
templates/table.html
Normal file
31
templates/table.html
Normal file
@ -0,0 +1,31 @@
|
||||
{{define "table"}}
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<title>{{.Title}}</title>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="tilde.css" />
|
||||
|
||||
</head>
|
||||
<body id="hello">
|
||||
|
||||
<h1>{{.Title}}</h1>
|
||||
<p>Last Updated: <time datetime="{{.Updated}}">{{.UpdatedForHumans}}</time></p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
{{range .Table.Headers}}
|
||||
<th>{{.}}</th>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{range .Table.Rows}}
|
||||
<tr>
|
||||
{{range .Data}}
|
||||
<td>{{.}}</td>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{end}}
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
{{end}}
|
Loading…
Reference in New Issue
Block a user