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