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/php.rb CHANGED
@@ -1,312 +1,365 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Knj::Php
4
- def is_numeric(n) Float n rescue false end
5
-
6
- def call_user_func(*paras)
7
- if paras[0].is_a?(String)
8
- send_paras = [paras[0].to_sym]
9
- send_paras << paras[1] if paras[1]
10
- send(*send_paras)
11
- elsif paras[0].is_a?(Array)
12
- send_paras = [paras[0][1].to_sym]
13
- send_paras << paras[1] if paras[1]
14
- paras[0][0].send(*send_paras)
15
- else
16
- raise "Unknown user-func: '#{paras[0].class.name}'."
17
- end
18
- end
19
-
20
- def print_r(argument, ret = false, count = 1)
21
- retstr = ""
22
- cstr = argument.class.to_s
23
- supercl = argument.class.superclass
24
-
25
- if supercl
26
- superstr = supercl.to_s
27
- end
28
-
29
- if argument.is_a?(Hash) or supercl.is_a?(Hash) or cstr == "Knjappserver::Session_accessor" or cstr == "SQLite3::ResultSet::HashWithTypes" or cstr == "CGI" or cstr == "Knj::Db_row" or cstr == "Knj::Datarow" or cstr == "Apache::Table" or superstr == "Knj::Db_row" or superstr == "Knj::Datarow" or argument.respond_to?(:to_hash)
30
- if argument.respond_to?(:to_hash)
31
- argument_use = argument.to_hash
32
- else
33
- argument_use = argument
34
- end
35
-
36
- retstr += argument.class.to_s + "{\n"
37
- argument_use.each do |pair|
38
- i = 0
39
- while(i < count)
40
- retstr += " "
41
- i += 1
42
- end
43
-
44
- if pair[0].is_a?(Symbol)
45
- keystr = ":#{pair[0].to_s}"
46
- else
47
- keystr = pair[0].to_s
48
- end
49
-
50
- retstr += "[#{keystr}] => "
51
- retstr += print_r(pair[1], true, count + 1).to_s
52
- end
53
-
54
- i = 0
55
- while(i < count - 1)
56
- retstr += " "
57
- i += 1
58
- end
59
-
60
- retstr += "}\n"
61
- elsif cstr == "Dictionary"
62
- retstr += argument.class.to_s + "{\n"
63
- argument.each do |key, val|
64
- i = 0
65
- while(i < count)
66
- retstr += " "
67
- i += 1
68
- end
69
-
70
- if key.is_a?(Symbol)
71
- keystr = ":#{key.to_s}"
72
- else
73
- keystr = key.to_s
74
- end
75
-
76
- retstr += "[#{keystr}] => "
77
- retstr += Knj::Php.print_r(val, true, count + 1).to_s
78
- end
79
-
80
- i = 0
81
- while(i < count - 1)
82
- retstr += " "
83
- i += 1
84
- end
85
-
86
- retstr += "}\n"
87
- elsif argument.is_a?(MatchData) or argument.is_a?(Array) or cstr == "Array" or supercl.is_a?(Array)
88
- retstr += argument.class.to_s + "{\n"
89
-
90
- arr_count = 0
91
- argument.to_a.each do |i|
92
- i_spaces = 0
93
- while(i_spaces < count)
94
- retstr += " "
95
- i_spaces += 1
96
- end
97
-
98
- retstr += "[" + arr_count.to_s + "] => "
99
- retstr += print_r(i, true, count + 1).to_s
100
- arr_count += 1
101
- end
102
-
103
- i_spaces = 0
104
- while(i_spaces < count - 1)
105
- retstr += " "
106
- i_spaces += 1
107
- end
108
-
109
- retstr += "}\n"
110
- elsif cstr == "WEBrick::HTTPUtils::FormData"
111
- retstr += "{#{argument.class.to_s}}"
112
- elsif argument.is_a?(String) or argument.is_a?(Integer) or argument.is_a?(Fixnum) or argument.is_a?(Float)
113
- retstr += argument.to_s + "\n"
114
- elsif argument.is_a?(Symbol)
115
- retstr += ":#{argument.to_s}\n"
116
- elsif argument.is_a?(Exception)
117
- retstr += "#\{#{argument.class.to_s}: #{argument.message}}\n"
118
- elsif cstr == "Knj::Unix_proc"
119
- retstr += "#{argument.class.to_s}::data - "
120
- retstr += print_r(argument.data, true, count).to_s
4
+ def is_numeric(n) Float n rescue false end
5
+
6
+ def call_user_func(*paras)
7
+ if paras[0].is_a?(String)
8
+ send_paras = [paras[0].to_sym]
9
+ send_paras << paras[1] if paras[1]
10
+ send(*send_paras)
11
+ elsif paras[0].is_a?(Array)
12
+ send_paras = [paras[0][1].to_sym]
13
+ send_paras << paras[1] if paras[1]
14
+ paras[0][0].send(*send_paras)
15
+ else
16
+ raise "Unknown user-func: '#{paras[0].class.name}'."
17
+ end
18
+ end
19
+
20
+ def method_exists(obj, method_name)
21
+ return obj.respond_to?(method_name.to_s)
22
+ end
23
+
24
+ def is_a(obj, classname)
25
+ classname = classname.to_s
26
+ classname = "#{classname[0..0].upcase}#{classname[1..999]}"
27
+
28
+ if obj.is_a?(classname)
29
+ return true
30
+ end
31
+
32
+ return false
33
+ end
34
+
35
+ def print_r(argument, ret = false, count = 1)
36
+ retstr = ""
37
+ cstr = argument.class.to_s
38
+ supercl = argument.class.superclass
39
+ superstr = supercl.to_s if supercl
40
+
41
+ if (Knj.const_defined?(:Datarow_custom) and argument.is_a?(Knj::Datarow_custom)) or argument.is_a?(Hash) or supercl.is_a?(Hash) or cstr == "Knj::Hash_methods" or cstr == "Knjappserver::Session_accessor" or cstr == "SQLite3::ResultSet::HashWithTypes" or cstr == "CGI" or cstr == "Knj::Db_row" or cstr == "Knj::Datarow" or cstr == "Apache::Table" or superstr == "Knj::Db_row" or superstr == "Knj::Datarow" or superstr == "Knj::Datarow_custom" or argument.respond_to?(:to_hash)
42
+ if argument.respond_to?(:to_hash)
43
+ argument_use = argument.to_hash
44
+ else
45
+ argument_use = argument
46
+ end
47
+
48
+ retstr << argument.class.to_s + "{\n"
49
+ argument_use.each do |pair|
50
+ i = 0
51
+ while(i < count)
52
+ retstr << " "
53
+ i += 1
54
+ end
55
+
56
+ if pair[0].is_a?(Symbol)
57
+ keystr = ":#{pair[0].to_s}"
58
+ else
59
+ keystr = pair[0].to_s
60
+ end
61
+
62
+ retstr << "[#{keystr}] => "
63
+ retstr << print_r(pair[1], true, count + 1).to_s
64
+ end
65
+
66
+ i = 0
67
+ while(i < count - 1)
68
+ retstr << " "
69
+ i += 1
70
+ end
71
+
72
+ retstr << "}\n"
73
+ elsif cstr == "Dictionary"
74
+ retstr << argument.class.to_s + "{\n"
75
+ argument.each do |key, val|
76
+ i = 0
77
+ while(i < count)
78
+ retstr << " "
79
+ i += 1
80
+ end
81
+
82
+ if key.is_a?(Symbol)
83
+ keystr = ":#{key.to_s}"
84
+ else
85
+ keystr = key.to_s
86
+ end
87
+
88
+ retstr << "[#{keystr}] => "
89
+ retstr << Knj::Php.print_r(val, true, count + 1).to_s
90
+ end
91
+
92
+ i = 0
93
+ while(i < count - 1)
94
+ retstr << " "
95
+ i += 1
96
+ end
97
+
98
+ retstr << "}\n"
99
+ elsif argument.is_a?(MatchData) or argument.is_a?(Array) or cstr == "Array" or supercl.is_a?(Array)
100
+ retstr << argument.class.to_s + "{\n"
101
+
102
+ arr_count = 0
103
+ argument.to_a.each do |i|
104
+ i_spaces = 0
105
+ while(i_spaces < count)
106
+ retstr << " "
107
+ i_spaces += 1
108
+ end
109
+
110
+ retstr << "[" + arr_count.to_s + "] => "
111
+ retstr << print_r(i, true, count + 1).to_s
112
+ arr_count += 1
113
+ end
114
+
115
+ i_spaces = 0
116
+ while(i_spaces < count - 1)
117
+ retstr << " "
118
+ i_spaces += 1
119
+ end
120
+
121
+ retstr << "}\n"
122
+ elsif cstr == "WEBrick::HTTPUtils::FormData"
123
+ retstr << "{#{argument.class.to_s}}"
124
+ elsif argument.is_a?(String) or argument.is_a?(Integer) or argument.is_a?(Fixnum) or argument.is_a?(Float)
125
+ retstr << argument.to_s + "\n"
126
+ elsif argument.is_a?(Symbol)
127
+ retstr << ":#{argument.to_s}\n"
128
+ elsif argument.is_a?(Exception)
129
+ retstr << "#\{#{argument.class.to_s}: #{argument.message}}\n"
130
+ elsif cstr == "Knj::Unix_proc"
131
+ retstr << "#{argument.class.to_s}::data - "
132
+ retstr << print_r(argument.data, true, count).to_s
121
133
  elsif cstr == "Thread"
