module RuWEB::SewCode

Gets code

Public Instance Methods

init(source, return_cmds: true, return_macros: false, return_both: false) click to toggle source
# File lib/ruweb/sewcode.rb, line 10
def init(source, return_cmds: true, return_macros: false, return_both: false)
  @return_macros = return_macros
  @return_cmds   = return_cmds
  @return_both   = return_both
  @code          = sew(extract_blocks_from(source))
end

Private Instance Methods

arrange(cmds) click to toggle source
# File lib/ruweb/sewcode.rb, line 60
def arrange(cmds)
  arranged = preserve('cmd', cmds).map! { |e| { cmd: e[:cmd], data: '' } }.uniq
  pick(cmds, arranged)
end
extract_blocks_from(markdown) click to toggle source
# File lib/ruweb/sewcode.rb, line 19
def extract_blocks_from(markdown)
  b = '\u0060' * 3
  markdown.scan(/#{b}((.|\n)+?)#{b}/).map(&:first)
end
obtain_custom_or_macro_from(meta, data, index) click to toggle source
# File lib/ruweb/sewcode.rb, line 43
def obtain_custom_or_macro_from(meta, data, index)
  obj    = { index: index }
  custom = meta.gsub(/^\S+\s+/, '')
  macro  = custom =~ /^\u005F/ ? custom : nil
  macro ? obj[:macro] = macro : obj[:custom] = custom
  obj.merge({ data: data })
end
pick(cmds, arranged) click to toggle source
# File lib/ruweb/sewcode.rb, line 65
def pick(cmds, arranged)
  arranged.map! do |e1|
    picked = cmds.select { |e2| e1[:cmd] == e2[:cmd] }
    index  = picked.map { |e| e[:index] }.min
    data   = picked.map { |e| e[:data] }.join("\n")
    { index: index, cmd: e1[:cmd], data: data }
  end
end
preserve(key, array) click to toggle source
# File lib/ruweb/sewcode.rb, line 80
def preserve(key, array)
  array.select { |e| e[key.to_sym] }
end
rearrange(custom) click to toggle source
# File lib/ruweb/sewcode.rb, line 74
def rearrange(custom)
  custom = preserve('custom', custom)
  custom.reject! { |e| e[:custom] == 'x' }
  custom.map { |e| { index: e[:index], cmd: e[:custom], data: e[:data] } }
end
resolve(macros, cmds) click to toggle source
# File lib/ruweb/sewcode.rb, line 84
def resolve(macros, cmds)
  case
  when @return_both
    cmds.concat(macros)
  when @return_macros
    macros
  when @return_cmds
    cmds
  end    
end
sew(blocks) click to toggle source
# File lib/ruweb/sewcode.rb, line 24
def sew(blocks)
  blocks.map!.with_index do |block, i|
    lines = block.split("\n")
    if lines.any?
      meta  = lines[0]
      data  = lines[1..-1].join("\n")
      tokenize(meta, data, i)
    end
  end
  tipify(blocks)
end
tipify(blocks) click to toggle source
# File lib/ruweb/sewcode.rb, line 51
def tipify(blocks)
  blocks.compact!
  cmds   = arrange(blocks)
  custom = rearrange(blocks)
  macros = preserve('macro', blocks).reverse
  cmds   = RuWEB::SewMacros.init(macros, cmds: custom.concat(cmds))
  resolve(macros, cmds.sort_by { |e| e[:index] })
end
tokenize(meta, data, index) click to toggle source
# File lib/ruweb/sewcode.rb, line 36
def tokenize(meta, data, index)
  case meta.split(/\s+/).length
  when 0 then nil
  when 1 then { index: index, cmd: meta[/^\w+/], data: data }
  else obtain_custom_or_macro_from(meta, data, index) end
end