class Rundoc::CodeSection
holds code, parses and creates CodeCommand
Constants
- COMMAND_REGEX
Attributes
code[RW]
commands[RW]
fence[RW]
keyword[RW]
lang[RW]
original[RW]
Public Class Methods
new(match, options = {})
click to toggle source
# File lib/rundoc/code_section.rb, line 30 def initialize(match, options = {}) @original = match.to_s @commands = [] @stack = [] @keyword = options[:keyword] or raise "keyword is required" @document_path = options[:document_path] @fence = match[:fence] @lang = match[:lang] @code = match[:contents] parse_code_command end
Public Instance Methods
parse_code_command()
click to toggle source
# File lib/rundoc/code_section.rb, line 94 def parse_code_command parser = Rundoc::PegParser.new.code_block tree = parser.parse(@code) actual = Rundoc::PegTransformer.new.apply(tree) actual = [actual] unless actual.is_a?(Array) actual.each do |code_command| @stack << "\n" if commands.last.is_a?(Rundoc::CodeCommand) @stack << code_command commands << code_command end rescue ::Parslet::ParseFailed => e raise "Could not compile code:\n#{@code}\nReason: #{e.message}" end
render()
click to toggle source
# File lib/rundoc/code_section.rb, line 42 def render result = [] env = {} env[:commands] = [] env[:before] = String.new("#{fence}#{lang}") env[:after] = String.new(fence) env[:document_path] = @document_path @stack.each do |s| unless s.respond_to?(:call) result << s next end code_command = s code_output = code_command.call(env) || "" code_line = code_command.to_md(env) || "" env[:commands] << { object: code_command, output: code_output, command: code_line } tmp_result = [] tmp_result << code_line if code_command.render_command? tmp_result << code_output if code_command.render_result? result << tmp_result unless code_command.hidden? result end return env[:replace] if env[:replace] return "" if hidden? array = [env[:before], result, env[:after]] array.flatten! array.compact! array.map!(&:rstrip) array.reject!(&:empty?) return array.join("\n") << "\n" end