knjrbfw 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +29 -8
  3. data/lib/knj/arrayext.rb +206 -153
  4. data/lib/knj/autoload/backups/ping.rb +2 -2
  5. data/lib/knj/autoload/erubis.rb +3 -3
  6. data/lib/knj/autoload/facets_dictionary.rb +2 -2
  7. data/lib/knj/autoload/gettext.rb +3 -3
  8. data/lib/knj/autoload/gtk2.rb +1 -1
  9. data/lib/knj/autoload/json.rb +14 -0
  10. data/lib/knj/autoload/magick.rb +3 -3
  11. data/lib/knj/autoload/mysql.rb +3 -3
  12. data/lib/knj/autoload/parsedate.rb +1 -1
  13. data/lib/knj/autoload/ping.rb +2 -2
  14. data/lib/knj/autoload/rexml.rb +5 -5
  15. data/lib/knj/autoload/soap.rb +1 -1
  16. data/lib/knj/autoload/sqlite3.rb +3 -3
  17. data/lib/knj/autoload/tmail.rb +3 -3
  18. data/lib/knj/autoload/xmlsimple.rb +3 -3
  19. data/lib/knj/autoload/zip.rb +3 -3
  20. data/lib/knj/autoload.rb +87 -81
  21. data/lib/knj/cmd_gen.rb +19 -19
  22. data/lib/knj/cmd_parser.rb +59 -0
  23. data/lib/knj/compiler.rb +34 -34
  24. data/lib/knj/cpufreq.rb +37 -37
  25. data/lib/knj/csv.rb +20 -0
  26. data/lib/knj/datarow.rb +406 -239
  27. data/lib/knj/datarow_custom.rb +124 -0
  28. data/lib/knj/datestamp.rb +89 -89
  29. data/lib/knj/datet.rb +550 -454
  30. data/lib/knj/db.rb +1 -0
  31. data/lib/knj/degulesider.rb +42 -44
  32. data/lib/knj/erb/erb.rb +5 -5
  33. data/lib/knj/erb/erb_cache_clean.rb +10 -10
  34. data/lib/knj/erb/erb_fcgi.rb +32 -32
  35. data/lib/knj/erb/erb_fcgi_1.9.rb +32 -32
  36. data/lib/knj/erb/erb_fcgi_jruby.rb +2 -2
  37. data/lib/knj/erb/erb_jruby.rb +5 -5
  38. data/lib/knj/erb/include.rb +243 -243
  39. data/lib/knj/errors.rb +19 -18
  40. data/lib/knj/eruby.rb +12 -10
  41. data/lib/knj/event_filemod.rb +31 -31
  42. data/lib/knj/event_handler.rb +73 -67
  43. data/lib/knj/exchangerates.rb +37 -37
  44. data/lib/knj/facebook_connect.rb +95 -18
  45. data/lib/knj/filesystem.rb +6 -6
  46. data/lib/knj/fs/drivers/filesystem.rb +12 -12
  47. data/lib/knj/fs/drivers/ftp.rb +31 -31
  48. data/lib/knj/fs/drivers/ssh.rb +26 -26
  49. data/lib/knj/fs/fs.rb +31 -31
  50. data/lib/knj/gettext_fallback.rb +15 -15
  51. data/lib/knj/gettext_threadded.rb +75 -75
  52. data/lib/knj/google_sitemap.rb +53 -53
  53. data/lib/knj/gtk2.rb +272 -272
  54. data/lib/knj/gtk2_cb.rb +80 -80
  55. data/lib/knj/gtk2_menu.rb +55 -55
  56. data/lib/knj/gtk2_statuswindow.rb +62 -62
  57. data/lib/knj/gtk2_tv.rb +58 -58
  58. data/lib/knj/hash_methods.rb +27 -36
  59. data/lib/knj/http.rb +189 -167
  60. data/lib/knj/http2.rb +259 -53
  61. data/lib/knj/image.rb +2 -2
  62. data/lib/knj/includes/appserver_cli.rb +18 -18
  63. data/lib/knj/includes/require_info.rb +15 -0
  64. data/lib/knj/ip2location.rb +20 -20
  65. data/lib/knj/ironruby-gtk2/button.rb +14 -14
  66. data/lib/knj/ironruby-gtk2/dialog.rb +42 -42
  67. data/lib/knj/ironruby-gtk2/entry.rb +4 -4
  68. data/lib/knj/ironruby-gtk2/gdk_event.rb +1 -1
  69. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +11 -11
  70. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +9 -9
  71. data/lib/knj/ironruby-gtk2/gladexml.rb +102 -102
  72. data/lib/knj/ironruby-gtk2/glib.rb +13 -13
  73. data/lib/knj/ironruby-gtk2/gtk2.rb +121 -121
  74. data/lib/knj/ironruby-gtk2/gtk_builder.rb +29 -29
  75. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +3 -3
  76. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +17 -17
  77. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +3 -3
  78. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +16 -16
  79. data/lib/knj/ironruby-gtk2/gtk_menu.rb +3 -3
  80. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +2 -2
  81. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +3 -3
  82. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +22 -22
  83. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +11 -11
  84. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +17 -17
  85. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +30 -30
  86. data/lib/knj/ironruby-gtk2/iconsize.rb +1 -1
  87. data/lib/knj/ironruby-gtk2/image.rb +13 -13
  88. data/lib/knj/ironruby-gtk2/label.rb +17 -17
  89. data/lib/knj/ironruby-gtk2/stock.rb +2 -2
  90. data/lib/knj/ironruby-gtk2/tests/test_2.rb +14 -14
  91. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +37 -37
  92. data/lib/knj/ironruby-gtk2/vbox.rb +3 -3
  93. data/lib/knj/ironruby-gtk2/window.rb +18 -18
  94. data/lib/knj/jruby-gtk2/builder/test_builder.rb +11 -11
  95. data/lib/knj/jruby-gtk2/builder.rb +25 -25
  96. data/lib/knj/jruby-gtk2/cellrenderertext.rb +10 -10
  97. data/lib/knj/jruby-gtk2/checkbutton.rb +1 -1
  98. data/lib/knj/jruby-gtk2/combobox.rb +27 -27
  99. data/lib/knj/jruby-gtk2/dialog.rb +40 -40
  100. data/lib/knj/jruby-gtk2/eventbutton.rb +19 -19
  101. data/lib/knj/jruby-gtk2/gladexml.rb +97 -97
  102. data/lib/knj/jruby-gtk2/gtk2.rb +203 -203
  103. data/lib/knj/jruby-gtk2/hbox.rb +8 -8
  104. data/lib/knj/jruby-gtk2/iconsize.rb +3 -3
  105. data/lib/knj/jruby-gtk2/image.rb +8 -8
  106. data/lib/knj/jruby-gtk2/liststore.rb +54 -54
  107. data/lib/knj/jruby-gtk2/menu.rb +35 -35
  108. data/lib/knj/jruby-gtk2/progressbar.rb +10 -10
  109. data/lib/knj/jruby-gtk2/statusicon.rb +3 -3
  110. data/lib/knj/jruby-gtk2/stock.rb +6 -6
  111. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +36 -36
  112. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +3 -3
  113. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +2 -2
  114. data/lib/knj/jruby-gtk2/treeview.rb +88 -88
  115. data/lib/knj/jruby-gtk2/vbox.rb +10 -10
  116. data/lib/knj/jruby-gtk2/window.rb +7 -7
  117. data/lib/knj/jruby_compiler.rb +12 -12
  118. data/lib/knj/knj.rb +12 -11
  119. data/lib/knj/knj_controller.rb +13 -8
  120. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +499 -316
  121. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +127 -125
  122. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +43 -25
  123. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +316 -241
  124. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +12 -0
  125. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +146 -146
  126. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +24 -24
  127. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +283 -283
  128. data/lib/knj/knjdb/libknjdb.rb +96 -52
  129. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +78 -78
  130. data/lib/knj/knjdb/libknjdb_row.rb +147 -147
  131. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +61 -61
  132. data/lib/knj/knjdb/revision.rb +262 -0
  133. data/lib/knj/libqt.rb +69 -69
  134. data/lib/knj/libqt_window.rb +8 -8
  135. data/lib/knj/locales.rb +62 -52
  136. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +54 -54
  137. data/lib/knj/mail.rb +73 -73
  138. data/lib/knj/mailobj.rb +82 -80
  139. data/lib/knj/mount.rb +113 -113
  140. data/lib/knj/notify.rb +11 -11
  141. data/lib/knj/nvidia_settings.rb +43 -43
  142. data/lib/knj/objects/objects_sqlhelper.rb +474 -0
  143. data/lib/knj/objects.rb +569 -793
  144. data/lib/knj/opts.rb +38 -38
  145. data/lib/knj/os.rb +176 -158
  146. data/lib/knj/php.rb +853 -683
  147. data/lib/knj/php_parser/arguments.rb +3 -3
  148. data/lib/knj/php_parser/functions.rb +95 -95
  149. data/lib/knj/php_parser/php_parser.rb +16 -16
  150. data/lib/knj/php_parser/tests/test.rb +6 -6
  151. data/lib/knj/php_parser/tests/test_function_run.rb +6 -6
  152. data/lib/knj/power_manager.rb +29 -29
  153. data/lib/knj/process.rb +457 -0
  154. data/lib/knj/process_meta.rb +400 -0
  155. data/lib/knj/rand.rb +8 -8
  156. data/lib/knj/retry.rb +69 -69
  157. data/lib/knj/rhodes/delegate.rb +414 -0
  158. data/lib/knj/rhodes/rhodes.rb +114 -40
  159. data/lib/knj/rhodes/weakref.rb +80 -0
  160. data/lib/knj/rsvgbin.rb +18 -18
  161. data/lib/knj/scripts/degulesider.rb +2 -2
  162. data/lib/knj/scripts/filesearch.rb +35 -35
  163. data/lib/knj/scripts/ip2location.rb +2 -2
  164. data/lib/knj/scripts/keepalive.rb +2 -2
  165. data/lib/knj/scripts/php_to_rb_helper.rb +376 -0
  166. data/lib/knj/scripts/process_meta_exec.rb +104 -0
  167. data/lib/knj/scripts/svn_merge.rb +21 -21
  168. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +26 -26
  169. data/lib/knj/sms.rb +52 -52
  170. data/lib/knj/sshrobot/sshrobot.rb +90 -88
  171. data/lib/knj/sshrobot.rb +1 -0
  172. data/lib/knj/strings.rb +186 -74
  173. data/lib/knj/sysuser.rb +25 -25
  174. data/lib/knj/table_writer.rb +97 -0
  175. data/lib/knj/tests/compiler/compiler_test.rb +2 -2
  176. data/lib/knj/tests/test_degulesider.rb +1 -1
  177. data/lib/knj/tests/test_http2_proxy.rb +26 -0
  178. data/lib/knj/tests/test_mount.rb +9 -9
  179. data/lib/knj/tests/test_retry.rb +17 -17
  180. data/lib/knj/thread.rb +23 -24
  181. data/lib/knj/thread2.rb +45 -45
  182. data/lib/knj/threadhandler.rb +135 -102
  183. data/lib/knj/threadpool.rb +195 -145
  184. data/lib/knj/translations.rb +128 -119
  185. data/lib/knj/unix_proc.rb +80 -80
  186. data/lib/knj/web.rb +947 -881
  187. data/lib/knj/webscripts/image.rhtml +142 -67
  188. data/lib/knj/win.rb +2 -2
  189. data/lib/knj/win_registry.rb +58 -58
  190. data/lib/knj/win_tightvnc.rb +125 -125
  191. data/lib/knj/wref.rb +104 -0
  192. data/lib/knj/x11vnc.rb +46 -46
  193. data/lib/knj/youtube.rb +33 -36
  194. data/lib/knjrbfw.rb +1 -0
  195. data/spec/cmd_parser_spec.rb +25 -0
  196. data/spec/db_spec.rb +40 -0
  197. data/spec/db_spec_encoding_test_file.txt +1 -0
  198. data/spec/http2_spec.rb +37 -0
  199. data/spec/knjrbfw_spec.rb +17 -15
  200. data/spec/php_spec.rb +69 -0
  201. data/spec/process_meta_spec.rb +150 -0
  202. data/spec/process_spec.rb +107 -0
  203. data/spec/strings_spec.rb +21 -0
  204. data/spec/web_spec.rb +16 -0
  205. metadata +42 -21
  206. data/lib/knj/autoload/json_autoload.rb +0 -7
  207. data/lib/knj/autoload/twitter.rb +0 -2
  208. data/lib/knj/ext/webrick.rb +0 -31
  209. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  210. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  211. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
