label.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. export class Label {
  2. constructor() {
  3. this._usedUpperLabels = [];
  4. this._usedLowerLabels = [];
  5. }
  6. draw(lower = false) {
  7. if (lower) {
  8. return this.pushLower();
  9. } else {
  10. return this.pushUpper();
  11. }
  12. }
  13. pushLower(label) {
  14. if (label == undefined) {
  15. label = this._generateLabel(this._usedLowerLabels.length + 1);
  16. while (this._usedLowerLabels.includes(this.label)) {
  17. label = this._generateLabel(this._usedLowerLabels.length + 1);
  18. }
  19. }
  20. this._usedLowerLabels.push(label);
  21. return label.toLowerCase();
  22. }
  23. pushUpper(label) {
  24. if (label == undefined) {
  25. label = this._generateLabel(this._usedUpperLabels.length + 1);
  26. while (this._usedUpperLabels.includes(this.label)) {
  27. label = this._generateLabel(this._usedUpperLabels.length + 1);
  28. }
  29. }
  30. this._usedUpperLabels.push(label);
  31. return label.toUpperCase();
  32. }
  33. _generateLabel(n) {
  34. let label = "";
  35. let labelNumber = n;
  36. while (labelNumber > 0) {
  37. const letterNumber = (labelNumber - 1) % 26;
  38. const currentLetter = String.fromCharCode(letterNumber + 65);
  39. label = currentLetter + label;
  40. labelNumber = (labelNumber - (letterNumber + 1)) / 26;
  41. }
  42. return label;
  43. }
  44. }
  45. export const label = new Label();