rwdlanguage 0.01

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. data/Readme.txt +475 -0
  2. data/bin/rwdlanguage +19 -0
  3. data/code/01rwdcore/01rwdcore.rb +29 -0
  4. data/code/01rwdcore/02helptexthashbegin.rb +16 -0
  5. data/code/01rwdcore/03helptexthash.rb +21 -0
  6. data/code/01rwdcore/jumplinkcommand.rb +36 -0
  7. data/code/01rwdcore/openhelpwindow.rb +38 -0
  8. data/code/01rwdcore/returntomain.rb +10 -0
  9. data/code/01rwdcore/rundocuments.rb +10 -0
  10. data/code/01rwdcore/runeditconfiguration.rb +10 -0
  11. data/code/01rwdcore/runhelpabout.rb +15 -0
  12. data/code/01rwdcore/runopentinkerdocument.rb +7 -0
  13. data/code/01rwdcore/runtab.rb +15 -0
  14. data/code/01rwdcore/rwdtinkerversion.rb +22 -0
  15. data/code/01rwdcore/rwdwindowreturn.rb +9 -0
  16. data/code/01rwdcore/selectiontab.rb +11 -0
  17. data/code/01rwdcore/setuphelpaboutoptions.rb +15 -0
  18. data/code/01rwdcore/setuptinkerdocuments.rb +7 -0
  19. data/code/01rwdcore/test_cases.rb +158 -0
  20. data/code/01rwdcore/test_harness.rb +20 -0
  21. data/code/01rwdcore/uploadreturns.rb +65 -0
  22. data/code/dd0viewphoto/dd0viewphoto.rb +5 -0
  23. data/code/superant.com.language/0uninstallapplet.rb +22 -0
  24. data/code/superant.com.language/googlelang.rb +25 -0
  25. data/code/superant.com.language/helptexthashload.rb +22 -0
  26. data/code/superant.com.language/loadconfigurationrecord.rb +22 -0
  27. data/code/superant.com.language/loadconfigurationvariables.rb +14 -0
  28. data/code/superant.com.language/openhelpwindow.rb +24 -0
  29. data/code/superant.com.language/rubySteak.rb +40 -0
  30. data/code/superant.com.language/runappletwindow.rb +12 -0
  31. data/code/superant.com.language/runrwdshellwindow.rb +12 -0
  32. data/code/superant.com.language/runrwdwordsbackwindow.rb +10 -0
  33. data/code/superant.com.language/rwdtinkerversion.rb +10 -0
  34. data/code/superant.com.language/saveconfigurationrecord.rb +20 -0
  35. data/code/superant.com.language/test_cases.rb +20 -0
  36. data/code/superant.com.rwdtinkerbackwindow/changelocale.rb +84 -0
  37. data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +19 -0
  38. data/code/superant.com.rwdtinkerbackwindow/initiateapplets.rb +169 -0
  39. data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +38 -0
  40. data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +20 -0
  41. data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +12 -0
  42. data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +55 -0
  43. data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +14 -0
  44. data/code/superant.com.rwdtinkerbackwindow/listzips.rb +37 -0
  45. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +24 -0
  46. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +14 -0
  47. data/code/superant.com.rwdtinkerbackwindow/network.rb +87 -0
  48. data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +19 -0
  49. data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +40 -0
  50. data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +24 -0
  51. data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +46 -0
  52. data/code/superant.com.rwdtinkerbackwindow/removeappletvariables.rb +52 -0
  53. data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +11 -0
  54. data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +15 -0
  55. data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +13 -0
  56. data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +19 -0
  57. data/code/superant.com.rwdtinkerbackwindow/showlocaleoptions.rb +9 -0
  58. data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +23 -0
  59. data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +24 -0
  60. data/code/superant.com.rwdtinkerbackwindow/viewlogfile.rb +16 -0
  61. data/code/superant.com.thesaurus/clearhttpview3.rb +9 -0
  62. data/code/superant.com.thesaurus/listwordlookup.rb +37 -0
  63. data/code/superant.com.thesaurus/runappletwindow.rb +12 -0
  64. data/code/superant.com.words/dictlookup.rb +20 -0
  65. data/code/superant.com.words/runrwdwordsbackwindow.rb +10 -0
  66. data/code/superant.com.words/rwdtinkerversion.rb +10 -0
  67. data/code/zz0applicationend/zz0end.rb +5 -0
  68. data/configuration/rwdtinker.dist +15 -0
  69. data/configuration/rwdwlanguage.dist +21 -0
  70. data/configuration/tinkerwin2variables.dist +23 -0
  71. data/gui/00coreguibegin/applicationguitop.rwd +9 -0
  72. data/gui/frontwindow0/cc0openphoto.rwd +22 -0
  73. data/gui/frontwindowselections/00selectiontabbegin.rwd +11 -0
  74. data/gui/frontwindowselections/jumplinkcommands.rwd +15 -0
  75. data/gui/frontwindowselections/wwselectionend.rwd +3 -0
  76. data/gui/frontwindowtdocuments/00documentbegin.rwd +6 -0
  77. data/gui/frontwindowtdocuments/tinkerdocuments.rwd +14 -0
  78. data/gui/frontwindowtdocuments/zzdocumentend.rwd +8 -0
  79. data/gui/helpaboutbegin/zzzrwdlasttab.rwd +6 -0
  80. data/gui/helpaboutbegin/zzzzhelpscreenstart.rwd +3 -0
  81. data/gui/helpaboutbegin/zzzzzzhelpabouttab.rwd +15 -0
  82. data/gui/helpaboutzend/helpscreenend.rwd +3 -0
  83. data/gui/helpaboutzend/zhelpscreenstart2.rwd +3 -0
  84. data/gui/helpaboutzend/zzzzhelpabout2.rwd +15 -0
  85. data/gui/helpaboutzend/zzzzhelpscreen2end.rwd +3 -0
  86. data/gui/tinkerbackwindows/superant.com.language/1appname.rwd +4 -0
  87. data/gui/tinkerbackwindows/superant.com.language/22google.rwd +38 -0
  88. data/gui/tinkerbackwindows/superant.com.language/44germany.rwd +19 -0
  89. data/gui/tinkerbackwindows/superant.com.language/67viewconfiguration.rwd +27 -0
  90. data/gui/tinkerbackwindows/superant.com.language/77jumplinkcommands.rwd +17 -0
  91. data/gui/tinkerbackwindows/superant.com.language/z9end.rwd +6 -0
  92. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/1appname.rwd +5 -0
  93. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +41 -0
  94. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +44 -0
  95. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/50rwdlistapplets.rwd +44 -0
  96. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/60editconfiguration.rwd +30 -0
  97. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/70rwddiagnostics.rwd +29 -0
  98. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/75rwdlogfile.rwd +20 -0
  99. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/80localechanger.rwd +17 -0
  100. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +17 -0
  101. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/9backend.rwd +6 -0
  102. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/1appname.rwd +31 -0
  103. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/9end.rwd +4 -0
  104. data/gui/tinkerbackwindows/superant.com.versionwindow/1appname.rwd +19 -0
  105. data/gui/tinkerbackwindows/superant.com.versionwindow/helpaboutwindow.rwd +17 -0
  106. data/gui/tinkerbackwindows/superant.com.words/1appname.rwd +4 -0
  107. data/gui/tinkerbackwindows/superant.com.words/1dictionary.rwd +19 -0
  108. data/gui/tinkerbackwindows/superant.com.words/4thesaurus.rwd +36 -0
  109. data/gui/tinkerbackwindows/superant.com.words/77jumplinkcommands.rwd +17 -0
  110. data/gui/tinkerbackwindows/superant.com.words/z9end.rwd +6 -0
  111. data/gui/zzcoreguiend/yy9rwdend.rwd +4 -0
  112. data/init.rb +179 -0
  113. data/installed/rwdwlanguage.inf +24 -0
  114. data/installed/temp.rb +1 -0
  115. data/lang/en/rwdcore/en.po +197 -0
  116. data/lang/en/rwdlanguage/en.po +32 -0
  117. data/lang/es/rwdcore/es.po +184 -0
  118. data/lang/es/rwdlanguage/en.po +32 -0
  119. data/lang/fr/rwdcore/fr.po +169 -0
  120. data/lang/fr/rwdlanguage/en.po +32 -0
  121. data/lang/hi/rwdcore/hi.po +173 -0
  122. data/lang/hi/rwdlanguage/en.po +32 -0
  123. data/lang/ja/rwdcore/ja.po +171 -0
  124. data/lang/ja/rwdlanguage/en.po +32 -0
  125. data/lang/nl/rwdcore/nl.po +169 -0
  126. data/lang/nl/rwdlanguage/en.po +32 -0
  127. data/lib/dict.rb +438 -0
  128. data/lib/g_translate.rb +43 -0
  129. data/lib/g_translate/client.rb +84 -0
  130. data/lib/g_translate/translator.rb +57 -0
  131. data/lib/ger-eng.txt +111283 -0
  132. data/lib/oothesaurus.rb +76 -0
  133. data/lib/rconftool.rb +387 -0
  134. data/lib/rwd/browser.rb +123 -0
  135. data/lib/rwd/ftools.rb +174 -0
  136. data/lib/rwd/mime.rb +328 -0
  137. data/lib/rwd/net.rb +877 -0
  138. data/lib/rwd/ruby.rb +889 -0
  139. data/lib/rwd/rwd.rb +1425 -0
  140. data/lib/rwd/sgml.rb +236 -0
  141. data/lib/rwd/thread.rb +63 -0
  142. data/lib/rwd/tree.rb +371 -0
  143. data/lib/rwd/xml.rb +101 -0
  144. data/lib/rwdthemes/default.rwd +317 -0
  145. data/lib/rwdthemes/pda.rwd +72 -0
  146. data/lib/rwdthemes/windowslike.rwd +171 -0
  147. data/lib/rwdtinker/rwdcodedir.rb +56 -0
  148. data/lib/rwdtinker/rwdguidir.rb +57 -0
  149. data/lib/rwdtinker/rwdlangdir.rb +60 -0
  150. data/lib/rwdtinker/rwdtinkertools.rb +25 -0
  151. data/lib/zip/ioextras.rb +155 -0
  152. data/lib/zip/stdrubyext.rb +111 -0
  153. data/lib/zip/tempfile_bugfixed.rb +195 -0
  154. data/lib/zip/zip.rb +1847 -0
  155. data/lib/zip/zipfilesystem.rb +609 -0
  156. data/lib/zip/ziprequire.rb +90 -0
  157. data/rwd_files/HowTo_Language.txt +179 -0
  158. data/rwd_files/HowTo_Tinker.txt +515 -0
  159. data/rwd_files/HowTo_TinkerWin2.txt +202 -0
  160. data/rwd_files/Readme.txt +57 -0
  161. data/rwd_files/RubyWebDialogs.html +6 -0
  162. data/rwd_files/Tinkerhelptexthash.txt +84 -0
  163. data/rwd_files/favicon.ico +0 -0
  164. data/rwd_files/log/rwdtinker.log +726 -0
  165. data/rwd_files/rdoc-style.css +175 -0
  166. data/rwd_files/rwdapplications.html +76 -0
  167. data/rwd_files/rwdlanguagehelpfiles.txt +34 -0
  168. data/rwd_files/tinker.png +0 -0
  169. data/rwdconfig.dist +24 -0
  170. data/rwdlanguage.rb +1 -0
  171. data/tests/RubyGauge.rb +179 -0
  172. data/tests/checkdepends.sh +4 -0
  173. data/tests/cleancnf.sh +6 -0
  174. data/tests/makedist-rwdwlanguage.rb +56 -0
  175. data/tests/makedist.rb +66 -0
  176. data/tests/rdep.rb +354 -0
  177. data/tests/totranslate.lang +93 -0
  178. data/zips/rwdwcalc-0.63.zip +0 -0
  179. data/zips/rwdwfoldeditor-0.08.zip +0 -0
  180. data/zips/rwdwhypernote-0.16.zip +0 -0
  181. data/zips/rwdwlanguage-0.01.zip +0 -0
  182. data/zips/rwdwmovies-0.98.zip +0 -0
  183. data/zips/rwdwruby-1.08.zip +0 -0
  184. data/zips/temp.rb +1 -0
  185. data/zips/tinkerbellw-0.04.zip +0 -0
  186. data/zips/wrubyslippers-1.08.zip +0 -0
  187. metadata +246 -0
