better HTML rendering, more options for rendering, fixed command line option parsing

This commit is contained in:
Yessiest 2025-04-03 21:12:43 +00:00
parent 4c484f64fc
commit e2d94cd249
4 changed files with 41 additions and 18 deletions

View File

@ -17,12 +17,9 @@ class OptionNavigator
# Read a definition # Read a definition
# @param define [String] # @param define [String]
def read_definition(define) def read_definition(define)
define.split(";").each do |part| locstring, value = deconstruct(define)
locstring, _, value = part.partition(":")
locstring = deconstruct(locstring.strip)
assign(locstring, JSON.parse(value)) assign(locstring, JSON.parse(value))
end end
end
attr_reader :options attr_reader :options
@ -83,6 +80,9 @@ class OptionNavigator
buffer = locstring[0..closepart] buffer = locstring[0..closepart]
part = locstring[1..-2].to_i part = locstring[1..-2].to_i
locstring = locstring.delete_prefix(buffer) locstring = locstring.delete_prefix(buffer)
when ':'
locstring = locstring.delete_prefix(':')
break
else else
raise ParserError, 'separator missing' unless buffer.empty? raise ParserError, 'separator missing' unless buffer.empty?
@ -92,7 +92,7 @@ class OptionNavigator
end end
end end
parts.append(part) if part parts.append(part) if part
parts [parts, locstring]
end end
def assign(keys, value) def assign(keys, value)

View File

