From 224bf7d721662e2c99f0fbfa1b8f5f2d57dbff88 Mon Sep 17 00:00:00 2001 From: zzwx <8169082+zzwx@users.noreply.github.com> Date: Tue, 24 Dec 2019 19:31:21 -0500 Subject: [PATCH] Additional attributes render with comments --- extension/table.go | 106 +++++++++++++++++++++++++++++++++++++----- renderer/html/html.go | 7 ++- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/extension/table.go b/extension/table.go index 33c7bed..309f3f9 100644 --- a/extension/table.go +++ b/extension/table.go @@ -155,13 +155,15 @@ func (r *TableHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegistere // TableAttributeFilter defines attribute names which table elements can have. var TableAttributeFilter = html.GlobalAttributeFilter.Extend( - []byte("bgcolor"), - []byte("border"), - []byte("cellpadding"), - []byte("cellspacing"), - []byte("frame"), - []byte("summary"), - []byte("width"), + []byte("align"), // [Deprecated] + []byte("bgcolor"), // [Deprecated] + []byte("border"), // [Deprecated] + []byte("cellpadding"), // [Deprecated] + []byte("cellspacing"), // [Deprecated] + []byte("frame"), // [Deprecated] + []byte("rules"), // [Deprecated] + []byte("summary"), // [Deprecated] + []byte("width"), // [Deprecated] ) func (r *TableHTMLRenderer) renderTable(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { @@ -177,10 +179,23 @@ func (r *TableHTMLRenderer) renderTable(w util.BufWriter, source []byte, n gast. return gast.WalkContinue, nil } +// TableHeaderAttributeFilter defines attribute names which elements can have. +var TableHeaderAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("align"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("charoff"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("valign"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + func (r *TableHTMLRenderer) renderTableHeader(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { if entering { - _, _ = w.WriteString("\n") - _, _ = w.WriteString("\n") + _, _ = w.WriteString("\n") + _, _ = w.WriteString("\n") // Header has no separate handle } else { _, _ = w.WriteString("\n") _, _ = w.WriteString("\n") @@ -191,9 +206,22 @@ func (r *TableHTMLRenderer) renderTableHeader(w util.BufWriter, source []byte, n return gast.WalkContinue, nil } +// TableRowAttributeFilter defines attribute names which elements can have. +var TableRowAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("align"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Obsolete since HTML5] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + []byte("valign"), // [Obsolete since HTML5] +) + func (r *TableHTMLRenderer) renderTableRow(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { if entering { - _, _ = w.WriteString("\n") + _, _ = w.WriteString("\n") } else { _, _ = w.WriteString("\n") if n.Parent().LastChild() == n { @@ -203,6 +231,49 @@ func (r *TableHTMLRenderer) renderTableRow(w util.BufWriter, source []byte, n ga return gast.WalkContinue, nil } +// TableThCellAttributeFilter defines attribute names which table cells can have. +var TableThCellAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("abbr"), // [OK] Contains a short abbreviated description of the cell's content [NOT OK in ] + + []byte("align"), // [Obsolete since HTML5] + []byte("axis"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + + []byte("colspan"), // [OK] Number of columns that the cell is to span + []byte("headers"), // [OK] This attribute contains a list of space-separated strings, each corresponding to the id attribute of the elements that apply to this element + + []byte("height"), // [Deprecated since HTML4] [Obsolete since HTML5] + + []byte("rowspan"), // [OK] Number of rows that the cell is to span + []byte("scope"), // [OK] This enumerated attribute defines the cells that the header (defined in the ) element relates to [NOT OK in ] + + []byte("valign"), // [Obsolete since HTML5] + []byte("width"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + +// TableTdCellAttributeFilter defines attribute names which table cells can have. +var TableTdCellAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("abbr"), // [Obsolete since HTML5] [OK in ] + []byte("align"), // [Obsolete since HTML5] + []byte("axis"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + + []byte("colspan"), // [OK] Number of columns that the cell is to span + []byte("headers"), // [OK] This attribute contains a list of space-separated strings, each corresponding to the id attribute of the elements that apply to this element + + []byte("height"), // [Deprecated since HTML4] [Obsolete since HTML5] + + []byte("rowspan"), // [OK] Number of rows that the cell is to span + + []byte("scope"), // [Obsolete since HTML5] [OK in ] + []byte("valign"), // [Obsolete since HTML5] + []byte("width"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + func (r *TableHTMLRenderer) renderTableCell(w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { n := node.(*ast.TableCell) tag := "td" @@ -212,9 +283,20 @@ func (r *TableHTMLRenderer) renderTableCell(w util.BufWriter, source []byte, nod if entering { align := "" if n.Alignment != ast.AlignNone { - align = fmt.Sprintf(` align="%s"`, n.Alignment.String()) + if _, ok := n.AttributeString("align"); !ok { // Skip align render if overridden + // TODO: "align" is deprecated. style="text-align:%s" instead? + align = fmt.Sprintf(` align="%s"`, n.Alignment.String()) + } } - fmt.Fprintf(w, "<%s%s>", tag, align) + fmt.Fprintf(w, "<%s", tag) + if n.Attributes() != nil { + if tag == "td" { + html.RenderAttributes(w, n, TableTdCellAttributeFilter) // + } else { + html.RenderAttributes(w, n, TableThCellAttributeFilter) // + } + } + fmt.Fprintf(w, "%s>", align) } else { fmt.Fprintf(w, "\n", tag) } diff --git a/renderer/html/html.go b/renderer/html/html.go index b2ca75b..e9aca21 100644 --- a/renderer/html/html.go +++ b/renderer/html/html.go @@ -399,8 +399,11 @@ func (r *Renderer) renderTextBlock(w util.BufWriter, source []byte, n ast.Node, // ThematicAttributeFilter defines attribute names which hr elements can have. var ThematicAttributeFilter = GlobalAttributeFilter.Extend( - []byte("align"), - []byte("color"), + []byte("align"), // [Deprecated] + []byte("color"), // [Not Standardized] + []byte("noshade"), // [Deprecated] + []byte("size"), // [Deprecated] + []byte("width"), // [Deprecated] ) func (r *Renderer) renderThematicBreak(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {