testilo 10.1.0 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/procs/digest/tdp24/index.html +54 -0
- package/procs/digest/tdp24/index.js +120 -0
- package/procs/score/tic21.js +1 -1
- package/procs/score/tic24.js +6953 -0
- package/procs/score/tsp23.js +2 -2
- package/procs/score/tsp24.js +734 -0
- package/specs/scripts/ts24.json +225 -0
package/package.json
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html lang="en-US">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="author" content="Testilo">
|
|
7
|
+
<meta name="creator" content="Testilo">
|
|
8
|
+
<meta name="publisher" name="Testilo">
|
|
9
|
+
<meta name="description" content="report of accessibility testing of a web page">
|
|
10
|
+
<meta name="keywords" content="accessibility a11y web testing">
|
|
11
|
+
<title>Accessibility digest</title>
|
|
12
|
+
<link rel="icon" href="favicon.png">
|
|
13
|
+
<link rel="stylesheet" href="style.css">
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<main>
|
|
17
|
+
<header>
|
|
18
|
+
<h1>Accessibility digest</h1>
|
|
19
|
+
<table class="allBorder">
|
|
20
|
+
<caption>Synopsis</caption>
|
|
21
|
+
<tr><th>Page</th><td>__org__</td></tr>
|
|
22
|
+
<tr><th>URL</th><td>__url__</td></tr>
|
|
23
|
+
<tr><th>Requester</th><td>__requester__</td></tr>
|
|
24
|
+
<tr><th>Test date</th><td>__dateSlash__</td></tr>
|
|
25
|
+
<tr><th>Score</th><td>__totalScore__</td></tr>
|
|
26
|
+
<tr><th>Tested by</th><td>Testaro, procedure <code>__ts__</code></td></tr>
|
|
27
|
+
<tr><th>Scored by</th><td>Testilo, procedure <code>__sp__</code></td></tr>
|
|
28
|
+
<tr><th>Digested by</th><td>Testilo, procedure <code>__dp__</code></td></tr>
|
|
29
|
+
</table>
|
|
30
|
+
</header>
|
|
31
|
+
<h2>Introduction</h2>
|
|
32
|
+
<p>This is a digest of results from a battery of accessibility Tests.</p>
|
|
33
|
+
<p>The battery includes 1353 automated accessibility tests drawn from ten different packages: Alfa, Axe, Continuum, Equal Access, HTML CodeSniffer, Nu Html Checker, QualWeb, Tenon, Testaro, and WAVE.</p>
|
|
34
|
+
<p>These tests were run on the web page named above and gave the page a score of __totalScore__, where 0 would be <q>perfect</q>.</p>
|
|
35
|
+
<h2>Score summary</h2>
|
|
36
|
+
<table class="allBorder secondCellRight">
|
|
37
|
+
<caption>Score components</caption>
|
|
38
|
+
<tbody class="headersLeft">
|
|
39
|
+
__scoreRows__
|
|
40
|
+
</tbody>
|
|
41
|
+
</table>
|
|
42
|
+
<h2>Issue summary</h2>
|
|
43
|
+
<h3>Special issues</h3>
|
|
44
|
+
__specialSummary__
|
|
45
|
+
<h3>Classified issues</h3>
|
|
46
|
+
__issueSummary__
|
|
47
|
+
<h2>Complete report</h2>
|
|
48
|
+
<pre>__report__</pre>
|
|
49
|
+
<footer>
|
|
50
|
+
<p class="date">Produced <time itemprop="datePublished" datetime="__dateISO__">__dateSlash__</time></p>
|
|
51
|
+
</footer>
|
|
52
|
+
</main>
|
|
53
|
+
</body>
|
|
54
|
+
</html>
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/*
|
|
2
|
+
index: digester for scoring procedure tsp24.
|
|
3
|
+
Creator of parameters for substitution into index.html.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// CONSTANTS
|
|
7
|
+
|
|
8
|
+
// Newlines with indentations.
|
|
9
|
+
const joiner = '\n ';
|
|
10
|
+
const innerJoiner = '\n ';
|
|
11
|
+
const specialMessages = {
|
|
12
|
+
log: 'This is based on the amount of browser error logging and miscellaneous logging during the tests.',
|
|
13
|
+
preventions: 'This is based on tests that the page did not allow to be run. That impedes accessibility progress and risks interfering with tools that users with disabilities need.',
|
|
14
|
+
solos: 'This is based on issues reported by unclassified tests. Details are in the report.'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// FUNCTIONS
|
|
18
|
+
|
|
19
|
+
// Makes strings HTML-safe.
|
|
20
|
+
const htmlEscape = textOrNumber => textOrNumber
|
|
21
|
+
.toString()
|
|
22
|
+
.replace(/&/g, '&')
|
|
23
|
+
.replace(/</g, '<');
|
|
24
|
+
// Gets a row of the score-summary table.
|
|
25
|
+
const getScoreRow = (component, score) => `<tr><th>${component}</th><td>${score}</td></tr>`;
|
|
26
|
+
// Gets the start of a paragraph about a special score.
|
|
27
|
+
const getSpecialPStart = (summary, scoreID) =>
|
|
28
|
+
`<p><span class="componentID">${scoreID}</span>: Score ${summary[scoreID]}.`;
|
|
29
|
+
// Adds parameters to a query for a digest.
|
|
30
|
+
exports.makeQuery = (report, query) => {
|
|
31
|
+
// Add an HTML-safe copy of the report to the query to be appended to the digest.
|
|
32
|
+
const {acts, sources, jobData, score} = report;
|
|
33
|
+
const {target, requester} = sources;
|
|
34
|
+
const reportJSON = JSON.stringify(report, null, 2);
|
|
35
|
+
const reportJSONSafe = htmlEscape(reportJSON);
|
|
36
|
+
query.report = reportJSONSafe;
|
|
37
|
+
query.ts = 'ts24';
|
|
38
|
+
query.sp = 'tsp24';
|
|
39
|
+
query.dp = 'tdp24';
|
|
40
|
+
// Add the job data to the query.
|
|
41
|
+
query.dateISO = jobData.endTime.slice(0, 10);
|
|
42
|
+
query.dateSlash = query.dateISO.replace(/-/g, '/');
|
|
43
|
+
query.org = target.what;
|
|
44
|
+
query.url = acts && acts.length > 1 && acts[1].which;
|
|
45
|
+
query.requester = requester;
|
|
46
|
+
const {issueDetails, summary} = score;
|
|
47
|
+
const {total, issues} = summary;
|
|
48
|
+
if (typeof total === 'number') {
|
|
49
|
+
query.totalScore = total;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log('ERROR: missing or invalid total score');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Add the total and any special rows of the score-summary table to the query.
|
|
56
|
+
const scoreRows = [];
|
|
57
|
+
const specialComponentIDs = ['log', 'preventions', 'solos'];
|
|
58
|
+
['total'].concat(specialComponentIDs).forEach(item => {
|
|
59
|
+
if (summary[item]) {
|
|
60
|
+
scoreRows.push(getScoreRow(item, summary[item]));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Add the group rows of the score-summary table to the query.
|
|
64
|
+
issues.forEach(issue => {
|
|
65
|
+
scoreRows.push(getScoreRow(`${issue.issueName}`, issue.score));
|
|
66
|
+
});
|
|
67
|
+
query.scoreRows = scoreRows.join(innerJoiner);
|
|
68
|
+
// If the score has any special components:
|
|
69
|
+
const scoredSpecialIDs = specialComponentIDs.filter(item => summary[item]);
|
|
70
|
+
if (scoredSpecialIDs.length) {
|
|
71
|
+
// Add paragraphs about them for the issue summary to the query.
|
|
72
|
+
const specialPs = [];
|
|
73
|
+
scoredSpecialIDs.forEach(id => {
|
|
74
|
+
specialPs.push(`${getSpecialPStart(summary, id)} ${specialMessages[id]}`);
|
|
75
|
+
});
|
|
76
|
+
query.specialSummary = specialPs.join(joiner);
|
|
77
|
+
}
|
|
78
|
+
// Otherwise, i.e. if the score has no special components:
|
|
79
|
+
else {
|
|
80
|
+
// Add a paragraph stating this for the issue summary to the query.
|
|
81
|
+
query.specialSummary = '<p>No special issues contributed to the score.</p>'
|
|
82
|
+
}
|
|
83
|
+
// If the score has any classified issues as components:
|
|
84
|
+
if (issues.length) {
|
|
85
|
+
// Add paragraphs about them for the group summary to the query.
|
|
86
|
+
const issueSummaryItems = [];
|
|
87
|
+
issues.forEach(issue => {
|
|
88
|
+
const {issueName, score} = issue;
|
|
89
|
+
const issueHeading = `<h4>Issue ${issueName}</h4>`;
|
|
90
|
+
const wcagP = `<p>WCAG: ${issueDetails.issues[issueName].wcag || 'N/A'}</p>`;
|
|
91
|
+
const scoreP = `<p>Score: ${score}</p>`;
|
|
92
|
+
const issueIntroP = '<p>Issue reports in this category:</p>';
|
|
93
|
+
const issueListItems = [];
|
|
94
|
+
const issueData = issueDetails.issues[issueName];
|
|
95
|
+
const toolIDs = Object.keys(issueData.tools);
|
|
96
|
+
toolIDs.forEach(toolID => {
|
|
97
|
+
const testIDs = Object.keys(issueData.tools[toolID]);
|
|
98
|
+
testIDs.forEach(testID => {
|
|
99
|
+
const testData = issueData.tools[toolID][testID];
|
|
100
|
+
const {score, what} = testData;
|
|
101
|
+
const listItem =
|
|
102
|
+
`<li>Package <code>${toolID}</code>, test <code>${testID}</code>, score ${score} (${what})</li>`;
|
|
103
|
+
issueListItems.push(listItem);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
const issueList = [
|
|
107
|
+
'<ul>',
|
|
108
|
+
issueListItems.join('\n '),
|
|
109
|
+
'</ul>'
|
|
110
|
+
].join(joiner);
|
|
111
|
+
issueSummaryItems.push(issueHeading, wcagP, scoreP, issueIntroP, issueList);
|
|
112
|
+
});
|
|
113
|
+
query.issueSummary = issueSummaryItems.join(joiner);
|
|
114
|
+
}
|
|
115
|
+
// Otherwise, i.e. if the score has no classified issues as components:
|
|
116
|
+
else {
|
|
117
|
+
// Add a paragraph stating this for the issue summary to the query.
|
|
118
|
+
query.issueSummary = '<p>No classified issues contributed to the score.</p>'
|
|
119
|
+
}
|
|
120
|
+
};
|
package/procs/score/tic21.js
CHANGED