diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2016-09-09 14:08:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-09 14:08:20 +0300 |
commit | eaf2f9bce5537a1dcbdb32dc62b9827e5a99585b (patch) | |
tree | 1ba3b7e24d8e5a68575e324be1a28471b050f48b /helpers | |
parent | 76bf2dcdd23f4cedb425f66503916a58698986dd (diff) |
Add TODO list support for Blackfriday
* Add CSS class to TODO list and list items
* Add a flag to turn task list support off
Fixes #2269
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/content.go | 2 | ||||
-rw-r--r-- | helpers/content_renderer.go | 38 | ||||
-rw-r--r-- | helpers/content_renderer_test.go | 41 |
3 files changed, 81 insertions, 0 deletions
diff --git a/helpers/content.go b/helpers/content.go index 49d3469c5..53176de64 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -51,6 +51,7 @@ type Blackfriday struct { HrefTargetBlank bool SmartDashes bool LatexDashes bool + TaskLists bool PlainIDAnchors bool SourceRelativeLinksEval bool SourceRelativeLinksProjectFolder string @@ -68,6 +69,7 @@ func NewBlackfriday(c ConfigProvider) *Blackfriday { "smartDashes": true, "latexDashes": true, "plainIDAnchors": true, + "taskLists": true, "sourceRelativeLinks": false, "sourceRelativeLinksProjectFolder": "/docs/content", } diff --git a/helpers/content_renderer.go b/helpers/content_renderer.go index 02a9e9c83..6bd2212e1 100644 --- a/helpers/content_renderer.go +++ b/helpers/content_renderer.go @@ -72,6 +72,44 @@ func (renderer *HugoHTMLRenderer) Image(out *bytes.Buffer, link []byte, title [] } } +// ListItem adds task list support to the Blackfriday renderer. +func (renderer *HugoHTMLRenderer) ListItem(out *bytes.Buffer, text []byte, flags int) { + if !renderer.Config.TaskLists { + renderer.Renderer.ListItem(out, text, flags) + return + } + + switch { + case bytes.HasPrefix(text, []byte("[ ] ")): + text = append([]byte(`<input type="checkbox" disabled class="task-list-item">`), text[3:]...) + + case bytes.HasPrefix(text, []byte("[x] ")) || bytes.HasPrefix(text, []byte("[X] ")): + text = append([]byte(`<input type="checkbox" checked disabled class="task-list-item">`), text[3:]...) + } + + renderer.Renderer.ListItem(out, text, flags) +} + +// List adds task list support to the Blackfriday renderer. +func (renderer *HugoHTMLRenderer) List(out *bytes.Buffer, text func() bool, flags int) { + if !renderer.Config.TaskLists { + renderer.Renderer.List(out, text, flags) + return + } + marker := out.Len() + renderer.Renderer.List(out, text, flags) + if out.Len() > marker { + list := out.Bytes()[marker:] + if bytes.Contains(list, []byte("task-list-item")) { + // Rewrite the buffer from the marker + out.Truncate(marker) + // May be either dl, ul or ol + list := append(list[:4], append([]byte(` class="task-list"`), list[4:]...)...) + out.Write(list) + } + } +} + // HugoMmarkHTMLRenderer wraps a mmark.Renderer, typically a mmark.html // Enabling Hugo to customise the rendering experience type HugoMmarkHTMLRenderer struct { diff --git a/helpers/content_renderer_test.go b/helpers/content_renderer_test.go index f96cf0ad5..7baaadb20 100644 --- a/helpers/content_renderer_test.go +++ b/helpers/content_renderer_test.go @@ -88,3 +88,44 @@ func TestCodeFence(t *testing.T) { } } } + +func TestBlackfridayTaskList(t *testing.T) { + for i, this := range []struct { + markdown string + taskListEnabled bool + expect string + }{ + {` +TODO: + +- [x] On1 +- [X] On2 +- [ ] Off + +END +`, true, `<p>TODO:</p> + +<ul class="task-list"> +<li><input type="checkbox" checked disabled class="task-list-item"> On1</li> +<li><input type="checkbox" checked disabled class="task-list-item"> On2</li> +<li><input type="checkbox" disabled class="task-list-item"> Off</li> +</ul> + +<p>END</p> +`}, + {`- [x] On1`, false, `<ul> +<li>[x] On1</li> +</ul> +`}, + } { + blackFridayConfig := NewBlackfriday(viper.GetViper()) + blackFridayConfig.TaskLists = this.taskListEnabled + ctx := &RenderingContext{Content: []byte(this.markdown), PageFmt: "markdown", Config: blackFridayConfig} + + result := string(RenderBytes(ctx)) + + if result != this.expect { + t.Errorf("[%d] got \n%v but expected \n%v", i, result, this.expect) + } + } +} |