module RevealCK module Markdown # This class gives special meaning to legitimate markdown within # slides. This "slides markdown" is transformed into symbols that # are not markdown. Later on these will be transformed into HTML # meanings. # # For example, # # * --- becomes
DIVIDER
# * ```notes becomes
NOTES_OPEN
# class PreProcessorTransforms attr_reader :doc def initialize(doc) @doc = doc end def process transform_slide_notes_to_notes_symbols transform_slide_dividers_to_divider_symbols transform_slide_verticals_to_vertical_symbols end private def transform_slide_notes_to_notes_symbols match = find_next_notes_match(0) while match match_start = match.offset(0)[0] match_end = match.offset(0)[1] replace_notes_open_with_symbol(match_start, match_end - match_start) close_start = find_next_notes_close(match_start) replace_notes_close_with_symbol(close_start) if close_start match = find_next_notes_match(match_start) end end def find_next_notes_match(current) doc.match(slide_notes_regex, current) end def find_next_notes_close(current) doc.index('```', current) end def replace_notes_open_with_symbol(start, length) doc.slice!(start, length) doc.insert(start, notes_open_symbol) end def replace_notes_close_with_symbol(start) doc.slice!(start, 3) doc.insert(start, notes_close_symbol) end def transform_slide_dividers_to_divider_symbols doc.gsub!(slide_divider_regex, divider_symbol) end def transform_slide_verticals_to_vertical_symbols count = 0 doc.gsub!(slide_vertical_regex) do count += 1 if count.odd? vertical_start_symbol else vertical_end_symbol end end end def slide_notes_regex /^```notes?$/ end def slide_divider_regex /^---$/ end def slide_vertical_regex /^\*\*\*$/ end def newline_wrapped(s) "\n#{s}\n" end def notes_open_symbol newline_wrapped(RevealCK::Markdown::REVEALCK_SYMBOL_FOR_NOTES_OPEN) end def notes_close_symbol newline_wrapped(RevealCK::Markdown::REVEALCK_SYMBOL_FOR_NOTES_CLOSE) end def divider_symbol newline_wrapped(RevealCK::Markdown::REVEALCK_SYMBOL_FOR_DIVIDER) end def vertical_start_symbol newline_wrapped(RevealCK::Markdown::REVEALCK_SYMBOL_FOR_VERTICAL_START) end def vertical_end_symbol newline_wrapped(RevealCK::Markdown::REVEALCK_SYMBOL_FOR_VERTICAL_END) end end end end