From 5a9a5d4f6899bf7bca72f8aa010dc147e7a6b61f Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Sun, 28 Dec 2025 04:22:21 -0800
Subject: [PATCH 01/15] Add word break tags to snake_case and camelCase names
Otherwise these are not normally considered word-wrapping points.
---
modules/ui_extensions.py | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py
index da3ae39d0..3cab55954 100644
--- a/modules/ui_extensions.py
+++ b/modules/ui_extensions.py
@@ -3,6 +3,7 @@ import json
import shutil
import errno
import html
+import re
from datetime import datetime, timezone, timedelta
import gradio as gr
from modules import extensions, shared, paths, errors, ui_symbols, call_queue
@@ -268,6 +269,16 @@ def search_extensions(search_text, sort_column):
return code, f'Search | {search_text} | {sort_column}'
+def make_wrappable_html(text: str) -> str:
+ text = html.escape(text)
+ if "_" in text:
+ return text.replace("_", "
Created {html.escape(dt('created'))} | Added {html.escape(dt('added'))} | Pushed {html.escape(dt('pushed'))} | Updated {html.escape(dt('updated'))}
{author} | Stars {html.escape(str(ext.get('stars', 0)))} | Size {html.escape(str(ext.get('size', 0)))} | Commits {html.escape(str(ext.get('commits', 0)))} | Issues {html.escape(str(ext.get('issues', 0)))} | Trending {html.escape(str(ext['sort_trending']))}
From 5df4b093d36a257e7fa924180fd9419e0bcb771e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sun, 28 Dec 2025 14:25:36 -0800 Subject: [PATCH 02/15] Make seconds optional and only show them in logs --- modules/extensions.py | 6 ++++-- modules/ui_extensions.py | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/extensions.py b/modules/extensions.py index 134176e3d..ff2fcf400 100644 --- a/modules/extensions.py +++ b/modules/extensions.py @@ -25,10 +25,12 @@ def parse_isotime(time_string: str) -> datetime: raise ValueError(f"Unexpected time string format: '{time_string}'") -def format_dt(d: datetime) -> str: +def format_dt(d: datetime, seconds = False) -> str: if d.tzinfo is None: return d.strftime('%Y-%m-%d %H:%M') - return d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S') # Ensure UTC time is shown (just in case) + if seconds: + return d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S') + return d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M') def ts2utc(timestamp: int) -> datetime: diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 3cab55954..7c9757b11 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -109,10 +109,10 @@ def check_updates(_id_task, disable_list, search_text, sort_column): ext.git_fetch() ext.read_info(True) commit_date = ext.commit_date or 1577836800 - shared.log.info(f'Extensions updated: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date))}') + shared.log.info(f'Extensions updated: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date), seconds=True)}') else: commit_date = ext.commit_date or 1577836800 - shared.log.debug(f'Extensions no update available: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date))}') + shared.log.debug(f'Extensions no update available: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date), seconds=True)}') except FileNotFoundError as e: if 'FETCH_HEAD' not in str(e): raise @@ -230,10 +230,10 @@ def update_extension(extension_path, search_text, sort_column): ext.git_fetch() ext.read_info(True) commit_date = ext.commit_date or 1577836800 - shared.log.info(f'Extensions updated: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date))}') + shared.log.info(f'Extensions updated: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date), seconds=True)}') else: commit_date = ext.commit_date or 1577836800 - shared.log.info(f'Extensions no update available: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date))}') + shared.log.info(f'Extensions no update available: {ext.name} {ext.commit_hash[:8]} {extensions.format_dt(extensions.ts2utc(commit_date), seconds=True)}') except FileNotFoundError as e: if 'FETCH_HEAD' not in str(e): raise @@ -342,7 +342,7 @@ def create_html(search_text, sort_column): local_ver_date = datetime.fromtimestamp(ext['commit_date'], timezone.utc) # TZ-aware update_available = (installed is not None) and (not ext['is_builtin']) and (ext['remote'] is not None) and (updated > local_ver_date) # TZ-aware if update_available: - debug(f'Extension update available: name={ext["name"]} updated={extensions.format_dt(updated)} commit={extensions.format_dt(local_ver_date)}') # TZ-aware + debug(f'Extension update available: name={ext["name"]} updated={extensions.format_dt(updated, seconds=True)} commit={extensions.format_dt(local_ver_date, seconds=True)}') # TZ-aware ext['sort_user'] = f"{'0' if ext['is_builtin'] else '1'}{'1' if ext['installed'] else '0'}{ext.get('name', '')}" ext['sort_enabled'] = f"{'0' if ext['enabled'] else '1'}{'1' if ext['is_builtin'] else '0'}{'1' if ext['installed'] else '0'}{ext.get('updated', '2000-01-01T00:00Z')}" ext['sort_update'] = f"{'1' if update_available else '0'}{'1' if ext['installed'] else '0'}{ext.get('updated', '2000-01-01T00:00Z')}" From e1a4331a214497ccd32bb1beb3fc02448557c17e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:55:55 -0800 Subject: [PATCH 03/15] Update configurable symbols - Support additional properties. - Cached values. --- modules/ui_extensions.py | 20 ++++++++++---------- modules/ui_symbols.py | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 0c141352a..e1e546d9a 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -391,27 +391,27 @@ def create_html(search_text, sort_column): if ext.get('status', None) is None or type(ext['status']) == str: # old format ext['status'] = 0 if ext['url'] is None or ext['url'] == '': - status = f"| Status | -Enabled | +{th_enabled} | +{th_status} | Extension | Description | Type | @@ -377,7 +381,7 @@ def create_html(search_text, sort_column): stats['enabled'] += 1 type_code = f"""|||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {status} | {enabled_code} | +{status} | {make_wrappable_html(ext.get("name", "unknown"))} {tags_text} |
{html.escape(ext.get("description", ""))}
- Created {html.escape(dt('created'))} | Added {html.escape(dt('added'))} | Pushed {html.escape(dt('pushed'))} | Updated {html.escape(dt('updated'))} -{author} | Stars {html.escape(str(ext.get('stars', 0)))} | Size {html.escape(str(ext.get('size', 0)))} | Commits {html.escape(str(ext.get('commits', 0)))} | Issues {html.escape(str(ext.get('issues', 0)))} | Trending {html.escape(str(ext['sort_trending']))} +Created: {html.escape(dt('created'))} | Added: {html.escape(dt('added'))} | Pushed: {html.escape(dt('pushed'))} | Updated: {html.escape(dt('updated'))} +{author} | Stars: {html.escape(str(ext.get('stars', 0)))} | Size: {html.escape(str(ext.get('size', 0)))} | Commits: {html.escape(str(ext.get('commits', 0)))} | Issues: {html.escape(str(ext.get('issues', 0)))} | Trending: {html.escape(str(ext['sort_trending']))} |
{type_code} | {version_code} | diff --git a/modules/ui_symbols.py b/modules/ui_symbols.py index d2749819d..ba10b2b5f 100644 --- a/modules/ui_symbols.py +++ b/modules/ui_symbols.py @@ -33,6 +33,8 @@ search = '🔍' preview = '🖼️' image = '🖌️' resize = '⁜' +check_btn = '☑️' +info_btn = 'ℹ️' # noqa: RUF001 interrogate = '\uf46b' # Telescope icon in Noto Sans. Previously '♻' bullet = '⃝' vision = '\uf06e' # Font Awesome eye icon (more minimalistic) From cae3249757b731483ee1ea71a5c4e46e8e57e227 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Tue, 30 Dec 2025 00:40:40 -0800 Subject: [PATCH 09/15] Ensure styling works correctly with display:block --- modules/ui_extensions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 15821781c..8aefa7d8d 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -381,7 +381,7 @@ def create_html(search_text, sort_column): stats['enabled'] += 1 type_code = f"""
| {th_enabled} | -{th_status} | ++ | Extension | Description | Type | @@ -393,27 +391,27 @@ def create_html(search_text, sort_column): if ext.get('status', None) is None or type(ext['status']) == str: # old format ext['status'] = 0 if ext['url'] is None or ext['url'] == '': - status = f"|
|---|---|---|---|---|---|---|