From d086c688b4e7cf1231d9384d6455c3499ed181a7 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Mon, 28 Nov 2022 17:22:03 -0600 Subject: [PATCH 01/24] Adding Axe (first pass) --- integrations/axe/axe_tags.json | 122 +++++++++++++++++++++++++++++++ integrations/axe/functions.php | 127 +++++++++++++++++++++++++++++++++ integrations/axe/logo.jpg | Bin 0 -> 8163 bytes 3 files changed, 249 insertions(+) create mode 100644 integrations/axe/axe_tags.json create mode 100644 integrations/axe/functions.php create mode 100644 integrations/axe/logo.jpg diff --git a/integrations/axe/axe_tags.json b/integrations/axe/axe_tags.json new file mode 100644 index 00000000..8d7726b5 --- /dev/null +++ b/integrations/axe/axe_tags.json @@ -0,0 +1,122 @@ +[ + { + "slug": "wcag2a", + "title": "WCAG 2.0 Level A", + "description": "", + "category": "Axe Tags" + }, + { + "slug": "wcag2aa", + "title": "WCAG 2.0 Level AA", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag2aaa", + "title": "WCAG 2.0 Level AAA", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag21a", + "title": "WCAG 2.1 Level A", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag21aa", + "title": "WCAG 2.1 Level AA", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag21aaa", + "title": "WCAG 2.1 Level AAA", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "best-practice", + "title": "Best Practices", + "category": "Axe Tags", + "description": "Common accessibility best practices." + }, + { + "slug": "cat.aria", + "title": "Aria", + "category": "Axe Categories", + "description": "" + }, + { + "slug": "cat.color", + "title": "Color", + "category": "Axe Categories", + "description": "" + }, + { + "slug": "cat.forms", + "title": "Forms", + "category": "Axe Categories", + "description": "axe/forms contains accessibility rules from the axe forms category." + }, + { + "slug": "cat.keyboard", + "title": "Keyboard", + "category": "Axe Categories", + "description": "axe/keyboard contains accessibility rules from the axe keyboard category." + }, + { + "slug": "cat.language", + "title": "Language", + "category": "Axe Categories", + "description": "axe/language contains accessibility rules from the axe language category." + }, + { + "slug": "cat.name-role-value", + "title": "Name Role Value", + "category": "Axe Categories", + "description": "axe/name-role-value contains accessibility rules from the axe name-role-value category." + }, + { + "slug": "cat.parsing", + "title": "Parsing", + "category": "Axe Categories", + "description": "axe/parsing contains accessibility rules from the axe parsing category." + }, + { + "slug": "cat.semantics", + "title": "Semantics", + "category": "Axe Categories", + "description": "axe/semantics contains accessibility rules from the axe semantics category." + }, + { + "slug": "cat.sensory-and-visual-cues", + "title": "Sensory and Visual Cues", + "category": "Axe Categories", + "description": "axe/sensory-and-visual-cues contains accessibility rules from the axe sensory-and-visual-cues category." + }, + { + "slug": "cat.structure", + "title": "Structure", + "category": "Axe Categories", + "description": "axe/structure contains accessibility rules from the axe structure category." + }, + { + "slug": "cat.tables", + "title": "Tables", + "category": "Axe Categories", + "description": "axe/tables contains accessibility rules from the axe tables category." + }, + { + "slug": "cat.text-alternatives", + "title": "Text Alternatives", + "category": "Axe Categories", + "description": "axe/text-alternatives contains accessibility rules from the axe text-alternatives category." + }, + { + "slug": "cat.time-and-media", + "title": "Time and Media", + "category": "Axe Categories", + "description": "axe/time-and-media contains accessibility rules from the axe time-and-media category." + } +] diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php new file mode 100644 index 00000000..4ae416ba --- /dev/null +++ b/integrations/axe/functions.php @@ -0,0 +1,127 @@ + $value, 'name' => $value, 'description' => $value) ] + $tags = array(); + if(!empty($axe_tags)){ + foreach($axe_tags as $axe_tag){ + + // First, let's prepare the description, which is + // the summary and guidelines. + $description = '

'.$axe_tag['description'].'

'; + + // Now lets put it all together into the Equalify format. + array_push( + $tags, array( + 'slug' => $axe_tag['slug'], + 'title' => $axe_tag['title'], + 'category' => $axe_tag['category'], + 'description' => $description + ) + ); + + } + } + + // Return tags. + return $tags; + +} + + /** + * Axe URLs + * Maps site URLs to Little Forest URLs for processing. + */ +function axe_urls($page_url) { + return 'http://24.199.80.139/?url='.$page_url; +} + +/** + * Axe Alerts + * @param string response_body + * @param string page_url + */ +function axe_alerts($response_body, $page_url){ + + // Our goal is to return alerts. + $axe_alerts = []; + $axe_json = $response_body; + + // Decode JSON and count WCAG errors. + $axe_json_decoded = json_decode($axe_json, true); + + // Fallback if Axe scan doesn't work. + // if(!empty($axe_json_decoded['status']['error'])) + // throw new Exception('axe error:"'.$axe_json_decoded['status']['error'].'"'); + + // Sometimes Axe can't read the json. + if(empty($axe_json_decoded)){ + + // And add an alert. + $alert = array( + 'source' => 'axe-core', + 'url' => $page_url, + 'message' => 'axe-core cannot reach the page.', + ); + array_push($axe_alerts, $alert); + + }else{ + + // Show axe violations + $axe_violations = array(); + foreach($axe_json_decoded['violations'] as $violation){ + + // Only show violations. + $axe_violations[] = $violation; + + } + + + } + + // Add alerts. + if(!empty($axe_items)) { + + // Setup alert variables. + foreach($axe_violations as $axe_item){ + + // Default variables. + $alert = array(); + $alert['source'] = 'axe'; + $alert['url'] = $page_url; + + // Setup tags. + $alert['tags'] = $axe_item['tags']; + + // Setup message. + $alert['message'] = '"'.$axe_item['id'].'" violation: '.$axe_item['help']; + + // Push alert. + $axe_alerts[] = $alert; + + } + + } + + // Return alerts. + return $axe_alerts; + +} \ No newline at end of file diff --git a/integrations/axe/logo.jpg b/integrations/axe/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6422f29de31592cd54386c9ad2b60f084a63afde GIT binary patch literal 8163 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 bz54&v{~`>;|ATw=|MYhDzx|JifjIhax+-&# literal 0 HcmV?d00001 From 93fb89f9bd783560be13a7d906b1ae06f07707b1 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 29 Nov 2022 15:16:48 -0600 Subject: [PATCH 02/24] Re-add Axe and remove managed service CLI condition. --- cli/scan.php | 4 - integrations/{axe => axe-core}/axe_tags.json | 0 integrations/{axe => axe-core}/functions.php | 86 +++++++++---------- integrations/{axe => axe-core}/logo.jpg | Bin 4 files changed, 43 insertions(+), 47 deletions(-) rename integrations/{axe => axe-core}/axe_tags.json (100%) rename integrations/{axe => axe-core}/functions.php (50%) rename integrations/{axe => axe-core}/logo.jpg (100%) diff --git a/cli/scan.php b/cli/scan.php index 6e66ab6b..be83c4cd 100644 --- a/cli/scan.php +++ b/cli/scan.php @@ -6,10 +6,6 @@ * be designed to be as efficient as possible so that * Equalify works for everyone. **********************************************************/ - -// PRIVATE session ID is declared as an argument in CLI. -if(!isset($_SESSION)) - $_SESSION['id'] = $argv[1]; // Since this file can run in the CLI, we must set the // directory if it isn't already set. diff --git a/integrations/axe/axe_tags.json b/integrations/axe-core/axe_tags.json similarity index 100% rename from integrations/axe/axe_tags.json rename to integrations/axe-core/axe_tags.json diff --git a/integrations/axe/functions.php b/integrations/axe-core/functions.php similarity index 50% rename from integrations/axe/functions.php rename to integrations/axe-core/functions.php index 4ae416ba..0999f8f9 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe-core/functions.php @@ -61,67 +61,67 @@ function axe_urls($page_url) { */ function axe_alerts($response_body, $page_url){ - // Our goal is to return alerts. - $axe_alerts = []; - $axe_json = $response_body; + // // Our goal is to return alerts. + // $axe_alerts = []; + // $axe_json = $response_body; - // Decode JSON and count WCAG errors. - $axe_json_decoded = json_decode($axe_json, true); + // // Decode JSON and count WCAG errors. + // $axe_json_decoded = json_decode($axe_json, true); - // Fallback if Axe scan doesn't work. - // if(!empty($axe_json_decoded['status']['error'])) - // throw new Exception('axe error:"'.$axe_json_decoded['status']['error'].'"'); + // // Fallback if Axe scan doesn't work. + // // if(!empty($axe_json_decoded['status']['error'])) + // // throw new Exception('axe error:"'.$axe_json_decoded['status']['error'].'"'); - // Sometimes Axe can't read the json. - if(empty($axe_json_decoded)){ + // // Sometimes Axe can't read the json. + // if(empty($axe_json_decoded)){ - // And add an alert. - $alert = array( - 'source' => 'axe-core', - 'url' => $page_url, - 'message' => 'axe-core cannot reach the page.', - ); - array_push($axe_alerts, $alert); + // // And add an alert. + // $alert = array( + // 'source' => 'axe-core', + // 'url' => $page_url, + // 'message' => 'axe-core cannot reach the page.', + // ); + // array_push($axe_alerts, $alert); - }else{ + // }else{ - // Show axe violations - $axe_violations = array(); - foreach($axe_json_decoded['violations'] as $violation){ + // // Show axe violations + // $axe_violations = array(); + // foreach($axe_json_decoded['violations'] as $violation){ - // Only show violations. - $axe_violations[] = $violation; + // // Only show violations. + // $axe_violations[] = $violation; - } + // } - } + // } - // Add alerts. - if(!empty($axe_items)) { + // // Add alerts. + // if(!empty($axe_items)) { - // Setup alert variables. - foreach($axe_violations as $axe_item){ + // // Setup alert variables. + // foreach($axe_violations as $axe_item){ - // Default variables. - $alert = array(); - $alert['source'] = 'axe'; - $alert['url'] = $page_url; + // // Default variables. + // $alert = array(); + // $alert['source'] = 'axe'; + // $alert['url'] = $page_url; - // Setup tags. - $alert['tags'] = $axe_item['tags']; + // // Setup tags. + // $alert['tags'] = $axe_item['tags']; - // Setup message. - $alert['message'] = '"'.$axe_item['id'].'" violation: '.$axe_item['help']; + // // Setup message. + // $alert['message'] = '"'.$axe_item['id'].'" violation: '.$axe_item['help']; - // Push alert. - $axe_alerts[] = $alert; + // // Push alert. + // $axe_alerts[] = $alert; - } + // } - } + // } - // Return alerts. - return $axe_alerts; + // // Return alerts. + // return $axe_alerts; } \ No newline at end of file diff --git a/integrations/axe/logo.jpg b/integrations/axe-core/logo.jpg similarity index 100% rename from integrations/axe/logo.jpg rename to integrations/axe-core/logo.jpg From 08d59ca55a24894a7018ee161e1a628d9cec4057 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 29 Nov 2022 15:23:38 -0600 Subject: [PATCH 03/24] Fix axe slugs again --- install.php | 4 ---- integrations/{axe-core => axe}/axe_tags.json | 0 integrations/{axe-core => axe}/functions.php | 0 integrations/{axe-core => axe}/logo.jpg | Bin integrations/pantheon/functions.php | 2 +- models/db.php | 5 +---- 6 files changed, 2 insertions(+), 9 deletions(-) rename integrations/{axe-core => axe}/axe_tags.json (100%) rename integrations/{axe-core => axe}/functions.php (100%) rename integrations/{axe-core => axe}/logo.jpg (100%) diff --git a/install.php b/install.php index 4804a920..28f95ced 100644 --- a/install.php +++ b/install.php @@ -7,10 +7,6 @@ * Equalify works for everyone. **********************************************************/ -// Wave key is required for activation. -if(empty($GLOBALS['wave_key'])) - throw new Exception('Equalify requires a WAVE key. Get your key at https://wave.webaim.org/api/ and add it to the config.php file.'); - // All the tables are created with this action. if(DataAccess::table_exists('alerts') == false) DataAccess::create_alerts_table(); diff --git a/integrations/axe-core/axe_tags.json b/integrations/axe/axe_tags.json similarity index 100% rename from integrations/axe-core/axe_tags.json rename to integrations/axe/axe_tags.json diff --git a/integrations/axe-core/functions.php b/integrations/axe/functions.php similarity index 100% rename from integrations/axe-core/functions.php rename to integrations/axe/functions.php diff --git a/integrations/axe-core/logo.jpg b/integrations/axe/logo.jpg similarity index 100% rename from integrations/axe-core/logo.jpg rename to integrations/axe/logo.jpg diff --git a/integrations/pantheon/functions.php b/integrations/pantheon/functions.php index 74e28385..6442b6c6 100644 --- a/integrations/pantheon/functions.php +++ b/integrations/pantheon/functions.php @@ -1,6 +1,6 @@ Date: Thu, 1 Dec 2022 16:14:53 -0600 Subject: [PATCH 04/24] Finalize axe report --- .gitignore | 5 +- integrations/axe/functions.php | 94 ++++++++++++++++------------------ test.php | 82 ++++++++++++++++++++++++++++- 3 files changed, 130 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 8114f97f..8104dba7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ vendor/ test/ _dev/ _private/ -.ddev/ \ No newline at end of file +.ddev/ +test.json +test.php +test.html \ No newline at end of file diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 0999f8f9..15b0f3b7 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -1,7 +1,7 @@ 'axe-core', + 'url' => $page_url, + 'message' => 'axe-core cannot reach the page.', + ); + array_push($axe_alerts, $alert); - // // And add an alert. - // $alert = array( - // 'source' => 'axe-core', - // 'url' => $page_url, - // 'message' => 'axe-core cannot reach the page.', - // ); - // array_push($axe_alerts, $alert); + }else{ - // }else{ + // We're add a lit of violations. + $axe_violations = array(); - // // Show axe violations - // $axe_violations = array(); - // foreach($axe_json_decoded['violations'] as $violation){ + // Show axe violations + foreach($axe_json_decoded[0]->violations as $violation){ - // // Only show violations. - // $axe_violations[] = $violation; + // Only show violations. + $axe_violations[] = $violation; - // } - - - // } + } - // // Add alerts. - // if(!empty($axe_items)) { + // Add alerts. + if(!empty($axe_violations)) { - // // Setup alert variables. - // foreach($axe_violations as $axe_item){ + // Setup alert variables. + foreach($axe_violations as $violation){ - // // Default variables. - // $alert = array(); - // $alert['source'] = 'axe'; - // $alert['url'] = $page_url; + // Default variables. + $alert = array(); + $alert['source'] = 'axe-core'; + $alert['url'] = $page_url; - // // Setup tags. - // $alert['tags'] = $axe_item['tags']; + // Setup tags. + $alert['tags'] = $violation->tags; - // // Setup message. - // $alert['message'] = '"'.$axe_item['id'].'" violation: '.$axe_item['help']; + // Setup message. + $alert['message'] = '"'.$violation->id.'" violation: '.$violation->help; - // // Push alert. - // $axe_alerts[] = $alert; - - // } + // Push alert. + $axe_alerts[] = $alert; + + } - // } + } - // // Return alerts. - // return $axe_alerts; + } + // Return alerts. + return $axe_alerts; } \ No newline at end of file diff --git a/test.php b/test.php index f35a8efd..884aaefd 100644 --- a/test.php +++ b/test.php @@ -1,3 +1,83 @@ request('GET', 'https://wave.webaim.org/api/docs?format=json'); +$response = $client->request('GET', 'https://axe.equalify.app/index.php?url=decubing.com'); + +$axe_json = $response->getBody()->getContents(); +$axe_json_decoded = json_decode($axe_json); + +$page_url = 'test.com'; + +// START PLUGIN + +// Decode JSON. +$axe_json_decoded = json_decode($axe_json); + +// Sometimes Axe can't read the json. +if(empty($axe_json_decoded)){ + + // And add an alert. + $alert = array( + 'source' => 'axe-core', + 'url' => $page_url, + 'message' => 'axe-core cannot reach the page.', + ); + array_push($axe_alerts, $alert); + +}else{ + + // We're add a lit of violations. + $axe_violations = array(); + + // Show axe violations + foreach($axe_json_decoded[0]->violations as $violation){ + + // Only show violations. + $axe_violations[] = $violation; + + } + + // Add alerts. + if(!empty($axe_violations)) { + + // Setup alert variables. + foreach($axe_violations as $violation){ + + // Default variables. + $alert = array(); + $alert['source'] = 'axe-core'; + $alert['url'] = $page_url; + + // Setup tags. + $alert['tags'] = $violation->tags; + + // Setup message. + $alert['message'] = '"'.$violation->id.'" violation: '.$violation->help; + + // Push alert. + $axe_alerts[] = $alert; + + } + + } + +} + +// Test to make sure it works +echo '
';
+print_r($axe_alerts);
+echo '
'; +die; + +// Return everything +// return $axe_alerts; \ No newline at end of file From a1e8d09b5aaca3c14f3a4ca14def504a63b1b89d Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 1 Dec 2022 16:52:54 -0600 Subject: [PATCH 05/24] ready for serialization --- integrations/axe/functions.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 15b0f3b7..071847a2 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -31,10 +31,15 @@ function axe_tags(){ // Now lets put it all together into the Equalify format. array_push( $tags, array( - 'slug' => $axe_tag['slug'], 'title' => $axe_tag['title'], 'category' => $axe_tag['category'], - 'description' => $description + 'description' => $description, + + // axe-core uses periods, which get screwed up + // when equalify serializes them, so we're + // just not going to use periods + 'slug' => str_replace('.', '', $axe_tag['slug']) + ) ); @@ -103,8 +108,9 @@ function axe_alerts($response_body, $page_url){ $alert['source'] = 'axe-core'; $alert['url'] = $page_url; - // Setup tags. - $alert['tags'] = $violation->tags; + // Setup tags - we need to get rid of periods so + // equalify wont convert them to underscores. + $alert['tags'] = str_replace('.', '', $violation->tags); // Setup message. $alert['message'] = '"'.$violation->id.'" violation: '.$violation->help; From 8608058a52b8b67f3e3e5b6f5b985f59acd6fee7 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 1 Dec 2022 16:57:30 -0600 Subject: [PATCH 06/24] style fix --- actions/toggle_site_status.php | 1 - 1 file changed, 1 deletion(-) diff --git a/actions/toggle_site_status.php b/actions/toggle_site_status.php index 1ae3d67b..ff8c9dfc 100644 --- a/actions/toggle_site_status.php +++ b/actions/toggle_site_status.php @@ -86,7 +86,6 @@ function update_alerts($new_status, $site_id) { DataAccess::get_meta_value('active_integrations') ); - // Create active sites to alerts filter. $integration_uris = NULL; if(!empty($active_integrations)){ From aa01ee018db34ed3bc063ce314a47f221ec26a65 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 1 Dec 2022 16:58:23 -0600 Subject: [PATCH 07/24] update slug --- integrations/axe/functions.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 071847a2..5fce3323 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -78,9 +78,9 @@ function axe_alerts($response_body, $page_url){ // And add an alert. $alert = array( - 'source' => 'axe-core', + 'source' => 'axe', 'url' => $page_url, - 'message' => 'axe-core cannot reach the page.', + 'message' => 'axe cannot reach the page.', ); array_push($axe_alerts, $alert); @@ -105,7 +105,7 @@ function axe_alerts($response_body, $page_url){ // Default variables. $alert = array(); - $alert['source'] = 'axe-core'; + $alert['source'] = 'axe'; $alert['url'] = $page_url; // Setup tags - we need to get rid of periods so From dc4738e590d5727ee6e985640218d2310107c206 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 6 Dec 2022 13:57:12 -0600 Subject: [PATCH 08/24] Fix WAVE label --- views/integration_settings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/integration_settings.php b/views/integration_settings.php index ecabf3e0..04d1e637 100644 --- a/views/integration_settings.php +++ b/views/integration_settings.php @@ -46,13 +46,13 @@ $settings = $settings['meta']; foreach($settings as $setting): $name = $setting['name']; - $report = $setting['report']; + $label = $setting['label']; $type = $setting['type']; ?>
Date: Tue, 6 Dec 2022 15:38:19 -0600 Subject: [PATCH 09/24] Make alert tags play nice with filter tags. --- integrations/axe/functions.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 5fce3323..b05ce4db 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -108,9 +108,21 @@ function axe_alerts($response_body, $page_url){ $alert['source'] = 'axe'; $alert['url'] = $page_url; - // Setup tags - we need to get rid of periods so - // equalify wont convert them to underscores. - $alert['tags'] = str_replace('.', '', $violation->tags); + // Setup tags. + $alert['tags'] = ''; + if(!empty($violation->tags)){ + + // We need to get rid of periods so Equalify + // wont convert them to underscores and they + // need to be comma separated. + $tags = $violation->tags; + $copy = $tags; + foreach($tags as $tag){ + $alert['tags'].= str_replace('.', '', $tag); + if (next($copy )) + $alert['tags'].= ','; + } + } // Setup message. $alert['message'] = '"'.$violation->id.'" violation: '.$violation->help; From d55b336d081d9809c8ff04c7b0d322f93504aa32 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 6 Dec 2022 16:05:28 -0600 Subject: [PATCH 10/24] Add more_info --- models/db.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/db.php b/models/db.php index ee9a890d..de0a9f9c 100644 --- a/models/db.php +++ b/models/db.php @@ -750,6 +750,7 @@ public static function create_alerts_table(){ `url` text, `message` text, `tags` text, + `more_info` text, `archived` BOOLEAN NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; @@ -806,6 +807,7 @@ public static function create_queued_alerts_table(){ `url` text, `message` text, `tags` text, + `more_info` text, `archived` BOOLEAN NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; From 181d4f23e05d52ed7e217797389333fd7764e2e3 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 6 Dec 2022 16:14:12 -0600 Subject: [PATCH 11/24] Add more_info to db --- helpers/process_alerts.php | 3 ++- integrations/axe/functions.php | 7 ++++++- integrations/wave/functions.php | 1 + models/db.php | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/helpers/process_alerts.php b/helpers/process_alerts.php index 9bb8024d..fb78607e 100644 --- a/helpers/process_alerts.php +++ b/helpers/process_alerts.php @@ -116,7 +116,8 @@ function process_alerts( array $integration_output) { 'status' => $alert->status, 'site_id' => $alert->site_id, 'tags' => $alert->tags, - 'source' => $alert->source + 'source' => $alert->source, + 'more_info' => $alert->more_info ); array_push($rows, $new_row); }; diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index b05ce4db..5239faf2 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -122,11 +122,16 @@ function axe_alerts($response_body, $page_url){ if (next($copy )) $alert['tags'].= ','; } - } + } // Setup message. $alert['message'] = '"'.$violation->id.'" violation: '.$violation->help; + // Setup more info. + $alert['more_info'] = ''; + if($violation->nodes) + $alert['more_info'] = $violation->nodes; + // Push alert. $axe_alerts[] = $alert; diff --git a/integrations/wave/functions.php b/integrations/wave/functions.php index d7893103..f9606676 100644 --- a/integrations/wave/functions.php +++ b/integrations/wave/functions.php @@ -166,6 +166,7 @@ function wave_alerts($response_body, $page_url){ // Default variables. $alert = array(); $alert['source'] = 'wave'; + $alert['more_info'] = ''; $alert['url'] = $page_url; // Setup tags. diff --git a/models/db.php b/models/db.php index de0a9f9c..249e74e6 100644 --- a/models/db.php +++ b/models/db.php @@ -299,7 +299,8 @@ public static function get_joined_db( $selected_columns = "DISTINCT $table1.id, "; $selected_columns.= "$table1.url, $table1.message, "; $selected_columns.= "$table1.status, $table1.site_id, "; - $selected_columns.= "$table1.source, $table1.tags "; + $selected_columns.= "$table1.source, $table1.tags, "; + $selected_columns.= "$table1.more_info, $table1.more_info"; } // SQL. From 53d8eac034374faf88fa7c1534cb9d1ed6d87282 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 6 Dec 2022 17:14:18 -0600 Subject: [PATCH 12/24] Add Single Alert options --- integrations/axe/axe_tags.json | 12 ++++ views/reports.php | 12 ++++ views/single_alert.php | 108 +++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 views/single_alert.php diff --git a/integrations/axe/axe_tags.json b/integrations/axe/axe_tags.json index 8d7726b5..56b2ea1d 100644 --- a/integrations/axe/axe_tags.json +++ b/integrations/axe/axe_tags.json @@ -35,6 +35,18 @@ "category": "Axe Tags", "description": "" }, + { + "slug": "wcag311", + "title": "WCAG 3.1.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "ACT", + "title": "ACT", + "category": "Axe Tags", + "description": "ACT Rules are designed to harmonize how edge cases for WCAG and other accessibility guidance are tested." + }, { "slug": "best-practice", "title": "Best Practices", diff --git a/views/reports.php b/views/reports.php index a1055f3c..6c30b34c 100644 --- a/views/reports.php +++ b/views/reports.php @@ -237,6 +237,17 @@ more_info)){ + ?> + + + More Info + + + status == 'active' && $alert->archived != 1 ){ ?> @@ -257,6 +268,7 @@ + diff --git a/views/single_alert.php b/views/single_alert.php new file mode 100644 index 00000000..5803f0f0 --- /dev/null +++ b/views/single_alert.php @@ -0,0 +1,108 @@ + 'id', + 'value' => $alert_id + ) +); +$report = (array)DataAccess::get_db_rows( + 'alerts', $filtered_to_alert +)['content'][0]; +?> + +
+
+

+ + + +

+
+
+ + + + + 'slug', + 'value' => $tag + ) + ); + $tag_info = (array)DataAccess::get_db_rows( + 'tags', $filtered_to_tag + )['content'][0]; + echo ''.$tag_info['title'].' '; + } + + } + } + ?> + +
+
+
+ +