122
- retstr += "#{argument.class.to_s} - "
134
+ retstr << "#{argument.class.to_s} - "
123
135
 
124
136
  hash = {}
125
137
  argument.keys.each do |key|
126
138
  hash[key] = argument[key]
127
139
  end
128
140
 
129
- retstr += print_r(hash, true, count).to_s
141
+ retstr << print_r(hash, true, count).to_s
130
142
  elsif cstr == "Class"
131
- retstr += "#{argument.class.to_s} - "
143
+ retstr << "#{argument.class.to_s} - "
132
144
  hash = {"name" => argument.name}
133
- retstr += print_r(hash, true, count).to_s
145
+ retstr << print_r(hash, true, count).to_s
134
146
  elsif cstr == "URI::Generic"
135
- retstr += "#{argument.class.to_s}{\n"
147
+ retstr << "#{argument.class.to_s}{\n"
136
148
  methods = [:host, :port, :scheme, :path]
137
149
  count += 1
138
150
  methods.each do |method|
139
151
  i_spaces = 0
140
152
  while(i_spaces < count - 1)
141
- retstr += " "
153
+ retstr << " "
142
154
  i_spaces += 1
143
155
  end
144
156
 
145
- retstr += "#{method}: #{argument.send(method)}\n"
157
+ retstr << "#{method}: #{argument.send(method)}\n"
146
158
  end
147
159
 
148
160
  count -= 1
149
161
 
150
162
  i = 0
151
163
  while(i < count - 1)
152
- retstr += " "
164
+ retstr << " "
153
165
  i += 1
154
166
  end
155
167
 
