rwdeliza 0.03
Sign up to get free protection for your applications and to get access to all the features.
- data/ElizaData/database/db.1 +7015 -0
- data/ElizaData/database/db.10 +7001 -0
- data/ElizaData/database/db.11 +7001 -0
- data/ElizaData/database/db.12 +7003 -0
- data/ElizaData/database/db.13 +7003 -0
- data/ElizaData/database/db.14 +7008 -0
- data/ElizaData/database/db.15 +7001 -0
- data/ElizaData/database/db.16 +7001 -0
- data/ElizaData/database/db.17 +7001 -0
- data/ElizaData/database/db.18 +7001 -0
- data/ElizaData/database/db.19 +7001 -0
- data/ElizaData/database/db.2 +7001 -0
- data/ElizaData/database/db.20 +5467 -0
- data/ElizaData/database/db.3 +7001 -0
- data/ElizaData/database/db.4 +7001 -0
- data/ElizaData/database/db.5 +7001 -0
- data/ElizaData/database/db.6 +7001 -0
- data/ElizaData/database/db.7 +7001 -0
- data/ElizaData/database/db.8 +7001 -0
- data/ElizaData/database/db.9 +7001 -0
- data/ElizaData/responses/hello.res +1 -0
- data/ElizaData/responses/i_agree.res +1 -0
- data/ElizaData/responses/i_am_listening_to_you.res +1 -0
- data/ElizaData/responses/please_explain.res +1 -0
- data/ElizaData/responses/thank_you.res +1 -0
- data/ElizaData/tiny.dict +211 -0
- data/ElizaData/words/adjectives1.words +906 -0
- data/ElizaData/words/adjectives2w.words +1 -0
- data/ElizaData/words/noun0.words +15 -0
- data/ElizaData/words/noun1.words +1391 -0
- data/ElizaData/words/noun2.words +1924 -0
- data/ElizaData/words/noun4.words +330 -0
- data/ElizaData/words/pronoun1.words +6 -0
- data/ElizaData/words/verb4.words +350 -0
- data/ElizaData/words/verb42.words +391 -0
- data/ElizaData/words/verb42w.words +1 -0
- data/ElizaData/words/verb43.words +402 -0
- data/ElizaData/words/verb43w.words +1 -0
- data/ElizaData/words/verb45.words +452 -0
- data/ElizaData/words/verb4w.words +1 -0
- data/ElizaData/words/verb5.words +13 -0
- data/ElizaData/words/verb61.words +35 -0
- data/ElizaData/words/verb62.words +41 -0
- data/ElizaData/words/verb83.words +17 -0
- data/Readme.txt +462 -0
- data/bin/rwdeliza +19 -0
- data/code/01rwdcore/01rwdcore.rb +29 -0
- data/code/01rwdcore/02helptexthashbegin.rb +4 -0
- data/code/01rwdcore/03helptexthash.rb +23 -0
- data/code/01rwdcore/04helptextend.rb +6 -0
- data/code/01rwdcore/jumplinkcommand.rb +26 -0
- data/code/01rwdcore/openhelpwindow.rb +31 -0
- data/code/01rwdcore/returntomain.rb +10 -0
- data/code/01rwdcore/rundocuments.rb +10 -0
- data/code/01rwdcore/runeditconfiguration.rb +10 -0
- data/code/01rwdcore/runhelpabout.rb +10 -0
- data/code/01rwdcore/runopentinkerdocument.rb +7 -0
- data/code/01rwdcore/rwdtinkerversion.rb +22 -0
- data/code/01rwdcore/rwdwindowreturn.rb +9 -0
- data/code/01rwdcore/selectiontab.rb +9 -0
- data/code/01rwdcore/setuphelpaboutoptions.rb +13 -0
- data/code/01rwdcore/setuptinkerdocuments.rb +6 -0
- data/code/01rwdcore/test_cases.rb +109 -0
- data/code/01rwdcore/test_harness.rb +13 -0
- data/code/01rwdcore/uploadreturns.rb +62 -0
- data/code/dd0viewphoto/dd0viewphoto.rb +3 -0
- data/code/superant.com.rwdeliza/0uninstallapplet.rb +10 -0
- data/code/superant.com.rwdeliza/eliza01.rb +45 -0
- data/code/superant.com.rwdeliza/helptexthashrwdeliza.rb +39 -0
- data/code/superant.com.rwdeliza/openhelpwindowrwdeliza.rb +23 -0
- data/code/superant.com.rwdeliza/runrwdshellwindow.rb +12 -0
- data/code/superant.com.rwdeliza/rwdtinkerversion.rb +10 -0
- data/code/superant.com.rwdeliza/tagsentence.rb +39 -0
- data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +61 -0
- data/code/superant.com.rwdtinkerbackwindow/initiateapplets.rb +240 -0
- data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +34 -0
- data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +20 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +12 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +53 -0
- data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +12 -0
- data/code/superant.com.rwdtinkerbackwindow/listzips.rb +27 -0
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +22 -0
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +14 -0
- data/code/superant.com.rwdtinkerbackwindow/network.rb +87 -0
- data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +38 -0
- data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +24 -0
- data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +46 -0
- data/code/superant.com.rwdtinkerbackwindow/removeappletvariables.rb +52 -0
- data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +11 -0
- data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +15 -0
- data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +13 -0
- data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +22 -0
- data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +24 -0
- data/code/superant.com.words/dictlookup.rb +20 -0
- data/code/superant.com.words/runfortunewindow.rb +14 -0
- data/code/superant.com.words/runrwdwordsbackwindow.rb +10 -0
- data/code/superant.com.words/runrwdwordsversion.rb +14 -0
- data/code/superant.com.words/rwdtinkerversion.rb +10 -0
- data/code/zz0applicationend/zz0end.rb +4 -0
- data/configuration/language.dist +8 -0
- data/configuration/rwdapplicationidentity.dist +3 -0
- data/configuration/rwdtinker.dist +18 -0
- data/configuration/rwdweliza-0.03.dist +31 -0
- data/configuration/tinkerwin2variables.dist +17 -0
- data/gui/00coreguibegin/applicationguitop.rwd +4 -0
- data/gui/frontwindow0/cc0openphoto.rwd +22 -0
- data/gui/frontwindowselections/00selectiontabbegin.rwd +11 -0
- data/gui/frontwindowselections/jumplinkcommands.rwd +15 -0
- data/gui/frontwindowselections/wwselectionend.rwd +3 -0
- data/gui/frontwindowtdocuments/00documentbegin.rwd +6 -0
- data/gui/frontwindowtdocuments/tinkerdocuments.rwd +14 -0
- data/gui/frontwindowtdocuments/zzdocumentend.rwd +8 -0
- data/gui/helpaboutbegin/zzzrwdlasttab.rwd +6 -0
- data/gui/helpaboutbegin/zzzzhelpscreenstart.rwd +3 -0
- data/gui/helpaboutbegin/zzzzzzhelpabouttab.rwd +15 -0
- data/gui/helpaboutzend/helpscreenend.rwd +3 -0
- data/gui/helpaboutzend/zhelpscreenstart2.rwd +3 -0
- data/gui/helpaboutzend/zzzzhelpabout2.rwd +15 -0
- data/gui/helpaboutzend/zzzzhelpscreen2end.rwd +3 -0
- data/gui/tinkerbackwindows/superant.com.refreshwindow/fortunerefreshwindowtwo.rwd +9 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/1eliza.rwd +21 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/4sentance.rwd +21 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/98jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/zbackend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/20downloadftp.rwd +45 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/67viewconfiguration.rwd +29 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/70rwddiagnostics.rwd +16 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/m01menubegin.rwd +18 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/zvbackend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +41 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +44 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/50rwdlistapplets.rwd +44 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/60editconfiguration.rwd +30 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/70rwddiagnostics.rwd +29 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/9backend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/1appname.rwd +31 -0
- data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/9end.rwd +4 -0
- data/gui/tinkerbackwindows/superant.com.versionwindow/1appname.rwd +19 -0
- data/gui/tinkerbackwindows/superant.com.versionwindow/helpaboutwindow.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.words/1appname.rwd +4 -0
- data/gui/tinkerbackwindows/superant.com.words/1dictionary.rwd +19 -0
- data/gui/tinkerbackwindows/superant.com.words/3rwdfortune.rwd +14 -0
- data/gui/tinkerbackwindows/superant.com.words/77jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.words/z9end.rwd +6 -0
- data/gui/zzcoreguiend/yy9rwdend.rwd +4 -0
- data/init.rb +277 -0
- data/installed/rwdweliza-0.03.inf +24 -0
- data/installed/temp.rb +1 -0
- data/lang/en/rwdcore/languagefile.rb +58 -0
- data/lang/es/rwdcore/languagefile-es.rb +62 -0
- data/lang/fr/rwdcore/languagefile.rb +64 -0
- data/lang/jp/rwdcore/languagefile.rb +72 -0
- data/lang/nl/rwdcore/languagefile.rb +75 -0
- data/lib/dict.rb +438 -0
- data/lib/druida.rb +499 -0
- data/lib/hashslice.rb +71 -0
- data/lib/linguistics.rb +360 -0
- data/lib/linguistics/en.rb +1601 -0
- data/lib/linguistics/en/infinitive.rb +1148 -0
- data/lib/linguistics/en/linkparser.rb +142 -0
- data/lib/linguistics/en/wordnet.rb +253 -0
- data/lib/linguistics/iso639.rb +456 -0
- data/lib/linkparser.rb +461 -0
- data/lib/linkparser/connection.rb +81 -0
- data/lib/linkparser/connector.rb +201 -0
- data/lib/linkparser/definition.rb +225 -0
- data/lib/linkparser/dictionary.rb +208 -0
- data/lib/linkparser/linkage.rb +185 -0
- data/lib/linkparser/log.rb +39 -0
- data/lib/linkparser/sentence.rb +79 -0
- data/lib/linkparser/utils.rb +540 -0
- data/lib/linkparser/word.rb +92 -0
- data/lib/rconftool.rb +380 -0
- data/lib/rwd/browser.rb +123 -0
- data/lib/rwd/ftools.rb +174 -0
- data/lib/rwd/mime.rb +328 -0
- data/lib/rwd/net.rb +866 -0
- data/lib/rwd/ruby.rb +889 -0
- data/lib/rwd/rwd.rb +1942 -0
- data/lib/rwd/sgml.rb +236 -0
- data/lib/rwd/thread.rb +63 -0
- data/lib/rwd/tree.rb +371 -0
- data/lib/rwd/xml.rb +101 -0
- data/lib/zip/ioextras.rb +114 -0
- data/lib/zip/stdrubyext.rb +111 -0
- data/lib/zip/tempfile_bugfixed.rb +195 -0
- data/lib/zip/zip.rb +1378 -0
- data/lib/zip/zipfilesystem.rb +558 -0
- data/lib/zip/ziprequire.rb +61 -0
- data/rwd_files/HowTo_Eliza.txt +195 -0
- data/rwd_files/HowTo_Tinker.txt +471 -0
- data/rwd_files/HowTo_TinkerWin2.txt +202 -0
- data/rwd_files/Readme.txt +57 -0
- data/rwd_files/RubyWebDialogs.html +6 -0
- data/rwd_files/favicon.ico +0 -0
- data/rwd_files/rdoc-style.css +175 -0
- data/rwd_files/rwdapplications.html +54 -0
- data/rwd_files/tinker.png +0 -0
- data/rwdconfig.dist +21 -0
- data/rwdeliza.rb +1 -0
- data/tests/RubyGauge.rb +179 -0
- data/tests/checkdepends.sh +4 -0
- data/tests/cleancnf.sh +6 -0
- data/tests/makedist-rwdweliza.rb +56 -0
- data/tests/makedist.rb +66 -0
- data/tests/rdep.rb +354 -0
- data/tests/totranslate.lang +93 -0
- data/zips/rwdwaddresses-1.05.zip +0 -0
- data/zips/rwdwcalc-0.61.zip +0 -0
- data/zips/rwdwgutenberg-0.09.zip +0 -0
- data/zips/rwdwschedule-1.04.zip +0 -0
- data/zips/rwdwshell-1.04.zip +0 -0
- data/zips/temp.rb +1 -0
- data/zips/wrubyslippers-1.06.zip +0 -0
- metadata +282 -0
data/lib/rwd/xml.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require "lib/rwd/sgml"
|
2
|
+
|
3
|
+
class SGMLObject
|
4
|
+
def to_x(closetags=true)
|
5
|
+
res = ""
|
6
|
+
|
7
|
+
parsetree("prechildren_to_x", "postchildren_to_x", res, closetags)
|
8
|
+
|
9
|
+
res
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Text < SGMLObject
|
14
|
+
def prechildren_to_x(res, closetags)
|
15
|
+
res << @text.strip unless @text.strip.empty?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Comment < SGMLObject
|
20
|
+
def prechildren_to_x(res, closetags)
|
21
|
+
res << "\n" if not previous([], [Text]).kind_of?(Comment)
|
22
|
+
lines = @text.gsub(/(<!--|-->)/, "").lf.split(/\n/)
|
23
|
+
if lines.length == 1
|
24
|
+
res << " "*(@level-1) + "<!-- " + lines[0].strip + " -->" + "\n"
|
25
|
+
else
|
26
|
+
res << " "*(@level-1) + "<!--" + "\n"
|
27
|
+
res << lines.collect{|s| " "*(@level-1) + s.strip}.delete_if{|s| s.compress.empty?}.join("\n")
|
28
|
+
res << "\n"
|
29
|
+
res << " "*(@level-1) + "-->" + "\n"
|
30
|
+
res << "\n"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Special < SGMLObject
|
36
|
+
def prechildren_to_x(res, closetags)
|
37
|
+
res << " "*(@level-1) + @text.compress + "\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Instruction < SGMLObject
|
42
|
+
def prechildren_to_x(res, closetags)
|
43
|
+
res << " "*(@level-1) + @text.compress + "\n"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class OpenTag < Tag
|
48
|
+
def prechildren_to_x(res, closetags)
|
49
|
+
a = [@subtype]
|
50
|
+
|
51
|
+
args = @args.dup
|
52
|
+
args.delete("id")
|
53
|
+
args.delete("name")
|
54
|
+
args = args.sort
|
55
|
+
args.unshift(["id", @args["id"]]) if @args.include?("id")
|
56
|
+
args.unshift(["name", @args["name"]]) if @args.include?("name")
|
57
|
+
|
58
|
+
args.each do |k, v|
|
59
|
+
if not v.include?("'")
|
60
|
+
a << "#{k}='#{v}'"
|
61
|
+
else
|
62
|
+
if not v.include?('"')
|
63
|
+
a << "#{k}=\"#{v}\""
|
64
|
+
else
|
65
|
+
a << "#{k}='#{v.gsub(/\'/, '"')}'"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if @children.length == 0 or (@children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.compress.empty?)
|
71
|
+
res << " "*(@level-1) + "<#{a.join(" ")}/>" + "\n"
|
72
|
+
else
|
73
|
+
if @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length == 1
|
74
|
+
res << " "*(@level-1) + "<#{a.join(" ")}>"
|
75
|
+
else
|
76
|
+
res << " "*(@level-1) + "<#{a.join(" ")}>" + "\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def postchildren_to_x(res, closetags)
|
82
|
+
if closetags
|
83
|
+
unless @children.length == 0 or (@children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.compress.empty?)
|
84
|
+
res << "\n" if @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length > 1
|
85
|
+
res << " "*(@level-1) unless @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length == 1
|
86
|
+
res << "</#{@subtype}>"
|
87
|
+
res << "\n"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class XML < SGML
|
94
|
+
def to_x(closetags=true)
|
95
|
+
res = ""
|
96
|
+
|
97
|
+
parsetree("prechildren_to_x", "postchildren_to_x", res, closetags)
|
98
|
+
|
99
|
+
res
|
100
|
+
end
|
101
|
+
end
|
data/lib/zip/ioextras.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
module IOExtras
|
2
|
+
module FakeIO
|
3
|
+
def kind_of?(object)
|
4
|
+
object == IO || super
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Implements many of the convenience methods of IO
|
9
|
+
# such as gets, getc, readline and readlines
|
10
|
+
# depends on: input_finished?, produce_input and read
|
11
|
+
module AbstractInputStream
|
12
|
+
include Enumerable
|
13
|
+
include FakeIO
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
super
|
17
|
+
@lineno = 0
|
18
|
+
@outputBuffer = ""
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_accessor :lineno
|
22
|
+
|
23
|
+
def readlines(aSepString = $/)
|
24
|
+
retVal = []
|
25
|
+
each_line(aSepString) { |line| retVal << line }
|
26
|
+
return retVal
|
27
|
+
end
|
28
|
+
|
29
|
+
def gets(aSepString=$/)
|
30
|
+
@lineno = @lineno.next
|
31
|
+
return read if aSepString == nil
|
32
|
+
aSepString="#{$/}#{$/}" if aSepString == ""
|
33
|
+
|
34
|
+
bufferIndex=0
|
35
|
+
while ((matchIndex = @outputBuffer.index(aSepString, bufferIndex)) == nil)
|
36
|
+
bufferIndex=@outputBuffer.length
|
37
|
+
if input_finished?
|
38
|
+
return @outputBuffer.empty? ? nil : flush
|
39
|
+
end
|
40
|
+
@outputBuffer << produce_input
|
41
|
+
end
|
42
|
+
sepIndex=matchIndex + aSepString.length
|
43
|
+
return @outputBuffer.slice!(0...sepIndex)
|
44
|
+
end
|
45
|
+
|
46
|
+
def flush
|
47
|
+
retVal=@outputBuffer
|
48
|
+
@outputBuffer=""
|
49
|
+
return retVal
|
50
|
+
end
|
51
|
+
|
52
|
+
def readline(aSepString = $/)
|
53
|
+
retVal = gets(aSepString)
|
54
|
+
raise EOFError if retVal == nil
|
55
|
+
return retVal
|
56
|
+
end
|
57
|
+
|
58
|
+
def each_line(aSepString = $/)
|
59
|
+
while true
|
60
|
+
yield readline(aSepString)
|
61
|
+
end
|
62
|
+
rescue EOFError
|
63
|
+
end
|
64
|
+
|
65
|
+
alias_method :each, :each_line
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
#relies on <<
|
70
|
+
module AbstractOutputStream
|
71
|
+
include FakeIO
|
72
|
+
|
73
|
+
def write(data)
|
74
|
+
self << data
|
75
|
+
data.to_s.length
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def print(*params)
|
80
|
+
self << params.to_s << $\.to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
def printf(aFormatString, *params)
|
84
|
+
self << sprintf(aFormatString, *params)
|
85
|
+
end
|
86
|
+
|
87
|
+
def putc(anObject)
|
88
|
+
self << case anObject
|
89
|
+
when Fixnum then anObject.chr
|
90
|
+
when String then anObject
|
91
|
+
else raise TypeError, "putc: Only Fixnum and String supported"
|
92
|
+
end
|
93
|
+
anObject
|
94
|
+
end
|
95
|
+
|
96
|
+
def puts(*params)
|
97
|
+
params << "\n" if params.empty?
|
98
|
+
params.flatten.each {
|
99
|
+
|element|
|
100
|
+
val = element.to_s
|
101
|
+
self << val
|
102
|
+
self << "\n" unless val[-1,1] == "\n"
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end # IOExtras namespace module
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
# Copyright (C) 2002-2004 Thomas Sondergaard
|
113
|
+
# rubyzip is free software; you can redistribute it and/or
|
114
|
+
# modify it under the terms of the ruby license.
|
@@ -0,0 +1,111 @@
|
|
1
|
+
unless Enumerable.method_defined?(:inject)
|
2
|
+
module Enumerable #:nodoc:all
|
3
|
+
def inject(n = 0)
|
4
|
+
each { |value| n = yield(n, value) }
|
5
|
+
n
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Enumerable #:nodoc:all
|
11
|
+
# returns a new array of all the return values not equal to nil
|
12
|
+
# This implementation could be faster
|
13
|
+
def select_map(&aProc)
|
14
|
+
map(&aProc).reject { |e| e.nil? }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
unless Object.method_defined?(:object_id)
|
19
|
+
class Object
|
20
|
+
# Using object_id which is the new thing, so we need
|
21
|
+
# to make that work in versions prior to 1.8.0
|
22
|
+
alias object_id id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
unless File.respond_to?(:read)
|
27
|
+
class File
|
28
|
+
# singleton method read does not exist in 1.6.x
|
29
|
+
def self.read(fileName)
|
30
|
+
open(fileName) { |f| f.read }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class String
|
36
|
+
def starts_with(aString)
|
37
|
+
rindex(aString, 0) == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def ends_with(aString)
|
41
|
+
index(aString, -aString.size)
|
42
|
+
end
|
43
|
+
|
44
|
+
def ensure_end(aString)
|
45
|
+
ends_with(aString) ? self : self + aString
|
46
|
+
end
|
47
|
+
|
48
|
+
def lchop
|
49
|
+
slice(1, length)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Time
|
54
|
+
|
55
|
+
#MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
|
56
|
+
#
|
57
|
+
# Register CX, the Time:
|
58
|
+
# Bits 0-4 2 second increments (0-29)
|
59
|
+
# Bits 5-10 minutes (0-59)
|
60
|
+
# bits 11-15 hours (0-24)
|
61
|
+
#
|
62
|
+
# Register DX, the Date:
|
63
|
+
# Bits 0-4 day (1-31)
|
64
|
+
# bits 5-8 month (1-12)
|
65
|
+
# bits 9-15 year (four digit year minus 1980)
|
66
|
+
|
67
|
+
|
68
|
+
def to_binary_dos_time
|
69
|
+
(sec/2) +
|
70
|
+
(min << 5) +
|
71
|
+
(hour << 11)
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_binary_dos_date
|
75
|
+
(day) +
|
76
|
+
(month << 5) +
|
77
|
+
((year - 1980) << 9)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Dos time is only stored with two seconds accuracy
|
81
|
+
def dos_equals(other)
|
82
|
+
to_i/2 == other.to_i/2
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.parse_binary_dos_format(binaryDosDate, binaryDosTime)
|
86
|
+
second = 2 * ( 0b11111 & binaryDosTime)
|
87
|
+
minute = ( 0b11111100000 & binaryDosTime) >> 5
|
88
|
+
hour = (0b1111100000000000 & binaryDosTime) >> 11
|
89
|
+
day = ( 0b11111 & binaryDosDate)
|
90
|
+
month = ( 0b111100000 & binaryDosDate) >> 5
|
91
|
+
year = ((0b1111111000000000 & binaryDosDate) >> 9) + 1980
|
92
|
+
begin
|
93
|
+
return Time.local(year, month, day, hour, minute, second)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Module
|
99
|
+
def forward_message(forwarder, *messagesToForward)
|
100
|
+
methodDefs = messagesToForward.map {
|
101
|
+
|msg|
|
102
|
+
"def #{msg}; #{forwarder}(:#{msg}); end"
|
103
|
+
}
|
104
|
+
module_eval(methodDefs.join("\n"))
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
110
|
+
# rubyzip is free software; you can redistribute it and/or
|
111
|
+
# modify it under the terms of the ruby license.
|
@@ -0,0 +1,195 @@
|
|
1
|
+
#
|
2
|
+
# tempfile - manipulates temporary files
|
3
|
+
#
|
4
|
+
# $Id: tempfile_bugfixed.rb,v 1.2 2004/03/28 12:46:36 thomas Exp $
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'delegate'
|
8
|
+
require 'tmpdir'
|
9
|
+
|
10
|
+
module BugFix
|
11
|
+
|
12
|
+
# A class for managing temporary files. This library is written to be
|
13
|
+
# thread safe.
|
14
|
+
class Tempfile < DelegateClass(File)
|
15
|
+
MAX_TRY = 10
|
16
|
+
@@cleanlist = []
|
17
|
+
|
18
|
+
# Creates a temporary file of mode 0600 in the temporary directory
|
19
|
+
# whose name is basename.pid.n and opens with mode "w+". A Tempfile
|
20
|
+
# object works just like a File object.
|
21
|
+
#
|
22
|
+
# If tmpdir is omitted, the temporary directory is determined by
|
23
|
+
# Dir::tmpdir provided by 'tmpdir.rb'.
|
24
|
+
# When $SAFE > 0 and the given tmpdir is tainted, it uses
|
25
|
+
# /tmp. (Note that ENV values are tainted by default)
|
26
|
+
def initialize(basename, tmpdir=Dir::tmpdir)
|
27
|
+
if $SAFE > 0 and tmpdir.tainted?
|
28
|
+
tmpdir = '/tmp'
|
29
|
+
end
|
30
|
+
|
31
|
+
lock = nil
|
32
|
+
n = failure = 0
|
33
|
+
|
34
|
+
begin
|
35
|
+
Thread.critical = true
|
36
|
+
|
37
|
+
begin
|
38
|
+
tmpname = sprintf('%s/%s%d.%d', tmpdir, basename, $$, n)
|
39
|
+
lock = tmpname + '.lock'
|
40
|
+
n += 1
|
41
|
+
end while @@cleanlist.include?(tmpname) or
|
42
|
+
File.exist?(lock) or File.exist?(tmpname)
|
43
|
+
|
44
|
+
Dir.mkdir(lock)
|
45
|
+
rescue
|
46
|
+
failure += 1
|
47
|
+
retry if failure < MAX_TRY
|
48
|
+
raise "cannot generate tempfile `%s'" % tmpname
|
49
|
+
ensure
|
50
|
+
Thread.critical = false
|
51
|
+
end
|
52
|
+
|
53
|
+
@data = [tmpname]
|
54
|
+
@clean_proc = Tempfile.callback(@data)
|
55
|
+
ObjectSpace.define_finalizer(self, @clean_proc)
|
56
|
+
|
57
|
+
@tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
|
58
|
+
@tmpname = tmpname
|
59
|
+
@@cleanlist << @tmpname
|
60
|
+
@data[1] = @tmpfile
|
61
|
+
@data[2] = @@cleanlist
|
62
|
+
|
63
|
+
super(@tmpfile)
|
64
|
+
|
65
|
+
# Now we have all the File/IO methods defined, you must not
|
66
|
+
# carelessly put bare puts(), etc. after this.
|
67
|
+
|
68
|
+
Dir.rmdir(lock)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Opens or reopens the file with mode "r+".
|
72
|
+
def open
|
73
|
+
@tmpfile.close if @tmpfile
|
74
|
+
@tmpfile = File.open(@tmpname, 'r+')
|
75
|
+
@data[1] = @tmpfile
|
76
|
+
__setobj__(@tmpfile)
|
77
|
+
end
|
78
|
+
|
79
|
+
def _close # :nodoc:
|
80
|
+
@tmpfile.close if @tmpfile
|
81
|
+
@data[1] = @tmpfile = nil
|
82
|
+
end
|
83
|
+
protected :_close
|
84
|
+
|
85
|
+
# Closes the file. If the optional flag is true, unlinks the file
|
86
|
+
# after closing.
|
87
|
+
#
|
88
|
+
# If you don't explicitly unlink the temporary file, the removal
|
89
|
+
# will be delayed until the object is finalized.
|
90
|
+
def close(unlink_now=false)
|
91
|
+
if unlink_now
|
92
|
+
close!
|
93
|
+
else
|
94
|
+
_close
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Closes and unlinks the file.
|
99
|
+
def close!
|
100
|
+
_close
|
101
|
+
@clean_proc.call
|
102
|
+
ObjectSpace.undefine_finalizer(self)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Unlinks the file. On UNIX-like systems, it is often a good idea
|
106
|
+
# to unlink a temporary file immediately after creating and opening
|
107
|
+
# it, because it leaves other programs zero chance to access the
|
108
|
+
# file.
|
109
|
+
def unlink
|
110
|
+
# keep this order for thread safeness
|
111
|
+
File.unlink(@tmpname) if File.exist?(@tmpname)
|
112
|
+
@@cleanlist.delete(@tmpname) if @@cleanlist
|
113
|
+
end
|
114
|
+
alias delete unlink
|
115
|
+
|
116
|
+
if RUBY_VERSION > '1.8.0'
|
117
|
+
def __setobj__(obj)
|
118
|
+
@_dc_obj = obj
|
119
|
+
end
|
120
|
+
else
|
121
|
+
def __setobj__(obj)
|
122
|
+
@obj = obj
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Returns the full path name of the temporary file.
|
127
|
+
def path
|
128
|
+
@tmpname
|
129
|
+
end
|
130
|
+
|
131
|
+
# Returns the size of the temporary file. As a side effect, the IO
|
132
|
+
# buffer is flushed before determining the size.
|
133
|
+
def size
|
134
|
+
if @tmpfile
|
135
|
+
@tmpfile.flush
|
136
|
+
@tmpfile.stat.size
|
137
|
+
else
|
138
|
+
0
|
139
|
+
end
|
140
|
+
end
|
141
|
+
alias length size
|
142
|
+
|
143
|
+
class << self
|
144
|
+
def callback(data) # :nodoc:
|
145
|
+
pid = $$
|
146
|
+
lambda{
|
147
|
+
if pid == $$
|
148
|
+
path, tmpfile, cleanlist = *data
|
149
|
+
|
150
|
+
print "removing ", path, "..." if $DEBUG
|
151
|
+
|
152
|
+
tmpfile.close if tmpfile
|
153
|
+
|
154
|
+
# keep this order for thread safeness
|
155
|
+
File.unlink(path) if File.exist?(path)
|
156
|
+
cleanlist.delete(path) if cleanlist
|
157
|
+
|
158
|
+
print "done\n" if $DEBUG
|
159
|
+
end
|
160
|
+
}
|
161
|
+
end
|
162
|
+
|
163
|
+
# If no block is given, this is a synonym for new().
|
164
|
+
#
|
165
|
+
# If a block is given, it will be passed tempfile as an argument,
|
166
|
+
# and the tempfile will automatically be closed when the block
|
167
|
+
# terminates. In this case, open() returns nil.
|
168
|
+
def open(*args)
|
169
|
+
tempfile = new(*args)
|
170
|
+
|
171
|
+
if block_given?
|
172
|
+
begin
|
173
|
+
yield(tempfile)
|
174
|
+
ensure
|
175
|
+
tempfile.close
|
176
|
+
end
|
177
|
+
|
178
|
+
nil
|
179
|
+
else
|
180
|
+
tempfile
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
end # module BugFix
|
187
|
+
if __FILE__ == $0
|
188
|
+
# $DEBUG = true
|
189
|
+
f = Tempfile.new("foo")
|
190
|
+
f.print("foo\n")
|
191
|
+
f.close
|
192
|
+
f.open
|
193
|
+
p f.gets # => "foo\n"
|
194
|
+
f.close!
|
195
|
+
end
|