data/lib/knj/web.rb CHANGED
@@ -1,214 +1,214 @@
1
1
  class Knj::Web
2
- attr_reader :session, :cgi, :data
3
-
4
- def initialize(args = {})
5
- @args = Knj::ArrayExt.hash_sym(args)
6
- @db = @args[:db] if @args[:db]
7
- @args[:tmp] = "/tmp" if !@args[:tmp]
8
-
9
- raise "No ID was given." if !@args[:id]
10
- raise "No DB was given." if !@args[:db]
11
-
12
- if @args[:cgi]
13
- @cgi = @args[:cgi]
14
- elsif $_CGI
15
- @cgi = $_CGI
16
- else
17
- if ENV["HTTP_HOST"] or $knj_eruby or Knj::Php.class_exists("Apache")
18
- @cgi = CGI.new
19
- end
20
- end
21
-
22
- $_CGI = @cgi if !$_CGI
23
- self.read_cgi
24
-
25
- if $_FCGI
26
- KnjEruby.connect("exit") do
27
- @session.close
28
-
29
- @post = nil
30
- @get = nil
31
- @server = nil
32
- @cookie = nil
33
-
34
- $_POST = nil
35
- $_GET = nil
36
- $_SERVER = nil
37
- $_COOKIE = nil
38
- end
39
- else
40
- Kernel.at_exit do
41
- @session.close
42
-
43
- @post = nil
44
- @get = nil
45
- @server = nil
46
- @cookie = nil
47
-
48
- $_POST = nil
49
- $_GET = nil
50
- $_SERVER = nil
51
- $_COOKIE = nil
52
- end
53
- end
54
- end
55
-
56
- def read_cgi(args = {})
57
- args.each do |key, value|
58
- if key == :cgi
59
- @cgi = value
60
- else
61
- raise "No such key: #{key.to_s}"
62
- end
63
- end
64
-
65
- if $_FCGI_COUNT and $_FCGI and $_CGI
66
- @server = {}
67
- $_CGI.env_table.each do |key, value|
68
- @server[key] = value
69
- end
70
- elsif $_CGI and ENV["HTTP_HOST"] and ENV["REMOTE_ADDR"]
71
- @server = {}
72
- ENV.each do |key, value|
73
- @server[key] = value
74
- end
75
- elsif Knj::Php.class_exists("Apache")
76
- @server = {
77
- "HTTP_HOST" => Apache.request.hostname,
78
- "HTTP_USER_AGENT" => Apache.request.headers_in["User-Agent"],
79
- "REMOTE_ADDR" => Apache.request.remote_host(1),
80
- "REQUEST_URI" => Apache.request.unparsed_uri
81
- }
82
- else
83
- @server = {}
84
- end
85
-
86
- @files = {}
87
- @post = {}
88
- if @cgi and @cgi.request_method == "POST"
89
- @cgi.params.each do |pair|
90
- do_files = false
91
- isstring = true
92
- varname = pair[0]
93
- stringparse = nil
94
-
95
- if pair[1][0].class.name == "Tempfile"
96
- if varname[0..3] == "file"
97
- isstring = false
98
- do_files = true
99
-
100
- if pair[1][0].size > 0
101
- stringparse = {
102
- "name" => pair[1][0].original_filename,
103
- "tmp_name" => pair[1][0].path,
104
- "size" => pair[1][0].size,
105
- "error" => 0
106
- }
107
-
108
- stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
109
- end
110
- else
111
- stringparse = File.read(pair[1][0].path)
112
- end
113
- elsif pair[1][0].is_a?(StringIO)
114
- if varname[0..3] == "file"
115
- tmpname = @args[:tmp] + "/knj_web_upload_#{Time.now.to_f.to_s}_#{rand(1000).to_s.untaint}"
116
- isstring = false
117
- do_files = true
118
- cont = pair[1][0].string
119
- Knj::Php.file_put_contents(tmpname, cont.to_s)
120
-
121
- if cont.length > 0
122
- stringparse = {
123
- "tmp_name" => tmpname,
124
- "size" => cont.length,
125
- "error" => 0
126
- }
127
-
128
- stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
129
- end
130
- else
131
- stringparse = pair[1][0].string
132
- end
133
- else
134
- stringparse = pair[1][0]
135
- end
136
-
137
- if stringparse
138
- if !do_files
139
- if isstring
140
- Knj::Web.parse_name(@post, varname, stringparse)
141
- else
142
- @post[varname] = stringparse
143
- end
144
- else
145
- if isstring
146
- Knj::Web.parse_name(@files, varname, stringparse)
147
- else
148
- @files[varname] = stringparse
149
- end
150
- end
151
- end
152
- end
153
- end
154
-
155
-
156
- if @cgi and @cgi.query_string
157
- @get = Knj::Web.parse_urlquery(@cgi.query_string)
158
- else
159
- @get = {}
160
- end
161
-
162
- @cookie = {}
163
- if @cgi
164
- @cgi.cookies.each do |key, value|
165
- @cookie[key] = value[0]
166
- end
167
- end
168
-
169
- self.global_params if @args[:globals]
170
-
171
- if @cookie[@args[:id]] and (sdata = @args[:db].single(:sessions, :id => @cookie[@args[:id]]))
172
- @data = Knj::ArrayExt.hash_sym(sdata)
173
-
174
- if @data
175
- if @data[:user_agent] != @server["HTTP_USER_AGENT"] or @data[:ip] != @server["REMOTE_ADDR"]
176
- @data = nil
177
- else
178
- @db.update(:sessions, {"last_url" => @server["REQUEST_URI"].to_s, "date_active" => Time.new}, {"id" => @data[:id]})
179
- session_id = @args[:id] + "_" + @data[:id]
180
- end
181
- end
182
- end
183
-
184
- if !@data or !session_id
185
- @db.insert(:sessions,
186
- :date_start => Time.new,
187
- :date_active => Time.new,
188
- :user_agent => @server["HTTP_USER_AGENT"],
189
- :ip => @server["REMOTE_ADDR"],
190
- :last_url => @server["REQUEST_URI"].to_s
191
- )
192
-
193
- @data = Knj::ArrayExt.hash_sym(@db.single(:sessions, :id => @db.last_id))
194
- session_id = @args[:id] + "_" + @data[:id]
195
- Knj::Php.setcookie(@args[:id], @data[:id])
196
- end
197
-
198
- require "cgi/session"
199
- require "cgi/session/pstore"
200
- @session = CGI::Session.new(@session, "database_manager" => CGI::Session::PStore, "session_id" => session_id, "session_path" => @args[:tmp])
201
- end
202
-
203
- def [](key)
204
- return @session[key.to_sym]
205
- end
206
-
207
- def []=(key, value)
208
- return @session[key.to_sym] = value
209
- end
210
-
211
- def self.parse_cookies(str)
2
+ attr_reader :session, :cgi, :data
3
+
4
+ def initialize(args = {})
5
+ @args = Knj::ArrayExt.hash_sym(args)
6
+ @db = @args[:db] if @args[:db]
7
+ @args[:tmp] = "/tmp" if !@args[:tmp]
8
+
9
+ raise "No ID was given." if !@args[:id]
10
+ raise "No DB was given." if !@args[:db]
11
+
12
+ if @args[:cgi]
13
+ @cgi = @args[:cgi]
14
+ elsif $_CGI
15
+ @cgi = $_CGI
16
+ else
17
+ if ENV["HTTP_HOST"] or $knj_eruby or Knj::Php.class_exists("Apache")
18
+ @cgi = CGI.new
19
+ end
20
+ end
21
+
22
+ $_CGI = @cgi if !$_CGI
23
+ self.read_cgi
24
+
25
+ if $_FCGI
26
+ KnjEruby.connect("exit") do
27
+ @session.close
28
+
29
+ @post = nil
30
+ @get = nil
31
+ @server = nil
32
+ @cookie = nil
33
+
34
+ $_POST = nil
35
+ $_GET = nil
36
+ $_SERVER = nil
37
+ $_COOKIE = nil
38
+ end
39
+ else
40
+ Kernel.at_exit do
41
+ @session.close
42
+
43
+ @post = nil
44
+ @get = nil
45
+ @server = nil
46
+ @cookie = nil
47
+
48
+ $_POST = nil
49
+ $_GET = nil
50
+ $_SERVER = nil
51
+ $_COOKIE = nil
52
+ end
53
+ end
54
+ end
55
+
56
+ def read_cgi(args = {})
57
+ args.each do |key, value|
58
+ if key == :cgi
59
+ @cgi = value
60
+ else
61
+ raise "No such key: #{key.to_s}"
62
+ end
63
+ end
64
+
65
+ if $_FCGI_COUNT and $_FCGI and $_CGI
66
+ @server = {}
67
+ $_CGI.env_table.each do |key, value|
68
+ @server[key] = value
69
+ end
70
+ elsif $_CGI and ENV["HTTP_HOST"] and ENV["REMOTE_ADDR"]
71
+ @server = {}
72
+ ENV.each do |key, value|
73
+ @server[key] = value
74
+ end
75
+ elsif Knj::Php.class_exists("Apache")
76
+ @server = {
77
+ "HTTP_HOST" => Apache.request.hostname,
78
+ "HTTP_USER_AGENT" => Apache.request.headers_in["User-Agent"],
79
+ "REMOTE_ADDR" => Apache.request.remote_host(1),
80
+ "REQUEST_URI" => Apache.request.unparsed_uri
81
+ }
82
+ else
83
+ @server = {}
84
+ end
85
+
86
+ @files = {}
87
+ @post = {}
88
+ if @cgi and @cgi.request_method == "POST"
89
+ @cgi.params.each do |pair|
90
+ do_files = false
91
+ isstring = true
92
+ varname = pair[0]
93
+ stringparse = nil
94
+
95
+ if pair[1][0].class.name == "Tempfile"
96
+ if varname[0..3] == "file"
97
+ isstring = false
98
+ do_files = true
99
+
100
+ if pair[1][0].size > 0
101
+ stringparse = {
102
+ "name" => pair[1][0].original_filename,
103
+ "tmp_name" => pair[1][0].path,
104
+ "size" => pair[1][0].size,
105
+ "error" => 0
106
+ }
107
+
108
+ stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
109
+ end
110
+ else
111
+ stringparse = File.read(pair[1][0].path)
112
+ end
113
+ elsif pair[1][0].is_a?(StringIO)
114
+ if varname[0..3] == "file"
115
+ tmpname = @args[:tmp] + "/knj_web_upload_#{Time.now.to_f.to_s}_#{rand(1000).to_s.untaint}"
116
+ isstring = false
117
+ do_files = true
118
+ cont = pair[1][0].string
119
+ Knj::Php.file_put_contents(tmpname, cont.to_s)
120
+
121
+ if cont.length > 0
122
+ stringparse = {
123
+ "tmp_name" => tmpname,
124
+ "size" => cont.length,
125
+ "error" => 0
126
+ }
127
+
128
+ stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
129
+ end
130
+ else
131
+ stringparse = pair[1][0].string
132
+ end
133
+ else
134
+ stringparse = pair[1][0]
135
+ end
136
+
137
+ if stringparse
138
+ if !do_files
139
+ if isstring
140
+ Knj::Web.parse_name(@post, varname, stringparse)
141
+ else
142
+ @post[varname] = stringparse
143
+ end
144
+ else
145
+ if isstring
146
+ Knj::Web.parse_name(@files, varname, stringparse)
147
+ else
148
+ @files[varname] = stringparse
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+
156
+ if @cgi and @cgi.query_string
157
+ @get = Knj::Web.parse_urlquery(@cgi.query_string)
158
+ else
159
+ @get = {}
160
+ end
161
+
162
+ @cookie = {}
163
+ if @cgi
164
+ @cgi.cookies.each do |key, value|
165
+ @cookie[key] = value[0]
166
+ end
167
+ end
168
+
169
+ self.global_params if @args[:globals]
170
+
171
+ if @cookie[@args[:id]] and (sdata = @args[:db].single(:sessions, :id => @cookie[@args[:id]]))
172
+ @data = Knj::ArrayExt.hash_sym(sdata)
173
+
174
+ if @data
175
+ if @data[:user_agent] != @server["HTTP_USER_AGENT"] or @data[:ip] != @server["REMOTE_ADDR"]
176
+ @data = nil
177
+ else
178
+ @db.update(:sessions, {"last_url" => @server["REQUEST_URI"].to_s, "date_active" => Time.new}, {"id" => @data[:id]})
179
+ session_id = @args[:id] + "_" + @data[:id]
180
+ end
181
+ end
182
+ end
183
+
184
+ if !@data or !session_id
185
+ @db.insert(:sessions,
186
+ :date_start => Time.new,
187
+ :date_active => Time.new,
188
+ :user_agent => @server["HTTP_USER_AGENT"],
189
+ :ip => @server["REMOTE_ADDR"],
190
+ :last_url => @server["REQUEST_URI"].to_s
191
+ )
192
+
193
+ @data = Knj::ArrayExt.hash_sym(@db.single(:sessions, :id => @db.last_id))
194
+ session_id = @args[:id] + "_" + @data[:id]
195
+ Knj::Php.setcookie(@args[:id], @data[:id])
196
+ end
197
+
198
+ require "cgi/session"
199
+ require "cgi/session/pstore"
200
+ @session = CGI::Session.new(@session, "database_manager" => CGI::Session::PStore, "session_id" => session_id, "session_path" => @args[:tmp])
201
+ end
202
+
203
+ def [](key)
204
+ return @session[key.to_sym]
205
+ end
206
+
207
+ def []=(key, value)
208
+ return @session[key.to_sym] = value
209
+ end
210
+
211
+ def self.parse_cookies(str)
212
212
  ret = {}
