kernel-goodies.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //jshint eqnull:true
  2. define(function () {
  3. "use strict";
  4. function inherits (child, parent) {
  5. child.prototype = Object.create(parent.prototype, {
  6. constructor: {
  7. value: child,
  8. enumerable: false, configurable: true, writable: true
  9. }
  10. });
  11. return child;
  12. }
  13. function installMethodOfJsObject (obj, name, fn) {
  14. Object.defineProperty(obj, name, {
  15. value: fn,
  16. enumerable: false, configurable: true, writable: true
  17. });
  18. }
  19. function declareJsMethod (obj, name) {
  20. if (obj[name] != null) return;
  21. Object.defineProperty(obj, name, {
  22. value: function () {
  23. },
  24. enumerable: false, configurable: true, writable: true
  25. });
  26. }
  27. /* Convert a Smalltalk selector into a JS selector */
  28. function st2js (string) {
  29. return '_' + string
  30. .replace(/:/g, '_')
  31. .replace(/[\&]/g, '_and')
  32. .replace(/[\|]/g, '_or')
  33. .replace(/[+]/g, '_plus')
  34. .replace(/-/g, '_minus')
  35. .replace(/[*]/g, '_star')
  36. .replace(/[\/]/g, '_slash')
  37. .replace(/[\\]/g, '_backslash')
  38. .replace(/[\~]/g, '_tild')
  39. .replace(/%/g, '_percent')
  40. .replace(/>/g, '_gt')
  41. .replace(/</g, '_lt')
  42. .replace(/=/g, '_eq')
  43. .replace(/,/g, '_comma')
  44. .replace(/[@]/g, '_at');
  45. };
  46. function js2st (selector) {
  47. if (selector.match(/^__/)) {
  48. return binaryJsToSt(selector);
  49. } else {
  50. return keywordJsToSt(selector);
  51. }
  52. }
  53. function keywordJsToSt (selector) {
  54. return selector.replace(/^_/, '').replace(/_/g, ':');
  55. }
  56. function binaryJsToSt (selector) {
  57. return selector
  58. .replace(/^_/, '')
  59. .replace(/_and/g, '&')
  60. .replace(/_or/g, '|')
  61. .replace(/_plus/g, '+')
  62. .replace(/_minus/g, '-')
  63. .replace(/_star/g, '*')
  64. .replace(/_slash/g, '/')
  65. .replace(/_backslash/g, '\\')
  66. .replace(/_tild/g, '~')
  67. .replace(/_percent/g, '%')
  68. .replace(/_gt/g, '>')
  69. .replace(/_lt/g, '<')
  70. .replace(/_eq/g, '=')
  71. .replace(/_comma/g, ',')
  72. .replace(/_at/g, '@');
  73. }
  74. function addElement (array, el) {
  75. if (typeof el === 'undefined') {
  76. return;
  77. }
  78. if (array.indexOf(el) === -1) {
  79. array.push(el);
  80. }
  81. }
  82. function removeElement (array, el) {
  83. var i = array.indexOf(el);
  84. if (i !== -1) {
  85. array.splice(i, 1);
  86. }
  87. }
  88. function extend (target, source) {
  89. Object.keys(source).forEach(function (key) {
  90. target[key] = source[key];
  91. });
  92. return target;
  93. }
  94. return {
  95. extend: extend,
  96. removeElement: removeElement,
  97. addElement: addElement,
  98. js2st: js2st,
  99. st2js: st2js,
  100. declareJsMethod: declareJsMethod,
  101. installMethodOfJsObject: installMethodOfJsObject,
  102. inherits: inherits
  103. }
  104. });