tokenchain.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use strict';
  2. function Sorter() {
  3. }
  4. Sorter.prototype.sort = function(tokens, fromIndex) {
  5. fromIndex = fromIndex || 0;
  6. for (var i = 0, len = this.keys.length; i < len; i++) {
  7. var key = this.keys[i];
  8. var token = key.slice(1);
  9. var index = tokens.indexOf(token, fromIndex);
  10. if (index !== -1) {
  11. do {
  12. if (index !== fromIndex) {
  13. tokens.splice(index, 1);
  14. tokens.splice(fromIndex, 0, token);
  15. }
  16. fromIndex++;
  17. } while ((index = tokens.indexOf(token, fromIndex)) !== -1);
  18. return this[key].sort(tokens, fromIndex);
  19. }
  20. }
  21. return tokens;
  22. };
  23. function TokenChain() {
  24. }
  25. TokenChain.prototype = {
  26. add: function(tokens) {
  27. var self = this;
  28. tokens.forEach(function(token) {
  29. var key = '$' + token;
  30. if (!self[key]) {
  31. self[key] = [];
  32. self[key].processed = 0;
  33. }
  34. self[key].push(tokens);
  35. });
  36. },
  37. createSorter: function() {
  38. var self = this;
  39. var sorter = new Sorter();
  40. sorter.keys = Object.keys(self).sort(function(j, k) {
  41. var m = self[j].length;
  42. var n = self[k].length;
  43. return m < n ? 1 : m > n ? -1 : j < k ? -1 : j > k ? 1 : 0;
  44. }).filter(function(key) {
  45. if (self[key].processed < self[key].length) {
  46. var token = key.slice(1);
  47. var chain = new TokenChain();
  48. self[key].forEach(function(tokens) {
  49. var index;
  50. while ((index = tokens.indexOf(token)) !== -1) {
  51. tokens.splice(index, 1);
  52. }
  53. tokens.forEach(function(token) {
  54. self['$' + token].processed++;
  55. });
  56. chain.add(tokens.slice(0));
  57. });
  58. sorter[key] = chain.createSorter();
  59. return true;
  60. }
  61. return false;
  62. });
  63. return sorter;
  64. }
  65. };
  66. module.exports = TokenChain;