+ + + +

+ + + +

More Info

+ + any[0]) && !empty($info->all[0])){ + $message = $info->all[0]->message; + }elseif(!empty($info->any[0]) && empty($info->all[0])){ + $message = $info->any[0]->message; + }else{ + $message = ''; + } + + $count++; + echo '
'; + echo '

'.$message.'

'; + echo '
'.$info->html.'
'; + echo '
'; + } + ?> + + + +
\ No newline at end of file From fa8532aa607ea6e9ac7465915bb21dbcecf6dfa4 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 6 Dec 2022 17:41:16 -0600 Subject: [PATCH 13/24] fixed error text --- integrations/axe/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 5239faf2..7b634423 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -80,7 +80,7 @@ function axe_alerts($response_body, $page_url){ $alert = array( 'source' => 'axe', 'url' => $page_url, - 'message' => 'axe cannot reach the page.', + 'message' => 'axe-core cannot reach the page.', ); array_push($axe_alerts, $alert); From 4be9af844335719ccbaf398a1a6d7a5b2f455860 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Wed, 7 Dec 2022 15:40:35 -0600 Subject: [PATCH 14/24] Additional axe-core tags --- integrations/axe/axe_tags.json | 44 +++++++++++++++++++++++++++++++++- views/single_alert.php | 6 ++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/integrations/axe/axe_tags.json b/integrations/axe/axe_tags.json index 56b2ea1d..0bc3dc53 100644 --- a/integrations/axe/axe_tags.json +++ b/integrations/axe/axe_tags.json @@ -35,9 +35,51 @@ "category": "Axe Tags", "description": "" }, + { + "slug": "wcag222", + "title": "WCAG Success Criteria 2.2.2", + "category": "Axe Tags", + "description": "" + }, { "slug": "wcag311", - "title": "WCAG 3.1.1", + "title": "WCAG Success Criteria 3.1.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag412", + "title": "WCAG Success Criteria 4.1.2", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section508", + "title": "Section 508", + "category": "Axe Tags", + "description": "Section 508 is part of a 1998 amendment to the Rehabilitation Act of 1973. It requires all Federal electronic content to be accessible" + }, + { + "slug": "section50822a", + "title": "Section 508.22.a", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822j", + "title": "Section 508.22.j", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822g", + "title": "Section 508.22.g", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822f", + "title": "Section 508.22.f", "category": "Axe Tags", "description": "" }, diff --git a/views/single_alert.php b/views/single_alert.php index 5803f0f0..8feda6a1 100644 --- a/views/single_alert.php +++ b/views/single_alert.php @@ -28,7 +28,7 @@
- + @@ -50,7 +50,7 @@ $tag_info = (array)DataAccess::get_db_rows( 'tags', $filtered_to_tag )['content'][0]; - echo ''.$tag_info['title'].' '; + echo ''.$tag_info['title'].' '; } } @@ -94,7 +94,7 @@ $count++; echo '
'; echo '