213
213
 
214
214
  str.split(/;\s*/).each do |cookie_str|
@@ -216,13 +216,13 @@ class Knj::Web
216
216
  match = cookie_str.match(/^(.*?)=(.*)$/)
217
217
  end
218
218
 
219
- ret[self.urldec(match[1])] = self.urldec(match[2])
219
+ ret[self.urldec(match[1])] = self.urldec(match[2]) if match
220
220
  end
221
221
 
222
222
  return ret
223
- end
224
-
225
- def self.parse_set_cookies(str)
223
+ end
224
+
225
+ def self.parse_set_cookies(str)
226
226
  str = String.new(str.to_s)
227
227
  return [] if str.length <= 0
228
228
  args = {}
@@ -241,9 +241,9 @@ class Knj::Web
241
241
  end
242
242
 
243
243
  return [args]
244
- end
245
-
246
- def self.cookie_str(cookie_data)
244
+ end
245
+
246
+ def self.cookie_str(cookie_data)
247
247
  raise "Not a hash: '#{cookie_data.class.name}', '#{cookie_data}'." unless cookie_data.is_a?(Hash)
248
248
  cookiestr = "#{self.urlenc(cookie_data["name"])}=#{self.urlenc(cookie_data["value"])}"
249
249
 
@@ -251,371 +251,395 @@ class Knj::Web
251
251
  next if key == "name" or key == "value"
252
252
 
253
253
  if key.to_s.downcase == "expires" and val.is_a?(Time)
254
- cookiestr += "; Expires=#{val.httpdate}"
254
+ cookiestr << "; Expires=#{val.httpdate}"
255
255
  else
256
- cookiestr += "; #{key}=#{val}"
256
+ cookiestr << "; #{key}=#{val}"
257
257
  end
258
258
  end
259
259
 
260
260
  return cookiestr
