ini.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. var each = require('./each');
  2. var trim = require('./trim');
  3. var safeSet = require('./safeSet');
  4. var safeGet = require('./safeGet');
  5. var endWith = require('./endWith');
  6. var isArr = require('./isArr');
  7. var isObj = require('./isObj');
  8. var regSection = /^\[([^\]]*)\]$/i;
  9. var regKeyVal = /^([^=]+)(=(.*))?$/i;
  10. var regComment = /^\s*[;#]/;
  11. function parse(ini) {
  12. var ret = {};
  13. var section = ret;
  14. each(ini.split('\n'), function(line) {
  15. line = trim(line);
  16. if (!line || line.match(regComment)) return;
  17. var match = line.match(regSection);
  18. if (match && match[1]) {
  19. var _key = match[1];
  20. section = safeGet(ret, _key) || {};
  21. return safeSet(ret, _key, section);
  22. }
  23. match = line.match(regKeyVal);
  24. if (!match) return;
  25. var key = trim(match[1]);
  26. var val = match[2] ? trim(match[3]) : true;
  27. if (val === 'true') val = true;
  28. if (val === 'false') val = false;
  29. if (val === 'null') val = null;
  30. if (endWith(key, '[]')) {
  31. key = key.substring(0, key.length - 2);
  32. if (!section[key]) section[key] = [];
  33. }
  34. isArr(section[key]) ? section[key].push(val) : (section[key] = val);
  35. });
  36. return ret;
  37. }
  38. function stringify(obj) {
  39. var options =
  40. arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  41. var ret = '';
  42. var section = options.section;
  43. var whitespace = options.whitespace;
  44. var separator = whitespace ? ' = ' : '=';
  45. var children = [];
  46. each(obj, function(val, key) {
  47. if (isArr(val)) {
  48. each(val, function(item) {
  49. ret += ''
  50. .concat(key, '[]')
  51. .concat(separator)
  52. .concat(item, '\n');
  53. });
  54. } else if (isObj(val)) {
  55. children.push({
  56. key: key,
  57. val: val
  58. });
  59. } else {
  60. ret += ''
  61. .concat(key)
  62. .concat(separator)
  63. .concat(val, '\n');
  64. }
  65. });
  66. if (section && ret) {
  67. ret = '['.concat(section, ']\n') + ret;
  68. }
  69. section = section ? section + '.' : '';
  70. each(children, function(child) {
  71. child = stringify(child.val, {
  72. section: section + child.key,
  73. whitespace: options.whitespace
  74. });
  75. if (child) {
  76. if (ret) {
  77. ret += '\n';
  78. }
  79. ret += child;
  80. }
  81. });
  82. return ret;
  83. }
  84. exports = {
  85. parse: parse,
  86. stringify: stringify
  87. };
  88. module.exports = exports;