importer: fix jekyll import highlight options
authorJean-François YUEN <jfyuen@gmail.com>
Mon, 19 Nov 2018 16:33:54 +0000 (17:33 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 12 Dec 2018 18:12:12 +0000 (19:12 +0100)
commands/import_jekyll.go
commands/import_jekyll_test.go

index fc3a8402733b5d91f62863949dd79f41458575da..6a708ac067d9cf4488e455f2db57b2f2ab7cba18 100644 (file)
@@ -25,6 +25,7 @@ import (
        "strconv"
        "strings"
        "time"
+       "unicode"
 
        "github.com/gohugoio/hugo/parser/metadecoders"
 
@@ -545,7 +546,6 @@ func convertJekyllContent(m interface{}, content string) string {
        }{
                {regexp.MustCompile("(?i)<!-- more -->"), "<!--more-->"},
                {regexp.MustCompile(`\{%\s*raw\s*%\}\s*(.*?)\s*\{%\s*endraw\s*%\}`), "$1"},
-               {regexp.MustCompile(`{%\s*highlight\s*(.*?)\s*%}`), "{{< highlight $1 >}}"},
                {regexp.MustCompile(`{%\s*endhighlight\s*%}`), "{{< / highlight >}}"},
        }
 
@@ -559,6 +559,7 @@ func convertJekyllContent(m interface{}, content string) string {
        }{
                // Octopress image tag: http://octopress.org/docs/plugins/image-tag/
                {regexp.MustCompile(`{%\s+img\s*(.*?)\s*%}`), replaceImageTag},
+               {regexp.MustCompile(`{%\s*highlight\s*(.*?)\s*%}`), replaceHighlightTag},
        }
 
        for _, replace := range replaceListFunc {
@@ -568,6 +569,50 @@ func convertJekyllContent(m interface{}, content string) string {
        return content
 }
 
+func replaceHighlightTag(match string) string {
+       r := regexp.MustCompile(`{%\s*highlight\s*(.*?)\s*%}`)
+       parts := r.FindStringSubmatch(match)
+       lastQuote := rune(0)
+       f := func(c rune) bool {
+               switch {
+               case c == lastQuote:
+                       lastQuote = rune(0)
+                       return false
+               case lastQuote != rune(0):
+                       return false
+               case unicode.In(c, unicode.Quotation_Mark):
+                       lastQuote = c
+                       return false
+               default:
+                       return unicode.IsSpace(c)
+               }
+       }
+       // splitting string by space but considering quoted section
+       items := strings.FieldsFunc(parts[1], f)
+
+       result := bytes.NewBufferString("{{< highlight ")
+       result.WriteString(items[0]) // language
+       options := items[1:]
+       for i, opt := range options {
+               opt = strings.Replace(opt, "\"", "", -1)
+               if opt == "linenos" {
+                       opt = "linenos=table"
+               }
+               if i == 0 {
+                       opt = " \"" + opt
+               }
+               if i < len(options)-1 {
+                       opt += ","
+               } else if i == len(options)-1 {
+                       opt += "\""
+               }
+               result.WriteString(opt)
+       }
+
+       result.WriteString(" >}}")
+       return result.String()
+}
+
 func replaceImageTag(match string) string {
        r := regexp.MustCompile(`{%\s+img\s*(\p{L}*)\s+([\S]*/[\S]+)\s+(\d*)\s*(\d*)\s*(.*?)\s*%}`)
        result := bytes.NewBufferString("{{< figure ")
index cb22e9cd79db19c1e0660dd57da00ccfeaddca14..e0402a7a6f7028935ae66423b4cbd358771f82ec 100644 (file)
@@ -97,6 +97,9 @@ func TestConvertJekyllContent(t *testing.T) {
                {map[interface{}]interface{}{},
                        "{% highlight go %}\nvar s int\n{% endhighlight %}",
                        "{{< highlight go >}}\nvar s int\n{{< / highlight >}}"},
+               {map[interface{}]interface{}{},
+                       "{% highlight go linenos hl_lines=\"1 2\" %}\nvar s string\nvar i int\n{% endhighlight %}",
+                       "{{< highlight go \"linenos=table,hl_lines=1 2\" >}}\nvar s string\nvar i int\n{{< / highlight >}}"},
 
                // Octopress image tag
                {map[interface{}]interface{}{},