156
- retstr += "}\n"
157
- else
158
- #print argument.to_s, "\n"
159
- retstr += "Unknown class: " + cstr + "\n"
160
- end
161
-
162
- if ret.is_a?(TrueClass)
163
- return retstr
164
- else
165
- print retstr
166
- end
167
- end
168
-
169
- def gtext(string)
170
- return GetText._(string)
171
- end
172
-
173
- def gettext(string)
174
- return GetText._(string)
175
- end
176
-
177
- def number_format(number, precision = 2, seperator = ".", delimiter = ",")
178
- if !number.is_a?(Float)
179
- number = number.to_f
180
- end
181
-
182
- if number < 1
183
- return sprintf("%.#{precision.to_s}f", number).gsub(".", seperator)
184
- end
185
-
186
- number = sprintf("%.#{precision.to_s}f", number)
187
-
188
- #thanks for jmoses wrote some of tsep-code: http://snippets.dzone.com/posts/show/693
189
- st = number.reverse
190
- r = ""
191
- max = if st[-1].chr == '-'
192
- st.size - 1
193
- else
194
- st.size
195
- end
196
-
197
- if st.to_i == st.to_f
198
- 1.upto(st.size) do |i|
199
- r << st[i-1].chr if st[i-1].chr != "."
200
- r << ',' if i%3 == 0 and i < max
201
- end
202
- else
203
- start = nil
204
- 1.upto(st.size) do |i|
205
- r << st[i-1].chr
206
- start = 0 if r[-1].chr == '.' and not start
207
- if start
208
- r << ',' if start % 3 == 0 and start != 0 and i < max
209
- start += 1
210
- end
211
- end
212
- end
213
-
214
- numberstr = r.to_s.reverse
215
- numberstr = numberstr.gsub(",", "comma").gsub(".", "dot")
216
- numberstr = numberstr.gsub("comma", delimiter).gsub("dot", seperator)
217
-
218
- return numberstr
219
- end
220
-
221
- def ucwords(string)
222
- return string.to_s.split(" ").select {|w| w.capitalize! || w }.join(" ")
223
- end
224
-
225
- def strtoupper(str)
168
+ retstr << "}\n"
169
+ elsif cstr == "Time"
170
+ retstr << "Time::#{argument.year}-#{argument.month}-#{argument.day} #{argument.hour}:#{argument.min}:#{argument.sec}\n"
171
+ else
172
+ #print argument.to_s, "\n"
173
+ retstr << "Unknown class: '#{cstr}' with superclass '#{supercl}'.\n"
174
+ end
175
+
176
+ if ret.is_a?(TrueClass)
177
+ return retstr
178
+ else
179
+ print retstr
180
+ end
181
+ end
182
+
183
+ def gtext(string)
184
+ return GetText._(string)
185
+ end
186
+
187
+ def gettext(string)
188
+ return GetText._(string)
189
+ end
190
+
191
+ #Returns the number as a formatted string.
192
+ def number_format(number, precision = 2, seperator = ".", delimiter = ",")
193
+ number = number.to_f if !number.is_a?(Float)
194
+ precision = precision.to_i
195
+ return sprintf("%.#{precision.to_s}f", number).gsub(".", seperator) if number < 1 and number > -1
196
+
197
+ number = sprintf("%.#{precision.to_s}f", number).split(".")
198
+
199
+ str = ""
200
+ number[0].reverse.scan(/(.{1,3})/) do |match|
201
+ if match[0] == "-"
202
+ #This happens if the number is a negative number and we have reaches the minus-sign.
203
+ str << match[0]
204
+ else
205
+ str << delimiter if str.length > 0
206
+ str << match[0]
207
+ end
208
+ end
209
+
210
+ str = str.reverse
211
+ if precision > 0
212
+ str << "#{seperator}#{number[1]}"
213
+ end
214
+
215
+ return str
216
+ end
217
+
218
+ def ucwords(string)
219
+ return string.to_s.split(" ").select {|w| w.capitalize! || w }.join(" ")
220
+ end
221
+
222
+ def strtoupper(str)
226
223
  return str.to_s.upcase
227
- end
228
-
229
- def strtolower(str)
224
+ end
225
+
226
+ def strtolower(str)
230
227
  return str.to_s.downcase
231
- end
232
-
233
- def htmlspecialchars(string)
234
- return Knj::Web.html(string)
235
- end
236
-
237
- def isset(var)
238
- return false if var == nil or var == false
239
- return true
240
- end
241
-
242
- def strpos(haystack, needle)
243
- return false if !haystack
244
- return false if !haystack.to_s.include?(needle)
245
- return haystack.index(needle)
246
- end
247
-
248
- def substr(string, from, to = -1)
249
- string = string.to_s.slice(from.to_i, to.to_i)
250
-
251
- if Knj::Php.class_exists("Iconv")
228
+ end
229
+
230
+ def htmlspecialchars(string)
231
+ return Knj::Web.html(string)
232
+ end
233
+
234
+ def http_build_query(obj)
235
+ return self.http_build_query_rec("", obj)
236
+ end
237
+
238
+ def http_build_query_rec(orig_key, obj, first = true)
239
+ url = ""
240
+ first_ele = true
241
+
242
+ if obj.is_a?(Array)
243
+ ele_count = 0
244
+
245
+ obj.each do |val|
246
+ orig_key_str = "#{orig_key}[#{ele_count}]"
247
+ val = "#<Model::#{val.table}::#{val.id}>" if val.respond_to?("is_knj?")
248
+
249
+ if val.is_a?(Hash) or val.is_a?(Array)
250
+ url << self.http_build_query_rec(orig_key_str, val, false)
251
+ else
252
+ url << "&" if !first or !first_ele
253
+ url << "#{Knj::Web.urlenc(orig_key_str)}=#{Knj::Web.urlenc(val)}"
254
+ end
255
+
256
+ first_ele = false if first_ele
257
+ ele_count += 1
258
+ end
259
+ elsif obj.is_a?(Hash)
260
+ obj.each do |key, val|
261
+ if first
262
+ orig_key_str = key
263
+ else
264
+ orig_key_str = "#{orig_key}[#{key}]"
265
+ end
266
+
267
+ val = "#<Model::#{val.table}::#{val.id}>" if val.respond_to?("is_knj?")
268
+
269
+ if val.is_a?(Hash) or val.is_a?(Array)
270
+ url << self.http_build_query_rec(orig_key_str, val, false)
271
+ else
272
+ url << "&" if !first or !first_ele
273
+ url << "#{Knj::Web.urlenc(orig_key_str)}=#{Knj::Web.urlenc(val)}"
274
+ end
275
+
276
+ first_ele = false if first_ele
277
+ end
278
+ else
279
+ raise "Unknown class: '#{obj.class.name}'."
280
+ end
281
+
282
+ return url
283
+ end
284
+
285
+ def isset(var)
286
+ return false if var == nil or var == false
287
+ return true
288
+ end
289
+
290
+ def strpos(haystack, needle)
291
+ return false if !haystack
292
+ return false if !haystack.to_s.include?(needle)
293
+ return haystack.index(needle)
294
+ end
295
+
296
+ def substr(string, from, to = nil)
297
+ if to == nil
298
+ to = string.length
299
+ end
300
+
301
+ string = "#{string[from.to_i, to.to_i]}"
302
+
303
+ if !string.valid_encoding? and Knj::Php.class_exists("Iconv")
252
304
  ic = Iconv.new("UTF-8//IGNORE", "UTF-8")
253
305
  string = ic.iconv(string + " ")[0..-2]
254
306
  end
