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()