knjrbfw 0.0.115 → 0.0.116
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.
- checksums.yaml +4 -4
- data/lib/knj/erb/include.rb +46 -46
- data/lib/knj/eruby.rb +51 -51
- data/lib/knj/filesystem.rb +1 -1
- data/lib/knj/gettext_threadded.rb +19 -19
- data/lib/knj/includes/appserver_cli.rb +4 -4
- data/lib/knj/knj.rb +17 -17
- data/lib/knj/mount.rb +23 -23
- data/lib/knj/os.rb +52 -52
- data/lib/knj/power_manager.rb +8 -8
- data/lib/knj/scripts/svn_merge.rb +6 -6
- data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +4 -4
- data/lib/knj/web.rb +1 -1
- data/lib/knj/webscripts/image.rhtml +40 -40
- data/lib/knj/webscripts/image_subproc.rhtml +2 -2
- data/lib/knj/win_tightvnc.rb +19 -19
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba4a0d2d304a3aca02bed13395250ec82ece3fef1fb3239a60199615a0310d6c
|
4
|
+
data.tar.gz: 4018da1c46f54b99db3c4f9dc6b25e9065c5c64f5de1082006a2db774ad9b3c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b539bf8e66dc55b6480dee125ddd3578e2fde2543ec7ceac2410611e125e577281599a9473b6c98f7ec8b9815cf660aaf606e5f4a6e52e2470cc8db723701a4
|
7
|
+
data.tar.gz: 420e34ac692a52dfb8f401f1bbb40c056613802aa9f1f5fb50b4b58712b80d5562b424661e398d0113706970441bad52ea6c2f014cfa52c9b547b0bdcd9685db
|
data/lib/knj/erb/include.rb
CHANGED
@@ -4,7 +4,7 @@ class ERuby
|
|
4
4
|
@inseq_cache = false
|
5
5
|
@inseq_rbc = false
|
6
6
|
@java_compile = false
|
7
|
-
|
7
|
+
|
8
8
|
if RUBY_PLATFORM == "java"
|
9
9
|
@java_compile = true
|
10
10
|
@java_factory = javax.script.ScriptEngineManager.new
|
@@ -13,51 +13,51 @@ class ERuby
|
|
13
13
|
elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
|
14
14
|
@eruby_rbyte = {}
|
15
15
|
@inseq_cache = true
|
16
|
-
|
16
|
+
|
17
17
|
if RubyVM::InstructionSequence.respond_to?(:load)
|
18
18
|
@inseq_rbc = true
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
@inseq_rbc = false #this is not possible yet in Ruby... maybe in 1.9.3?
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def self.import(filename)
|
26
26
|
ERuby.load_settings if !@settings_loaded
|
27
|
-
|
27
|
+
|
28
28
|
filename = File.expand_path(filename)
|
29
29
|
pwd = Dir.pwd
|
30
30
|
Dir.chdir(File.dirname(filename))
|
31
|
-
|
31
|
+
|
32
32
|
fpath = "#{KnjEruby.filepath}/cache/#{filename.gsub("/", "_").gsub(".", "_")}"
|
33
33
|
pi = Php4r.pathinfo(filename)
|
34
34
|
cachename = fpath + ".cache"
|
35
|
-
|
35
|
+
|
36
36
|
filetime = File.mtime(filename)
|
37
|
-
cacheexists = File.
|
38
|
-
cachetime = File.mtime(cachename) if File.
|
39
|
-
|
37
|
+
cacheexists = File.exist?(cachename)
|
38
|
+
cachetime = File.mtime(cachename) if File.exist?(cachename)
|
39
|
+
|
40
40
|
if !cacheexists or filetime > cachetime
|
41
41
|
KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
|
42
42
|
cachetime = File.mtime(cachename)
|
43
43
|
reload_cache = true
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
if @java_compile
|
47
47
|
if !@eruby_java_cache[cachename] or reload_cache
|
48
48
|
#@eruby_java_cache[cachename] = @java_engine.compile(File.read(cachename))
|
49
49
|
@eruby_java_cache[cachename] = File.read(cachename)
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
#@eruby_java_cache[cachename].eval
|
53
53
|
eval(@eruby_java_cache[cachename])
|
54
54
|
elsif @inseq_cache
|
55
55
|
if @inseq_rbc
|
56
56
|
bytepath = pi["dirname"] + "/" + pi["basename"] + ".rbc"
|
57
|
-
byteexists = File.
|
58
|
-
bytetime = File.mtime(bytepath) if File.
|
59
|
-
|
60
|
-
if !File.
|
57
|
+
byteexists = File.exist?(bytepath)
|
58
|
+
bytetime = File.mtime(bytepath) if File.exist?(bytepath)
|
59
|
+
|
60
|
+
if !File.exist?(bytepath) or cachetime > bytetime
|
61
61
|
res = RubyVM::InstructionSequence.compile_file(filename)
|
62
62
|
data = Marshal.dump(res.to_a)
|
63
63
|
File.open(bytepath, "w+") do |fp|
|
@@ -65,7 +65,7 @@ class ERuby
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
if @inseq_rbc
|
70
70
|
res = Marshal.load(File.read(bytepath))
|
71
71
|
RubyVM::InstructionSequence.load(res).eval
|
@@ -86,70 +86,70 @@ class ERuby
|
|
86
86
|
eruby = KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
|
87
87
|
print eruby.evaluate
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
Dir.chdir(pwd)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
94
|
class KnjEruby < Erubis::Eruby
|
95
95
|
include Erubis::StdoutEnhancer
|
96
|
-
|
96
|
+
|
97
97
|
@headers = [
|
98
98
|
["Content-Type", "text/html; charset=utf-8"]
|
99
99
|
]
|
100
100
|
@filepath = File.dirname(Knj::Os::realpath(__FILE__))
|
101
101
|
@connects = {}
|
102
|
-
|
102
|
+
|
103
103
|
def self.fcgi=(newvalue); @fcgi = newvalue; end
|
104
104
|
def self.fcgi; return @fcgi; end
|
105
105
|
def self.connects; return @connects; end
|
106
106
|
def self.headers; return @headers; end
|
107
|
-
|
107
|
+
|
108
108
|
def self.print_headers(args = {})
|
109
109
|
header_str = ""
|
110
|
-
|
110
|
+
|
111
111
|
@headers.each do |header|
|
112
112
|
header_str << "#{header[0]}: #{header[1]}\n"
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
header_str << "\n"
|
116
116
|
self.reset_headers if @fcgi
|
117
117
|
return header_str
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
def self.has_status_header?
|
121
121
|
@headers.each do |header|
|
122
122
|
if header[0] == "Status"
|
123
123
|
return true
|
124
124
|
end
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
return false
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
def self.reset_connects
|
131
131
|
@connects = {}
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
def self.reset_headers
|
135
135
|
@headers = [
|
136
136
|
["Content-Type", "text/html; charset=utf-8"]
|
137
137
|
]
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
def self.header(key, value)
|
141
141
|
@headers << [key, value]
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
def self.filepath
|
145
145
|
return @filepath
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
def self.connect(signal, &block)
|
149
149
|
@connects[signal] = [] if !@connects[signal]
|
150
150
|
@connects[signal] << block
|
151
151
|
end
|
152
|
-
|
152
|
+
|
153
153
|
def self.printcont(tmp_out, args = {})
|
154
154
|
if @fcgi
|
155
155
|
@fcgi.print self.print_headers
|
@@ -162,7 +162,7 @@ class KnjEruby < Erubis::Eruby
|
|
162
162
|
elsif !args[:custom_io]
|
163
163
|
$stdout = STDOUT
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
if !args[:custom_io]
|
167
167
|
print self.print_headers if !args.key?(:with_headers) or args[:with_headers]
|
168
168
|
tmp_out.rewind
|
@@ -170,37 +170,37 @@ class KnjEruby < Erubis::Eruby
|
|
170
170
|
end
|
171
171
|
end
|
172
172
|
end
|
173
|
-
|
173
|
+
|
174
174
|
def self.load_return(filename, args = {})
|
175
175
|
if !args[:io]
|
176
176
|
retio = StringIO.new
|
177
177
|
args[:io] = retio
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
@args = args
|
181
181
|
KnjEruby.load(filename, args)
|
182
|
-
|
182
|
+
|
183
183
|
if !args[:custom_io]
|
184
184
|
retio.rewind
|
185
185
|
return retio.read
|
186
186
|
end
|
187
187
|
end
|
188
|
-
|
188
|
+
|
189
189
|
def self.load(filename, args = {})
|
190
190
|
begin
|
191
191
|
if !args[:custom_io]
|
192
192
|
tmp_out = StringIO.new
|
193
193
|
$stdout = tmp_out
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
ERuby.import(filename)
|
197
|
-
|
197
|
+
|
198
198
|
if KnjEruby.connects["exit"]
|
199
199
|
KnjEruby.connects["exit"].each do |block|
|
200
200
|
block.call
|
201
201
|
end
|
202
202
|
end
|
203
|
-
|
203
|
+
|
204
204
|
KnjEruby.printcont(tmp_out, args)
|
205
205
|
rescue SystemExit => e
|
206
206
|
KnjEruby.printcont(tmp_out, args)
|
@@ -217,31 +217,31 @@ class KnjEruby < Erubis::Eruby
|
|
217
217
|
#An error occurred while trying to run the on-error-block - show this as an normal error.
|
218
218
|
print "\n\n<pre>\n\n"
|
219
219
|
print "<b>#{Knj::Web.html(e.class.name)}: #{Knj::Web.html(e.message)}</b>\n\n"
|
220
|
-
|
220
|
+
|
221
221
|
#Lets hide all the stuff in what is not the users files to make it easier to debug.
|
222
222
|
bt = e.backtrace
|
223
223
|
#to = bt.length - 9
|
224
224
|
#bt = bt[0..to]
|
225
|
-
|
225
|
+
|
226
226
|
bt.each do |line|
|
227
227
|
print Knj::Web.html(line) + "\n"
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
print "</pre>"
|
231
231
|
end
|
232
|
-
|
232
|
+
|
233
233
|
print "\n\n<pre>\n\n"
|
234
234
|
print "<b>#{Knj::Web.html(e.class.name)}: #{Knj::Web.html(e.message)}</b>\n\n"
|
235
|
-
|
235
|
+
|
236
236
|
#Lets hide all the stuff in what is not the users files to make it easier to debug.
|
237
237
|
bt = e.backtrace
|
238
238
|
to = bt.length - 9
|
239
239
|
bt = bt[0..to]
|
240
|
-
|
240
|
+
|
241
241
|
bt.each do |line|
|
242
242
|
print Knj::Web.html(line) + "\n"
|
243
243
|
end
|
244
|
-
|
244
|
+
|
245
245
|
KnjEruby.printcont(tmp_out, args)
|
246
246
|
end
|
247
247
|
end
|
data/lib/knj/eruby.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
#Uses Rubinius, Knj::Compiler, RubyVM::InstructionSequence and eval to convert and execute .rhtml-files.
|
2
2
|
class Knj::Eruby
|
3
3
|
attr_reader :connects, :error, :headers, :cookies, :fcgi
|
4
|
-
|
4
|
+
|
5
5
|
#Sets various arguments and prepares for parsing.
|
6
6
|
def initialize(args = {})
|
7
7
|
@args = args
|
8
|
-
|
8
|
+
|
9
9
|
@tmpdir = "#{Knj::Os.tmpdir}/knj_erb"
|
10
|
-
if !File.
|
10
|
+
if !File.exist?(@tmpdir)
|
11
11
|
Dir.mkdir(@tmpdir, 0777)
|
12
12
|
File.chmod(0777, @tmpdir)
|
13
13
|
end
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
|
16
16
|
#This argument can be used if a shared cache should be used to speed up performance.
|
17
17
|
if @args[:cache_hash]
|
18
18
|
@cache = @args[:cache_hash]
|
19
19
|
else
|
20
20
|
@cache = {}
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
if RUBY_PLATFORM == "java" or RUBY_ENGINE == "rbx"
|
24
24
|
@cache_mode = :code_eval
|
25
25
|
#@cache_mode = :compile_knj
|
@@ -28,35 +28,35 @@ class Knj::Eruby
|
|
28
28
|
#@cache_mode = :inseq
|
29
29
|
#@cache_mode = :compile_knj
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
if @cache_mode == :compile_knj
|
33
33
|
require "#{$knjpath}compiler"
|
34
34
|
@compiler = Knj::Compiler.new(:cache_hash => @cache)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
self.reset_headers
|
38
38
|
self.reset_connects
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
#Imports and evaluates a new .rhtml-file.
|
42
42
|
#===Examples
|
43
43
|
# erb.import("/path/to/some_file.rhtml")
|
44
44
|
def import(filename)
|
45
45
|
@error = false
|
46
|
-
Dir.mkdir(@tmpdir) if !File.
|
46
|
+
Dir.mkdir(@tmpdir) if !File.exist?(@tmpdir)
|
47
47
|
filename = File.expand_path(filename)
|
48
|
-
raise "File does not exist: #{filename}" unless File.
|
48
|
+
raise "File does not exist: #{filename}" unless File.exist?(filename)
|
49
49
|
cachename = "#{@tmpdir}/#{filename.gsub("/", "_").gsub(".", "_")}.cache"
|
50
50
|
filetime = File.mtime(filename)
|
51
|
-
cachetime = File.mtime(cachename) if File.
|
52
|
-
|
53
|
-
if !File.
|
51
|
+
cachetime = File.mtime(cachename) if File.exist?(cachename)
|
52
|
+
|
53
|
+
if !File.exist?(cachename) or filetime > cachetime
|
54
54
|
Knj::Eruby::Handler.load_file(filename, :cachename => cachename)
|
55
55
|
File.chmod(0777, cachename)
|
56
56
|
cachetime = File.mtime(cachename)
|
57
57
|
reload_cache = true
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
begin
|
61
61
|
case @cache_mode
|
62
62
|
when :compile_knj
|
@@ -68,19 +68,19 @@ class Knj::Eruby
|
|
68
68
|
eruby_binding = Knj::Eruby::Binding.new
|
69
69
|
binding_use = eruby_binding.get_binding
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
#No reason to cache contents of files - benchmarking showed little to no differene performance-wise, but caching took up a lot of memory, when a lot of files were cached - knj.
|
73
73
|
eval(File.read(cachename), binding_use, filename)
|
74
74
|
when :inseq
|
75
75
|
reload_cache = true if !@cache.key?(cachename)
|
76
|
-
|
76
|
+
|
77
77
|
if reload_cache or @cache[cachename][:time] < cachetime
|
78
78
|
@cache[cachename] = {
|
79
79
|
:inseq => RubyVM::InstructionSequence.compile(File.read(cachename), filename, nil, 1),
|
80
80
|
:time => Time.now
|
81
81
|
}
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
@cache[cachename][:inseq].eval
|
85
85
|
else
|
86
86
|
loaded_content = Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
|
@@ -94,16 +94,16 @@ class Knj::Eruby
|
|
94
94
|
@error = true
|
95
95
|
self.handle_error(e)
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
return nil
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
#Destroyes this object unsetting all variables and clearing all cache.
|
102
102
|
def destroy
|
103
103
|
@connects.clear if @connects.is_a?(Hash)
|
104
104
|
@headers.clear if @headers.is_a?(Array)
|
105
105
|
@cookies.clear if @cookies.is_a?(Array)
|
106
|
-
|
106
|
+
|
107
107
|
@cache.clear if @cache.is_a?(Hash) and @args and !@args.key?(:cache_hash)
|
108
108
|
@args.clear if @args.is_a?(Hash)
|
109
109
|
@args = nil
|
@@ -111,68 +111,68 @@ class Knj::Eruby
|
|
111
111
|
@connects = nil
|
112
112
|
@headers = nil
|
113
113
|
@cookies = nil
|
114
|
-
|
114
|
+
|
115
115
|
return nil
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
#Returns various headers as one complete string ready to be used in a HTTP-request.
|
119
119
|
def print_headers(args = {})
|
120
120
|
header_str = ""
|
121
|
-
|
121
|
+
|
122
122
|
@headers.each do |header|
|
123
123
|
header_str << "#{header[0]}: #{header[1]}\n"
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
@cookies.each do |cookie|
|
127
127
|
header_str << "Set-Cookie: #{Knj::Web.cookie_str(cookie)}\n"
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
header_str << "\n"
|
131
131
|
self.reset_headers if @fcgi
|
132
132
|
return header_str
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
#Returns true if containing a status-header.
|
136
136
|
def has_status_header?
|
137
137
|
@headers.each do |header|
|
138
138
|
return true if header[0] == "Status"
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
return false
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
#Resets all connections.
|
145
145
|
def reset_connects
|
146
146
|
@connects = {}
|
147
147
|
return nil
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
#Resets all headers.
|
151
151
|
def reset_headers
|
152
152
|
@headers = []
|
153
153
|
@cookies = []
|
154
154
|
return nil
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
#Adds a new header to the list.
|
158
158
|
def header(key, value)
|
159
159
|
@headers << [key, value]
|
160
160
|
return nil
|
161
161
|
end
|
162
|
-
|
162
|
+
|
163
163
|
#Adds a new cookie to the list.
|
164
164
|
def cookie(cookie_data)
|
165
165
|
@cookies << cookie_data
|
166
166
|
return nil
|
167
167
|
end
|
168
|
-
|
168
|
+
|
169
169
|
#Connects a block to a certain event.
|
170
170
|
def connect(signal, &block)
|
171
171
|
@connects[signal] = [] if !@connects.key?(signal)
|
172
172
|
@connects[signal] << block
|
173
173
|
return nil
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
def printcont(tmp_out, args = {})
|
177
177
|
if @fcgi
|
178
178
|
@fcgi.print self.print_headers
|
@@ -185,46 +185,46 @@ class Knj::Eruby
|
|
185
185
|
elsif !args[:custom_io]
|
186
186
|
$stdout = STDOUT
|
187
187
|
end
|
188
|
-
|
188
|
+
|
189
189
|
if !args[:custom_io]
|
190
190
|
print self.print_headers if !args.key?(:with_headers) or args[:with_headers]
|
191
191
|
tmp_out.rewind
|
192
192
|
print tmp_out.read
|
193
193
|
end
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
return nil
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
def load_return(filename, args = {})
|
200
200
|
if !args[:io]
|
201
201
|
retio = StringIO.new
|
202
202
|
args[:io] = retio
|
203
203
|
end
|
204
|
-
|
204
|
+
|
205
205
|
self.load_filename(filename, args)
|
206
|
-
|
206
|
+
|
207
207
|
if !args[:custom_io]
|
208
208
|
retio.rewind
|
209
209
|
return retio.read
|
210
210
|
end
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
def load_filename(filename, args = {})
|
214
214
|
begin
|
215
215
|
if !args[:custom_io]
|
216
216
|
tmp_out = StringIO.new
|
217
217
|
$stdout = tmp_out
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
self.import(filename)
|
221
|
-
|
221
|
+
|
222
222
|
if @connects["exit"]
|
223
223
|
@connects["exit"].each do |block|
|
224
224
|
block.call
|
225
225
|
end
|
226
226
|
end
|
227
|
-
|
227
|
+
|
228
228
|
self.printcont(tmp_out, args)
|
229
229
|
rescue SystemExit => e
|
230
230
|
self.printcont(tmp_out, args)
|
@@ -232,10 +232,10 @@ class Knj::Eruby
|
|
232
232
|
self.handle_error(e)
|
233
233
|
self.printcont(tmp_out, args)
|
234
234
|
end
|
235
|
-
|
235
|
+
|
236
236
|
return nil
|
237
237
|
end
|
238
|
-
|
238
|
+
|
239
239
|
#This method will handle an error without crashing simply adding the error to the print-queue.
|
240
240
|
def handle_error(e)
|
241
241
|
begin
|
@@ -250,23 +250,23 @@ class Knj::Eruby
|
|
250
250
|
#An error occurred while trying to run the on-error-block - show this as an normal error.
|
251
251
|
print "\n\n<pre>\n\n"
|
252
252
|
print "<b>#{Knj::Web.html(e.class.name)}: #{Knj::Web.html(e.message)}</b>\n\n"
|
253
|
-
|
253
|
+
|
254
254
|
e.backtrace.each do |line|
|
255
255
|
print "#{Knj::Web.html(line)}\n"
|
256
256
|
end
|
257
|
-
|
257
|
+
|
258
258
|
print "</pre>"
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
print "\n\n<pre>\n\n"
|
262
262
|
print "<b>#{Knj::Web.html(e.class.name)}: #{Knj::Web.html(e.message)}</b>\n\n"
|
263
|
-
|
263
|
+
|
264
264
|
e.backtrace.each do |line|
|
265
265
|
print "#{Knj::Web.html(line)}\n"
|
266
266
|
end
|
267
|
-
|
267
|
+
|
268
268
|
print "</pre>"
|
269
|
-
|
269
|
+
|
270
270
|
return nil
|
271
271
|
end
|
272
272
|
end
|
data/lib/knj/filesystem.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Knj::Filesystem
|
2
2
|
def self.copy(args)
|
3
|
-
FileUtils.rm(args[:to]) if args[:replace] and File.
|
3
|
+
FileUtils.rm(args[:to]) if args[:replace] and File.exist?(args[:to])
|
4
4
|
FileUtils.cp(args[:from], args[:to])
|
5
5
|
mod = File.lstat(args[:from]).mode & 0777
|
6
6
|
File.chmod(mod, args[:to])
|
@@ -2,10 +2,10 @@
|
|
2
2
|
class Knj::Gettext_threadded
|
3
3
|
#Hash that contains all translations loaded.
|
4
4
|
attr_reader :langs
|
5
|
-
|
5
|
+
|
6
6
|
#Config-hash that contains encoding and more.
|
7
7
|
attr_reader :args
|
8
|
-
|
8
|
+
|
9
9
|
#Initializes various data.
|
10
10
|
def initialize(args = {})
|
11
11
|
@args = {
|
@@ -15,32 +15,32 @@ class Knj::Gettext_threadded
|
|
15
15
|
@dirs = []
|
16
16
|
load_dir(@args["dir"]) if @args["dir"]
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
#Loads a 'locales'-directory with .mo- and .po-files and fills the '@langs'-hash.
|
20
20
|
#===Examples
|
21
21
|
# gtext.load_dir("#{File.dirname(__FILE__)}/../locales")
|
22
22
|
def load_dir(dir)
|
23
23
|
@dirs << dir
|
24
24
|
check_folders = ["LC_MESSAGES", "LC_ALL"]
|
25
|
-
|
25
|
+
|
26
26
|
Dir.foreach(dir) do |file|
|
27
27
|
fn = "#{dir}/#{file}"
|
28
28
|
if File.directory?(fn) and file.match(/^[a-z]{2}_[A-Z]{2}$/)
|
29
29
|
@langs[file] = {} if !@langs[file]
|
30
|
-
|
30
|
+
|
31
31
|
check_folders.each do |fname|
|
32
32
|
fpath = "#{dir}/#{file}/#{fname}"
|
33
|
-
|
34
|
-
if File.
|
33
|
+
|
34
|
+
if File.exist?(fpath) and File.directory?(fpath)
|
35
35
|
Dir.foreach(fpath) do |pofile|
|
36
36
|
if pofile.match(/\.po$/)
|
37
37
|
pofn = "#{dir}/#{file}/#{fname}/#{pofile}"
|
38
|
-
|
38
|
+
|
39
39
|
cont = nil
|
40
40
|
File.open(pofn, "r", {:encoding => @args[:encoding]}) do |fp|
|
41
41
|
cont = fp.read.encode("utf-8")
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
cont.scan(/msgid\s+\"(.+)\"(\r|)\nmsgstr\s+\"(.+)\"(\r|)\n(\r|)\n/) do |match|
|
45
45
|
@langs[file][match[0]] = match[2].to_s.encode("utf-8")
|
46
46
|
end
|
@@ -51,7 +51,7 @@ class Knj::Gettext_threadded
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
#Translates a given string to a given locale from the read .po-files.
|
56
56
|
#===Examples
|
57
57
|
# str = "Hello" #=> "Hello"
|
@@ -59,40 +59,40 @@ class Knj::Gettext_threadded
|
|
59
59
|
def trans(locale, str)
|
60
60
|
locale = locale.to_s
|
61
61
|
str = str.to_s
|
62
|
-
|
62
|
+
|
63
63
|
if !@langs.key?(locale)
|
64
64
|
raise "Locale was not found: '#{locale}' in '#{@langs.keys.join(", ")}'."
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
return str if !@langs[locale].key?(str)
|
68
68
|
return @langs[locale][str]
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
#This function can be used to make your string be recognized by gettext tools.
|
72
72
|
def gettext(str, locale)
|
73
73
|
return trans(locale, str)
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
#Returns a hash with the language ID string as key and the language human-readable-title as value.
|
77
77
|
def lang_opts
|
78
78
|
langs = {}
|
79
79
|
@langs.keys.sort.each do |lang|
|
80
80
|
title = nil
|
81
|
-
|
81
|
+
|
82
82
|
@dirs.each do |dir|
|
83
83
|
title_file_path = "#{dir}/#{lang}/title.txt"
|
84
|
-
if File.
|
84
|
+
if File.exist?(title_file_path)
|
85
85
|
title = File.read(title_file_path, {:encoding => @args[:encoding]}).to_s.strip
|
86
86
|
else
|
87
87
|
title = lang.to_s.strip
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
break if title
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
langs[lang] = title
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
return langs
|
97
97
|
end
|
98
98
|
end
|