255
-
256
- return string
257
- end
258
-
259
- def md5(string)
260
- return Digest::MD5.hexdigest(string.to_s)
261
- end
262
-
263
- def header(headerstr)
264
- match = headerstr.to_s.match(/(.*): (.*)/)
265
- if match
266
- key = match[1]
267
- value = match[2]
268
- else
269
- #HTTP/1.1 404 Not Found
270
-
271
- match_status = headerstr.to_s.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.+)$/)
272
- if match_status
273
- key = "Status"
274
- value = match_status[1] + " " + match_status[2]
275
- else
276
- raise "Couldnt parse header."
277
- end
278
- end
279
-
280
- sent = false
281
-
282
- if Knj::Php.class_exists("Apache")
283
- Apache.request.headers_out[key] = value
284
- sent = true
285
- end
286
-
287
- begin
288
- _kas.header(key, value) #This is for knjAppServer - knj.
289
- sent = true
290
- rescue NameError => e
291
- if $knj_eruby
292
- $knj_eruby.header(key, value)
293
- sent = true
294
- elsif $cgi.class.name == "CGI"
295
- sent = true
296
- $cgi.header(key => value)
297
- elsif $_CGI.class.name == "CGI"
298
- sent = true
299
- $_CGI.header(key => value)
300
- end
301
- end
302
-
303
- return sent
304
- end
305
-
306
- def nl2br(string)
307
- return string.to_s.gsub("\n", "<br />\n")
308
- end
309
-
307
+
308
+ return string
309
+ end
310
+
311
+ def md5(string)
312
+ require "digest"
313
+ return Digest::MD5.hexdigest(string.to_s)
314
+ end
315
+
316
+ def header(headerstr)
317
+ match = headerstr.to_s.match(/(.*): (.*)/)
318
+ if match
319
+ key = match[1]
320
+ value = match[2]
321
+ else
322
+ #HTTP/1.1 404 Not Found
323
+
324
+ match_status = headerstr.to_s.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.+)$/)
325
+ if match_status
326
+ key = "Status"
327
+ value = match_status[1] + " " + match_status[2]
328
+ else
329
+ raise "Couldnt parse header."
330
+ end
331
+ end
332
+
333
+ sent = false
334
+
335
+ if Knj::Php.class_exists("Apache")
336
+ Apache.request.headers_out[key] = value
337
+ sent = true
338
+ end
339
+
340
+ begin
341
+ _kas.header(key, value) #This is for knjAppServer - knj.
342
+ sent = true
343
+ rescue NameError => e
344
+ if $knj_eruby
345
+ $knj_eruby.header(key, value)
346
+ sent = true
347
+ elsif $cgi.class.name == "CGI"
348
+ sent = true
349
+ $cgi.header(key => value)
350
+ elsif $_CGI.class.name == "CGI"
351
+ sent = true
352
+ $_CGI.header(key => value)
353
+ end
354
+ end
355
+
356
+ return sent
357
+ end
358
+
359
+ def nl2br(string)
360
+ return string.to_s.gsub("\n", "<br />\n")
361
+ end
362
+
310
363
  def urldecode(string)
311
364
  return Knj::Web.urldec(string)
312
365
  end
@@ -316,289 +369,318 @@ module Knj::Php
316
369
  end
317
370
 
318
371
  def parse_str(str, hash)
319
- CGI.parse(str).each do |key, val|
372
+ res = Knj::Web.parse_urlquery(str, {:urldecode => true})
373
+ res.each do |key, val|
320
374
  hash[key] = val
321
375
  end
322
376
  end
