From b8551f8532ef7b98cdd8522440b3ff20f39b49f5 Mon Sep 17 00:00:00 2001
From: Alexander Scheel <alexander.m.scheel@gmail.com>
Date: Sun, 8 Mar 2020 15:17:03 -0400
Subject: [PATCH] Fix task-list checkbox styling (#10668)

* Fix task-list checkbox styling

The pandoc renderer will append the class "task-list" to the ul element
wrapping a li with one or more check-boxes. This allows us to select for
them, removing their list-style-type property. However, goldmark and the
gfm spec doesn't specify the "task-list" class name, so we can't use
that to fix the issue there.

Signed-off-by: Alexander Scheel <alexander.m.scheel@gmail.com>

* Update to goldmark v1.1.25

This version adds the missing space after a checkbox.

Resolves: #9656

Signed-off-by: Alexander Scheel <alexander.m.scheel@gmail.com>

Co-authored-by: zeripath <art27@cantab.net>
---
 go.mod                                             |  2 +-
 go.sum                                             |  1 +
 modules/markup/sanitizer.go                        |  3 +++
 .../github.com/yuin/goldmark/extension/tasklist.go |  4 +--
 vendor/github.com/yuin/goldmark/parser/list.go     | 29 +++++++++++-----------
 vendor/modules.txt                                 |  2 +-
 web_src/less/_markdown.less                        |  5 ++++
 7 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/go.mod b/go.mod
index 683ae18cb8..2f581f1e03 100644
--- a/go.mod
+++ b/go.mod
@@ -96,7 +96,7 @@ require (
 	github.com/unknwon/paginater v0.0.0-20151104151617-7748a72e0141
 	github.com/urfave/cli v1.20.0
 	github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53
-	github.com/yuin/goldmark v1.1.24
+	github.com/yuin/goldmark v1.1.25
 	go.etcd.io/bbolt v1.3.3 // indirect
 	golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d
 	golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa
diff --git a/go.sum b/go.sum
index 7522fd9c87..1b75c6a712 100644
--- a/go.sum
+++ b/go.sum
@@ -576,6 +576,7 @@ github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53 h1:HsIQ6yAjfjQ3Ix
 github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53/go.mod h1:f6elajwZV+xceiaqgRL090YzLEDGSbqr3poGL3ZgXYo=
 github.com/yuin/goldmark v1.1.24 h1:K4FemPDr4x/ZcqldoXWnexTLfdMIy2eEfXxsLnotTRI=
 github.com/yuin/goldmark v1.1.24/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go
index ee9944723e..b5c6dc25f4 100644
--- a/modules/markup/sanitizer.go
+++ b/modules/markup/sanitizer.go
@@ -53,6 +53,9 @@ func ReplaceSanitizer() {
 	// Allow classes for anchors
 	sanitizer.policy.AllowAttrs("class").Matching(regexp.MustCompile(`ref-issue`)).OnElements("a")
 
+	// Allow classes for task lists
+	sanitizer.policy.AllowAttrs("class").Matching(regexp.MustCompile(`task-list`)).OnElements("ul")
+
 	// Allow generally safe attributes
 	generalSafeAttrs := []string{"abbr", "accept", "accept-charset",
 		"accesskey", "action", "align", "alt",
diff --git a/vendor/github.com/yuin/goldmark/extension/tasklist.go b/vendor/github.com/yuin/goldmark/extension/tasklist.go
index 825f8d5228..1f3e52c204 100644
--- a/vendor/github.com/yuin/goldmark/extension/tasklist.go
+++ b/vendor/github.com/yuin/goldmark/extension/tasklist.go
@@ -92,9 +92,9 @@ func (r *TaskCheckBoxHTMLRenderer) renderTaskCheckBox(w util.BufWriter, source [
 		w.WriteString(`<input disabled="" type="checkbox"`)
 	}
 	if r.XHTML {
-		w.WriteString(" />")
+		w.WriteString(" /> ")
 	} else {
-		w.WriteString(">")
+		w.WriteString("> ")
 	}
 	return gast.WalkContinue, nil
 }
diff --git a/vendor/github.com/yuin/goldmark/parser/list.go b/vendor/github.com/yuin/goldmark/parser/list.go
index b1d53bd68e..df1607ea0f 100644
--- a/vendor/github.com/yuin/goldmark/parser/list.go
+++ b/vendor/github.com/yuin/goldmark/parser/list.go
@@ -166,20 +166,6 @@ func (b *listParser) Continue(node ast.Node, reader text.Reader, pc Context) Sta
 		}
 		return Continue | HasChildren
 	}
-	// Thematic Breaks take precedence over lists
-	if isThematicBreak(line, reader.LineOffset()) {
-		isHeading := false
-		last := pc.LastOpenedBlock().Node
-		if ast.IsParagraph(last) {
-			c, ok := matchesSetextHeadingBar(line)
-			if ok && c == '-' {
-				isHeading = true
-			}
-		}
-		if !isHeading {
-			return Close
-		}
-	}
 
 	// "offset" means a width that bar indicates.
 	//    -  aaaaaaaa
@@ -200,6 +186,21 @@ func (b *listParser) Continue(node ast.Node, reader text.Reader, pc Context) Sta
 				if !list.CanContinue(marker, typ == orderedList) {
 					return Close
 				}
+				// Thematic Breaks take precedence over lists
+				if isThematicBreak(line[match[3]-1:], 0) {
+					isHeading := false
+					last := pc.LastOpenedBlock().Node
+					if ast.IsParagraph(last) {
+						c, ok := matchesSetextHeadingBar(line)
+						if ok && c == '-' {
+							isHeading = true
+						}
+					}
+					if !isHeading {
+						return Close
+					}
+				}
+
 				return Continue | HasChildren
 			}
 		}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 28bf533ec6..61cc1657c7 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -452,7 +452,7 @@ github.com/willf/bitset
 github.com/xanzy/ssh-agent
 # github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53
 github.com/yohcop/openid-go
-# github.com/yuin/goldmark v1.1.24
+# github.com/yuin/goldmark v1.1.25
 github.com/yuin/goldmark
 github.com/yuin/goldmark/ast
 github.com/yuin/goldmark/extension
diff --git a/web_src/less/_markdown.less b/web_src/less/_markdown.less
index cb2ce32c3e..78a0d3a158 100644
--- a/web_src/less/_markdown.less
+++ b/web_src/less/_markdown.less
@@ -192,6 +192,11 @@
         list-style-type: none;
     }
 
+    ul.task-list,
+    ol.task-list {
+        list-style-type: none;
+    }
+
     ul ul,
     ul ol,
     ol ol,