Add copy button to markdown code blocks (#17638)
* Add copy button to markdown code blocks Done mostly in JS because I think it's better not to try getting buttons past the markup sanitizer. * add svg module tests * fix sanitizer regexp * remove outdated comment * vertically center button in issue comments as well * add comment to css * fix undefined on view file line copy * combine animation less files * Update modules/markup/markdown/markdown.go Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> * add test for different sizes * add cloneNode and add tests for it * use deep clone * remove useless optional chaining * remove the svg node cache * unify clipboard copy string and i18n * remove unused var * remove unused localization * minor css tweaks to the button * comment tweak * remove useless attribute Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
d789670894
commit
23bd7b1211
19 changed files with 140 additions and 44 deletions
|
@ -107,25 +107,18 @@ func actualRender(ctx *markup.RenderContext, input io.Reader, output io.Writer)
|
|||
|
||||
languageStr := string(language)
|
||||
|
||||
preClasses := []string{}
|
||||
preClasses := []string{"code-block"}
|
||||
if languageStr == "mermaid" {
|
||||
preClasses = append(preClasses, "is-loading")
|
||||
}
|
||||
|
||||
if len(preClasses) > 0 {
|
||||
_, err := w.WriteString(`<pre class="` + strings.Join(preClasses, " ") + `">`)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
_, err := w.WriteString(`<pre>`)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err := w.WriteString(`<pre class="` + strings.Join(preClasses, " ") + `">`)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// include language-x class as part of commonmark spec
|
||||
_, err := w.WriteString(`<code class="chroma language-` + string(language) + `">`)
|
||||
_, err = w.WriteString(`<code class="chroma language-` + string(language) + `">`)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -52,8 +52,11 @@ func InitializeSanitizer() {
|
|||
|
||||
func createDefaultPolicy() *bluemonday.Policy {
|
||||
policy := bluemonday.UGCPolicy()
|
||||
|
||||
// For JS code copy and Mermaid loading state
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^code-block( is-loading)?$`)).OnElements("pre")
|
||||
|
||||
// For Chroma markdown plugin
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^is-loading$`)).OnElements("pre")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(chroma )?language-[\w-]+$`)).OnElements("code")
|
||||
|
||||
// Checkboxes
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue