mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ragel
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ragel
		
	
	
	
	
	
=begin
 | 
						|
%%{
 | 
						|
 | 
						|
  machine ephemeris_parser;
 | 
						|
 | 
						|
  action mark { mark = p }
 | 
						|
 | 
						|
  action parse_start_time {
 | 
						|
    parser.start_time = data[mark..p].pack('c*')
 | 
						|
  }
 | 
						|
 | 
						|
  action parse_stop_time {
 | 
						|
    parser.stop_time = data[mark..p].pack('c*')
 | 
						|
  }
 | 
						|
 | 
						|
  action parse_step_size {
 | 
						|
    parser.step_size = data[mark..p].pack('c*')
 | 
						|
  }
 | 
						|
 | 
						|
  action parse_ephemeris_table {
 | 
						|
    fhold;
 | 
						|
    parser.ephemeris_table = data[mark..p].pack('c*')
 | 
						|
  }
 | 
						|
 | 
						|
  ws = [ \t\r\n];
 | 
						|
 | 
						|
  adbc = ('A.D.'|'B.C.');
 | 
						|
  year = digit{4};
 | 
						|
  month = upper lower{2};
 | 
						|
  date = digit{2};
 | 
						|
  hours =  digit{2};
 | 
						|
  minutes = digit{2};
 | 
						|
  seconds = digit{2} '.' digit{4};
 | 
						|
  tz = 'UT';
 | 
						|
  datetime = adbc ' ' year '-' month '-' date ' ' hours ':' minutes ':' seconds ' ' tz;
 | 
						|
 | 
						|
  time_unit = ('minute' [s]? | 'calendar year' [s]?);
 | 
						|
 | 
						|
  soe = '$$SOE' '\n';
 | 
						|
  eoe = '$$EOE' '\n';
 | 
						|
  ephemeris_table = (alnum | ws | [*-./:])*;
 | 
						|
 | 
						|
  start_time = 'Start time' ' '* ':' ' ' datetime >mark %parse_start_time space* '\n';
 | 
						|
  stop_time  = 'Stop  time' ' '* ':' ' ' datetime >mark %parse_stop_time space* '\n';
 | 
						|
  step_size  = 'Step-size' ' '* ':' ' ' (digit+ ' '* time_unit) >mark $parse_step_size '\n';
 | 
						|
 | 
						|
  ephemeris = soe ephemeris_table >mark %parse_ephemeris_table eoe;
 | 
						|
 | 
						|
  main := (
 | 
						|
    any*
 | 
						|
    start_time
 | 
						|
    stop_time
 | 
						|
    step_size
 | 
						|
    any*
 | 
						|
    ephemeris
 | 
						|
    any*
 | 
						|
  );
 | 
						|
 | 
						|
}%%
 | 
						|
=end
 | 
						|
 | 
						|
require 'date'
 | 
						|
 | 
						|
module Tengai
 | 
						|
  EPHEMERIS_DATA = Struct.new(:start_time, :stop_time, :step_size, :ephemeris_table).freeze
 | 
						|
 | 
						|
  class EphemerisParser < EPHEMERIS_DATA
 | 
						|
    def self.parse(data)
 | 
						|
      parser = new
 | 
						|
      data = data.unpack('c*') if data.is_a? String
 | 
						|
      eof = data.length
 | 
						|
 | 
						|
      %% write init;
 | 
						|
      %% write exec;
 | 
						|
 | 
						|
      parser
 | 
						|
    end
 | 
						|
 | 
						|
    def start_time=(time)
 | 
						|
      super parse_time(time)
 | 
						|
    end
 | 
						|
 | 
						|
    def stop_time=(time)
 | 
						|
      super parse_time(time)
 | 
						|
    end
 | 
						|
 | 
						|
    %% write data;
 | 
						|
 | 
						|
    # % fix syntax highlighting
 | 
						|
 | 
						|
    private
 | 
						|
    def parse_time(time)
 | 
						|
      DateTime.parse(time)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end |