%PDF- %PDF-
| Direktori : /usr/lib/python3/dist-packages/orca/ |
| Current File : //usr/lib/python3/dist-packages/orca/formatting.py |
# Orca
#
# Copyright 2004-2009 Sun Microsystems Inc.
#
# 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.
"""Manages the formatting settings for Orca."""
__id__ = "$Id:$"
__version__ = "$Revision:$"
__date__ = "$Date:$"
__copyright__ = "Copyright (c) 2004-2009 Sun Microsystems Inc."
__license__ = "LGPL"
# If we were to adhere to the line-length requirements of 100 characters,
# this file would be even more cumbersome to look at than it already is.
# We shall respect the line-length requirements for all files that are not
# formatting.py.
# ruff: noqa: E501
import copy
import gi
gi.require_version("Atspi", "2.0")
from gi.repository import Atspi
from . import object_properties
TUTORIAL = '(tutorial and (pause + tutorial) or [])'
MNEMONIC = '(mnemonic and (pause + mnemonic + lineBreak) or [])'
BRAILLE_TEXT = '[Text(obj, asString(labelOrName or placeholderText), asString(eol), startOffset, endOffset)]\
+ (invalid and [Region(" " + asString(invalid))])\
+ (required and [Region(" " + asString(required))])\
+ (readOnly and [Region(" " + asString(readOnly))])'
formatting = {
####################################################################
# #
# Strings Orca includes on its own (versus getting them from the #
# application. #
# #
####################################################################
'strings' : {
'speech': {
'invalid': object_properties.INVALID_INDICATORS_SPEECH,
'required': object_properties.STATE_REQUIRED_SPEECH,
'readonly': object_properties.STATE_READ_ONLY_SPEECH,
'insensitive': object_properties.STATE_INSENSITIVE_SPEECH,
'checkbox': object_properties.CHECK_BOX_INDICATORS_SPEECH,
'radiobutton': object_properties.RADIO_BUTTON_INDICATORS_SPEECH,
'switch': object_properties.SWITCH_INDICATORS_SPEECH,
'togglebutton': object_properties.TOGGLE_BUTTON_INDICATORS_SPEECH,
'expansion': object_properties.EXPANSION_INDICATORS_SPEECH,
'nodelevel': object_properties.NODE_LEVEL_SPEECH,
'nestinglevel': object_properties.NESTING_LEVEL_SPEECH,
'multiselect': object_properties.STATE_MULTISELECT_SPEECH,
'iconindex': object_properties.ICON_INDEX_SPEECH,
'groupindex': object_properties.GROUP_INDEX_SPEECH,
'groupindextotalunknown':object_properties.GROUP_INDEX_TOTAL_UNKNOWN_SPEECH,
'clickable': object_properties.STATE_CLICKABLE,
'haslongdesc': object_properties.STATE_HAS_LONGDESC,
'hasdetails': object_properties.RELATION_HAS_DETAILS,
'detailsfor': object_properties.RELATION_DETAILS_FOR
},
'braille': {
'eol': object_properties.EOL_INDICATOR_BRAILLE,
'required': object_properties.STATE_REQUIRED_BRAILLE,
'readonly': object_properties.STATE_READ_ONLY_BRAILLE,
'insensitive': object_properties.STATE_INSENSITIVE_BRAILLE,
'invalid': object_properties.INVALID_INDICATORS_BRAILLE,
'checkbox': object_properties.CHECK_BOX_INDICATORS_BRAILLE,
'radiobutton': object_properties.RADIO_BUTTON_INDICATORS_BRAILLE,
'switch': object_properties.SWITCH_INDICATORS_BRAILLE,
'togglebutton': object_properties.TOGGLE_BUTTON_INDICATORS_BRAILLE,
'expansion': object_properties.EXPANSION_INDICATORS_BRAILLE,
'nodelevel': object_properties.NODE_LEVEL_BRAILLE,
'nestinglevel': object_properties.NESTING_LEVEL_BRAILLE,
},
'sound': {
'invalid': object_properties.INVALID_INDICATORS_SOUND,
'required': object_properties.STATE_REQUIRED_SOUND,
'readonly': object_properties.STATE_READ_ONLY_SOUND,
'insensitive': object_properties.STATE_INSENSITIVE_SOUND,
'checkbox': object_properties.CHECK_BOX_INDICATORS_SOUND,
'radiobutton': object_properties.RADIO_BUTTON_INDICATORS_SOUND,
'switch': object_properties.SWITCH_INDICATORS_SOUND,
'togglebutton': object_properties.TOGGLE_BUTTON_INDICATORS_SOUND,
'expansion': object_properties.EXPANSION_INDICATORS_SOUND,
'multiselect': object_properties.STATE_MULTISELECT_SOUND,
'clickable': object_properties.STATE_CLICKABLE_SOUND,
'haslongdesc': object_properties.STATE_HAS_LONGDESC_SOUND,
'visited': object_properties.STATE_VISITED_SOUND,
},
},
####################################################################
# #
# Formatting for speech. #
# #
####################################################################
'speech': {
'prefix': {
'ancestor': '[]',
'focused': 'detailsFor',
'unfocused': 'oldAncestors + newAncestors',
'basicWhereAmI': 'toolbar',
'detailedWhereAmI' : '[]'
},
'suffix': {
'ancestor': '[]',
'focused': '[]',
'unfocused': 'newNodeLevel + unselectedCell + clickable + pause + hasLongDesc + hasDetails + detailsFor +' + TUTORIAL + ' + description + pause + hasPopup',
'basicWhereAmI': TUTORIAL + ' + clickable + hasLongDesc + description + pause + hasPopup + pause + detailsFor + pause + allDetails',
'detailedWhereAmI': TUTORIAL + ' + clickable + hasLongDesc + description + pause + hasPopup + detailsFor + pause + allDetails'
},
'default': {
'ancestor': '[]',
'focused': '[]',
'unfocused': 'labelOrName + roleName + availability + ' + MNEMONIC + ' + accelerator + childWidget',
'basicWhereAmI': 'labelOrName + roleName',
'detailedWhereAmI' : 'pageSummary'
},
Atspi.Role.ALERT: {
'unfocused': 'roleName + labelOrName + pause + alertText'
},
Atspi.Role.ANIMATION: {
'unfocused': 'labelAndName'
},
Atspi.Role.ARTICLE: {
'focused': 'labelOrName + roleName',
'unfocused': 'labelOrName + roleName + pause + currentLineText + allTextSelection',
},
'ROLE_ARTICLE_IN_FEED' : {
'unfocused': '(labelOrName or currentLineText or roleName) + pause + positionInList',
},
Atspi.Role.BLOCK_QUOTE: {
'focused' : 'leaving or (roleName + pause + nestingLevel)',
'unfocused': 'roleName + pause + nestingLevel + pause + displayedText',
},
Atspi.Role.CANVAS: {
'focused': 'labelAndName + (imageDescription or roleName) + pause + positionInList',
'unfocused': 'labelAndName + (imageDescription or roleName) + pause + positionInList',
'basicWhereAmI': 'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause',
'detailedWhereAmI': 'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause + selectedItems + pause'
},
Atspi.Role.CAPTION: {
'unfocused': '((substring and currentLineText) or labelAndName) + roleName'
},
Atspi.Role.CHECK_BOX: {
'focused': 'checkedState',
'unfocused': 'labelOrName + readOnly + roleName + checkedState + required + pause + invalid + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'namedContainingPanel + labelOrName + readOnly + roleName + checkedState + ' + MNEMONIC + ' + accelerator + required + pause + invalid'
},
Atspi.Role.CHECK_MENU_ITEM: {
'focused': 'checkedState',
'unfocused': 'labelOrName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList',
'basicWhereAmI': 'ancestors + pause + labelOrName + roleName + checkedState + pause + accelerator + pause + positionInList + ' + MNEMONIC
},
Atspi.Role.COLOR_CHOOSER: {
'focused': 'value',
'unfocused': 'label + roleName + value + required + availability + ' + MNEMONIC,
'basicWhereAmI': 'label + roleName + value + percentage + ' + MNEMONIC + ' + accelerator + required'
},
Atspi.Role.COLUMN_HEADER: {
'focused': 'labelAndName + roleName + pause + sortOrder + pause + newRow + pause + newColumn',
'unfocused': '((substring and currentLineText) or labelAndName) + roleName + pause + sortOrder + pause + newRow + pause + newColumn'
},
Atspi.Role.COMBO_BOX: {
'focused': 'labelOrName + roleName + expandableState',
'unfocused': 'labelOrName + roleName + pause + value + pause + positionInList + ' + MNEMONIC + ' + accelerator',
},
Atspi.Role.COMMENT: {
'focused': 'labelOrName + roleName',
'unfocused': 'labelOrName + roleName + pause + currentLineText + allTextSelection',
},
# TODO - JD: When we bump dependencies to 2.34, remove this fake role and use the real one.
'ROLE_CONTENT_DELETION': {
'focused': 'leaving or deletionStart',
'unfocused': 'deletionStart + pause + displayedText + pause + deletionEnd',
},
'ROLE_CONTENT_ERROR': {
'unfocused': 'displayedText + pause + invalid',
},
# TODO - JD: When we bump dependencies to 2.34, remove this fake role and use the real one.
'ROLE_CONTENT_INSERTION': {
'focused': 'leaving or insertionStart',
'unfocused': 'insertionStart + pause + displayedText + pause + insertionEnd',
},
# TODO - JD: When we bump dependencies to 2.36, remove this fake role and use the real one.
'ROLE_CONTENT_MARK': {
'focused': 'leaving or markStart',
'unfocused': 'markStart + pause + displayedText + pause + markEnd',
},
# TODO - JD: When we bump dependencies to 2.36, remove this fake role and use the real one.
'ROLE_CONTENT_SUGGESTION': {
'focused': 'leaving or roleName',
},
Atspi.Role.DESCRIPTION_LIST: {
'focused' : 'leaving or (labelOrName + pause + (numberOfChildren or roleName) + pause + nestingLevel)',
'unfocused': 'labelOrName + pause + focusedItem + pause + multiselectableState + (numberOfChildren or roleName) + pause'
},
Atspi.Role.DESCRIPTION_TERM: {
'unfocused': '(labelOrName or (displayedText + allTextSelection)) + roleName + pause + termValueCount + pause + positionInList',
},
Atspi.Role.DESCRIPTION_VALUE: {
'unfocused': '(labelOrName or (displayedText + allTextSelection)) + roleName + pause + positionInList',
},
Atspi.Role.DIAL: {
'focused': 'value',
'unfocused': 'labelOrName + roleName + value + required + availability + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + roleName + value + percentage + ' + MNEMONIC + ' + accelerator + required'
},
Atspi.Role.DIALOG: {
'focused': 'labelOrName + roleName + (unrelatedLabelsOrDescription)',
'unfocused': '(expandedEOCs or (labelOrName + roleName + (unrelatedLabelsOrDescription)))'
},
Atspi.Role.DOCUMENT_FRAME: {
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + anyTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'labelOrName + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.DOCUMENT_WEB: {
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + anyTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'labelorName + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
'ROLE_DPUB_LANDMARK': {
'focused': 'leaving or labelOrName',
'unfocused': 'labelOrName + currentLineText + allTextSelection'
},
'ROLE_DPUB_SECTION': {
'focused': 'leaving or (labelOrName + roleName)',
'unfocused': 'labelOrName + currentLineText + allTextSelection'
},
Atspi.Role.EMBEDDED: {
'focused': 'labelOrName + roleName + availability',
'unfocused': '(expandedEOCs or (labelOrName + unrelatedLabels)) + roleName + availability'
},
Atspi.Role.ENTRY: {
'focused': 'labelOrName + readOnly + textRole + (currentLineText or placeholderText) + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + (currentLineText or placeholderText) + allTextSelection + required + pause + invalid + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + readOnly + textRole + (textContent or placeholderText) + anyTextSelection + required + pause + invalid + ' + MNEMONIC,
'detailedWhereAmI': 'labelOrName + readOnly + textRole + (textContentWithAttributes or placeholderText) + anyTextSelection + required + pause + invalid + ' + MNEMONIC,
},
'ROLE_FEED': {
'focused': 'leaving or (labelOrName + pause + (numberOfChildren or roleName))',
'unfocused': 'labelOrName + pause + (numberOfChildren or roleName)',
},
Atspi.Role.FOOTNOTE: {
'unfocused': 'labelOrName + roleName + pause + currentLineText + allTextSelection',
},
Atspi.Role.FOOTER: {
'unfocused': '(displayedText or name) + roleName',
},
Atspi.Role.FORM: {
'focused': 'leaving or (labelAndName + roleName)',
'unfocused': '((substring and currentLineText) or labelAndName) + roleName'
},
Atspi.Role.FRAME: {
'focused': 'labelOrName',
'unfocused': 'labelOrName + roleName + unfocusedDialogCount + availability'
},
Atspi.Role.HEADER: {
'unfocused': '(displayedText or name) + roleName',
},
Atspi.Role.HEADING: {
'focused': 'displayedText + roleName + expandableState',
'unfocused': 'displayedText + roleName + expandableState',
'basicWhereAmI': 'label + readOnly + textRole + pause + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + pause + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.ICON: {
'focused': 'labelAndName + (imageDescription or roleName) + pause + positionInList',
'unfocused': 'labelAndName + (imageDescription or roleName) + pause + positionInList',
'basicWhereAmI': 'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause',
'detailedWhereAmI': 'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause + selectedItems + pause'
},
Atspi.Role.IMAGE: {
'unfocused': 'labelAndName + roleName'
},
Atspi.Role.INFO_BAR: {
'unfocused': 'labelAndName + unrelatedLabels'
},
Atspi.Role.INTERNAL_FRAME: {
'unfocused': 'labelAndName + roleName'
},
Atspi.Role.LABEL: {
'unfocused': 'label + ((displayedText + allTextSelection) or name) + roleName',
},
Atspi.Role.LANDMARK: {
'focused': 'leaving or (roleName + labelAndName)',
'unfocused': 'roleName + (labelAndName or (substring and currentLineText)) + pause + unrelatedLabels'
},
Atspi.Role.LAYERED_PANE: {
'focused': '(labelAndName or roleName) + availability + noShowingChildren',
'unfocused': '(labelAndName or roleName) + availability + noShowingChildren',
'basicWhereAmI': '(labelAndName or roleName) + pause + selectedItemCount + pause',
'detailedWhereAmI': '(labelAndName or roleName) + pause + roleName + pause + selectedItemCount + pause + selectedItems + pause'
},
Atspi.Role.LINK: {
'unfocused': '(name or displayedText) + roleName + pause + expandableState + availability + ' + MNEMONIC,
'basicWhereAmI': 'linkInfo + pause + siteDescription + pause + fileSize + pause + ' + MNEMONIC
},
Atspi.Role.LIST: {
'focused' : 'leaving or (labelOrName + pause + (numberOfChildren or roleName) + pause + nestingLevel)',
'unfocused': 'labelOrName + pause + focusedItem + pause + multiselectableState + (numberOfChildren or roleName) + pause'
},
Atspi.Role.LIST_BOX: {
'focused': 'labelOrName + multiselectableState + (numberOfChildren or roleName)',
'unfocused': 'labelOrName + pause + focusedItem + pause + multiselectableState + (numberOfChildren or roleName) + pause'
},
Atspi.Role.LIST_ITEM: {
'focused': 'checkedStateIfCheckable + pause + expandableState',
'unfocused': '(labelOrName or (displayedText + allTextSelection)) + checkedStateIfCheckable + pause + unselectedStateIfSelectable + pause + expandableState + pause + positionInList + pause + listBoxItemWidgets',
'basicWhereAmI': 'label + roleName + pause + (name or displayedText) + checkedStateIfCheckable + pause + unselectedStateIfSelectable + pause + positionInList + pause + expandableState + (nodeLevel or nestingLevel) + pause'
},
Atspi.Role.MATH: {
'unfocused': 'math',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_ENCLOSED': {
'unfocused': 'enclosedBase + enclosedEnclosures',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_FENCED': {
'unfocused': 'fencedStart + pause + fencedContents + pause + fencedEnd',
},
Atspi.Role.MATH_FRACTION: {
'unfocused': 'fractionStart + pause + fractionNumerator + fractionLine + fractionDenominator + pause + fractionEnd + pause',
},
Atspi.Role.MATH_ROOT: {
'unfocused': 'rootStart + rootBase + pause + rootEnd + pause',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_MULTISCRIPT': {
'unfocused': 'scriptBase + pause + scriptPrescripts + pause + scriptPostscripts + pause',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_SCRIPT_SUBSUPER': {
'unfocused': 'scriptBase + pause + scriptSubscript + pause + scriptSuperscript + pause',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_SCRIPT_UNDEROVER': {
'unfocused': 'scriptBase + pause + scriptUnderscript + pause + scriptOverscript + pause',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_TABLE': {
'unfocused': 'mathTableStart + pause + mathTableRows + pause + mathTableEnd + pause',
},
# TODO - JD: When we bump dependencies to TBD, remove this fake role and use the real one.
'ROLE_MATH_TABLE_ROW': {
'unfocused': 'mathRow',
},
Atspi.Role.MENU: {
'focused': 'labelOrName + roleName',
'unfocused': 'labelOrName + roleName + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList',
'basicWhereAmI': '(ancestors or parentRoleName) + pause + labelOrName + roleName + pause + positionInList + ' + MNEMONIC
},
Atspi.Role.MENU_ITEM: {
'focused': 'expandableState',
'unfocused': 'labelOrName + checkedStateIfCheckable + expandableState + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList',
'basicWhereAmI': 'ancestors + pause + labelOrName + checkedStateIfCheckable + pause + accelerator + pause + positionInList + ' + MNEMONIC
},
Atspi.Role.NOTIFICATION: {
'unfocused': 'roleName + labelOrName + pause + (expandedEOCs or unrelatedLabelsOrDescription)'
},
Atspi.Role.PAGE: {
'focused': 'label + readOnly + currentLineText + anyTextSelection',
'unfocused': 'label + readOnly + currentLineText + anyTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.PAGE_TAB: {
'focused': 'labelOrName + roleName + availability + pause + positionInList + ' + MNEMONIC + ' + accelerator',
'unfocused': 'labelOrName + roleName + availability + pause + positionInList + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'parentRoleName + pause + labelOrName + roleName + availability + pause + positionInList + ' + MNEMONIC + ' + accelerator'
},
Atspi.Role.PANEL: {
'focused': 'leaving or (labelAndName + roleName + availability + pause + unrelatedLabels)',
'unfocused': '((substring and currentLineText) or labelAndName) + roleName + availability + pause + unrelatedLabels'
},
Atspi.Role.PARAGRAPH: {
'focused': 'labelOrName + readOnly + textRole + textIndentation + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + textIndentation + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.PASSWORD_TEXT: {
'focused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.PROGRESS_BAR: {
'focused': 'progressBarIndex + (progressBarValue or roleName)',
'unfocused': 'progressBarIndex + labelAndName + (progressBarValue or roleName)'
},
Atspi.Role.PUSH_BUTTON: {
'focused': 'expandableState',
'unfocused': 'labelAndName + expandableState + roleName + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelAndName + expandableState + roleName + ' + MNEMONIC + ' + accelerator'
},
Atspi.Role.RADIO_BUTTON: {
'focused': 'radioState',
'unfocused': 'newRadioButtonGroup + pause + (name or label) + pause + radioState + roleName + availability + lineBreak + ' + MNEMONIC + ' + accelerator + pause + positionInList + pause',
'basicWhereAmI': 'radioButtonGroup + pause + (name or label) + roleName + pause + radioState + pause + positionInGroup + ' + MNEMONIC + ' + accelerator'
},
Atspi.Role.RADIO_MENU_ITEM: {
# OpenOffice check menu items currently have a role of "menu item"
# rather then "check menu item", so we need to test if one of the
# states is CHECKED. If it is, then add that in to the list of
# speech utterances. Note that we can't tell if this is a "check
# menu item" that is currently unchecked and speak that state.
# See Orca bug #433398 for more details.
#
'focused': 'labelOrName + radioState + roleName + availability + positionInList',
'unfocused': 'labelOrName + radioState + roleName + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': 'ancestors + labelOrName + roleName + radioState + accelerator + positionInList + ' + MNEMONIC
},
'ROLE_REGION': {
'focused': 'leaving or (roleName + labelOrName)',
'unfocused': 'labelOrName + roleName + currentLineText + allTextSelection'
},
Atspi.Role.ROW_HEADER: {
'focused': 'labelAndName + roleName + pause + sortOrder + pause + newRow + pause + newColumn',
'unfocused': '((substring and currentLineText) or labelAndName) + roleName + pause + sortOrder + pause + newRow + pause + newColumn'
},
Atspi.Role.SCROLL_BAR: {
'focused': 'value',
'unfocused': 'labelOrName + roleName + value + required + availability + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + roleName + value + percentage + ' + MNEMONIC + ' + accelerator + required'
},
Atspi.Role.SCROLL_PANE: {
'unfocused': '(currentLineText + allTextSelection) or (labelOrName + roleName)',
},
Atspi.Role.SECTION: {
'focused': '(labelOrName or (currentLineText + allTextSelection)) + roleName',
'unfocused': '(labelOrName or (currentLineText + allTextSelection)) + roleName + ' + MNEMONIC,
},
Atspi.Role.SLIDER: {
'focused': 'value',
'unfocused': 'labelOrName + roleName + value + required + pause + invalid + availability + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + roleName + value + percentage + ' + MNEMONIC + ' + accelerator + required + pause + invalid'
},
Atspi.Role.SPIN_BUTTON: {
'focused': '(displayedText or value)',
'unfocused': 'labelAndName + (displayedText or value) + roleName + required + pause + invalid + availability + ' + MNEMONIC,
'basicWhereAmI': 'label + roleName + name + (displayedText or value) + ' + MNEMONIC + ' + accelerator + required + pause + invalid'
},
Atspi.Role.SEPARATOR: {
'focused': 'roleName + availability',
'unfocused': 'roleName + availability + (labelOrName or displayedText or value) + ' + MNEMONIC,
},
Atspi.Role.SPLIT_PANE: {
'focused': 'value',
'unfocused': 'labelAndName + roleName + value + percentage + availability + ' + MNEMONIC,
'basicWhereAmI' : 'labelAndName + roleName + value + percentage'
},
Atspi.Role.STATIC: {
'unfocused': '(displayedText or name) + roleName',
},
Atspi.Role.STATUS_BAR: {
'focused': 'labelAndName + roleName',
'unfocused': 'labelAndName + roleName + pause + statusBar',
},
Atspi.Role.SUBSCRIPT: {
'unfocused': 'roleName + currentLineText + allTextSelection',
},
Atspi.Role.SUPERSCRIPT: {
'unfocused': 'roleName + currentLineText + allTextSelection',
},
'ROLE_SWITCH': {
'focused': 'switchState',
'unfocused': 'labelOrName + roleName + switchState + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelOrName + roleName + switchState'
},
Atspi.Role.TABLE: {
'focused': 'leaving or (labelAndName + pause + table)',
'unfocused': 'labelAndName + pause + table',
'basicWhereAmI': 'labelAndName + pause + table'
},
Atspi.Role.TABLE_CELL: {
'ancestor': 'newRowHeader + newColumnHeader + pause + newRow + pause + newColumn',
'focused': '((tableCell2ChildLabel + tableCell2ChildToggle) or cellCheckedState) + pause + (expandableState and (expandableState + pause + numberOfChildren + pause))',
'unfocused': 'tableCellRow + pause',
'basicWhereAmI': 'parentRoleName + pause + columnHeader + pause + rowHeader + pause + roleName + pause + tableCellRow + pause + columnAndRow',
'detailedWhereAmI': 'parentRoleName + pause + columnHeader + pause + rowHeader + pause + roleName + pause + cellCheckedState + pause + (realActiveDescendantDisplayedText or imageDescription + image) + pause + columnAndRow + pause + tableCellRow + pause + expandableState + pause + nodeLevel + pause',
},
'REAL_ROLE_TABLE_CELL': {
# the real cell information
# note that Atspi.Role.TABLE_CELL is used to work out if we need to
# read a whole row. It calls REAL_ROLE_TABLE_CELL internally.
# maybe it can be done in a cleaner way?
#
'focused': '(tableCell2ChildLabel + tableCell2ChildToggle)\
or (cellCheckedState + (expandableState and (expandableState + numberOfChildren)))',
'unfocused': '(tableCell2ChildLabel + tableCell2ChildToggle)\
or (newRowHeader + (newColumnHeader or columnHeaderIfToggleAndNoText) \
+ cellCheckedState\
+ (realActiveDescendantDisplayedText or imageDescription + image)\
+ (expandableState and (expandableState + numberOfChildren))\
+ required + pause + invalid)'
},
Atspi.Role.TABLE_ROW: {
'focused': 'expandableState',
'unfocused': '(labelOrName or displayedText) + pause + expandableState + pause + positionInList',
'basicWhereAmI': '(labelOrName or displayedText) + roleName + pause + positionInList + pause + expandableState + (nodeLevel or nestingLevel)'
},
Atspi.Role.TEAROFF_MENU_ITEM: {
'focused': '[]',
'unfocused': 'labelOrName + roleName + availability '
},
Atspi.Role.TERMINAL: {
'focused': 'textContent',
'unfocused': 'textContent',
'basicWhereAmI': 'label + readOnly + pause + textRole + pause + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + pause + textRole + pause + textContentWithAttributes + anyTextSelection + ' + MNEMONIC
},
Atspi.Role.TEXT: {
'focused': 'labelOrName + readOnly + textRole + pause + textIndentation + (currentLineText or placeholderText) + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + pause + textIndentation + (currentLineText or placeholderText) + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'labelOrName + readOnly + textRole + pause + (textContent or placeholderText) + anyTextSelection + pause + ' + MNEMONIC,
'detailedWhereAmI': 'labelOrName + readOnly + textRole + pause + (textContentWithAttributes or placeholderText) + anyTextSelection + pause + ' + MNEMONIC
},
Atspi.Role.TOGGLE_BUTTON: {
'focused': 'expandableState or toggleState',
'unfocused': 'labelOrName + roleName + (expandableState or toggleState) + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelOrName + roleName + (expandableState or toggleState)'
},
Atspi.Role.TOOL_BAR: {
'focused': 'labelAndName + roleName',
'unfocused': 'labelAndName + roleName',
},
Atspi.Role.TOOL_TIP: {
'focused': 'leaving or roleName',
'unfocused': 'roleName + labelAndName',
'basicWhereAmI': 'roleName + labelAndName'
},
Atspi.Role.TREE: {
'focused': 'labelAndName + roleName',
'unfocused': 'labelAndName + roleName',
},
Atspi.Role.TREE_ITEM: {
'focused': 'expandableState',
'unfocused': '(labelOrName or displayedText) + pause + expandableState + pause + positionInList',
'basicWhereAmI': '(labelOrName or displayedText) + roleName + pause + positionInList + pause + expandableState + (nodeLevel or nestingLevel)'
},
},
####################################################################
# #
# Formatting for braille. #
# #
####################################################################
'braille': {
'prefix': {
# TODO - JD: Figure out why we are globally getting table and radio button group properties.
#
# 'focused': 'ancestors\
# + (rowHeader and [Region(" " + asString(rowHeader))])\
# + (columnHeader and [Region(" " + asString(columnHeader))])\
# + (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
# + [Region(" ")]',
# 'unfocused': 'ancestors\
# + (rowHeader and [Region(" " + asString(rowHeader))])\
# + (columnHeader and [Region(" " + asString(columnHeader))])\
# + (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
# + [Region(" ")]',
'focused': '(includeContext\
and (ancestors\
+ (rowHeader and [Region(" " + asString(rowHeader))])\
+ (columnHeader and [Region(" " + asString(columnHeader))])\
+ (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
+ [Region(" ")])\
or [])',
'unfocused': '(includeContext\
and (ancestors\
+ (rowHeader and [Region(" " + asString(rowHeader))])\
+ (columnHeader and [Region(" " + asString(columnHeader))])\
+ (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
+ [Region(" ")])\
or [])',
},
'suffix': {
'focused': '(nodeLevel and [Region(" " + asString(nodeLevel))])',
'unfocused': '(nodeLevel and [Region(" " + asString(nodeLevel))])',
},
'default': {
'focused': '[Component(obj,\
asString(label + displayedText + value + roleName + required + invalid))]',
'unfocused': '[Component(obj,\
asString(label + displayedText + value + roleName + required + invalid))]',
},
Atspi.Role.ALERT: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelAndName + roleName))]))'
},
Atspi.Role.ANIMATION: {
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName + (description and space(": ") + description)))]',
},
Atspi.Role.APPLICATION: {
'focused': '[Component(obj, asString(name + roleName))]',
'unfocused': '[Component(obj, asString(name + roleName))]',
},
Atspi.Role.ARTICLE: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelAndName + roleName))]\
+ (childWidget and ([Region(" ")] + childWidget))))'
},
'ROLE_ARTICLE_IN_FEED': {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelOrName + roleName))]))'
},
#Atspi.Role.ARROW: 'default'
Atspi.Role.BLOCK_QUOTE: {
'unfocused': BRAILLE_TEXT + ' + (roleName and [Region(" " + asString(roleName + nestingLevel))])',
},
Atspi.Role.CANVAS: {
'unfocused': '[Component(obj,\
asString(((label + displayedText + imageDescription) or name) + roleName))]'
},
Atspi.Role.CHECK_BOX: {
'unfocused': '[Component(obj,\
asString(labelOrName + roleName),\
indicator=asString(checkedState))]'
},
Atspi.Role.CHECK_MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName + availability) + asString(accelerator),\
indicator=asString(checkedState))]'
},
Atspi.Role.COLUMN_HEADER: {
'unfocused': '[Component(obj,\
asString(((substring and currentLineText) or labelAndName) + roleName + sortOrder))]',
},
Atspi.Role.COMBO_BOX: {
'unfocused': '[Component(obj, asString(labelOrName + value + roleName), \
labelOrName and (len(asString(labelOrName)) + 1) or 0)]'
},
Atspi.Role.DESCRIPTION_TERM: {
'unfocused': BRAILLE_TEXT + ' + ([Region(" " + asString(termValueCount))])',
},
#Atspi.Role.DESKTOP_ICON: 'default'
Atspi.Role.DIAL: {
'unfocused': '[Component(obj,\
asString(labelOrName + value + roleName + required))]'
},
Atspi.Role.DIALOG: {
'unfocused': '[Component(obj, asString(labelOrName + roleName + (unrelatedLabelsOrDescription)))]'
},
#Atspi.Role.DIRECTORY_PANE: 'default'
Atspi.Role.DOCUMENT_FRAME: {
'focused': '[Text(obj, asString(placeholderText), asString(eol), startOffset, endOffset)]\
+ (required and [Region(" " + asString(required))])\
+ (readOnly and [Region(" " + asString(readOnly))])',
'unfocused': BRAILLE_TEXT
},
Atspi.Role.DOCUMENT_WEB: {
'focused': '[Text(obj, asString(placeholderText), asString(eol), startOffset, endOffset)]\
+ (required and [Region(" " + asString(required))])\
+ (readOnly and [Region(" " + asString(readOnly))])',
'unfocused': BRAILLE_TEXT
},
Atspi.Role.ENTRY: {
'unfocused': BRAILLE_TEXT
},
Atspi.Role.FORM: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelAndName + roleName))]))'
},
Atspi.Role.FRAME: {
'focused': '[Component(obj,\
asString(labelOrName + roleName + alertAndDialogCount))]',
'unfocused': '[Component(obj,\
asString(labelOrName + roleName + alertAndDialogCount))]',
},
Atspi.Role.HEADING: {
'unfocused': '[Text(obj, asString(placeholderText), "", startOffset, endOffset)]\
+ [Region(" " + asString(roleName))]'
},
#Atspi.Role.HTML_CONTAINER: 'default'
Atspi.Role.ICON: {
'unfocused': '[Component(obj,\
asString(((label + displayedText + imageDescription) or name) + roleName))]'
},
Atspi.Role.IMAGE: {
'focused': '[Component(obj,\
asString(labelAndName + value + roleName + required))]',
'unfocused': '[Component(obj,\
asString(labelAndName + value + roleName + required))]',
},
Atspi.Role.LABEL: {
'unfocused': BRAILLE_TEXT
},
Atspi.Role.LINK: {
'unfocused': '[Link(obj, asString(name or displayedText))] \
+ (roleName and [Region(" " + asString(roleName))])',
},
Atspi.Role.LIST: {
'unfocused': '[Component(obj,\
asString(label + focusedItem + roleName),\
asString(label) and (len(asString(label)) + 1) or 0)]'
},
Atspi.Role.LIST_BOX: {
'unfocused': '[Component(obj,\
asString(label + focusedItem + roleName),\
asString(label) and (len(asString(label)) + 1) or 0)]'
},
Atspi.Role.LIST_ITEM: {
'focused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj,\
asString(label + displayedText + expandableState + roleName + availability) + asString(accelerator), indicator=asString(checkedStateIfCheckable))] \
+ (nestingLevel and [Region(" " + asString(nestingLevel))])\
+ (listBoxItemWidgets and ([Region(" ")] + listBoxItemWidgets))))',
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelOrName + expandableState))]\
+ (nestingLevel and [Region(" " + asString(nestingLevel))])\
+ (listBoxItemWidgets and ([Region(" ")] + listBoxItemWidgets))))',
},
Atspi.Role.MENU: {
'focused': '[Component(obj,\
asString(labelOrName + roleName + availability) + asString(accelerator))]',
'unfocused': '[Component(obj,\
asString(labelOrName + roleName))]',
},
#Atspi.Role.MENU_BAR: 'default'
Atspi.Role.MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(labelOrName + expandableState + availability) + asString(accelerator),\
indicator=asString(checkedStateIfCheckable))]'
},
Atspi.Role.NOTIFICATION: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelAndName + roleName))]))'
},
Atspi.Role.PAGE: {
'unfocused': BRAILLE_TEXT
},
#Atspi.Role.OPTION_PANE: 'default'
Atspi.Role.PAGE_TAB: {
'focused': '[Component(obj,\
asString(labelOrName + roleName + availability) + asString(accelerator))]',
'unfocused': '[Component(obj,\
asString(labelOrName + roleName))]'
},
#Atspi.Role.PAGE_TAB_LIST: 'default'
Atspi.Role.PANEL: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelAndName + roleName))]\
+ (childWidget and ([Region(" ")] + childWidget))))'
},
Atspi.Role.PARAGRAPH: {
'unfocused': BRAILLE_TEXT
},
Atspi.Role.PASSWORD_TEXT: {
'unfocused': BRAILLE_TEXT
},
Atspi.Role.PROGRESS_BAR: {
'unfocused': '(progressBarValue and \
[Component(obj, asString(labelAndName + progressBarValue + roleName + progressBarIndex))]) \
or []'
},
Atspi.Role.PUSH_BUTTON: {
'unfocused': '[Component(obj,\
asString((labelAndName or description) + expandableState + roleName))]'
},
Atspi.Role.RADIO_BUTTON: {
'unfocused': '[Component(obj,\
asString((labelOrName or description) + roleName),\
indicator=asString(radioState))]'
},
Atspi.Role.RADIO_MENU_ITEM: {
'focused': '[Component(obj,\
asString((labelOrName or description) + roleName + availability)\
+ asString(accelerator),\
indicator=asString(radioState))]',
'unfocused': '[Component(obj,\
asString(labelOrName or description)\
+ asString(accelerator),\
indicator=asString(radioState))]'
},
Atspi.Role.ROW_HEADER: {
'unfocused': '[Component(obj,\
asString(((substring and currentLineText) or labelAndName) + roleName + sortOrder))]',
},
Atspi.Role.SCROLL_BAR: {
'unfocused': '[Component(obj,\
asString(labelOrName + value + roleName + required))]'
},
Atspi.Role.SCROLL_PANE: {
'unfocused': 'asPageTabOrScrollPane'
},
Atspi.Role.SECTION: {
'unfocused': BRAILLE_TEXT
},
#'REAL_ROLE_SCROLL_PANE': 'default'
Atspi.Role.SLIDER: {
'unfocused': '[Component(obj,\
asString(labelOrName + value + roleName + required + invalid))]'
},
Atspi.Role.SPIN_BUTTON: {
'unfocused': '[Text(obj, asString(label), asString(eol))]\
+ (required and [Region(" " + asString(required))] or [])\
+ (readOnly and [Region(" " + asString(readOnly))] or [])'
},
Atspi.Role.STATUS_BAR: {
'unfocused': '[Component(obj, asString(labelOrName + roleName))]\
+ [Region(" ")] + statusBar',
},
'ROLE_SWITCH' : {
'unfocused': '[Component(obj,\
asString((labelOrName or description) + roleName),\
indicator=asString(switchState))]'
},
#Atspi.Role.SPLIT_PANE: 'default'
#Atspi.Role.TABLE: 'default'
Atspi.Role.TABLE_CELL: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ') or tableCellRow)',
},
'REAL_ROLE_TABLE_CELL': {
'unfocused': '((tableCell2ChildToggle + tableCell2ChildLabel)\
or (substring and ' + BRAILLE_TEXT + ') \
or (cellCheckedState\
+ (columnHeaderIfToggleAndNoText and [Region(" "), Component(obj, asString(columnHeaderIfToggleAndNoText))])\
+ ((realActiveDescendantDisplayedText and [Component(obj, asString(realActiveDescendantDisplayedText))])\
or (imageDescription and [Region(" "), Component(obj, asString(imageDescription))]))\
+ (realActiveDescendantRoleName and [Component(obj, (realActiveDescendantDisplayedText and " " or "") + asString(realActiveDescendantRoleName))])\
+ (expandableState and [Region(" " + asString(expandableState))])\
+ (required and [Region(" " + asString(required))]))\
or ([Component(obj,"")]))'
},
#Atspi.Role.TABLE_COLUMN_HEADER: 'default'
#Atspi.Role.TABLE_ROW_HEADER: 'default'
Atspi.Role.TEAROFF_MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(roleName))]'
},
Atspi.Role.TERMINAL: {
'unfocused': '[Text(obj)]'
},
Atspi.Role.TEXT: {
'unfocused': BRAILLE_TEXT
},
Atspi.Role.TOGGLE_BUTTON: {
'unfocused': '[Component(obj,\
asString((labelOrName or description) + expandableState + roleName),\
indicator=asString(toggleState))]'
},
Atspi.Role.TOOL_BAR: {
'unfocused': '[Component(obj, asString(labelOrName + roleName))]',
},
Atspi.Role.TREE: {
'unfocused': '[Component(obj, asString(labelOrName + roleName))]',
},
Atspi.Role.TREE_ITEM: {
'unfocused': '((substring and ' + BRAILLE_TEXT + ')\
or ([Component(obj, asString(labelOrName + expandableState))]\
+ (nodeLevel and [Region(" " + asString(nodeLevel))])))',
},
#Atspi.Role.TREE: 'default'
#Atspi.Role.TREE_TABLE: 'default'
#Atspi.Role.WINDOW: 'default'
},
####################################################################
# #
# Formatting for sound. #
# #
####################################################################
'sound': {
'prefix': {
'focused': '[]',
'unfocused': '[]',
'basicWhereAmI': '[]',
'detailedWhereAmI': '[]'
},
'suffix': {
'focused': '[]',
'unfocused': 'clickable + hasLongDesc',
'basicWhereAmI': '[]',
'detailedWhereAmI': '[]'
},
'default': {
'focused': '[]',
'unfocused': 'roleName',
'basicWhereAmI': '[]',
'detailedWhereAmI': '[]'
},
Atspi.Role.CANVAS: {
'unfocused': 'roleName + positionInSet',
},
Atspi.Role.CHECK_BOX: {
'focused': 'checkedState',
'unfocused': 'roleName + checkedState + required + invalid + availability',
},
Atspi.Role.CHECK_MENU_ITEM: {
'focused': 'checkedState',
'unfocused': 'roleName + checkedState + availability + positionInSet',
},
Atspi.Role.COMBO_BOX: {
'focused': 'expandableState',
'unfocused': 'roleName + positionInSet',
},
Atspi.Role.DIAL: {
'focused': 'percentage',
'unfocused': 'roleName + percentage + required + invalid + availability',
},
Atspi.Role.ENTRY: {
'unfocused': 'roleName + readOnly + required + invalid + availability',
},
Atspi.Role.HEADING: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState',
},
Atspi.Role.ICON: {
'unfocused': 'roleName + positionInSet',
},
Atspi.Role.LINK: {
'focused': 'expandableState',
'unfocused': 'roleName + visitedState + expandableState',
},
Atspi.Role.LIST: {
'unfocused': 'roleName + multiselectableState',
},
Atspi.Role.LIST_BOX: {
'unfocused': 'roleName + multiselectableState',
},
Atspi.Role.LIST_ITEM: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState + positionInSet',
},
Atspi.Role.MENU_ITEM: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState + availability + positionInSet',
},
Atspi.Role.PAGE_TAB: {
'unfocused': 'roleName + positionInSet',
},
Atspi.Role.PROGRESS_BAR: {
'focused': 'progressBarValue',
'unfocused': 'roleName + progressBarValue'
},
Atspi.Role.PUSH_BUTTON: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState + availability',
},
Atspi.Role.RADIO_BUTTON: {
'focused': 'radioState',
'unfocused': 'roleName + radioState + availability + positionInSet',
},
Atspi.Role.RADIO_MENU_ITEM: {
'focused': 'radioState',
'unfocused': 'roleName + checkedState + availability + positionInSet',
},
Atspi.Role.SCROLL_BAR: {
'focused': 'percentage',
'unfocused': 'roleName + percentage',
},
Atspi.Role.SLIDER: {
'focused': 'percentage',
'unfocused': 'roleName + percentage + required + invalid + availability',
},
Atspi.Role.SPIN_BUTTON: {
'focused': 'percentage',
'unfocused': 'roleName + availability + percentage + required + invalid',
},
Atspi.Role.SPLIT_PANE: {
'focused': 'percentage',
'unfocused': 'roleName + percentage + availability',
},
'ROLE_SWITCH': {
'focused': 'switchState',
'unfocused': 'roleName + switchState + availability',
},
Atspi.Role.TABLE_CELL: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState',
},
Atspi.Role.TABLE_ROW: {
'focused': 'expandableState',
},
Atspi.Role.TEXT: {
'unfocused': 'roleName + readOnly + required + invalid + availability',
},
Atspi.Role.TOGGLE_BUTTON: {
'focused': 'expandableState or toggleState',
'unfocused': 'roleName + (expandableState or toggleState) + availability',
},
Atspi.Role.TREE_ITEM: {
'focused': 'expandableState',
'unfocused': 'roleName + expandableState + positionInSet',
},
},
}
class Formatting(dict):
def __init__(self, script):
dict.__init__(self)
self._script = script
self.update(copy.deepcopy(formatting))
def update(self, newDict):
for key, val in newDict.items():
if key in self:
if isinstance(self[key], dict) and isinstance(val, dict):
self[key].update(val)
elif isinstance(self[key], str) \
and isinstance(val, str):
self[key] = val
else:
# exception or such like, we are trying to merge
# incompatible trees.
# throw an exception?
print("an error has occurred, cant merge dicts.")
else:
self[key] = val
def getPrefix(self, **args):
"""Get a formatting string to add on to the end of
formatting strings obtained by getFormat.
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
prefix = self[args['mode']]['prefix'][args['formatType']]
return prefix
def getSuffix(self, **args):
"""Get a formatting string to add on to the end of
formatting strings obtained by getFormat.
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- role: the role, such as Atspi.Role.TEXT
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
suffix = self[args['mode']]['suffix'][args['formatType']]
return suffix
def getString(self, **args):
"""Gets a human consumable string for a specific value
(e.g., an indicator for a checkbox state).
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- stringType: the type of the string to get (see the dictionary above).
"""
return self['strings'][args['mode']][args['stringType']]
def getFormat(self, **args):
"""Get a formatting string for the given mode and formatType for a
role (e.g., a where am I string for a text object).
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- role: the role, such as Atspi.Role.TEXT
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
try:
return self[args['mode']][args['role']][args['formatType']]
except Exception:
pass
if args.get('formatType') == 'ancestor':
try:
return self[args['mode']][args['role']]['focused']
except Exception:
pass
if args.get('formatType') == 'detailedWhereAmI':
try:
return self[args['mode']][args['role']]['basicWhereAmI']
except Exception:
pass
try:
return self[args['mode']][args['role']]['unfocused']
except Exception:
pass
try:
return self[args['mode']]['default'][args['formatType']]
except Exception:
pass
try:
return self[args['mode']]['default']['unfocused']
except Exception:
return []