Class: Makeup::CodeBlockParser

Inherits:
Object
  • Object
show all
Defined in:
lib/makeup/code_block_parser.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(markup) ⇒ CodeBlockParser

Returns a new instance of CodeBlockParser.



34
35
36
37
# File 'lib/makeup/code_block_parser.rb', line 34

def initialize(markup)
  @lines = markup.split("\n")
  @current_code_bock = nil
end

Instance Attribute Details

#linesObject (readonly)

Returns the value of attribute lines.



28
29
30
# File 'lib/makeup/code_block_parser.rb', line 28

def lines
  @lines
end

Class Method Details

.parse(markup, &block) ⇒ Object



30
31
32
# File 'lib/makeup/code_block_parser.rb', line 30

def self.parse(markup, &block)
  new(markup).parse(&block)
end

Instance Method Details

#active_code_block?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/makeup/code_block_parser.rb', line 57

def active_code_block?
  !@current_code_bock.nil?
end

#append_active_code_block(line) ⇒ Object



74
75
76
# File 'lib/makeup/code_block_parser.rb', line 74

def append_active_code_block(line)
  @current_code_bock[1] << line
end

#close_active_code_blockObject



78
79
80
81
82
83
# File 'lib/makeup/code_block_parser.rb', line 78

def close_active_code_block
  lexer = @current_code_bock[0]
  code = @current_code_bock[1].join("\n")
  @current_code_bock = nil
  [lexer, code]
end

#closes_code_block?(line) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/makeup/code_block_parser.rb', line 65

def closes_code_block?(line)
  active_code_block? && line.match(/^```/)
end

#parse(&block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/makeup/code_block_parser.rb', line 39

def parse(&block)
  result = []

  while line = @lines.shift
    if closes_code_block?(line)
      result << block.call(*close_active_code_block)
    elsif active_code_block?
      append_active_code_block(line)
    elsif starts_code_block?(line)
      start_code_block(line)
    else
      result << line
    end
  end

  result.join("\n")
end

#start_code_block(line) ⇒ Object



69
70
71
72
# File 'lib/makeup/code_block_parser.rb', line 69

def start_code_block(line)
  m = line.match(/```([^\s]+)/)
  @current_code_bock = [m && m[1], []]
end

#starts_code_block?(line) ⇒ Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/makeup/code_block_parser.rb', line 61

def starts_code_block?(line)
  line.match(/^```.*/)
end