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