__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
# Orca # # Copyright 2024 Igalia, S.L. # Copyright 2024 GNOME Foundation Inc. # Author: Joanmarie Diggs <[email protected]> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., Franklin Street, Fifth Floor, # Boston MA 02110-1301 USA. # pylint: disable=broad-exception-caught # pylint: disable=wrong-import-position # pylint: disable=duplicate-code """Utilities for obtaining document-related information about accessible objects.""" __id__ = "$Id$" __version__ = "$Revision$" __date__ = "$Date$" __copyright__ = "Copyright (c) 2024 Igalia, S.L." \ "Copyright (c) 2024 GNOME Foundation Inc." __license__ = "LGPL" import threading import time import urllib.parse import gi gi.require_version("Atspi", "2.0") from gi.repository import Atspi from . import debug from . import messages from .ax_collection import AXCollection from .ax_object import AXObject from .ax_table import AXTable from .ax_utilities_role import AXUtilitiesRole from .ax_utilities_state import AXUtilitiesState class AXDocument: """Utilities for obtaining document-related information about accessible objects.""" LAST_KNOWN_PAGE: dict[int, int] = {} _lock = threading.Lock() @staticmethod def _clear_stored_data() -> None: """Clears any data we have cached for objects""" while True: time.sleep(60) msg = "AXDocument: Clearing local cache." debug.print_message(debug.LEVEL_INFO, msg, True) AXDocument.LAST_KNOWN_PAGE.clear() @staticmethod def start_cache_clearing_thread() -> None: """Starts thread to periodically clear cached details.""" thread = threading.Thread(target=AXDocument._clear_stored_data) thread.daemon = True thread.start() @staticmethod def did_page_change(document: Atspi.Accessible) -> bool: """Returns True if the current page changed.""" if not AXObject.supports_document(document): return False old_page = AXDocument.LAST_KNOWN_PAGE.get(hash(document)) result = old_page != AXDocument._get_current_page(document) if result: tokens = ["AXDocument: Previous page of", document, f"was {old_page}"] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return result @staticmethod def _get_current_page(document: Atspi.Accessible) -> int: """Returns the current page of document.""" if not AXObject.supports_document(document): return 0 try: page = Atspi.Document.get_current_page_number(document) except Exception as error: msg = f"AXDocument: Exception in _get_current_page: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) return 0 tokens = ["AXDocument: Current page of", document, f"is {page}"] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return page @staticmethod def get_current_page(document: Atspi.Accessible) -> int: """Returns the current page of document.""" if not AXObject.supports_document(document): return 0 page = AXDocument._get_current_page(document) AXDocument.LAST_KNOWN_PAGE[hash(document)] = page return page @staticmethod def get_page_count(document: Atspi.Accessible) -> int: """Returns the page count of document.""" if not AXObject.supports_document(document): return 0 try: count = Atspi.Document.get_page_count(document) except Exception as error: msg = f"AXDocument: Exception in get_page_count: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) return 0 tokens = ["AXDocument: Page count of", document, f"is {count}"] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return count @staticmethod def get_locale(document: Atspi.Accessible) -> str: """Returns the locale of document.""" if not AXObject.supports_document(document): return "" try: result = Atspi.Document.get_locale(document) except Exception as error: msg = f"AXDocument: Exception in get_locale: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) return "" tokens = ["AXDocument: Locale of", document, f"is '{result}'"] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return result @staticmethod def _get_attributes_dict(document: Atspi.Accessible) -> dict[str, str]: """Returns a dict with the document-attributes of document.""" if not AXObject.supports_document(document): return {} try: result = Atspi.Document.get_document_attributes(document) except Exception as error: msg = f"AXDocument: Exception in _get_attributes_dict: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) return {} tokens = ["AXDocument: Attributes of", document, "are:", result] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return result @staticmethod def get_uri(document: Atspi.Accessible) -> str: """Returns the uri of document.""" if not AXObject.supports_document(document): return "" attributes = AXDocument._get_attributes_dict(document) return attributes.get("DocURL", attributes.get("URI", "")) @staticmethod def get_mime_type(document: Atspi.Accessible) -> str: """Returns the uri of document.""" if not AXObject.supports_document(document): return "" attributes = AXDocument._get_attributes_dict(document) return attributes.get("MimeType", "") @staticmethod def is_plain_text(document: Atspi.Accessible) -> bool: """Returns True if document is a plain-text document.""" return AXDocument.get_mime_type(document) == "text/plain" @staticmethod def is_pdf(document: Atspi.Accessible) -> bool: """Returns True if document is a PDF document.""" mime_type = AXDocument.get_mime_type(document) if mime_type == "application/pdf": return True if mime_type == "text/html": return AXDocument.get_uri(document).endswith(".pdf") return False @staticmethod def get_document_uri_fragment(document: Atspi.Accessible) -> str: """Returns the fragment portion of document's uri.""" result = urllib.parse.urlparse(AXDocument.get_uri(document)) return result.fragment @staticmethod def _get_object_counts(document: Atspi.Accessible) -> dict[str, int]: """Returns a dictionary of object counts used in a document summary.""" result = {"forms": 0, "landmarks": 0, "headings": 0, "tables": 0, "unvisited_links": 0, "visited_links": 0} roles = [Atspi.Role.HEADING, Atspi.Role.LINK, Atspi.Role.TABLE, Atspi.Role.FORM, Atspi.Role.LANDMARK] rule = AXCollection.create_match_rule(roles=roles) matches = AXCollection.get_all_matches(document, rule) for obj in matches: if AXUtilitiesRole.is_heading(obj): result["headings"] += 1 elif AXUtilitiesRole.is_form(obj): result["forms"] += 1 elif AXUtilitiesRole.is_table(obj) and not AXTable.is_layout_table(obj): result["tables"] += 1 elif AXUtilitiesRole.is_link(obj): if AXUtilitiesState.is_visited(obj): result["visited_links"] += 1 else: result["unvisited_links"] += 1 elif AXUtilitiesRole.is_landmark(obj): result["landmarks"] += 1 return result @staticmethod def get_document_summary(document: Atspi.Accessible, only_if_found: bool = True) -> str: """Returns a string summarizing the document's structure and objects of interest.""" result = [] counts = AXDocument._get_object_counts(document) result.append(messages.landmarkCount(counts.get("landmarks", 0), only_if_found)) result.append(messages.headingCount(counts.get("headings", 0), only_if_found)) result.append(messages.formCount(counts.get("forms", 0), only_if_found)) result.append(messages.tableCount(counts.get("tables", 0), only_if_found)) result.append(messages.visitedLinkCount(counts.get("visited_links", 0), only_if_found)) result.append(messages.unvisitedLinkCount(counts.get("unvisited_links", 0), only_if_found)) result = list(filter(lambda x: x, result)) if not result: return "" return messages.PAGE_SUMMARY_PREFIX % ", ".join(result)
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| backends | Folder | 0755 |
|
|
| scripts | Folder | 0755 |
|
|
| __init__.py | File | 115 B | 0644 |
|
| acss.py | File | 3.85 KB | 0644 |
|
| action_presenter.py | File | 8.65 KB | 0644 |
|
| ax_collection.py | File | 6.16 KB | 0644 |
|
| ax_component.py | File | 14.93 KB | 0644 |
|
| ax_document.py | File | 9.36 KB | 0644 |
|
| ax_event_synthesizer.py | File | 17.39 KB | 0644 |
|
| ax_hypertext.py | File | 8.36 KB | 0644 |
|
| ax_object.py | File | 47.84 KB | 0644 |
|
| ax_selection.py | File | 4.54 KB | 0644 |
|
| ax_table.py | File | 47.98 KB | 0644 |
|
| ax_text.py | File | 45.13 KB | 0644 |
|
| ax_utilities.py | File | 28.24 KB | 0644 |
|
| ax_utilities_application.py | File | 7.17 KB | 0644 |
|
| ax_utilities_collection.py | File | 86.79 KB | 0644 |
|
| ax_utilities_debugging.py | File | 10.12 KB | 0644 |
|
| ax_utilities_event.py | File | 32.78 KB | 0644 |
|
| ax_utilities_relation.py | File | 15.2 KB | 0644 |
|
| ax_utilities_role.py | File | 91.79 KB | 0644 |
|
| ax_utilities_state.py | File | 11.63 KB | 0644 |
|
| ax_value.py | File | 6.83 KB | 0644 |
|
| bookmarks.py | File | 11.95 KB | 0644 |
|
| braille.py | File | 74.03 KB | 0644 |
|
| braille_generator.py | File | 55.79 KB | 0644 |
|
| braille_rolenames.py | File | 10.23 KB | 0644 |
|
| brlmon.py | File | 6.53 KB | 0644 |
|
| brltablenames.py | File | 7.3 KB | 0644 |
|
| bypass_mode_manager.py | File | 4.79 KB | 0644 |
|
| caret_navigation.py | File | 19.51 KB | 0644 |
|
| chat.py | File | 32.03 KB | 0644 |
|
| clipboard.py | File | 20.45 KB | 0644 |
|
| cmdnames.py | File | 61.77 KB | 0644 |
|
| colornames.py | File | 39.22 KB | 0644 |
|
| debug.py | File | 3.95 KB | 0644 |
|
| debugging_tools_manager.py | File | 10.69 KB | 0644 |
|
| event_manager.py | File | 36.07 KB | 0644 |
|
| flat_review.py | File | 48.89 KB | 0644 |
|
| flat_review_finder.py | File | 20.2 KB | 0644 |
|
| flat_review_presenter.py | File | 45.94 KB | 0644 |
|
| focus_manager.py | File | 11.52 KB | 0644 |
|
| generator.py | File | 67.07 KB | 0644 |
|
| guilabels.py | File | 56.38 KB | 0644 |
|
| highlighter.py | File | 6.95 KB | 0644 |
|
| input_event.py | File | 30.05 KB | 0644 |
|
| input_event_manager.py | File | 35.66 KB | 0644 |
|
| keybindings.py | File | 24.87 KB | 0644 |
|
| keynames.py | File | 9.55 KB | 0644 |
|
| label_inference.py | File | 19.77 KB | 0644 |
|
| learn_mode_presenter.py | File | 14.72 KB | 0644 |
|
| liveregions.py | File | 25.77 KB | 0644 |
|
| mathsymbols.py | File | 88.65 KB | 0644 |
|
| messages.py | File | 152.28 KB | 0644 |
|
| mouse_review.py | File | 23.34 KB | 0644 |
|
| notification_presenter.py | File | 14.17 KB | 0644 |
|
| object_navigator.py | File | 13.24 KB | 0644 |
|
| object_properties.py | File | 33.86 KB | 0644 |
|
| orca.py | File | 9.83 KB | 0644 |
|
| orca_gtkbuilder.py | File | 5.42 KB | 0644 |
|
| orca_gui_navlist.py | File | 6.51 KB | 0644 |
|
| orca_gui_prefs.py | File | 141.9 KB | 0644 |
|
| orca_gui_profile.py | File | 3.98 KB | 0644 |
|
| orca_i18n.py | File | 3.13 KB | 0644 |
|
| orca_modifier_manager.py | File | 13.76 KB | 0644 |
|
| orca_platform.py | File | 1.43 KB | 0644 |
|
| phonnames.py | File | 2.76 KB | 0644 |
|
| pronunciation_dict.py | File | 2.55 KB | 0644 |
|
| script.py | File | 11.11 KB | 0644 |
|
| script_manager.py | File | 14.68 KB | 0644 |
|
| script_utilities.py | File | 64.21 KB | 0644 |
|
| settings.py | File | 10.66 KB | 0644 |
|
| settings_manager.py | File | 27.13 KB | 0644 |
|
| sleep_mode_manager.py | File | 5.04 KB | 0644 |
|
| sound.py | File | 5.51 KB | 0644 |
|
| sound_generator.py | File | 48.88 KB | 0644 |
|
| speech.py | File | 8.87 KB | 0644 |
|
| speech_and_verbosity_manager.py | File | 27.71 KB | 0644 |
|
| speech_generator.py | File | 163.53 KB | 0644 |
|
| speechdispatcherfactory.py | File | 24.68 KB | 0644 |
|
| speechserver.py | File | 8 KB | 0644 |
|
| spellcheck.py | File | 18.11 KB | 0644 |
|
| spiel.py | File | 25.59 KB | 0644 |
|
| ssml.py | File | 6.71 KB | 0644 |
|
| structural_navigation.py | File | 77.63 KB | 0644 |
|
| system_information_presenter.py | File | 7.44 KB | 0644 |
|
| table_navigator.py | File | 29.78 KB | 0644 |
|
| text_attribute_names.py | File | 27.31 KB | 0644 |
|
| where_am_i_presenter.py | File | 21.59 KB | 0644 |
|