token-counters.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. let promptTokenCountUpdateFunctions = {};
  2. function update_txt2img_tokens(...args) {
  3. // Called from Gradio
  4. update_token_counter("txt2img_token_button");
  5. update_token_counter("txt2img_negative_token_button");
  6. if (args.length == 2) {
  7. return args[0];
  8. }
  9. return args;
  10. }
  11. function update_img2img_tokens(...args) {
  12. // Called from Gradio
  13. update_token_counter("img2img_token_button");
  14. update_token_counter("img2img_negative_token_button");
  15. if (args.length == 2) {
  16. return args[0];
  17. }
  18. return args;
  19. }
  20. function update_token_counter(button_id) {
  21. promptTokenCountUpdateFunctions[button_id]?.();
  22. }
  23. function recalculatePromptTokens(name) {
  24. promptTokenCountUpdateFunctions[name]?.();
  25. }
  26. function recalculate_prompts_txt2img() {
  27. // Called from Gradio
  28. recalculatePromptTokens('txt2img_prompt');
  29. recalculatePromptTokens('txt2img_neg_prompt');
  30. return Array.from(arguments);
  31. }
  32. function recalculate_prompts_img2img() {
  33. // Called from Gradio
  34. recalculatePromptTokens('img2img_prompt');
  35. recalculatePromptTokens('img2img_neg_prompt');
  36. return Array.from(arguments);
  37. }
  38. function setupTokenCounting(id, id_counter, id_button) {
  39. var prompt = gradioApp().getElementById(id);
  40. var counter = gradioApp().getElementById(id_counter);
  41. var textarea = gradioApp().querySelector(`#${id} > label > textarea`);
  42. if (counter.parentElement == prompt.parentElement) {
  43. return;
  44. }
  45. prompt.parentElement.insertBefore(counter, prompt);
  46. prompt.parentElement.style.position = "relative";
  47. var func = onEdit(id, textarea, 800, function() {
  48. if (counter.classList.contains("token-counter-visible")) {
  49. gradioApp().getElementById(id_button)?.click();
  50. }
  51. });
  52. promptTokenCountUpdateFunctions[id] = func;
  53. promptTokenCountUpdateFunctions[id_button] = func;
  54. }
  55. function toggleTokenCountingVisibility(id, id_counter, id_button) {
  56. var counter = gradioApp().getElementById(id_counter);
  57. counter.style.display = opts.disable_token_counters ? "none" : "block";
  58. counter.classList.toggle("token-counter-visible", !opts.disable_token_counters);
  59. }
  60. function runCodeForTokenCounters(fun) {
  61. fun('txt2img_prompt', 'txt2img_token_counter', 'txt2img_token_button');
  62. fun('txt2img_neg_prompt', 'txt2img_negative_token_counter', 'txt2img_negative_token_button');
  63. fun('img2img_prompt', 'img2img_token_counter', 'img2img_token_button');
  64. fun('img2img_neg_prompt', 'img2img_negative_token_counter', 'img2img_negative_token_button');
  65. }
  66. onUiLoaded(function() {
  67. runCodeForTokenCounters(setupTokenCounting);
  68. });
  69. onOptionsChanged(function() {
  70. runCodeForTokenCounters(toggleTokenCountingVisibility);
  71. });