Class: Markleft::Parser

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

Overview

—————– Parser Module —————– #

Instance Method Summary collapse

Constructor Details

#initialize(tokens) ⇒ Parser

Returns a new instance of Parser.



54
55
56
# File 'lib/markleft.rb', line 54

def initialize(tokens)
  @tokens = tokens
end

Instance Method Details

#consume(expected_type) ⇒ Object



123
124
125
126
127
128
129
130
# File 'lib/markleft.rb', line 123

def consume(expected_type)
  token = @tokens.shift
  unless token.type == expected_type
    raise "Expected token type #{expected_type.inspect} but got #{token.type.inspect}"
  end

  token
end

#parseObject



58
59
60
61
62
# File 'lib/markleft.rb', line 58

def parse
  nodes = []
  nodes << parse_node until @tokens.empty?
  nodes
end

#parse_boldObject



93
94
95
96
# File 'lib/markleft.rb', line 93

def parse_bold
  value = consume(:bold).value
  BoldNode.new(value)
end

#parse_heading(level) ⇒ Object



108
109
110
111
# File 'lib/markleft.rb', line 108

def parse_heading(level)
  consume(:"heading#{level}")
  HeadingNode.new("Heading", level)
end

#parse_italicsObject



98
99
100
101
# File 'lib/markleft.rb', line 98

def parse_italics
  value = consume(:italics).value
  ItalicsNode.new(value)
end

#parse_newlineObject



103
104
105
106
# File 'lib/markleft.rb', line 103

def parse_newline
  consume(:newline)
  NewlineNode.new
end

#parse_nodeObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/markleft.rb', line 64

def parse_node
  case @tokens.first.type
  when :bold
    parse_bold
  when :italics
    parse_italics
  when :newline
    parse_newline
  when :text
    parse_text
  when :heading1
    parse_heading(1)
  when :heading2
    parse_heading(2)
  when :heading3
    parse_heading(3)
  when :heading4
    parse_heading(4)
  when :heading5
    parse_heading(5)
  when :heading6
    parse_heading(6)
  when :strikethrough
    parse_strikethrough
  else
    raise "Unexpected token type: #{@tokens.first.type}"
  end
end

#parse_strikethroughObject



113
114
115
116
# File 'lib/markleft.rb', line 113

def parse_strikethrough
  value = consume(:strikethrough).value
  StrikethroughNode.new(value)
end

#parse_textObject



118
119
120
121
# File 'lib/markleft.rb', line 118

def parse_text
  value = consume(:text).value
  TextNode.new(value)
end