323
-
324
- def file_put_contents(filepath, content)
325
- File.open(filepath.untaint, "w") do |file|
326
- file.write(content)
327
- end
328
- end
329
-
330
- def file_get_contents(filepath)
331
- filepath = filepath.to_s
332
-
333
- if http_match = filepath.match(/^http(s|):\/\/([A-z_\d\.]+)(|:(\d+))(\/(.+))$/)
334
- if http_match[4].to_s.length > 0
335
- port = http_match[4].to_i
336
- end
337
-
338
- args = {
339
- "host" => http_match[2]
340
- }
341
-
342
- if http_match[1] == "s"
343
- args["ssl"] = true
344
- args["validate"] = false
345
-
346
- if !port
347
- port = 443
348
- end
349
- end
350
-
351
- args["port"] = port if port
352
-
353
- http = Knj::Http.new(args)
354
- data = http.get(http_match[5])
355
- return data["data"]
356
- end
357
-
358
- return File.read(filepath.untaint)
359
- end
360
-
361
- def is_file(filepath)
362
- begin
363
- if File.file?(filepath)
364
- return true
365
- end
366
- rescue Exception
367
- return false
368
- end
369
-
370
- return false
371
- end
372
-
373
- def is_dir(filepath)
374
- begin
375
- if File.directory?(filepath)
376
- return true
377
- end
378
- rescue Exception
379
- return false
380
- end
381
-
382
- return false
383
- end
384
-
385
- def unlink(filepath)
386
- FileUtils.rm(filepath)
387
- end
388
-
389
- def file_exists(filepath)
390
- return true if File.exists?(filepath.to_s.untaint)
391
- return false
392
- end
393
-
394
- def strtotime(date_string, cur = nil)
395
- if !cur
396
- cur = Time.new
397
- else
398
- cur = Time.at(cur)
399
- end
400
-
401
- date_string = date_string.to_s.downcase
402
-
403
- if date_string.match(/[0-9]+-[0-9]+-[0-9]+/i)
404
- begin
405
- return Time.local(*ParseDate.parsedate(date_string)).to_i
406
- rescue
407
- return 0
408
- end
409
- end
410
-
411
- date_string.scan(/((\+|-)([0-9]+) (\S+))/) do |match|
412
- timestr = match[3]
413
- number = match[2].to_i
414
- mathval = match[1]
415
- add = nil
416
-
417
- if timestr == "years" or timestr == "year"
418
- add = ((number.to_i * 3600) * 24) * 365
419
- elsif timestr == "months" or timestr == "month"
420
- add = ((number.to_i * 3600) * 24) * 30
421
- elsif timestr == "weeks" or timestr == "week"
422
- add = (number.to_i * 3600) * 24 * 7
423
- elsif timestr == "days" or timestr == "day"
424
- add = (number.to_i * 3600) * 24
425
- elsif timestr == "hours" or timestr == "hour"
426
- add = number.to_i * 3600
427
- elsif timestr == "minutes" or timestr == "minute" or timestr == "min" or timestr == "mints"
428
- add = number.to_i * 60
429
- elsif timestr == "seconds" or timestr == "second" or timestr == "sec" or timestr == "secs"
430
- add = number.to_i
431
- end
432
-
433
- if mathval == "+"
434
- cur += add
435
- elsif mathval == "-"
436
- cur -= add
437
- end
438
- end
439
-
440
- return cur.to_i
441
- end
442
-
443
- def class_exists(classname)
444
- begin
445
- Kernel.const_get(classname)
446
- return true
447
- rescue Exception
448
- return false
449
- end
450
- end
451
-
452
- def html_entity_decode(string)
453
- string = Knj::Web.html(string)
454
- string = string.gsub("&oslash;", "ø").gsub("&aelig;", "æ").gsub("&aring;", "å").gsub("&euro;", "€").gsub("#39;", "'")
455
- return string
456
- end
457
-
458
- def strip_tags(htmlstr)
459
- htmlstr.scan(/(<([\/A-z]+).*?>)/) do |match|
460
- htmlstr = htmlstr.gsub(match[0], "")
461
- end
462
-
463
- return htmlstr.gsub("&nbsp;", " ")
464
- end
465
-
466
- def die(msg)
467
- print msg
468
- exit
469
- end
470
-
471
- def fopen(filename, mode)
472
- begin
473
- return File.open(filename, mode)
474
- rescue Exception
475
- return false
476
- end
477
- end
478
-
479
- def fwrite(fp, str)
480
- begin
481
- fp.print str
482
- rescue Exception
483
- return false
484
- end
485
-
486
- return true
487
- end
488
-
489
- def fputs(fp, str)
490
- begin
491
- fp.print str
492
- rescue Exception
493
- return false
494
- end
495
-
496
- return true
497
- end
498
-
499
- def fread(fp, length = 4096)
500
- return fp.read(length)
501
- end
502
-
503
- def fgets(fp, length = 4096)
504
- return fp.read(length)
505
- end
506
-
507
- def fclose(fp)
508
- fp.close
509
- end
510
-
511
- def move_uploaded_file(tmp_path, new_path)
512
- FileUtils.mv(tmp_path.untaint, new_path.untaint)
513
- end
514
-
515
- def utf8_encode(str)
516
- str = str.to_s if str.respond_to?(:to_s)
517
- require "iconv" if RUBY_PLATFORM == "java" #This fixes a bug in JRuby where Iconv otherwise would not be detected.
518
-
519
- if str.respond_to?(:encode)
520
- return str.encode("iso-8859-1", "utf-8")
521
- elsif Knj::Php.class_exists("Iconv")
522
- begin
523
- return Iconv.conv("iso-8859-1", "utf-8", str)
524
- rescue
525
- return Iconv.conv("iso-8859-1//ignore", "utf-8", str + " ").slice(0..-2)
526
- end
527
- else
528
- raise "Could not figure out how to utf8-encode string."
529
- end
530
- end
531
-
532
- def utf8_decode(str)
533
- str = str.to_s if str.respond_to?(:to_s)
534
- require "iconv" if RUBY_PLATFORM == "java" #This fixes a bug in JRuby where Iconv otherwise would not be detected.
535
-
536
- if str.respond_to?(:encode)
537
- return str.encode("utf-8", "iso-8859-1")
538
- elsif Knj::Php.class_exists("Iconv")
539
- begin
540
- return Iconv.conv("utf-8", "iso-8859-1", str.to_s)
541
- rescue
542
- return Iconv.conv("utf-8//ignore", "iso-8859-1", str.to_s)
543
- end
544
- else
545
- raise "Could not figure out how to utf8-decode string."
546
- end
547
- end
548
-
549
- def setcookie(cname, cvalue, expire = nil, domain = nil)
550
- args = {
551
- "name" => cname,
552
- "value" => cvalue,
553
- "path" => "/"
554
- }
555
- args["expires"] = Time.at(expire) if expire
556
- args["domain"] = domain if domain
557
-
558
- begin
377
+
378
+ def file_put_contents(filepath, content)
379
+ File.open(filepath.untaint, "w") do |file|
380
+ file.write(content)
381
+ end
382
+ end
383
+
384
+ def file_get_contents(filepath)
385
+ filepath = filepath.to_s
386
+
387
+ if http_match = filepath.match(/^http(s|):\/\/([A-z_\d\.]+)(|:(\d+))(\/(.+))$/)
388
+ if http_match[4].to_s.length > 0
389
+ port = http_match[4].to_i
390
+ end
391
+
392
+ args = {
393
+ "host" => http_match[2]
394
+ }
395
+
396
+ if http_match[1] == "s"
397
+ args["ssl"] = true
398
+ args["validate"] = false
399
+
400
+ if !port
401
+ port = 443
402
+ end
403
+ end
404
+
405
+ args["port"] = port if port
406
+
407
+ http = Knj::Http.new(args)
408
+ data = http.get(http_match[5])
409
+ return data["data"]
410
+ end
411
+
412
+ return File.read(filepath.untaint)
413
+ end
414
+
415
+ def is_file(filepath)
416
+ begin
417
+ if File.file?(filepath)
418
+ return true
419
+ end
420
+ rescue Exception
421
+ return false
422
+ end
423
+
424
+ return false
425
+ end
426
+
427
+ def is_dir(filepath)
428
+ begin
429
+ if File.directory?(filepath)
430
+ return true
431
+ end
432
+ rescue Exception
433
+ return false
434
+ end
435
+
436
+ return false
437
+ end
438
+
439
+ def unlink(filepath)
440
+ FileUtils.rm(filepath)
441
+ end
442
+
443
+ def file_exists(filepath)
444
+ return true if File.exists?(filepath.to_s.untaint)
445
+ return false
446
+ end
447
+
448
+ def strtotime(date_string, cur = nil)
449
+ if !cur
450
+ cur = Time.new
451
+ else
452
+ cur = Time.at(cur)
453
+ end
454
+
455
+ date_string = date_string.to_s.downcase
456
+
457
+ if date_string.match(/[0-9]+-[0-9]+-[0-9]+/i)
458
+ begin
459
+ return Time.local(*ParseDate.parsedate(date_string)).to_i
460
+ rescue
461
+ return 0
462
+ end
463
+ end
464
+
465
+ date_string.scan(/((\+|-)([0-9]+) (\S+))/) do |match|
466
+ timestr = match[3]
467
+ number = match[2].to_i
468
+ mathval = match[1]
469
+ add = nil
470
+
471
+ if timestr == "years" or timestr == "year"
472
+ add = ((number.to_i * 3600) * 24) * 365
473
+ elsif timestr == "months" or timestr == "month"
474
+ add = ((number.to_i * 3600) * 24) * 30
475
+ elsif timestr == "weeks" or timestr == "week"
476
+ add = (number.to_i * 3600) * 24 * 7
477
+ elsif timestr == "days" or timestr == "day"
478
+ add = (number.to_i * 3600) * 24
479
+ elsif timestr == "hours" or timestr == "hour"
480
+ add = number.to_i * 3600
481
+ elsif timestr == "minutes" or timestr == "minute" or timestr == "min" or timestr == "mints"
482
+ add = number.to_i * 60
483
+ elsif timestr == "seconds" or timestr == "second" or timestr == "sec" or timestr == "secs"
484
+ add = number.to_i
485
+ end
486
+
487
+ if mathval == "+"
488
+ cur += add
489
+ elsif mathval == "-"
490
+ cur -= add
491
+ end
492
+ end
493
+
494
+ return cur.to_i
495
+ end
496
+
497
+ def class_exists(classname)
498
+ begin
499
+ Kernel.const_get(classname)
500
+ return true
501
+ rescue Exception
502
+ return false
503
+ end
504
+ end
505
+
506
+ def html_entity_decode(string)
507
+ string = Knj::Web.html(string)
508
+ string = string.gsub("&oslash;", "ø").gsub("&aelig;", "æ").gsub("&aring;", "å").gsub("&euro;", "€").gsub("#39;", "'").gsub("&amp;", "&").gsub("&gt;", ">").gsub("&lt;", "<").gsub("&quot;", '"').gsub("&#039;", "'")
509
+ return string
510
+ end
511
+
512
+ def strip_tags(htmlstr)
513
+ htmlstr.scan(/(<([\/A-z]+).*?>)/) do |match|
514
+ htmlstr = htmlstr.gsub(match[0], "")
515
+ end
516
+
517
+ return htmlstr.gsub("&nbsp;", " ")
518
+ end
519
+
520
+ def die(msg)
521
+ print msg
522
+ exit
523
+ end
524
+
525
+ def opendir(dirpath)
526
+ res = {:files => [], :index => 0}
527
+ Dir.foreach(dirpath) do |file|
528
+ res[:files] << file
529
+ end
530
+
531
+ return res
532
+ end
533
+
534
+ def readdir(res)
535
+ ret = res[:files][res[:index]] if res[:files].index(res[:index]) != nil
536
+ return false if !ret
537
+ res[:index] += 1
538
+ return ret
539
+ end
540
+
541
+ def fopen(filename, mode)
542
+ begin
543
+ return File.open(filename, mode)
544
+ rescue Exception
545
+ return false
546
+ end
547
+ end
548
+
549
+ def fwrite(fp, str)
550
+ begin
551
+ fp.print str
552
+ rescue Exception
553
+ return false
554
+ end
555
+
556
+ return true
557
+ end
558
+
559
+ def fputs(fp, str)
560
+ begin
561
+ fp.print str
562
+ rescue Exception
563
+ return false
564
+ end
565
+
566
+ return true
567
+ end
568
+
569
+ def fread(fp, length = 4096)
570
+ return fp.read(length)
571
+ end
572
+
573
+ def fgets(fp, length = 4096)
574
+ return fp.read(length)
575
+ end
576
+
577
+ def fclose(fp)
578
+ fp.close
579
+ end
580
+
581
+ def move_uploaded_file(tmp_path, new_path)
582
+ FileUtils.mv(tmp_path.untaint, new_path.untaint)
583
+ end
584
+
585
+ def utf8_encode(str)
586
+ str = str.to_s if str.respond_to?("to_s")
587
+
588
+ if str.respond_to?("encode")
589
+ begin
590
+ return str.encode("iso-8859-1", "utf-8")
591
+ rescue Encoding::InvalidByteSequenceError
592
+ #ignore - try iconv
593
+ end
594
+ end
595
+
596
+ require "iconv"
597
+
598
+ begin
599
+ return Iconv.conv("iso-8859-1", "utf-8", str.to_s)
600
+ rescue
601
+ return Iconv.conv("iso-8859-1//ignore", "utf-8", "#{str} ").slice(0..-2)
602
+ end
603
+ end
604
+
605
+ def utf8_decode(str)
606
+ str = str.to_s if str.respond_to?(:to_s)
607
+ require "iconv" if RUBY_PLATFORM == "java" #This fixes a bug in JRuby where Iconv otherwise would not be detected.
608
+
609
+ if str.respond_to?(:encode)
610
+ begin
611
+ return str.encode("utf-8", "iso-8859-1")
612
+ rescue Encoding::InvalidByteSequenceError
613
+ #ignore - try iconv
614
+ end
615
+ end
616
+
617
+ require "iconv"
618
+
619
+ begin
620
+ return Iconv.conv("utf-8", "iso-8859-1", str.to_s)
621
+ rescue
622
+ return Iconv.conv("utf-8//ignore", "iso-8859-1", str.to_s)
623
+ end
624
+ end
625
+
626
+ def setcookie(cname, cvalue, expire = nil, domain = nil)
627
+ args = {
628
+ "name" => cname,
629
+ "value" => cvalue,
630
+ "path" => "/"
631
+ }
632
+ args["expires"] = Time.at(expire) if expire
633
+ args["domain"] = domain if domain
634
+
635
+ begin
559
636
  _kas.cookie(args)
