Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge remote-tracking branch 'stone/config'

Incorporate fixes and features from stone
  - Switch to Go1 support
  - Switch config to JSON, remove old config
  - Add flags

Add Url value to page object

Change "template" directory name to "source", more accurately
represents what the directory is. Template is confusing.

Remove generated files, no need to be in repo

Switch blackfriday library to fork which works with Go1

Conflicts:
	README.md
  • Loading branch information...
commit 2468e0a1f08a8e335c2bc19c1ea1c0d07572c77d 2 parents aebc71e + 6467540
@mkaz authored
View
60 README.md
@@ -1,13 +1,13 @@
-
## Hastie - Static Site Generator in Go
-Author : Marcus Kazmierczak
- http://mkaz.com/
+Author :
+
+ - Marcus Kazmierczak, http://mkaz.com/
+ - Fredrik Steen, http://github.com/stone
Started: Feb 13, 2012
Project: https://github.com/mkaz/hastie
-
Hastie is intended as replacement of jekyll (for myself), but jekyll has a robust plugin, extensibility and community that I do not expect to even attempt. If you are looking for a flexible tool to publish your site use jekyll.
If you are looking for a tool to tweek and play with the Go language, then this might be your choice. Most customizations will probably require code changes. The reason I created the tool was to learn Go, I'm publishing to hopefully help others with playing with the language.
@@ -18,27 +18,36 @@ Note: The name Hastie also comes from the novel Dr. Jekyll and Mr. Hyde
## Install Notes
-You need Go binaries already installed see: http://golang.org/doc/install.html
+Untill Go v1.0 is released you need to install Go Weekly: <http://golang.org/doc/install.html#fetch>
-For my Mac I use homebrew, so it was simply a matter of: `brew install go`
+ $ cd $HOME
+ $ hg clone -u weekly https://go.googlecode.com/hg/ go
+ $ cd $HOME/go/src; ./all.bash
+ $ echo "GOROOT=$HOME/go" >> $HOME/.bashrc
-For my Linux environments I use a Debian variant so you can install with: `apt-get install golang`
#### Libraries
-Uses **blackfriday** for markdown conversion. `goinstall github.com/russross/blackfriday`
+Uses **blackfriday** for markdown conversion. `go get github.com/russross/blackfriday`
-Uses **goconf** for reading configuration file `goinstall goconf.googlecode.com/hg`
-If the above does not work for gconf, try
+--------------------------------------------------------------------------------
+
+## Usage
- cd $GOROOT/src/pkg/goconf/googlecode.com/hg
- gomake install`
+ usage: hastie [flags]
+ -c="hastie.json": Config file
+ -h=false: show this help
+ -v=false: verbose output
+Configuration file format (default ./hastie.json)
---------------------------------------------------------------------------------
+ {
+ "TemplateDir": "posts",
+ "LayoutDir": "layouts",
+ "PublishDir": "public"
+ }
-## Usage
Hastie walks through a templates directory and generates HTML files to a publish directory. It uses Go's template language for templates and markdown for content.
@@ -67,7 +76,6 @@ A few current limitations:
* all files must be have .md extension
* sub-directories are only one level deep
-
The usage of hastie is just as a template engine, it does not copy over any images, does not have a built-in web server or any of the other features that jekyll has.
I keep the `public` directory full with all of the assets for the site such as images, stylesheets, etc and hastie copies in the html files. So if you delete a template it won't be removed from `public`
@@ -96,7 +104,6 @@ Data available to templates:
* Read .html files and apply template, no markdown
* Add ability to support rss.xml
-* Command Line Arguments (--verbose, --help)
@@ -104,8 +111,23 @@ Data available to templates:
### CHANGE LOG
-ver 0.2
-* In config, renamed `template_dir` to `source` This more accurately describes the directory, what I was thinking was templates to be expanded are really the source files for the site.
-* Added Url parameter to templates
+ver 0.3
+
+ * Merged Fredrik Steen changes in github.com/stone/hastie
+
+ * Switched config to json format
+ - removed dependency on old config
+
+ * Moved to Go1 support
+
+
+
+
+ver 0.2 (unreleased)
+
+ * In config, renamed `template_dir` to `source` This more accurately describes the directory, what I was thinking was templates to be expanded are really the source files for the site.
+
+ * Added Url parameter to templates
+
View
582 hastie.go
@@ -1,163 +1,190 @@
/**
- * _ _ _
- * | | | | (_)
- * | |__ __ _ ___| |_ _ ___
- * | '_ \ / _` / __| __| |/ _ \
- * | | | | (_| \__ \ |_| | __/
- * |_| |_|\__,_|___/\__|_|\___|
- *
- * Hastie - Static Site Generator
- *
- */
+ * _ _ _
+ * | | | | (_)
+ * | |__ __ _ ___| |_ _ ___
+ * | '_ \ / _` / __| __| |/ _ \
+ * | | | | (_| \__ \ |_| | __/
+ * |_| |_|\__,_|___/\__|_|\___|
+ *
+ * Hastie - Static Site Generator
+ *
+ */
package main
import (
- "bytes"
- "conf" /* from http://code.google.com/p/goconf/ */
- /* "goconf.googlecode.com/hg"*/
- "fmt"
- "github.com/russross/blackfriday"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "sort"
- "template"
- "time"
+ "bytes"
+ "encoding/json"
+ "flag"
+ "fmt"
+ /* switched to dhconnelly fork which works with Go1
+ "github.com/russross/blackfriday" */
+ "github.com/dhconnelly/blackfriday"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "text/template"
+ "time"
)
-const debug = false
+const (
+ cfgFiledefault = "hastie.json"
+)
+
+var (
+ verbose = flag.Bool("v", false, "verbose output")
+ help = flag.Bool("h", false, "show this help")
+ cfgfile = flag.String("c", cfgFiledefault, "Config file")
+)
type Page struct {
- Content string
- Title string
- Category string
- Layout string
- Pages PagesSlice
- Recent PagesSlice
- Date *time.Time
- OutFile string
+ Content string
+ Title string
+ Category string
+ Layout string
+ Pages PagesSlice
+ Recent PagesSlice
+ Date time.Time
+ OutFile string
+ Url string
}
-type Config struct {
- TemplateDir string
- LayoutDir string
- PublishDir string
-}
+var config map[string]string
type PagesSlice []Page
+
func (p PagesSlice) Len() int { return len(p) }
-func (p PagesSlice) Less(i, j int) bool { return p[i].Date.Seconds() < p[j].Date.Seconds() }
+func (p PagesSlice) Less(i, j int) bool { return p[i].Date.Unix() < p[j].Date.Unix() }
func (p PagesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p PagesSlice) Sort() { sort.Sort(p) }
-func main() {
- //TODO: add verbose / debug - command-line arguments
-
- config := setupConfig()
-
- // create list of directories and files
- site := &SiteStruct{}
- filepath.Walk(config.TemplateDir, site, nil)
-
- /* ******************************************
- * Loop through directories and build pages
- * ****************************************** */
- var pages PagesSlice
- for _,dir := range site.Directories {
-
- fmt.Println("Reading Directory: ", dir)
- directory_file_count := 0
- readglob := fmt.Sprintf("%s/*.md", dir)
- var dirfiles, _ = filepath.Glob(readglob)
-
- // loop through files in directory
- for _, file := range dirfiles {
- if debug { fmt.Println(" File: ", file) }
- outfile := filepath.Base(file)
- outfile = strings.Replace(outfile, ".md", ".html", 1)
-
- // read & parse file for parameters
- page := readParseFile(file)
-
- // skip file if no content
- if page.Content == "" {
- continue // skip to next file
- }
- pages = append(pages, page)
- directory_file_count += 1
- }
- }
-
- if (debug) { // spit out pages structure
- fmt.Println("################################################################################")
- fmt.Printf(" %-50s | %-10s | %s \n", "Title", "Category", "Outfile")
- fmt.Println("--------------------------------------------------------------------------------")
- for _, page := range pages {
- fmt.Printf(" %-50s | %-10s | %s \n", page.Title, page.Category, page.OutFile)
- }
- fmt.Println("################################################################################")
- }
-
- /* ******************************************
- * Create any data needed from pages
- * for example recent file list
- * category list, etc...
- * ****************************************** */
-
- // build recent file list, sorted
- recentList := getRecentList(pages)
-
-
- /* ******************************************
- * Loop through pages and generate templates
- * ****************************************** */
- for _, page := range pages {
-
- fmt.Println(" Generating Template: ", page.OutFile)
-
- /* Assign global data to page object
- * Note: need better templating duplicating data
- since no logic in templates to limit to 3 */
- page.Pages = recentList
- if len(recentList) > 3 {
- page.Recent = recentList[0:3]
- } else {
- page.Recent = recentList
- }
-
-
- /* Templating - writes page data to buffer
- * read and parse all template files */
- buffer := new(bytes.Buffer)
- layoutsglob := fmt.Sprintf("%s/*.html", config.LayoutDir)
- ts, err := template.ParseTemplateGlob(layoutsglob)
- if err != nil {
- fmt.Println("Error Parsing Templates: ", err)
- os.Exit(1)
- }
- // pick layout based on specified in file
- templateFile := ""
- if page.Layout == "" {
- templateFile = "post.html"
- } else {
- templateFile = fmt.Sprintf("%s.html", page.Layout)
- }
- ts.Execute(buffer, templateFile, page)
-
- // writing out file
- writedir := fmt.Sprintf("%s/%s", config.PublishDir, page.Category)
- if (debug) { fmt.Println(" Write Directory: ", writedir) }
- os.MkdirAll(writedir, 0755) // does nothing if already exists
-
- outfile := fmt.Sprintf("%s/%s", config.PublishDir, page.OutFile)
- if (debug) { fmt.Println(" Writing File: ", outfile) }
- ioutil.WriteFile(outfile, []byte(buffer.String()), 0644)
- }
+// holds lists of directories and files
+var site = &SiteStruct{}
+// Wrapper around Fprintf taking verbose flag in account.
+func Printvf(format string, a ...interface{}) {
+ if *verbose {
+ fmt.Fprintf(os.Stderr, format, a...)
+ }
}
+// Wrapper around Fprintln taking verbose flag in account.
+func Printvln(a ...interface{}) {
+ if *verbose {
+ fmt.Fprintln(os.Stderr, a...)
+ }
+}
+
+func usage() {
+ fmt.Fprintln(os.Stderr, "usage: hastie [flags]")
+ flag.PrintDefaults()
+ os.Exit(2)
+}
+
+func main() {
+ flag.Usage = usage
+ flag.Parse()
+ if *help {
+ usage()
+ }
+
+ setupConfig()
+
+ filepath.Walk(config["SourceDir"], Walker)
+
+ /* ******************************************
+ * Loop through directories and build pages
+ * ****************************************** */
+ var pages PagesSlice
+ for _, dir := range site.Directories {
+
+ readglob := fmt.Sprintf("%s/*.md", dir)
+ var dirfiles, _ = filepath.Glob(readglob)
+
+ // loop through files in directory
+ for _, file := range dirfiles {
+ Printvln(" File:", file)
+ outfile := filepath.Base(file)
+ outfile = strings.Replace(outfile, ".md", ".html", 1)
+
+ // read & parse file for parameters
+ page := readParseFile(file)
+
+ // skip file if no content
+ if page.Content == "" {
+ continue // skip to next file
+ }
+ pages = append(pages, page)
+ }
+ }
+
+ if *verbose { // spit out pages structure
+ Printvln("################################################################################")
+ Printvf(" %-50s | %-10s | %s \n", "Title", "Category", "Outfile")
+ Printvln("--------------------------------------------------------------------------------")
+ for _, page := range pages {
+ Printvf(" %-50s | %-10s | %s \n", page.Title, page.Category, page.OutFile)
+ }
+ Printvln("################################################################################")
+ }
+
+ /* ******************************************
+ * Create any data needed from pages
+ * for example recent file list
+ * category list, etc...
+ * ****************************************** */
+
+ // build recent file list, sorted
+ recentList := getRecentList(pages)
+
+ /* ******************************************
+ * Loop through pages and generate templates
+ * ****************************************** */
+ for _, page := range pages {
+
+ fmt.Println(" Generating Template: ", page.OutFile)
+
+ /* Assign global data to page object
+ * Note: need better templating duplicating data
+ since no logic in templates to limit to 3 */
+ page.Pages = recentList
+ if len(recentList) > 3 {
+ page.Recent = recentList[0:3]
+ } else {
+ page.Recent = recentList
+ }
+
+ /* Templating - writes page data to buffer
+ * read and parse all template files */
+ buffer := new(bytes.Buffer)
+ layoutsglob := fmt.Sprintf("%s/*.html", config["LayoutDir"])
+ ts, err := template.ParseGlob(layoutsglob)
+ if err != nil {
+ fmt.Println("Error Parsing Templates: ", err)
+ os.Exit(1)
+ }
+ // pick layout based on specified in file
+ templateFile := ""
+ if page.Layout == "" {
+ templateFile = "post.html"
+ } else {
+ templateFile = fmt.Sprintf("%s.html", page.Layout)
+ }
+ ts.ExecuteTemplate(buffer, templateFile, page)
+
+ // writing out file
+ writedir := fmt.Sprintf("%s/%s", config["PublishDir"], page.Category)
+ Printvln(" Write Directory:", writedir)
+ os.MkdirAll(writedir, 0755) // does nothing if already exists
+
+ outfile := fmt.Sprintf("%s/%s", config["PublishDir"], page.OutFile)
+ Printvln(" Writing File:", outfile)
+ ioutil.WriteFile(outfile, []byte(buffer.String()), 0644)
+ }
+
+}
/* ************************************************
* Read and Parse File
@@ -165,83 +192,91 @@ func main() {
* @return Page object
* ************************************************ */
func readParseFile(filename string) (page Page) {
- if (debug) { fmt.Println("Parsing File: ", filename) }
- epoch, _ := time.Parse("20060102", "19700101")
-
- // setup default page struct
- page = Page{
- Title: "",
- Category: "",
- Content: "",
- Layout: "",
- Date: epoch,
- OutFile: filename }
-
- // read file
- var data, err = ioutil.ReadFile(filename)
- if err != nil {
- fmt.Println("Error Reading: ", filename)
- return
- }
-
- // go through content parse from --- to ---
- var lines = strings.Split(string(data), "\n")
- var found = 0
- for i, line := range lines {
- line = strings.TrimSpace(line)
-
- if found == 1 {
- // parse line for param
- colonIndex := strings.Index(line, ":")
- if colonIndex > 0 {
- key := strings.TrimSpace(line[:colonIndex])
- value := strings.TrimSpace(line[colonIndex+1:])
- switch key {
- case "title": page.Title = value
- case "category": page.Category = value
- case "layout": page.Layout = value
- }
- }
-
- } else if found >= 2 {
- // params over
- lines = lines[i:]
- break
- }
-
- if line == "---" {
- found += 1
- }
-
- }
-
- // switch directory name to just category
-
- // chop off first directory, since that is the template dir
- page.OutFile = filename[strings.Index(filename, "/")+1:]
- page.OutFile = strings.Replace(page.OutFile, ".md", ".html", 1)
-
- // next first directory is category
- if strings.Contains(page.OutFile, "/") {
- page.Category = page.OutFile[0:strings.Index(page.OutFile, "/")]
- }
-
- // parse date from filename
- base := filepath.Base(page.OutFile)
- if base[0:2] == "20" || base[0:2] == "19" { //HACK: if file starts with 20 or 19 assume date
- page.Date, _ = time.Parse("2006-01-02", base[0:10])
- page.OutFile = strings.Replace(page.OutFile, base[0:11], "", 1) // remove date from final filename
- }
-
- // convert markdown content
- content := strings.Join(lines, "\n")
- output := blackfriday.MarkdownCommon([]byte(content))
- page.Content = string(output)
-
- return page
+ Printvln("Parsing File:", filename)
+ epoch, _ := time.Parse("20060102", "19700101")
+
+ // setup default page struct
+ page = Page{
+ Title: "",
+ Category: "",
+ Content: "",
+ Layout: "",
+ Date: epoch,
+ OutFile: filename,
+ Url: ""}
+
+ // read file
+ var data, err = ioutil.ReadFile(filename)
+ if err != nil {
+ fmt.Println("Error Reading: ", filename)
+ return
+ }
+
+ // go through content parse from --- to ---
+ var lines = strings.Split(string(data), "\n")
+ var found = 0
+ for i, line := range lines {
+ line = strings.TrimSpace(line)
+
+ if found == 1 {
+ // parse line for param
+ colonIndex := strings.Index(line, ":")
+ if colonIndex > 0 {
+ key := strings.TrimSpace(line[:colonIndex])
+ value := strings.TrimSpace(line[colonIndex+1:])
+ switch key {
+ case "title":
+ page.Title = value
+ case "category":
+ page.Category = value
+ case "layout":
+ page.Layout = value
+ }
+ }
+
+ } else if found >= 2 {
+ // params over
+ lines = lines[i:]
+ break
+ }
+
+ if line == "---" {
+ found += 1
+ }
+
+ }
+
+ // switch directory name to just category
+
+ // chop off first directory, since that is the template dir
+ page.OutFile = filename[strings.Index(filename, "/")+1:]
+ page.OutFile = strings.Replace(page.OutFile, ".md", ".html", 1)
+
+ // next first directory is category
+ if strings.Contains(page.OutFile, "/") {
+ page.Category = page.OutFile[0:strings.Index(page.OutFile, "/")]
+ }
+
+ // parse date from filename
+ base := filepath.Base(page.OutFile)
+ if base[0:2] == "20" || base[0:2] == "19" { //HACK: if file starts with 20 or 19 assume date
+ page.Date, _ = time.Parse("2006-01-02", base[0:10])
+ page.OutFile = strings.Replace(page.OutFile, base[0:11], "", 1) // remove date from final filename
+ }
+
+ // add url of page, which includes initial slash
+ // this is needed to get correct links for multi
+ // level directories
+ page.Url = fmt.Sprintf("/%s", page.OutFile)
+
+ // convert markdown content
+ content := strings.Join(lines, "\n")
+ output := blackfriday.MarkdownCommon([]byte(content))
+ page.Content = string(output)
+
+ return page
}
-
/* ************************************************
* Build Recent File List
* - return array sorted most recent first
@@ -249,78 +284,73 @@ func readParseFile(filename string) (page Page) {
* - does not include files without date
* ************************************************ */
func getRecentList(pages PagesSlice) (list PagesSlice) {
- fmt.Println("Creating Recent File List")
- for _, page := range pages {
- // pages without dates are set to epoch
- if (page.Date.Format("2006") != "1970") {
- list = append(list, page)
- }
- }
- list.Sort()
-
- // reverse
- for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 {
- list[i], list[j] = list[j], list[i]
- }
-
- return list
+ fmt.Println("Creating Recent File List")
+ for _, page := range pages {
+ // pages without dates are set to epoch
+ if page.Date.Format("2006") != "1970" {
+ list = append(list, page)
+ }
+ }
+ list.Sort()
+
+ // reverse
+ for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 {
+ list[i], list[j] = list[j], list[i]
+ }
+
+ return list
}
-
-/* ************************************************
- * File / Directory Walker
- * ************************************************ */
-type SiteStruct struct{
- Files []string
- Directories []string
- Categories []string
+// Holds lists of Files, Directories and Categories
+type SiteStruct struct {
+ Files []string
+ Directories []string
+ Categories []string
}
-func (v *SiteStruct) VisitDir(path string, f *os.FileInfo) bool {
- v.Categories = append(v.Categories, f.Name)
- v.Directories = append(v.Directories, path)
- /* fmt.Println("Directory: ", f.Name)*/
- return true
-}
+// WalkFn that fills SiteStruct with data.
+func Walker(fn string, fi os.FileInfo, err error) error {
+ if err != nil {
+ fmt.Println("Walker:", err)
+ return nil
+ }
+
+ if fi.IsDir() {
+ site.Categories = append(site.Categories, fi.Name())
+ site.Directories = append(site.Directories, fn)
+ return nil
+ } else {
+ site.Files = append(site.Files, fn)
+ return nil
+ }
+ return nil
-func (v *SiteStruct) VisitFile(path string, f *os.FileInfo) {
- v.Files = append(v.Files, path)
- /* fmt.Printf("File: %s -- Path: %s \n", f.Name, path)*/
}
-
/* ************************************************
* Check if File / Directory Exists
* ************************************************ */
func exists(path string) bool {
- _, err := os.Stat(path)
- if err != nil {
- if e, ok := err.(*os.PathError); ok && (e.Error == os.ENOENT || e.Error == os.ENOTDIR) {
- return false
- }
- return false
- }
- return true
+ // TODO: Check if regular file
+ _, err := os.Stat(path)
+ if err != nil {
+ return false
+ }
+ return true
}
-
-/* ************************************************
- * Read Config file or set defaults
- * ************************************************ */
-func setupConfig() (config Config){
- cfg, err := conf.ReadConfigFile("hastie.config")
- if err != nil {
- // set defaults
- config.TemplateDir = "posts"
- config.LayoutDir = "layouts"
- config.PublishDir = "public"
- } else {
- config.TemplateDir, _ = cfg.GetString("default", "template_dir")
- config.LayoutDir, _ = cfg.GetString("default", "layout_dir")
- config.PublishDir, _ = cfg.GetString("default", "publish_dir")
- config.TemplateDir = strings.TrimSpace(config.TemplateDir)
- config.LayoutDir = strings.TrimSpace(config.LayoutDir)
- config.PublishDir = strings.TrimSpace(config.PublishDir)
- }
- return config
+// Read cfgfile or setup defaults.
+func setupConfig() {
+ file, err := ioutil.ReadFile(*cfgfile)
+ if err != nil {
+ // set defaults
+ config["SourceDir"] = "posts"
+ config["LayoutDir"] = "layouts"
+ config["PublishDir"] = "public"
+ } else {
+ if err := json.Unmarshal(file, &config); err != nil {
+ fmt.Printf("Error parsing config: %s", err)
+ os.Exit(1)
+ }
+ }
}
View
5 hastie.json
@@ -0,0 +1,5 @@
+{
+ "SourceDir" : "posts",
+ "LayoutDir" : "layouts",
+ "PublishDir" : "public"
+}
View
4 test/hastie.config
@@ -1,4 +0,0 @@
-# hastie config
-template_dir = posts
-layout_dir = layouts
-publish_dir = public
View
2  test/layouts/indexpage.html
@@ -5,7 +5,7 @@
<p>Recent Posts</p>
<ul>
{{ range .Recent }}
- <li><a href="{{ .OutFile }}">{{ .Title }}</a></li>
+ <li><a href="{{ .Url }}">{{ .Title }}</a></li>
{{ end }}
</ul>
View
2  test/layouts/post.html
@@ -19,7 +19,7 @@
<p>Recent Posts</p>
<ul>
{{ range .Recent }}
- <li> <a href="{{ .OutFile }}">{{.Title}}</a></li>
+ <li> <a href="{{ .Url }}">{{.Title}}</a></li>
{{ end }}
</ul>
View
58 test/public/angelica.html
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title> Welcome Angelica </title>
- <link rel="stylesheet" media="screen" href="" >
-
-</head>
-<body>
-
-<div id="container">
-
-
-
-<div id="post">
- <h2> Welcome Angelica </h2>
- <div class="meta">Date: Sun, Mar 2, 2011</div>
-
- <h1>Welcome Anelica!</h1>
-
-<h2>Lorem ipsum dolor sit amet:</h2>
-
-<ul>
-<li>consectetur adipisicing elit</li>
-<li>sed do eiusmod tempor incididunt</li>
-<li>ut labore et dolore magna aliqua.</li>
-</ul>
-
-
- <br clear="both"/>
- <div class="archive_link">
- Archive: <a href="//"></a>
- </div>
-</div>
-
-TODO: previous - next links
-
-<p><hr/></p>
-
-<p>Recent Posts</p>
-<ul>
-
- <li> <a href="zebra/hastie-intro.html">Hastie - A fast static site generator in Go</a></li>
-
- <li> <a href="angelica.html">Welcome Angelica</a></li>
-
- <li> <a href="zebra/sample-post.html">Introductions, Blessings and Giving Thanks!</a></li>
-
-</ul>
-
-
-
-</div>
-
-</body>
-</html>
-
View
37 test/public/index.html
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title> Home </title>
- <link rel="stylesheet" media="screen" href="" >
-
-</head>
-<body>
-
-<div id="container">
-
-
-
-<h1>Welcome to our Family Site</h1>
-
-
-<p>Recent Posts</p>
-<ul>
-
- <li><a href="zebra/hastie-intro.html">Hastie - A fast static site generator in Go</a></li>
-
- <li><a href="angelica.html">Welcome Angelica</a></li>
-
- <li><a href="zebra/sample-post.html">Introductions, Blessings and Giving Thanks!</a></li>
-
-</ul>
-
-</div>
-
-
-</div>
-
-</body>
-</html>
-
View
60 test/public/zebra/hastie-intro.html
@@ -1,60 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title> Hastie - A fast static site generator in Go </title>
- <link rel="stylesheet" media="screen" href="" >
-
-</head>
-<body>
-
-<div id="container">
-
-
-
-<div id="post">
- <h2> Hastie - A fast static site generator in Go </h2>
- <div class="meta">Date: Sun, Feb 14, 2012</div>
-
- <h2>Lorem ipsum dolor sit amet:</h2>
-
-<ul>
-<li>consectetur adipisicing elit</li>
-<li>sed do eiusmod tempor incididunt</li>
-<li>ut labore et dolore magna aliqua</li>
-</ul>
-
-<p><strong>Ut enim ad minim veniam</strong>, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-
-<p><strong>Lorem ipsum</strong> dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-
-
- <br clear="both"/>
- <div class="archive_link">
- Archive: <a href="/zebra/">zebra</a>
- </div>
-</div>
-
-TODO: previous - next links
-
-<p><hr/></p>
-
-<p>Recent Posts</p>
-<ul>
-
- <li> <a href="zebra/hastie-intro.html">Hastie - A fast static site generator in Go</a></li>
-
- <li> <a href="angelica.html">Welcome Angelica</a></li>
-
- <li> <a href="zebra/sample-post.html">Introductions, Blessings and Giving Thanks!</a></li>
-
-</ul>
-
-
-
-</div>
-
-</body>
-</html>
-
View
52 test/public/zebra/sample-post.html
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title> Introductions, Blessings and Giving Thanks! </title>
- <link rel="stylesheet" media="screen" href="" >
-
-</head>
-<body>
-
-<div id="container">
-
-
-
-<div id="post">
- <h2> Introductions, Blessings and Giving Thanks! </h2>
- <div class="meta">Date: Sun, Dec 12, 2009</div>
-
- <p>Marcus&#39; brother and family came out from Washington D.C. for the baptism of their daughter Kasia and Thanksgiving. It was the first time Danelle met the whole family, his wife Amada and Marcus&#39; godson Aleksander. The baptism was beautiful, Mike is the Godfather for Kasia and Mom was standing in for Amada&#39;s sister as Godmother.</p>
-
-<p><strong>For</strong> Thanksgiving Marcus made a delicious pumpkin soup and a skillet apple pie, I prepared a green bean casserole. All the food was scrumptious and Marcus&#39; dessert was a hit! We enjoyed the time with the family and have so much to be thankful for this year. Peace and love this holiday season!</p>
-
-
- <br clear="both"/>
- <div class="archive_link">
- Archive: <a href="/zebra/">zebra</a>
- </div>
-</div>
-
-TODO: previous - next links
-
-<p><hr/></p>
-
-<p>Recent Posts</p>
-<ul>
-
- <li> <a href="zebra/hastie-intro.html">Hastie - A fast static site generator in Go</a></li>
-
- <li> <a href="angelica.html">Welcome Angelica</a></li>
-
- <li> <a href="zebra/sample-post.html">Introductions, Blessings and Giving Thanks!</a></li>
-
-</ul>
-
-
-
-</div>
-
-</body>
-</html>
-
Please sign in to comment.
Something went wrong with that request. Please try again.