123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- module Sitef
-
-
-
-
-
-
-
-
-
-
- def self.parse_file(file)
- lineno = 0
- results = []
- errors = []
-
- record = {}
- key = nil
- value = nil
- until file.eof?
- lineno += 1
- line = file.gets(256)
- break if line.nil?
- next if line.empty?
-
- if line[0,2] == '--'
-
- if key
- record[key] = value.chomp
- key = nil
- end
- results << record
- record = {}
- elsif line[0] == '#'
-
- elsif line[0] == ':'
-
- key, value = line[1,line.size].split(':', 2)
- record[key] = value.chomp
- key = value = nil
- elsif line[0, 2] == '..'
-
- record[key] = value.chomp
- key = value = nil
- elsif (line[0] == '.') && key.nil?
-
-
- key = line[1, line.size]
- key.chomp!
- value = ""
-
- elsif key
- if line[0] == '\\'
-
- line.slice!(0)
- end
-
- value << line
- else
-
- errors << "#{lineno}: Don't know how to process line"
- end
- end
-
- if key
- record[key] = value.chomp
- end
-
- results << record unless record.empty?
- return results, errors
- end
-
- def self.load_filename(filename)
- results, errors = nil, nil, nil;
- file = File.open(filename, 'rt') rescue nil
- return nil, ["Could not open #{filename}"] unless file
- begin
- results, errors = parse_file(file)
- ensure
- file.close
- end
- return results, errors
- end
-
-
-
- def self.load_objects(filename, defklass=nil)
- results, errors = load_filename(filename)
- p filename, results, errors
- unless errors.nil? || errors.empty?
- return nil, errors
- end
-
- objres = []
- results.each do | result |
- klassname = result['ruby_class'] || defklass
- return nil unless klassname
- klass = klassname.split('::').inject(Kernel) { |klass, name| klass.const_get(name) rescue nil }
- return nil unless klass
- if klass.respond_to? :from_sitef
- objres << klass.from_sitef(result)
- else
- objres << klass.new(result)
- end
- end
- return objres, errors
- end
-
-
-
- def self.save_field(file, key, value)
- if value.is_a? String
- sval = value.dup
- else
- sval = value.to_s
- end
- if sval["\n"]
- file.puts(".#{key}\n")
-
- sval.gsub!(/\n([\.\-\:\#\\]+)/, "\n\\\\\\1")
- sval.gsub!(/\A([\.\-\:\#\\]+)/, "\\\\\\1")
- file.printf("%s", sval)
- file.printf("\n..\n")
- else
- file.printf(":#{key}:#{sval}\n")
- end
- end
-
- def self.save_object(file, object, *fields)
- save_field(file, :ruby_class, object.class.to_s)
- fields.each do | field |
- value = object.send(field.to_sym)
- save_field(file, field, value)
- end
- end
-
- def self.save_record(file, record, *fields)
- record.each do | key, value |
- next if fields && !fields.empty? && !fields.member?(key)
- save_field(file, key, value)
- end
- end
- def self.save_file(file, records, *fields)
- records.each do | record |
- if record.is_a? Hash
- save_record(file, record, *fields)
- else
- save_object(file, record, *fields)
- end
- file.puts("--\n")
- end
- end
-
- def self.save_filename(filename, records, *fields)
- results , errors = nil, nil
- file = File.open(filename, 'wt')
- return false, ["Could not open #{filename}"] unless file
- begin
- save_file(file, records, *fields)
- ensure
- file.close
- end
- return true, []
- end
-
- end
|