Expand the ShowPlan functionality

This commit is contained in:
Noah Campbell 2013-09-03 20:52:50 -07:00
parent 4004687fb2
commit cb00917af6
5 changed files with 62 additions and 11 deletions

View file

@ -12,10 +12,19 @@ func (s *Site) ShowPlan(out io.Writer) (err error) {
for _, file := range s.Files { for _, file := range s.Files {
fmt.Fprintf(out, "%s\n", file) fmt.Fprintf(out, "%s\n", file)
fmt.Fprintf(out, " canonical => ")
if s.Target == nil { if s.Target == nil {
fmt.Fprintf(out, " *implicit* => %s\n", "!no target specified!") fmt.Fprintf(out, "%s\n", "!no target specified!")
continue continue
} }
trns, err := s.Target.Translate(file)
if err != nil {
return err
}
fmt.Fprintf(out, "%s\n", trns)
} }
return return
} }

View file

@ -74,7 +74,7 @@ type Site struct {
Info SiteInfo Info SiteInfo
Shortcodes map[string]ShortcodeFunc Shortcodes map[string]ShortcodeFunc
timer *nitro.B timer *nitro.B
Target target.Publisher Target target.Output
} }
type SiteInfo struct { type SiteInfo struct {
@ -114,7 +114,8 @@ func (s *Site) Build() (err error) {
func (s *Site) Analyze() { func (s *Site) Analyze() {
s.Process() s.Process()
s.checkDescriptions() s.initTarget()
s.ShowPlan(os.Stdout)
} }
func (s *Site) prepTemplates() { func (s *Site) prepTemplates() {
@ -173,7 +174,7 @@ func (s *Site) Write() {
func (s *Site) checkDescriptions() { func (s *Site) checkDescriptions() {
for _, p := range s.Pages { for _, p := range s.Pages {
if len(p.Description) < 60 { if len(p.Description) < 60 {
fmt.Print(p.FileName + " ") fmt.Println(p.FileName + " ")
} }
} }
} }
@ -543,7 +544,7 @@ func (s *Site) RenderLists() error {
if a := s.Tmpl.Lookup("rss.xml"); a != nil { if a := s.Tmpl.Lookup("rss.xml"); a != nil {
// XML Feed // XML Feed
n.Url = Urlize(section + ".xml") n.Url = helpers.Urlize(section + ".xml")
n.Permalink = template.HTML(string(n.Site.BaseUrl) + n.Url) n.Permalink = template.HTML(string(n.Site.BaseUrl) + n.Url)
y := s.NewXMLBuffer() y := s.NewXMLBuffer()
s.Tmpl.ExecuteTemplate(y, "rss.xml", n) s.Tmpl.ExecuteTemplate(y, "rss.xml", n)
@ -647,14 +648,17 @@ func (s *Site) NewXMLBuffer() *bytes.Buffer {
return bytes.NewBufferString(header) return bytes.NewBufferString(header)
} }
func (s *Site) WritePublic(path string, content []byte) (err error) { func (s *Site) initTarget() {
if s.Target == nil { if s.Target == nil {
s.Target = &target.Filesystem{ s.Target = &target.Filesystem{
PublishDir: s.absPublishDir(), PublishDir: s.absPublishDir(),
UglyUrls: s.Config.UglyUrls, UglyUrls: s.Config.UglyUrls,
} }
} }
}
func (s *Site) WritePublic(path string, content []byte) (err error) {
s.initTarget()
if s.Config.Verbose { if s.Config.Verbose {
fmt.Println(path) fmt.Println(path)

View file

@ -3,6 +3,7 @@ package hugolib
import ( import (
"bytes" "bytes"
"testing" "testing"
"github.com/spf13/hugo/target"
) )
func checkShowPlanExpected(t *testing.T, expected, got string) { func checkShowPlanExpected(t *testing.T, expected, got string) {
@ -30,6 +31,28 @@ func TestDegenerateNoTarget(t *testing.T) {
t.Errorf("ShowPlan unexpectedly returned an error: %s", err) t.Errorf("ShowPlan unexpectedly returned an error: %s", err)
} }
expected := "foo/bar/file.md\n *implicit* => !no target specified!\n" expected := "foo/bar/file.md\n canonical => !no target specified!\n"
checkShowPlanExpected(t, expected, out.String()) checkShowPlanExpected(t, expected, out.String())
} }
func TestFileTarget(t *testing.T) {
s := &Site{Target: new(target.Filesystem)}
s.Files = append(s.Files, "foo/bar/file.md")
out := new(bytes.Buffer)
s.ShowPlan(out)
expected := "foo/bar/file.md\n canonical => foo/bar/file/index.html\n"
checkShowPlanExpected(t, expected, out.String())
}
func TestFileTargetUgly(t *testing.T) {
s := &Site{Target: &target.Filesystem{UglyUrls: true}}
s.Files = append(s.Files, "foo/bar/file.md")
out := new(bytes.Buffer)
s.ShowPlan(out)
expected := "foo/bar/file.md\n canonical => foo/bar/file.html\n"
checkShowPlanExpected(t, expected, out.String())
}

View file

@ -40,6 +40,10 @@ func (t *InMemoryTarget) Publish(label string, reader io.Reader) (err error) {
return return
} }
func (t *InMemoryTarget) Translate(label string) (dest string, err error) {
return label, nil
}
func TestPageCount(t *testing.T) { func TestPageCount(t *testing.T) {
target := new(InMemoryTarget) target := new(InMemoryTarget)
s := &Site{Target: target} s := &Site{Target: target}

View file

@ -16,6 +16,11 @@ type Translator interface {
Translate(string) (string, error) Translate(string) (string, error)
} }
type Output interface {
Publisher
Translator
}
type Filesystem struct { type Filesystem struct {
UglyUrls bool UglyUrls bool
DefaultExtension string DefaultExtension string
@ -52,18 +57,24 @@ func (fs *Filesystem) Translate(src string) (dest string, err error) {
if src == "/" { if src == "/" {
return "index.html", nil return "index.html", nil
} }
if fs.UglyUrls {
return src, nil
}
dir, file := path.Split(src) dir, file := path.Split(src)
ext := fs.extension(path.Ext(file)) ext := fs.extension(path.Ext(file))
name := filename(file) name := filename(file)
if fs.UglyUrls {
return path.Join(dir, fmt.Sprintf("%s%s", name, ext)), nil
}
return path.Join(dir, name, fmt.Sprintf("index%s", ext)), nil return path.Join(dir, name, fmt.Sprintf("index%s", ext)), nil
} }
func (fs *Filesystem) extension(ext string) string { func (fs *Filesystem) extension(ext string) string {
switch ext {
case ".md", ".rst": // TODO make this list configurable. page.go has the list of markup types.
return ".html"
}
if ext != "" { if ext != "" {
return ext return ext
} }