Third version of Domainmodel, Graphbase and Importgedcom
[killergenealogy_poc:killergenealogy_poc.git] / ImportGedcom2.rb
1 # encoding: iso-8859-15
2 #require './DomainModel.rb'
3 require './GraphBase2.rb'
4
5 class ImportGedcom
6   attr_accessor :project
7   def initialize(filename)
8     @project = Base.new(filename)
9     import(filename)
10     convert_project
11   end
12   
13   def import(filename)
14     #project_node = @project.nodes[0]
15     current_indent = Array.new
16     current_indent[0] = @project.nodes[0]
17     file = File.new(filename,'r')
18     while (line = file.gets("\r"))
19       line = line.chomp
20       a = parse_gedcom(line)
21       unless a == nil
22         indent = Integer(a[0]) +1
23         node = nil
24         if indent == 1
25           if a[1].upcase == 'HEAD'
26             node = Node.new(a[1].downcase.to_sym, @project.id.new)
27             node.tag[:value] = a[2]
28           elsif a[1].upcase == 'TRLR'
29             node = Node.new(a[1].downcase.to_sym, @project.id.new)
30             node.tag[:value] = a[2]
31           else
32             node = Node.new(a[2].downcase.to_sym, @project.id.new)
33             node.tag[:value] = parse_gedid(a[1])
34           end
35         else
36           node = Node.new(a[1].downcase.to_sym, @project.id.new)
37           node.tag[:value] =  a[2]
38         end
39         current_indent[indent] = node
40         @project.link_tree(current_indent[indent-1], node)
41         @project.add(node)
42       end
43     end
44   end
45   
46   def convert_project
47     events = [:birt, :chr, :deat, :buri, :crem, :adop, :bapm, :barm, :basm, :bles, :chra, :conf, :fcom, :ordn, :natu, :emig, :immi, :cens, :prob, :will, :grad, :reti, :even]
48     @project.nodes.each do |key,node|
49       if events.include?(node.type)
50         node.tag[:type] = node.type
51         node.type = :event
52       end
53       
54       if node.type == :cont
55         node.type = :delete
56         #puts @project.nodes[node.downlink[0]]
57         @project.nodes[node.downlink[0]].tag[:value] << "\n#{node.tag[:value]}"
58       end
59       if node.type == :conc
60         node.type = :delete
61         @project.nodes[node.downlink[0]].tag[:value] << node.tag[:value]
62       end
63     end
64     
65     @project.nodes.delete_if {|key,node| node.type == :delete }
66   end
67   
68   def parse_gedid(string)
69     a = string.split("@")
70     return a.at(1)
71   end
72         
73   def parse_gedcom(string)
74     #puts string
75     if string.length == 0
76       return nil
77     else
78       a = string.force_encoding('iso-8859-15').split
79       #a = string.split
80       ret1 = a.at(0)
81       ret2 = a.at(1).upcase
82       a.delete_at(0)
83       a.delete_at(0)
84       ret3 = ""
85       a.each do |x|
86         ret3 = ret3 + x + " "
87       end
88       return ret1, ret2, ret3.rstrip
89     end
90   end
91   
92   def parse_gedcom_name(string)
93     #puts "*#{string}*"
94     a = Array.new
95     a = string.force_encoding('iso-8859-15').split("/")
96     a[0] = ' ' if a[0] == nil
97     a[1] = ' ' if a[1] == nil
98     return a.at(0).rstrip, a.at(1).rstrip
99   end
100 end
101   
102 g = ImportGedcom.new("test.ged")
103
104 g.project.nodes.each {|key, n| puts "#{key}:#{n.to_s} #{n.uplink} #{n.downlink} #{n.tag}".force_encoding('iso-8859-15') }
105 #g.project.nodes.each {|key,node| puts "#{key}:#{node.to_s} #{node.links} #{node.tags}" if node.type == :persona }
106
107 #puts "\xF8".force_encoding('utf-8')
108 #puts "ΓΈ".force_encoding('utf-8')