Skip to content

Commit a04e41f

Browse files
committed
Reimplement associated techniques as data
1 parent 675a92f commit a04e41f

File tree

104 files changed

+2109
-7027
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+2109
-7027
lines changed

.eleventyignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ understanding/*/identify-changes.html
1919
understanding/*/interruptions-minimum.html
2020
understanding/*/seizures.html
2121

22+
# Ignore typings
23+
**/*.d.ts
24+
2225
# Ignore templates used for creating new documents
2326
**/*-template.html
2427

11ty/CustomLiquid.ts

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -254,22 +254,10 @@ export class CustomLiquid extends Liquid {
254254
throw new Error("Incorrectly-nested Benefits section found: please resolve.");
255255
}
256256

257-
// XSLT orders resources then techniques last, opposite of source files
258-
$("body")
259-
.append("\n", $(`body > section#resources`))
260-
.append("\n", $(`body > section#techniques`));
261-
262257
// Expand top-level heading and add box for guideline/SC pages
263258
if ($("section#intent").length) $("h1").replaceWith(generateIncludes("understanding/h1"));
264259
$("section#intent").before(generateIncludes("understanding/about"));
265260

266-
$("section#techniques h2").after(generateIncludes("understanding/intro/techniques"));
267-
if ($("section#sufficient .situation").length) {
268-
$("section#sufficient h3").after(
269-
generateIncludes("understanding/intro/sufficient-situation")
270-
);
271-
}
272-
273261
// Disallow handwritten success-criteria section (should be auto-generated)
274262
if ($("section#success-criteria").length) {
275263
console.error(
@@ -281,21 +269,7 @@ export class CustomLiquid extends Liquid {
281269
// success-criteria template only renders content for guideline (not SC) pages
282270
$("body").append(generateIncludes("understanding/success-criteria"));
283271

284-
// Remove unpopulated techniques subsections
285-
for (const id of ["sufficient", "advisory", "failure"]) {
286-
$(`section#${id}:not(:has(:not(h3)))`).remove();
287-
}
288-
289-
// Normalize subsection names for Guidelines (h2) and/or SC (h3)
290-
$("section#sufficient h3").text("Sufficient Techniques");
291-
$("section#advisory").find("h2, h3").text("Advisory Techniques");
292-
$("section#failure h3").text("Failures");
293-
294272
// Add intro prose to populated sections
295-
$("section#advisory")
296-
.find("h2, h3")
297-
.after(generateIncludes("understanding/intro/advisory"));
298-
$("section#failure h3").after(generateIncludes("understanding/intro/failure"));
299273
$("section#resources h2").after(generateIncludes("understanding/intro/resources"));
300274

301275
// Expand techniques links to always include title
@@ -438,8 +412,8 @@ export class CustomLiquid extends Liquid {
438412
if (scope.guideline?.level === "") $("section#techniques").remove();
439413
}
440414

441-
// Process defined terms within #render,
442-
// where we have access to global data and the about box's HTML
415+
// Process defined terms within #render, where we have access to
416+
// global data and the rendered HTML for the About box and related Techniques
443417
const $termLinks = $(termLinkSelector);
444418
const extractTermName = ($el: CheerioAnyNode) => {
445419
const name = $el

11ty/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,77 @@ Maintenance tasks (for working with Eleventy config and supporting files under t
2828
- `npm run check` checks for TypeScript errors
2929
- `npm run fmt` formats all TypeScript files
3030

31+
## Associated Techniques Data
32+
33+
Each success criterion's page contains a Techniques section which links to associated techniques.
34+
These used to be defined directly in HTML in each respective page, but have since been relocated to
35+
a single data file, `understanding/understanding.11tydata.js`, under the key `associatedTechniques`.
36+
37+
This field is typed, in order to provide some degree of autocomplete in IDEs that support TypeScript
38+
(e.g. Visual Studio Code), as well as some amount of immediate feedback while editing.
39+
Further validation is performed when running the build or dev server, to provide more focused error messages for common mistakes.
40+
41+
### Listing Techniques
42+
43+
Techniques may be indicated via an object as outlined below, or using a shorthand string.
44+
Shorthand strings may function as either `id` or `title` seen below, and are
45+
recommended for brevity when no `using` or `and` relationship is present.
46+
47+
The following list outlines properties available on each technique object:
48+
49+
- `id` - Technique ID
50+
- `title` - Technique description (HTML flow content allowed), to define free-form entries that don't reference a specific technique
51+
- `using` - Optional array of further techniques to be populated into a child list
52+
- Child techniques may also include `using`
53+
- `usingConjunction` - When `using` is specified, this overrides the word that appears before `usingQuantity`
54+
- Default: `"using"`; HTML flow content allowed
55+
- `usingQuantity` - When `using` is specified, this overrides the word that appears after `usingConjunction` and before "of the following techniques"
56+
- Default: `"one"`
57+
- May be empty string (`""`), in which case the subsequent "of" is dropped
58+
- `usingPrefix` - Adds text to appear before `usingConjunction`
59+
- `skipUsingPhrase` - Omits the entire "... using ... of the following techniques" phrase
60+
- This is mainly an escape hatch for rare instances where a child list is used but no "using" phrase appears at all (e.g. in 1.4.4: Resize Text)
61+
62+
Typically, either `id` or `title` is required.
63+
If `id` is specified, then `prefix` and/or `suffix` may also be specified (with HTML flow content allowed in each),
64+
resulting in "{prefix} {linked technique title} {suffix}".
65+
66+
In extremely rare cases, `using` may be specified alone without either `id` or `title`,
67+
e.g. for top-level "Using two or more of the following" in 2.4.5: Multiple Ways.
68+
69+
#### Conjunctions
70+
71+
To represent multiple parallel techniques, an `and` key may be specified instead of `id` or `title`. In this case, the following properties are supported:
72+
73+
- `and` - an array of technique objects or shorthand strings (as described above)
74+
- `using` and its related fields (seen above) may optionally be specified alongside `and`
75+
- `andConjunction` may optionally be specified alongside `and`,
76+
to override the default `"<strong>AND</strong>"` phrasing (e.g. in 4.1.3: Status Messages)
77+
- Techniques listed _within_ `and` should be flat, never containing `and` or `using`
78+
79+
### Situations or Other Subsections (Sufficient only)
80+
81+
The top level of the `sufficient` array may consist entirely of either technique entries (see above)
82+
or subsection entries. It should not contain a mix of both.
83+
84+
Subsections are typically used to define multiple "situations", where each title begins with "Situation A:", "Situation B:", etc.;
85+
in rare cases it is used for other purposes, e.g. in 1.4.8: Visual Presentation.
86+
87+
Subsection entries contain the following:
88+
89+
- `title` (required, HTML allowed)
90+
- `techniques` (required) - array of technique entries (see above)
91+
- `note` (optional, HTML allowed) - content to appear in a Note at the end of the subsection (e.g. in 4.1.3: Status Messages)
92+
- `groups` (optional) - array of objects with `id`, `title`, `techniques`; see more below
93+
- `techniques` within `groups` are not expected to involve `and` or `using`
94+
95+
#### Groups within Situations
96+
97+
Most of the situations in 1.1.1: Non-text Content include groupings which start with a boldface paragraph (not a heading),
98+
and are referenced one or more times within preceding "using" clauses.
99+
Groups can be defined at the top level of each situation/section entry as mentioned above.
100+
Defining `groups` automatically implies a "using" relationship, without explicitly defining `using` for each technique.
101+
31102
## Environment Variables
32103

33104
### `WCAG_CVSDIR`

11ty/guidelines.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,27 @@ export const actRules = (
3535
JSON.parse(await readFile("guidelines/act-mapping.json", "utf8")) as ActMapping
3636
)["act-rules"];
3737

38-
/** Version-dependent overrides of SC shortcodes for older versions */
39-
export const scSlugOverrides: Record<string, (version: WcagVersion) => string> = {
40-
"target-size-enhanced": (version) => (version < "22" ? "target-size" : "target-size-enhanced"),
41-
};
38+
/** Generates version-dependent overrides of SC shortcodes for older versions */
39+
export const generateScSlugOverrides = (version: WcagVersion): Record<string, string> => ({
40+
...(version < "22" && {
41+
"target-size-enhanced": "target-size",
42+
}),
43+
});
4244

4345
/**
4446
* Flattened object hash, mapping each WCAG 2 SC slug to the earliest WCAG version it applies to.
4547
* (Functionally equivalent to "guidelines-versions" target in build.xml; structurally inverted)
4648
*/
4749
async function resolveScVersions(version: WcagVersion) {
4850
const paths = await glob("*/*.html", { cwd: "understanding" });
51+
const scSlugOverrides = generateScSlugOverrides(version);
4952
const map: Record<string, WcagVersion> = {};
5053

5154
for (const path of paths) {
5255
const [fileVersion, filename] = path.split("/");
5356
assertIsWcagVersion(fileVersion);
5457
const slug = basename(filename, ".html");
55-
map[slug in scSlugOverrides ? scSlugOverrides[slug](version) : slug] = fileVersion;
58+
map[slug in scSlugOverrides ? scSlugOverrides[slug] : slug] = fileVersion;
5659
}
5760

5861
return map;

0 commit comments

Comments
 (0)