560
- rescue NameError
637
+ rescue NameError
561
638
  cookie = CGI::Cookie.new(args)
562
639
  status = Knj::Php.header("Set-Cookie: #{cookie.to_s}")
563
640
  $_COOKIE[cname] = cvalue if $_COOKIE
564
641
  end
565
642
 
566
- return status
567
- end
568
-
569
- def explode(expl, strexp)
570
- return strexp.to_s.split(expl)
571
- end
572
-
573
- def dirname(filename)
574
- File.dirname(filename)
575
- end
576
-
577
- def chdir(dirname)
578
- Dir.chdir(dirname)
579
- end
580
-
581
- def include_once(filename)
582
- require filename
583
- end
584
-
585
- def require_once(filename)
586
- require filename
587
- end
588
-
589
- def echo(string)
590
- print string
591
- end
592
-
593
- def msgbox(title, msg, type)
594
- Knj::Gtk2.msgbox(msg, type, title)
595
- end
596
-
597
- def count(array)
598
- return array.length
599
- end
600
-
601
- def json_encode(obj)
643
+ return status
644
+ end
645
+
646
+ #This method is only here for convertion support - it doesnt do anything.
647
+ def session_start
648
+
649
+ end
650
+
651
+ def explode(expl, strexp)
652
+ return strexp.to_s.split(expl)
653
+ end
654
+
655
+ def dirname(filename)
656
+ File.dirname(filename)
657
+ end
658
+
659
+ def chdir(dirname)
660
+ Dir.chdir(dirname)
661
+ end
662
+
663
+ def include_once(filename)
664
+ require filename
665
+ end
666
+
667
+ def require_once(filename)
668
+ require filename
669
+ end
670
+
671
+ def echo(string)
672
+ print string
673
+ end
674
+
675
+ def msgbox(title, msg, type)
676
+ Knj::Gtk2.msgbox(msg, type, title)
677
+ end
678
+
679
+ def count(array)
680
+ return array.length
681
+ end
682
+
683
+ def json_encode(obj)
602
684
  if Knj::Php.class_exists("Rho")
