Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Brampton <github@bramp.net>2015-07-09 04:51:54 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2015-11-23 19:50:54 +0300
commitc3931ef748d1bb0ec60e45e1cecdfc1bde850bfc (patch)
treeb0d9a775545c493eec9e442783c48525984fd9c5 /helpers
parent99acbb2eb273500596a0da5b51b490fefc0829c4 (diff)
Add PygmentsOptions option
This allows default pygments settings to be used, if none are explictly set per shortcode. Fixes #1260
Diffstat (limited to 'helpers')
-rw-r--r--helpers/content_renderer.go3
-rw-r--r--helpers/pygments.go87
-rw-r--r--helpers/pygments_test.go40
3 files changed, 96 insertions, 34 deletions
diff --git a/helpers/content_renderer.go b/helpers/content_renderer.go
index 93556e7d3..f7023f8d3 100644
--- a/helpers/content_renderer.go
+++ b/helpers/content_renderer.go
@@ -17,8 +17,9 @@ type HugoHtmlRenderer struct {
func (renderer *HugoHtmlRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string) {
if viper.GetBool("PygmentsCodeFences") {
+ opts := viper.GetString("PygmentsOptions")
str := html.UnescapeString(string(text))
- out.WriteString(Highlight(str, lang, ""))
+ out.WriteString(Highlight(str, lang, opts))
} else {
renderer.Renderer.BlockCode(out, text, lang)
}
diff --git a/helpers/pygments.go b/helpers/pygments.go
index 17c30ee0a..7d62fa0e7 100644
--- a/helpers/pygments.go
+++ b/helpers/pygments.go
@@ -139,59 +139,82 @@ func init() {
pygmentsKeywords["hl_lines"] = true
pygmentsKeywords["linenos"] = true
pygmentsKeywords["classprefix"] = true
+ pygmentsKeywords["startinline"] = true
}
-func parsePygmentsOpts(in string) (string, error) {
-
+func parseOptions(options map[string]string, in string) error {
in = strings.Trim(in, " ")
+ if in != "" {
+ for _, v := range strings.Split(in, ",") {
+ keyVal := strings.Split(v, "=")
+ key := strings.ToLower(strings.Trim(keyVal[0], " "))
+ if len(keyVal) != 2 || !pygmentsKeywords[key] {
+ return fmt.Errorf("invalid Pygments option: %s", key)
+ }
+ options[key] = keyVal[1]
+ }
+ }
- style := viper.GetString("PygmentsStyle")
+ return nil
+}
- noclasses := "true"
- if viper.GetBool("PygmentsUseClasses") {
- noclasses = "false"
+func createOptionsString(options map[string]string) string {
+ var keys []string
+ for k := range options {
+ keys = append(keys, k)
}
+ sort.Strings(keys)
- if len(in) == 0 {
- return fmt.Sprintf("style=%s,noclasses=%s,encoding=utf8", style, noclasses), nil
+ var optionsStr string
+ for i, k := range keys {
+ optionsStr += fmt.Sprintf("%s=%s", k, options[k])
+ if i < len(options)-1 {
+ optionsStr += ","
+ }
}
- options := make(map[string]string)
+ return optionsStr
+}
- o := strings.Split(in, ",")
- for _, v := range o {
- keyVal := strings.Split(v, "=")
- key := strings.ToLower(strings.Trim(keyVal[0], " "))
- if len(keyVal) != 2 || !pygmentsKeywords[key] {
- return "", fmt.Errorf("invalid Pygments option: %s", key)
- }
- options[key] = keyVal[1]
+func parseDefaultPygmentsOpts() (map[string]string, error) {
+
+ options := make(map[string]string)
+ err := parseOptions(options, viper.GetString("PygmentsOptions"))
+ if err != nil {
+ return nil, err
}
- if _, ok := options["style"]; !ok {
- options["style"] = style
+ if viper.IsSet("PygmentsStyle") {
+ options["style"] = viper.GetString("PygmentsStyle")
}
- if _, ok := options["noclasses"]; !ok {
- options["noclasses"] = noclasses
+ if viper.IsSet("PygmentsUseClasses") {
+ if viper.GetBool("PygmentsUseClasses") {
+ options["noclasses"] = "false"
+ } else {
+ options["noclasses"] = "true"
+ }
+
}
if _, ok := options["encoding"]; !ok {
options["encoding"] = "utf8"
}
- var keys []string
- for k := range options {
- keys = append(keys, k)
+ return options, nil
+}
+
+func parsePygmentsOpts(in string) (string, error) {
+
+ options, err := parseDefaultPygmentsOpts()
+ if err != nil {
+ return "", err
}
- sort.Strings(keys)
- var optionsStr string
- for i, k := range keys {
- optionsStr += fmt.Sprintf("%s=%s", k, options[k])
- if i < len(options)-1 {
- optionsStr += ","
- }
+ err = parseOptions(options, in)
+ if err != nil {
+ return "", err
}
- return optionsStr, nil
+
+ return createOptionsString(options), nil
}
diff --git a/helpers/pygments_test.go b/helpers/pygments_test.go
index ba42adc1c..9e91b8135 100644
--- a/helpers/pygments_test.go
+++ b/helpers/pygments_test.go
@@ -13,7 +13,7 @@ func TestParsePygmentsArgs(t *testing.T) {
pygmentsUseClasses bool
expect1 interface{}
}{
- {"", "foo", true, "style=foo,noclasses=false,encoding=utf8"},
+ {"", "foo", true, "encoding=utf8,noclasses=false,style=foo"},
{"style=boo,noclasses=true", "foo", true, "encoding=utf8,noclasses=true,style=boo"},
{"Style=boo, noClasses=true", "foo", true, "encoding=utf8,noclasses=true,style=boo"},
{"noclasses=true", "foo", true, "encoding=utf8,noclasses=true,style=foo"},
@@ -42,3 +42,41 @@ func TestParsePygmentsArgs(t *testing.T) {
}
}
}
+
+func TestParseDefaultPygmentsArgs(t *testing.T) {
+ expect := "encoding=utf8,noclasses=false,style=foo"
+
+ for i, this := range []struct {
+ in string
+ pygmentsStyle interface{}
+ pygmentsUseClasses interface{}
+ pygmentsOptions string
+ }{
+ {"", "foo", true, "style=override,noclasses=override"},
+ {"", nil, nil, "style=foo,noclasses=false"},
+ {"style=foo,noclasses=false", nil, nil, "style=override,noclasses=override"},
+ {"style=foo,noclasses=false", "override", false, "style=override,noclasses=override"},
+
+ } {
+ viper.Reset()
+
+ viper.Set("PygmentsOptions", this.pygmentsOptions)
+
+ if s, ok := this.pygmentsStyle.(string); ok {
+ viper.Set("PygmentsStyle", s)
+ }
+
+ if b, ok := this.pygmentsUseClasses.(bool); ok {
+ viper.Set("PygmentsUseClasses", b)
+ }
+
+ result, err := parsePygmentsOpts(this.in)
+ if err != nil {
+ t.Errorf("[%d] parsePygmentArgs failed: %s", i, err)
+ continue
+ }
+ if result != expect {
+ t.Errorf("[%d] parsePygmentArgs got %v but expected %v", i, result, expect)
+ }
+ }
+}