'.$message.'

'; - echo '
'.$info->html.'
'; echo '
'; } From a53d9e33c8c0c05b6f33848a2bd744e87e4658f4 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Wed, 7 Dec 2022 16:08:03 -0600 Subject: [PATCH 15/24] Update tags and view --- integrations/axe/axe_tags.json | 116 +++++++++++++++++++++++++++++++-- views/single_alert.php | 59 ++++++++++------- 2 files changed, 146 insertions(+), 29 deletions(-) diff --git a/integrations/axe/axe_tags.json b/integrations/axe/axe_tags.json index 0bc3dc53..853cf92c 100644 --- a/integrations/axe/axe_tags.json +++ b/integrations/axe/axe_tags.json @@ -35,18 +35,108 @@ "category": "Axe Tags", "description": "" }, + { + "slug": "wcag111", + "title": "WCAG Success Criteria 1.1.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag121", + "title": "WCAG Success Criteria 1.2.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag122", + "title": "WCAG Success Criteria 1.2.2", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag131", + "title": "WCAG Success Criteria 1.3.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag141", + "title": "WCAG Success Criteria 1.4.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag143", + "title": "WCAG Success Criteria 1.4.3", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag144", + "title": "WCAG Success Criteria 1.4.4", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag211", + "title": "WCAG Success Criteria 2.1.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag221", + "title": "WCAG Success Criteria 2.2.1", + "category": "Axe Tags", + "description": "" + }, { "slug": "wcag222", "title": "WCAG Success Criteria 2.2.2", "category": "Axe Tags", "description": "" }, + { + "slug": "wcag241", + "title": "WCAG Success Criteria 2.4.1", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag242", + "title": "WCAG Success Criteria 2.4.2", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag244", + "title": "WCAG Success Criteria 2.4.4", + "category": "Axe Tags", + "description": "" + }, { "slug": "wcag311", "title": "WCAG Success Criteria 3.1.1", "category": "Axe Tags", "description": "" }, + { + "slug": "wcag312", + "title": "WCAG Success Criteria 3.1.2", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag332", + "title": "WCAG Success Criteria 3.3.2", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "wcag411", + "title": "WCAG Success Criteria 4.1.1", + "category": "Axe Tags", + "description": "" + }, { "slug": "wcag412", "title": "WCAG Success Criteria 4.1.2", @@ -66,8 +156,8 @@ "description": "" }, { - "slug": "section50822j", - "title": "Section 508.22.j", + "slug": "section50822f", + "title": "Section 508.22.f", "category": "Axe Tags", "description": "" }, @@ -78,8 +168,26 @@ "description": "" }, { - "slug": "section50822f", - "title": "Section 508.22.f", + "slug": "section50822i", + "title": "Section 508.22.i", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822j", + "title": "Section 508.22.j", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822n", + "title": "Section 508.22.n", + "category": "Axe Tags", + "description": "" + }, + { + "slug": "section50822o", + "title": "Section 508.22.o", "category": "Axe Tags", "description": "" }, diff --git a/views/single_alert.php b/views/single_alert.php index 8feda6a1..df79c3b1 100644 --- a/views/single_alert.php +++ b/views/single_alert.php @@ -17,7 +17,7 @@ ?>
-
+

