Method: Cosensee::LineParser#parse_bracket

Defined in:
lib/cosensee/line_parser.rb

#parse_bracket(line) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/cosensee/line_parser.rb', line 192

def parse_bracket(line)
  return line if line.parsed?

  parsed = []
  stack = nil
  target_char = '[' # or "]"

  line.content.each do |elem|
    case elem
    when Cosensee::Node::Code, Cosensee::Node::DoubleBracket
      if target_char == '['
        parsed << elem
      else
        stack << elem
      end
    else # elem is String
      loop do
        n = elem.index(target_char)
        if n
          if target_char == '['
            parsed << elem[0, n]
            target_char = ']'
            stack = []
          else
            stack << elem[0, n]
            target_char = '['
            parsed << @bracket_parser.parse(stack)
            stack = nil
          end
          elem = elem[(n + 1)..]
        else
          if target_char == '['
            parsed << elem
          else
            stack << elem
          end
          break
        end
      end
    end
  end

  if stack
    # parsed += ['['] + stack
    parsed << '['
    parsed.concat(stack)
  end

  line.update(content: clean_elements(parsed))
end