shithub: hugo

Download patch

ref: 15463d3d4584675d1d8c9a25c8259adce163c4ea
parent: be8c06757707cf240baaa72d6e659fcd2b6261f2
author: Ruben Vermeersch <[email protected]>
date: Fri Mar 27 13:05:17 EDT 2015

Cache pygments rendering between runs

Fixes #1000

--- a/helpers/pygments.go
+++ b/helpers/pygments.go
@@ -15,10 +15,13 @@
 
 import (
 	"bytes"
+	"crypto/sha1"
 	"fmt"
+	"io/ioutil"
 	"os/exec"
 	"strings"
 
+	"github.com/spf13/hugo/hugofs"
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/viper"
 )
@@ -42,6 +45,33 @@
 		return code
 	}
 
+	fs := hugofs.OsFs
+
+	// Try to read from cache first
+	hash := sha1.Sum([]byte(code))
+	cachefile := fmt.Sprintf("%s/pygments-%s-%x", viper.GetString("CacheDir"), lexer, hash)
+	exists, err := Exists(cachefile, fs)
+	if err != nil {
+		jww.ERROR.Print(err.Error())
+		return code
+	}
+	if exists {
+		f, err := fs.Open(cachefile)
+		if err != nil {
+			jww.ERROR.Print(err.Error())
+			return code
+		}
+
+		s, err := ioutil.ReadAll(f)
+		if err != nil {
+			jww.ERROR.Print(err.Error())
+			return code
+		}
+
+		return string(s)
+	}
+
+	// No cache file, render and cache it
 	var out bytes.Buffer
 	var stderr bytes.Buffer
 	style := viper.GetString("PygmentsStyle")
@@ -60,6 +90,11 @@
 	if err := cmd.Run(); err != nil {
 		jww.ERROR.Print(stderr.String())
 		return code
+	}
+
+	// Write cache file
+	if err := WriteToDisk(cachefile, bytes.NewReader(out.Bytes()), fs); err != nil {
+		jww.ERROR.Print(stderr.String())
 	}
 
 	return out.String()