pomera-ai-commander 0.1.0
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 -0
- package/README.md +680 -0
- package/bin/pomera-ai-commander.js +62 -0
- package/core/__init__.py +66 -0
- 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/app_context.py +482 -0
- package/core/async_text_processor.py +422 -0
- package/core/backup_manager.py +656 -0
- package/core/backup_recovery_manager.py +1034 -0
- package/core/content_hash_cache.py +509 -0
- package/core/context_menu.py +313 -0
- package/core/data_validator.py +1067 -0
- package/core/database_connection_manager.py +745 -0
- package/core/database_curl_settings_manager.py +609 -0
- package/core/database_promera_ai_settings_manager.py +447 -0
- package/core/database_schema.py +412 -0
- package/core/database_schema_manager.py +396 -0
- package/core/database_settings_manager.py +1508 -0
- package/core/database_settings_manager_interface.py +457 -0
- package/core/dialog_manager.py +735 -0
- package/core/efficient_line_numbers.py +511 -0
- package/core/error_handler.py +747 -0
- package/core/error_service.py +431 -0
- package/core/event_consolidator.py +512 -0
- package/core/mcp/__init__.py +43 -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/core/mcp/protocol.py +288 -0
- package/core/mcp/schema.py +251 -0
- package/core/mcp/server_stdio.py +299 -0
- package/core/mcp/tool_registry.py +2345 -0
- package/core/memory_efficient_text_widget.py +712 -0
- package/core/migration_manager.py +915 -0
- package/core/migration_test_suite.py +1086 -0
- package/core/migration_validator.py +1144 -0
- package/core/optimized_find_replace.py +715 -0
- package/core/optimized_pattern_engine.py +424 -0
- package/core/optimized_search_highlighter.py +553 -0
- package/core/performance_monitor.py +675 -0
- package/core/persistence_manager.py +713 -0
- package/core/progressive_stats_calculator.py +632 -0
- package/core/regex_pattern_cache.py +530 -0
- package/core/regex_pattern_library.py +351 -0
- package/core/search_operation_manager.py +435 -0
- package/core/settings_defaults_registry.py +1087 -0
- package/core/settings_integrity_validator.py +1112 -0
- package/core/settings_serializer.py +558 -0
- package/core/settings_validator.py +1824 -0
- package/core/smart_stats_calculator.py +710 -0
- package/core/statistics_update_manager.py +619 -0
- package/core/stats_config_manager.py +858 -0
- package/core/streaming_text_handler.py +723 -0
- package/core/task_scheduler.py +596 -0
- package/core/update_pattern_library.py +169 -0
- package/core/visibility_monitor.py +596 -0
- package/core/widget_cache.py +498 -0
- package/mcp.json +61 -0
- package/package.json +57 -0
- package/pomera.py +7483 -0
- package/pomera_mcp_server.py +144 -0
- package/tools/__init__.py +5 -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/ai_tools.py +2892 -0
- package/tools/ascii_art_generator.py +353 -0
- package/tools/base64_tools.py +184 -0
- package/tools/base_tool.py +511 -0
- package/tools/case_tool.py +309 -0
- package/tools/column_tools.py +396 -0
- package/tools/cron_tool.py +885 -0
- package/tools/curl_history.py +601 -0
- package/tools/curl_processor.py +1208 -0
- package/tools/curl_settings.py +503 -0
- package/tools/curl_tool.py +5467 -0
- package/tools/diff_viewer.py +1072 -0
- package/tools/email_extraction_tool.py +249 -0
- package/tools/email_header_analyzer.py +426 -0
- package/tools/extraction_tools.py +250 -0
- package/tools/find_replace.py +1751 -0
- package/tools/folder_file_reporter.py +1463 -0
- package/tools/folder_file_reporter_adapter.py +480 -0
- package/tools/generator_tools.py +1217 -0
- package/tools/hash_generator.py +256 -0
- package/tools/html_tool.py +657 -0
- package/tools/huggingface_helper.py +449 -0
- package/tools/jsonxml_tool.py +730 -0
- package/tools/line_tools.py +419 -0
- package/tools/list_comparator.py +720 -0
- package/tools/markdown_tools.py +562 -0
- package/tools/mcp_widget.py +1417 -0
- package/tools/notes_widget.py +973 -0
- package/tools/number_base_converter.py +373 -0
- package/tools/regex_extractor.py +572 -0
- package/tools/slug_generator.py +311 -0
- package/tools/sorter_tools.py +459 -0
- package/tools/string_escape_tool.py +393 -0
- package/tools/text_statistics_tool.py +366 -0
- package/tools/text_wrapper.py +431 -0
- package/tools/timestamp_converter.py +422 -0
- package/tools/tool_loader.py +710 -0
- package/tools/translator_tools.py +523 -0
- package/tools/url_link_extractor.py +262 -0
- package/tools/url_parser.py +205 -0
- package/tools/whitespace_tools.py +356 -0
- package/tools/word_frequency_counter.py +147 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ASCII Art Generator Module - Text to ASCII art conversion
|
|
3
|
+
|
|
4
|
+
This module provides ASCII art generation functionality
|
|
5
|
+
for the Pomera AI Commander application.
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
- Convert text to ASCII art using built-in fonts
|
|
9
|
+
- Multiple font styles
|
|
10
|
+
- Width adjustment
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import tkinter as tk
|
|
14
|
+
from tkinter import ttk
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ASCIIArtGeneratorProcessor:
|
|
18
|
+
"""ASCII art generator processor with built-in fonts."""
|
|
19
|
+
|
|
20
|
+
# Built-in ASCII art fonts
|
|
21
|
+
FONTS = {
|
|
22
|
+
"standard": {
|
|
23
|
+
'A': [" * ", " * * ", "*****", "* *", "* *"],
|
|
24
|
+
'B': ["**** ", "* *", "**** ", "* *", "**** "],
|
|
25
|
+
'C': [" ****", "* ", "* ", "* ", " ****"],
|
|
26
|
+
'D': ["**** ", "* *", "* *", "* *", "**** "],
|
|
27
|
+
'E': ["*****", "* ", "**** ", "* ", "*****"],
|
|
28
|
+
'F': ["*****", "* ", "**** ", "* ", "* "],
|
|
29
|
+
'G': [" ****", "* ", "* **", "* *", " ****"],
|
|
30
|
+
'H': ["* *", "* *", "*****", "* *", "* *"],
|
|
31
|
+
'I': ["*****", " * ", " * ", " * ", "*****"],
|
|
32
|
+
'J': ["*****", " *", " *", "* *", " *** "],
|
|
33
|
+
'K': ["* *", "* * ", "*** ", "* * ", "* *"],
|
|
34
|
+
'L': ["* ", "* ", "* ", "* ", "*****"],
|
|
35
|
+
'M': ["* *", "** **", "* * *", "* *", "* *"],
|
|
36
|
+
'N': ["* *", "** *", "* * *", "* **", "* *"],
|
|
37
|
+
'O': [" *** ", "* *", "* *", "* *", " *** "],
|
|
38
|
+
'P': ["**** ", "* *", "**** ", "* ", "* "],
|
|
39
|
+
'Q': [" *** ", "* *", "* *", " *** ", " *"],
|
|
40
|
+
'R': ["**** ", "* *", "**** ", "* * ", "* *"],
|
|
41
|
+
'S': [" ****", "* ", " *** ", " *", "**** "],
|
|
42
|
+
'T': ["*****", " * ", " * ", " * ", " * "],
|
|
43
|
+
'U': ["* *", "* *", "* *", "* *", " *** "],
|
|
44
|
+
'V': ["* *", "* *", "* *", " * * ", " * "],
|
|
45
|
+
'W': ["* *", "* *", "* * *", "** **", "* *"],
|
|
46
|
+
'X': ["* *", " * * ", " * ", " * * ", "* *"],
|
|
47
|
+
'Y': ["* *", " * * ", " * ", " * ", " * "],
|
|
48
|
+
'Z': ["*****", " * ", " * ", " * ", "*****"],
|
|
49
|
+
'0': [" *** ", "* *", "* *", "* *", " *** "],
|
|
50
|
+
'1': [" * ", " ** ", " * ", " * ", "*****"],
|
|
51
|
+
'2': [" *** ", "* *", " ** ", " * ", "*****"],
|
|
52
|
+
'3': ["**** ", " *", " *** ", " *", "**** "],
|
|
53
|
+
'4': ["* *", "* *", "*****", " *", " *"],
|
|
54
|
+
'5': ["*****", "* ", "**** ", " *", "**** "],
|
|
55
|
+
'6': [" *** ", "* ", "**** ", "* *", " *** "],
|
|
56
|
+
'7': ["*****", " *", " * ", " * ", " * "],
|
|
57
|
+
'8': [" *** ", "* *", " *** ", "* *", " *** "],
|
|
58
|
+
'9': [" *** ", "* *", " ****", " *", " *** "],
|
|
59
|
+
' ': [" ", " ", " ", " ", " "],
|
|
60
|
+
'.': [" ", " ", " ", " ", " * "],
|
|
61
|
+
',': [" ", " ", " ", " * ", " * "],
|
|
62
|
+
'!': [" * ", " * ", " * ", " ", " * "],
|
|
63
|
+
'?': [" *** ", "* *", " ** ", " ", " * "],
|
|
64
|
+
'-': [" ", " ", "*****", " ", " "],
|
|
65
|
+
'+': [" ", " * ", "*****", " * ", " "],
|
|
66
|
+
'=': [" ", "*****", " ", "*****", " "],
|
|
67
|
+
':': [" ", " * ", " ", " * ", " "],
|
|
68
|
+
'/': [" *", " * ", " * ", " * ", "* "],
|
|
69
|
+
'(': [" * ", " * ", " * ", " * ", " * "],
|
|
70
|
+
')': [" * ", " * ", " * ", " * ", " * "],
|
|
71
|
+
'@': [" *** ", "* *", "* ***", "* ", " ****"],
|
|
72
|
+
'#': [" * * ", "*****", " * * ", "*****", " * * "],
|
|
73
|
+
},
|
|
74
|
+
"banner": {
|
|
75
|
+
'A': [" # ", " # # ", " ##### ", "# #", "# #"],
|
|
76
|
+
'B': ["###### ", "# #", "###### ", "# #", "###### "],
|
|
77
|
+
'C': [" ##### ", "# ", "# ", "# ", " ##### "],
|
|
78
|
+
'D': ["###### ", "# #", "# #", "# #", "###### "],
|
|
79
|
+
'E': ["#######", "# ", "##### ", "# ", "#######"],
|
|
80
|
+
'F': ["#######", "# ", "##### ", "# ", "# "],
|
|
81
|
+
'G': [" ##### ", "# ", "# ####", "# #", " ##### "],
|
|
82
|
+
'H': ["# #", "# #", "#######", "# #", "# #"],
|
|
83
|
+
'I': ["#######", " # ", " # ", " # ", "#######"],
|
|
84
|
+
'J': ["#######", " # ", " # ", "# # ", " #### "],
|
|
85
|
+
'K': ["# # ", "# # ", "#### ", "# # ", "# # "],
|
|
86
|
+
'L': ["# ", "# ", "# ", "# ", "#######"],
|
|
87
|
+
'M': ["# #", "## ##", "# # # #", "# # #", "# #"],
|
|
88
|
+
'N': ["# #", "## #", "# # #", "# # #", "# ## "],
|
|
89
|
+
'O': [" ##### ", "# #", "# #", "# #", " ##### "],
|
|
90
|
+
'P': ["###### ", "# #", "###### ", "# ", "# "],
|
|
91
|
+
'Q': [" ##### ", "# #", "# # #", "# # ", " #### #"],
|
|
92
|
+
'R': ["###### ", "# #", "###### ", "# # ", "# # "],
|
|
93
|
+
'S': [" ##### ", "# ", " ##### ", " #", " ##### "],
|
|
94
|
+
'T': ["#######", " # ", " # ", " # ", " # "],
|
|
95
|
+
'U': ["# #", "# #", "# #", "# #", " ##### "],
|
|
96
|
+
'V': ["# #", "# #", " # # ", " # # ", " # "],
|
|
97
|
+
'W': ["# #", "# # #", "# # # #", "## ##", "# #"],
|
|
98
|
+
'X': ["# #", " # # ", " ### ", " # # ", "# #"],
|
|
99
|
+
'Y': ["# #", " # # ", " ### ", " # ", " # "],
|
|
100
|
+
'Z': ["#######", " ## ", " # ", " # ", "#######"],
|
|
101
|
+
' ': [" ", " ", " ", " ", " "],
|
|
102
|
+
},
|
|
103
|
+
"block": {
|
|
104
|
+
'A': ["█████", "█ █", "█████", "█ █", "█ █"],
|
|
105
|
+
'B': ["████ ", "█ █", "████ ", "█ █", "████ "],
|
|
106
|
+
'C': ["█████", "█ ", "█ ", "█ ", "█████"],
|
|
107
|
+
'D': ["████ ", "█ █", "█ █", "█ █", "████ "],
|
|
108
|
+
'E': ["█████", "█ ", "███ ", "█ ", "█████"],
|
|
109
|
+
'F': ["█████", "█ ", "███ ", "█ ", "█ "],
|
|
110
|
+
'G': ["█████", "█ ", "█ ███", "█ █", "█████"],
|
|
111
|
+
'H': ["█ █", "█ █", "█████", "█ █", "█ █"],
|
|
112
|
+
'I': ["█████", " █ ", " █ ", " █ ", "█████"],
|
|
113
|
+
'J': ["█████", " █", " █", "█ █", "█████"],
|
|
114
|
+
'K': ["█ █", "█ █ ", "███ ", "█ █ ", "█ █"],
|
|
115
|
+
'L': ["█ ", "█ ", "█ ", "█ ", "█████"],
|
|
116
|
+
'M': ["█ █", "██ ██", "█ █ █", "█ █", "█ █"],
|
|
117
|
+
'N': ["█ █", "██ █", "█ █ █", "█ ██", "█ █"],
|
|
118
|
+
'O': ["█████", "█ █", "█ █", "█ █", "█████"],
|
|
119
|
+
'P': ["█████", "█ █", "█████", "█ ", "█ "],
|
|
120
|
+
'Q': ["█████", "█ █", "█ █ █", "█ █ ", "███ █"],
|
|
121
|
+
'R': ["█████", "█ █", "█████", "█ █ ", "█ █"],
|
|
122
|
+
'S': ["█████", "█ ", "█████", " █", "█████"],
|
|
123
|
+
'T': ["█████", " █ ", " █ ", " █ ", " █ "],
|
|
124
|
+
'U': ["█ █", "█ █", "█ █", "█ █", "█████"],
|
|
125
|
+
'V': ["█ █", "█ █", "█ █", " █ █ ", " █ "],
|
|
126
|
+
'W': ["█ █", "█ █", "█ █ █", "██ ██", "█ █"],
|
|
127
|
+
'X': ["█ █", " █ █ ", " █ ", " █ █ ", "█ █"],
|
|
128
|
+
'Y': ["█ █", " █ █ ", " █ ", " █ ", " █ "],
|
|
129
|
+
'Z': ["█████", " █ ", " █ ", " █ ", "█████"],
|
|
130
|
+
' ': [" ", " ", " ", " ", " "],
|
|
131
|
+
},
|
|
132
|
+
"small": {
|
|
133
|
+
'A': [" * ", "* *", "***", "* *"],
|
|
134
|
+
'B': ["** ", "***", "* *", "** "],
|
|
135
|
+
'C': [" **", "* ", "* ", " **"],
|
|
136
|
+
'D': ["** ", "* *", "* *", "** "],
|
|
137
|
+
'E': ["***", "** ", "* ", "***"],
|
|
138
|
+
'F': ["***", "** ", "* ", "* "],
|
|
139
|
+
'G': [" **", "* ", "* *", " **"],
|
|
140
|
+
'H': ["* *", "***", "* *", "* *"],
|
|
141
|
+
'I': ["***", " * ", " * ", "***"],
|
|
142
|
+
'J': ["***", " *", "* *", " * "],
|
|
143
|
+
'K': ["* *", "** ", "* *", "* *"],
|
|
144
|
+
'L': ["* ", "* ", "* ", "***"],
|
|
145
|
+
'M': ["* *", "***", "* *", "* *"],
|
|
146
|
+
'N': ["* *", "***", "***", "* *"],
|
|
147
|
+
'O': [" * ", "* *", "* *", " * "],
|
|
148
|
+
'P': ["** ", "* *", "** ", "* "],
|
|
149
|
+
'Q': [" * ", "* *", " **", " *"],
|
|
150
|
+
'R': ["** ", "* *", "** ", "* *"],
|
|
151
|
+
'S': [" **", " * ", " *", "** "],
|
|
152
|
+
'T': ["***", " * ", " * ", " * "],
|
|
153
|
+
'U': ["* *", "* *", "* *", " * "],
|
|
154
|
+
'V': ["* *", "* *", " * ", " * "],
|
|
155
|
+
'W': ["* *", "* *", "***", "* *"],
|
|
156
|
+
'X': ["* *", " * ", " * ", "* *"],
|
|
157
|
+
'Y': ["* *", " * ", " * ", " * "],
|
|
158
|
+
'Z': ["***", " * ", "* ", "***"],
|
|
159
|
+
' ': [" ", " ", " ", " "],
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@staticmethod
|
|
164
|
+
def generate_ascii_art(text, font="standard"):
|
|
165
|
+
"""Generate ASCII art from text."""
|
|
166
|
+
text = text.upper()
|
|
167
|
+
font_data = ASCIIArtGeneratorProcessor.FONTS.get(font, ASCIIArtGeneratorProcessor.FONTS["standard"])
|
|
168
|
+
|
|
169
|
+
# Get height of font
|
|
170
|
+
sample_char = font_data.get('A', font_data.get(' ', ['']))
|
|
171
|
+
height = len(sample_char)
|
|
172
|
+
|
|
173
|
+
# Build each line
|
|
174
|
+
lines = ['' for _ in range(height)]
|
|
175
|
+
|
|
176
|
+
for char in text:
|
|
177
|
+
char_art = font_data.get(char, font_data.get(' ', [' ' * 5] * height))
|
|
178
|
+
|
|
179
|
+
# Ensure char_art has correct height
|
|
180
|
+
while len(char_art) < height:
|
|
181
|
+
char_art = char_art + [' ' * len(char_art[0] if char_art else 5)]
|
|
182
|
+
|
|
183
|
+
for i in range(height):
|
|
184
|
+
lines[i] += char_art[i] + ' '
|
|
185
|
+
|
|
186
|
+
return '\n'.join(lines)
|
|
187
|
+
|
|
188
|
+
@staticmethod
|
|
189
|
+
def generate_multiline(text, font="standard"):
|
|
190
|
+
"""Generate ASCII art for multiline text."""
|
|
191
|
+
input_lines = text.split('\n')
|
|
192
|
+
result_parts = []
|
|
193
|
+
|
|
194
|
+
for line in input_lines:
|
|
195
|
+
if line.strip():
|
|
196
|
+
result_parts.append(ASCIIArtGeneratorProcessor.generate_ascii_art(line, font))
|
|
197
|
+
else:
|
|
198
|
+
result_parts.append('')
|
|
199
|
+
|
|
200
|
+
return '\n\n'.join(result_parts)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class ASCIIArtGeneratorWidget(ttk.Frame):
|
|
204
|
+
"""Widget for ASCII art generator tool."""
|
|
205
|
+
|
|
206
|
+
def __init__(self, parent, app):
|
|
207
|
+
super().__init__(parent)
|
|
208
|
+
self.app = app
|
|
209
|
+
self.processor = ASCIIArtGeneratorProcessor()
|
|
210
|
+
|
|
211
|
+
self.font = tk.StringVar(value="standard")
|
|
212
|
+
|
|
213
|
+
self.create_widgets()
|
|
214
|
+
self.load_settings()
|
|
215
|
+
|
|
216
|
+
def create_widgets(self):
|
|
217
|
+
"""Creates the widget interface."""
|
|
218
|
+
# Font selection
|
|
219
|
+
font_frame = ttk.LabelFrame(self, text="Font Style", padding=10)
|
|
220
|
+
font_frame.pack(fill=tk.X, padx=5, pady=5)
|
|
221
|
+
|
|
222
|
+
fonts = [
|
|
223
|
+
("Standard (*)", "standard"),
|
|
224
|
+
("Banner (#)", "banner"),
|
|
225
|
+
("Block (█)", "block"),
|
|
226
|
+
("Small", "small"),
|
|
227
|
+
]
|
|
228
|
+
|
|
229
|
+
for text, value in fonts:
|
|
230
|
+
ttk.Radiobutton(font_frame, text=text,
|
|
231
|
+
variable=self.font, value=value,
|
|
232
|
+
command=self.on_setting_change).pack(side=tk.LEFT, padx=10)
|
|
233
|
+
|
|
234
|
+
# Info
|
|
235
|
+
info = ttk.Label(self, text="Enter text to convert to ASCII art.\n"
|
|
236
|
+
"Supports A-Z, 0-9, and common punctuation.",
|
|
237
|
+
justify=tk.CENTER)
|
|
238
|
+
info.pack(pady=10)
|
|
239
|
+
|
|
240
|
+
# Generate button
|
|
241
|
+
ttk.Button(self, text="Generate ASCII Art",
|
|
242
|
+
command=self.generate).pack(pady=10)
|
|
243
|
+
|
|
244
|
+
# Preview area
|
|
245
|
+
preview_frame = ttk.LabelFrame(self, text="Preview", padding=5)
|
|
246
|
+
preview_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
|
|
247
|
+
|
|
248
|
+
self.preview_text = tk.Text(preview_frame, height=8, width=60, font=('Courier', 8))
|
|
249
|
+
self.preview_text.pack(fill=tk.BOTH, expand=True)
|
|
250
|
+
self.preview_text.config(state=tk.DISABLED)
|
|
251
|
+
|
|
252
|
+
# Show initial preview
|
|
253
|
+
self.update_preview()
|
|
254
|
+
|
|
255
|
+
def update_preview(self):
|
|
256
|
+
"""Update the preview with sample text."""
|
|
257
|
+
sample = ASCIIArtGeneratorProcessor.generate_ascii_art("ABC", self.font.get())
|
|
258
|
+
self.preview_text.config(state=tk.NORMAL)
|
|
259
|
+
self.preview_text.delete("1.0", tk.END)
|
|
260
|
+
self.preview_text.insert("1.0", sample)
|
|
261
|
+
self.preview_text.config(state=tk.DISABLED)
|
|
262
|
+
|
|
263
|
+
def load_settings(self):
|
|
264
|
+
"""Load settings from the application."""
|
|
265
|
+
settings = self.app.settings.get("tool_settings", {}).get("ASCII Art Generator", {})
|
|
266
|
+
self.font.set(settings.get("font", "standard"))
|
|
267
|
+
self.update_preview()
|
|
268
|
+
|
|
269
|
+
def save_settings(self):
|
|
270
|
+
"""Save current settings to the application."""
|
|
271
|
+
if "ASCII Art Generator" not in self.app.settings["tool_settings"]:
|
|
272
|
+
self.app.settings["tool_settings"]["ASCII Art Generator"] = {}
|
|
273
|
+
|
|
274
|
+
self.app.settings["tool_settings"]["ASCII Art Generator"].update({
|
|
275
|
+
"font": self.font.get()
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
self.app.save_settings()
|
|
279
|
+
|
|
280
|
+
def on_setting_change(self, *args):
|
|
281
|
+
"""Handle setting changes."""
|
|
282
|
+
self.update_preview()
|
|
283
|
+
self.save_settings()
|
|
284
|
+
|
|
285
|
+
def generate(self):
|
|
286
|
+
"""Generate ASCII art."""
|
|
287
|
+
active_input_tab = self.app.input_tabs[self.app.input_notebook.index(self.app.input_notebook.select())]
|
|
288
|
+
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
289
|
+
|
|
290
|
+
if not input_text.strip():
|
|
291
|
+
return
|
|
292
|
+
|
|
293
|
+
result = ASCIIArtGeneratorProcessor.generate_multiline(input_text, self.font.get())
|
|
294
|
+
|
|
295
|
+
active_output_tab = self.app.output_tabs[self.app.output_notebook.index(self.app.output_notebook.select())]
|
|
296
|
+
active_output_tab.text.config(state="normal")
|
|
297
|
+
active_output_tab.text.delete("1.0", tk.END)
|
|
298
|
+
active_output_tab.text.insert("1.0", result)
|
|
299
|
+
active_output_tab.text.config(state="disabled")
|
|
300
|
+
|
|
301
|
+
self.app.update_all_stats()
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class ASCIIArtGenerator:
|
|
305
|
+
"""Main class for ASCII Art Generator integration."""
|
|
306
|
+
|
|
307
|
+
def __init__(self):
|
|
308
|
+
self.processor = ASCIIArtGeneratorProcessor()
|
|
309
|
+
|
|
310
|
+
def create_widget(self, parent, app):
|
|
311
|
+
"""Create and return the ASCII Art Generator widget."""
|
|
312
|
+
return ASCIIArtGeneratorWidget(parent, app)
|
|
313
|
+
|
|
314
|
+
def get_default_settings(self):
|
|
315
|
+
"""Return default settings for ASCII Art Generator."""
|
|
316
|
+
return {
|
|
317
|
+
"font": "standard",
|
|
318
|
+
"width": 80
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
# BaseTool-compatible wrapper
|
|
323
|
+
try:
|
|
324
|
+
from tools.base_tool import ToolWithOptions
|
|
325
|
+
from typing import Dict, Any
|
|
326
|
+
import tkinter as tk
|
|
327
|
+
from tkinter import ttk
|
|
328
|
+
|
|
329
|
+
class ASCIIArtGeneratorV2(ToolWithOptions):
|
|
330
|
+
"""
|
|
331
|
+
BaseTool-compatible version of ASCIIArtGenerator.
|
|
332
|
+
"""
|
|
333
|
+
|
|
334
|
+
TOOL_NAME = "ASCII Art Generator"
|
|
335
|
+
TOOL_DESCRIPTION = "Convert text to ASCII art"
|
|
336
|
+
TOOL_VERSION = "2.0.0"
|
|
337
|
+
|
|
338
|
+
OPTIONS = [
|
|
339
|
+
("Standard", "standard"),
|
|
340
|
+
("Banner", "banner"),
|
|
341
|
+
("Block", "block"),
|
|
342
|
+
]
|
|
343
|
+
OPTIONS_LABEL = "Font"
|
|
344
|
+
USE_DROPDOWN = True
|
|
345
|
+
DEFAULT_OPTION = "standard"
|
|
346
|
+
|
|
347
|
+
def process_text(self, input_text: str, settings: Dict[str, Any]) -> str:
|
|
348
|
+
"""Generate ASCII art from text."""
|
|
349
|
+
font = settings.get("mode", "standard")
|
|
350
|
+
return ASCIIArtGeneratorProcessor.generate_ascii_art(input_text, font)
|
|
351
|
+
|
|
352
|
+
except ImportError:
|
|
353
|
+
pass
|
|
@@ -0,0 +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
|
|
184
|
+
pass
|