/web/javascript/phpserializer.js

https://gitlab.com/ign/bahra · JavaScript · 324 lines · 303 code · 3 blank · 18 comment · 66 complexity · 3cf7222f08abd118c5ee03085468747c MD5 · raw file

  1. /* phpserializer.js - JavaScript to PHP serialize / unserialize class.
  2. *
  3. * This class is designed to convert php variables to javascript
  4. * and javascript variables to php with a php serialize unserialize
  5. * compatible way.
  6. *
  7. * Copyright (C) 2006 Ma Bingyao <andot@ujn.edu.cn>
  8. * Version: 3.0e
  9. * LastModified: Jul 30, 2006
  10. * This library is free. You can redistribute it and/or modify it.
  11. * http://www.coolcode.cn/?p=171
  12. */
  13. function utf16to8 (str){return str};
  14. function utf8to16 (str){return str};
  15. function serialize(o) {
  16. var p = 0, sb = [], ht = [], hv = 1;
  17. function classname(o) {
  18. if (typeof(o) == "undefined" || typeof(o.constructor) == "undefined") return '';
  19. var c = o.constructor.toString();
  20. c = utf16to8(c.substr(0, c.indexOf('(')).replace(/(^\s*function\s*)|(\s*$)/ig, ''));
  21. return ((c == '') ? 'Object' : c);
  22. }
  23. function is_int(n) {
  24. var s = n.toString(), l = s.length;
  25. if (l > 11) return false;
  26. for (var i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {
  27. switch (s.charAt(i)) {
  28. case '0':
  29. case '1':
  30. case '2':
  31. case '3':
  32. case '4':
  33. case '5':
  34. case '6':
  35. case '7':
  36. case '8':
  37. case '9': break;
  38. default : return false;
  39. }
  40. }
  41. return !(n < Number.MIN_VALUE || n > Number.MAX_VALUE);
  42. }
  43. function in_ht(o) {
  44. for (k in ht) if (ht[k] === o) return k;
  45. return false;
  46. }
  47. function ser_null() {
  48. sb[p++] = 'N;';
  49. }
  50. function ser_boolean(b) {
  51. sb[p++] = (b ? 'b:1;' : 'b:0;');
  52. }
  53. function ser_integer(i) {
  54. sb[p++] = 'i:' + i + ';';
  55. }
  56. function ser_double(d) {
  57. if (isNaN(d)) d = 'NAN';
  58. else if (d == Number.POSITIVE_INFINITY) d = 'INF';
  59. else if (d == Number.NEGATIVE_INFINITY) d = '-INF';
  60. sb[p++] = 'd:' + d + ';';
  61. }
  62. function ser_string(s) {
  63. var utf8 = utf16to8(s);
  64. sb[p++] = 's:' + utf8.length + ':"';
  65. sb[p++] = utf8;
  66. sb[p++] = '";';
  67. }
  68. function ser_array(a) {
  69. sb[p++] = 'a:';
  70. var lp = p;
  71. sb[p++] = 0;
  72. sb[p++] = ':{';
  73. for (var k in a) {
  74. if (typeof(a[k]) != 'function') {
  75. is_int(k) ? ser_integer(k) : ser_string(k);
  76. __serialize(a[k]);
  77. sb[lp]++;
  78. }
  79. }
  80. sb[p++] = '}';
  81. }
  82. function ser_object(o) {
  83. var cn = classname(o);
  84. if (cn == '') ser_null();
  85. else if (typeof(o.serialize) != 'function') {
  86. sb[p++] = 'O:' + cn.length + ':"';
  87. sb[p++] = cn;
  88. sb[p++] = '":';
  89. var lp = p;
  90. sb[p++] = 0;
  91. sb[p++] = ':{';
  92. if (typeof(o.__sleep) == 'function') {
  93. var a = o.__sleep();
  94. for (var kk in a) {
  95. ser_string(a[kk]);
  96. __serialize(o[a[kk]]);
  97. sb[lp]++;
  98. }
  99. }
  100. else {
  101. for (var k in o) {
  102. if (typeof(o[k]) != 'function') {
  103. ser_string(k);
  104. __serialize(o[k]);
  105. sb[lp]++;
  106. }
  107. }
  108. }
  109. sb[p++] = '}';
  110. }
  111. else {
  112. var cs = o.serialize();
  113. sb[p++] = 'C:' + cn.length + ':"';
  114. sb[p++] = cn;
  115. sb[p++] = '":' + cs.length + ':{';
  116. sb[p++] = cs;
  117. sb[p++] = "}";
  118. }
  119. }
  120. function ser_pointref(R) {
  121. sb[p++] = "R:" + R + ";";
  122. }
  123. function ser_ref(r) {
  124. sb[p++] = "r:" + r + ";";
  125. }
  126. function __serialize(o) {
  127. if (o == null || o.constructor == Function) {
  128. hv++;
  129. ser_null();
  130. }
  131. else switch (o.constructor) {
  132. case Boolean: {
  133. hv++;
  134. ser_boolean(o);
  135. break;
  136. }
  137. case Number: {
  138. hv++;
  139. is_int(o) ? ser_integer(o) : ser_double(o);
  140. break;
  141. }
  142. case String: {
  143. hv++;
  144. ser_string(o);
  145. break;
  146. }
  147. /*@cc_on @*/
  148. /*@if (@_jscript)
  149. case VBArray: {
  150. o = o.toArray();
  151. }
  152. @end @*/
  153. case Array: {
  154. var r = in_ht(o);
  155. if (r) {
  156. ser_pointref(r);
  157. }
  158. else {
  159. ht[hv++] = o;
  160. ser_array(o);
  161. }
  162. break;
  163. }
  164. default: {
  165. var r = in_ht(o);
  166. if (r) {
  167. hv++;
  168. ser_ref(r);
  169. }
  170. else {
  171. ht[hv++] = o;
  172. ser_object(o);
  173. }
  174. break;
  175. }
  176. }
  177. }
  178. __serialize(o);
  179. return sb.join('');
  180. }
  181. function unserialize(ss) {
  182. var p = 0, ht = [], hv = 1; r = null;
  183. function unser_null() {
  184. p++;
  185. return null;
  186. }
  187. function unser_boolean() {
  188. p++;
  189. var b = (ss.charAt(p++) == '1');
  190. p++;
  191. return b;
  192. }
  193. function unser_integer() {
  194. p++;
  195. var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
  196. p++;
  197. return i;
  198. }
  199. function unser_double() {
  200. p++;
  201. var d = ss.substring(p, p = ss.indexOf(';', p));
  202. switch (d) {
  203. case 'NAN': d = NaN; break;
  204. case 'INF': d = Number.POSITIVE_INFINITY; break;
  205. case '-INF': d = Number.NEGATIVE_INFINITY; break;
  206. default: d = parseFloat(d);
  207. }
  208. p++;
  209. return d;
  210. }
  211. function unser_string() {
  212. p++;
  213. var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  214. p += 2;
  215. var s = utf8to16(ss.substring(p, p += l));
  216. p += 2;
  217. return s;
  218. }
  219. function unser_array() {
  220. p++;
  221. var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  222. p += 2;
  223. var a = [];
  224. ht[hv++] = a;
  225. for (var i = 0; i < n; i++) {
  226. var k;
  227. switch (ss.charAt(p++)) {
  228. case 'i': k = unser_integer(); break;
  229. case 's': k = unser_string(); break;
  230. case 'U': k = unser_unicode_string(); break;
  231. default: return false;
  232. }
  233. a[k] = __unserialize();
  234. }
  235. p++;
  236. return a;
  237. }
  238. function unser_object() {
  239. p++;
  240. var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  241. p += 2;
  242. var cn = utf8to16(ss.substring(p, p += l));
  243. p += 2;
  244. var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  245. p += 2;
  246. if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
  247. eval(['function ', cn, '(){}'].join(''));
  248. }
  249. var o = eval(['new ', cn, '()'].join(''));
  250. ht[hv++] = o;
  251. for (var i = 0; i < n; i++) {
  252. var k;
  253. switch (ss.charAt(p++)) {
  254. case 's': k = unser_string(); break;
  255. case 'U': k = unser_unicode_string(); break;
  256. default: return false;
  257. }
  258. if (k.charAt(0) == '\0') {
  259. k = k.substring(k.indexOf('\0', 1) + 1, k.length);
  260. }
  261. o[k] = __unserialize();
  262. }
  263. p++;
  264. if (typeof(o.__wakeup) == 'function') o.__wakeup();
  265. return o;
  266. }
  267. function unser_custom_object() {
  268. p++;
  269. var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  270. p += 2;
  271. var cn = utf8to16(ss.substring(p, p += l));
  272. p += 2;
  273. var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  274. p += 2;
  275. if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
  276. eval(['function ', cn, '(){}'].join(''));
  277. }
  278. var o = eval(['new ', cn, '()'].join(''));
  279. ht[hv++] = o;
  280. if (typeof(o.unserialize) != 'function') p += n;
  281. else o.unserialize(ss.substring(p, p += n));
  282. p++;
  283. return o;
  284. }
  285. function unser_unicode_string() {
  286. p++;
  287. var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
  288. p += 2;
  289. var sb = [];
  290. for (var i = 0; i < l; i++) {
  291. if ((sb[i] = ss.charAt(p++)) == '\\') {
  292. sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += 4), 16));
  293. }
  294. }
  295. p += 2;
  296. return sb.join('');
  297. }
  298. function unser_ref() {
  299. p++;
  300. var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
  301. p++;
  302. return ht[r];
  303. }
  304. function __unserialize() {
  305. switch (ss.charAt(p++)) {
  306. case 'N': return ht[hv++] = unser_null();
  307. case 'b': return ht[hv++] = unser_boolean();
  308. case 'i': return ht[hv++] = unser_integer();
  309. case 'd': return ht[hv++] = unser_double();
  310. case 's': return ht[hv++] = unser_string();
  311. case 'U': return ht[hv++] = unser_unicode_string();
  312. case 'r': return ht[hv++] = unser_ref();
  313. case 'a': return unser_array();
  314. case 'O': return unser_object();
  315. case 'C': return unser_custom_object();
  316. case 'R': return unser_ref();
  317. default: return false;
  318. }
  319. }
  320. return __unserialize();
  321. }