-
-
Save JayPanoz/45896f17a69892de9a121d701c578d1e to your computer and use it in GitHub Desktop.
| // This is now its own package @ https://github.com/rodebert/epubtype-to-aria | |
| // Please check Rodebert’s repo for a better and more up-to-date version | |
| "use strict"; | |
| // Get all the elements with epub:type | |
| // Since querySelectorAll can’t be used with XHTML attributes, | |
| // we create an array in which we’ll push elements with an epub:type attribute | |
| var epubTypes = []; | |
| // This function gets all the elements in the DOM | |
| (function pushElements() { | |
| var els = document.querySelectorAll("*"); | |
| for (var a = 0; a < els.length; a++) { | |
| var el = els[a]; | |
| // we check if the current element has an epub:type attribute | |
| // If it does, we push the DOM element in the array | |
| if (el.hasAttribute("epub:type")) { | |
| epubTypes.push(el); | |
| } | |
| } | |
| })(); | |
| // Mappings table (epub → role) | |
| var mappings = [ | |
| {epub: "abstract", aria: "doc-abstract"}, | |
| {epub: "acknowledgments", aria: "doc-acknowledgments"}, | |
| {epub: "afterword", aria: "doc-afterword"}, | |
| {epub: "appendix", aria: "doc-appendix"}, | |
| {epub: "biblioentry", aria: "doc-biblioentry"}, | |
| {epub: "bibliography", aria: "doc-bibliography"}, | |
| {epub: "biblioref", aria: "doc-biblioref"}, | |
| {epub: "chapter", aria: "doc-chapter"}, | |
| {epub: "colophon", aria: "doc-colophon"}, | |
| {epub: "conclusion", aria: "doc-conclusion"}, | |
| {epub: "cover", aria: "doc-cover"}, | |
| {epub: "credit", aria: "doc-credit"}, | |
| {epub: "credits", aria: "doc-credits"}, | |
| {epub: "dedication", aria: "doc-dedication"}, | |
| {epub: "endnote", aria: "doc-endnote"}, | |
| {epub: "endnotes", aria: "doc-endnotes"}, | |
| {epub: "epigraph", aria: "doc-epigraph"}, | |
| {epub: "epilogue", aria: "doc-epilogue"}, | |
| {epub: "errata", aria: "doc-errata"}, | |
| {epub: "figure", aria: "figure"}, | |
| {epub: "footnote", aria: "doc-footnote"}, | |
| {epub: "foreword", aria: "doc-foreword"}, | |
| {epub: "glossary", aria: "doc-glossary"}, | |
| {epub: "glossdef", aria: "definition"}, | |
| {epub: "glossref", aria: "doc-glossref"}, | |
| {epub: "glossterm", aria: "term"}, | |
| {epub: "index", aria: "doc-index"}, | |
| {epub: "introduction", aria: "doc-introduction"}, | |
| {epub: "landmarks", aria: "directory"}, | |
| {epub: "list", aria: "list"}, | |
| {epub: "list-item", aria: "listitem"}, | |
| {epub: "noteref", aria: "doc-noteref"}, | |
| {epub: "notice", aria: "doc-notice"}, | |
| {epub: "pagebreak", aria: "doc-pagebreak"}, | |
| {epub: "page-list", aria: "doc-pagelist"}, | |
| {epub: "part", aria: "doc-part"}, | |
| {epub: "preface", aria: "doc-preface"}, | |
| {epub: "prologue", aria: "doc-prologue"}, | |
| {epub: "pullquote", aria: "doc-pullquote"}, | |
| {epub: "qna", aria: "doc-qna"}, | |
| {epub: "referrer", aria: "doc-backlink"}, | |
| {epub: "subtitle", aria: "doc-subtitle"}, | |
| {epub: "table", aria: "table"}, | |
| {epub: "table-row", aria: "row"}, | |
| {epub: "table-cell", aria: "cell"}, | |
| {epub: "tip", aria: "doc-tip"}, | |
| {epub: "toc", aria: "doc-toc"} | |
| ]; | |
| // Init append role="" loop | |
| for (var i = 0; i < epubTypes.length; i++) { | |
| var element = epubTypes[i]; | |
| // If element hasn’t a role attribute | |
| if (!element.hasAttribute("role")) { | |
| // Get the value for epub:type | |
| var epubTypeValue = element.getAttribute("epub:type"); // in tagsoup HTML, should be epub\\\:type | |
| // Split the string (we only check 2 = 1 space separator) | |
| var inflections = epubTypeValue.split(" ", 2); | |
| // We get an array for inflections so we init another loop | |
| for (var j = 0; j < inflections.length; j++) { | |
| var inflection = inflections[j]; | |
| // check if the value (string) is in the mappings table | |
| var idx = mappings.findIndex(x => x.epub === inflection); | |
| // If it is found | |
| if (idx >= 0) { | |
| // Retrieve the aria value | |
| var ariaValue = mappings[idx].aria; | |
| // add the role attribute | |
| element.setAttribute("role", ariaValue); | |
| // break the loop since role can only have one value | |
| break; | |
| } | |
| } | |
| } | |
| } |
I have made some optimizations: https://gist.github.com/rodebert/81837a2676cf2c04819a582c3eb49c13
Have a look.
Thank you! It’s much better and cleaner.
This is exactly why I wanted to revisit it at some point, given I ended up with an array anyway and just stopped there.
You're welcome :)
Bonjour,
Dans le mappings je vois des epub list, table, cell,... Or quand je regarde dans la liste des epub:type EPUB for Education Structural Semantics je ne les retrouve pas.
Merci pour le script je m'en suis aidé pour mon Plugin vscode - EpubTools
There seems to be a more recent version at https://idpf.github.io/epub-guides/epub-aria-authoring/#sec-mappings
The best way to handle updates would probably be in this repo: https://github.com/rodebert/epubtype-to-aria
I should indeed make clearer this gist is kinda “deprecated” and rodebert’s package is 1. better, 2. distributed (via npm), and 3. documented for usage. :-)
License MIT in case you want to use that to make a (web) app upgrading files. :-)