@ -45,7 +45,8 @@ module MMMD
tag: "ol" tag: "ol"
}, },
"PointBlank::DOM::IndentBlock" => { "PointBlank::DOM::IndentBlock" => {
tag: "pre" tag: "pre",
codeblock: true
}, },
"PointBlank::DOM::ULListElement" => { "PointBlank::DOM::ULListElement" => {
tag: "li" tag: "li"
@ -87,7 +88,8 @@ module MMMD
tag: "pre", tag: "pre",
outer: { outer: {
tag: "code" tag: "code"
} },
codeblock: true
}, },
"PointBlank::DOM::QuoteBlock" => { "PointBlank::DOM::QuoteBlock" => {
tag: "blockquote" tag: "blockquote"
@ -126,7 +128,12 @@ module MMMD
def initialize(overrides) def initialize(overrides)
@mapping = self.class.mapping @mapping = self.class.mapping
@mapping = @mapping.merge(overrides["mapping"]) if overrides["mapping"] if overrides["mapping"]
overrides["mapping"].each do |key, value|
next unless @mapping[key]
@mapping[key] = @mapping[key].merge(value)
end
end
end end
attr_reader :mapping attr_reader :mapping
@ -154,7 +161,7 @@ module MMMD
text = _render(@document, @options, level: @options["init_level"]) text = _render(@document, @options, level: @options["init_level"])
@options["init_level"].times { text = indent(text) } @options["init_level"].times { text = indent(text) }
if @options["nowrap"] if @options["nowrap"]
text remove_pre_spaces(text)
else else
[ [
preambule, preambule,
@ -226,8 +233,7 @@ module MMMD
end end
def _render(element, options, inline: false, level: 0, literaltext: false) def _render(element, options, inline: false, level: 0, literaltext: false)
modeswitch = element.is_a?(::PointBlank::DOM::LeafBlock) || modeswitch = figure_out_modeswitch(element)
element.is_a?(::PointBlank::DOM::Paragraph)
inline ||= modeswitch inline ||= modeswitch
level += 1 unless inline level += 1 unless inline
text = if element.children.empty? text = if element.children.empty?
@ -248,21 +254,29 @@ module MMMD
literaltext: literaltext) literaltext: literaltext)
end end
def figure_out_modeswitch(element)
element.is_a?(::PointBlank::DOM::LeafBlock) ||
element.is_a?(::PointBlank::DOM::Paragraph)
end
def run_filters(text, element, level:, inline:, modeswitch:, def run_filters(text, element, level:, inline:, modeswitch:,
literaltext:) literaltext:)
element_style = @mapping[element.class.name] element_style = @mapping[element.class.name]
return text unless element_style return text unless element_style
return text if literaltext return text if literaltext
codeblock = element_style[:codeblock]
hsize = @options["linewrap"] - (level * @options["indent"]) hsize = @options["linewrap"] - (level * @options["indent"])
text = wordwrap(text, hsize) if modeswitch text = wordwrap(text, hsize) if modeswitch && !codeblock
if element_style[:sanitize] if element_style[:sanitize]
text = MMMD::EntityUtils.encode_entities(text) text = MMMD::EntityUtils.encode_entities(text)
end end
if element_style[:inline] if element_style[:inline]
innerclose(element, element_style, text) innerclose(element, element_style, text)
else else
openclose(text, element, element_style, inline) openclose(text, element, element_style,
codeblock ? false : inline)
end end
end end
@ -272,20 +286,25 @@ module MMMD
opentag + text + closetag opentag + text + closetag
else else
[opentag, [opentag,
indent(text), indent(text.rstrip),
closetag].join("\n") closetag].join("\n")
end end
end end
def innerclose(element, style, text) def innerclose(element, style, text)
props = element.properties props = element.properties
tag = "<#{style[:tag]}" tag = ""
tag += "<figure>" if style[:figcaption]
tag += "<#{style[:tag]}"
tag += " style=#{style[:style].inspect}" if style[:style] tag += " style=#{style[:style].inspect}" if style[:style]
tag += " href=#{read_link(element)}" if style[:href] tag += " href=#{read_link(element)}" if style[:href]
tag += " alt=#{text.inspect}" if style[:alt] tag += " alt=#{text.inspect}" if style[:alt]
tag += " src=#{read_link(element)}" if style[:src] tag += " src=#{read_link(element)}" if style[:src]
tag += " title=#{read_title(element)}" if style[:title] && props[:title] tag += " title=#{read_title(element)}" if style[:title] && props[:title]
tag += ">" tag += ">"
if style[:figcaption]
tag += "<figcaption>#{text}</figcaption></figure>"
end
if style[:outer] if style[:outer]
outeropen, outerclose = construct_tags(style[:outer], element) outeropen, outerclose = construct_tags(style[:outer], element)
tag = outeropen + tag + outerclose tag = outeropen + tag + outerclose
@ -298,7 +317,11 @@ module MMMD
props = element.properties props = element.properties
opentag = "<#{style[:tag]}" opentag = "<#{style[:tag]}"
opentag += "<figure>#{opentag}" if style[:figcaption]
closetag = "</#{style[:tag]}>" closetag = "</#{style[:tag]}>"
if style[:figcaption]
closetag += "<figcaption>#{text}</figcaption></figure>"
end
opentag += " style=#{style[:style].inspect}" if style[:style] opentag += " style=#{style[:style].inspect}" if style[:style]
opentag += " href=#{read_link(element)}" if style[:href] opentag += " href=#{read_link(element)}" if style[:href]
opentag += " src=#{read_link(element)}" if style[:src] opentag += " src=#{read_link(element)}" if style[:src]
@ -326,7 +349,7 @@ module MMMD
def indent(text) def indent(text)
text.lines.map do |line| text.lines.map do |line|
"#{' ' * @options["indent"]}#{line}" "#{' ' * @options['indent']}#{line}"
end.join('') end.join('')
end end
@ -334,7 +357,7 @@ module MMMD
head = @options['head'] head = @options['head']
headinfo = "#{indent(<<~HEAD.rstrip)}\n " if head headinfo = "#{indent(<<~HEAD.rstrip)}\n " if head
<head> <head>
#{head.is_a?(Array) ? head.join("\n") : head} #{indent(head.is_a?(Array) ? head.join("\n") : head)}
</head> </head>
HEAD HEAD
headinfo ||= " " headinfo ||= " "