Sha256: 357137e8f0a88096a99186b874595c2a0b27135c8a49824deba375990fb4cd6a

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true
require 'parslet'

module Timetrack
  # Read an IO and parse it into an AST
  class Parser < Parslet::Parser
    rule(:eof) { any.absent? }
    rule(:newline) { match['\n'] }
    rule(:space) { str ' ' }
    rule(:gutter) { space.repeat(2) }
    rule(:to_eol) { match['^\n'].repeat }
    rule(:task) { match('\d').repeat(6).as(:task) }
    rule(:year) { match['\d'].repeat 4 }
    rule(:month) { match['\d'].repeat 2 }
    rule(:day) { match['\d'].repeat 2 }
    rule(:date) { year >> str('/') >> month >> str('/') >> day }
    rule(:hour) { match['\d'].repeat 2 }
    rule(:minute) { match['\d'].repeat 2 }
    rule(:time) { hour >> str(':') >> minute }
    rule(:begin_time) { (gutter >> time.as(:begin)) }
    rule(:end_time) { (gutter >> time.as(:end)).maybe }
    rule(:times) { begin_time >> end_time }
    rule(:text) { match['[^\n]'].repeat }
    rule(:comment) { str(';') >> match['\s'].repeat >> text.as(:comment) }
    rule(:comment_block) { (gutter >> comment).maybe }
    rule(:submission_marker) { str('*').as(:submitted) }
    rule(:submission_block) { (submission_marker >> space).maybe }
    rule(:event) do
      gutter >> submission_block >> task >> times >> comment_block >> to_eol
    end
    rule(:events) { (event.as(:event) >> newline).repeat }
    rule(:event_day) { date >> newline >> events }
    rule(:days) do
      (event_day.as(:day) >> newline.repeat).repeat
    end
    rule(:document) { days >> newline.repeat >> eof }
    root :document
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
timetrack-0.1.0 lib/timetrack/parser.rb