603
685
  return Rho::JSON.generate(obj)
604
686
  elsif Knj::Php.class_exists("JSON")
@@ -606,9 +688,11 @@ module Knj::Php
606
688
  else
607
689
  raise "Could not figure out which JSON lib to use."
608
690
  end
609
- end
610
-
611
- def json_decode(data)
691
+ end
692
+
693
+ def json_decode(data, as_array = false)
694
+ #FIXME: Should be able to return as object, which will break all projects using it without second argument...
695
+
612
696
  raise "String was not given to 'Knj::Php.json_decode'." if !data.is_a?(String)
613
697
 
614
698
  if Knj::Php.class_exists("Rho")
@@ -618,136 +702,143 @@ module Knj::Php
618
702
  else
619
703
  raise "Could not figure out which JSON lib to use."
620
704
  end
621
- end
622
-
623
- def time
624
- return Time.new.to_i
625
- end
626
-
627
- def microtime(get_as_float = false)
628
- microtime = Time.now.to_f
629
-
630
- return microtime if get_as_float
631
-
632
- splitted = microtime.to_s.split(",")
633
- return "#{splitted[0]} #{splitted[1]}"
634
- end
635
-
636
- def mktime(hour = nil, min = nil, sec = nil, date = nil, month = nil, year = nil, is_dst = -1)
637
- cur_time = Time.new
638
-
639
- hour = cur_time.hour if hour == nil
640
- min = cur_time.min if min == nil
641
- sec = cur_time.sec if sec == nil
642
- date = cur_time.date if date == nil
643
- month = cur_time.month if month == nil
644
- year = cur_time.year if year == nil
645
-
646
- new_time = Knj::Datet.in("#{year.to_s}-#{month.to_s}-#{date.to_s} #{hour.to_s}:#{min.to_s}:#{sec.to_s}")
647
- return new_time.to_i
648
- end
649
-
650
- def date(date_format, date_unixt = nil)
651
- date_unixt = Time.now.to_i if date_unixt == nil
652
-
653
- date_object = Time.at(date_unixt.to_i)
654
-
655
- date_format = date_format.gsub("d", "%02d" % date_object.mday)
656
- date_format = date_format.gsub("m", "%02d" % date_object.mon)
657
- date_format = date_format.gsub("y", "%02d" % date_object.year.to_s[2,2].to_i)
658
- date_format = date_format.gsub("Y", "%04d" % date_object.year)
659
- date_format = date_format.gsub("H", "%02d" % date_object.hour)
660
- date_format = date_format.gsub("i", "%02d" % date_object.min)
661
- date_format = date_format.gsub("s", "%02d" % date_object.sec)
662
-
663
- return date_format
664
- end
665
-
666
- def basename(filepath)
667
- splitted = filepath.to_s.split("/").last
668
- return false if !splitted
669
-
670
- ret = splitted.split(".")
671
- ret.delete(ret.last)
672
- return ret.join(".")
673
- end
674
-
675
- def base64_encode(str)
676
- return Base64.encode64(str.to_s)
677
- end
678
-
679
- def base64_decode(str)
680
- return Base64.decode64(str.to_s)
681
- end
682
-
683
- def pathinfo(filepath)
684
- filepath = filepath.to_s
685
-
686
- dirname = File.dirname(filepath)
687
- dirname = "" if dirname == "."
688
-
689
- return {
690
- "dirname" => dirname,
691
- "basename" => self.basename(filepath),
692
- "extension" => filepath.split(".").last,
693
- "filename" => filepath.split("/").last
694
- }
695
- end
696
-
697
- def realpath(pname)
698
- begin
699
- return Pathname.new(pname.to_s).realpath.to_s
700
- rescue => e
701
- return false
702
- end
703
- end
704
-
705
- # Returns the scripts current memory usage.
706
- def memory_get_usage
707
- # FIXME: This only works on Linux at the moment, since we are doing this by command line - knj.
708
- memory_usage = `ps -o rss= -p #{Process.pid}`.to_i * 1024
709
- return memory_usage
710
- end
711
-
712
- # Should return the peak usage of the running script, but I have found no way to detect this... Instead returns the currently memory usage.
713
- def memory_get_peak_usage
714
- return self.memory_get_usage
715
- end
716
-
717
- def ip2long(ip)
718
- return IPAddr.new(ip).to_i
719
- end
720
-
721
- # Thanks to this link for the following functions: http://snippets.dzone.com/posts/show/4509
722
- def long2ip(long)
723
- ip = []
724
- 4.times do |i|
725
- ip.push(long.to_i & 255)
726
- long = long.to_i >> 8
727
- end
728
-
729
- ip.reverse.join(".")
730
- end
731
-
732
- def gzcompress(str, level = 3)
733
- zstream = Zlib::Deflate.new
734
- gzip_str = zstream.deflate(str.to_s, Zlib::FINISH)
735
- zstream.close
736
-
737
- return gzip_str
738
- end
739
-
740
- def gzuncompress(str, length = 0)
741
- zstream = Zlib::Inflate.new
742
- plain_str = zstream.inflate(str.to_s)
743
- zstream.finish
744
- zstream.close
745
-
746
- return plain_str.to_s
747
- end
748
-
749
- #Sort methods.
750
- def ksort(hash)
705
+ end
706
+
707
+ def time
708
+ return Time.now.to_i
709
+ end
710
+
711
+ def microtime(get_as_float = false)
712
+ microtime = Time.now.to_f
713
+
714
+ return microtime if get_as_float
715
+
716
+ splitted = microtime.to_s.split(",")
717
+ return "#{splitted[0]} #{splitted[1]}"
718
+ end
719
+
720
+ def mktime(hour = nil, min = nil, sec = nil, date = nil, month = nil, year = nil, is_dst = -1)
721
+ cur_time = Time.new
722
+
723
+ hour = cur_time.hour if hour == nil
724
+ min = cur_time.min if min == nil
725
+ sec = cur_time.sec if sec == nil
726
+ date = cur_time.date if date == nil
727
+ month = cur_time.month if month == nil
728
+ year = cur_time.year if year == nil
729
+
730
+ new_time = Knj::Datet.in("#{year.to_s}-#{month.to_s}-#{date.to_s} #{hour.to_s}:#{min.to_s}:#{sec.to_s}")
731
+ return new_time.to_i
732
+ end
733
+
734
+ def date(date_format, date_input = nil)
735
+ if date_input == nil
736
+ date_object = Time.now
737
+ elsif Knj::Php.is_numeric(date_input)
738
+ date_object = Time.at(date_input.to_i)
739
+ elsif date_input.is_a?(Knj::Datet)
740
+ date_object = date_input.time
741
+ elsif date_input.is_a?(Time)
742
+ date_object = date_input
743
+ else
744
+ raise "Unknown date given: '#{date_input}', '#{date_input.class.name}'."
745
+ end
746
+
747
+ date_format = date_format.gsub("Y", "%Y").gsub("y", "%y").gsub("m", "%m").gsub("d", "%d").gsub("H", "%H").gsub("i", "%M").gsub("s", "%S")
748
+ return date_object.strftime(date_format)
749
+ end
750
+
751
+ def basename(filepath)
752
+ splitted = filepath.to_s.split("/").last
753
+ return false if !splitted
754
+
755
+ ret = splitted.split(".")
756
+ ret.delete(ret.last)
757
+ return ret.join(".")
758
+ end
759
+
760
+ def base64_encode(str)
761
+ return Base64.encode64(str.to_s)
762
+ end
763
+
764
+ def base64_decode(str)
765
+ return Base64.decode64(str.to_s)
766
+ end
767
+
768
+ def pathinfo(filepath)
769
+ filepath = filepath.to_s
770
+
771
+ dirname = File.dirname(filepath)
772
+ dirname = "" if dirname == "."
773
+
774
+ return {
775
+ "dirname" => dirname,
776
+ "basename" => self.basename(filepath),
777
+ "extension" => filepath.split(".").last,
778
+ "filename" => filepath.split("/").last
779
+ }
780
+ end
781
+
782
+ def realpath(pname)
783
+ require "pathname"
784
+
785
+ begin
786
+ return Pathname.new(pname.to_s).realpath.to_s
787
+ rescue => e
788
+ return false
789
+ end
790
+ end
791
+
792
+ # Returns the scripts current memory usage.
793
+ def memory_get_usage
794
+ # FIXME: This only works on Linux at the moment, since we are doing this by command line - knj.
795
+ memory_usage = `ps -o rss= -p #{Process.pid}`.to_i * 1024
796
+ return memory_usage
797
+ end
798
+
799
+ # Should return the peak usage of the running script, but I have found no way to detect this... Instead returns the currently memory usage.
800
+ def memory_get_peak_usage
801
+ return self.memory_get_usage
802
+ end
803
+
804
+ def ip2long(ip)
805
+ return IPAddr.new(ip).to_i
806
+ end
807
+
808
+ # Thanks to this link for the following functions: http://snippets.dzone.com/posts/show/4509
809
+ def long2ip(long)
810
+ ip = []
811
+ 4.times do |i|
812
+ ip.push(long.to_i & 255)
813
+ long = long.to_i >> 8
814
+ end
815
+
816
+ ip.reverse.join(".")
817
+ end
818
+
819
+ def gzcompress(str, level = 3)
820
+ require "zlib"
821
+
822
+ zstream = Zlib::Deflate.new
823
+ gzip_str = zstream.deflate(str.to_s, Zlib::FINISH)
824
+ zstream.close
825
+
826
+ return gzip_str
827
+ end
828
+
829
+ def gzuncompress(str, length = 0)
830
+ require "zlib"
831
+
832
+ zstream = Zlib::Inflate.new
833
+ plain_str = zstream.inflate(str.to_s)
834
+ zstream.finish
835
+ zstream.close
836
+
837
+ return plain_str.to_s
838
+ end
839
+
840
+ #Sort methods.
841
+ def ksort(hash)
751
842
  nhash = hash.sort do |a, b|
