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

hidden?() click to toggle source

all of the commands are hidden

# File lib/rundoc/code_section.rb, line 84
def hidden?
  !not_hidden?
end
not_hidden?() click to toggle source

one or more of the commands are not hidden

# File lib/rundoc/code_section.rb, line 89
def not_hidden?
  return true if commands.empty?
  commands.map(&:not_hidden?).detect {|c| c }
end
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