pomera-ai-commander 0.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +105 -680
- package/bin/pomera-ai-commander.js +62 -62
- package/core/__init__.py +65 -65
- package/core/app_context.py +482 -482
- package/core/async_text_processor.py +421 -421
- package/core/backup_manager.py +655 -655
- package/core/backup_recovery_manager.py +1033 -1033
- package/core/content_hash_cache.py +508 -508
- package/core/context_menu.py +313 -313
- package/core/data_validator.py +1066 -1066
- package/core/database_connection_manager.py +744 -744
- package/core/database_curl_settings_manager.py +608 -608
- package/core/database_promera_ai_settings_manager.py +446 -446
- package/core/database_schema.py +411 -411
- package/core/database_schema_manager.py +395 -395
- package/core/database_settings_manager.py +1507 -1507
- package/core/database_settings_manager_interface.py +456 -456
- package/core/dialog_manager.py +734 -734
- package/core/efficient_line_numbers.py +510 -510
- package/core/error_handler.py +746 -746
- package/core/error_service.py +431 -431
- package/core/event_consolidator.py +511 -511
- package/core/mcp/__init__.py +43 -43
- package/core/mcp/protocol.py +288 -288
- package/core/mcp/schema.py +251 -251
- package/core/mcp/server_stdio.py +299 -299
- package/core/mcp/tool_registry.py +2372 -2345
- package/core/memory_efficient_text_widget.py +711 -711
- package/core/migration_manager.py +914 -914
- package/core/migration_test_suite.py +1085 -1085
- package/core/migration_validator.py +1143 -1143
- package/core/optimized_find_replace.py +714 -714
- package/core/optimized_pattern_engine.py +424 -424
- package/core/optimized_search_highlighter.py +552 -552
- package/core/performance_monitor.py +674 -674
- package/core/persistence_manager.py +712 -712
- package/core/progressive_stats_calculator.py +632 -632
- package/core/regex_pattern_cache.py +529 -529
- package/core/regex_pattern_library.py +350 -350
- package/core/search_operation_manager.py +434 -434
- package/core/settings_defaults_registry.py +1087 -1087
- package/core/settings_integrity_validator.py +1111 -1111
- package/core/settings_serializer.py +557 -557
- package/core/settings_validator.py +1823 -1823
- package/core/smart_stats_calculator.py +709 -709
- package/core/statistics_update_manager.py +619 -619
- package/core/stats_config_manager.py +858 -858
- package/core/streaming_text_handler.py +723 -723
- package/core/task_scheduler.py +596 -596
- package/core/update_pattern_library.py +168 -168
- package/core/visibility_monitor.py +596 -596
- package/core/widget_cache.py +498 -498
- package/mcp.json +51 -61
- package/package.json +61 -57
- package/pomera.py +7482 -7482
- package/pomera_mcp_server.py +183 -144
- package/requirements.txt +32 -0
- package/tools/__init__.py +4 -4
- package/tools/ai_tools.py +2891 -2891
- package/tools/ascii_art_generator.py +352 -352
- package/tools/base64_tools.py +183 -183
- package/tools/base_tool.py +511 -511
- package/tools/case_tool.py +308 -308
- package/tools/column_tools.py +395 -395
- package/tools/cron_tool.py +884 -884
- package/tools/curl_history.py +600 -600
- package/tools/curl_processor.py +1207 -1207
- package/tools/curl_settings.py +502 -502
- package/tools/curl_tool.py +5467 -5467
- package/tools/diff_viewer.py +1071 -1071
- package/tools/email_extraction_tool.py +248 -248
- package/tools/email_header_analyzer.py +425 -425
- package/tools/extraction_tools.py +250 -250
- package/tools/find_replace.py +1750 -1750
- package/tools/folder_file_reporter.py +1463 -1463
- package/tools/folder_file_reporter_adapter.py +480 -480
- package/tools/generator_tools.py +1216 -1216
- package/tools/hash_generator.py +255 -255
- package/tools/html_tool.py +656 -656
- package/tools/jsonxml_tool.py +729 -729
- package/tools/line_tools.py +419 -419
- package/tools/markdown_tools.py +561 -561
- package/tools/mcp_widget.py +1417 -1417
- package/tools/notes_widget.py +973 -973
- package/tools/number_base_converter.py +372 -372
- package/tools/regex_extractor.py +571 -571
- package/tools/slug_generator.py +310 -310
- package/tools/sorter_tools.py +458 -458
- package/tools/string_escape_tool.py +392 -392
- package/tools/text_statistics_tool.py +365 -365
- package/tools/text_wrapper.py +430 -430
- package/tools/timestamp_converter.py +421 -421
- package/tools/tool_loader.py +710 -710
- package/tools/translator_tools.py +522 -522
- package/tools/url_link_extractor.py +261 -261
- package/tools/url_parser.py +204 -204
- package/tools/whitespace_tools.py +355 -355
- package/tools/word_frequency_counter.py +146 -146
- package/core/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/__pycache__/app_context.cpython-313.pyc +0 -0
- package/core/__pycache__/async_text_processor.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_recovery_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/content_hash_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/context_menu.cpython-313.pyc +0 -0
- package/core/__pycache__/data_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/database_connection_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_curl_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_promera_ai_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager_interface.cpython-313.pyc +0 -0
- package/core/__pycache__/dialog_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/efficient_line_numbers.cpython-313.pyc +0 -0
- package/core/__pycache__/error_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/error_service.cpython-313.pyc +0 -0
- package/core/__pycache__/event_consolidator.cpython-313.pyc +0 -0
- package/core/__pycache__/memory_efficient_text_widget.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_test_suite.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_find_replace.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_pattern_engine.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_search_highlighter.cpython-313.pyc +0 -0
- package/core/__pycache__/performance_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/persistence_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/progressive_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_library.cpython-313.pyc +0 -0
- package/core/__pycache__/search_operation_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_defaults_registry.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_integrity_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_serializer.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/smart_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/statistics_update_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/stats_config_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/streaming_text_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/task_scheduler.cpython-313.pyc +0 -0
- package/core/__pycache__/visibility_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/widget_cache.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/protocol.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/schema.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/server_stdio.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/tool_registry.cpython-313.pyc +0 -0
- package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- package/tools/__pycache__/ai_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/ascii_art_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/base64_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/base_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/case_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/column_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/cron_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_history.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_processor.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_settings.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/diff_viewer.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_extraction_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_header_analyzer.cpython-313.pyc +0 -0
- package/tools/__pycache__/extraction_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/find_replace.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter_adapter.cpython-313.pyc +0 -0
- package/tools/__pycache__/generator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/hash_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/html_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/huggingface_helper.cpython-313.pyc +0 -0
- package/tools/__pycache__/jsonxml_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/line_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/list_comparator.cpython-313.pyc +0 -0
- package/tools/__pycache__/markdown_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/mcp_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/notes_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/number_base_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/regex_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/slug_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/sorter_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/string_escape_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_statistics_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_wrapper.cpython-313.pyc +0 -0
- package/tools/__pycache__/timestamp_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/tool_loader.cpython-313.pyc +0 -0
- package/tools/__pycache__/translator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_link_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_parser.cpython-313.pyc +0 -0
- package/tools/__pycache__/whitespace_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/word_frequency_counter.cpython-313.pyc +0 -0
package/tools/base64_tools.py
CHANGED
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Base64 Tools Module for Promera AI Commander
|
|
3
|
-
|
|
4
|
-
This module provides Base64 encoding and decoding functionality with a simple UI.
|
|
5
|
-
|
|
6
|
-
Author: Promera AI Commander
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import tkinter as tk
|
|
10
|
-
from tkinter import ttk
|
|
11
|
-
import base64
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Base64Tools:
|
|
15
|
-
"""A class containing Base64 encoding and decoding functionality."""
|
|
16
|
-
|
|
17
|
-
def __init__(self):
|
|
18
|
-
"""Initialize the Base64Tools class."""
|
|
19
|
-
self.tools = {
|
|
20
|
-
"Base64 Encoder/Decoder": self.base64_processor
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
def get_available_tools(self):
|
|
24
|
-
"""Returns a list of available Base64 tools."""
|
|
25
|
-
return list(self.tools.keys())
|
|
26
|
-
|
|
27
|
-
def get_default_settings(self):
|
|
28
|
-
"""Returns default settings for Base64 tools."""
|
|
29
|
-
return {
|
|
30
|
-
"mode": "encode"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
def process_text(self, input_text, settings):
|
|
34
|
-
"""Process text using Base64 encoding/decoding."""
|
|
35
|
-
mode = settings.get("mode", "encode")
|
|
36
|
-
return self.base64_processor(input_text, mode)
|
|
37
|
-
|
|
38
|
-
@staticmethod
|
|
39
|
-
def base64_processor(text, mode):
|
|
40
|
-
"""Encodes or decodes text using Base64."""
|
|
41
|
-
if not text.strip():
|
|
42
|
-
return "Error: No input text provided"
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
if mode == "encode":
|
|
46
|
-
return base64.b64encode(text.encode('utf-8')).decode('ascii')
|
|
47
|
-
else: # mode == "decode"
|
|
48
|
-
return base64.b64decode(text.encode('ascii')).decode('utf-8')
|
|
49
|
-
except Exception as e:
|
|
50
|
-
return f"Base64 Error: {e}"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class Base64ToolsWidget:
|
|
54
|
-
"""Widget for the Base64 Tools interface."""
|
|
55
|
-
|
|
56
|
-
def __init__(self, base64_tools):
|
|
57
|
-
"""Initialize the Base64ToolsWidget."""
|
|
58
|
-
self.base64_tools = base64_tools
|
|
59
|
-
self.main_app = None
|
|
60
|
-
|
|
61
|
-
# Variables for Base64 mode
|
|
62
|
-
self.base64_mode = None
|
|
63
|
-
|
|
64
|
-
def create_widget(self, parent, main_app):
|
|
65
|
-
"""Create and return the main widget."""
|
|
66
|
-
self.main_app = main_app
|
|
67
|
-
|
|
68
|
-
# Create main frame
|
|
69
|
-
main_frame = ttk.Frame(parent)
|
|
70
|
-
|
|
71
|
-
# Get current settings
|
|
72
|
-
settings = self.main_app.settings["tool_settings"].get("Base64 Encoder/Decoder", {})
|
|
73
|
-
|
|
74
|
-
# Mode selection
|
|
75
|
-
mode_frame = ttk.Frame(main_frame)
|
|
76
|
-
mode_frame.pack(fill=tk.X, padx=10, pady=5)
|
|
77
|
-
|
|
78
|
-
ttk.Label(mode_frame, text="Mode:").pack(side=tk.LEFT, padx=(0, 10))
|
|
79
|
-
|
|
80
|
-
self.base64_mode = tk.StringVar(value=settings.get("mode", "encode"))
|
|
81
|
-
|
|
82
|
-
encode_radio = ttk.Radiobutton(mode_frame, text="Encode",
|
|
83
|
-
variable=self.base64_mode, value="encode",
|
|
84
|
-
command=self.on_mode_change)
|
|
85
|
-
encode_radio.pack(side=tk.LEFT, padx=(0, 10))
|
|
86
|
-
|
|
87
|
-
decode_radio = ttk.Radiobutton(mode_frame, text="Decode",
|
|
88
|
-
variable=self.base64_mode, value="decode",
|
|
89
|
-
command=self.on_mode_change)
|
|
90
|
-
decode_radio.pack(side=tk.LEFT, padx=(0, 10))
|
|
91
|
-
|
|
92
|
-
# Process button
|
|
93
|
-
button_frame = ttk.Frame(main_frame)
|
|
94
|
-
button_frame.pack(fill=tk.X, padx=10, pady=10)
|
|
95
|
-
|
|
96
|
-
process_btn = ttk.Button(button_frame, text="Process",
|
|
97
|
-
command=self.process_base64)
|
|
98
|
-
process_btn.pack(side=tk.LEFT)
|
|
99
|
-
|
|
100
|
-
return main_frame
|
|
101
|
-
|
|
102
|
-
def on_mode_change(self):
|
|
103
|
-
"""Handle mode change and save settings."""
|
|
104
|
-
self.save_settings()
|
|
105
|
-
# Auto-process if there's input text
|
|
106
|
-
self.process_base64()
|
|
107
|
-
|
|
108
|
-
def process_base64(self):
|
|
109
|
-
"""Process the input text with Base64 encoding/decoding."""
|
|
110
|
-
if not self.main_app:
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
# Get input text
|
|
114
|
-
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
115
|
-
input_text = active_input_tab.text.get("1.0", tk.END).strip()
|
|
116
|
-
|
|
117
|
-
if not input_text:
|
|
118
|
-
self.main_app.update_output_text("Error: No input text provided")
|
|
119
|
-
return
|
|
120
|
-
|
|
121
|
-
# Get current mode
|
|
122
|
-
mode = self.base64_mode.get()
|
|
123
|
-
|
|
124
|
-
# Process the text
|
|
125
|
-
settings = {"mode": mode}
|
|
126
|
-
result = self.base64_tools.process_text(input_text, settings)
|
|
127
|
-
|
|
128
|
-
# Update output
|
|
129
|
-
self.main_app.update_output_text(result)
|
|
130
|
-
|
|
131
|
-
# Save settings
|
|
132
|
-
self.save_settings()
|
|
133
|
-
|
|
134
|
-
def save_settings(self):
|
|
135
|
-
"""Save current settings to the main app."""
|
|
136
|
-
if not self.main_app or not self.base64_mode:
|
|
137
|
-
return
|
|
138
|
-
|
|
139
|
-
# Ensure the Base64 Encoder/Decoder settings exist
|
|
140
|
-
if "Base64 Encoder/Decoder" not in self.main_app.settings["tool_settings"]:
|
|
141
|
-
self.main_app.settings["tool_settings"]["Base64 Encoder/Decoder"] = {}
|
|
142
|
-
|
|
143
|
-
# Save mode setting
|
|
144
|
-
self.main_app.settings["tool_settings"]["Base64 Encoder/Decoder"]["mode"] = self.base64_mode.get()
|
|
145
|
-
|
|
146
|
-
# Save settings to file
|
|
147
|
-
self.main_app.save_settings()
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
# BaseTool-compatible wrapper (for future migration)
|
|
151
|
-
try:
|
|
152
|
-
from tools.base_tool import ToolWithOptions
|
|
153
|
-
from typing import Dict, Any
|
|
154
|
-
|
|
155
|
-
class Base64ToolsV2(ToolWithOptions):
|
|
156
|
-
"""
|
|
157
|
-
BaseTool-compatible version of Base64Tools.
|
|
158
|
-
|
|
159
|
-
Uses ToolWithOptions base class for automatic UI generation.
|
|
160
|
-
"""
|
|
161
|
-
|
|
162
|
-
TOOL_NAME = "Base64 Encoder/Decoder"
|
|
163
|
-
TOOL_DESCRIPTION = "Encode text to Base64 or decode Base64 back to text"
|
|
164
|
-
TOOL_VERSION = "2.0.0"
|
|
165
|
-
|
|
166
|
-
OPTIONS = [
|
|
167
|
-
("Encode", "encode"),
|
|
168
|
-
("Decode", "decode"),
|
|
169
|
-
]
|
|
170
|
-
OPTIONS_LABEL = "Mode"
|
|
171
|
-
DEFAULT_OPTION = "encode"
|
|
172
|
-
|
|
173
|
-
def __init__(self):
|
|
174
|
-
super().__init__()
|
|
175
|
-
self._processor = Base64Tools()
|
|
176
|
-
|
|
177
|
-
def process_text(self, input_text: str, settings: Dict[str, Any]) -> str:
|
|
178
|
-
"""Process text using Base64 encoding/decoding."""
|
|
179
|
-
mode = settings.get("mode", "encode")
|
|
180
|
-
return self._processor.base64_processor(input_text, mode)
|
|
181
|
-
|
|
182
|
-
except ImportError:
|
|
183
|
-
# BaseTool not available
|
|
1
|
+
"""
|
|
2
|
+
Base64 Tools Module for Promera AI Commander
|
|
3
|
+
|
|
4
|
+
This module provides Base64 encoding and decoding functionality with a simple UI.
|
|
5
|
+
|
|
6
|
+
Author: Promera AI Commander
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import tkinter as tk
|
|
10
|
+
from tkinter import ttk
|
|
11
|
+
import base64
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Base64Tools:
|
|
15
|
+
"""A class containing Base64 encoding and decoding functionality."""
|
|
16
|
+
|
|
17
|
+
def __init__(self):
|
|
18
|
+
"""Initialize the Base64Tools class."""
|
|
19
|
+
self.tools = {
|
|
20
|
+
"Base64 Encoder/Decoder": self.base64_processor
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
def get_available_tools(self):
|
|
24
|
+
"""Returns a list of available Base64 tools."""
|
|
25
|
+
return list(self.tools.keys())
|
|
26
|
+
|
|
27
|
+
def get_default_settings(self):
|
|
28
|
+
"""Returns default settings for Base64 tools."""
|
|
29
|
+
return {
|
|
30
|
+
"mode": "encode"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
def process_text(self, input_text, settings):
|
|
34
|
+
"""Process text using Base64 encoding/decoding."""
|
|
35
|
+
mode = settings.get("mode", "encode")
|
|
36
|
+
return self.base64_processor(input_text, mode)
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def base64_processor(text, mode):
|
|
40
|
+
"""Encodes or decodes text using Base64."""
|
|
41
|
+
if not text.strip():
|
|
42
|
+
return "Error: No input text provided"
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
if mode == "encode":
|
|
46
|
+
return base64.b64encode(text.encode('utf-8')).decode('ascii')
|
|
47
|
+
else: # mode == "decode"
|
|
48
|
+
return base64.b64decode(text.encode('ascii')).decode('utf-8')
|
|
49
|
+
except Exception as e:
|
|
50
|
+
return f"Base64 Error: {e}"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Base64ToolsWidget:
|
|
54
|
+
"""Widget for the Base64 Tools interface."""
|
|
55
|
+
|
|
56
|
+
def __init__(self, base64_tools):
|
|
57
|
+
"""Initialize the Base64ToolsWidget."""
|
|
58
|
+
self.base64_tools = base64_tools
|
|
59
|
+
self.main_app = None
|
|
60
|
+
|
|
61
|
+
# Variables for Base64 mode
|
|
62
|
+
self.base64_mode = None
|
|
63
|
+
|
|
64
|
+
def create_widget(self, parent, main_app):
|
|
65
|
+
"""Create and return the main widget."""
|
|
66
|
+
self.main_app = main_app
|
|
67
|
+
|
|
68
|
+
# Create main frame
|
|
69
|
+
main_frame = ttk.Frame(parent)
|
|
70
|
+
|
|
71
|
+
# Get current settings
|
|
72
|
+
settings = self.main_app.settings["tool_settings"].get("Base64 Encoder/Decoder", {})
|
|
73
|
+
|
|
74
|
+
# Mode selection
|
|
75
|
+
mode_frame = ttk.Frame(main_frame)
|
|
76
|
+
mode_frame.pack(fill=tk.X, padx=10, pady=5)
|
|
77
|
+
|
|
78
|
+
ttk.Label(mode_frame, text="Mode:").pack(side=tk.LEFT, padx=(0, 10))
|
|
79
|
+
|
|
80
|
+
self.base64_mode = tk.StringVar(value=settings.get("mode", "encode"))
|
|
81
|
+
|
|
82
|
+
encode_radio = ttk.Radiobutton(mode_frame, text="Encode",
|
|
83
|
+
variable=self.base64_mode, value="encode",
|
|
84
|
+
command=self.on_mode_change)
|
|
85
|
+
encode_radio.pack(side=tk.LEFT, padx=(0, 10))
|
|
86
|
+
|
|
87
|
+
decode_radio = ttk.Radiobutton(mode_frame, text="Decode",
|
|
88
|
+
variable=self.base64_mode, value="decode",
|
|
89
|
+
command=self.on_mode_change)
|
|
90
|
+
decode_radio.pack(side=tk.LEFT, padx=(0, 10))
|
|
91
|
+
|
|
92
|
+
# Process button
|
|
93
|
+
button_frame = ttk.Frame(main_frame)
|
|
94
|
+
button_frame.pack(fill=tk.X, padx=10, pady=10)
|
|
95
|
+
|
|
96
|
+
process_btn = ttk.Button(button_frame, text="Process",
|
|
97
|
+
command=self.process_base64)
|
|
98
|
+
process_btn.pack(side=tk.LEFT)
|
|
99
|
+
|
|
100
|
+
return main_frame
|
|
101
|
+
|
|
102
|
+
def on_mode_change(self):
|
|
103
|
+
"""Handle mode change and save settings."""
|
|
104
|
+
self.save_settings()
|
|
105
|
+
# Auto-process if there's input text
|
|
106
|
+
self.process_base64()
|
|
107
|
+
|
|
108
|
+
def process_base64(self):
|
|
109
|
+
"""Process the input text with Base64 encoding/decoding."""
|
|
110
|
+
if not self.main_app:
|
|
111
|
+
return
|
|
112
|
+
|
|
113
|
+
# Get input text
|
|
114
|
+
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
115
|
+
input_text = active_input_tab.text.get("1.0", tk.END).strip()
|
|
116
|
+
|
|
117
|
+
if not input_text:
|
|
118
|
+
self.main_app.update_output_text("Error: No input text provided")
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
# Get current mode
|
|
122
|
+
mode = self.base64_mode.get()
|
|
123
|
+
|
|
124
|
+
# Process the text
|
|
125
|
+
settings = {"mode": mode}
|
|
126
|
+
result = self.base64_tools.process_text(input_text, settings)
|
|
127
|
+
|
|
128
|
+
# Update output
|
|
129
|
+
self.main_app.update_output_text(result)
|
|
130
|
+
|
|
131
|
+
# Save settings
|
|
132
|
+
self.save_settings()
|
|
133
|
+
|
|
134
|
+
def save_settings(self):
|
|
135
|
+
"""Save current settings to the main app."""
|
|
136
|
+
if not self.main_app or not self.base64_mode:
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
# Ensure the Base64 Encoder/Decoder settings exist
|
|
140
|
+
if "Base64 Encoder/Decoder" not in self.main_app.settings["tool_settings"]:
|
|
141
|
+
self.main_app.settings["tool_settings"]["Base64 Encoder/Decoder"] = {}
|
|
142
|
+
|
|
143
|
+
# Save mode setting
|
|
144
|
+
self.main_app.settings["tool_settings"]["Base64 Encoder/Decoder"]["mode"] = self.base64_mode.get()
|
|
145
|
+
|
|
146
|
+
# Save settings to file
|
|
147
|
+
self.main_app.save_settings()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# BaseTool-compatible wrapper (for future migration)
|
|
151
|
+
try:
|
|
152
|
+
from tools.base_tool import ToolWithOptions
|
|
153
|
+
from typing import Dict, Any
|
|
154
|
+
|
|
155
|
+
class Base64ToolsV2(ToolWithOptions):
|
|
156
|
+
"""
|
|
157
|
+
BaseTool-compatible version of Base64Tools.
|
|
158
|
+
|
|
159
|
+
Uses ToolWithOptions base class for automatic UI generation.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
TOOL_NAME = "Base64 Encoder/Decoder"
|
|
163
|
+
TOOL_DESCRIPTION = "Encode text to Base64 or decode Base64 back to text"
|
|
164
|
+
TOOL_VERSION = "2.0.0"
|
|
165
|
+
|
|
166
|
+
OPTIONS = [
|
|
167
|
+
("Encode", "encode"),
|
|
168
|
+
("Decode", "decode"),
|
|
169
|
+
]
|
|
170
|
+
OPTIONS_LABEL = "Mode"
|
|
171
|
+
DEFAULT_OPTION = "encode"
|
|
172
|
+
|
|
173
|
+
def __init__(self):
|
|
174
|
+
super().__init__()
|
|
175
|
+
self._processor = Base64Tools()
|
|
176
|
+
|
|
177
|
+
def process_text(self, input_text: str, settings: Dict[str, Any]) -> str:
|
|
178
|
+
"""Process text using Base64 encoding/decoding."""
|
|
179
|
+
mode = settings.get("mode", "encode")
|
|
180
|
+
return self._processor.base64_processor(input_text, mode)
|
|
181
|
+
|
|
182
|
+
except ImportError:
|
|
183
|
+
# BaseTool not available
|
|
184
184
|
pass
|