data/lib/rwd/sgml.rb ADDED
@@ -0,0 +1,236 @@
1
+ require "lib/rwd/tree"
2
+
3
+ class SGMLObject < TreeObject
4
+ def to_s
5
+ res = ""
6
+
7
+ parsetree("prechildren_to_s", "postchildren_to_s", res)
8
+
9
+ res
10
+ end
11
+
12
+ def to_h
13
+ res = ""
14
+
15
+ parsetree("prechildren_to_sgml", "postchildren_to_sgml", res)
16
+
17
+ res
18
+ end
19
+ end
20
+
21
+ class Text < SGMLObject
22
+ def initialize(text)
23
+ super()
24
+ @text = text
25
+ end
26
+
27
+ def prechildren_to_s(res)
28
+ #res << "#{CGI.unescapeHTML(@text)} "
29
+ res << @text
30
+ end
31
+
32
+ def prechildren_to_sgml(res)
33
+ #res << "#{CGI.unescapeHTML(@text)}"
34
+ res << @text
35
+ end
36
+ end
37
+
38
+ class Comment < SGMLObject
39
+ def initialize(text)
40
+ super()
41
+ @text = text
42
+ end
43
+
44
+ def prechildren_to_sgml(res)
45
+ res << "#{@text}"
46
+ end
47
+ end
48
+
49
+ class Special < SGMLObject
50
+ def initialize(text)
51
+ super()
52
+ @text = text
53
+ end
54
+
55
+ def prechildren_to_sgml(res)
56
+ res << "#{@text}"
57
+ end
58
+ end
59
+
60
+ class Instruction < SGMLObject
61
+ def initialize(text)
62
+ super()
63
+ @text = text
64
+ end
65
+
66
+ def prechildren_to_sgml(res)
67
+ res << "#{@text}"
68
+ end
69
+ end
70
+
71
+ class Tag < SGMLObject
72
+ attr_reader :args
73
+ attr_writer :args
74
+
75
+ def initialize(subtype, args={})
76
+ super(subtype)
77
+ @args = args
78
+ @text = ""
79
+ end
80
+ end
81
+
82
+ class OpenTag < Tag
83
+ def initialize(*args)
84
+ super
85
+ @upordown = Down
86
+ end
87
+
88
+ def prechildren_to_sgml(res)
89
+ a = [@subtype]
90
+
91
+ @args.sort.each do |k, v|
92
+ if not v.include?("'")
93
+ a << "#{k}='#{v}'"
94
+ else
95
+ if not v.include?('"')
96
+ a << "#{k}=\"#{v}\""
97
+ else
98
+ a << "#{k}='#{v.gsub(/\'/, '"')}'"
99
+ end
100
+ end
101
+ end
102
+
103
+ res << "<#{a.join(" ")}>" + @text
104
+ end
105
+
106
+ def postchildren_to_sgml(res)
107
+ res << "</#{@subtype}>" if @closed
108
+ end
109
+ end
110
+
111
+ class CloseTag < Tag
112
+ def initialize(*args)
113
+ super
114
+ @upordown = Dummy
115
+ end
116
+ end
117
+
118
+ class SGML < Tree
119
+ def initialize(*args)
120
+ @tagcache = {}
121
+
122
+ super
123
+ end
124
+
125
+ def buildobjects(string)
126
+ @objects = []
127
+
128
+ verwerk3 =
129
+ lambda do |string|
130
+ a = []
131
+
132
+ string[1..-2].splitblocks(["'", "'"], ['"', '"']).collect do |type, s|
133
+ case type
134
+ when 0
135
+ if self.class.to_s == "HTML"
136
+ s.splitwords.each do |w|
137
+ d = w.split("=", 2)
138
+
139
+ if d.length == 1
140
+ a << d[0]
141
+ else
142
+ a << d[0] if not d[0].nil? and not d[0].empty?
143
+ a << "="
144
+ a << d[1] if not d[1].nil? and not d[1].empty?
145
+ end
146
+ end
147
+ else
148
+ a.concat s.splitwords(["/", "="])
149
+ end
150
+ when 1, 2 then a << s
151
+ end
152
+ end
153
+
154
+ open = false
155
+ close = false
156
+
157
+ a = a[0].splitwords("/") + a[1..-1]
158
+
159
+ if a[0] == "/"
160
+ close = true
161
+ a.shift
162
+ else
163
+ open = true
164
+ end
165
+
166
+ if a[-1] == "/"
167
+ close = true
168
+ a.pop
169
+ end
170
+
171
+ tag = a.shift.downcase
172
+ args = {}
173
+
174
+ while not a.length.zero?
175
+ if a.length >= 3 and a[1] == "="
176
+ key = a.shift.downcase
177
+ dummy = a.shift
178
+ value = a.shift.noquotes
179
+ args[key] = value
180
+ else
181
+ key = a.shift.downcase
182
+ args[key] = ""
183
+ end
184
+ end
185
+
186
+ [tag, args, open, close]
187
+ end
188
+
189
+ verwerk2 =
190
+ lambda do |string|
191
+ if @tagcache.include? string
192
+ res = @tagcache[string]
193
+ else
194
+ res = verwerk3.call(string)
195
+
196
+ @tagcache[string] = res
197
+ end
198
+
199
+ res
200
+ end
201
+
202
+ verwerk1 =
203
+ lambda do |string|
204
+ tag, args, open, close = verwerk2.call(string)
205
+
206
+ @objects << OpenTag.new(tag.dup, args.dup) if open
207
+ @objects << CloseTag.new(tag.dup, args.dup) if close
208
+ end
209
+
210
+ string.splitblocks(["<!--", "-->"], ["<!", ">"], ["<?", "?>"], ["<", ">"]).each do |type, s|
211
+ case type
212
+ when 0 then @objects << Text.new(s)
213
+ when 1 then @objects << Comment.new(s)
214
+ when 2 then @objects << Special.new(s)
215
+ when 3 then @objects << Instruction.new(s)
216
+ when 4 then verwerk1.call(s)
217
+ end
218
+ end
219
+ end
220
+
221
+ def to_s
222
+ res = ""
223
+
224
+ parsetree("prechildren_to_s", "postchildren_to_s", res)
225
+
226
+ res
227
+ end
228
+
229
+ def to_h
230
+ res = ""
231
+
232
+ parsetree("prechildren_to_sgml", "postchildren_to_sgml", res)
233
+
234
+ res
235
+ end
236
+ end
data/lib/rwd/thread.rb ADDED
@@ -0,0 +1,63 @@
1
+ require "lib/rwd/ruby"
2
+ require "thread"
3
+
4
+ class FakeThread
5
+ def initialize(*args)
6
+ yield(*args)
7
+ end
8
+
9
+ def join
10
+ end
11
+ end
12
+
13
+ class ThreadLimiter
14
+ def initialize(limit)
15
+ @limit = limit
16
+ @count = 0
17
+ @threads = []
18
+ @mutex = Mutex.new
19
+ @cv = ConditionVariable.new
20
+
21
+ every(1) do
22
+ @mutex.synchronize do
23
+ @threads.dup.each do |t|
24
+ unless t.alive?
25
+ $stderr.puts "Found dead thread."
26
+
27
+ @threads.delete(t)
28
+
29
+ @count -= 1
30
+
31
+ @cv.signal
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def wait
39
+ if block_given?
40
+ self.wait
41
+ yield
42
+ self.signal
43
+ else
44
+ @mutex.synchronize do
45
+ @threads << Thread.current
46
+
47
+ @count += 1
48
+
49
+ @cv.wait(@mutex) if @count > @limit
50
+ end
51
+ end
52
+ end
53
+
54
+ def signal
55
+ @mutex.synchronize do
56
+ @threads.delete(Thread.current)
57
+
58
+ @count -= 1
59
+
60
+ @cv.signal
61
+ end
62
+ end
63
+ end
data/lib/rwd/tree.rb ADDED
@@ -0,0 +1,371 @@
1
+ require "lib/rwd/ruby"
2
+ require "lib/rwd/net"
3
+ require "md5"
4
+ require "thread"
5
+
6
+ Same = 0
7
+ Down = 1
8
+ Up = 2
9
+ Dummy = 3
10
+
11
+ module TextArray
12
+ def textarray
13
+ @children.collect do |obj|
14
+ [obj.text] << obj.textarray
15
+ end.flatten.compact
16
+ end
17
+ end
18
+
19
+
20
+ module ParseTree
21
+ def parsetree(premethod="prechildren", postmethod="postchildren", *args)
22
+ if @visible
23
+ method(premethod).call(*args) if respond_to?(premethod)
24
+
25
+ @children.each do |obj|
26
+ obj.parsetree(premethod, postmethod, *args)
27
+ end
28
+
29
+ method(postmethod).call(*args) if respond_to?(postmethod)
30
+ end
31
+ end
32
+
33
+ #def parsetree(premethod="prechildren", postmethod="postchildren", *args)
34
+ # stack = [self]
35
+ # done = []
36
+ #
37
+ # while not stack.empty?
38
+ # obj = stack.pop
39
+ #
40
+ # if not done.include?(obj)
41
+ # obj.method(premethod).call(*args) if obj.respond_to?(premethod)
42
+ #
43
+ # stack.push(obj)
44
+ # done.push(obj)
45
+ #
46
+ # stack.concat obj.children.reverse
47
+ # #obj.children.reverse.each do |cobj|
48
+ # #stack.push(cobj)
49
+ # #end
50
+ # else
51
+ # obj.method(postmethod).call(*args) if obj.respond_to?(postmethod)
52
+ # end
53
+ # end
54
+ #end
55
+ end
56
+
57
+ class TreeObject
58
+ attr_reader :subtype
59
+ attr_writer :subtype
60
+ attr_reader :upordown
61
+ attr_writer :upordown
62
+ attr_reader :level
63
+ attr_writer :level
64
+ attr_reader :parent
65
+ attr_writer :parent
66
+ attr_reader :children
67
+ attr_writer :children
68
+ attr_reader :closed
69
+ attr_writer :closed
70
+ attr_reader :text
71
+ attr_writer :text
72
+ attr_reader :visible
73
+ attr_writer :visible
74
+
75
+ include TextArray
76
+ include ParseTree
77
+
78
+ def initialize(subtype=nil)
79
+ @subtype = subtype
80
+ @upordown = Same
81
+ @level = nil
82
+ @parent = nil
83
+ @children = []
84
+ @closed = nil
85
+ @visible = true
86
+ end
87
+
88
+ def inspect
89
+ parent, children = @parent, @children
90
+
91
+ @parent, @children = parent.object_id, children.collect{|obj| obj.object_id}
92
+
93
+ res = " " * (level-1) + "#{self.class}(#{@subtype}) #{super}"
94
+
95
+ @parent, @children = parent, children
96
+
97
+ res
98
+ end
99
+
100
+ def previous(klass=[], skip=[])
101
+ klass = [klass].flatten
102
+ skip = [skip].flatten
103
+
104
+ po = @parent
105
+ return nil if po.nil?
106
+
107
+ ch = po.children
108
+ return nil if ch.nil?
109
+
110
+ n = ch.index(self)
111
+ return nil if n.nil?
112
+
113
+ res = nil
114
+ if klass.nil?
115
+ n -= 1
116
+ res = ch[n]
117
+ else
118
+ begin
119
+ n -= 1
120
+ res = ch[n]
121
+ end while (klass.empty? or klass.collect{|k| ch[n-1].kind_of?(k)}.sort.uniq == [true]) \
122
+ and (skip.empty? or skip.collect{|k| ch[n-1].kind_of?(k)}.sort.uniq == [false])
123
+ end
124
+
125
+ res
126
+ end
127
+ end
128
+
129
+ class Tree
130
+ @@versie = 1
131
+ @@mutex = Mutex.new
132
+
133
+ attr_reader :data
134
+ attr_writer :data
135
+ attr_reader :parent
136
+ attr_writer :parent
137
+ attr_reader :children
138
+ attr_writer :children
139
+ attr_reader :visible
140
+ attr_writer :visible
141
+
142
+ include TextArray
143
+ include ParseTree
144
+
145
+ def initialize(string)
146
+ string = string.join("") if string.kind_of?(Array)
147
+
148
+ @data = string
149
+ @parent = nil
150
+ @children = []
151
+ @objects = []
152
+ @visible = true
153
+ @checkvisibility = false
154
+
155
+ buildobjects(string)
156
+ buildparents
157
+ buildchildren
158
+ markclosed
159
+ deletedummies
160
+
161
+ @checkvisibility = true
162
+ end
163
+
164
+ def self.file(file)
165
+ new(File.new(file).readlines)
166
+ end
167
+
168
+ def self.location(url, form=Hash.new)
169
+ s = HTTPClient.get(url, {}, form)
170
+ s = "" if s.nil?
171
+ new(s)
172
+ end
173
+
174
+ def self.new_from_cache2(data)
175
+ new(data)
176
+ end
177
+
178
+ def self.new_from_cache(data)
179
+ hash = MD5.new("#{@@versie} #{data}")
180
+
181
+ dir = "#{temp}/evcache.#{user}/tree.new"
182
+ file = "#{dir}/#{hash}"
183
+
184
+ tree = nil
185
+
186
+ File.mkpath(dir)
187
+
188
+ if File.file?(file)
189
+ @@mutex.synchronize do
190
+ tree = Marshal.restore(File.new(file, "rb"))
191
+ end
192
+ else
193
+ tree = new(data)
194
+
195
+ if not tree.nil?
196
+ @@mutex.synchronize do
197
+ File.open(file, "wb") {|f| Marshal.dump(tree, f)}
198
+ end
199
+ end
200
+ end
201
+
202
+ return tree
203
+ end
204
+
205
+ def inspect
206
+ @objects.collect do |obj|
207
+ obj.inspect
208
+ end.join("\n")
209
+ end
210
+
211
+ def buildobjects(string)
212
+ raise "Has to be defined in the subclass."
213
+ end
214
+
215
+ def buildparents
216
+ level = 1
217
+ levels = Hash.new
218
+ levels[0] = nil
219
+ parse do |type, obj|
220
+ case obj.upordown
221
+ when Down
222
+ obj.level = level
223
+ obj.parent = levels[level-1]
224
+ levels[level] = obj
225
+ level += 1
226
+ when Up, Dummy
227
+ pl = level
228
+ 1.upto(level-1) do |l|
229
+ po = levels[l]
230
+ pl = l if po.subtype == obj.subtype
231
+ end
232
+ level = pl
233
+ obj.level = level
234
+ obj.parent = levels[level-1]
235
+ when Same
236
+ obj.level = level
237
+ obj.parent = levels[level-1]
238
+ end
239
+ end
240
+ end
241
+
242
+ def buildchildren
243
+ @objects.each do |obj|
244
+ obj.children = []
245
+ end
246
+
247
+ parse do |type, obj|
248
+ if not obj.parent.nil?
249
+ po = obj.parent
250
+ po.children << obj
251
+ else
252
+ @children << obj
253
+ end
254
+ end
255
+ end
256
+
257
+ def markclosed
258
+ ([self] + @objects).each do |obj|
259
+ obj.children.each_index do |i|
260
+ co1 = obj.children[i]
261
+ co2 = obj.children[i+1]
262
+
263
+ co1.closed = (not co2.nil? and co1.upordown == Down and (co2.upordown == Up or co2.upordown == Dummy) and co1.subtype == co2.subtype)
264
+ end
265
+ end
266
+ end
267
+
268
+ def deletedummies
269
+ ([self] + @objects).each do |obj|
270
+ obj.children.delete_if do |obj2|
271
+ obj2.upordown == Dummy
272
+ end
273
+ end
274
+
275
+ @objects.delete_if do |obj|
276
+ obj.upordown == Dummy
277
+ end
278
+ end
279
+
280
+ def parse(types=[], subtypes=[], once=false)
281
+ types = [types] if types.class == Class
282
+ subtypes = [subtypes] if subtypes.class == String
283
+ hidelevel = nil
284
+
285
+ catch :once do
286
+ @objects.each do |obj|
287
+ if (@checkvisibility and hidelevel.nil? and (not obj.visible))
288
+ hidelevel = obj.level
289
+ else
290
+ if (@checkvisibility and (not hidelevel.nil?) and obj.visible and obj.level <= hidelevel)
291
+ hidelevel = nil
292
+ end
293
+ end
294
+
295
+ if hidelevel.nil?
296
+ ok = false
297
+ catch :stop do
298
+ if types.empty?
299
+ if subtypes.empty?
300
+ ok = true
301
+ throw :stop
302
+ else
303
+ subtypes.each do |st|
304
+ if obj.subtype == st
305
+ ok = true
306
+ throw :stop
307
+ end
308
+ end
309
+ end
310
+ else
311
+ if subtypes.empty?
312
+ types.each do |t|
313
+ if obj.kind_of?(t)
314
+ ok = true
315
+ throw :stop
316
+ end
317
+ end
318
+ else
319
+ types.each do |t|
320
+ subtypes.each do |st|
321
+ if obj.kind_of?(t) and obj.subtype == st
322
+ ok = true
323
+ throw :stop
324
+ end
325
+ end
326
+ end
327
+ end
328
+ end
329
+ end
330
+
331
+ if ok
332
+ yield(obj.class.to_s, obj)
333
+
334
+ throw :once if once
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
340
+
341
+ def path(pad)
342
+ p1 = self
343
+
344
+ unless pad.nil?
345
+ pad.split(/\//).each do |deel|
346
+ tag, voorkomen = deel.split(/:/)
347
+
348
+ if (not tag.nil?) and (not p1.nil?)
349
+ voorkomen = 1 if voorkomen.nil?
350
+ voorkomen = voorkomen.to_i
351
+
352
+ teller = 0
353
+ p2 = nil
354
+ p1.children.each_index do |i|
355
+ #if p1.children[i].upordown == Down
356
+ unless p1.children[i].subtype.nil?
357
+ if p1.children[i].subtype.noquotes == tag.noquotes
358
+ teller += 1
359
+ p2 = p1.children[i] if teller == voorkomen
360
+ end
361
+ end
362
+ #end
363
+ end
364
+ p1 = p2
365
+ end
366
+ end
367
+ end
368
+
369
+ p1
370
+ end
371
+ end