ref: 7919603fb58bbbec2cdef2e46ec2e3c3571c46c1
parent: c6ad532b940fa07e5f32a3d1427348f5c4aaf12b
author: Noah Campbell <[email protected]>
date: Sun Sep 1 05:24:03 EDT 2013
Add Translate to target Translate handles Ugly Urls.
--- a/hugolib/planner.go
+++ b/hugolib/planner.go
@@ -1,8 +1,8 @@
package hugolib
import (
- "io"
"fmt"
+ "io"
)
func (s *Site) ShowPlan(out io.Writer) (err error) {
--- a/hugolib/site_show_plan_test.go
+++ b/hugolib/site_show_plan_test.go
@@ -1,8 +1,8 @@
package hugolib
import (
- "testing"
"bytes"
+ "testing"
)
func checkShowPlanExpected(t *testing.T, expected, got string) {
@@ -15,7 +15,7 @@
s := new(Site)
out := new(bytes.Buffer)
if err := s.ShowPlan(out); err != nil {
- t.Errorf("ShowPlan unexpectedly returned an error: %s", err)
+ t.Errorf("ShowPlan unexpectedly returned an error: %s", err)
}
expected := "No source files provided.\n"
got := out.String()
--- a/target/file.go
+++ b/target/file.go
@@ -1,9 +1,53 @@
package target
import (
+ "fmt"
"io"
+ "path"
)
type Publisher interface {
Publish(string, io.Reader) error
+}
+
+type Translator interface {
+ Translate(string) (string, error)
+}
+
+type Filesystem struct {
+ UglyUrls bool
+ DefaultExtension string
+}
+
+func (fs *Filesystem) Translate(src string) (dest string, err error) {
+ if fs.UglyUrls {
+ return src, nil
+ }
+
+ dir, file := path.Split(src)
+ ext := fs.extension(path.Ext(file))
+ name := filename(file)
+
+ return path.Join(dir, name, fmt.Sprintf("index%s", ext)), nil
+}
+
+func (fs *Filesystem) extension(ext string) string {
+ if ext != "" {
+ return ext
+ }
+
+ if fs.DefaultExtension != "" {
+ return fs.DefaultExtension
+ }
+
+ return ".html"
+}
+
+func filename(f string) string {
+ ext := path.Ext(f)
+ if ext == "" {
+ return f
+ }
+
+ return f[:len(f)-len(ext)]
}
--- /dev/null
+++ b/target/file_test.go
@@ -1,0 +1,51 @@
+package target
+
+import (
+ "testing"
+)
+
+func TestFileTranslator(t *testing.T) {
+ tests := []struct {
+ content string
+ expected string
+ }{
+ {"foo", "foo/index.html"},
+ {"foo.html", "foo/index.html"},
+ {"foo.xhtml", "foo/index.xhtml"},
+ {"section/foo", "section/foo/index.html"},
+ {"section/foo.html", "section/foo/index.html"},
+ {"section/foo.rss", "section/foo/index.rss"},
+ }
+
+ for _, test := range tests {
+ f := new(Filesystem)
+ dest, err := f.Translate(test.content)
+ if err != nil {
+ t.Fatalf("Translate returned and unexpected err: %s", err)
+ }
+
+ if dest != test.expected {
+ t.Errorf("Tranlate expected return: %s, got: %s", test.expected, dest)
+ }
+ }
+}
+
+func TestTranslateUglyUrls(t *testing.T) {
+ f := &Filesystem{UglyUrls: true}
+ dest, err := f.Translate("foo.html")
+ if err != nil {
+ t.Fatalf("Translate returned an unexpected err: %s", err)
+ }
+
+ if dest != "foo.html" {
+ t.Errorf("Translate expected return: %s, got: %s", "foo.html", dest)
+ }
+}
+
+func TestTranslateDefaultExtension(t *testing.T) {
+ f := &Filesystem{DefaultExtension: ".foobar"}
+ dest, _ := f.Translate("baz")
+ if dest != "baz/index.foobar" {
+ t.Errorf("Translate expected return: %s, got %s", "baz/index.foobar", dest)
+ }
+}