module MaRuKu; module In; module Markdown # Hash Fixnum -> name SpanExtensionsTrigger = {} class SpanExtension # trigging chars attr_accessor :chars # trigging regexp attr_accessor :regexp # lambda attr_accessor :block end # Hash String -> Extension SpanExtensions = {} def check_span_extensions(src, con) c = src.cur_char if extensions = SpanExtensionsTrigger[c] extensions.each do |e| if e.regexp && (match = src.next_matches(e.regexp)) return true if e.block.call(doc, src, con) end end end return false # not special end def self.register_span_extension(args, &block) e = SpanExtension.new e.chars = [*args[:chars]] e.regexp = args[:regexp] e.block = block e.chars.each do |c| (SpanExtensionsTrigger[c] ||= []).push e end end def self.register_block_extension(args, &block) regexp = args[:regexp] BlockExtensions[regexp] = block end # Hash Regexp -> Block BlockExtensions = {} def check_block_extensions(src, con, line) BlockExtensions.each do |reg, block| if m = reg.match(line) block = BlockExtensions[reg] return true if block.call(doc, src, con) end end return false # not special end def any_matching_block_extension?(line) BlockExtensions.each_key do |reg| m = reg.match(line) return m if m end return false end end end end