261
- end
262
-
263
- def self.parse_urlquery(querystr, args = {})
264
- get = {}
265
- querystr.to_s.split("&").each do |value|
266
- pos = value.index("=")
267
-
268
- if pos != nil
269
- name = value[0..pos-1]
270
- name = name.to_sym if args[:syms]
271
- valuestr = value.slice(pos+1..-1)
272
- Knj::Web.parse_name(get, self.urldec(name), valuestr, args)
273
- end
274
- end
275
-
276
- return get
277
- end
278
-
279
- def self.parse_secname(seton, secname, args)
280
- secname_empty = false
281
- if secname.length <= 0
282
- secname_empty = true
283
- try = 0
284
-
285
- loop do
286
- if !seton.key?(try)
287
- break
288
- else
289
- try += 1
290
- end
291
- end
292
-
293
- secname = try
294
- else
295
- secname = secname.to_i if Knj::Php.is_numeric(secname)
296
- end
297
-
298
- secname = secname.to_sym if args[:syms] and secname.is_a?(String)
299
-
300
- return [secname, secname_empty]
301
- end
302
-
303
- def self.parse_name(seton, varname, value, args = {})
304
- if value.respond_to?(:filename) and value.filename
305
- realvalue = value
306
- else
307
- realvalue = value.to_s
308
- realvalue = self.urldec(realvalue) if args[:urldecode]
309
- realvalue = realvalue.force_encoding("utf-8") if args[:force_utf8] if realvalue.respond_to?(:force_encoding)
310
- end
311
-
312
- if varname and varname.index("[") != nil
313
- if match = varname.match(/\[(.*?)\]/)
314
- namepos = varname.index(match[0])
315
- name = varname.slice(0..namepos - 1)
316
- name = name.to_sym if args[:syms]
317
- seton[name] = {} if !seton.key?(name)
318
-
319
- secname, secname_empty = Knj::Web.parse_secname(seton[name], match[1], args)
320
-
321
- valuefrom = namepos + secname.to_s.length + 2
322
- restname = varname.slice(valuefrom..-1)
323
-
324
- if restname and restname.index("[") != nil
325
- seton[name][secname] = {} if !seton[name].key?(secname)
326
- Knj::Web.parse_name_second(seton[name][secname], restname, value, args)
327
- else
328
- seton[name][secname] = realvalue
329
- end
330
- else
331
- seton[varname][match[1]] = realvalue
332
- end
333
- else
334
- seton[varname] = realvalue
335
- end
336
- end
337
-
338
- def self.parse_name_second(seton, varname, value, args = {})
339
- if value.respond_to?(:filename) and value.filename
340
- realvalue = value
341
- else
342
- realvalue = value.to_s
343
- realvalue = realvalue.force_encoding("utf-8") if args[:force_utf8]
344
- end
345
-
346
- match = varname.match(/^\[(.*?)\]/)
347
- if match
348
- namepos = varname.index(match[0])
349
- name = match[1]
350
- secname, secname_empty = Knj::Web.parse_secname(seton, match[1], args)
351
-
352
- valuefrom = namepos + match[1].length + 2
353
- restname = varname.slice(valuefrom..-1)
354
-
355
- if restname and restname.index("[") != nil
356
- seton[secname] = {} if !seton.key?(secname)
357
- Knj::Web.parse_name_second(seton[secname], restname, value, args)
358
- else
359
- seton[secname] = realvalue
360
- end
361
- else
362
- seton[varname] = realvalue
363
- end
364
- end
365
-
366
- def global_params
367
- $_POST = @post
368
- $_GET = @get
369
- $_COOKIE = @cookie
370
- $_FILES = @files
371
- $_SERVER = @server
372
- end
373
-
374
- def destroy
375
- @cgi = nil
376
- @post = nil
377
- @get = nil
378
- @session = nil
379
- @args = nil
380
- end
381
-
382
- def self.require_eruby(filepath)
383
- cont = File.read(filepath).untaint
384
- parse = Erubis.Eruby.new(cont)
385
- eval(parse.src.to_s)
386
- end
387
-
388
- def self.alert(string)
389
- @alert_sent = true
390
- html = "<script type=\"text/javascript\">alert(\"#{Knj::Strings.js_safe(string.to_s)}\");</script>"
391
- print html
392
- end
393
-
394
- def self.redirect(string, args = {})
395
- do_js = true
396
-
397
- #Header way
398
- if !@alert_sent
399
- if args[:perm]
400
- Knj::Php.header("Status: 301 Moved Permanently")
401
- else
402
- Knj::Php.header("Status: 303 See Other")
403
- end
404
-
405
- Knj::Php.header("Location: #{string}")
406
- end
407
-
408
- print "<script type=\"text/javascript\">location.href=\"#{string}\";</script>" if do_js
409
- exit
410
- end
411
-
412
- def self.back
413
- print "<script type=\"text/javascript\">history.go(-1);</script>"
414
- exit
415
- end
416
-
417
- def self.checkval(value, val1, val2 = nil)
418
- if val2 != nil
419
- if !value or value == "" or value == "false"
420
- return val2
421
- else
422
- return val1
423
- end
424
- else
425
- if !value or value == "" or value == "false"
426
- return val1
427
- else
428
- return value
429
- end
430
- end
431
- end
432
-
433
- def self.inputs(arr)
434
- html = ""
435
- arr.each do |args|
436
- html += self.input(args)
437
- end
438
-
439
- return html
440
- end
441
-
442
- def self.style_html(css)
261
+ end
262
+
263
+ def self.parse_urlquery(querystr, args = {})
264
+ get = {}
265
+ querystr.to_s.split("&").each do |value|
266
+ pos = value.index("=")
267
+
268
+ if pos != nil
269
+ name = value[0..pos-1]
270
+ name = name.to_sym if args[:syms]
271
+ valuestr = value.slice(pos+1..-1)
272
+ Knj::Web.parse_name(get, self.urldec(name), valuestr, args)
273
+ end
274
+ end
275
+
276
+ return get
277
+ end
278
+
279
+ def self.parse_secname(seton, secname, args)
280
+ secname_empty = false
281
+ if secname.length <= 0
282
+ secname_empty = true
283
+ try = 0
284
+
285
+ loop do
286
+ if !seton.key?(try.to_s)
287
+ break
288
+ else
289
+ try += 1
290
+ end
291
+ end
292
+
293
+ secname = try.to_s
294
+ end
295
+
296
+ secname = secname.to_sym if args[:syms] and secname.is_a?(String) and !Knj::Php.is_numeric(secname)
297
+ return [secname, secname_empty]
298
+ end
299
+
300
+ def self.parse_name(seton, varname, value, args = {})
301
+ if value.respond_to?(:filename) and value.filename
302
+ realvalue = value
303
+ else
304
+ realvalue = value.to_s
305
+ realvalue = self.urldec(realvalue) if args[:urldecode]
306
+ realvalue = realvalue.force_encoding("utf-8") if args[:force_utf8] if realvalue.respond_to?(:force_encoding)
307
+ end
308
+
309
+ if varname and varname.index("[") != nil and match = varname.match(/\[(.*?)\]/)
310
+ namepos = varname.index(match[0])
311
+ name = varname.slice(0..namepos - 1)
312
+ name = name.to_sym if args[:syms]
313
+ seton[name] = {} if !seton.key?(name)
314
+
315
+ secname, secname_empty = Knj::Web.parse_secname(seton[name], match[1], args)
316
+
317
+ valuefrom = namepos + secname.to_s.length + 2
318
+ restname = varname.slice(valuefrom..-1)
319
+
320
+ if restname and restname.index("[") != nil
321
+ seton[name][secname] = {} if !seton[name].key?(secname)
322
+ Knj::Web.parse_name_second(seton[name][secname], restname, value, args)
323
+ else
324
+ seton[name][secname] = realvalue
325
+ end
326
+ else
327
+ seton[varname] = realvalue
328
+ end
329
+ end
330
+
331
+ def self.parse_name_second(seton, varname, value, args = {})
332
+ if value.respond_to?(:filename) and value.filename
333
+ realvalue = value
334
+ else
335
+ realvalue = value.to_s
336
+ realvalue = realvalue.force_encoding("utf-8") if args[:force_utf8]
337
+ end
338
+
339
+ match = varname.match(/^\[(.*?)\]/)
340
+ if match
341
+ namepos = varname.index(match[0])
342
+ name = match[1]
343
+ secname, secname_empty = Knj::Web.parse_secname(seton, match[1], args)
344
+
345
+ valuefrom = namepos + match[1].length + 2
346
+ restname = varname.slice(valuefrom..-1)
347
+
348
+ if restname and restname.index("[") != nil
349
+ seton[secname] = {} if !seton.key?(secname)
350
+ Knj::Web.parse_name_second(seton[secname], restname, value, args)
351
+ else
352
+ seton[secname] = realvalue
353
+ end
354
+ else
355
+ seton[varname] = realvalue
356
+ end
357
+ end
358
+
359
+ def global_params
360
+ $_POST = @post
361
+ $_GET = @get
362
+ $_COOKIE = @cookie
363
+ $_FILES = @files
364
+ $_SERVER = @server
365
+ end
366
+
367
+ def destroy
368
+ @cgi = nil
369
+ @post = nil
370
+ @get = nil
371
+ @session = nil
372
+ @args = nil
373
+ end
374
+
375
+ def self.require_eruby(filepath)
376
+ cont = File.read(filepath).untaint
377
+ parse = Erubis.Eruby.new(cont)
378
+ eval(parse.src.to_s)
379
+ end
380
+
381
+ def self.alert(string)
382
+ require "#{$knjpath}strings"
383
+ @alert_sent = true
384
+ html = "<script type=\"text/javascript\">alert(\"#{Knj::Strings.js_safe(string.to_s)}\");</script>"
385
+ print html
386
+ end
387
+
388
+ def self.redirect(string, args = {})
389
+ do_js = true
390
+
391
+ #Header way
392
+ if !@alert_sent
393
+ if args[:perm]
394
+ Knj::Php.header("Status: 301 Moved Permanently")
395
+ else
396
+ Knj::Php.header("Status: 303 See Other")
397
+ end
398
+
399
+ Knj::Php.header("Location: #{string}")
400
+ end
401
+
402
+ print "<script type=\"text/javascript\">location.href=\"#{string}\";</script>" if do_js
403
+ exit
404
+ end
405
+
406
+ def self.back
407
+ print "<script type=\"text/javascript\">history.go(-1);</script>"
408
+ exit
409
+ end
410
+
411
+ def self.checkval(value, val1, val2 = nil)
412
+ if val2 != nil
413
+ if !value or value == "" or value == "false"
414
+ return val2
415
+ else
416
+ return val1
417
+ end
418
+ else
419
+ if !value or value == "" or value == "false"
420
+ return val1
421
+ else
422
+ return value
423
+ end
424
+ end
425
+ end
426
+
427
+ def self.inputs(arr)
428
+ html = ""
429
+ arr.each do |args|
430
+ if RUBY_ENGINE == "rbx"
431
+ html << self.input(args).to_s.encode(html.encoding)
432
+ else
433
+ html << self.input(args)
434
+ end
435
+ end
436
+
437
+ return html
438
+ end
439
+
440
+ def self.style_html(css)
443
441
  return "" if css.length <= 0
444
442
 
445
443
  str = " style=\""
446
444
 
447
445
  css.each do |key, val|
448
- str += "#{key}: #{val};"
446
+ str << "#{key}: #{val};"
449
447
  end
450
448
 
451
- str += "\""
449
+ str << "\""
452
450
 
453
451
  return str
454
- end
455
-
456
- def self.attr_html(attrs)
452
+ end
453
+
454
+ def self.attr_html(attrs)
457
455
  return "" if attrs.length <= 0
