Cascade other style options to children when requested

This commit is contained in:
Christian Muehlhaeuser
2019-12-05 14:07:10 +01:00
parent eaed263d06
commit c4b02ad80d
13 changed files with 120 additions and 59 deletions
+9 -9
View File
@@ -16,7 +16,7 @@ type BaseElement struct {
Token string Token string
Prefix string Prefix string
Suffix string Suffix string
Style StyleType Style *ElementStyle
} }
func color(c string) (uint8, error) { func color(c string) (uint8, error) {
@@ -73,25 +73,25 @@ func renderText(w io.Writer, rules *ElementStyle, s string) {
out = out.BgIndex(i) out = out.BgIndex(i)
} }
if rules.Underline { if rules.Underline != nil && *rules.Underline {
out = out.Underline() out = out.Underline()
} }
if rules.Bold { if rules.Bold != nil && *rules.Bold {
out = out.Bold() out = out.Bold()
} }
if rules.Italic { if rules.Italic != nil && *rules.Italic {
out = out.Italic() out = out.Italic()
} }
if rules.CrossedOut { if rules.CrossedOut != nil && *rules.CrossedOut {
out = out.CrossedOut() out = out.CrossedOut()
} }
if rules.Overlined { if rules.Overlined != nil && *rules.Overlined {
out = out.Overlined() out = out.Overlined()
} }
if rules.Inverse { if rules.Inverse != nil && *rules.Inverse {
out = out.Reverse() out = out.Reverse()
} }
if rules.Blink { if rules.Blink != nil && *rules.Blink {
out = out.Blink() out = out.Blink()
} }
} }
@@ -105,7 +105,7 @@ func (e *BaseElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error
renderText(w, tr.blockStack.Current().Style, e.Suffix) renderText(w, tr.blockStack.Current().Style, e.Suffix)
}() }()
rules := tr.blockStack.With(tr.style[e.Style]) rules := tr.blockStack.With(e.Style)
if rules != nil { if rules != nil {
renderText(w, rules, rules.Prefix) renderText(w, rules, rules.Prefix)
defer func() { defer func() {
+4 -4
View File
@@ -29,10 +29,10 @@ func (s BlockStack) Indent() uint {
var i uint var i uint
for _, v := range s { for _, v := range s {
if v.Style == nil { if v.Style == nil || v.Style.Indent == nil {
continue continue
} }
i += v.Style.Indent i += *v.Style.Indent
} }
return i return i
@@ -42,10 +42,10 @@ func (s BlockStack) Margin() uint {
var i uint var i uint
for _, v := range s { for _, v := range s {
if v.Style == nil { if v.Style == nil || v.Style.Margin == nil {
continue continue
} }
i += v.Style.Margin i += *v.Style.Margin
} }
return i return i
+7 -3
View File
@@ -18,8 +18,12 @@ func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer)
var margin uint var margin uint
rules := tr.style[CodeBlock] rules := tr.style[CodeBlock]
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
theme = rules.Theme theme = rules.Theme
} }
@@ -40,7 +44,7 @@ func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer)
// fallback rendering // fallback rendering
el := &BaseElement{ el := &BaseElement{
Token: string(e.Code), Token: string(e.Code),
Style: CodeBlock, Style: rules,
} }
return el.Render(iw, node, tr) return el.Render(iw, node, tr)
+6 -2
View File
@@ -30,8 +30,12 @@ func (e *DocumentElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) e
var suffix string var suffix string
rules := tr.style[Document] rules := tr.style[Document]
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
suffix = rules.Suffix suffix = rules.Suffix
} }
pw := &PaddingWriter{ pw := &PaddingWriter{
+11 -11
View File
@@ -37,7 +37,7 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
Exiting: "\n", Exiting: "\n",
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: BlockQuote, Style: tr.style[BlockQuote],
}, },
} }
case bf.List: case bf.List:
@@ -67,28 +67,28 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
Exiting: "\n", Exiting: "\n",
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: "---", Token: "---",
Style: HorizontalRule, Style: tr.style[HorizontalRule],
}, },
} }
case bf.Emph: case bf.Emph:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.FirstChild.Literal), Token: string(node.FirstChild.Literal),
Style: Emph, Style: tr.style[Emph],
}, },
} }
case bf.Strong: case bf.Strong:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.FirstChild.Literal), Token: string(node.FirstChild.Literal),
Style: Strong, Style: tr.style[Strong],
}, },
} }
case bf.Del: case bf.Del:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Del, Style: tr.style[Del],
}, },
} }
case bf.Link: case bf.Link:
@@ -103,14 +103,14 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(stripper.Sanitize(string(node.Literal))), Token: html.UnescapeString(stripper.Sanitize(string(node.Literal))),
Style: Text, Style: tr.style[Text],
}, },
} }
case bf.HTMLBlock: case bf.HTMLBlock:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n",
Style: HTMLBlock, Style: tr.style[HTMLBlock],
}, },
} }
case bf.CodeBlock: case bf.CodeBlock:
@@ -126,7 +126,7 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
Exiting: "\n", Exiting: "\n",
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Softbreak, Style: tr.style[Softbreak],
}, },
} }
case bf.Hardbreak: case bf.Hardbreak:
@@ -134,21 +134,21 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
Exiting: "\n", Exiting: "\n",
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Hardbreak, Style: tr.style[Hardbreak],
}, },
} }
case bf.Code: case bf.Code:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Code, Style: tr.style[Code],
}, },
} }
case bf.HTMLSpan: case bf.HTMLSpan:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n",
Style: HTMLSpan, Style: tr.style[HTMLSpan],
}, },
} }
case bf.Table: case bf.Table:
+7 -3
View File
@@ -33,8 +33,12 @@ func (e *HeadingElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) er
} }
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
} }
iw := &IndentWriter{ iw := &IndentWriter{
@@ -56,7 +60,7 @@ func (e *HeadingElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) er
el := &BaseElement{ el := &BaseElement{
Prefix: pre, Prefix: pre,
Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal),
Style: Heading, Style: rules,
} }
err := el.Render(flow, node, tr) err := el.Render(flow, node, tr)
if err != nil { if err != nil {
+2 -2
View File
@@ -13,7 +13,7 @@ func (e *ImageElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) erro
if len(node.LastChild.Literal) > 0 { if len(node.LastChild.Literal) > 0 {
el := &BaseElement{ el := &BaseElement{
Token: string(node.LastChild.Literal), Token: string(node.LastChild.Literal),
Style: ImageText, Style: tr.style[ImageText],
} }
err := el.Render(w, node.LastChild, tr) err := el.Render(w, node.LastChild, tr)
if err != nil { if err != nil {
@@ -24,7 +24,7 @@ func (e *ImageElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) erro
el := &BaseElement{ el := &BaseElement{
Token: resolveRelativeURL(tr.BaseURL, string(node.LinkData.Destination)), Token: resolveRelativeURL(tr.BaseURL, string(node.LinkData.Destination)),
Prefix: " ", Prefix: " ",
Style: Image, Style: tr.style[Image],
} }
err := el.Render(w, node, tr) err := el.Render(w, node, tr)
if err != nil { if err != nil {
+2 -2
View File
@@ -21,7 +21,7 @@ func (e *LinkElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error
if len(node.LastChild.Literal) > 0 { if len(node.LastChild.Literal) > 0 {
el := &BaseElement{ el := &BaseElement{
Token: string(node.LastChild.Literal), Token: string(node.LastChild.Literal),
Style: LinkText, Style: tr.style[LinkText],
} }
err := el.Render(w, node.LastChild, tr) err := el.Render(w, node.LastChild, tr)
if err != nil { if err != nil {
@@ -33,7 +33,7 @@ func (e *LinkElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error
el := &BaseElement{ el := &BaseElement{
Token: resolveRelativeURL(tr.BaseURL, string(node.LinkData.Destination)), Token: resolveRelativeURL(tr.BaseURL, string(node.LinkData.Destination)),
Prefix: " ", Prefix: " ",
Style: Link, Style: tr.style[Link],
} }
err := el.Render(w, node, tr) err := el.Render(w, node, tr)
if err != nil { if err != nil {
+6 -2
View File
@@ -32,8 +32,12 @@ func (e *ListElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error
var suffix string var suffix string
rules := tr.blockStack.Current().Style rules := tr.blockStack.Current().Style
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
suffix = rules.Suffix suffix = rules.Suffix
} }
renderText(tr.blockStack.Current().Block, rules, suffix) renderText(tr.blockStack.Current().Block, rules, suffix)
+2 -2
View File
@@ -23,13 +23,13 @@ func (e *ItemElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error
el = &BaseElement{ el = &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Enumeration, Style: tr.style[Enumeration],
Prefix: strconv.FormatInt(l+1, 10), Prefix: strconv.FormatInt(l+1, 10),
} }
} else { } else {
el = &BaseElement{ el = &BaseElement{
Token: string(node.Literal), Token: string(node.Literal),
Style: Item, Style: tr.style[Item],
} }
} }
+6 -2
View File
@@ -44,8 +44,12 @@ func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer)
} }
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
suffix = rules.Suffix suffix = rules.Suffix
} }
renderText(tr.blockStack.Current().Block, rules, suffix) renderText(tr.blockStack.Current().Block, rules, suffix)
+52 -15
View File
@@ -47,17 +47,17 @@ const (
type ElementStyle struct { type ElementStyle struct {
Color string `json:"color"` Color string `json:"color"`
BackgroundColor string `json:"background_color"` BackgroundColor string `json:"background_color"`
Underline bool `json:"underline"` Underline *bool `json:"underline"`
Bold bool `json:"bold"` Bold *bool `json:"bold"`
Italic bool `json:"italic"` Italic *bool `json:"italic"`
CrossedOut bool `json:"crossed_out"` CrossedOut *bool `json:"crossed_out"`
Faint bool `json:"faint"` Faint *bool `json:"faint"`
Conceal bool `json:"conceal"` Conceal *bool `json:"conceal"`
Overlined bool `json:"overlined"` Overlined *bool `json:"overlined"`
Inverse bool `json:"inverse"` Inverse *bool `json:"inverse"`
Blink bool `json:"blink"` Blink *bool `json:"blink"`
Indent uint `json:"indent"` Indent *uint `json:"indent"`
Margin uint `json:"margin"` Margin *uint `json:"margin"`
Theme string `json:"theme"` Theme string `json:"theme"`
Prefix string `json:"prefix"` Prefix string `json:"prefix"`
Suffix string `json:"suffix"` Suffix string `json:"suffix"`
@@ -86,8 +86,17 @@ func cascadeStyle(parent *ElementStyle, child *ElementStyle, onlyColors bool) *E
s.BackgroundColor = parent.BackgroundColor s.BackgroundColor = parent.BackgroundColor
if !onlyColors { if !onlyColors {
s.Margin = parent.Margin
s.Indent = parent.Indent s.Indent = parent.Indent
s.Margin = parent.Margin
s.Underline = parent.Underline
s.Bold = parent.Bold
s.Italic = parent.Italic
s.CrossedOut = parent.CrossedOut
s.Faint = parent.Faint
s.Conceal = parent.Conceal
s.Overlined = parent.Overlined
s.Inverse = parent.Inverse
s.Blink = parent.Blink
} }
if child != nil { if child != nil {
@@ -97,11 +106,39 @@ func cascadeStyle(parent *ElementStyle, child *ElementStyle, onlyColors bool) *E
if child.BackgroundColor != "" { if child.BackgroundColor != "" {
s.BackgroundColor = child.BackgroundColor s.BackgroundColor = child.BackgroundColor
} }
if child.Margin > 0 {
if child.Indent != nil {
s.Indent = child.Indent
}
if child.Margin != nil {
s.Margin = child.Margin s.Margin = child.Margin
} }
if child.Indent > 0 { if child.Underline != nil {
s.Indent = child.Indent s.Underline = child.Underline
}
if child.Bold != nil {
s.Bold = child.Bold
}
if child.Italic != nil {
s.Italic = child.Italic
}
if child.CrossedOut != nil {
s.CrossedOut = child.CrossedOut
}
if child.Faint != nil {
s.Faint = child.Faint
}
if child.Conceal != nil {
s.Conceal = child.Conceal
}
if child.Overlined != nil {
s.Overlined = child.Overlined
}
if child.Inverse != nil {
s.Inverse = child.Inverse
}
if child.Blink != nil {
s.Blink = child.Blink
} }
} }
+6 -2
View File
@@ -27,8 +27,12 @@ func (e *TableElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) erro
var margin uint var margin uint
rules := tr.style[Table] rules := tr.style[Table]
if rules != nil { if rules != nil {
indent = rules.Indent if rules.Indent != nil {
margin = rules.Margin indent = *rules.Indent
}
if rules.Margin != nil {
margin = *rules.Margin
}
} }
iw := &IndentWriter{ iw := &IndentWriter{
Indent: indent + margin, Indent: indent + margin,