shithub: hugo

Download patch

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)
+	}
+}