* @license GNU General Public License version 2 or later; see LICENSE.txt * @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace */ use Joomla\CMS\Application\CMSApplicationInterface; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Jooa11y plugin to add an accessibility checker * * @since 4.1.0 */ class PlgSystemJooa11y extends CMSPlugin implements SubscriberInterface { /** * Application object. * * @var CMSApplicationInterface * @since 4.1.0 */ protected $app; /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * Subscribe to certain events * * @return string[] An array of event mappings * * @since 4.1.0 * * @throws Exception */ public static function getSubscribedEvents(): array { $mapping = []; // Only trigger in frontend if (Factory::getApplication()->isClient('site')) { $mapping['onBeforeCompileHead'] = 'initJooa11y'; } return $mapping; } /** * Method to check if the current user is allowed to see the debug information or not. * * @return boolean True if access is allowed. * * @since 4.1.0 */ private function isAuthorisedDisplayChecker(): bool { static $result; if (is_bool($result)) { return $result; } // If the user is not allowed to view the output then end here. $filterGroups = (array) $this->params->get('filter_groups', []); if (!empty($filterGroups)) { $userGroups = $this->app->getIdentity()->get('groups'); if (!array_intersect($filterGroups, $userGroups)) { $result = false; return $result; } } $result = true; return $result; } /** * Add the checker. * * @return void * * @since 4.1.0 */ public function initJooa11y() { // Check if we are in a preview modal or the plugin has enforced loading $showJooa11y = $this->app->input->get('jooa11y', $this->params->get('showAlways', 0)); // Load the checker if authorised if (!$showJooa11y || !$this->isAuthorisedDisplayChecker()) { return; } // Get the document object. $document = $this->app->getDocument(); // Determine if it is an LTR or RTL language $direction = Factory::getLanguage()->isRtl() ? 'right' : 'left'; // Detect the current active language $lang = Factory::getLanguage()->getTag(); // Add plugin settings from the xml $document->addScriptOptions( 'jooa11yOptions', [ 'checkRoot' => $this->params->get('checkRoot', 'main'), 'readabilityRoot' => $this->params->get('readabilityRoot', 'main'), 'containerIgnore' => $this->params->get('containerIgnore'), ] ); // Add the language constants $constants = [ 'PLG_SYSTEM_JOOA11Y_ALERT_CLOSE', 'PLG_SYSTEM_JOOA11Y_ALERT_TEXT', 'PLG_SYSTEM_JOOA11Y_AVG_WORD_PER_SENTENCE', 'PLG_SYSTEM_JOOA11Y_COMPLEX_WORDS', 'PLG_SYSTEM_JOOA11Y_CONTAINER_LABEL', 'PLG_SYSTEM_JOOA11Y_CONTRAST', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_INPUT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_CONTRAST_WARNING_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_WARNING_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_DARK_MODE', 'PLG_SYSTEM_JOOA11Y_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_EMBED_AUDIO', 'PLG_SYSTEM_JOOA11Y_EMBED_GENERAL_WARNING', 'PLG_SYSTEM_JOOA11Y_EMBED_MISSING_TITLE', 'PLG_SYSTEM_JOOA11Y_EMBED_VIDEO', 'PLG_SYSTEM_JOOA11Y_ERROR', 'PLG_SYSTEM_JOOA11Y_FAIRLY_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_FILE_TYPE_WARNING', 'PLG_SYSTEM_JOOA11Y_FILE_TYPE_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_FORM_LABELS', 'PLG_SYSTEM_JOOA11Y_GOOD', 'PLG_SYSTEM_JOOA11Y_GOOD_READABILITY', 'PLG_SYSTEM_JOOA11Y_HEADING_EMPTY', 'PLG_SYSTEM_JOOA11Y_HEADING_EMPTY_WITH_IMAGE', 'PLG_SYSTEM_JOOA11Y_HEADING_FIRST', 'PLG_SYSTEM_JOOA11Y_HEADING_LONG', 'PLG_SYSTEM_JOOA11Y_HEADING_LONG_INFO', 'PLG_SYSTEM_JOOA11Y_HEADING_MISSING_ONE', 'PLG_SYSTEM_JOOA11Y_HEADING_NON_CONSECUTIVE_LEVEL', 'PLG_SYSTEM_JOOA11Y_HIDE_OUTLINE', 'PLG_SYSTEM_JOOA11Y_HIDE_SETTINGS', 'PLG_SYSTEM_JOOA11Y_HYPERLINK_ALT_LENGTH_MESSAGE', 'PLG_SYSTEM_JOOA11Y_HYPERLINK_ALT_LENGTH_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DECORATIVE', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DECORATIVE_INFO', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DUPLICATE_ALT', 'PLG_SYSTEM_JOOA11Y_LABELS_ARIA_LABEL_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_ARIA_LABEL_INPUT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LABELS_INPUT_RESET_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_INPUT_RESET_MESSAGE_TIP', 'PLG_SYSTEM_JOOA11Y_LABELS_MISSING_IMAGE_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_MISSING_LABEL_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_NO_FOR_ATTRIBUTE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_NO_FOR_ATTRIBUTE_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LANG_CODE', 'PLG_SYSTEM_JOOA11Y_LINKS_ADVANCED', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_BAD_WORD_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_BAD_WORD_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_SUS_WORD_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_SUS_WORD_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_PLACEHOLDER_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_TOO_LONG_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_TOO_LONG_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ANCHOR_LINK_AND_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ANCHOR_LINK_AND_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_BEST_PRACTICES', 'PLG_SYSTEM_JOOA11Y_LINK_BEST_PRACTICES_DETAILS', 'PLG_SYSTEM_JOOA11Y_LINK_DECORATIVE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_EMPTY', 'PLG_SYSTEM_JOOA11Y_LINK_EMPTY_LINK_NO_LABEL', 'PLG_SYSTEM_JOOA11Y_LINK_HYPERLINKED_IMAGE_ARIA_HIDDEN', 'PLG_SYSTEM_JOOA11Y_LINK_IDENTICAL_NAME', 'PLG_SYSTEM_JOOA11Y_LINK_IDENTICAL_NAME_TIP', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_BAD_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_BAD_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_ALT_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_ALT_TEXT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_NULL_ALT_NO_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_PLACEHOLDER_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_SUS_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_SUS_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_LABEL', 'PLG_SYSTEM_JOOA11Y_LINK_LINK_HAS_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_PASS_ALT', 'PLG_SYSTEM_JOOA11Y_LINK_STOPWORD', 'PLG_SYSTEM_JOOA11Y_LINK_STOPWORD_TIP', 'PLG_SYSTEM_JOOA11Y_LINK_URL', 'PLG_SYSTEM_JOOA11Y_LINK_URL_TIP', 'PLG_SYSTEM_JOOA11Y_MAIN_TOGGLE_LABEL', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_LINK_BUT_HAS_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_LINK_MESSAGE', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_NEW_TAB_WARNING', 'PLG_SYSTEM_JOOA11Y_NEW_TAB_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_OFF', 'PLG_SYSTEM_JOOA11Y_ON', 'PLG_SYSTEM_JOOA11Y_PAGE_OUTLINE', 'PLG_SYSTEM_JOOA11Y_PANEL_HEADING_MISSING_ONE', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_BOTH', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_ERRORS', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_HIDDEN', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_ICON', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_NONE', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_WARNINGS', 'PLG_SYSTEM_JOOA11Y_QA_BAD_ITALICS', 'PLG_SYSTEM_JOOA11Y_QA_BAD_LINK', 'PLG_SYSTEM_JOOA11Y_QA_BLOCKQUOTE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_QA_BLOCKQUOTE_MESSAGE_TIP', 'PLG_SYSTEM_JOOA11Y_QA_DUPLICATE_ID', 'PLG_SYSTEM_JOOA11Y_QA_DUPLICATE_ID_TIP', 'PLG_SYSTEM_JOOA11Y_QA_FAKE_HEADING', 'PLG_SYSTEM_JOOA11Y_QA_FAKE_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_QA_PAGE_LANGUAGE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_QA_PDF_COUNT', 'PLG_SYSTEM_JOOA11Y_QA_SHOULD_BE_LIST', 'PLG_SYSTEM_JOOA11Y_QA_SHOULD_BE_LIST_TIP', 'PLG_SYSTEM_JOOA11Y_QA_UPPERCASE_WARNING', 'PLG_SYSTEM_JOOA11Y_READABILITY', 'PLG_SYSTEM_JOOA11Y_READABILITY_NOT_ENOUGH_CONTENT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_READABILITY_NO_P_OR_LI_MESSAGE', 'PLG_SYSTEM_JOOA11Y_SETTINGS', 'PLG_SYSTEM_JOOA11Y_SHORTCUT_SR', 'PLG_SYSTEM_JOOA11Y_SHORTCUT_TOOLTIP', 'PLG_SYSTEM_JOOA11Y_SHOW_OUTLINE', 'PLG_SYSTEM_JOOA11Y_SHOW_SETTINGS', 'PLG_SYSTEM_JOOA11Y_TABLES_EMPTY_HEADING', 'PLG_SYSTEM_JOOA11Y_TABLES_EMPTY_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_TABLES_MISSING_HEADINGS', 'PLG_SYSTEM_JOOA11Y_TABLES_MISSING_HEADINGS_INFO', 'PLG_SYSTEM_JOOA11Y_TABLES_SEMANTIC_HEADING', 'PLG_SYSTEM_JOOA11Y_TABLES_SEMANTIC_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_TEXT_UNDERLINE_WARNING', 'PLG_SYSTEM_JOOA11Y_TEXT_UNDERLINE_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_TOTAL_WORDS', 'PLG_SYSTEM_JOOA11Y_VERY_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_WARNING', ]; foreach ($constants as $constant) { Text::script($constant); } /** @var Joomla\CMS\WebAsset\WebAssetManager $wa*/ $wa = $document->getWebAssetManager(); $wa->getRegistry()->addRegistryFile('media/plg_system_jooa11y/joomla.asset.json'); $wa->useScript('plg_system_jooa11y.jooa11y') ->useStyle('plg_system_jooa11y.jooa11y'); return true; } }