- + + 20){ + echo substr($report['url'], 0, 20).'...'; + }else{ + echo $report['url']; + } + ?> +
-
+

@@ -75,30 +84,30 @@ if(!empty($report['more_info'])): ?> -

More Info

+

More Info

- any[0]) && !empty($info->all[0])){ - $message = $info->all[0]->message; - }elseif(!empty($info->any[0]) && empty($info->all[0])){ - $message = $info->any[0]->message; - }else{ - $message = ''; - } + '; - echo '

'.$message.'

'; - echo '
'.$info->html.'
'; - echo '

'; - } - ?> + // Setup axe-core items + if(empty($info->any[0]) && !empty($info->all[0])){ + $message = $info->all[0]->message; + }elseif(!empty($info->any[0]) && empty($info->all[0])){ + $message = $info->any[0]->message; + }else{ + $message = ''; + } + + $count++; + echo '
'; + echo '

'.$message.'

'; + echo '
'.$info->html.'
'; + echo '
'; + } + ?> Date: Wed, 7 Dec 2022 16:11:00 -0600 Subject: [PATCH 16/24] Reorganize Tags --- integrations/axe/axe_tags.json | 68 +++++++++++++++++----------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/integrations/axe/axe_tags.json b/integrations/axe/axe_tags.json index 853cf92c..79b06a2a 100644 --- a/integrations/axe/axe_tags.json +++ b/integrations/axe/axe_tags.json @@ -3,204 +3,204 @@ "slug": "wcag2a", "title": "WCAG 2.0 Level A", "description": "", - "category": "Axe Tags" + "category": "WCAG Axe Tags" }, { "slug": "wcag2aa", "title": "WCAG 2.0 Level AA", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag2aaa", "title": "WCAG 2.0 Level AAA", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag21a", "title": "WCAG 2.1 Level A", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag21aa", "title": "WCAG 2.1 Level AA", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag21aaa", "title": "WCAG 2.1 Level AAA", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag111", "title": "WCAG Success Criteria 1.1.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag121", "title": "WCAG Success Criteria 1.2.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag122", "title": "WCAG Success Criteria 1.2.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag131", "title": "WCAG Success Criteria 1.3.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag141", "title": "WCAG Success Criteria 1.4.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag143", "title": "WCAG Success Criteria 1.4.3", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag144", "title": "WCAG Success Criteria 1.4.4", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag211", "title": "WCAG Success Criteria 2.1.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag221", "title": "WCAG Success Criteria 2.2.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag222", "title": "WCAG Success Criteria 2.2.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag241", "title": "WCAG Success Criteria 2.4.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag242", "title": "WCAG Success Criteria 2.4.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag244", "title": "WCAG Success Criteria 2.4.4", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag311", "title": "WCAG Success Criteria 3.1.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag312", "title": "WCAG Success Criteria 3.1.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag332", "title": "WCAG Success Criteria 3.3.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag411", "title": "WCAG Success Criteria 4.1.1", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "wcag412", "title": "WCAG Success Criteria 4.1.2", - "category": "Axe Tags", + "category": "WCAG Axe Tags", "description": "" }, { "slug": "section508", "title": "Section 508", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "Section 508 is part of a 1998 amendment to the Rehabilitation Act of 1973. It requires all Federal electronic content to be accessible" }, { "slug": "section50822a", "title": "Section 508.22.a", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822f", "title": "Section 508.22.f", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822g", "title": "Section 508.22.g", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822i", "title": "Section 508.22.i", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822j", "title": "Section 508.22.j", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822n", "title": "Section 508.22.n", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "section50822o", "title": "Section 508.22.o", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "" }, { "slug": "ACT", "title": "ACT", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "ACT Rules are designed to harmonize how edge cases for WCAG and other accessibility guidance are tested." }, { "slug": "best-practice", "title": "Best Practices", - "category": "Axe Tags", + "category": "Other Axe Tags", "description": "Common accessibility best practices." }, { From 07e07827f5dd5f8b3087dc49c83efb083122c6c3 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 8 Dec 2022 15:48:16 -0600 Subject: [PATCH 17/24] Prevent future URL weirdness --- integrations/wave/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/wave/functions.php b/integrations/wave/functions.php index f9606676..22b98a9a 100644 --- a/integrations/wave/functions.php +++ b/integrations/wave/functions.php @@ -102,7 +102,7 @@ function wave_tags(){ * Maps site URLs to Little Forest URLs for processing. */ function wave_urls($page_url) { - return 'https://wave.webaim.org/api/request?key='.DataAccess::get_meta_value('wave_key').'&url='.$page_url.'&reporttype=4'; + return 'https://wave.webaim.org/api/request?key='.DataAccess::get_meta_value('wave_key').'&reporttype=4&url='.$page_url; } /** From 159749fcb162a172c68330efb98d2c86db75925a Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 8 Dec 2022 16:57:26 -0600 Subject: [PATCH 18/24] Prevent archived alerts from being equalified --- models/db.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/db.php b/models/db.php index 249e74e6..d497de30 100644 --- a/models/db.php +++ b/models/db.php @@ -302,7 +302,7 @@ public static function get_joined_db( $selected_columns.= "$table1.source, $table1.tags, "; $selected_columns.= "$table1.more_info, $table1.more_info"; } - + // SQL. $sql = "SELECT $selected_columns FROM $table1 "; $sql.= "LEFT JOIN $table2 "; @@ -310,7 +310,7 @@ public static function get_joined_db( $sql.= "AND $table1.message=$table2.message "; $sql.= "AND $table1.site_id=$table2.site_id "; $sql.= "AND $table1.source=$table2.source "; - $sql.= "WHERE $table2.id IS NULL "; + $sql.= "WHERE $table2.id IS NULL AND $table1.archived = 0 "; if(!empty($sites)){ foreach($sites as $site){ $sql.= "AND $table1.site_id = $site->id "; From ece61a423be2b3bf89c013d48248da118157901e Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 8 Dec 2022 17:09:33 -0600 Subject: [PATCH 19/24] Add axe uri questions --- actions/update_meta.php | 3 +++ integrations/axe/functions.php | 43 +++++++++++++++++++++++++++++++++- sample-config.php | 3 +++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/actions/update_meta.php b/actions/update_meta.php index 7ab26ad3..481b62ff 100644 --- a/actions/update_meta.php +++ b/actions/update_meta.php @@ -28,5 +28,8 @@ if(!empty($_POST['wave_key'])){ DataAccess::update_meta_value('wave_key', $_POST['wave_key']); }; +if(!empty($_POST['axe_uri'])){ + DataAccess::update_meta_value('axe_uri', $_POST['axe_uri']); +}; header('Location: ../index.php?view='.$last_view.'&status=success'); \ No newline at end of file diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index 7b634423..a57a16b3 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -4,6 +4,47 @@ * Description: An automated accessibility scan. */ +/** + * axe-core Fields + */ +function axe_fields(){ + + $axe_fields = array( + + // These fields are added to the database. + 'db' => [ + + // Meta values. + 'meta' => [ + array( + 'name' => 'axe_uri', + 'value' => '', + ) + ] + + ], + + // These fields are HTML fields on the settings view. + 'settings' => [ + + // Meta settings. + 'meta' => [ + array( + 'name' => 'axe_uri', + 'label' => 'axe-core URI (ie- https://axe.equalify.app/?url=)', + 'type' => 'text', + ) + ] + + ] + + ); + + // Return fields + return $axe_fields; + +} + /** * axe Tags */ @@ -56,7 +97,7 @@ function axe_tags(){ * Maps site URLs to Axe URLs for processing. */ function axe_urls($page_url) { - return 'https://axe.equalify.app/index.php?url='.$page_url; + return DataAccess::get_meta_value('axe_uri').$page_url; } /** diff --git a/sample-config.php b/sample-config.php index 01985a20..270efb73 100644 --- a/sample-config.php +++ b/sample-config.php @@ -23,6 +23,9 @@ // Visit https://wave.webaim.org/api/ to get a WAVE key. $GLOBALS['wave_key'] = ''; +// Visit https://github.com/bbertucc/axe-equalify for more info. +$GLOBALS['axe_uri'] = ''; + // Additional options. $GLOBALS['page_limit'] = '2222'; $GLOBALS['scan_concurrency'] = '6'; From 61b02e19ee1dc2591e46b7bac22c39261bd9167d Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Thu, 8 Dec 2022 17:29:34 -0600 Subject: [PATCH 20/24] Require WAVE and axe-core settings --- actions/update_meta.php | 4 ++-- integrations/axe/functions.php | 10 +++++++++- integrations/wave/functions.php | 10 +++++++++- models/db.php | 6 +++++- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/actions/update_meta.php b/actions/update_meta.php index 481b62ff..17cc595e 100644 --- a/actions/update_meta.php +++ b/actions/update_meta.php @@ -25,10 +25,10 @@ // TODO: update logic, so the $_POST parameters are // set in the integrations file. See Github Issue #12. $account_records = []; -if(!empty($_POST['wave_key'])){ +if(isset($_POST['wave_key'])){ DataAccess::update_meta_value('wave_key', $_POST['wave_key']); }; -if(!empty($_POST['axe_uri'])){ +if(isset($_POST['axe_uri'])){ DataAccess::update_meta_value('axe_uri', $_POST['axe_uri']); }; diff --git a/integrations/axe/functions.php b/integrations/axe/functions.php index a57a16b3..5775dc0c 100644 --- a/integrations/axe/functions.php +++ b/integrations/axe/functions.php @@ -97,7 +97,15 @@ function axe_tags(){ * Maps site URLs to Axe URLs for processing. */ function axe_urls($page_url) { - return DataAccess::get_meta_value('axe_uri').$page_url; + + // Require axe_uri + $axe_uri = DataAccess::get_meta_value('axe_uri'); + if(empty($axe_uri)){ + throw new Exception('axe-core URI is not entered. Please add the URI in the integration settings.'); + }else{ + return $axe_uri.$page_url; + } + } /** diff --git a/integrations/wave/functions.php b/integrations/wave/functions.php index 22b98a9a..68a67064 100644 --- a/integrations/wave/functions.php +++ b/integrations/wave/functions.php @@ -102,7 +102,15 @@ function wave_tags(){ * Maps site URLs to Little Forest URLs for processing. */ function wave_urls($page_url) { - return 'https://wave.webaim.org/api/request?key='.DataAccess::get_meta_value('wave_key').'&reporttype=4&url='.$page_url; + + // Require wave_key + $wave_key = DataAccess::get_meta_value('wave_key'); + if(empty($wave_key)){ + throw new Exception('WAVE key is not entered. Please add the WAVE key in the integration settings.'); + }else{ + return 'https://wave.webaim.org/api/request?key='.$wave_key.'&reporttype=4&url='.$page_url; + } + } /** diff --git a/models/db.php b/models/db.php index 249e74e6..b0060522 100644 --- a/models/db.php +++ b/models/db.php @@ -839,7 +839,8 @@ public static function create_meta_table(){ // Query 1 self::query($sql_1, $params, false); - // Now, create the content in the meta table. + // Now, create the content in the meta table with axe + // as the default integration. $sql_2 = " INSERT INTO `meta` (meta_name, meta_value) VALUES @@ -848,6 +849,7 @@ public static function create_meta_table(){ ('scan_schedule', ?), ('scan_log', ?), ('scannable_pages', ?), + ('axe_key', ?), ('pages_scanned', ?), ('last_scan_time', ?); "; @@ -856,6 +858,7 @@ public static function create_meta_table(){ $default_scan_schedule = 'manually'; $default_scan_log = ''; $default_scannable_pages = serialize(array()); + $default_axe_key = ''; $default_last_scan_time = ''; $default_pages_scanned = 0; $params = array( @@ -864,6 +867,7 @@ public static function create_meta_table(){ $default_scan_schedule, $default_scan_log, $default_scannable_pages, + $default_axe_key, $default_pages_scanned, $default_last_scan_time ); From 5384dfeca995d84f8bfadd565ae133b07c677732 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 13 Dec 2022 14:44:26 -0600 Subject: [PATCH 21/24] Set default selection --- models/view_components.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/models/view_components.php b/models/view_components.php index 74c922a5..e542c39c 100644 --- a/models/view_components.php +++ b/models/view_components.php @@ -61,10 +61,8 @@ function the_active_class($selection){ } // We need to return active for the default view. - }elseif(empty($_GET['view']) && $selection == 'alerts'){ - + }elseif(empty($_GET['view']) && $selection == 'reports'){ echo 'active'; - }else{ return null; } From 47eb4c2afb4e69efe4357766f430fc6499517166 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 13 Dec 2022 14:47:16 -0600 Subject: [PATCH 22/24] Fix to close #139 --- views/report_settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/report_settings.php b/views/report_settings.php index c271f36b..bce510a4 100644 --- a/views/report_settings.php +++ b/views/report_settings.php @@ -130,7 +130,7 @@
- +