752
843
  a[0] <=> b[0]
753
844
  end
@@ -758,7 +849,86 @@ module Knj::Php
758
849
  end
759
850
 
760
851
  return newhash
761
- end
762
-
852
+ end
853
+
854
+ #Foreach emulator.
855
+ def foreach(element, &block)
856
+ raise "No or unsupported block given." if !block.respond_to?(:call) or !block.respond_to?(:arity)
857
+ arity = block.arity
858
+
859
+ if element.is_a?(Array)
860
+ element.each_index do |key|
861
+ if arity == 2
862
+ block.call(key, element[key])
863
+ elsif arity == 1
864
+ block.call(element[key])
865
+ else
866
+ raise "Unknown arity: '#{arity}'."
867
+ end
868
+ end
869
+ elsif element.is_a?(Hash)
870
+ element.each do |key, val|
871
+ if arity == 2
872
+ block.call(key, val)
873
+ elsif arity == 1
874
+ block.call(val)
875
+ else
876
+ raise "Unknown arity: '#{arity}'."
877
+ end
878
+ end
879
+ else
880
+ raise "Unknown element: '#{element.class.name}'."
881
+ end
882
+ end
883
+
884
+ #Array-function emulator.
885
+ def array(*ele)
886
+ return {} if ele.length <= 0
887
+
888
+ if ele.length == 1 and ele.first.is_a?(Hash)
889
+ return ele.first
890
+ end
891
+
892
+ return ele
893
+ end
894
+
895
+ def array_key_exists(key, arr)
896
+ if arr.is_a?(Hash)
897
+ return arr.key?(key)
898
+ elsif arr.is_a?(Array)
899
+ return true if arr.index(key) != nil
900
+ return false
901
+ else
902
+ raise "Unknown type of argument: '#{arr.class.name}'."
903
+ end
904
+ end
905
+
906
+ def empty(obj)
907
+ if obj.respond_to?("empty?")
908
+ return obj.empty?
909
+ else
910
+ raise "Dont know how to handle object on 'empty': '#{obj.class.name}'."
911
+ end
912
+ end
913
+
914
+ def trim(argument)
915
+ return argument.to_s.strip
916
+ end
917
+
918
+ def serialize(argument)
919
+ require "php_serialize" #gem: php-serialize
920
+ return PHP.serialize(argument)
921
+ end
922
+
923
+ def unserialize(argument)
924
+ require "php_serialize" #gem: php-serialize
925
+ return PHP.unserialize(argument.to_s)
926
+ end
927
+
928
+ @methods = instance_methods
929
+ def self.php_list_defined_methods
930
+ return @methods
931
+ end
932
+
763
933
  module_function(*instance_methods)
764
934
  end