Skip to main content

wcag-em-report-to-rst.ipynb (Source)

Convert a WCAG-EM report tool JSON file to reStructuredText

This script converts the JSON file you get from the WCAG-EM Report Tool into reStructuredText markup.

It needs the following files:

In [ ]:
In [ ]:
!curl > WCAG_text.json

Load the report data, and the WCAG criterion data

In [ ]:
report_json_filename = 'product-evaluation.json'
In [ ]:
from collections import defaultdict
import json

with open(report_json_filename) as f:
    data = json.load(f)

with open('wcag.json') as f:
    wcag = json.load(f)

with open('WCAG_text.json') as f:
    wcag_text = json.load(f)

wcag_ids = {v['id']: v for v in wcag['2.2'].values()}

criteria_names = {k: v['TITLE'] for k,v in wcag_text['SUCCESS_CRITERION'].items()}

criteria = defaultdict(list)

for item in data['auditSample']:
    id = item['test']['id'][len('WCAG22:'):]

For each criterion, gather info from the report

In [ ]:
report = []

def indent_lines(text, indent):
    lines = text.split('\n')
    return lines[0]+'\n'.join(indent+line for line in lines[1:])

for key, criterion in criteria.items():
    description = ''
    result = ''
    for item in criterion:
        if 'description' in item['result']:
            description = item['result']['description']
        if 'Website' not in item['subject']['type']:

        result = item['result']['outcome']['title']

    result_map = {
        'Passed': 'Supports',
        'Not present': 'Not Applicable',
    result = result_map.get(result, result)
    info = wcag_ids[key]
    num = info['num']
    conformanceLevel = info['conformanceLevel']
    name = criteria_names[num]

        'key': key,
        'description': indent_lines(description, ' '*6),
        'result': result,
        'num': num,
        'conformanceLevel': conformanceLevel,
        'name': name,

Criteria not assessed

The following criteria were not assessed:

In [ ]:
not_assessed = [n for n in wcag_ids.values() if n['id'] not in criteria]
for n in not_assessed:
    print(f'''{n['num']} {n['id']} ({n['conformanceLevel']}){n['id']}''')

Produce ReStructuredText of report

In [ ]:
from itertools import groupby

for level, items in groupby(sorted(report, key=lambda x: (x['conformanceLevel'], x['num'])), key=lambda x: x['conformanceLevel']):
    header = f'''Table 1: Success Criteria, Level {level}'''
.. list-table::
  :header-rows: 1


     - Criteria
     - Conformance Level
     - Remarks and Explanations''')
    for item in items:
        print('''  -
    - .. _vpat-{key}:
      `{num}: {name} <{key}>`__ (Level {conformanceLevel})
    - {result}
    - {description}'''.format(**item))

In [ ]: