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,250 +1,250 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Extraction Tools Module for Pomera AI Commander
|
|
3
|
-
|
|
4
|
-
This module provides various text extraction tools including:
|
|
5
|
-
- Email Extraction Tool
|
|
6
|
-
- HTML Extraction Tool
|
|
7
|
-
- Regex Extractor
|
|
8
|
-
- URL and Link Extractor
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import tkinter as tk
|
|
12
|
-
from tkinter import ttk
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class ExtractionToolsWidget:
|
|
16
|
-
"""Widget for the Extraction Tools tabbed interface."""
|
|
17
|
-
|
|
18
|
-
def __init__(self, main_app):
|
|
19
|
-
"""Initialize the ExtractionToolsWidget."""
|
|
20
|
-
self.main_app = main_app
|
|
21
|
-
|
|
22
|
-
# Store UI references
|
|
23
|
-
self.email_extraction_ui = None
|
|
24
|
-
self.html_extraction_ui = None
|
|
25
|
-
self.regex_extractor_ui = None
|
|
26
|
-
self.url_link_extractor_ui = None
|
|
27
|
-
|
|
28
|
-
def create_widget(self, parent):
|
|
29
|
-
"""Create and return the main widget."""
|
|
30
|
-
# Create main frame
|
|
31
|
-
main_frame = ttk.Frame(parent)
|
|
32
|
-
|
|
33
|
-
# Create notebook for tabs
|
|
34
|
-
self.notebook = ttk.Notebook(main_frame)
|
|
35
|
-
self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
|
|
36
|
-
|
|
37
|
-
# Create tabs
|
|
38
|
-
self.create_email_extraction_tab()
|
|
39
|
-
self.create_html_extraction_tab()
|
|
40
|
-
self.create_regex_extractor_tab()
|
|
41
|
-
self.create_url_link_extractor_tab()
|
|
42
|
-
|
|
43
|
-
return main_frame
|
|
44
|
-
|
|
45
|
-
def create_email_extraction_tab(self):
|
|
46
|
-
"""Create the Email Extraction Tool tab."""
|
|
47
|
-
tab_frame = ttk.Frame(self.notebook)
|
|
48
|
-
self.notebook.add(tab_frame, text="Email Extraction")
|
|
49
|
-
|
|
50
|
-
try:
|
|
51
|
-
from tools.email_extraction_tool import EmailExtractionTool
|
|
52
|
-
if hasattr(self.main_app, 'email_extraction_tool') and self.main_app.email_extraction_tool:
|
|
53
|
-
tool_settings = self.main_app.settings["tool_settings"].get("Email Extraction Tool", {
|
|
54
|
-
"omit_duplicates": False,
|
|
55
|
-
"hide_counts": True,
|
|
56
|
-
"sort_emails": False,
|
|
57
|
-
"only_domain": False
|
|
58
|
-
})
|
|
59
|
-
self.email_extraction_ui = self.main_app.email_extraction_tool.create_ui(
|
|
60
|
-
tab_frame,
|
|
61
|
-
tool_settings,
|
|
62
|
-
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
63
|
-
apply_tool_callback=self._email_extraction_apply
|
|
64
|
-
)
|
|
65
|
-
else:
|
|
66
|
-
ttk.Label(tab_frame, text="Email Extraction Tool module not available").pack(padx=10, pady=10)
|
|
67
|
-
except ImportError:
|
|
68
|
-
ttk.Label(tab_frame, text="Email Extraction Tool module not available").pack(padx=10, pady=10)
|
|
69
|
-
|
|
70
|
-
def create_html_extraction_tab(self):
|
|
71
|
-
"""Create the HTML Extraction Tool tab."""
|
|
72
|
-
tab_frame = ttk.Frame(self.notebook)
|
|
73
|
-
self.notebook.add(tab_frame, text="HTML Extraction")
|
|
74
|
-
|
|
75
|
-
try:
|
|
76
|
-
from tools.html_tool import HTMLExtractionTool
|
|
77
|
-
if hasattr(self.main_app, 'html_extraction_tool') and self.main_app.html_extraction_tool:
|
|
78
|
-
# HTML Extraction Tool uses a different UI creation method
|
|
79
|
-
settings = self.main_app.settings["tool_settings"].get("HTML Extraction Tool", {})
|
|
80
|
-
# Create a frame to hold the HTML tool UI
|
|
81
|
-
html_frame = ttk.Frame(tab_frame)
|
|
82
|
-
html_frame.pack(fill=tk.BOTH, expand=True)
|
|
83
|
-
self.main_app.create_html_extraction_tool_ui(html_frame, settings)
|
|
84
|
-
else:
|
|
85
|
-
ttk.Label(tab_frame, text="HTML Extraction Tool module not available").pack(padx=10, pady=10)
|
|
86
|
-
except ImportError:
|
|
87
|
-
ttk.Label(tab_frame, text="HTML Extraction Tool module not available").pack(padx=10, pady=10)
|
|
88
|
-
|
|
89
|
-
def create_regex_extractor_tab(self):
|
|
90
|
-
"""Create the Regex Extractor tab."""
|
|
91
|
-
tab_frame = ttk.Frame(self.notebook)
|
|
92
|
-
self.notebook.add(tab_frame, text="Regex Extractor")
|
|
93
|
-
|
|
94
|
-
try:
|
|
95
|
-
from tools.regex_extractor import RegexExtractor
|
|
96
|
-
if hasattr(self.main_app, 'regex_extractor') and self.main_app.regex_extractor:
|
|
97
|
-
tool_settings = self.main_app.settings["tool_settings"].get("Regex Extractor", {
|
|
98
|
-
"pattern": "",
|
|
99
|
-
"match_mode": "all_per_line",
|
|
100
|
-
"omit_duplicates": False,
|
|
101
|
-
"hide_counts": True,
|
|
102
|
-
"sort_results": False,
|
|
103
|
-
"case_sensitive": False
|
|
104
|
-
})
|
|
105
|
-
# Create settings manager adapter for pattern library access
|
|
106
|
-
# PromeraAISettingsManager is defined in pomera.py
|
|
107
|
-
# Access it through the main_app's module
|
|
108
|
-
import sys
|
|
109
|
-
main_module = sys.modules.get(self.main_app.__class__.__module__)
|
|
110
|
-
if main_module and hasattr(main_module, 'PromeraAISettingsManager'):
|
|
111
|
-
PromeraAISettingsManager = main_module.PromeraAISettingsManager
|
|
112
|
-
settings_manager = PromeraAISettingsManager(self.main_app)
|
|
113
|
-
else:
|
|
114
|
-
settings_manager = None
|
|
115
|
-
self.regex_extractor_ui = self.main_app.regex_extractor.create_ui(
|
|
116
|
-
tab_frame,
|
|
117
|
-
tool_settings,
|
|
118
|
-
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
119
|
-
apply_tool_callback=self._regex_extractor_apply,
|
|
120
|
-
settings_manager=settings_manager
|
|
121
|
-
)
|
|
122
|
-
else:
|
|
123
|
-
ttk.Label(tab_frame, text="Regex Extractor module not available").pack(padx=10, pady=10)
|
|
124
|
-
except ImportError:
|
|
125
|
-
ttk.Label(tab_frame, text="Regex Extractor module not available").pack(padx=10, pady=10)
|
|
126
|
-
|
|
127
|
-
def _regex_extractor_apply(self):
|
|
128
|
-
"""Apply Regex Extractor tool."""
|
|
129
|
-
if hasattr(self.main_app, 'regex_extractor') and self.main_app.regex_extractor:
|
|
130
|
-
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
131
|
-
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
132
|
-
|
|
133
|
-
if not input_text.strip():
|
|
134
|
-
return
|
|
135
|
-
|
|
136
|
-
# Get current settings from the UI widget, not from saved settings
|
|
137
|
-
if hasattr(self, 'regex_extractor_ui') and self.regex_extractor_ui:
|
|
138
|
-
settings = self.regex_extractor_ui.get_current_settings()
|
|
139
|
-
else:
|
|
140
|
-
# Fallback to saved settings if UI not available
|
|
141
|
-
settings = self.main_app.settings["tool_settings"].get("Regex Extractor", {})
|
|
142
|
-
|
|
143
|
-
result = self.main_app.regex_extractor.process_text(input_text, settings)
|
|
144
|
-
|
|
145
|
-
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
146
|
-
active_output_tab.text.config(state="normal")
|
|
147
|
-
active_output_tab.text.delete("1.0", tk.END)
|
|
148
|
-
active_output_tab.text.insert("1.0", result)
|
|
149
|
-
active_output_tab.text.config(state="disabled")
|
|
150
|
-
|
|
151
|
-
self.main_app.update_all_stats()
|
|
152
|
-
|
|
153
|
-
def _email_extraction_apply(self):
|
|
154
|
-
"""Apply Email Extraction Tool."""
|
|
155
|
-
if hasattr(self.main_app, 'email_extraction_tool') and self.main_app.email_extraction_tool:
|
|
156
|
-
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
157
|
-
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
158
|
-
|
|
159
|
-
if not input_text.strip():
|
|
160
|
-
return
|
|
161
|
-
|
|
162
|
-
# Get current settings from the UI widget, not from saved settings
|
|
163
|
-
if hasattr(self, 'email_extraction_ui') and self.email_extraction_ui:
|
|
164
|
-
settings = self.email_extraction_ui.get_current_settings()
|
|
165
|
-
else:
|
|
166
|
-
# Fallback to saved settings if UI not available
|
|
167
|
-
settings = self.main_app.settings["tool_settings"].get("Email Extraction Tool", {})
|
|
168
|
-
|
|
169
|
-
result = self.main_app.email_extraction_tool.process_text(input_text, settings)
|
|
170
|
-
|
|
171
|
-
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
172
|
-
active_output_tab.text.config(state="normal")
|
|
173
|
-
active_output_tab.text.delete("1.0", tk.END)
|
|
174
|
-
active_output_tab.text.insert("1.0", result)
|
|
175
|
-
active_output_tab.text.config(state="disabled")
|
|
176
|
-
|
|
177
|
-
self.main_app.update_all_stats()
|
|
178
|
-
|
|
179
|
-
def _url_link_extractor_apply(self):
|
|
180
|
-
"""Apply URL and Link Extractor tool."""
|
|
181
|
-
if hasattr(self.main_app, 'url_link_extractor') and self.main_app.url_link_extractor:
|
|
182
|
-
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
183
|
-
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
184
|
-
|
|
185
|
-
if not input_text.strip():
|
|
186
|
-
return
|
|
187
|
-
|
|
188
|
-
# Get current settings from the UI widget, not from saved settings
|
|
189
|
-
if hasattr(self, 'url_link_extractor_ui') and self.url_link_extractor_ui:
|
|
190
|
-
settings = self.url_link_extractor_ui.get_current_settings()
|
|
191
|
-
else:
|
|
192
|
-
# Fallback to saved settings if UI not available
|
|
193
|
-
settings = self.main_app.settings["tool_settings"].get("URL and Link Extractor", {})
|
|
194
|
-
|
|
195
|
-
result = self.main_app.url_link_extractor.process_text(input_text, settings)
|
|
196
|
-
|
|
197
|
-
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
198
|
-
active_output_tab.text.config(state="normal")
|
|
199
|
-
active_output_tab.text.delete("1.0", tk.END)
|
|
200
|
-
active_output_tab.text.insert("1.0", result)
|
|
201
|
-
active_output_tab.text.config(state="disabled")
|
|
202
|
-
|
|
203
|
-
self.main_app.update_all_stats()
|
|
204
|
-
|
|
205
|
-
def create_url_link_extractor_tab(self):
|
|
206
|
-
"""Create the URL and Link Extractor tab."""
|
|
207
|
-
tab_frame = ttk.Frame(self.notebook)
|
|
208
|
-
self.notebook.add(tab_frame, text="URL and Link Extractor")
|
|
209
|
-
|
|
210
|
-
try:
|
|
211
|
-
from tools.url_link_extractor import URLLinkExtractor
|
|
212
|
-
if hasattr(self.main_app, 'url_link_extractor') and self.main_app.url_link_extractor:
|
|
213
|
-
tool_settings = self.main_app.settings["tool_settings"].get("URL and Link Extractor", {
|
|
214
|
-
"extract_href": False,
|
|
215
|
-
"extract_https": False,
|
|
216
|
-
"extract_any_protocol": False,
|
|
217
|
-
"extract_markdown": False,
|
|
218
|
-
"filter_text": ""
|
|
219
|
-
})
|
|
220
|
-
self.url_link_extractor_ui = self.main_app.url_link_extractor.create_ui(
|
|
221
|
-
tab_frame,
|
|
222
|
-
tool_settings,
|
|
223
|
-
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
224
|
-
apply_tool_callback=self._url_link_extractor_apply
|
|
225
|
-
)
|
|
226
|
-
else:
|
|
227
|
-
ttk.Label(tab_frame, text="URL and Link Extractor module not available").pack(padx=10, pady=10)
|
|
228
|
-
except ImportError:
|
|
229
|
-
ttk.Label(tab_frame, text="URL and Link Extractor module not available").pack(padx=10, pady=10)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
class ExtractionTools:
|
|
233
|
-
"""Main class for Extraction Tools integration."""
|
|
234
|
-
|
|
235
|
-
def __init__(self):
|
|
236
|
-
pass
|
|
237
|
-
|
|
238
|
-
def create_widget(self, parent, main_app):
|
|
239
|
-
"""Create and return the Extraction Tools widget."""
|
|
240
|
-
widget = ExtractionToolsWidget(main_app)
|
|
241
|
-
return widget.create_widget(parent)
|
|
242
|
-
|
|
243
|
-
def get_default_settings(self):
|
|
244
|
-
"""Return default settings for all extraction tools."""
|
|
245
|
-
return {
|
|
246
|
-
"Email Extraction Tool": {"omit_duplicates": False, "hide_counts": True, "sort_emails": False, "only_domain": False},
|
|
247
|
-
"HTML Extraction Tool": {},
|
|
248
|
-
"Regex Extractor": {"pattern": "", "match_mode": "all_per_line", "omit_duplicates": False, "hide_counts": True, "sort_results": False, "case_sensitive": False},
|
|
249
|
-
"URL and Link Extractor": {"extract_href": False, "extract_https": False, "extract_any_protocol": False, "extract_markdown": False, "filter_text": ""}
|
|
250
|
-
}
|
|
1
|
+
"""
|
|
2
|
+
Extraction Tools Module for Pomera AI Commander
|
|
3
|
+
|
|
4
|
+
This module provides various text extraction tools including:
|
|
5
|
+
- Email Extraction Tool
|
|
6
|
+
- HTML Extraction Tool
|
|
7
|
+
- Regex Extractor
|
|
8
|
+
- URL and Link Extractor
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import tkinter as tk
|
|
12
|
+
from tkinter import ttk
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ExtractionToolsWidget:
|
|
16
|
+
"""Widget for the Extraction Tools tabbed interface."""
|
|
17
|
+
|
|
18
|
+
def __init__(self, main_app):
|
|
19
|
+
"""Initialize the ExtractionToolsWidget."""
|
|
20
|
+
self.main_app = main_app
|
|
21
|
+
|
|
22
|
+
# Store UI references
|
|
23
|
+
self.email_extraction_ui = None
|
|
24
|
+
self.html_extraction_ui = None
|
|
25
|
+
self.regex_extractor_ui = None
|
|
26
|
+
self.url_link_extractor_ui = None
|
|
27
|
+
|
|
28
|
+
def create_widget(self, parent):
|
|
29
|
+
"""Create and return the main widget."""
|
|
30
|
+
# Create main frame
|
|
31
|
+
main_frame = ttk.Frame(parent)
|
|
32
|
+
|
|
33
|
+
# Create notebook for tabs
|
|
34
|
+
self.notebook = ttk.Notebook(main_frame)
|
|
35
|
+
self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
|
|
36
|
+
|
|
37
|
+
# Create tabs
|
|
38
|
+
self.create_email_extraction_tab()
|
|
39
|
+
self.create_html_extraction_tab()
|
|
40
|
+
self.create_regex_extractor_tab()
|
|
41
|
+
self.create_url_link_extractor_tab()
|
|
42
|
+
|
|
43
|
+
return main_frame
|
|
44
|
+
|
|
45
|
+
def create_email_extraction_tab(self):
|
|
46
|
+
"""Create the Email Extraction Tool tab."""
|
|
47
|
+
tab_frame = ttk.Frame(self.notebook)
|
|
48
|
+
self.notebook.add(tab_frame, text="Email Extraction")
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
from tools.email_extraction_tool import EmailExtractionTool
|
|
52
|
+
if hasattr(self.main_app, 'email_extraction_tool') and self.main_app.email_extraction_tool:
|
|
53
|
+
tool_settings = self.main_app.settings["tool_settings"].get("Email Extraction Tool", {
|
|
54
|
+
"omit_duplicates": False,
|
|
55
|
+
"hide_counts": True,
|
|
56
|
+
"sort_emails": False,
|
|
57
|
+
"only_domain": False
|
|
58
|
+
})
|
|
59
|
+
self.email_extraction_ui = self.main_app.email_extraction_tool.create_ui(
|
|
60
|
+
tab_frame,
|
|
61
|
+
tool_settings,
|
|
62
|
+
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
63
|
+
apply_tool_callback=self._email_extraction_apply
|
|
64
|
+
)
|
|
65
|
+
else:
|
|
66
|
+
ttk.Label(tab_frame, text="Email Extraction Tool module not available").pack(padx=10, pady=10)
|
|
67
|
+
except ImportError:
|
|
68
|
+
ttk.Label(tab_frame, text="Email Extraction Tool module not available").pack(padx=10, pady=10)
|
|
69
|
+
|
|
70
|
+
def create_html_extraction_tab(self):
|
|
71
|
+
"""Create the HTML Extraction Tool tab."""
|
|
72
|
+
tab_frame = ttk.Frame(self.notebook)
|
|
73
|
+
self.notebook.add(tab_frame, text="HTML Extraction")
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
from tools.html_tool import HTMLExtractionTool
|
|
77
|
+
if hasattr(self.main_app, 'html_extraction_tool') and self.main_app.html_extraction_tool:
|
|
78
|
+
# HTML Extraction Tool uses a different UI creation method
|
|
79
|
+
settings = self.main_app.settings["tool_settings"].get("HTML Extraction Tool", {})
|
|
80
|
+
# Create a frame to hold the HTML tool UI
|
|
81
|
+
html_frame = ttk.Frame(tab_frame)
|
|
82
|
+
html_frame.pack(fill=tk.BOTH, expand=True)
|
|
83
|
+
self.main_app.create_html_extraction_tool_ui(html_frame, settings)
|
|
84
|
+
else:
|
|
85
|
+
ttk.Label(tab_frame, text="HTML Extraction Tool module not available").pack(padx=10, pady=10)
|
|
86
|
+
except ImportError:
|
|
87
|
+
ttk.Label(tab_frame, text="HTML Extraction Tool module not available").pack(padx=10, pady=10)
|
|
88
|
+
|
|
89
|
+
def create_regex_extractor_tab(self):
|
|
90
|
+
"""Create the Regex Extractor tab."""
|
|
91
|
+
tab_frame = ttk.Frame(self.notebook)
|
|
92
|
+
self.notebook.add(tab_frame, text="Regex Extractor")
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
from tools.regex_extractor import RegexExtractor
|
|
96
|
+
if hasattr(self.main_app, 'regex_extractor') and self.main_app.regex_extractor:
|
|
97
|
+
tool_settings = self.main_app.settings["tool_settings"].get("Regex Extractor", {
|
|
98
|
+
"pattern": "",
|
|
99
|
+
"match_mode": "all_per_line",
|
|
100
|
+
"omit_duplicates": False,
|
|
101
|
+
"hide_counts": True,
|
|
102
|
+
"sort_results": False,
|
|
103
|
+
"case_sensitive": False
|
|
104
|
+
})
|
|
105
|
+
# Create settings manager adapter for pattern library access
|
|
106
|
+
# PromeraAISettingsManager is defined in pomera.py
|
|
107
|
+
# Access it through the main_app's module
|
|
108
|
+
import sys
|
|
109
|
+
main_module = sys.modules.get(self.main_app.__class__.__module__)
|
|
110
|
+
if main_module and hasattr(main_module, 'PromeraAISettingsManager'):
|
|
111
|
+
PromeraAISettingsManager = main_module.PromeraAISettingsManager
|
|
112
|
+
settings_manager = PromeraAISettingsManager(self.main_app)
|
|
113
|
+
else:
|
|
114
|
+
settings_manager = None
|
|
115
|
+
self.regex_extractor_ui = self.main_app.regex_extractor.create_ui(
|
|
116
|
+
tab_frame,
|
|
117
|
+
tool_settings,
|
|
118
|
+
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
119
|
+
apply_tool_callback=self._regex_extractor_apply,
|
|
120
|
+
settings_manager=settings_manager
|
|
121
|
+
)
|
|
122
|
+
else:
|
|
123
|
+
ttk.Label(tab_frame, text="Regex Extractor module not available").pack(padx=10, pady=10)
|
|
124
|
+
except ImportError:
|
|
125
|
+
ttk.Label(tab_frame, text="Regex Extractor module not available").pack(padx=10, pady=10)
|
|
126
|
+
|
|
127
|
+
def _regex_extractor_apply(self):
|
|
128
|
+
"""Apply Regex Extractor tool."""
|
|
129
|
+
if hasattr(self.main_app, 'regex_extractor') and self.main_app.regex_extractor:
|
|
130
|
+
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
131
|
+
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
132
|
+
|
|
133
|
+
if not input_text.strip():
|
|
134
|
+
return
|
|
135
|
+
|
|
136
|
+
# Get current settings from the UI widget, not from saved settings
|
|
137
|
+
if hasattr(self, 'regex_extractor_ui') and self.regex_extractor_ui:
|
|
138
|
+
settings = self.regex_extractor_ui.get_current_settings()
|
|
139
|
+
else:
|
|
140
|
+
# Fallback to saved settings if UI not available
|
|
141
|
+
settings = self.main_app.settings["tool_settings"].get("Regex Extractor", {})
|
|
142
|
+
|
|
143
|
+
result = self.main_app.regex_extractor.process_text(input_text, settings)
|
|
144
|
+
|
|
145
|
+
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
146
|
+
active_output_tab.text.config(state="normal")
|
|
147
|
+
active_output_tab.text.delete("1.0", tk.END)
|
|
148
|
+
active_output_tab.text.insert("1.0", result)
|
|
149
|
+
active_output_tab.text.config(state="disabled")
|
|
150
|
+
|
|
151
|
+
self.main_app.update_all_stats()
|
|
152
|
+
|
|
153
|
+
def _email_extraction_apply(self):
|
|
154
|
+
"""Apply Email Extraction Tool."""
|
|
155
|
+
if hasattr(self.main_app, 'email_extraction_tool') and self.main_app.email_extraction_tool:
|
|
156
|
+
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
157
|
+
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
158
|
+
|
|
159
|
+
if not input_text.strip():
|
|
160
|
+
return
|
|
161
|
+
|
|
162
|
+
# Get current settings from the UI widget, not from saved settings
|
|
163
|
+
if hasattr(self, 'email_extraction_ui') and self.email_extraction_ui:
|
|
164
|
+
settings = self.email_extraction_ui.get_current_settings()
|
|
165
|
+
else:
|
|
166
|
+
# Fallback to saved settings if UI not available
|
|
167
|
+
settings = self.main_app.settings["tool_settings"].get("Email Extraction Tool", {})
|
|
168
|
+
|
|
169
|
+
result = self.main_app.email_extraction_tool.process_text(input_text, settings)
|
|
170
|
+
|
|
171
|
+
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
172
|
+
active_output_tab.text.config(state="normal")
|
|
173
|
+
active_output_tab.text.delete("1.0", tk.END)
|
|
174
|
+
active_output_tab.text.insert("1.0", result)
|
|
175
|
+
active_output_tab.text.config(state="disabled")
|
|
176
|
+
|
|
177
|
+
self.main_app.update_all_stats()
|
|
178
|
+
|
|
179
|
+
def _url_link_extractor_apply(self):
|
|
180
|
+
"""Apply URL and Link Extractor tool."""
|
|
181
|
+
if hasattr(self.main_app, 'url_link_extractor') and self.main_app.url_link_extractor:
|
|
182
|
+
active_input_tab = self.main_app.input_tabs[self.main_app.input_notebook.index(self.main_app.input_notebook.select())]
|
|
183
|
+
input_text = active_input_tab.text.get("1.0", tk.END).rstrip('\n')
|
|
184
|
+
|
|
185
|
+
if not input_text.strip():
|
|
186
|
+
return
|
|
187
|
+
|
|
188
|
+
# Get current settings from the UI widget, not from saved settings
|
|
189
|
+
if hasattr(self, 'url_link_extractor_ui') and self.url_link_extractor_ui:
|
|
190
|
+
settings = self.url_link_extractor_ui.get_current_settings()
|
|
191
|
+
else:
|
|
192
|
+
# Fallback to saved settings if UI not available
|
|
193
|
+
settings = self.main_app.settings["tool_settings"].get("URL and Link Extractor", {})
|
|
194
|
+
|
|
195
|
+
result = self.main_app.url_link_extractor.process_text(input_text, settings)
|
|
196
|
+
|
|
197
|
+
active_output_tab = self.main_app.output_tabs[self.main_app.output_notebook.index(self.main_app.output_notebook.select())]
|
|
198
|
+
active_output_tab.text.config(state="normal")
|
|
199
|
+
active_output_tab.text.delete("1.0", tk.END)
|
|
200
|
+
active_output_tab.text.insert("1.0", result)
|
|
201
|
+
active_output_tab.text.config(state="disabled")
|
|
202
|
+
|
|
203
|
+
self.main_app.update_all_stats()
|
|
204
|
+
|
|
205
|
+
def create_url_link_extractor_tab(self):
|
|
206
|
+
"""Create the URL and Link Extractor tab."""
|
|
207
|
+
tab_frame = ttk.Frame(self.notebook)
|
|
208
|
+
self.notebook.add(tab_frame, text="URL and Link Extractor")
|
|
209
|
+
|
|
210
|
+
try:
|
|
211
|
+
from tools.url_link_extractor import URLLinkExtractor
|
|
212
|
+
if hasattr(self.main_app, 'url_link_extractor') and self.main_app.url_link_extractor:
|
|
213
|
+
tool_settings = self.main_app.settings["tool_settings"].get("URL and Link Extractor", {
|
|
214
|
+
"extract_href": False,
|
|
215
|
+
"extract_https": False,
|
|
216
|
+
"extract_any_protocol": False,
|
|
217
|
+
"extract_markdown": False,
|
|
218
|
+
"filter_text": ""
|
|
219
|
+
})
|
|
220
|
+
self.url_link_extractor_ui = self.main_app.url_link_extractor.create_ui(
|
|
221
|
+
tab_frame,
|
|
222
|
+
tool_settings,
|
|
223
|
+
on_setting_change_callback=self.main_app.on_tool_setting_change,
|
|
224
|
+
apply_tool_callback=self._url_link_extractor_apply
|
|
225
|
+
)
|
|
226
|
+
else:
|
|
227
|
+
ttk.Label(tab_frame, text="URL and Link Extractor module not available").pack(padx=10, pady=10)
|
|
228
|
+
except ImportError:
|
|
229
|
+
ttk.Label(tab_frame, text="URL and Link Extractor module not available").pack(padx=10, pady=10)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class ExtractionTools:
|
|
233
|
+
"""Main class for Extraction Tools integration."""
|
|
234
|
+
|
|
235
|
+
def __init__(self):
|
|
236
|
+
pass
|
|
237
|
+
|
|
238
|
+
def create_widget(self, parent, main_app):
|
|
239
|
+
"""Create and return the Extraction Tools widget."""
|
|
240
|
+
widget = ExtractionToolsWidget(main_app)
|
|
241
|
+
return widget.create_widget(parent)
|
|
242
|
+
|
|
243
|
+
def get_default_settings(self):
|
|
244
|
+
"""Return default settings for all extraction tools."""
|
|
245
|
+
return {
|
|
246
|
+
"Email Extraction Tool": {"omit_duplicates": False, "hide_counts": True, "sort_emails": False, "only_domain": False},
|
|
247
|
+
"HTML Extraction Tool": {},
|
|
248
|
+
"Regex Extractor": {"pattern": "", "match_mode": "all_per_line", "omit_duplicates": False, "hide_counts": True, "sort_results": False, "case_sensitive": False},
|
|
249
|
+
"URL and Link Extractor": {"extract_href": False, "extract_https": False, "extract_any_protocol": False, "extract_markdown": False, "filter_text": ""}
|
|
250
|
+
}
|