From f01838eb9bce7e30c4e2f768123bddc78a07f4f8 Mon Sep 17 00:00:00 2001 From: Haoming Date: Fri, 27 Dec 2024 17:25:16 +0800 Subject: [PATCH] booru --- README.md | 14 +++++++++++++- README_ZH.md | 14 +++++++++++++- booru.png | Bin 0 -> 9260 bytes javascript/pf_configs.js | 8 ++++++++ javascript/prompt_format.js | 17 +++++++++++++---- scripts/pf_settings.py | 31 ++++++++++++++++++++++--------- 6 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 booru.png diff --git a/README.md b/README.md index 69a433c..77c054e 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Sometimes, when you type too fast or copy prompts from all over the places, you - [x] Toggle between auto formatting and manual formatting - In `Auto` mode: The process is ran whenever you click on **Generate** - In `Manual` mode: The process is only ran when you click the **Format** button -- [x] **New:** Trigger the formatting when pasting text +- [x] **New:** Trigger the formatting on the pasted text - [x] Toggle whether the above features are enabled / disabled by default in the `Prompt Format` section under the System category of the **Settings** tab - [x] Pressing `Alt` + `Shift` + `F` can also trigger formatting - [x] Assign "[alias](#tag-alias)" that counts as duplicates for the specified tags @@ -58,3 +58,15 @@ Sometimes, when you type too fast or copy prompts from all over the places, you 1. Since the formatting in `Auto` mode is triggered at the same time as the generation, the immediate image might not have its prompts updated. 2. Some Extensions *(**eg.** [tagcomplete](https://github.com/DominikDoom/a1111-sd-webui-tagcomplete))* listen to the text editing event, meaning the formatting will cause them to be triggered. You can disable updating the actual prompts in the `Prompt Format` settings to prevent this. Though you may need to manually type something else for the prompt to get actually updated. + +
+ +
+Booru + +- [x] Automatically clean up unwanted texts + - Structure is based on [gelbooru](https://gelbooru.com/) + +

+ +
diff --git a/README_ZH.md b/README_ZH.md index 634057c..18a3f20 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -25,7 +25,7 @@ - [x] 按下`Auto Format`以在手動與自動間切換 - `自動`: 每次按下 **生成 (Generate)** 時處裡 - `手動`: 手動按下 **Format** 時才處裡 -- [x] **新功能:** 處裡貼上的咒語 +- [x] **新功能:** 對貼上的咒語進行處裡 - [x] 在 **Settings** 頁面 System 下的 `Prompt Format` 區可以 開啟/關閉 上述功能 - [x] 按下 `Alt` + `Shift` + `F` 亦可觸發格式化 - [x] 為指定單字新增 "[同義詞](#同義詞)" @@ -58,3 +58,15 @@ 1. 由於 `自動`校正 和 生成 是同時觸發,當下所生產的第一張圖片之咒語可能不會是已更新的。 2. 有些擴充 *(如. [tagcomplete](https://github.com/DominikDoom/a1111-sd-webui-tagcomplete))* 追蹤文字的編輯事件,意即文字校正會導致它們啟動。你可以到設定關閉咒語的自動更新。 + +
+ +
+Booru + +- [x] 自動清除多餘字詞 + - 文字結構基於 [gelbooru](https://gelbooru.com/) + +

+ +
diff --git a/booru.png b/booru.png new file mode 100644 index 0000000000000000000000000000000000000000..e7eedc308fac4f174437cfb54afa13cc243962a9 GIT binary patch literal 9260 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 Tags let tags = input.split(',').map(word => word.trim()); @@ -146,7 +146,6 @@ class LeFormatter { if (/^\s+$/.test(part)) return part; - part = part.trim(); if (!this.#cachedCards.includes(part)) part = part.replaceAll('_', ' '); @@ -220,6 +219,16 @@ onUiLoaded(() => { event.preventDefault(); let paste = (event.clipboardData || window.clipboardData).getData('text'); + + if (config.booru) { + paste = paste.replace(/\s\d+|\?\s+/g, ", "); + for (const excl of ["Artist", "Character", "Copyright", "Tag"]) + paste = paste.replace(excl, ""); + + paste = paste.replaceAll("(", "\\("); + paste = paste.replaceAll(")", "\\)"); + } + paste = LeFormatter.formatString(paste, config.dedupe, config.removeUnderscore); const currentText = field.value; diff --git a/scripts/pf_settings.py b/scripts/pf_settings.py index 136ff45..d176fc4 100644 --- a/scripts/pf_settings.py +++ b/scripts/pf_settings.py @@ -9,9 +9,13 @@ def on_settings(): opts.add_option( "pf_disableupdateinput", - OptionInfo(False, "Disable the automatic updates of the prompts", **args).info( - 'enable this if you have Extensions, such as tagcomplete, that subscribe to text editing events' - ), + OptionInfo(False, "Disable the automatic updates of the prompts", **args) + .info( + """enable this if you have Extensions, such as + tagcomplete, + that subscribe to text editing events""" + ) + .needs_reload_ui(), ) opts.add_option( @@ -31,14 +35,14 @@ def on_settings(): opts.add_option( "pf_appendcomma", - OptionInfo(True, "Append a comma at the end of each line", **args).info( - "only active when there are multiple lines" - ), + OptionInfo(True, "Append a comma at the end of each line", **args) + .info("only take effect when there are multiple lines") + .needs_reload_ui(), ) opts.add_option( "pf_onpaste", - OptionInfo(False, "Trigger a Format when pasting text", **args), + OptionInfo(False, "Format the pasted text", **args).needs_reload_ui(), ) opts.add_option( @@ -52,7 +56,7 @@ def on_settings(): "max_lines": 1, "lines": 1, }, - **args + **args, ), ) @@ -67,7 +71,7 @@ def on_settings(): "max_lines": 16, "lines": 4, }, - **args + **args, ) .link("RegExr", "https://regexr.com/") .info( @@ -77,5 +81,14 @@ def on_settings(): ), ) + opts.add_option( + "pf_booru", + OptionInfo( + False, + 'Process the "Booru Structure"', + **args, + ).info("requires format on paste) (Experimental"), + ) + on_ui_settings(on_settings)