458
456
 
459
457
  html = ""
460
458
  attrs.each do |key, val|
461
- html += " #{key}=\"#{val.to_s.html}\""
459
+ html << " #{key}=\"#{val.to_s.html}\""
462
460
  end
463
461
 
464
462
  return html
465
- end
466
-
467
- def self.input(args)
468
- Knj::ArrayExt.hash_sym(args)
469
-
470
- if args.key?(:value)
471
- if args[:value].is_a?(Array) and args[:value][0].is_a?(NilClass)
463
+ end
464
+
465
+ def self.input(args)
466
+ Knj::ArrayExt.hash_sym(args)
467
+
468
+ if args.key?(:value)
469
+ if args[:value].is_a?(Array) and args[:value].first.is_a?(NilClass)
472
470
  value = nil
473
- elsif args[:value].is_a?(Array)
471
+ elsif args[:value].is_a?(Array)
474
472
  if !args[:value][2] or args[:value][2] == :key
475
- value = args[:value][0][args[:value][1]]
473
+ value = args[:value].first[args[:value][1]]
476
474
  elsif args[:value][2] == :callb
477
- value = args[:value][0].send(args[:value][1])
475
+ value = args[:value].first.send(args[:value][1])
476
+ else
477
+ value = args[:value]
478
478
  end
479
- elsif args[:value].is_a?(String) or args[:value].is_a?(Integer)
480
- value = args[:value].to_s
481
- else
482
- value = args[:value]
483
- end
484
- end
485
-
486
- args[:value_default] = args[:default] if args[:default]
487
-
488
- if value.is_a?(NilClass) and args[:value_default]
489
- value = args[:value_default]
490
- elsif value.is_a?(NilClass)
491
- value = ""
492
- end
493
-
494
- if value and args.key?(:value_func) and args[:value_func]
495
- cback = args[:value_func]
496
-
497
- if cback.is_a?(Method)
498
- value = cback.call(value)
499
- elsif cback.is_a?(Array)
500
- value = Knj::Php.call_user_func(args[:value_func], value)
501
- elsif cback.is_a?(Proc)
502
- value = cback.call(value)
503
- else
504
- raise "Unknown class: #{cback.class.name}."
505
- end
506
- end
507
-
508
- value = args[:values] if args[:values]
509
- args[:id] = args[:name] if !args[:id]
510
-
511
- if !args[:type]
512
- if args[:opts]
513
- args[:type] = :select
514
- elsif args[:name] and args[:name].to_s[0..2] == "che"
515
- args[:type] = :checkbox
516
- elsif args[:name] and args[:name].to_s[0..3] == "file"
517
- args[:type] = :file
518
- else
519
- args[:type] = :text
520
- end
521
- else
522
- args[:type] = args[:type].to_sym
523
- end
524
-
525
- attr = {
479
+ elsif args[:value].is_a?(String) or args[:value].is_a?(Integer)
480
+ value = args[:value].to_s
481
+ else
482
+ value = args[:value]
483
+ end
484
+ end
485
+
486
+ args[:value_default] = args[:default] if args[:default]
487
+
488
+ if value.is_a?(NilClass) and args[:value_default]
489
+ value = args[:value_default]
490
+ elsif value.is_a?(NilClass)
491
+ value = ""
492
+ end
493
+
494
+ if value and args.key?(:value_func) and args[:value_func]
495
+ cback = args[:value_func]
496
+
497
+ if cback.is_a?(Method)
498
+ value = cback.call(value)
499
+ elsif cback.is_a?(Array)
500
+ value = Knj::Php.call_user_func(args[:value_func], value)
501
+ elsif cback.is_a?(Proc)
502
+ value = cback.call(value)
503
+ else
504
+ raise "Unknown class: #{cback.class.name}."
505
+ end
506
+ end
507
+
508
+ value = args[:values] if args[:values]
509
+ args[:id] = args[:name] if !args[:id]
510
+
511
+ if !args[:type]
512
+ if args[:opts]
513
+ args[:type] = :select
514
+ elsif args[:name] and args[:name].to_s[0..2] == "che"
515
+ args[:type] = :checkbox
516
+ elsif args[:name] and args[:name].to_s[0..3] == "file"
517
+ args[:type] = :file
518
+ else
519
+ args[:type] = :text
520
+ end
521
+ else
522
+ args[:type] = args[:type].to_sym
523
+ end
524
+
525
+ attr = {
526
526
  "name" => args[:name],
527
527
  "id" => args[:id],
528
528
  "type" => args[:type],
529
529
  "class" => "input_#{args[:type]}"
530
- }
530
+ }
531
531
  attr.merge!(args[:attr]) if args[:attr]
532
532
  attr["disabled"] = "disabled" if args[:disabled]
533
-
534
- raise "No name given to the Web::input()-method." if !args[:name] and args[:type] != :info and args[:type] != :textshow and args[:type] != :plain
535
-
536
- css = {}
537
- css["text-align"] = args[:align] if args.key?(:align)
538
-
539
- attr_keys = [:onchange]
540
- attr_keys.each do |tag|
533
+
534
+ raise "No name given to the Web::input()-method." if !args[:name] and args[:type] != :info and args[:type] != :textshow and args[:type] != :plain and args[:type] != :spacer and args[:type] != :headline
535
+
536
+ css = {}
537
+ css["text-align"] = args[:align] if args.key?(:align)
538
+ css.merge!(args[:css]) if args.key?(:css)
539
+
540
+ attr_keys = [:onchange]
541
+ attr_keys.each do |tag|
541
542
  if args.key?(tag)
542
543
  attr[tag] = args[tag]
543
544
  end
544
- end
545
-
546
- html = ""
547
-
548
- if args[:type] == :checkbox
545
+ end
546
+
547
+ classes_tr = []
548
+ classes_tr += args[:classes_tr] if args[:classes_tr]
549
+
550
+ if !classes_tr.empty?
551
+ classes_tr_html = " class=\"#{classes_tr.join(" ")}\""
552
+ else
553
+ classes_tr_html = ""
554
+ end
555
+
556
+ html = ""
557
+
558
+ classes = ["input_#{args[:type]}"]
559
+ classes = classes | args[:classes] if args.key?(:classes)
560
+ attr["class"] = classes.join(" ")
561
+
562
+ if args[:type] == :checkbox
549
563
  attr["value"] = args[:value_active] if args.key?(:value_active)
550
564
  attr["checked"] = "checked" if value.is_a?(String) and value == "1" or value.to_s == "1" or value.to_s == "on" or value.to_s == "true"
551
565
  attr["checked"] = "checked" if value.is_a?(TrueClass)
552
566
 
553
- html += "<tr>"
554
- html += "<td colspan=\"2\" class=\"tdcheck\">"
555
- html += "<input#{self.attr_html(attr)} />"
556
- html += "<label for=\"#{args[:id].html}\">#{args[:title].html}</label>"
557
- html += "</td>"
558
- html += "</tr>"
559
- else
560
- html += "<tr>"
561
- html += "<td class=\"tdt\">"
562
- html += args[:title].to_s.html
563
- html += "</td>"
564
- html += "<td#{self.style_html(css)} class=\"tdc\">"
565
-
566
- if args[:type] == :textarea
567
- css["height"] = "#{args[:height]}px" if args.key?(:height)
568
-
569
- html += "<textarea#{self.style_html(css)} class=\"input_textarea\" name=\"#{args[:name].html}\" id=\"#{args[:id].html}\">#{value}</textarea>"
570
- html += "</td>"
571
- elsif args[:type] == :fckeditor
572
- args[:height] = 400 if !args[:height]
573
-
574
- require "/usr/share/fckeditor/fckeditor.rb"
575
- fck = FCKeditor.new(args[:name])
576
- fck.Height = args[:height].to_i
577
- fck.Value = value
578
- html += fck.CreateHtml
579
-
580
- html += "</td>"
581
- elsif args[:type] == :select
567
+ html << "<tr#{classes_tr_html}>"
568
+ html << "<td colspan=\"2\" class=\"tdcheck\">"
569
+ html << "<input#{self.attr_html(attr)} />"
570
+ html << "<label for=\"#{args[:id].html}\">#{args[:title].html}</label>"
571
+ html << "</td>"
572
+ html << "</tr>"
573
+ elsif args[:type] == :headline
574
+ html << "<tr#{classes_tr_html}><td colspan=\"2\"><h2 class=\"input_headline\">#{args[:title].html}</h2></td></tr>"
575
+ elsif args[:type] == :spacer
576
+ html << "<tr#{classes_tr_html}><td colspan=\"2\">&nbsp;</td></tr>"
577
+ else
578
+ html << "<tr#{classes_tr_html}>"
579
+ html << "<td class=\"tdt\">"
580
+ html << args[:title].to_s.html
581
+ html << "</td>"
582
+ html << "<td#{self.style_html(css)} class=\"tdc\">"
583
+
584
+ if args[:type] == :textarea
585
+ if args.key?(:height)
586
+ if Knj::Php.is_numeric(args[:height])
587
+ css["height"] = "#{args[:height]}px"
588
+ else
589
+ css["height"] = args[:height]
590
+ end
591
+ end
592
+
593
+ html << "<textarea#{self.style_html(css)} class=\"input_textarea\" name=\"#{args[:name].html}\" id=\"#{args[:id].html}\">#{value}</textarea>"
594
+ html << "</td>"
595
+ elsif args[:type] == :fckeditor
596
+ args[:height] = 400 if !args[:height]
597
+
598
+ require "/usr/share/fckeditor/fckeditor.rb"
599
+ fck = FCKeditor.new(args[:name])
600
+ fck.Height = args[:height].to_i
601
+ fck.Value = value
602
+ html << fck.CreateHtml
603
+
604
+ html << "</td>"
605
+ elsif args[:type] == :select
582
606
  attr["multiple"] = "multiple" if args[:multiple]
583
607
  attr["size"] = args["size"] if args[:size]
584
608
 
