babelacc

compare different implementations of the text alternative computation  https://p.ce9e.org/babelacc/
git clone https://git.ce9e.org/babelacc.git

commit
5c8b1bdd66dd9d0d7585b8b1241e3261dd3610f1
parent
368cca37cc0a188016a39ba9dc0ebba3013d1c03
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2018-02-05 23:48
install accdc from npm

Diffstat

D lib/accdc.js 338 ------------------------------------------------------------
M package.json 3 ++-
M src/babel.js 2 +-

3 files changed, 3 insertions, 340 deletions


diff --git a/lib/accdc.js b/lib/accdc.js

@@ -1,337 +0,0 @@
    1    -1 /*!
    2    -1 calcNames 1.2, compute the Name and Description property values for a DOM node
    3    -1 Returns an object with 'name' and 'desc' properties.
    4    -1 Authored by Bryan Garaventa plus contrabutions by Tobias Bengfort
    5    -1 Distributed under the terms of the Open Source Initiative OSI - MIT License
    6    -1 */
    7    -1 
    8    -1 var calcNames = function(node, fnc, preventVisualARIASelfCSSRef) {
    9    -1 	if (!node || node.nodeType !== 1) {
   10    -1 		return;
   11    -1 	}
   12    -1 
   13    -1 	var trim = function(str) {
   14    -1 		if (typeof str !== 'string') {
   15    -1 			return '';
   16    -1 		}
   17    -1 
   18    -1 		return str.replace(/^\s+|\s+$/g, '');
   19    -1 	};
   20    -1 
   21    -1 	var walkDOM = function(node, fn, refNode) {
   22    -1 		if (!node) {
   23    -1 			return;
   24    -1 		}
   25    -1 		fn(node);
   26    -1 
   27    -1 		if (!isException(node, refNode)) {
   28    -1 			node = node.firstChild;
   29    -1 
   30    -1 			while (node) {
   31    -1 				walkDOM(node, fn, refNode);
   32    -1 				node = node.nextSibling;
   33    -1 			}
   34    -1 		}
   35    -1 	};
   36    -1 
   37    -1 	var isFocusable = function(node) {
   38    -1 		var nodeName = node.nodeName.toLowerCase();
   39    -1 
   40    -1 		if (node.getAttribute('tabindex')) {
   41    -1 			return true;
   42    -1 		}
   43    -1 		if (nodeName === 'a' && node.getAttribute('href')) {
   44    -1 			return true;
   45    -1 		}
   46    -1 		if (['input', 'select', 'button'].indexOf(nodeName) !== -1 && node.getAttribute('type') !== 'hidden') {
   47    -1 			return true;
   48    -1 		}
   49    -1 		return false;
   50    -1 	};
   51    -1 
   52    -1 	var isException = function(node, refNode) {
   53    -1 		if (!refNode || !node || refNode.nodeType !== 1 || node.nodeType !== 1) {
   54    -1 			return false;
   55    -1 		}
   56    -1 
   57    -1 		var list1 = {
   58    -1 			roles: ['link', 'button', 'checkbox', 'option', 'radio', 'switch', 'tab', 'treeitem', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'cell', 'columnheader', 'rowheader', 'tooltip', 'heading'],
   59    -1 			tags: ['a', 'button', 'summary', 'input', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'menuitem', 'option', 'td', 'th']
   60    -1 		};
   61    -1 
   62    -1 		var list2 = {
   63    -1 			roles: ['application', 'alert', 'log', 'marquee', 'timer', 'alertdialog', 'dialog', 'banner', 'complementary', 'form', 'main', 'navigation', 'region', 'search', 'article', 'document', 'feed', 'figure', 'img', 'math', 'toolbar', 'menu', 'menubar', 'grid', 'listbox', 'radiogroup', 'textbox', 'searchbox', 'spinbutton', 'scrollbar', 'slider', 'tablist', 'tabpanel', 'tree', 'treegrid', 'separator'],
   64    -1 			tags: ['article', 'aside', 'body', 'select', 'datalist', 'optgroup', 'dialog', 'figure', 'footer', 'form', 'header', 'hr', 'img', 'textarea', 'input', 'main', 'math', 'menu', 'nav', 'section']
   65    -1 		};
   66    -1 
   67    -1 		var list3 = {
   68    -1 			roles: ['combobox', 'term', 'definition', 'directory', 'list', 'group', 'note', 'status', 'table', 'rowgroup', 'row', 'contentinfo'],
   69    -1 			tags: ['dl', 'ul', 'ol', 'dd', 'details', 'output', 'table', 'thead', 'tbody', 'tfoot', 'tr']
   70    -1 		};
   71    -1 
   72    -1 		var inList = function(node, list) {
   73    -1 			var role = node.getAttribute('role');
   74    -1 			var tag = node.nodeName.toLowerCase();
   75    -1 			return (
   76    -1 				list.roles.indexOf(role) >= 0 ||
   77    -1 				(!role && list2.tags.indexOf(tag) >= 0)
   78    -1 			);
   79    -1 		};
   80    -1 
   81    -1 		if (inList(node, list2)) {
   82    -1 			return true;
   83    -1 		} else if (inList(node, list3)) {
   84    -1 			if (node === refNode) {
   85    -1 				return !isFocusable(node);
   86    -1 			} else {
   87    -1 				return !inList(refNode, list1);
   88    -1 			}
   89    -1 		} else {
   90    -1 			return false;
   91    -1 		}
   92    -1 	};
   93    -1 
   94    -1 	var isHidden = function(node, refNode) {
   95    -1 		if (node.nodeType !== 1 || node == refNode) {
   96    -1 			return false;
   97    -1 		}
   98    -1 
   99    -1 		if (node.getAttribute('aria-hidden') === 'true') {
  100    -1 			return true;
  101    -1 		}
  102    -1 
  103    -1 		var style = {};
  104    -1 		if (document.defaultView && document.defaultView.getComputedStyle) {
  105    -1 			style = document.defaultView.getComputedStyle(node, '');
  106    -1 		} else if (node.currentStyle) {
  107    -1 			style = node.currentStyle;
  108    -1 		}
  109    -1 		if (style['display'] === 'none' || style['visibility'] === 'hidden') {
  110    -1 			return true;
  111    -1 		}
  112    -1 
  113    -1 		return false;
  114    -1 	};
  115    -1 
  116    -1 	var getCSSText = function(node, refNode) {
  117    -1 		if (node.nodeType !== 1 || node == refNode || ['input', 'select', 'textarea', 'img', 'iframe'].indexOf(node.nodeName.toLowerCase()) !== -1) {
  118    -1 						return {before: '', after: ''};
  119    -1 		}
  120    -1 
  121    -1 		var getText = function(node, position) {
  122    -1 			var text = document.defaultView.getComputedStyle(node, position).getPropertyValue('content').replace(/^\"|\"$/g, '');
  123    -1 			if (!text || text === 'none') {
  124    -1 								return '';
  125    -1 			} else {
  126    -1 				return text;
  127    -1 			}
  128    -1 		};
  129    -1 
  130    -1 		if (document.defaultView && document.defaultView.getComputedStyle) {
  131    -1 			return {
  132    -1 				before: getText(node, ':before'),
  133    -1 				after: getText(node, ':after')
  134    -1 			};
  135    -1 		} else {
  136    -1 			return {before: '', after: ''};
  137    -1 		}
  138    -1 	};
  139    -1 
  140    -1 	var hasParentLabel = function(node, noLabel, refNode) {
  141    -1 		while (node && node !== refNode) {
  142    -1 			node = node.parentNode;
  143    -1 
  144    -1 			if (node.getAttribute) {
  145    -1 				if (['presentation', 'none'].indexOf(node.getAttribute('role')) === -1) {
  146    -1 					if (!noLabel && node.getAttribute('aria-label')) {
  147    -1 						return true;
  148    -1 					}
  149    -1 					if (isHidden(node, refNode)) {
  150    -1 						return true;
  151    -1 					}
  152    -1 				}
  153    -1 			}
  154    -1 		}
  155    -1 
  156    -1 		return false;
  157    -1 	};
  158    -1 
  159    -1 	var walk = function(refNode, stop, skip) {
  160    -1 		var fullName = '';
  161    -1 		var nodes = [];
  162    -1 		var cssOP = {
  163    -1 			before: '',
  164    -1 			after: ''
  165    -1 		};
  166    -1 
  167    -1 		if (nodes.indexOf(refNode) === -1) {
  168    -1 			nodes.push(refNode);
  169    -1 			cssOP = getCSSText(refNode, null);
  170    -1 
  171    -1 			// Enabled in Visual ARIA to prevent self referencing by Visual ARIA tooltips
  172    -1 			if (preventVisualARIASelfCSSRef) {
  173    -1 				if (cssOP.before.indexOf(' [ARIA] ') !== -1 || cssOP.before.indexOf(' aria-') !== -1) 
  174    -1 					cssOP.before = '';
  175    -1 				if (cssOP.after.indexOf(' [ARIA] ') !== -1 || cssOP.after.indexOf(' aria-') !== -1)  
  176    -1 					cssOP.after = '';
  177    -1 			}
  178    -1 		}
  179    -1 
  180    -1 		walkDOM(refNode, function(node) {
  181    -1 			if (skip || !node || (isHidden(node, refNode))) {
  182    -1 				return;
  183    -1 			}
  184    -1 
  185    -1 			var name = '';
  186    -1 			var cssO = {
  187    -1 				before: '',
  188    -1 				after: ''
  189    -1 			};
  190    -1 
  191    -1 			var parent = refNode === node ? node : node.parentNode;
  192    -1 			if (nodes.indexOf(parent) === -1) {
  193    -1 				nodes.push(parent);
  194    -1 				cssO = getCSSText(parent, refNode);
  195    -1 
  196    -1 				// Enabled in Visual ARIA to prevent self referencing by Visual ARIA tooltips
  197    -1 				if (preventVisualARIASelfCSSRef) {
  198    -1 					if (cssO.before.indexOf(' [ARIA] ') !== -1 || cssO.before.indexOf(' aria-') !== -1) 
  199    -1 						cssO.before = '';
  200    -1 					if (cssO.after.indexOf(' [ARIA] ') !== -1 || cssO.after.indexOf(' aria-') !== -1)  
  201    -1 						cssO.after = '';
  202    -1 				}
  203    -1 
  204    -1 			}
  205    -1 
  206    -1 			if (node.nodeType === 1) {
  207    -1 				var aLabelledby = node.getAttribute('aria-labelledby') || '';
  208    -1 				var aLabel = node.getAttribute('aria-label') || '';
  209    -1 				var nTitle = node.getAttribute('title') || '';
  210    -1 				var rolePresentation = ['presentation', 'none'].indexOf(node.getAttribute('role')) !== -1;
  211    -1 
  212    -1 				if (!node.firstChild || (node == refNode && (aLabelledby || aLabel)) || (node.firstChild && node != refNode && aLabel)) {
  213    -1 					if (!stop && node === refNode && aLabelledby) {
  214    -1 						if (!rolePresentation) {
  215    -1 							var ids = aLabelledby.split(/\s+/);
  216    -1 							var parts = [];
  217    -1 
  218    -1 							for (var i = 0; i < ids.length; i++) {
  219    -1 								var element = document.getElementById(ids[i]);
  220    -1 								parts.push(walk(element, true, skip));
  221    -1 							}
  222    -1 							name = parts.join(' ');
  223    -1 						}
  224    -1 
  225    -1 						if (name || rolePresentation) {
  226    -1 							skip = true;
  227    -1 						}
  228    -1 					}
  229    -1 
  230    -1 /*!@ Add values of custom controls here if recursive controls with values */
  231    -1 
  232    -1 					if (!name && !rolePresentation && aLabel) {
  233    -1 						name = aLabel;
  234    -1 
  235    -1 						if (name && node === refNode) {
  236    -1 							skip = true;
  237    -1 						}
  238    -1 					}
  239    -1 
  240    -1 					if (!name && !rolePresentation && ['input', 'select', 'textarea'].indexOf(node.nodeName.toLowerCase()) !== -1 && node.id && document.querySelectorAll('label[for="' + node.id + '"]').length) {
  241    -1 						var label = document.querySelector('label[for="' + node.id + '"]');
  242    -1 						name = walk(label, true, skip);
  243    -1 					}
  244    -1 
  245    -1 					if (!name && !rolePresentation && node.nodeName.toLowerCase() == 'img' && node.getAttribute('alt')) {
  246    -1 						name = node.getAttribute('alt');
  247    -1 					}
  248    -1 
  249    -1 					if (!name && !rolePresentation && nTitle) {
  250    -1 						name = nTitle;
  251    -1 					}
  252    -1 				}
  253    -1 			} else if (node.nodeType === 3) {
  254    -1 				name = node.data;
  255    -1 			}
  256    -1 
  257    -1 			name = cssO.before + name + cssO.after;
  258    -1 
  259    -1 			if (name && !hasParentLabel(node, false, refNode)) {
  260    -1 				fullName += name;
  261    -1 			}
  262    -1 		}, refNode);
  263    -1 
  264    -1 		fullName = cssOP.before + fullName + cssOP.after;
  265    -1 		return fullName;
  266    -1 	};
  267    -1 
  268    -1 	if (isHidden(node, document.body) || hasParentLabel(node, true, document.body)) {
  269    -1 		return;
  270    -1 	}
  271    -1 
  272    -1 	var accName = walk(node, false);
  273    -1 	var accDesc = '';
  274    -1 
  275    -1 	if (['presentation', 'none'].indexOf(node.getAttribute('role')) === -1) {
  276    -1 		var desc = '';
  277    -1 
  278    -1 		var title = node.getAttribute('title') || '';
  279    -1 		if (title) {
  280    -1 			if (!accName) {
  281    -1 				accName = title;
  282    -1 			} else {
  283    -1 				accDesc = title;
  284    -1 			}
  285    -1 		}
  286    -1 
  287    -1 		var describedby = node.getAttribute('aria-describedby') || '';
  288    -1 		if (describedby) {
  289    -1 			var ids = describedby.split(/\s+/);
  290    -1 			var parts = [];
  291    -1 
  292    -1 			for (var j = 0; j < ids.length; j++) {
  293    -1 				var element = document.getElementById(ids[j]);
  294    -1 				parts.push(walk(element, true));
  295    -1 			}
  296    -1 
  297    -1 			if (parts.length) {
  298    -1 				accDesc = parts.join(' ');
  299    -1 			}
  300    -1 		}
  301    -1 	}
  302    -1 
  303    -1 	accName = trim(accName.replace(/\s+/g, ' '));
  304    -1 	accDesc = trim(accDesc.replace(/\s+/g, ' '));
  305    -1 
  306    -1 	if (accName === accDesc) {
  307    -1 		accDesc = '';
  308    -1 	}
  309    -1 
  310    -1 	var props = {
  311    -1 		name: accName,
  312    -1 		desc: accDesc
  313    -1 	};
  314    -1 
  315    -1 	if (fnc && typeof fnc == 'function') {
  316    -1 		return fnc.apply(node, [
  317    -1 			node,
  318    -1 			props
  319    -1 		]);
  320    -1 	} else {
  321    -1 		return props;
  322    -1 	}
  323    -1 };
  324    -1 
  325    -1 // Customize returned string
  326    -1 
  327    -1 var getNames = function(node) {
  328    -1 	var props = calcNames(node);
  329    -1 	return 'accName: "' + props.name + '"\n\naccDesc: "' + props.desc + '"';
  330    -1 };
  331    -1 
  332    -1 if (typeof module === 'object' && module.exports) {
  333    -1 	module.exports = {
  334    -1 		getNames: getNames,
  335    -1 		calcNames: calcNames,
  336    -1 	};
  337    -1 
  337    -1 
\ No newline at end of file

diff --git a/package.json b/package.json

@@ -5,7 +5,8 @@
    5     5   "devDependencies": {
    6     6     "accessibility-developer-tools": "^2.12.0",
    7     7     "aria-api": "^0.2.1",
    8    -1     "axe-core": "^2.6.1"
   -1     8     "axe-core": "^2.6.1",
   -1     9     "w3c-alternative-text-computation": "github:accdc/w3c-alternative-text-computation"
    9    10   },
   10    11   "repository": {
   11    12     "type": "git",

diff --git a/src/babel.js b/src/babel.js

@@ -1,5 +1,5 @@
    1     1 var ariaApi = require('aria-api');
    2    -1 var accdc = require('../lib/accdc');
   -1     2 var accdc = require('w3c-alternative-text-computation');
    3     3 var axe = require('axe-core');
    4     4 var axs = require('../lib/axs');
    5     5