shithub: hugo

Download patch

ref: d5518c09665c474a33bdf3872bde0dcefc0bf572
parent: 45ce6e2b309dc247315885db4de4d03192b93914
author: spf13 <[email protected]>
date: Sat Aug 10 11:35:34 EDT 2013

Adding support for aliases (redirects)

--- /dev/null
+++ b/docs/content/doc/aliases.md
@@ -1,0 +1,33 @@
+---
+title: "Aliases"
+Pubdate: "2013-07-09"
+Aliases:
+    - /doc/redirects/
+    - /doc/alias/
+---
+
+For people migrating existing published content to Hugo theres a good chance
+you need a mechanism to handle redirecting old urls.
+
+Luckily, this can be handled easily with aliases in Hugo.
+
+## Example
+**content/posts/my-awesome-blog-post.md**
+
+    ---
+    aliases:
+        - /posts/my-original-url/
+        - /2010/even-earlier-url.html
+    ---
+
+Now when you go to any of the aliases locations they
+will redirect to the page.
+
+## Important Behaviors
+
+1. *Hugo makes no assumptions about aliases. They also don't change based
+on your UglyUrls setting. You Need to provide a relative path and the
+complete filename or directory.*
+
+2. *Aliases are rendered prior to any content and will be overwritten by
+any content with the same location.*
--- a/docs/content/doc/redirects.md
+++ /dev/null
@@ -1,37 +1,0 @@
----
-title: "Redirects"
-Pubdate: "2013-07-09"
----
-
-For people migrating existing published content to Hugo theres a good chance
-you need a mechanism to handle redirecting old urls.
-
-Luckily, this can be handled easily in a couple of easy steps.
-
-1. Create a special post for the redirect and mark the file as a `redirect`
-    file in the front matter.  Here is an example
-    `content/redirects/my-awesome-blog-post.md` :
-
-    ```markdown
-    ---
-    redirect: true
-    slug: /my-awesome-blog-post/
-    url: /docs/redirects/
-    ---
-```
-
-2. Set the redirect template `layouts/redirects/single.html`:
-
-    ```html
-    <!DOCTYPE html>
-    <html>
-    <head>
-      <link rel="canonical" href="{{ .Url }}"/>
-      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-      <meta http-equiv="refresh" content="0;url={{ .Url }}" />
-    </head>
-    </html>
-    ```
-
-Now when you go to `/my-awesome-blog-post/` it will do a meta redirect to
-`/docs/redirects/`.
\ No newline at end of file
--- a/docs/content/redirects/my-awesome-blog-post.md
+++ /dev/null
@@ -1,5 +1,0 @@
----
-redirect: true
-slug: /my-awesome-blog-post/
-url: /docs/redirects1/
----
\ No newline at end of file
--- a/docs/layouts/chrome/menu.html
+++ b/docs/layouts/chrome/menu.html
@@ -19,7 +19,7 @@
             <li class="nav-header">Extras</li>
             <li> <a href="/doc/shortcodes">ShortCodes</a></li>
             <li> <a href="/doc/indexes">Indexes</a></li>
-            <li> <a href="/doc/redirects">Redirects</a></li>
+            <li> <a href="/doc/aliases">Aliases</a></li>
             <li class="divider"></li>
             <li class="nav-header">Meta</li>
             <li> <a href="/doc/release-notes">Release Notes</a></li>
--- a/docs/layouts/redirects/single.html
+++ /dev/null
@@ -1,8 +1,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <link rel="canonical" href="{{ .Url }}"/>
-  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-  <meta http-equiv="refresh" content="0;url={{ .Url }}" />
-</head>
-</html>
\ No newline at end of file
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -99,21 +99,9 @@
 		return
 	}
 
-	//section := x[len(x)-2]
 	if section := x[len(x)-2]; section != "content" {
 		p.Section = section
 	}
-
-	//c := p.Site.Config
-	//systemDirs := map[string]bool{
-	//c.ContentDir: true,
-	//c.StaticDir:  true,
-	//c.LayoutDir:  true,
-	//}
-
-	//if !systemDirs[section] && !p.Redirect {
-	//p.Section = section
-	//}
 }
 
 func (page *Page) Type() string {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -101,6 +101,7 @@
 }
 
 func (site *Site) Render() (err error) {
+	site.RenderAliases()
 	site.ProcessShortcodes()
 	site.timerStep("render shortcodes")
 	site.AbsUrlify()
@@ -144,6 +145,12 @@
 
 	templates.Funcs(funcMap)
 
+	s.Tmpl = templates
+	s.primeTemplates()
+	s.loadTemplates()
+}
+
+func (s *Site) loadTemplates() {
 	walker := func(path string, fi os.FileInfo, err error) error {
 		if err != nil {
 			PrintErr("Walker: ", err)
@@ -157,7 +164,7 @@
 			}
 			text := string(filetext)
 			name := path[len(s.Config.GetAbsPath(s.Config.LayoutDir))+1:]
-			t := templates.New(name)
+			t := s.Tmpl.New(name)
 			template.Must(t.Parse(text))
 		}
 		return nil
@@ -164,8 +171,13 @@
 	}
 
 	filepath.Walk(s.Config.GetAbsPath(s.Config.LayoutDir), walker)
+}
 
-	s.Tmpl = templates
+func (s *Site) primeTemplates() {
+	alias := "<!DOCTYPE html>\n <html>\n <head>\n <link rel=\"canonical\" href=\"{{ . }}\"/>\n <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n <meta http-equiv=\"refresh\" content=\"0;url={{ .Permalink }}\" />\n </head>\n </html>"
+
+	t := s.Tmpl.New("alias")
+	template.Must(t.Parse(alias))
 }
 
 func (s *Site) initialize() {
@@ -305,6 +317,22 @@
 	}
 
 	return
+}
+
+func (s *Site) RenderAliases() error {
+	for i, p := range s.Pages {
+		for _, a := range p.Aliases {
+			content, err := s.RenderThing(s.Pages[i], "alias")
+			if strings.HasSuffix(a, "/") {
+				a = a + "index.html"
+			}
+			if err != nil {
+				return err
+			}
+			s.WritePublic(a, content.Bytes())
+		}
+	}
+	return nil
 }
 
 func (s *Site) RenderPages() error {