585
- html += "<select#{self.attr_html(attr)}>"
586
- html += Knj::Web.opts(args[:opts], value, args[:opts_args])
587
- html += "</select>"
588
- html += "</td>"
589
- elsif args[:type] == :imageupload
590
- html += "<table class=\"designtable\"><tr><td style=\"width: 100%;\">"
591
- html += "<input type=\"file\" name=\"#{args[:name].html}\" class=\"input_file\" />"
592
- html += "</td><td style=\"padding-left: 5px;\">"
593
-
594
- raise "No path given for imageupload-input." if !args.key?(:path)
595
- raise "No value given in arguments for imageupload-input." if !args.key?(:value)
596
-
597
- path = args[:path].gsub("%value%", value.to_s).untaint
598
- if File.exists?(path)
599
- html += "<img src=\"image.rhtml?path=#{self.urlenc(path).html}&smartsize=100&rounded_corners=10&border_color=black&force=true&ts=#{Time.new.to_f}\" alt=\"Image\" />"
600
-
601
- if args[:dellink]
602
- dellink = args[:dellink].gsub("%value%", value.to_s)
603
- html += "<div style=\"text-align: center;\">(<a href=\"javascript: if (confirm('#{_("Do you want to delete the image?")}')){location.href='#{dellink}';}\">#{_("delete")}</a>)</div>"
604
- end
605
- end
606
-
607
- html += "</td></tr></table>"
608
- html += "</td>"
609
- elsif args[:type] == :file
610
- html += "<input type=\"#{args[:type].to_s}\" class=\"input_#{args[:type].to_s}\" name=\"#{args[:name].html}\" /></td>"
611
- elsif args[:type] == :textshow or args[:type] == :info
612
- html += "#{value}</td>"
609
+ html << "<select#{self.attr_html(attr)}>"
610
+ html << Knj::Web.opts(args[:opts], value, args[:opts_args])
611
+ html << "</select>"
612
+ html << "</td>"
613
+ elsif args[:type] == :imageupload
614
+ html << "<table class=\"designtable\"><tr#{classes_tr_html}><td style=\"width: 100%;\">"
615
+ html << "<input type=\"file\" name=\"#{args[:name].html}\" class=\"input_file\" />"
616
+ html << "</td><td style=\"padding-left: 5px;\">"
617
+
618
+ raise "No path given for imageupload-input." if !args.key?(:path)
619
+ raise "No value given in arguments for imageupload-input." if !args.key?(:value)
620
+
621
+ path = args[:path].gsub("%value%", value.to_s).untaint
622
+ if File.exists?(path)
623
+ html << "<img src=\"image.rhtml?path=#{self.urlenc(path).html}&smartsize=100&rounded_corners=10&border_color=black&force=true&ts=#{Time.new.to_f}\" alt=\"Image\" />"
624
+
625
+ if args[:dellink]
626
+ dellink = args[:dellink].gsub("%value%", value.to_s)
627
+ html << "<div style=\"text-align: center;\">(<a href=\"javascript: if (confirm('#{_("Do you want to delete the image?")}')){location.href='#{dellink}';}\">#{_("delete")}</a>)</div>"
628
+ end
629
+ end
630
+
631
+ html << "</td></tr></table>"
632
+ html << "</td>"
633
+ elsif args[:type] == :file
634
+ html << "<input type=\"#{args[:type].to_s}\" class=\"input_#{args[:type].to_s}\" name=\"#{args[:name].html}\" /></td>"
635
+ elsif args[:type] == :textshow or args[:type] == :info
636
+ html << "#{value}</td>"
613
637
  elsif args[:type] == :plain
614
- html += "#{Knj::Web.html(value)}"
638
+ html << "#{Knj::Php.nl2br(Knj::Web.html(value))}"
615
639
  elsif args[:type] == :editarea
616
640
  css["width"] = "100%"
617
641
  css["height"] = args[:height] if args.key?(:height)
618
- html += "<textarea#{self.attr_html(attr)}#{self.style_html(css)} id=\"#{args[:id]}\" name=\"#{args[:name]}\">#{value}</textarea>"
642
+ html << "<textarea#{self.attr_html(attr)}#{self.style_html(css)} id=\"#{args[:id]}\" name=\"#{args[:name]}\">#{value}</textarea>"
619
643
 
