instiki/vendor/plugins/maruku/lib/maruku/ext/div.rb

122 lines
3.1 KiB
Ruby

#+-----------------------------------{.warning}------
#| this is the last warning!
#|
#| please, go away!
#|
#| +------------------------------------- {.menace} --
#| | or else terrible things will happen
#| +--------------------------------------------------
#+---------------------------------------------------
# TODO: Scope these properly
OpenDiv = /^[ ]{0,3}\+\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
CloseDiv = /^[ ]{0,3}\=\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
StartPipe = /^[ ]{0,3}\|(.*)$/ # $1 is rest of line
DecorativeClosing = OpenDiv
MaRuKu::In::Markdown.register_block_extension(
:regexp => OpenDiv,
:handler => lambda do |doc, src, context|
first = src.shift_line
ial_at_beginning = first[OpenDiv, 1]
ial_at_end = nil
lines = []
# if second line starts with "|"
if src.cur_line =~ StartPipe
# then we read until no more "|"
while src.cur_line && src.cur_line =~ StartPipe
lines.push $1
src.shift_line
end
if src.cur_line =~ DecorativeClosing
ial_at_end = $1
src.shift_line
end
else
# else we read until CloseDiv
divs_open = 1
while src.cur_line && divs_open > 0
if src.cur_line =~ CloseDiv
divs_open -= 1
if divs_open == 0
ial_at_end = $1
src.shift_line
break
else
lines.push src.shift_line
end
else
if src.cur_line =~ OpenDiv
divs_open += 1
end
lines.push src.shift_line
end
end
if divs_open > 0
doc.maruku_error("At end of input, I still have #{divs_open} DIVs open.",
src, context)
next true
end
end
ial_at_beginning = nil unless ial_at_beginning && ial_at_beginning.size > 0
ial_at_end = nil unless ial_at_end && ial_at_end.size > 0
if ial_at_beginning && ial_at_end
doc.maruku_error("Found two conflicting IALs: #{ial_at_beginning.inspect} and #{ial_at_end.inspect}",
src, context)
end
al_string = ial_at_beginning || ial_at_end
al = nil
if al_string =~ /^\{(.*)\}\s*$/
al = al_string && doc.read_attribute_list(
MaRuKu::In::Markdown::SpanLevelParser::CharSource.new($1),
nil, [nil])
end
context.push(
doc.md_div(
doc.parse_blocks(
MaRuKu::In::Markdown::BlockLevelParser::LineSource.new(lines)),
al))
true
end)
module MaRuKu
class MDElement
def md_div(children, al = nil)
type = label = num = nil
doc.refid2ref ||= {}
if al
al.each do |k, v|
case k
when :class; type = $1 if v =~ /^num_(\w*)/
when :id; label = v
end
end
end
if type
doc.refid2ref[type] ||= {}
num = doc.refid2ref[type].length + 1
end
e = self.md_el(:div, children, {:label => label, :type => type, :num => num}, al)
doc.refid2ref[type].update(label => e) if type && label
e
end
end
module Out
module HTML
def to_html_div
add_ws wrap_as_element('div')
end
end
end
end