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