IceDragon200

[RUBY]Chitat

Jun 2nd, 2012
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.06 KB | None | 0 0
  1. #-// 05/11/2012
  2. #-// 06/02/2012
  3. #-inject gen_module_header 'Chitat'
  4. module Chitat
  5.   STRS_TRUE  = ["TRUE","YES","ON","T","Y"]
  6.   STRS_FALSE = ["FALSE","NO","OFF","F","N"]
  7.   STRS_BOOL  = STRS_TRUE + STRS_FALSE
  8.   module Regexp
  9.     BOOL = /(?:#{STRS_BOOL.join(?|)})/i
  10.     INT = /\d+/
  11.     FLT = /\d+\.\d+/
  12.   end
  13.   def self.obj2str(obj)
  14.     String(obj)
  15.   end
  16.   def self.str2bool(str)
  17.     case str.upcase
  18.     when *STRS_TRUE  ; true
  19.     when *STRS_FALSE ; false
  20.     else             ; nil
  21.     end
  22.   end
  23.   def self.str2int(str)
  24.     Integer(str)
  25.   end
  26.   def self.str2flt(str)
  27.     Float(str)
  28.   end
  29.   def self.str2int_a(str)
  30.     str.scan(/\d+/).map!(&:to_i)
  31.   end
  32.   def self.str2array(str)
  33.     str.split(?,)
  34.   end
  35.   def self.str2obj(str,type=:nil)
  36.     case type
  37.     when :int, :integer ; str2int(str)
  38.     when :flt, :float   ; str2flt(str)
  39.     when :bool,:boolean ; str2bool(str)
  40.     when :str, :string  ; str.to_s
  41.     else # // Guess type
  42.       if str =~ Regexp::FLT
  43.         str2flt(str)
  44.       elsif str =~ Regexp::INT
  45.         str2int(str)
  46.       elsif str =~ Regexp::BOOL_REGEX
  47.         str2bool(str)
  48.       else # // String
  49.         str.to_s
  50.       end
  51.     end
  52.   end
  53.   @data_types = {
  54.     # // [keywords..] => proc { |s| parse_to_proper_type }
  55.     ["string" ,"str" ]=> proc {|*args|args.map!(&:to_s) },
  56.     ["integer","int" ]=> proc {|*args|args.map!(&:to_i) },
  57.     ["boolean","bool"]=> proc {|*args|args.collect{|s|str2bool(s)}},
  58.     ["float"  ,"flt" ]=> proc {|*args|args.map!(&:to_f) },
  59.     ["hex"]           => proc {|*args|args.map!(&:hex)}
  60.   }
  61.   @structs ||= {
  62.   }
  63.   @data_types.merge(@structs)
  64.   str = "(a-)?(%s):(.*)" % @data_types.keys.collect{|a|"(?:"+a.join(?|)+?)}.join(?|)
  65.   DTREGEX = /#{str}/i
  66.   @data_types.enum2keys!
  67.   # // Notebox
  68.   class Note ; end
  69.   class Note::Folder
  70.     class Stack < Array
  71.       attr_reader :match_data
  72.       def initialize(match_data,*args,&block)
  73.         @match_data = match_data
  74.         super *args,&block
  75.       end
  76.     end
  77.     attr_accessor :open_tag,:close_tag
  78.     def initialize(open_tag=nil,close_tag=nil)
  79.       @open_tag,@close_tag = open_tag,close_tag
  80.     end
  81.     def mk_and_set_tag(str)
  82.       @open_tag,@close_tag = /<#{str}>/i,/<\/#{str}>/i
  83.       self
  84.     end  
  85.     def parse_str(str)
  86.       lines  = str.split(/[\r\n]+/i)
  87.       i,line,result,arra = 0, nil,[],[]
  88.       while(i < lines.size)
  89.         line = lines[i]
  90.         if mtch = line.match(@open_tag)
  91.           i += 1
  92.           while true
  93.             line = lines[i]
  94.             break if line =~ @close_tag
  95.             result << line
  96.             i += 1
  97.             raise "End of note reached!" if(i > lines.size)
  98.           end  
  99.           arra << Stack.new(mtch,result); result = []
  100.         end  
  101.         i += 1
  102.       end
  103.       arra
  104.     end
  105.   end
  106.   TAG_REGEXP = /(.+):\s*(.+)/
  107.   def self.parse_knv_str(tag,types=[:nil],has_array=false)
  108.     types = Array(types)
  109.     mtch = tag.match TAG_REGEXP
  110.     return nil unless mtch
  111.     key,value = mtch[1,2]
  112.     values = (has_array ? value.split(?,) : Array(value)).each_with_index.to_a.collect{|(n,index)|value2obj(n,types[index]||:nil)}
  113.     return key, values
  114.   end
  115.   # // Chitat Main
  116.   def self.parse_dtstr(dtstr,return_type=:value)
  117.     mtch = dtstr.match DTREGEX
  118.     raise "Malformed Data String %s" % dtstr unless mtch
  119.     is_array, dt_type, value = mtch[1,3]
  120.     return is_array, dt_type if return_type == :data_type
  121.     is_array = !!is_array
  122.     parser = @data_types[dt_type.downcase]
  123.     #puts "is_array?[%s] dt_type[%s] value[%s]" % [is_array, dt_type, value]
  124.     value = parser.call(is_array ? value.split(?,) : Array(value))
  125.     value if return_type == :value
  126.     return is_array, dt_type, value
  127.   end
  128.   def self.obj_data_type(obj)
  129.     case obj
  130.     when Float     ; "flt"
  131.     when Numeric   ; "int"
  132.     when String    ; "str"
  133.     when true,false; "bool"  
  134.     else           ; nil
  135.     end
  136.   end
  137.   def self.obj2dtstr(obj)
  138.     if obj.is_a?(Array)
  139.       "%s:%s" % obj.join(?,)
  140.     else
  141.       type = obj_data_type(obj)
  142.       type ? "%s:%s" % [type,obj] : nil
  143.     end
  144.   end
  145. end
Advertisement
Add Comment
Please, Sign In to add comment