Sha256: 26a43fedab973651c07912485f5b5aa3853a8a63a47e5a2db5294bf44fc532e8

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

class HumansRb
  class Parser < Parslet::Parser
    rule(:space)       { str(" ") }
    rule(:space?)      { space.repeat }
    rule(:tab)         { match("[\t]").repeat(1) }
    rule(:tab?)        { match("[\t]").repeat }
    rule(:whitespace)  { (space | tab).repeat(1) }
    rule(:whitespace?) { (space | tab).repeat }

    rule(:newline)  { match("[\n]") >> whitespace? }
    rule(:newline?) { newline.maybe }

    rule(:slash_star) { str("/*") }
    rule(:star_slash) { str("*/") }
    rule(:heading_name) { newline.absent? >> space.absent? >> match("[A-Z]").repeat(1) }
    rule(:heading) { slash_star >> space >> heading_name.as(:heading) >> space >> star_slash >> newline }

    rule(:colon) { str(":") }
    rule(:key) { slash_star.absent? >> newline.absent? >> match("[^:\n]").repeat.as(:key) >> colon }
    rule(:value) { newline.absent? >> match("[^\n]").repeat.as(:value) }
    rule(:key_value_pair) { whitespace? >> key >> space? >> value >> newline }
    rule(:key_value_pairs) { key_value_pair.repeat(1).as(:values) }

    rule(:name) { slash_star.absent? >> match("[^\t\n:]").repeat(1).as(:name) >> newline }
    rule(:team_member) { whitespace? >> name.maybe >> key_value_pair.repeat(1) >> newline? >> newline? }
    rule(:team_members) { team_member.as(:member).repeat(2).as(:members) }

    rule(:section) { heading >> newline? >> (team_members | key_value_pairs) >> newline? }
    rule(:document) { section.repeat(1).as(:sections) }

    root :document
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
humans_rb-0.0.6 lib/humans_rb/parser.rb
humans_rb-0.0.5 lib/humans_rb/parser.rb
humans_rb-0.0.4 lib/humans_rb/parser.rb