hstore.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module.exports = {
  2. stringifyPart: function(part) {
  3. switch(typeof part) {
  4. case 'boolean':
  5. case 'number':
  6. return String(part)
  7. case 'string':
  8. return '"' + part.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"'
  9. case 'undefined':
  10. return 'NULL'
  11. default:
  12. if (part === null)
  13. return 'NULL'
  14. else
  15. return '"' + JSON.stringify(part).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"'
  16. }
  17. },
  18. stringify: function(data) {
  19. var self = this
  20. return Object.keys(data).map(function(key) {
  21. return self.stringifyPart(key) + '=>' + self.stringifyPart(data[key])
  22. }).join(',')
  23. },
  24. parsePart: function(part) {
  25. part = part.replace(/\\\\/g, '\\').replace(/\\"/g, '"')
  26. switch(part[0]) {
  27. case '{':
  28. case '[':
  29. return JSON.parse(part)
  30. default:
  31. return part
  32. }
  33. },
  34. parse: function(string) {
  35. var self = this
  36. const rx = /\"((?:\\\"|[^"])*)\"\s*\=\>\s*((?:true|false|NULL|\d+|\d+\.\d+|\"((?:\\\"|[^"])*)\"))/g
  37. var object = { }
  38. string.replace(rx, function(match, key, value, innerValue) {
  39. switch(value) {
  40. case 'true':
  41. object[self.parsePart(key)] = true
  42. break
  43. case 'false':
  44. object[self.parsePart(key)] = false
  45. break
  46. case 'NULL':
  47. object[self.parsePart(key)] = null
  48. break
  49. default:
  50. object[self.parsePart(key)] = self.parsePart(innerValue || value)
  51. break
  52. }
  53. })
  54. return object;
  55. }
  56. }