pomera-ai-commander 1.1.1 → 1.2.2
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 +1199 -1033
- package/core/content_hash_cache.py +508 -508
- package/core/context_menu.py +313 -313
- package/core/data_directory.py +549 -0
- 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/diff_utils.py +239 -0
- package/core/efficient_line_numbers.py +540 -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/find_replace_diff.py +334 -0
- 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 +2699 -2345
- package/core/memento.py +275 -0
- 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/migrate_data.py +127 -0
- package/package.json +64 -57
- package/pomera.py +7883 -7482
- package/pomera_mcp_server.py +183 -144
- package/requirements.txt +33 -0
- package/scripts/Dockerfile.alpine +43 -0
- package/scripts/Dockerfile.gui-test +54 -0
- package/scripts/Dockerfile.linux +43 -0
- package/scripts/Dockerfile.test-linux +80 -0
- package/scripts/Dockerfile.ubuntu +39 -0
- package/scripts/README.md +53 -0
- package/scripts/build-all.bat +113 -0
- package/scripts/build-docker.bat +53 -0
- package/scripts/build-docker.sh +55 -0
- package/scripts/build-optimized.bat +101 -0
- package/scripts/build.sh +78 -0
- package/scripts/docker-compose.test.yml +27 -0
- package/scripts/docker-compose.yml +32 -0
- package/scripts/postinstall.js +62 -0
- package/scripts/requirements-minimal.txt +33 -0
- package/scripts/test-linux-simple.bat +28 -0
- package/scripts/validate-release-workflow.py +450 -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 +1817 -1072
- 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 +2289 -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 +978 -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
|
@@ -1,353 +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:
|
|
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
353
|
pass
|