620
644
  jshash = {
621
645
  "id" => args[:id],
@@ -627,342 +651,353 @@ class Knj::Web
627
651
  jshash[key.to_s] = args[key] if args.key?(key)
628
652
  end
629
653
 
630
- html += "<script type=\"text/javascript\">"
631
- html += "function knj_web_init_#{args[:name]}(){"
632
- html += "editAreaLoader.init(#{Knj::Php.json_encode(jshash)});"
633
- html += "}"
634
- html += "</script>"
635
- else
654
+ html << "<script type=\"text/javascript\">"
655
+ html << "function knj_web_init_#{args[:name]}(){"
656
+ html << "editAreaLoader.init(#{Knj::Php.json_encode(jshash)});"
657
+ html << "}"
658
+ html << "</script>"
659
+ else
636
660
  attr[:value] = value
637
- html += "<input#{self.attr_html(attr)} /></td>"
638
- html += "</td>"
639
- end
640
-
641
- html += "</tr>"
642
- end
643
-
644
- html += "<tr><td colspan=\"2\" class=\"tdd\">#{args[:descr]}</td></tr>" if args[:descr]
645
- return html
646
- end
647
-
648
- def self.opts(opthash, curvalue = nil, opts_args = {})
649
- opts_args = {} if !opts_args
650
- opts_args.each do |key, value|
651
- if !key.is_a?(Symbol)
652
- opts_args[key.to_sym] = value
653
- opts_args.delete(key)
654
- end
655
- end
656
-
657
- return "" if !opthash
658
- cname = curvalue.class.name
659
- curvalue = curvalue.id if (cname == "Knj::Db_row" or cname == "Knj::Datarow")
660
-
661
- html = ""
662
- addsel = " selected=\"selected\"" if !curvalue
663
-
664
- html += "<option#{addsel} value=\"\">#{_("Add new")}</option>" if opts_args and (opts_args[:add] or opts_args[:addnew])
665
- html += "<option#{addsel} value=\"\">#{_("Choose")}</option>" if opts_args and opts_args[:choose]
666
- html += "<option#{addsel} value=\"\">#{_("None")}</option>" if opts_args and opts_args[:none]
667
-
668
- if opthash.is_a?(Hash) or opthash.class.to_s == "Dictionary"
669
- opthash.each do |key, value|
670
- html += "<option"
671
-
672
- if curvalue.is_a?(Array) and curvalue.index(key) != nil
673
- html += " selected=\"selected\""
674
- elsif curvalue.to_s == key.to_s
675
- html += " selected=\"selected\""
661
+ html << "<input#{self.attr_html(attr)} /></td>"
662
+ html << "</td>"
663
+ end
664
+
665
+ html << "</tr>"
666
+ end
667
+
668
+ html << "<tr#{classes_tr_html}><td colspan=\"2\" class=\"tdd\">#{args[:descr]}</td></tr>" if args[:descr]
669
+ return html
670
+ end
671
+
672
+ def self.opts(opthash, curvalue = nil, opts_args = {})
673
+ opts_args = {} if !opts_args
674
+ opts_args.each do |key, value|
675
+ if !key.is_a?(Symbol)
676
+ opts_args[key.to_sym] = value
677
+ opts_args.delete(key)
678
+ end
679
+ end
680
+
681
+ return "" if !opthash
682
+ cname = curvalue.class.name
683
+ curvalue = curvalue.id if (cname == "Knj::Db_row" or cname == "Knj::Datarow")
684
+
685
+ html = ""
686
+ addsel = " selected=\"selected\"" if !curvalue
687
+
688
+ html << "<option#{addsel} value=\"\">#{_("Add new")}</option>" if opts_args and (opts_args[:add] or opts_args[:addnew])
689
+ html << "<option#{addsel} value=\"\">#{_("Choose")}</option>" if opts_args and opts_args[:choose]
690
+ html << "<option#{addsel} value=\"\">#{_("None")}</option>" if opts_args and opts_args[:none]
691
+ html << "<option#{addsel} value=\"\">#{_("All")}</option>" if opts_args and opts_args[:all]
692
+
693
+ if opthash.is_a?(Hash) or opthash.class.to_s == "Dictionary"
694
+ opthash.each do |key, value|
695
+ html << "<option"
696
+
697
+ sel = false
698
+
699
+ if curvalue.is_a?(Array) and curvalue.index(key) != nil
700
+ sel = true
701
+ elsif curvalue.to_s == key.to_s
702
+ sel = true
676
703
  elsif curvalue and curvalue.respond_to?(:is_knj?) and curvalue.id.to_s == key.to_s
677
- html += " selected=\"selected\""
678
- end
679
-
680
- html += " value=\"#{key.html}\">#{value.html}</option>"
681
- end
682
- elsif opthash.is_a?(Array)
683
- opthash.each do |key|
684
- if opthash[key.to_i] != nil
685
- html += "<option"
686
- html += " selected=\"selected\"" if curvalue.to_i == key.to_i
687
- html += " value=\"#{key.to_s}\">#{opthash[key.to_i].to_s}</option>"
688
- end
689
- end
690
- end
691
-
692
- return html
693
- end
694
-
695
- def self.rendering_engine
696
- begin
697
- servervar = _server
698
- rescue Exception
699
- servervar = $_SERVER
700
- end
701
-
702
- if !servervar
703
- raise "Could not figure out meta data."
704
- end
705
-
706
- agent = servervar["HTTP_USER_AGENT"].to_s.downcase
707
-
708
- if agent.index("webkit") != nil
709
- return "webkit"
710
- elsif agent.index("gecko") != nil
711
- return "gecko"
712
- elsif agent.index("msie") != nil
713
- return "msie"
714
- elsif agent.index("w3c") != nil or agent.index("baiduspider") != nil or agent.index("googlebot") != nil
715
- return "bot"
716
- else
717
- #print "Unknown agent: #{agent}"
718
- return false
719
- end
720
- end
721
-
722
- def self.os
723
- begin
724
- servervar = _server
725
- rescue Exception
726
- servervar = $_SERVER
727
- end
728
-
729
- if !servervar
730
- raise "Could not figure out meta data."
731
- end
732
-
733
- agent = servervar["HTTP_USER_AGENT"].to_s.downcase
734
-
735
- if agent.index("(windows;") != nil or agent.index("windows nt") != nil
736
- return {
737
- "os" => "win",
738
- "title" => "Windows"
739
- }
740
- elsif agent.index("linux") != nil
741
- return {
742
- "os" => "linux",
743
- "title" => "Linux"
744
- }
745
- end
746
-
747
- raise "Unknown OS: #{agent}"
748
- end
749
-
750
- def self.browser(servervar = nil)
751
- if !servervar
752
- begin
753
- servervar = _server
754
- rescue Exception => e
755
- servervar = $_SERVER
756
- end
757
- end
758
-
759
- raise "Could not figure out meta data." if !servervar
760
- agent = servervar["HTTP_USER_AGENT"].to_s.downcase
761
-
762
- if match = agent.index("knj:true") != nil
763
- browser = "bot"
764
- title = "Bot"
765
- version = "KnjHttp"
766
- elsif match = agent.match(/chrome\/(\d+\.\d+)/)
767
- browser = "chrome"
768
- title = "Google Chrome"
769
- version = match[1]
770
- elsif match = agent.match(/firefox\/(\d+\.\d+)/)
771
- browser = "firefox"
772
- title = "Mozilla Firefox"
773
- version = match[1]
774
- elsif match = agent.match(/msie\s*(\d+\.\d+)/)
775
- browser = "ie"
776
- title = "Microsoft Internet Explorer"
777
- version = match[1]
778
- elsif match = agent.match(/opera\/([\d+\.]+)/)
779
- browser = "opera"
780
- title = "Opera"
781
- version = match[1]
782
- elsif match = agent.match(/wget\/([\d+\.]+)/)
783
- browser = "bot"
784
- title = "Bot"
785
- version = "Wget #{match[1]}"
786
- elsif agent.index("baiduspider") != nil
787
- browser = "bot"
788
- title = "Bot"
789
- version = "Baiduspider"
790
- elsif agent.index("googlebot") != nil
791
- browser = "bot"
792
- title = "Bot"
793
- version = "Googlebot"
794
- elsif agent.index("gidbot") != nil
795
- browser = "bot"
796
- title = "Bot"
797
- version = "GIDBot"
704
+ sel = true
705
+ end
706
+
707
+ html << " selected=\"selected\"" if sel
708
+ html << " value=\"#{Knj::Web.html(key)}\">#{Knj::Web.html(value)}</option>"
709
+ end
710
+ elsif opthash.is_a?(Array)
711
+ opthash.each_index do |key|
712
+ if opthash[key.to_i] != nil
713
+ html << "<option"
714
+ html << " selected=\"selected\"" if curvalue.to_i == key.to_i
715
+ html << " value=\"#{key.to_s}\">#{opthash[key].to_s}</option>"
716
+ end
717
+ end
718
+ end
719
+
720
+ return html
721
+ end
722
+
723
+ def self.rendering_engine
724
+ begin
725
+ servervar = _server
726
+ rescue Exception
727
+ servervar = $_SERVER
728
+ end
729
+
730
+ if !servervar
731
+ raise "Could not figure out meta data."
732
+ end
733
+
734
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
735
+
736
+ if agent.index("webkit") != nil
737
+ return "webkit"
738
+ elsif agent.index("gecko") != nil
739
+ return "gecko"
740
+ elsif agent.index("msie") != nil
741
+ return "msie"
742
+ elsif agent.index("w3c") != nil or agent.index("baiduspider") != nil or agent.index("googlebot") != nil
743
+ return "bot"
744
+ else
745
+ #print "Unknown agent: #{agent}"
746
+ return false
747
+ end
748
+ end
749
+
750
+ def self.os
751
+ begin
752
+ servervar = _server
753
+ rescue Exception
754
+ servervar = $_SERVER
755
+ end
756
+
757
+ if !servervar
758
+ raise "Could not figure out meta data."
759
+ end
760
+
761
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
762
+
763
+ if agent.index("(windows;") != nil or agent.index("windows nt") != nil
764
+ return {
765
+ "os" => "win",
766
+ "title" => "Windows"
767
+ }
768
+ elsif agent.index("linux") != nil
769
+ return {
770
+ "os" => "linux",
771
+ "title" => "Linux"
772
+ }
773
+ end
774
+
775
+ raise "Unknown OS: #{agent}"
776
+ end
777
+
778
+ def self.browser(servervar = nil)
779
+ if !servervar
780
+ begin
781
+ servervar = _server
782
+ rescue Exception => e
783
+ servervar = $_SERVER
784
+ end
785
+ end
786
+
787
+ raise "Could not figure out meta data." if !servervar
788
+ agent = servervar["HTTP_USER_AGENT"].to_s.downcase
789
+
790
+ if match = agent.index("knj:true") != nil
791
+ browser = "bot"
792
+ title = "Bot"
793
+ version = "KnjHttp"
794
+ elsif match = agent.match(/chrome\/(\d+\.\d+)/)
795
+ browser = "chrome"
796
+ title = "Google Chrome"
797
+ version = match[1]
798
+ elsif match = agent.match(/firefox\/(\d+\.\d+)/)
799
+ browser = "firefox"
800
+ title = "Mozilla Firefox"
801
+ version = match[1]
802
+ elsif match = agent.match(/msie\s*(\d+\.\d+)/)
803
+ browser = "ie"
804
+ title = "Microsoft Internet Explorer"
805
+ version = match[1]
806
+ elsif match = agent.match(/opera\/([\d+\.]+)/)
807
+ browser = "opera"
808
+ title = "Opera"
809
+ version = match[1]
810
+ elsif match = agent.match(/wget\/([\d+\.]+)/)
811
+ browser = "bot"
812
+ title = "Bot"
813
+ version = "Wget #{match[1]}"
814
+ elsif agent.index("baiduspider") != nil
815
+ browser = "bot"
816
+ title = "Bot"
817
+ version = "Baiduspider"
818
+ elsif agent.index("googlebot") != nil
819
+ browser = "bot"
820
+ title = "Bot"
821
+ version = "Googlebot"
822
+ elsif agent.index("gidbot") != nil
823
+ browser = "bot"
824
+ title = "Bot"
825
+ version = "GIDBot"
798
826
  elsif match = agent.match(/android\s+([\d\.]+)/)
799
827
  browser = "android"
800
828
  title = "Android"
801
829
  version = match[1]
802
- elsif match = agent.match(/safari\/(\d+)/)
803
- browser = "safari"
804
- title = "Safari"
805
- version = match[1]
806
- elsif agent.index("iPad") != nil
807
- browser = "safari"
808
- title = "Safari (iPad)"
809
- version = "ipad"
810
- elsif agent.index("bingbot") != nil
811
- browser = "bot"
812
- title = "Bot"
813
- version = "Bingbot"
814
- elsif agent.index("yahoo! slurp") != nil
815
- browser = "bot"
816
- title = "Bot"
817
- version = "Yahoo! Slurp"
818
- elsif agent.index("hostharvest") != nil
819
- browser = "bot"
820
- title = "Bot"
821
- version = "HostHarvest"
822
- elsif agent.index("exabot") != nil
823
- browser = "bot"
824
- title = "Bot"
825
- version = "Exabot"
826
- elsif agent.index("dotbot") != nil
827
- browser = "bot"
828
- title = "Bot"
829
- version = "DotBot"
830
- elsif agent.index("msnbot") != nil
831
- browser = "bot"
832
- title = "Bot"
833
- version = "MSN bot"
834
- elsif agent.index("yandexbot") != nil
835
- browser = "bot"
836
- title = "Bot"
837
- version = "Yandex Bot"
838
- elsif agent.index("mj12bot") != nil
839
- browser = "bot"
840
- title = "Bot"
841
- version = "Majestic12 Bot"
842
- elsif agent.index("facebookexternalhit") != nil
843
- browser = "bot"
844
- title = "Bot"
845
- version = "Facebook Externalhit"
846
- elsif agent.index("sitebot") != nil
847
- browser = "bot"
848
- title = "Bot"
849
- version = "SiteBot"
850
- elsif match = agent.match(/java\/([\d\.]+)/)
851
- browser = "bot"
852
- title = "Java"
853
- version = match[1]
854
- elsif match = agent.match(/ezooms\/([\d\.]+)/)
855
- browser = "bot"
856
- title = "Ezooms"
857
- version = match[1]
830
+ elsif match = agent.match(/safari\/(\d+)/)
831
+ browser = "safari"
832
+ title = "Safari"
833
+ version = match[1]
834
+ elsif agent.index("iPad") != nil
835
+ browser = "safari"
836
+ title = "Safari (iPad)"
837
+ version = "ipad"
838
+ elsif agent.index("bingbot") != nil
839
+ browser = "bot"
840
+ title = "Bot"
841
+ version = "Bingbot"
842
+ elsif agent.index("yahoo! slurp") != nil
843
+ browser = "bot"
844
+ title = "Bot"
845
+ version = "Yahoo! Slurp"
846
+ elsif agent.index("hostharvest") != nil
847
+ browser = "bot"
848
+ title = "Bot"
849
+ version = "HostHarvest"
850
+ elsif agent.index("exabot") != nil
851
+ browser = "bot"
852
+ title = "Bot"
853
+ version = "Exabot"
854
+ elsif agent.index("dotbot") != nil
855
+ browser = "bot"
856
+ title = "Bot"
857
+ version = "DotBot"
858
+ elsif agent.index("msnbot") != nil
859
+ browser = "bot"
860
+ title = "Bot"
861
+ version = "MSN bot"
862
+ elsif agent.index("yandexbot") != nil
863
+ browser = "bot"
864
+ title = "Bot"
865
+ version = "Yandex Bot"
866
+ elsif agent.index("mj12bot") != nil
867
+ browser = "bot"
868
+ title = "Bot"
869
+ version = "Majestic12 Bot"
870
+ elsif agent.index("facebookexternalhit") != nil
871
+ browser = "bot"
872
+ title = "Bot"
873
+ version = "Facebook Externalhit"
874
+ elsif agent.index("sitebot") != nil
875
+ browser = "bot"
876
+ title = "Bot"
877
+ version = "SiteBot"
878
+ elsif match = agent.match(/java\/([\d\.]+)/)
879
+ browser = "bot"
880
+ title = "Java"
881
+ version = match[1]
882
+ elsif match = agent.match(/ezooms\/([\d\.]+)/)
883
+ browser = "bot"
884
+ title = "Ezooms"
885
+ version = match[1]
858
886
  elsif match = agent.match(/ahrefsbot\/([\d\.]+)/)
859
887
  browser = "bot"
860
888
  title = "AhrefsBot"
861
889
  version = match[1]
862
- else
863
- browser = "unknown"
864
- title = "(unknown browser)"
865
- version = "(unknown version)"
866
- end
867
-
868
- return {
869
- "browser" => browser,
870
- "title" => title,
871
- "version" => version
872
- }
873
- end
874
-
875
- def self.locale(args = {})
876
- begin
877
- servervar = _server
878
- rescue Exception
879
- servervar = $_SERVER
880
- end
881
-
882
- if !servervar
883
- raise "Could not figure out meta data."
884
- end
885
-
886
- ret = {
887
- :recommended => [],
888
- :browser => []
889
- }
890
-
891
- alangs = servervar["HTTP_ACCEPT_LANGUAGE"].to_s
892
- if alangs.length > 0
893
- alangs.split(/\s*,\s*/).each do |alang|
894
- if qmatch = alang.match(/;\s*q=([\d\.]+)/)
895
- alang.gsub!(/;\s*q=([\d\.]+)/, "")
896
- q = qmatch[1].to_f
897
- else
898
- q = 1.0
899
- end
900
-
901
- if match = alang.match(/^([A-z]+)-([A-z]+)$/)
902
- locale = match[1]
903
- sublocale = match[2]
904
- else
905
- locale = alang
906
- sublocale = false
907
- end
908
-
909
- ret[:browser] << {
910
- :locale => locale,
911
- :sublocale => sublocale,
912
- :q => q
913
- }
914
- end
915
- end
916
-
917
- if args[:supported] and ret[:browser]
918
- ret[:browser].each do |locale|
919
- args[:supported].each do |supported_locale|
920
- if match = supported_locale.match(/^([A-z]+)_([A-z]+)$/)
921
- if match[1] == locale[:locale]
922
- if !locale[:sublocale]
923
- ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
924
- elsif locale[:sublocale] == match[1]
925
- ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
926
- end
927
- end
928
- end
929
- end
930
- end
931
- end
932
-
933
- if args[:default]
934
- ret[:recommended] << args[:default] if ret[:recommended].index(args[:default]) == nil
935
- end
936
-
937
- return ret
938
- end
939
-
940
- def self.hiddens(hidden_arr)
941
- html = ""
942
-
943
- hidden_arr.each do |hidden_hash|
944
- if hidden_hash[:value].is_a?(Array)
945
- if !hidden_hash[:value][0]
946
- hidden_hash[:value] = nil
890
+ else
891
+ browser = "unknown"
892
+ title = "(unknown browser)"
893
+ version = "(unknown version)"
894
+ end
895
+
896
+ return {
897
+ "browser" => browser,
898
+ "title" => title,
899
+ "version" => version
900
+ }
901
+ end
902
+
903
+ def self.locale(args = {})
904
+ begin
905
+ servervar = _server
906
+ rescue Exception
907
+ servervar = $_SERVER
908
+ end
909
+
910
+ if !servervar
911
+ raise "Could not figure out meta data."
912
+ end
913
+
914
+ ret = {
915
+ :recommended => [],
916
+ :browser => []
917
+ }
918
+
919
+ alangs = servervar["HTTP_ACCEPT_LANGUAGE"].to_s
920
+ if alangs.length > 0
921
+ alangs.split(/\s*,\s*/).each do |alang|
922
+ if qmatch = alang.match(/;\s*q=([\d\.]+)/)
923
+ alang.gsub!(/;\s*q=([\d\.]+)/, "")
924
+ q = qmatch[1].to_f
925
+ else
926
+ q = 1.0
927
+ end
928
+
929
+ if match = alang.match(/^([A-z]+)-([A-z]+)$/)
930
+ locale = match[1]
931
+ sublocale = match[2]
947
932
  else
948
- key = hidden_hash[:value][1]
949
- obj = hidden_hash[:value][0]
950
- hidden_hash[:value] = obj[key]
933
+ locale = alang
934
+ sublocale = false
935
+ end
936
+
937
+ ret[:browser] << {
938
+ :locale => locale,
939
+ :sublocale => sublocale,
940
+ :q => q
941
+ }
942
+ end
943
+ end
944
+
945
+ if args[:supported] and ret[:browser]
946
+ ret[:browser].each do |locale|
947
+ args[:supported].each do |supported_locale|
948
+ if match = supported_locale.match(/^([A-z]+)_([A-z]+)$/)
949
+ if match[1] == locale[:locale]
950
+ if !locale[:sublocale]
951
+ ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
952
+ elsif locale[:sublocale] == match[1]
953
+ ret[:recommended] << supported_locale if ret[:recommended].index(supported_locale) == nil
954
+ end
955
+ end
956
+ end
957
+ end
958
+ end
959
+ end
960
+
961
+ if args[:default]
962
+ ret[:recommended] << args[:default] if ret[:recommended].index(args[:default]) == nil
963
+ end
964
+
965
+ return ret
966
+ end
967
+
968
+ def self.hiddens(hidden_arr)
969
+ html = ""
970
+
971
+ hidden_arr.each do |hidden_hash|
972
+ if hidden_hash.is_a?(Array)
973
+ hidden_hash = {
974
+ :name => hidden_hash[0],
975
+ :value => hidden_hash[1]
976
+ }
977
+ else
978
+ if hidden_hash[:value].is_a?(Array)
979
+ if !hidden_hash[:value][0]
980
+ hidden_hash[:value] = nil
981
+ else
982
+ key = hidden_hash[:value][1]
983
+ obj = hidden_hash[:value][0]
984
+ hidden_hash[:value] = obj[key]
985
+ end
951
986
  end
952
987
  end
953
988
 
954
- html += "<input type=\"hidden\" name=\"#{hidden_hash[:name].to_s.html}\" value=\"#{hidden_hash[:value].to_s.html}\" />"
955
- end
956
-
957
- return html
958
- end
959
-
960
- #Parses a string to be safe for use in <a href="">.
961
- def self.ahref_parse(str)
989
+ html << "<input type=\"hidden\" name=\"#{hidden_hash[:name].to_s.html}\" value=\"#{hidden_hash[:value].to_s.html}\" />"
990
+ end
991
+
992
+ return html
993
+ end
994
+
995
+ #Parses a string to be safe for use in <a href="">.
996
+ def self.ahref_parse(str)
962
997
  return str.to_s.gsub("&", "&amp;")
963
- end
964
-
965
- #URL-encodes a string.
998
+ end
999
+
1000
+ #URL-encodes a string.
966
1001
  def self.urlenc(string)
967
1002
  #Thanks to CGI framework
968
1003
  string.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/) do