From 7339f3d78567444826bd6fe8d286801f270c0ed1 Mon Sep 17 00:00:00 2001 From: Blake Bertuccelli Date: Tue, 13 Dec 2022 14:48:34 -0600 Subject: [PATCH 23/24] Fix to close #138 --- integrations/drupal/functions.php | 7 ------- integrations/drupal/logo.jpg | Bin 8101 -> 0 bytes integrations/pantheon/functions.php | 10 ---------- integrations/pantheon/logo.jpg | Bin 11315 -> 0 bytes integrations/urlbox/functions.php | 6 ------ integrations/urlbox/logo.jpg | Bin 7012 -> 0 bytes integrations/wordpress/functions.php | 6 ------ integrations/wordpress/logo.jpg | Bin 9363 -> 0 bytes integrations/xml-sitemaps/functions.php | 6 ------ integrations/xml-sitemaps/logo.jpg | Bin 6261 -> 0 bytes 10 files changed, 35 deletions(-) delete mode 100644 integrations/drupal/functions.php delete mode 100644 integrations/drupal/logo.jpg delete mode 100644 integrations/pantheon/functions.php delete mode 100644 integrations/pantheon/logo.jpg delete mode 100644 integrations/urlbox/functions.php delete mode 100644 integrations/urlbox/logo.jpg delete mode 100644 integrations/wordpress/functions.php delete mode 100644 integrations/wordpress/logo.jpg delete mode 100644 integrations/xml-sitemaps/functions.php delete mode 100644 integrations/xml-sitemaps/logo.jpg diff --git a/integrations/drupal/functions.php b/integrations/drupal/functions.php deleted file mode 100644 index f227e039..00000000 --- a/integrations/drupal/functions.php +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/integrations/drupal/logo.jpg b/integrations/drupal/logo.jpg deleted file mode 100644 index 8daaed1534d39f3ea3114a3645771898f90912e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8101 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 E01yn|g8%>k diff --git a/integrations/wordpress/functions.php b/integrations/wordpress/functions.php deleted file mode 100644 index 5c610b1a..00000000 --- a/integrations/wordpress/functions.php +++ /dev/null @@ -1,6 +0,0 @@ --=`HkLMXJ&SK|twEnzYaf0*dr5 zgeIX#LJa|uFS^g!d!P4ue|+C}o%j5DpOu;1Yi8Cwb3Ze)X4X7}Nx}kfMq6D=9UvhA z08Qcr5Rkx)TQIw)0HCJ_Tm%4s8X$?Z1IUSpSOnlA1^^(F)yMTZL@4l#o?JT1*w8v#$e+djdqDfd+RciXbwUi*R?e>O zL_<6wVgWCA=U+IAh*@2UjUwXAU)bgkT=@$>{sVXYE@Nb7XKz8~{HRsg6XK1ti~SDL6C05H)3 zKyQQdBiBd2>mwt^q)&;XZKnVL814fA%QxaPW^PZfUHzR;Lazz{6yFJiU10#AN(O+_ z1OnkWmq0kp0|2sF0BCb0v;j=i0GgzjjO08(%0xoOL_+8Sz(n&>ko=ZE8cw_?B_pSx zq@t#wr6U%oJp+)Ekdcv+lTlFo8k{8l#C(99iGumu6%|SrgGW^7U0AOMC%&T=P_1fb zGaNz-UVH2sLPN{Wah8)yNLWPl!bK@*8Cf}b1+|;E)HO7OVC!c64@i_aJ&d z_YIGXj*U-DPE8{hmzGynf2^U_F+00^`v-^EBit`uBmmhTw21K^%>D~6CL%9Va&j_q zs$aZFNWFd$XCkLKcZHH!#enLO3(NVd!PKm(iSMe~X#}nrqS+q14$-m;N+E?Xzo`9Y z_J2n#V(~0I_su>I8<3x8wJ0z2Bx-8bvK_ zERu%X)x|a;eM`ct#=>yYBRu5IszKQ|P8ods47(NWr6fKI(3e~wXWG2w7n*;*1HAX6%!|uxZ^vySkaHu+R$z_bk^L*pQq>z8}VJ0rulK^aF{8YXG3vptE2^cij2wHs29iQj*`~0;{;}dyyM|F)@ivV&R zW`^8YFn`9RNf$U`bmu4H^iYu2R^v+`o1*@bCGRuPdlZ+$GM7-3LyUBE>K6p}e0;Ab z8bs_qxR9o+*$1kYfVbF>yoP}c&kWX*rCSKV)Lhw|Pc*Be0X8wd zr}bKepZ+4BThu&b#xvOC5M{+qJ5JZFEzG-E?$b*`tqe#VCY z>~GAT%ea8li84`i74>-3dr@5lY+z3Lu6W9xPka>5`|P12M~0!fsB-K!Pw2+WQV7>) z?Dawm*@&NtvV~RlgNzpa1r18t>TaAk2RX3z+i-3}KO<})3u~%by*jUoAb3R=%!cP< z2`)Ed*@qyFl!Z>N4=b7>U-a@<$0(_uoi?*$Qms$RJEujKFb5ik-#dLfqLqwT9Wf3T z_I9u~ArCquWLOGQI*9m?R9Wsn_hH>wq5G9-+#Aui(+{;3eo&EzPRw#WUdP$5SL9ym z;9gr~sgXYld$J&-bPZ}K=deV>T0w_de`tb6RX$l^ zIoI(bGbBoVTe_lVkc=GYBIASiA0Ul#MQU*s%5rdOaW3)Twa% zd}v=(BKx>-$!poWtfZt+yzG5*qYICufaa#}#n@yl?G2OMW(-{HL`n7Dev^klp{=Lz>puSFWJ{8IYKEHW3IN!Tz++1U}swVzbHo8ukmjHb8oY{pSAKX1w$C_zc z(zI8YP9rGBYWvh5NYgdSlaVqi?2xd1#Sg+6(5=ymR|@AgGTdd8Z~0h36P|?cd|TQT zF7BHU#!cchbTF-99!2D)Ps<#xzm4G`4J38v=RrlZ5v{Z=r%V{8oihL8!ut>jWUY8oiAVt(#9L0JIR~^AloH&Px4i zU`JM(`JT3zz|D!8K&GiIwVRDPP0p)VQN6R0ny0snF`yWCFzwW7(}QLmlR>&qCjwnr*+C3x+%;#*?wOA~bjzpQ(Q!G~@mWeY$_+op zPBvax?yH7Tj$f3oKn@G<_GC#$K*8=+cjhnrlrN7+pkOt)@hgA{LZEGyodfn>C`8Z7l-JNooC$CMJmAJAoU=Oug z;)R6M%(U~cNmiAZdGgSGHXNkbZX5@Hz<8+$D>&v_Db6#0JQto4MBRB&7?+8G$=`5o8#P0!*%I^ifr*T`HGE ziFf{7te(xa4gz5G81ml#%JJoAvUEioKDV`k7vlUp>0j3GGvJ^Xj&H%7js<%9OI1Hb zLc=sQQLBg@xs$r=o;oQ(b~T7M6nk0a^z*=6sIHT*tv)qbd0(!7KsHFm}|XzrhH|T3TG2lA()vw z(QnKj!2QB%hHV!Vsc1u7Zb6roc}yMc%kJI@=O@E^_XT(m0QhT-6Y7cY(~b#^91%G~ z?s#RyvvaX=n?*qZ`MX+c(nUKQT~6E^5awnFj-cl2@-J>5Yu0h!CNF2?Q%Br0=K-l? z;PN`)BGxE}W2l0Gw5Ky^ae0<5j4`sD$co4^%5C?iMk z{LIRSr5=Qir9#J?95y$lc2~{{$iqe#GB2CgAI2Bd`X}e1WK7vp?ekEdS7uDrtJLBB z8$W%ree~@~m32=)?CB}=S%B_V2lJ;a4aTU(a5(FQyT$AEwA@9?hWTA9Jdq!Atf=Yt zUQH2^_!(3kfI*0$%sIBS2mqfl9|0&&h4d*LfI=ZVx;0?jA_2fjqxKjJQvL2@bv~ec z6!DU1)4Dg_1@Q_d$j8M)72@g&Y#Tqt>=&S2$E{~g2a%^9CttL?$)hi9h~IA)Iejl^ zGaFGkb!-10J}ffRY)&Cd8y#4)o~MS@Pv-lF|=sUW{Zgc z2!0R5;X;ox7F%r?oHR!iFBGX2e(!v~6<{JB$C|jp|CI)1QStYJJD}iJ2EPkSmW=c3 zT&GR_QXCP27gwC&rZSRBpWi*_y}iAZ-PH<`4VO^7oNpntvYKOH*>^q6rG!#2vFElV zRSWbq^Mu9!gI!}}R4t6&zUbmDa#u#(XFBZs2O?*2&|+KSdno|CmR$Cw{8f^6W{IxO z((Yo*g?k37g|s;jN!mzX?|tO0ZNPxG#PaNLUQv5Z{b!jeo9Z6%-(bD+@{=4d+64=3 zg^9F%XBxwU*COu>m#x@mDU%7j;*PfMx$X1gd$ZX=9sx+G3nc*N!o)2{N=ZeJJ{MN3 zqfsIWCnbpx3bTCD;5xu3nL~xpJv{%mPNb;c)-?REQ$Lm=2gTBy0-mO`#jqq`wA<+8 zw?!S{x$yN-_bgfC`lK1dy0}I8J9$)h0`AU;y!V?!cOuyaa08GtCs1Fuy5{W~}fv451LmgX$)R||0)@dAK=V%okaYOx#ynxg5IQ*Ed=6-erocT?=CvH6UOj+V+{@a1% z%uYdKMEq+7zs(WBP0PLjh$89T|9g?B|P$2X9mNz z*V;}1URWW9`t#QdE7!-1R(UhUixTKaCPUOUS{Q7_-d@7^n#5g>9k*L_w{y2Ad)^^Y z{Fwh*rdPj>@~3Wp1BS>DMeAH|^8~G zqL5x5N23HEzP!DPSG5qTliOGwPY-U9*ACx)Y_WIM+zhO1X=T!Pp2WE=%!gGdauPR{ z!immt=k(N0`P9K1=Vx{*PZW+P>Y$;1eAs3`k5$`@K5^4hrla8G@N`NNe$Pj5HQxJv z(cz*M%}wYaewKp>6Mt@x7(t6Rk=7VUNbMz=Nf!4)k$Qxs3`@(6Lpj9K0}hPL2%g=t zqeTqC<+I%~!usYF7{`JLY?0%1u%~mp4v?3I#bnSs5-E0Tk zmiN77iV6YnC(}D*-t@D3Z__?c;c-bTqJNvsf=;dpT-}}ZW9>FNAh$7o>P;7MTQs&0 zqWy~189lzqPXGoru@9B{G6_JNecEY`hc6VPR3Bc`ZL+zi>3L*#c(WROg#f6w#@T=N z6ROZd#xtX)_c*^~u5VIdgq=6AMdwT0^)?6VT5a_i2!I2YsrD??9e1-t4ql83FGt|n(d2keaS@>G!Vpbaqd{=1d7 zgc@g-_A3Pg%Yn`9M!umB#?XN}O?BwzjGy^UPR(j=5_zIZH(s5DqH4&n69Rz@_3^d7 zmXY7NRlwmj>}rKN;Mv!C$0=*RJ692yEz27{(ahoog+@2nZY%%_BwCf4{?6GfiVBJb z3;t$W_vWsI^@A$XIlg|v5f3?<8ZT-qtDmNw$c7eUi``K#o-Nnd#sHVJ=z#X&DNq z%nA@UH?Cv}t5(^J9yW;F&o1 zhq^V#h1c;f;36m;$lZKo;Cknik__XqX5+&MQMh@h>I`~MbcY~shwIS2l0@xDuaXbyS z1Iz-m7|2jU%`ttodZL(S9tYwn+FOQ>;2E)HNHE7FLJ{gRHD`60vRi36BE$){_3%W9ca6Jz-ctWTvjEUc>UJHRZ z(rE%P&zgt)5kk^CVIJs~$dkqkWY~V&qSn6%Z)#*2 z;Vkc5sPDX>NKs(Ek#R6OT5*Pw978U!%AakhZZ<;NlG}M}Sn6H9UUkF_z9HxCQE*0! z;+ffYq1q0b^RKlP-o_G#0WRk9w@af(p$Aczw~=m0-$0Pvgv*?TzH8E_=unC{$=M{i zl_H1swG><7v+j;+AT>h+40wxok@xa_4Bs2O59UIHlVy{dLkWFc>R)H$ z7Jxvm{Vb3kI-58F!f+aq!cE~GboNFu;+4CP-wMqf`XspY^4{{9I1y_lBW_pNC-B%3 zPi0#4+jKA9{fO626kQq@&Pz}$$rZ!HCXeXaz-RU=!ZKD6p?((Jb=f@O_kGf|@KXEg zJd5yJOE6YJ?^12lzP)Fik;H9G6JW#b^J9iB&}L2N6(54!m>{-w(&#`NMJ9m>4k``4pO^V0V{)f;yy7gnXGTYMh+7`R`p`7VLB{+=#0fXm9S zbBql5VMv=er%yaq_=1-0?ATqDs94N8FC3{>XCJkd7D7g2Nu4)A^LcNvr4!Fu&>3HI zT5x>9=f~5f>YWPh%8|{QCZmrdIXWgl<#{Rs9otNggk5>tthD0dOvnj z<*~}p-lbDZ3DTuq;$A4|jA%I4KQN5V+@$vmFtX)(%Z;}0#H>SD_w`wA4WvxjUZtL= zYNzcmym!W*HF+!8^2xnR5WUJ_2WEtBy^cK$zpgG547HPW))dW+Q6p|Yf*^l)l@&ho zv5u&IB$Hm$QO`a>YcLd{LRm3%gO7Urttj^4N7GW!;$<4R#;X9|7uHHps_mTe!8X(S zpznPqiUMvt24BQ<$4h5SWuH@$aKA?N@@@<(V9Xg?(1Y#xbFbzs?$i0^WzWyBux4j0 zW_9^BEVc$im^_pmk4+eyV28=g108y;{?R?4N8gMurEYFxC|5dWg<3uyK1~3BgANk_ zbcytv+fq&(&x{Kd1lSTl-3@tow#X<)xW(Nb)7YW6g~4|rQLDv^RTX&;P_2y3oYurc zPH6DT$EYq79`-x8$LJ0}nO{blKlf4=zy_19y=AHmWQ08m(2|())Vb(ol3YkN-sI1L z)DNxk9>YM8{V&fzVEm9TKl)xy4QWL-@Vth_H`}j3p563wbixM0SpF! zCgB3mI8agZbG#0Ko*obe02~9ba7RE)U<4DuMkoLfWf1+|0xQUX|IPvKuoGGW^7=Pi zy<9zSxVmvmi~j=T&uQrqA9^6*i1Qy&+8)m6fjICh@q94ZlW+KQLC^$|jMn+{R{Dl0 zbuC@Bqe&6**|@pgJRIzD%ge)1;~e*utESwDaeyFPRDc<9+t_-#sp{+N9{T+KdF20( z>U-bO+`(tDLth`*5<~gXw0iO>482_oOrd|6{l|pd&fe3O(6vV>_O@;wUW7#05jd}} zm)jwaAaF(x!lVfN*&%oM!CxQpYd?77k%SLX_I?B%0GxMqyY1oVaKnpRm5?QSZmnCk;-cJAzevgf zaG3KSQP&NQatUMp_-9+#C;&<|5Cm2J*`{3sKnYP>9Ucr2|=!{o&9x(8;(w%Ufw>wez*O@?%ul}9`PXZ zQNrWIq~s?lPcyT!b8_=u<`?{0`ljqH_P6qi`i92$P0cN>AG$yH^!D|C85kU&n4FrP znVp+oSY2D+*!;eQ-`+XY1q1LOvIzALWq;E}N66%9uIWwQkIREOQv?FEzIbosyEoFZQ`%~9fa2^mJ zfs~k-l#G;=l#G&$07@FlL(tIE9D)9yU^)WpAvpd3L~sHlCLuu}5R`6 zu-%1EU(+W3K2t4m*kTLMQxhKs9}~4mk@_V?n+YmG^Ifh|g{SgUYg2{=@|`0rU}MU} zVKR?2FKgeV>-)bAIOunwQ=Q-hi=I*=t`||9(^XXeo`Syvzm(%360xDMy zE|_#U8suCo(mbQ%g4s@2>$+0S)njGURpgq@-O97qi1y<^PFosGq_Zyi3=Y39PW7+} zWq2*#qZraUjq-1x3CTAt%-8VpnkW^P_m{++d9&nvdm$i(X(kBSUuHH+w%~uSz3$P> zv1z+I1+q)Ju>g)yjGPTbPNW4Gu9B3cEe#~G!j~;xO5f%407}lNZwpB;m*2HRV2o9C zFe;H{;9%XQh7)xwGg9QE(!?>sx)u+CZrSD; zy3Z?i91@o5RKVYxsdJI7YEUrTp?8^9u@4t+H%H+fuZxStN<{1_*cYML-t%`e3zgS4 zFik3c&!CR|AM8UkP~YFyiVzpNjZbxvhyE~_rqWd@VR|X^1oU<(WZ0+35 zT7%_l$(?7;1ZY&6<zz(=h4L)1$f~VeXLE@`?4l~dKKPHj1rFINp*RT z%hmIuNrhEAk0dR9EKb_Y_2u&yIPdJC%w(h8{URByHyq3M17pK$pLU!2`RZRq?fD~r z@r>m_M_^=kMU&t9R#c_%^O>g`duYA971WhGWHG;o=`d(6?sm6~9JKmU%~`4`TeU2p zurPpx8KuUDZWAx5hb= zvq>P*m}1>pPDnjyDbOyz<82f;U>FJwBUsmmwst3^%xq*+mRV!f~h8eR8}p zfikOoSw-vu<)1Or4icfNCj772ODVT7uDGq>D#>x@ymwtigRB-lC61g;XQTCQU0Gxk zf8!9^w7{N4A>)zxu#v8g*gq&SGvY79w*F^)e3$wQC_t* z>wOayLn70bFP1bhdozSujuL}dFGfv@hh#Xq&2K%uKxew(F(h12Pn5(WD9;rW>(u|= z^-L=+c~E+0d$Cf<^Kk|hDyq+auY%mkxFRmm`e8x4Ypk7T!n6G|##Rkz3VgkuoK_!C zzqVuEEOWZ7Y&bV2j}O^VsT_%3Lrw1p9)vny8V{4$<2F@kX^m+TDYNavZVll_4D>0poE|WknZfb{nes&{DgoYn3hFA@wirbT_;*gkmKT~|neV5YKkXz*Cbc9w=A|%Q{=LuwZn=uS7ii-$ zuFPbKzM&eJ*ZMeCb@rkE_a-V0+akZ_34x*j>Nxa%LhhiZ$;rlW1gA=;lK(_`k%?Nx zrvpBG(BQi9Z@qTchfK$@Qr=@8ZdAaVu(=vcC^0k*TI4?9m48Ytw!U_z#F~t2wEN{k zh1~l#c8yiKK40zN58v~nxj810UX$~B_~?0LBLrxwqM0t(@;#%e>RmeE?h)NsVqRWb zR?{>VP!J4jb~XQmV9MB2Iq1SMj+{(`n_q1@@Q?s4VLLc9+n9{ARb-Gvi4}wCVwBUb z_Ai0~W3V3!2YS>9gR|Aui6b2q&tj2HPLLmjfOo=;OL#XmwfsPZenl}?_X0l&)1(n0 zqg>hLsS`%q5uB=Hz8N&;xYkv&?t}w+8;u+DEG>xr^e6i${|z+tuwUi*&k{4Mjqz<%k4l?Q zFAdFQDV#vRY?mHa+D}^v*}yNQ>6nGbs&N`&OQr%ssVrB=^>pe@+hd~h#Twnt&UJ;@ zggm2FVBN}~5&w)i%NMBO=uIV|&vy0+N5pH;LGyAuu13B{jQ#yt30(4nqCmMx$E1Z3 z2#An0F>*G9v@9kBdv@|vpu(`K64e3&X7B&XrlZzq2G{qvQ z@tVDe3e>*aLGEwJPzbE9Pat=8WMC_d25R811r7E8>wmO#Q%7OtoBbPX`nPuO<|oJ9 z;a}{~r$1#DNVz*{ro7h{m$-iWAY_c)g?`Vf)$@CWs}H%k*OT`gFT@1M7jEqU?&l_PS1=R7%hafNbB zsCJSEd!x|)!7FjIw(+kmBl6mkv(qu<*mcDfZ5+{jyyXRn=+L#{F~SOusce$oiglmA z0s&k>76dXAUL? z80gQLKke^m>c!?SyGk_a&eEySq0H8mS%QhdSP1nd_P2~uCEL92_Q;};n}LAw2@uV7 zzsmV4UOLChO6R4c+}gZ{whmLwc_G1KAQEEPuIBzcWGaXquaS47;+cPS&K-e#cN)p< zNG8?II;dXH{{lmNGkzjq4Wly0y(2B>RmDki# z9WbcF_^4Aj7`FR)ZE=PJ;@6T*`fi;%mSsJ1RWEq5Uv%`tyL!T?mE(AFB$HOo>EZnt zFYHJG?`UPB{BB!Z<%$J!%?m2uhAlR_)K-S3{27q_6b+PM(E;O}TnfP1?G}do?bWKTZUHiT?q_z7s7Jb6a4%S zg*ls_;hfB-S$?gPLu-HX5sb1bi0L}b-5u}ZoZN-iR@%2j?W8oE7n2c24! z(MPn`Fn+V?sph$nbR4-b8!Tdr;eX{)jWBDI-&HSn7t2gfqJI`LUx_|wvn)f8r%_z$ z$>?1vVm52DiOA*;G3c~bSs5~30-o!5XWi6>*#^xbs+6b?`y+5zw1a#TDoCVVdEC(H ztm@~uNLS_3h`P65>#TIQpX`ea&Sg*wEY?<-KW9j;H;(T6r1@&M7UuFnbx4C%5PnMT zZXnWmT#w|<3CYS>4F@0ZuW4gMk_kWX+@)V=Cf@IRz^D{eC)gg z@}93HElxIN{20HPZ$Qeja$h?)tE+3?gmYPDu%eX-UOI2YsvVuRaLLi-471$@%BnRL zSOO6?5Q%Hk#^o$7#JFv375>5>uk!VIHuXhR-#c-_$LyrXlPGFTh$%Oc;=iWC;zZhp zE1&HzH6Y`Q(pmj%0xdGDWBUbqq{G*VT<4B8NmW;u^%|(K1aWj}gm0YDW7M0Cx;!w$ z^tJMlXY@1g%|aw8o Date: Tue, 13 Dec 2022 15:03:03 -0600 Subject: [PATCH 24/24] Close issue #137 --- integrations/wave/functions.php | 2 +- theme.css | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/integrations/wave/functions.php b/integrations/wave/functions.php index 68a67064..44ffba68 100644 --- a/integrations/wave/functions.php +++ b/integrations/wave/functions.php @@ -186,7 +186,7 @@ function wave_alerts($response_body, $page_url){ }else{ $appended_text = ''; } - $alert['message'] = $wave_item['description'].$appended_text.' - WAVE Report'; + $alert['message'] = $wave_item['description'].$appended_text.' - WAVE Report (opens in a new tab)'; // Push alert. $wave_alerts[] = $alert; diff --git a/theme.css b/theme.css index 6d342f90..d2ba4eb7 100644 --- a/theme.css +++ b/theme.css @@ -66,4 +66,11 @@ pre code{ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ -} \ No newline at end of file +} +.screen-reader-only { + position: absolute; + width: 1px; + clip: rect(0 0 0 0); + overflow: hidden; + white-space: nowrap; + } \ No newline at end of file