14bcd165ef2bed66e4a8472bb363c7dd20faa4ce
[chise/ruby.git] / src / makegraph.rb
1 #!/usr/bin/env ruby
2 # MakeGraph routine by eto 2003-0305
3
4 require 'network'
5
6 module CHISE
7   class MakeGraph #======================================================================実務的な処理を引き受ける。
8     #GRAPHVIZ_CMD = 0 # CLI
9     GRAPHVIZ_CMD = 1 # OLE
10     GRAPHVIZ_TYPE = Graphviz::TWOPI
11     #GRAPHVIZ_TYPE = Graphviz::NEATO
12     START_GAKUNEN = 1
13     END_GAKUNEN = 6
14     
15     def initialize()
16       @kl = KanjiList.instance
17       @hn = KanjiNetwork.new
18     end
19     def go()
20       make_min
21       #make_html_all
22       #make_svg_all
23     end
24     def make_html_all()
25       open("gakunen.html", "w"){|out|
26         out.print %Q|<pre>\n|
27           (1..2).each {|type|
28           typestr = type.to_s
29           out.print %Q|#{typestr}グラフ\n|
30             (1..6).each {|gakunen|
31             out.print %Q|小学#{gakunen}年生 |
32               base = "han-#{type}-#{gakunen}-all"
33             out.print %Q|<a href="#{base}.svg">all</a> |
34               (0..3).each {|kubun|
35               base = "han-#{type}-#{gakunen}-#{kubun}"
36               out.print %Q|<a href="#{base}.svg">#{kubun}</a> |
37             }
38             out.print %Q|\n|
39           }
40         }
41         out.print %Q|</pre>\n|
42       }
43     end
44     def make_min
45       @hn.reset()
46       @hn.make_network(@kl.awase(0))
47       # @hn.make_network(@kl.awase(1))
48       @hn.out("min.dot") #途中状態を保存
49       #graphviz(Graphviz::NEATO, "min.dot", "min.svg")
50       graphviz(GRAPHVIZ_TYPE, "min.dot", "min.svg")
51     end
52     def make_svg_all()
53       (START_GAKUNEN..END_GAKUNEN).each {|gakunen|
54         (0..3).each {|kubun|
55           make_dot(gakunen, kubun)
56           (2..2).each {|type|
57             make_svg(type, gakunen, kubun)
58           }
59         }
60         make_dot(gakunen, nil)
61         (2..2).each {|type|
62           unless type == 2 && 5 <= gakunen
63             make_svg(type, gakunen, nil)
64           end
65         }
66       }
67     end
68     def gaku_name(gakunen, kubun=nil)
69       return "#{gakunen}nen-all" if kubun.nil?
70       return "#{gakunen}nen-#{kubun}"
71     end
72     def make_dot(gakunen, kubun=nil) #Graphvizのtype, 学年, 象形、指示などの区分
73       @hn.reset()
74       list = @kl.kyoiku(1..gakunen, kubun)
75       @hn.make_network(list)
76       dotf = "list-"+gaku_name(gakunen, kubun)+".dot"
77       @hn.out(dotf) #途中状態を保存する
78       p [dotf, "done"]
79     end
80     def make_svg(type, gakunen, kubun=nil) #Graphvizのtype, 学年, 象形、指示などの区分
81       g = gaku_name(gakunen, kubun)
82       dotf = "list-"+g+".dot"
83       svgf = "han-"+g+"-"+GraphvizCLI::NAMES[type]+".svg"
84       graphviz(type, dotf, svgf)
85     end
86     def dot2svg(dir)
87       Dir.chdir(dir)
88       Dir.glob("*.dot").each {|inf|
89         out = inf.sub(/.dot$/, '.svg')
90         type = 1 if inf =~ /^han-1/
91         type = 2 if inf =~ /^han-2/
92         graphviz(type, inf, out)
93       }
94     end
95     def graphviz(type, inf, out)
96       gv = GraphvizCLI.new() if GRAPHVIZ_CMD == 0
97       gv = GraphvizOLE.new() if GRAPHVIZ_CMD == 1
98       gv.type = type
99       gv.target = 'svg'
100       gv.in  = inf
101       gv.out = out
102       gv.generate()
103     end
104   end
105 end
106
107 if $0 == __FILE__
108   mg = MakeGraph.new
109   mg.go
110 end
111
112 #----------------------------------------------------------------------end.