@@ -982,40 +1017,71 @@ class Knj::Web
982
1017
  def self.html(string)
983
1018
  return string.to_s.gsub(/&/, "&amp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
984
1019
  end
1020
+
1021
+ def self.html_args(h)
1022
+ str = ""
1023
+ h.each do |key, val|
1024
+ str << "&#{Knj::Php.urlencode(key)}=#{Knj::Php.urlencode(val)}"
1025
+ end
1026
+
1027
+ return str
1028
+ end
1029
+
1030
+ #Calculates the URL from meta hash.
1031
+ def self.url(args = {})
1032
+ if args[:meta]
1033
+ meta = args[:meta]
1034
+ else
1035
+ meta = _meta
1036
+ end
1037
+
1038
+ url = ""
1039
+
1040
+ if meta["HTTP_SSL_ENABLED"] == "1"
1041
+ url << "https://"
1042
+ else
1043
+ url << "http://"
1044
+ end
1045
+
1046
+ url << meta["HTTP_HOST"]
1047
+ url << meta["REQUEST_URI"] if !args.key?(:uri) or args[:uri]
1048
+
1049
+ return url
1050
+ end
985
1051
  end
986
1052
 
987
1053
  class String
988
- def html
989
- return Knj::Web.html(self)
990
- end
991
-
992
- def sql
993
- begin
1054
+ def html
1055
+ return Knj::Web.html(self)
1056
+ end
1057
+
1058
+ def sql
1059
+ begin
994
1060
  return _db.escape(self)
995
1061
  rescue NameError
996
1062
  #ignore - not i KnjAppServer HTTP-session.
997
1063
  end
998
-
999
- raise "Could not figure out where to find db object."
1000
- end
1064
+
1065
+ raise "Could not figure out where to find db object."
1066
+ end
1001
1067
  end
1002
1068
 
1003
1069
  class Symbol
1004
- def html
1005
- return self.to_s.html
1006
- end
1007
-
1008
- def sql
1009
- return self.to_s.sql
1010
- end
1070
+ def html
1071
+ return self.to_s.html
1072
+ end
1073
+
1074
+ def sql
1075
+ return self.to_s.sql
1076
+ end
1011
1077
  end
1012
1078
 
1013
1079
  class Fixnum
1014
- def sql
1015
- return self.to_s.sql
1016
- end
1017
-
1018
- def html
1019
- return self.to_s.html
1020
- end
1080
+ def sql
1081
+ return self.to_s.sql
1082
+ end
1083
+
1084
+ def html
1085
+ return self.to_s.html
1086
+ end
1021
1087
  end