<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>accessibility &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/accessibility/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Fri, 27 Mar 2026 16:10:05 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>accessibility &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Better TTS on Linux]]></title>
		<link>https://shkspr.mobi/blog/2026/04/better-tts-on-linux/</link>
					<comments>https://shkspr.mobi/blog/2026/04/better-tts-on-linux/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 11:34:07 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tts]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=68497</guid>

					<description><![CDATA[The venerable eSpeak is a mainstay of Linux distributions. It is a clever Text-To-Speech (TTS) program which will read aloud the written word using a phenomenally wide variety of languages and accents.  The only problem is that it sounds robotic. It has the same vocal fidelity as a 1980s Speak &#039;n&#039; Spell toy. Monotonous, clipped, and painful to listen to. For some people, this is a feature, not a…]]></description>
										<content:encoded><![CDATA[<p>The venerable eSpeak is a mainstay of Linux distributions. It is a clever Text-To-Speech (TTS) program which will read aloud the written word using a phenomenally wide variety of languages and accents.</p>

<p>The only problem is that it sounds robotic. It has the same vocal fidelity as a 1980s Speak 'n' Spell toy. Monotonous, clipped, and painful to listen to. For some people, this is a feature, not a bug. I have blind friends who are so used to eSpeak that they can crank it up to hundreds of words per minute and navigate through complex documents with ease.</p>

<p>For the rest of us, it is a steep and unpleasant learning curve.</p>

<p>There are lots of modern TTS programs using all sorts of advanced AI. Many of them are paywalled or require you to post your text to a webserver - with all the privacy and latency problems that causes. Some are restricted to high-powered GPUs or other expensive equipment.</p>

<p><a href="https://github.com/OHF-Voice/piper1-gpl">Piper</a> is different. It is local first, runs quickly on modest hardware, and is open source.</p>

<p>The easiest way to install it on Linux is to use <a href="https://pied.mikeasoft.com/">Pied</a> - a simple GUI which allows you to select languages, listen to accents, and then install them.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/pied.webp" alt="GUI showing various British English languages." width="594" height="695" class="aligncenter size-full wp-image-68498">

<p>It will change your <code>speech-dispatcher</code> to use the new Piper voice. That means it is immediately available to your Linux DE's accessibility service and to apps like Firefox.</p>

<p>I now have a <a href="http://news.bbc.co.uk/1/mobile/scotland/7754111.stm">reassuring Scottish lady</a> speaking out everything on my computer.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68497&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/04/better-tts-on-linux/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The Idiot Sandwich - On Embedding Alt Text]]></title>
		<link>https://shkspr.mobi/blog/2025/11/the-idiot-sandwich-on-embedding-alt-text/</link>
					<comments>https://shkspr.mobi/blog/2025/11/the-idiot-sandwich-on-embedding-alt-text/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 12:34:27 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[AltText]]></category>
		<category><![CDATA[HTML]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63790</guid>

					<description><![CDATA[Alt text is great. It allows people who can&#039;t see an image to understand what that image represents.  For example, the code might say: &#60;img src=&#34;whatever.gif&#34; alt=&#34;Two cute kittens are playing on a blanket&#34;&#62;  If you are blind, you get an idea of what&#039;s being conveyed by that image. If you&#039;re on a train and the WiFi craps out just before the image loads, you&#039;ll also benefit!  If the image is of…]]></description>
										<content:encoded><![CDATA[<p>Alt text is <em>great</em>. It allows people who can't see an image to understand what that image represents.</p>

<p>For example, the code might say: <code>&lt;img src="whatever.gif" alt="Two cute kittens are playing on a blanket"&gt;</code></p>

<p>If you are blind, you get an idea of what's being conveyed by that image. If you're on a train and the WiFi craps out just before the image loads, you'll <em>also</em> benefit!  If the image is of text in a language you don't read, your device can translate it for you.</p>

<p>The alt text can be as long or as short as is necessary. It might just be "kid giving a thumbs up" or it could be incredibly detailed. Here's how the BBC's Newsbeat typically adds alt text for younger viewers:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/bbc-alt-lossy.webp" alt="Screenshot showing broken images. The alt text on them reads &quot;October 02, 2023, Kolkata City, India,: An Indian hairdresser finishes the haircut showing a Cricket World Cup design make at a hair salon near Kolkata on 2 October 2023 in Kolkata&quot;. Another says &quot;Doja Cat attends the 2023 Video Music Awards. The singer has short bleached blonde hair and dark brown eyes. Her makeup includes thinly drawn on eye brows, purple eyeshadow, false spidery lashes and gems dotted around her eyes. She wears a spider shaped ear cuff and long dangly silver earrings.&quot; A third says &quot;Olivia Rodrigo in the Live Lounge. Olivia is a 20-year-old woman with long brown hair worn loose over her shoulders. She wears a white silk slip-style dress with a lace trim and has red lipstick on. She holds a microphone stand with both hands and closes her eyes as she sings.&quot; " width="540" height="551" class="aligncenter size-full wp-image-63798">

<p>Is that too much? Maybe. It depends on your audience. For partially sighted kids who crave the same pop information as their sighted peers, I think it is great.</p>

<p>So alt text is a good thing. But people are lazy and don't always write it. Perhaps the answer is to <a href="https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/">embed alt text inside image metadata</a>?</p>

<p>It's a lovely idea - and technically feasible - but it fails to account for user needs.</p>

<p>And that brings me to the point of this post. Who is your alt text for? What information are you trying to share?</p>

<p>Here's a good example. I looked at a bunch of popular memes which had alt-text pre-populated in them. Here's what they said:</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://files.mastodon.social/accounts/avatars/000/007/112/original/388649acb2026701.webp" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="terence-eden"><a href="https://shkspr.mobi/blog/2025/11/the-idiot-sandwich-on-embedding-alt-text/#terence-eden">Terence Eden</a></h2> <a href="https://mastodon.social/users/Edent" class="ap-account u-url">@Edent@mastodon.social</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p>Whenever people talk about embedding alt text into images, I remember that lots of gif search services already try to do that.</p><p>Here's BlueSky's gif service. I searched for some popular memes. Each had alt-text baked in.</p><p>Take a look and tell me if you think that the embedded text conveys the sentiment of the image? If you couldn't see the animation, would you understand what was going on from that alt?</p></div> <div class="ap-preview layout-4"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/975/730/482/original/1e7cc65db6887d11.png" alt="The idiot sandwich meme. The default alt text is &quot;a man is holding a piece of bread over a woman 's face and asking what are you ?&quot;"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/976/199/735/original/dd22dab9aa5a0fb1.png" alt="Clip from The Hobbit with the subtitle &quot;What about second breakfast?&quot;. The default alt text is &quot;two men are standing next to each other talking about second breakfast&quot;."> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/985/649/025/original/91e0e747e8e4da5a.png" alt="The meme of Homer Simpson walking backwards into a hedge. The default alt text is &quot;A cartoon of homer simpson standing in a grassy area.&quot;"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/993/873/973/original/f97c27accad5c0f9.png" alt="The Chuckle Brothers looking at each other. The default alt text is &quot;a man in a striped shirt is kissing another man in a white suit&quot;."> </div> </div> <div class="activitypub-embed-meta"> <a href="https://mastodon.social/users/Edent/statuses/115165068315048568" class="ap-stat ap-date dt-published u-in-reply-to">2025-09-07, 21:11</a> <span class="ap-stat"> <strong>12</strong> boosts </span> <span class="ap-stat"> <strong>22</strong> favorites </span> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<p>OK, so sometimes the captioner makes a mistake and thinks <a href="https://tenor.com/en-GB/view/chuckle-vision-chuckle-brothers-paul-chuckle-paul-elliot-barry-elliot-gif-16410194">the Chuckle Brothers are kissing</a> (WTF?!) perhaps we can excuse that as being an obscure image. But the "<a href="https://tenor.com/en-GB/view/gordon-ramsay-idiot-sandwich-angry-mad-what-are-you-gif-4169547">idiot sandwich</a>" one is inexcusable.  It's a popular meme with a specific meaning.</p>

<p>Which leaves me with a few questions for you:</p>

<ul>
<li>If you saw that the image you were sharing had crap alt text - would you bother editing it?</li>
<li>Is bad alt text worse than no alt text?</li>
<li>Can the same image have multiple meanings?</li>
<li>Have you spent any time browsing the web with images turned off? Did you enjoy it?</li>
</ul>

<p><a href="https://www.rnib.org.uk/living-with-sight-loss/assistive-aids-and-technology/tv-audio-and-gaming/guide-to-accessible-social-media/">You can find out more about Alt Text on the RNIB site</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63790&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/11/the-idiot-sandwich-on-embedding-alt-text/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How long does it take to upgrade an eBook?]]></title>
		<link>https://shkspr.mobi/blog/2025/08/how-long-does-it-take-to-upgrade-an-ebook/</link>
					<comments>https://shkspr.mobi/blog/2025/08/how-long-does-it-take-to-upgrade-an-ebook/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 08 Aug 2025 11:34:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[ebooks]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61927</guid>

					<description><![CDATA[The older I get, the more comfortable I become with complaining. Not merely moaning on social media, but writing a direct email to the perpetrator of some annoyance.  I&#039;d purchased an eBook and was appalled by how crappy the accessibility was. If you don&#039;t know, modern ePub books are just HTML wrapped in a zip file. They have all of the accessibility advantages of the web and should be easy to…]]></description>
										<content:encoded><![CDATA[<p>The older I get, the more comfortable I become with complaining. Not merely moaning on social media, but writing a direct email to the perpetrator of some annoyance.</p>

<p>I'd purchased an eBook and was <em>appalled</em> by how crappy the accessibility was. If you don't know, modern ePub books are just HTML wrapped in a zip file. They have all of the accessibility advantages of the web and should be easy to read no matter if you're sighted or not.</p>

<p>But not this eBook!  Part of the story concerned WhatsApp messages sent by the protagonist. Here's one of them:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/whatsapp.webp" alt="Text with a tiny emoji, the size of a full stop." width="1000" height="502" class="aligncenter size-full wp-image-61928">

<p>See that smudge in the middle? The one smaller than a full stop? That's meant to be an emoji. Rather than use an <em>actual</em> emoji, they've stuck in a tiny pixel image which won't scale with text size.</p>

<p>Here is is:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/f0006-01.jpg" alt="Tiny emoji" width="13" height="14" class="aligncenter size-full wp-image-61929">

<p>Can't see it? Let me blow it up to a more readable size.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/f0006-01.jpg" alt="Pixelated mess." width="130" height="140" class="aligncenter size-full wp-image-61929">

<p>OK, that's annoying for sighted readers, but just about understandable. What about people who are using a screen reader? Luckily, ePubs can use HTML's "alt text" feature which will describe an image which can't be seen.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/alt.webp" alt="The alt text just says 'image'&quot;." width="808" height="123" class="aligncenter size-full wp-image-61931">

<p>Curses! That's, perhaps, not <em>too</em> annoying for a decorative image - but later in the book there are pictures of a ransom note. Despite the plot-twisting text in the illustration, the alt text just says "image".</p>

<p>I found the publisher's website and scoffed at their proclaimed accessibility statement. I sent them an email which basically consisted of the above. I realised it was probably futile, but I've got to spend my privilege points somehow.</p>

<p>The next day, they wrote back!</p>

<blockquote><p>I wanted to reply to let you know we are taking our commitments to accessibility in our ebooks seriously […] I will get our ebook team to check this as a matter of urgency and get back to you with an update.</p></blockquote>

<p>Fair play. But talk is cheap, would they actually take action? A few days later, they sent a follow-up:</p>

<blockquote><p>We have checked the file for this title again and found issues with it. We have sent this back to the conversion house to have the file corrected and expect this to be delivered by the end of the week. We would then expect this corrected version to be with Kobo by the end of the following week, i.e. 25th July.</p>

<p>We have also been spot-checking other files to see if there is a wider issue and where necessary will follow the same workflow to ensure fully accessible versions are available as widely as possible.</p></blockquote>

<p>And, you know what, I think that's totally reasonable. Yeah, they should have caught it before publication - but it is a complex book and they're a small publisher. They took my complaint seriously and actually did something about it.</p>

<p>A week or so rolled by and they sent me this:</p>

<blockquote><p>Just to update you that we have been back and forth with the conversion house getting this title up to scratch. There were various complicating factors which should now be resolved and an updated file has now been distributed and should be available through your chosen retailer presently. If you have any other queries please do let us know.</p></blockquote>

<p>I logged on to my eBook provider, clicked "read" and…</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/fixed-epub.webp" alt="Text with large colourful emoji." width="1080" height="544" class="aligncenter size-full wp-image-62328">

<p>It was fixed! All the images had decent alt text as well.</p>

<p>Rather annoyingly, the retailer didn't notify me that there was an update available. I can't blame the publisher for that though.</p>

<p>Still, 3 weeks from report to fix is pretty good I reckon.</p>

<p>When I last contacted a publisher about a mistake in their ebook, <a href="https://shkspr.mobi/blog/2011/06/how-long-does-it-take-to-fix-an-ebook/">it took over 3 months to fix it</a>. Perhaps things are slowly getting better?</p>

<p>Anyway, please complain about poor accessibility. Don't shout into the void of social media - write a polite but insistent email telling (not asking) people to fix their shit. Sometimes, just sometimes, it does work.</p>

<p>Anyway you should read <a href="https://shkspr.mobi/blog/2025/07/book-review-the-mysterious-case-of-the-alperton-angels-by-janice-hallett/">The Mysterious Case of the Alperton Angels by Janice Hallett</a> - it is brilliant <em>and</em> accessible.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61927&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/how-long-does-it-take-to-upgrade-an-ebook/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review: Web Accessibility Cookbook - Creating Inclusive Experiences by Manuel Matuzovic ★★★★★]]></title>
		<link>https://shkspr.mobi/blog/2025/02/book-review-web-accessibility-cookbook-creating-inclusive-experiences-by-manuel-matuzovic/</link>
					<comments>https://shkspr.mobi/blog/2025/02/book-review-web-accessibility-cookbook-creating-inclusive-experiences-by-manuel-matuzovic/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 12:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[Book Review]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=58325</guid>

					<description><![CDATA[My friend Manuel  has sent me his latest book to review - and it is a corker. The best thing about this book is that it doesn&#039;t waste any time trying to convince you that Accessibility Is Good™. You&#039;re a professional web developer; you know that. Instead, it gets straight down to brass-tacks and gives you immediate and useful examples of what to do.  You could read the book linearly - but it is m…]]></description>
										<content:encoded><![CDATA[<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/02/web-accessibility-cookbook.jpg" alt="Book cover featuring a happy dog." width="200" class="alignleft size-full wp-image-58327">My friend Manuel  has sent me his latest book to review - and it is a corker. The best thing about this book is that it doesn't waste any time trying to convince you that Accessibility Is Good™. You're a professional web developer; you know that. Instead, it gets straight down to brass-tacks and gives you <em>immediate</em> and <em>useful</em> examples of what to do.</p>

<p>You could read the book linearly - but it is much more suited to dipping into. Want to know exactly how to do something? There's almost certainly a recipe in here for you.  Within the first few minutes of reading, I'd already discovered some stuff I didn't know - for example, the <code>&lt;q&gt;</code> element changes its quote style based upon its parent's language.</p>

<p>It is, of course, a fully accessible ePub - with plenty of useful alt text and semantically-rich metadata. Even better, it is <em>gorgeously</em> formatted - with excellent use of colour and typesetting throughout.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/02/a11y-details-fs8.png" alt="Sample of the book showing highlighted code and semantic headings." width="1056" height="863" class="aligncenter size-full wp-image-58331">

<p>I particularly like that every section ends with a "discussion". The accessibility world is one of compromises - he invites you to think about the choices you're making and their trade-offs.</p>

<p>Manuel is very generous with his links to sources. You'll find dozens of blog posts, articles, and tutorials written by amazing people. It is <em>slightly</em> annoying that all the links go through the <a href="https://oreil.ly/">https://oreil.ly/</a> link shortener. I guess it means they can be updated if the original link dies, but it would be nice to see the destination before clicking.</p>

<p>Like lots of O'Reilly books, it is priced firmly in the "professional development" bracket. So get your boss to buy you a copy!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=58325&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/02/book-review-web-accessibility-cookbook-creating-inclusive-experiences-by-manuel-matuzovic/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Not everyone is as good at reading and writing as you are]]></title>
		<link>https://shkspr.mobi/blog/2024/09/not-everyone-is-as-good-at-reading-and-writing-as-you-are/</link>
					<comments>https://shkspr.mobi/blog/2024/09/not-everyone-is-as-good-at-reading-and-writing-as-you-are/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 11:34:34 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51638</guid>

					<description><![CDATA[It may be hard for you to understand this; reading is a skill. Unless you have recently started learning a new language with an unfamiliar writing system, you probably do not remember the tedious and agonising process of having to train your brain to recognise printed characters.  Extracting meaning from the words you are reading is seamless. The occasional antediluvian aphorism notwithstanding,…]]></description>
										<content:encoded><![CDATA[<p>It may be hard for you to understand this; reading is a skill. Unless you have recently started learning a new language with an unfamiliar writing system, you probably do not remember the tedious and agonising process of having to train your brain to recognise printed characters.</p>

<p>Extracting meaning from the words you are reading is seamless. The occasional antediluvian aphorism notwithstanding, your eyes glide across the page and your brain rapidly fills with thoughts.</p>

<p>I can feel your fingers itching to write a reply. You probably don't even glance at the keyboard as your mind instantly constructs beautiful sentences, in perfect grammar. Your fingers dance a steady 60WPM.</p>

<p>"Why do people put their tutorials on YouTube?!!?", you cry and rage.</p>

<p>There are three main reasons. In no particular order:</p>

<ol>
<li>YouTube is monetised and the written word isn't. "Like and Subscribe" pays the bills in a way that text doesn't.</li>
<li>Some information is better shown visually.  Seeing what an icon looks like and how a screen is supposed to react is useful semantic information.</li>
<li>It is easier.</li>
</ol>

<p>Reading and writing are <em>difficult</em>. Go find any 7 year old and ask them to tell you a story - they will happily chat away for hours as they regale you with epic tales which would make Homer blush.</p>

<p>Now ask them to write their story down.</p>

<p>Kids can be pretty fluent speakers and listeners by the time they're 5.</p>

<p>But writing and reading takes longer.</p>

<p>I've redrafted this blog post a few times. I've gone back and tweaked the wording. I thought heavily about the exact structure I want to use.</p>

<p>I also held this conversation in a pub, with a friend. Despite the volume of other patrons, our inebriation, and the distractions around us, speaking and listening was simple. I expressed meaning, they received and understood me.</p>

<p>Writing is effort. It is especially hard for some people.</p>

<p>Speaking is easy. It also allows for a much greater array of semantic nuance.</p>

<p>Videos show details that text simply cannot capture.</p>

<p>Some people don't have the cognitive ability to fluently express themselves in your chosen medium.</p>

<p>I think this post sums it up best:</p>

<p><link rel="stylesheet" type="text/css" href="data:text/css,%3Cstyle%3E.mastodon-embed%7Ball%3Aunset%3Bdisplay%3Ablock%3B%7D.mastodon-embed%20%2A%20%7Ball%3Aunset%3Bdisplay%3Arevert%3B%7D.mastodon-embed%3A%3Aafter%7Ball%3Aunset%3B%7D.mastodon-embed%3A%3Abefore%7Ball%3Aunset%3B%7Dblockquote%3Anot%28%2A%29%7Ball%3Aunset%3B%7D.mastodon-embed%20a%7Bcursor%3Apointer%3B%7Dblockquote.mastodon-embed%7Bbox-sizing%3Aborder-box%3Bborder%3A.5px%20solid%3Bwidth%3A550px%3Bmax-width%3A100%25%3Bfont-family%3Asans-serif%3Bmargin%3Aauto%3Bmargin-bottom%3A.5em%3Bpadding%3A1em%3Bborder-radius%3A.5em%3Bbackground-color%3A%23FFF%3Bcolor%3A%23000%3Bdisplay%3Ablock%3Bwhite-space%3A%20normal%3B%7D.mastodon-embed-header%7Bdisplay%3Aflex%3Bjustify-content%3Aspace-between%3B%7D.mastodon-embed-user%7Bdisplay%3Aflex%3Bposition%3Arelative%3Balign-items%3Acenter%3Btext-decoration%3Anone%3Bcolor%3Ainherit%3B%7D.mastodon-embed-avatar%7Bwidth%3A3em%3Bheight%3A3em%3Bmargin-right%3A.5em%3B%7D.mastodon-embed-avatar-circle%7Bborder-radius%3A50%25%3B%7D.mastodon-embed-avatar-square%7Bborder-radius%3A5%25%3B%7D.mastodon-embed-user-names-name%7Bdisplay%3Aflex%3Balign-items%3Acenter%3Bfont-weight%3Abold%3Bmargin%3A0%3B%7D.mastodon-embed-text%7Bmargin-top%3A.5em%3B%7D.mastodon-embed-footer%20a%7Bdisplay%3Aflex%3Balign-items%3Acenter%3Bjustify-content%3Aspace-between%3B%7D.mastodon-embed-logo%7Bwidth%3A3em%3B%7D.mastodon-embed-hr%7Bborder%3A.1px%20solid%3Bmargin%3A.5em%200%20.5em%200%3B%7D.mastodon-embed-meta%7Btext-decoration%3Anone%20%21important%3Bcolor%3Aunset%20%21important%3B%7D.mastodon-embed-reply%7Bdisplay%3Ablock%3B%7D.mastodon-embed-text%20a%2C%20.mastodon-embed-footer%20time%7Bcolor%3Ablue%3Btext-decoration%3Aunderline%3B%7D.mastodon-embed-media-grid%20%7Bdisplay%3A%20flex%3Bflex-wrap%3A%20wrap%3B%7D.mastodon-embed-media-link%20%7Bflex-grow%3A%201%3Bwidth%3A%2050%25%3B%7D.mastodon-embed-media%2C%20.mastodon-embed-video%20%7Bpadding%3A%20.1em%3Bwidth%3A%20100%25%3Bborder-radius%3A.5em%3Bmax-width%3A100%25%3Bobject-fit%3A%20cover%3Bheight%3A%20100%25%3B%7D.mastodon-embed-reply%7Bfont-size%3A.75em%3Bdisplay%3Ablock%3B%7D.mastodon-embed-meter%7Bwidth%3A100%25%3Bbackground%3A%230005%3B%7D.mastodon-embed-card%7Btext-decoration%3Anone%20%21important%3Bcolor%3Aunset%20%21important%3Bborder%3A.5px%20solid%3Bdisplay%3Ablock%3Bfont-size%3A.85em%3Bpadding%3A.5em%3Bborder-radius%3A.5em%3B%7D.mastodon-embed-badge%7Bheight%3A1em%3Bvertical-align%3A%20text-top%3B%7D.mastodon-embed-text%20p%20%7Bmargin-bottom%3A1em%3B%7D.mastodon-embed-emoji%7Bdisplay%3Ainline%3Bwidth%3A1em%3B%7D%3C/style%3E"></p>

<blockquote class="mastodon-embed" id="mastodon-embed-112947519409129281" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="mastodon-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://mendeddrum.org/@pdcawley" class="mastodon-embed-user" itemprop="url"><img class="mastodon-embed-avatar" src="https://mendeddrum.org/system/accounts/avatars/109/307/566/855/671/057/original/85afb623750e802a.jpeg" alt="" itemprop="image"><div class="mastodon-embed-user-names"><p class="mastodon-embed-user-names-name" itemprop="name">pdcawley</p>@Piers Cawley</div></a><img class="mastodon-embed-logo" alt="Mastodon" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-label='Mastodon' role='img' viewBox='0 0 512 512' fill='%23fff'%3E%3Cpath d='m0 0H512V512H0'/%3E%3ClinearGradient id='a' y2='1'%3E%3Cstop offset='0' stop-color='%236364ff'/%3E%3Cstop offset='1' stop-color='%23563acc'/%3E%3C/linearGradient%3E%3Cpath fill='url(%23a)' d='M317 381q-124 28-123-39 69 15 149 2 67-13 72-80 3-101-3-116-19-49-72-58-98-10-162 0-56 10-75 58-12 31-3 147 3 32 9 53 13 46 70 69 83 23 138-9'/%3E%3Cpath d='M360 293h-36v-93q-1-26-29-23-20 3-20 34v47h-36v-47q0-31-20-34-30-3-30 28v88h-36v-91q1-51 44-60 33-5 51 21l9 15 9-15q16-26 51-21 43 9 43 60'/%3E%3C/svg%3E"></header><section class="mastodon-embed-text" itemprop="articleBody"><p>You know what's more punk than grumbling at young people who don't cleave to your media preferences?</p><p>Learning to adapt and engage with what they're telling you through their chosen media.</p><p>Signed, a grumpy and only mildly punk old fart.</p><div class="mastodon-embed-media-grid"></div></section><hr class="mastodon-embed-hr"><footer class="mastodon-embed-footer"><a href="https://mendeddrum.org/@pdcawley/112947519409129281"><span aria-label="11 likes" class="mastodon-embed-meta">❤️ 11</span><span aria-label="1 replies" class="mastodon-embed-meta">💬 1</span><span aria-label="6 reposts" class="mastodon-embed-meta">🔁 6</span><time datetime="2024-08-12T05:59:33.797Z" itemprop="datePublished">05:59 - Mon 12 August 2024</time></a></footer></blockquote>

<h2 id="further-reading"><a href="https://shkspr.mobi/blog/2024/09/not-everyone-is-as-good-at-reading-and-writing-as-you-are/#further-reading">Further reading</a></h2>

<ul>
<li><a href="https://www.gov.uk/guidance/content-design/writing-for-gov-uk#reading-skills">How People Read (GOV.UK)</a></li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51638&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/09/not-everyone-is-as-good-at-reading-and-writing-as-you-are/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[It's a process; not a product]]></title>
		<link>https://shkspr.mobi/blog/2024/02/its-a-process-not-a-product/</link>
					<comments>https://shkspr.mobi/blog/2024/02/its-a-process-not-a-product/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 21 Feb 2024 12:34:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49679</guid>

					<description><![CDATA[Sometimes a client asks me a question and I&#039;m a little stunned by their mental model of the world.  A few weeks ago, we were discussing the need for better cybersecurity in their architecture. We spoke about several aspects of security, then they asked an outstanding question.  &#34;What should I buy to be secure?&#34;  It took a few moments to tease out exactly what they thought they were asking. In…]]></description>
										<content:encoded><![CDATA[<p>Sometimes a client asks me a question and I'm a little stunned by their mental model of the world.</p>

<p>A few weeks ago, we were discussing the need for better cybersecurity in their architecture. We spoke about several aspects of security, then they asked an <em>outstanding</em> question.</p>

<p>"What should I buy to be secure?"</p>

<p>It took a few moments to tease out exactly what they thought they were asking. In their mental model they could just buy a box which did what they needed. Want to print from any workstation? Buy a big HP network printer. Want to get WiFi in the office? Buy a bunch of access points. Want a website? Buy a WordPress. Want security? Buy a [<em>fill in the blank</em>]?</p>

<p>Their notion is that most things are products.  This is a common belief. I've had clients ask "What do I buy to make this accessible?" or "What can I buy to improve usability?"</p>

<p>In all these cases there <em>are</em> unscrupulous people who will sell you a magic cure-all - but the real answer is that these things are a <em>process</em>; not a product.</p>

<p>Yes, you can buy tools which will help <em>improve</em> your security / accessibility / usability etc. But unless you put processes in place to get people to use them effectively, the tools are useless.</p>

<p>People need to understand <em>why</em> something is important. They need processes which <em>support</em> best practices. The business needs a holistic understanding of <em>how</em> these processes improve the business.  And that is all underpinned by tools which make it possible.</p>

<p>There's no magic box which can both protect you from your CEO accidentally CCing confidential data to a competitor <em>and</em> stop DDoS attacks. An accessibility overlay won't help you if your staff refuse to incorporate alt text into their workflow. Automated code testing can't stop you building things without testing them with users.</p>

<p>Security is a <em>verb</em> - it is a <em>doing</em> word.
Accessibility is a <em>verb</em> - it is a <em>doing</em> word.
Usability is a <em>verb</em> - it is a <em>doing</em> word.</p>

<p>Buy nouns which support your verbs.</p>

<iframe title="Massive Attack - Teardrop (Official Video)" width="620" height="465" src="https://www.youtube.com/embed/u7K72X4eo_s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49679&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/its-a-process-not-a-product/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Laziest Possible Dark-Mode Toggle - Using :has() and invert()]]></title>
		<link>https://shkspr.mobi/blog/2023/10/laziest-possible-dark-mode-toggle-using-has-and-invert/</link>
					<comments>https://shkspr.mobi/blog/2023/10/laziest-possible-dark-mode-toggle-using-has-and-invert/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 25 Oct 2023 11:34:53 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48485</guid>

					<description><![CDATA[I&#039;m not saying this is a good way to make a dark mode website. I&#039;m not even saying it&#039;s a sensible way to do dark mode. But I&#039;m pretty sure this is the laziest way of getting dark mode on your site.  And it is all done with less than a handful of CSS rules.  It relies on the new-ish :has() CSS pseudo class and the positively ancient filter() CSS function.  Here&#039;s the code in all its glory: …]]></description>
										<content:encoded><![CDATA[<p>I'm not saying this is a <em>good</em> way to make a dark mode website. I'm not even saying it's a <em>sensible</em> way to do dark mode. But I'm pretty sure this is the <em>laziest</em> way of getting dark mode on your site.  And it is all done with less than a handful of CSS rules.</p>

<p>It relies on the new-ish <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:has"><code>:has()</code> CSS pseudo class</a> and the positively ancient <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert"><code>filter()</code> CSS function</a>.</p>

<p>Here's the code in all its glory:</p>

<pre><code class="language-css">body:has( &gt; #dark-mode-checkbox:checked ) {
  filter: invert(1);
  background: #000;
}

#dark-mode-checkbox:checked ~ img {
  filter: invert(1);
}
</code></pre>

<p>That does three things. If the body has an <code>&lt;input id="dark-mode-checkbox" type="checkbox"&gt;</code> which is selected, then:</p>

<ul>
<li>Invert all the colours on <em>everything</em> on the site.</li>
<li>Manually set the background of the body, because the above is only filtering the descendants of the body.</li>
<li>Find any images and invert them, so they're the right colour.</li>
</ul>

<p>Here's some minimum viable HTML:</p>

<pre><code class="language-html">&lt;body&gt;
  &lt;input id="dark-mode-checkbox" type="checkbox"&gt;
  &lt;label class="dark-mode-label" for="dark-mode-checkbox"&gt;Enable dark mode&lt;/label&gt;
  &lt;h1&gt;Heading&lt;/h1&gt;
  &lt;p&gt;Test&lt;/p&gt;
  &lt;img src="https://placecats.com/128/128" alt="A cute cat"&gt;
&lt;/body&gt;
</code></pre>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2023/10/laziest-possible-dark-mode-toggle-using-has-and-invert/#demo">Demo</a></h2>

<p>You can <a href="https://codepen.io/edent/pen/NWeQZOy">play with the demo</a>.</p>

<p>It should look like this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/lightmode-fs8.png" alt="A light website with a photo of a kitten." width="326" height="352" class="size-full wp-image-48486"><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/darkmode-fs8.png" alt="A dark website with a photo of a kitten." width="326" height="352" class="size-full wp-image-48487"></p>

<h2 id="caveat"><a href="https://shkspr.mobi/blog/2023/10/laziest-possible-dark-mode-toggle-using-has-and-invert/#caveat">Caveat</a></h2>

<p>A few issues:</p>

<ol>
<li>This doesn't yet work on Firefox. Even if you enable <code>layout.css.has-selector.enabled</code> in about:config. Support is coming soon™.</li>
<li>Inverting colours isn't the same as a properly designed dark mode. You absolutely shouldn't use this in production.</li>
<li>There are no accessibility guarantees.  Please test this before subjecting your users to it.</li>
<li>This doesn't remember your user's choice. So they'll need to toggle it on every page load.</li>
<li>Who knows what eldritch horrors this will unleash upon humanity.</li>
</ol>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48485&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/laziest-possible-dark-mode-toggle-using-has-and-invert/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Find WordPress featured images with no alt text]]></title>
		<link>https://shkspr.mobi/blog/2023/10/find-wordpress-featured-images-with-no-alt-text/</link>
					<comments>https://shkspr.mobi/blog/2023/10/find-wordpress-featured-images-with-no-alt-text/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 20 Oct 2023 11:34:24 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[AltText]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48359</guid>

					<description><![CDATA[WordPress allows you to set a featured image - called a &#34;thumbnail&#34; in the API. This gives a single image which can be used on a listing page, or shown when a post is shared on social media.  The WordPress Media Library lets you set the alt text of an image. But, crucially, this alt text can be different when the image is used as a featured image.  Here&#039;s how to find all your featured images…]]></description>
										<content:encoded><![CDATA[<p>WordPress allows you to set a featured image - called a "thumbnail" in the API. This gives a single image which can be used on a listing page, or shown when a post is shared on social media.</p>

<p>The WordPress Media Library lets you set the alt text of an image. But, crucially, this alt text can be different when the image is used as a featured image.</p>

<p>Here's how to find all your featured images which don't have alt text.</p>

<h2 id="one-liner"><a href="https://shkspr.mobi/blog/2023/10/find-wordpress-featured-images-with-no-alt-text/#one-liner">One Liner</a></h2>

<p>Paste this into <code>wp shell</code> to get a list.</p>

<pre><code class="language-php">foreach (get_posts( array( 'post_type' =&gt; 'post', 'post_status' =&gt; array('publish'), 'posts_per_page' =&gt; -1,) ) as $post) { if( simplexml_load_string( get_the_post_thumbnail($post) )["alt"] == "") { echo $post-&gt;post_date . " " . get_site_url(). "/wp-admin/post.php?post=" . $post-&gt;ID . "&amp;action=edit " . $post-&gt;post_title . "\n"; } }
</code></pre>

<h2 id="an-explanation"><a href="https://shkspr.mobi/blog/2023/10/find-wordpress-featured-images-with-no-alt-text/#an-explanation">An explanation</a></h2>

<p>To get the image element of the featured image, use <code>get_the_post_thumbnail(1234);</code> That will spit back:</p>

<pre><code class="language-html">&lt;img width="800" height="400" 
     src="https://example.com/test.png"
     class="attachment-post-thumbnail size-post-thumbnail wp-post-image"
     alt="This is some alt text."
     decoding="async" loading="lazy" /&gt;"
</code></pre>

<p>If there's no alt, you'll see <code>alt=""</code>.</p>

<p>Getting an attribute out of a scrap of HTML is simple. We're going to be naughty and pretend this is XML. Shhh! Don't tell the W3C!</p>

<pre><code class="language-php">$xml = simplexml_load_string( get_the_post_thumbnail(1234) );
</code></pre>

<p>The alt text can be retrieved with:</p>

<pre><code class="language-php">$alt = $xmlEl["alt"];
</code></pre>

<p>So anything where <code>$xmlEl["alt"] == ""</code> is an image without alt text.</p>

<p>Finally, the code generates a link to the edit page of the post.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48359&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/find-wordpress-featured-images-with-no-alt-text/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I think I kind of hate lazy loading]]></title>
		<link>https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/</link>
					<comments>https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 12 Sep 2023 11:34:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46755</guid>

					<description><![CDATA[Yesterday I was on a train. I clicked on a link and my browser loaded a long article for me to read. Halfway through reading it, the train went into a tunnel and I lost signal.  That meant I couldn&#039;t see the images on the other half of the page for the rest of the journey.  I had a sea of broken images.    Even though the page had fully loaded, the images were set to &#34;lazy&#34; loading. When my…]]></description>
										<content:encoded><![CDATA[<p>Yesterday I was on a train. I clicked on a link and my browser loaded a long article for me to read. Halfway through reading it, the train went into a tunnel and I lost signal.</p>

<p>That meant I couldn't see the images on the other half of the page for the rest of the journey.  I had a sea of broken images.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/broken-image.png" alt="An icon representing a broken image." width="644" height="314" class="aligncenter size-full wp-image-46759">

<p>Even though the <em>page</em> had fully loaded, the images were set to "lazy" loading. When my browser sees <code>&lt;img src="example.jpg" loading="lazy" /&gt;</code> it defers downloading the picture until it is about to scroll into view.</p>

<p>There's a few reasons why this is a good thing. If I leave the page before scrolling down, the browser doesn't waste time, energy, or bandwidth downloading images which will never be seen. That's good for my battery life and cheaper for my bill. It also saves the server from flinging bits around the world which are promptly trashed<sup id="fnref:hyp"><a href="https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/#fn:hyp" class="footnote-ref" title="I am, of course, a massive hypocrite and use Lazy Loading on this blog for those very same reasons." role="doc-noteref">0</a></sup>.</p>

<p>And yet...</p>

<p>It seems that every time I'm on a train - or somewhere else with spotty Internet access - I run in to a situation where I <em>previously had</em> plenty of bandwidth and battery, but my user-agent decided it knew best. So it didn't attempt to load images until <em>after</em> I lost signal.</p>

<p>There's no way to disable Lazy Loading on Android Chrome or Android Firefox.</p>

<p>So, I guess I'm stuck.  Lazy loading seems like one of those things which is great in certain circumstances, but has a pretty horrible failure mode<sup id="fnref:alt"><a href="https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/#fn:alt" class="footnote-ref" title="Made worse by poor or non-existent alt text." role="doc-noteref">1</a></sup>.</p>

<p>Anyone else feel this way?</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:hyp">
<p>I am, of course, a massive hypocrite and use Lazy Loading on this blog for those very same reasons.&nbsp;<a href="https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/#fnref:hyp" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:alt">
<p>Made worse by poor or non-existent alt text.&nbsp;<a href="https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/#fnref:alt" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46755&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/09/i-think-i-kind-of-hate-lazy-loading/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Should you embed alt text inside image metadata?]]></title>
		<link>https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/</link>
					<comments>https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 28 Jul 2023 11:34:13 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[AltText]]></category>
		<category><![CDATA[exif]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46340</guid>

					<description><![CDATA[Not everyone can see the images you post online. They may have vision problems, they may have a slow connection, or they might be using a text-only browser. How can we let them know what the image shows? The answer is alt text. In HTML we can add a snippet of text to aid accessibility.  For example &#60;img src=&#34;monalisa.jpg&#34; alt=&#34;A painting of the Mona Lisa.&#34;&#62;  Most social networks will let users…]]></description>
										<content:encoded><![CDATA[<p>Not everyone can see the images you post online. They may have vision problems, they may have a slow connection, or they might be using a text-only browser. How can we let them know what the image shows? The answer is <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/alt">alt text</a>. In HTML we can add a snippet of text to aid accessibility.</p>

<p>For example <code>&lt;img src="monalisa.jpg" alt="A painting of the Mona Lisa."&gt;</code></p>

<p>Most social networks will let users add alt text to help describe their images. Brilliant!</p>

<p>But... People don't always add alt text when they upload an image. They may not realise it is helpful, or they don't know how to write a good description, or they may not have time to write something suitable.  This leads to a frequently asked question: "Should I embed the alt text <em>inside</em> the image file? That way, whenever people share the image the alt text will automatically be attached!"</p>

<p>Here's my attempt to answer that.</p>

<h2 id="short-answer"><a href="https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/#short-answer">Short answer</a></h2>

<p>No.</p>

<h2 id="long-answer"><a href="https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/#long-answer">Long answer</a></h2>

<p>Nooooooooooooo!</p>

<h2 id="reasoned-answer"><a href="https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/#reasoned-answer">Reasoned Answer</a></h2>

<p>It is complicated.</p>

<p>On a technical level, yes. Most modern image formats allow you to add image <em>metadata</em> - known as EXIF. This EXIF commonly contains GPS location, timestamps, make and model of camera, etc. Here's an example from one of my photos:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/exifinfo-fs8.png" alt="Screenshot showing technical details of the metadata on a photo. It contains a copyright notice." width="1024" height="560" class="aligncenter size-full wp-image-46358">

<p>There are a <a href="https://exiftool.org/TagNames/EXIF.html">pre-defined list of acceptable EXIF tags</a> one of which is "ImageDescription", which is <a href="https://exiv2.org/Exif2-2.PDF">defined as</a>:</p>

<blockquote><p>A character string giving the title of the image. It may be a comment such as "1988 company picnic" or the like. Two-byte character codes cannot be used. When a 2-byte code is necessary, the Exif Private tag UserComment is to be used.</p></blockquote>

<p>So, there you have it. Yes you <em>can</em> embed text inside an image. With the right software you can read it. So, technically, you can stuff alt text in there and have a website automatically add it to the <code>alt</code> attribute.</p>

<p>But this is only <em>half</em> the story. What an image represents is highly context dependent.</p>

<p>In her article about <a href="https://tink.uk/thoughts-on-screen-readers-and-image-recognition/">using AI to automatically provide image captions</a>, Léonie Watson makes that point that alt text needs to be:</p>

<blockquote><p>provided by a content author who knows exactly what's in the image, why its being used and the context its being used in.</p></blockquote>

<p>Take this very real photo of a famous actress who I just got an AI to dream up.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Woman-celebrity-red-dress-smiling-evil-eyes-holding-a-knife-red-carpet-arm-tattoo.jpg" alt="An AI generate image based on the text &quot;Woman, celebrity, red dress, smiling, evil eyes, holding a knife, red carpet, arm tattoo.&quot;" width="512" height="512" class="aligncenter size-full wp-image-46359">

<p>What's a suitable alt text for this image?</p>

<ul>
<li>Famous actress Claire Flumptron standing on the red carpet.</li>
<li>Claire Flumptron shows off her brand new arm tattoo which has strange mystic runes covering her forearm.</li>
<li>Designer Giovanni Tuccini's new red dress has a small strap over the shoulder.</li>
<li>AI image where the hand is strangely deformed and the neck looks twisted beyond human endurance.</li>
<li>Smiling woman with cropped blonde hair and heavy eye makeup.</li>
<li>Last known photo of the Mayor (right). His blurry face is smiling.</li>
<li>...</li>
</ul>

<p>There's no "right" answer. It depends on <em>what</em> the image is being used to illustrate.</p>

<p>A picture may be worth a thousand words. But those thousand words depend on context.</p>

<hr>

<p><ins datetime="2025-10-07T09:03:26+00:00">Update</ins> Here's another good example of embedded alt text failing badly.</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://files.mastodon.social/accounts/avatars/000/007/112/original/37df032a5951b96c.jpg" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="terence-eden"><a href="https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/#terence-eden">Terence Eden</a></h2> <a href="https://mastodon.social/users/Edent" class="ap-account u-url">@Edent@mastodon.social</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p>Whenever people talk about embedding alt text into images, I remember that lots of gif search services already try to do that.</p><p>Here's BlueSky's gif service. I searched for some popular memes. Each had alt-text baked in.</p><p>Take a look and tell me if you think that the embedded text conveys the sentiment of the image? If you couldn't see the animation, would you understand what was going on from that alt?</p></div> <div class="ap-preview layout-4"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/975/730/482/original/1e7cc65db6887d11.png" alt="The idiot sandwich meme. The default alt text is &quot;a man is holding a piece of bread over a woman 's face and asking what are you ?&quot;"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/976/199/735/original/dd22dab9aa5a0fb1.png" alt="Clip from The Hobbit with the subtitle &quot;What about second breakfast?&quot;. The default alt text is &quot;two men are standing next to each other talking about second breakfast&quot;."> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/985/649/025/original/91e0e747e8e4da5a.png" alt="The meme of Homer Simpson walking backwards into a hedge. The default alt text is &quot;A cartoon of homer simpson standing in a grassy area.&quot;"> <img class="u-photo u-featured" src="https://files.mastodon.social/media_attachments/files/115/165/042/993/873/973/original/f97c27accad5c0f9.png" alt="The Chuckle Brothers looking at each other. The default alt text is &quot;a man in a striped shirt is kissing another man in a white suit&quot;."> </div> </div> <div class="activitypub-embed-meta"> <a href="https://mastodon.social/users/Edent/statuses/115165068315048568" class="ap-stat ap-date dt-published u-in-reply-to">2025-09-07, 21:11</a> <span class="ap-stat"> <strong>12</strong> boosts </span> <span class="ap-stat"> <strong>22</strong> favorites </span> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<hr>

<p>For more information on writing good alt text, see <a href="https://accessibility.huit.harvard.edu/describe-content-images">Harvard's Digital Accessibility​ blog</a> and <a href="https://design102.blog.gov.uk/2022/01/14/whats-the-alternative-how-to-write-good-alt-text/">Design102's guide</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46340&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/should-you-embed-alt-text-inside-image-metadata/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[This link is only available by keyboard navigation]]></title>
		<link>https://shkspr.mobi/blog/2023/07/this-link-is-only-available-by-keyboard-navigation/</link>
					<comments>https://shkspr.mobi/blog/2023/07/this-link-is-only-available-by-keyboard-navigation/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 18 Jul 2023 11:34:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[HTML5]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46263</guid>

					<description><![CDATA[There&#039;s a link, right here ➡️⬅️ but, if you&#039;re on a touchscreen, you can&#039;t tap on it.  Using a mouse? Nope, that won&#039;t work either.  The only way to navigate to it is via keyboard navigation. Hit your Tab ⭾ button!  There&#039;s a little bit of me wants to build an entire website which can only be navigated by keyboard. What would the world look like if Engelbart never invented the mouse? Or if Johnson…]]></description>
										<content:encoded><![CDATA[<p>There's a link, right here ➡️<a href="https://mastodon.social/@Edent/109938468546563419" title="Top Secret Message"></a>⬅️ but, if you're on a touchscreen, you can't tap on it.</p>

<p>Using a mouse? Nope, that won't work either.</p>

<p>The only way to navigate to it is via keyboard navigation. Hit your Tab ⭾ button!</p>

<p>There's a little bit of me wants to build an entire website which can <em>only</em> be navigated by keyboard. What would the world look like if Engelbart never <a href="https://en.wikipedia.org/wiki/The_Mother_of_All_Demos">invented the mouse</a>? Or if Johnson never <a href="https://arstechnica.com/gadgets/2013/04/from-touch-displays-to-the-surface-a-brief-history-of-touchscreen-technology/">published his work on touchscreens</a>?</p>

<p>Anyway, there are two ways to do this.  The first is to create an anchor with no content.</p>

<p><code>&lt;a href="https://example.com/"&gt;&lt;/a&gt;</code></p>

<p>Because there's no content between the opening and closing <code>&lt;a&gt;</code> elements, most browsers won't present it as a target for a mouse cursor or finger.</p>

<p>There's a second method, which only works at discouraging mouse use. It's possible to <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/cursor">style a cursor with CSS</a>. And that style can be "none"</p>

<pre><code class="language-css">*, *:hover { 
  cursor: none !important; 
}
</code></pre>

<p><span style="cursor:none !important;">The cursor is still there, but it is invisible. Which makes it <a href="https://example.com/" title="Where has your cursor gone?" style="cursor:none !important;">difficult to know where your mouse is clicking</a>.</span></p>

<p>Now, should you do this? No. It is silly. Reducing accessibility like this is never a good idea. But it is a fun experiment.</p>

<p>Thanks to <a href="https://front-end.social/@matuzo/110671054774143915">Manuel Matuzović for inspiring me</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46263&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/this-link-is-only-available-by-keyboard-navigation/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Unicode Roman Numerals and Screen Readers]]></title>
		<link>https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/</link>
					<comments>https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 15 Mar 2023 12:34:02 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[Latin]]></category>
		<category><![CDATA[romans]]></category>
		<category><![CDATA[tts]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45103</guid>

					<description><![CDATA[How would you read this sentence out aloud?  &#34;In Hamlet, Act Ⅳ, Scene Ⅸ...&#34;  Most people with a grasp of the interplay between English and Latin would say &#34;In Hamlet, Act four, scene nine&#34;.  And they&#039;d be right!  But screen-readers - computer programs which convert text into speech - often get this wrong.  Why? Well, because I didn&#039;t just type &#34;Uppercase Letter i, Uppercase Letter v&#34;. Instead, I u…]]></description>
										<content:encoded><![CDATA[<p>How would you read this sentence out aloud?</p>

<p>"In Hamlet, Act Ⅳ, Scene Ⅸ..."</p>

<p>Most people with a grasp of the interplay between English and Latin would say "In Hamlet, Act four, scene nine".  And they'd be right!  But screen-readers - computer programs which convert text into speech - often get this wrong.</p>

<p>Why? Well, because I didn't just type "Uppercase Letter i, Uppercase Letter v". Instead, I used the Unicode symbol for the Roman numeral 4 - <code>Ⅳ</code>.  And, it turns out, lots of screen-readers have a problem with those characters.</p>

<h2 id="dont-know-much-about-history"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#dont-know-much-about-history">Don't Know Much About History</a></h2>

<p>Unicode contains the range of Roman numbers from 1 - 10, plus a couple of compound numbers, 50, 100, 500, and 1000 - in a variety of forms.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Screenshot-2023-03-04-at-00-05-15-Numerals-in-Unicode-Wikipedia.png" alt="Screenshot of a Table of Roman numerals in Unicode." width="927" height="244" class="aligncenter size-full wp-image-45110">

<p>Why does Unicode contain these number which, to most people, are just squashed together Latin letter?  As ever with Unicode, it is a mix of legacy and practicality.</p>

<p>The <a href="https://www.unicode.org/versions/Unicode6.0.0/ch15.pdf">Unicode standard says</a>:</p>

<blockquote><p><strong>Roman Numerals.</strong> For most purposes, it is preferable to compose the Roman numerals from sequences of the appropriate Latin letters. However, the uppercase and lowercase variants of the Roman numerals through 12, plus L, C, D, and M, have been encoded for compatibility with East Asian standards. Unlike sequences of Latin letters, these symbols remain upright in vertical layout. Additionally, in certain locales, compact date formats use Roman numerals for the month, but may expect the use of a single character.</p></blockquote>

<p>Far be it for me to disagree with the learned authors of the spec, but I think they may have erred slightly on this one.  While it may be <em>preferable</em> to re-use Latin letters, it leads to ambiguity which can be confusing for a screen-reader.</p>

<h2 id="practical-examples"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#practical-examples">Practical Examples</a></h2>

<p>Let's write out the numbers using regular letters. Suppose you were talking about "Romeo and Juliet, Act III, Scene I".  Most screen readers will see the "III" and correctly speak aloud "Roman three" or similar. But when they get to the "I" it becomes ambiguous. Most will read out "Eye".</p>

<p>Screen-readers rarely look at the whole sentence for context. Which means they get confused. It's fairly obvious that XIV should be "fourteen" as there's no English word "xiv"<sup id="fnref:scrabble"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#fn:scrabble" class="footnote-ref" title="I'm sure there's some obscure Scrabble word, but we're talking everyday use here." role="doc-noteref">0</a></sup>. But what about "MIX" - is that 1009 or the word "mix"?</p>

<p>Anyone who has watched the BBC knows about their fondness for displaying in Latin the year a programme was made. MCMXCVI is particularly challenging for a screen-reader!</p>

<h2 id="testing-it"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#testing-it">Testing It</a></h2>

<p>I took the following sample sentence - using both letters and Roman numerals.</p>

<blockquote><p>Text. In Hamlet, Act I, Scene XI the year is MCMXCVI and they are watching Rocky V.</p>

<p>Roman. In Hamlet, Act Ⅰ, Scene Ⅺ the year is ⅯⅭⅯⅩⅭⅥ and they are watching Rocky Ⅴ.</p></blockquote>

<p>Here's how various services coped:</p>

<h3 id="amazon-polly"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#amazon-polly">Amazon Polly</a></h3>

<p>First, the good news. Amazon's Polly read the Roman numerals perfectly. It even pronounced <code>ⅯⅭⅯⅩⅭⅥ</code> as "nineteen ninety six".
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/polly-roman-test.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/polly-roman-test.mp3">Download this audio file</a>.</p>
	</audio>
</figure>
But it gets rather confused with the ambiguous English text.<p></p>

<h3 id="microsoft-edge-read-aloud"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#microsoft-edge-read-aloud">Microsoft Edge Read Aloud</a></h3>

<p>I tried with <a href="https://pypi.org/project/edge-tts/">Microsoft Edge's Read Aloud TTS</a>.</p>

<p></p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/edge.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/edge.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>It and makes a bit of a hash of the English and just skips the Roman numerals.</p>

<h3 id="google-text-to-speech"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#google-text-to-speech">Google Text To Speech</a></h3>

<p>The same was also true with <a href="https://cloud.google.com/text-to-speech/">Google's TTS products</a>.</p>

<p></p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/gtts.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/gtts.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<h3 id="espeak-ng"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#espeak-ng">Espeak NG</a></h3>

<p>The <a href="https://github.com/espeak-ng/espeak-ng">venerable Linux utility</a> came out with this. 
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/espeak.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/espeak.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>It gets the "Capital i" incorrect, and reads the Roman numerals as their Unicode code points.</p>

<h3 id="jaws"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#jaws">Jaws</a></h3>

<p>My good friend <a href="https://tink.uk/about-leonie/">Léonie Watson</a> who <a href="https://tink.uk/">writes extensively about accessibility</a> was kind enough to record some other samples for me.</p>

<p>Here are Jaws' "Expressive":
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Vocalizer-Expressive-Kate-TTS.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Vocalizer-Expressive-Kate-TTS.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>And Jaws' "Eloquence:
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Eloquence-TTS-Reed.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Eloquence-TTS-Reed.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<h3 id="nvda"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#nvda">NVDA</a></h3>

<p>Léonie also provided a recording of NVDA Microsoft One Core
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/NVDA_Microsoft-One-Core-TTS-Michael.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/NVDA_Microsoft-One-Core-TTS-Michael.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<h3 id="narrator"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#narrator">Narrator</a></h3>

<p>And here's Narrator making a right mess of it.
</p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Narrator_Natural-Voices-TTS-Guy.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Narrator_Natural-Voices-TTS-Guy.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<h3 id="others"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#others">Others</a></h3>

<p>If you know of any other screen-readers, or text-to-speech engines which can cope with this, please let me know!</p>

<h2 id="fixing-it"><a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#fixing-it">Fixing it</a></h2>

<p>On Linux, I <a href="https://github.com/espeak-ng/espeak-ng/pull/1672">raised a Pull Request to fix espeak-ng</a>.</p>

<p>The rest of the services don't seem to have a way to easily report bugs to them.  If you know a way to raise issues with these screen readers - please do so!</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:scrabble">
<p>I'm sure there's some obscure Scrabble word, but we're talking everyday use here.&nbsp;<a href="https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/#fnref:scrabble" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45103&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/03/unicode-roman-numerals-and-screen-readers/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/polly-roman-test.mp3" length="89325" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/edge.mp3" length="84672" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/gtts.mp3" length="66912" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/espeak.mp3" length="86536" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Vocalizer-Expressive-Kate-TTS.mp3" length="562364" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Jaws_Eloquence-TTS-Reed.mp3" length="468950" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/NVDA_Microsoft-One-Core-TTS-Michael.mp3" length="314723" type="audio/mpeg" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2023/03/Narrator_Natural-Voices-TTS-Guy.mp3" length="273345" type="audio/mpeg" />

			</item>
		<item>
		<title><![CDATA[How to style your alt text]]></title>
		<link>https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/</link>
					<comments>https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 25 Feb 2023 12:34:32 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45024</guid>

					<description><![CDATA[Every day is a school day. I&#039;d recently seen a post about highlighting images without alt text. That got me thinking. Is it possible to style alt text?  Yes. Yes it is. And it&#039;s pretty simple.  Well, OK, it&#039;s CSS, so simple is a relative term!  Let&#039;s take a broken image like &#60;img src=&#34;http://example.com/bigfoot.jpg&#34; alt=&#34;The best quality photo of bigfoot!&#34; /&#62;  There are two slightly different…]]></description>
										<content:encoded><![CDATA[<p>Every day is a school day. I'd recently seen a post about <a href="https://robertwray.co.uk/blog/being-more-accessible-highlighting-images-that-don-t-have-alternate-text">highlighting images <em>without</em> alt text</a>. That got me thinking. Is it possible to <em>style</em> alt text?</p>

<p>Yes. Yes it is. And it's pretty simple.  Well, OK, it's CSS, so simple is a relative term!</p>

<p>Let's take a broken image like <code>&lt;img src="http://example.com/bigfoot.jpg" alt="The best quality photo of bigfoot!" /&gt;</code></p>

<p>There are two slightly different ways to style the text.</p>

<p>The simplest way is to give the image some CSS relating to its font, colour, and background.</p>

<pre><code class="language-css">img {
    font-family: monospace;
    color: #000;
    background: yellow;
}
</code></pre>

<p>If the image loads, the CSS has no effect (well, you might see the background colour if the image loads slowly or if it is transparent). But if the image fails, the alt text picks up the font and text colour specified. That seems to work reliably on Firefox, Chrome, and WebKit.</p>

<p>With Firefox, however, you can go a little further.  The alt text of a missing image is appended to the DOM as a <code>::before</code> pseudo element.  Which means it can be styled directly.</p>

<pre><code class="language-css">img::before {
    font-family: monospace;
    color: #000;
    border: .25em dotted red;
    background: yellow;
    padding: .25em;
}
</code></pre>

<p>You can go as ridiculous as you like. It will only show up when an image fails to load.  Sadly, that does seem to be FF specific. I couldn't get it working in Chrome or Safari.</p>

<p>There's one more thing you can do. You can append text to the end of your alt. For example:</p>

<pre><code class="language-css">img::after {
    content: &amp;quot; Image did not load.&amp;quot;;
}
</code></pre>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/#demo">Demo</a></h2>

<img src="https://example.com/nothing.jpg" alt="This is an example of a missing image." width="600" height="200">

<pre><code class="language-css">img {
    font-family: monospace;
    color: #000;
    background: yellow;
    box-shadow:inset 0px 0px 0px 1px #f00;
}
img::before {
    font-family: monospace;
    color: #000;
    border: .25em dotted #f00;
    background: #ff0;
    padding: .25em;
}
img::after {
    content: &amp;quot; ❌&amp;quot;;
}
</code></pre>

<h2 id="cross-platform-compatibility"><a href="https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/#cross-platform-compatibility">Cross Platform Compatibility</a></h2>

<p>I've tested in on the three major browser rendering engines:</p>

<table>
<thead>
<tr>
  <th></th>
  <th align="center"><code>::before</code></th>
  <th align="center"><code>::after</code></th>
  <th align="center"><code>img</code></th>
</tr>
</thead>
<tbody>
<tr>
  <td>Firefox</td>
  <td align="center">✅</td>
  <td align="center">✅</td>
  <td align="center">✅</td>
</tr>
<tr>
  <td>Chrome</td>
  <td align="center">❌</td>
  <td align="center">✅</td>
  <td align="center">✅</td>
</tr>
<tr>
  <td>Safari</td>
  <td align="center">❌</td>
  <td align="center">❌</td>
  <td align="center">✅</td>
</tr>
</tbody>
</table>

<p>Do note that Safari will only display the alt text if the image is large enough to contain it.</p>

<iframe src="https://mastodon.social/@simevidas/109935983390494346/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" height="600" allowfullscreen="allowfullscreen"></iframe>

<script src="https://mastodon.social/embed.js" async="async"></script>

<h2 id="should-i-use-this"><a href="https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/#should-i-use-this">Should I use this?</a></h2>

<p>That's kinda up to you, sport. I think it's an interesting way to make it obvious that an image has broken. If you do use it, please make sure that the alt text is as legible as possible.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45024&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/02/how-to-style-your-alt-text/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Twitter's archive doesn't have alt text - but Mastodon's does!]]></title>
		<link>https://shkspr.mobi/blog/2022/11/twitters-archive-doesnt-have-alt-text-but-mastodons-does/</link>
					<comments>https://shkspr.mobi/blog/2022/11/twitters-archive-doesnt-have-alt-text-but-mastodons-does/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 15 Nov 2022 12:34:45 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[mastodon]]></category>
		<category><![CDATA[MastodonAPI]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43986</guid>

					<description><![CDATA[Because I don&#039;t trust Alan, the Hyperprat who now runs Twitter, I decided to download my Twitter archive before setting my account to dormant.  About a decade ago, I wrote about how the Twitter archive works and where it is deficient.  Things have got better, but there are still annoying limitations.  For example, Hannah Kolbeck - founder of the Alt Text Reminder Bot recently pointed out that…]]></description>
										<content:encoded><![CDATA[<p>Because I don't trust Alan, the Hyperprat who now runs Twitter, I decided to download my Twitter archive before setting my account to dormant.</p>

<p>About a decade ago, <a href="https://shkspr.mobi/blog/2013/02/deficiencies-in-the-twitter-archive/">I wrote about how the Twitter archive works and where it is deficient</a>.  Things have got better, but there are still annoying limitations.</p>

<p>For example, <a href="https://www.patreon.com/posts/introducing-alt-70133193">Hannah Kolbeck - founder of the Alt Text Reminder Bot</a> recently pointed out that there's no alt text in the archives.</p>

<p>Here's a snippet of Twitter's JSON for an image I posted:</p>

<pre><code class="language-json">"media" : [
   {
      "expanded_url" : "https://twitter.com/edent/status/1579574033720705025/photo/1",
      "indices" : [
        "66",
        "89"
      ],
      "url" : "https://t.co/J1hr0ZfbTl",
      "media_url" : "http://pbs.twimg.com/media/FevGM32XEAA0FX2.jpg",
      "id_str" : "1579574018776174592",
      "id" : "1579574018776174592",
      "media_url_https" : "https://pbs.twimg.com/media/FevGM32XEAA0FX2.jpg",
      "sizes" : {
           "small" : {
                "w" : "680",
                "h" : "510",
                "resize" : "fit"
              },
              "medium" : {
                "w" : "1200",
                "h" : "900",
                "resize" : "fit"
              },
              "thumb" : {
                "w" : "150",
                "h" : "150",
                "resize" : "crop"
              },
              "large" : {
                "w" : "1236",
                "h" : "927",
                "resize" : "fit"
              }
       },
       "type" : "photo",
       "display_url" : "pic.twitter.com/J1hr0ZfbTl"
     }
],
</code></pre>

<p>Lots of different media sizing options, but no room for accessibility.</p>

<p>By comparison, the <a href="https://joinmastodon.org/">Mastodon social network</a> gives you the alt text. Here's a snippet of Mastodon's JSON for the same image which was cross-posted:</p>

<pre><code class="language-json">"attachment": [
   {
     "type": "Document",
     "mediaType": "image/jpeg",
     "url": "/media_attachments/files/109/145/933/102/890/212/original/84ae501e39f45091.jpg",
     "name": "A sign for priority seating. The pregnant person's face has been replaced by 😍. The person holding a baby has a face of 😫. The elderly person with a cane has 🥴.",
     "blurhash": "UhKdk{0LRit6-:t6WCWC-oxaRmWBozt7xaa|",
     "width": 1236,
     "height": 927
   }
],
</code></pre>

<p>Mastodon is a friendlier alternative to Twitter and - mostly - gets accessibility right.  There's still some work to do</p>

<iframe src="https://mastodon.social/@Edent/109332316198045303/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" height="500" allowfullscreen="allowfullscreen"></iframe>

<script src="https://static-cdn.mastodon.social/embed.js" async="async"></script>

<p>You can fix Twitter's missing alt text using <a href="https://web.archive.org/web/20220815042000/https://alt-text.org/">Hannah's Alt Text Archive Tool</a>.  That'll get you a JSON file full of your alt text, which you can use to recreate your archive.</p>

<p>Look, it's obvious that <a href="https://techcrunch.com/2022/11/04/elon-musk-twitter-layoffs/">Alan doesn't give a flying fuck about accessibility</a>, so I don't expect this to change any time soon.</p>

<p>Instead, people should do what they did when MySpace went to shit; move to a different platform.</p>

<p><a href="https://joinmastodon.org/">Join Mastodon today</a>!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43986&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/11/twitters-archive-doesnt-have-alt-text-but-mastodons-does/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Woohoo! WordPress accepted my accessibility PR]]></title>
		<link>https://shkspr.mobi/blog/2022/11/woohoo-wordpress-accepted-my-accessibility-pr/</link>
					<comments>https://shkspr.mobi/blog/2022/11/woohoo-wordpress-accepted-my-accessibility-pr/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 02 Nov 2022 12:34:29 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43914</guid>

					<description><![CDATA[About 2.5 years ago I proposed a small accessibility improvement to WordPress.  It has taken a bit longer than I&#039;d hoped but, as of WordPress 6.1 it has been merged!  Now, if you&#039;re using the Classic editor, you&#039;ll get a larger and resizeable box for entering alt text.    Because the text entry uses &#60;textarea&#62; most browsers will also show any spelling errors. Good spelling is essential for people …]]></description>
										<content:encoded><![CDATA[<p>About 2.5 years ago I proposed <a href="https://shkspr.mobi/blog/2020/05/a-small-accessibility-improvement-to-wordpress/">a small accessibility improvement to WordPress</a>.  It has taken a bit longer than I'd hoped but, as of <a href="https://make.wordpress.org/core/2022/10/11/wordpress-6-1-accessibility-improvements/">WordPress 6.1</a> it has been merged!</p>

<p>Now, if you're using the Classic editor, you'll get a larger and resizeable box for entering alt text.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/11/Screenshot-2022-11-02-at-11-57-50-Edit-Post-Book-Review-The-Language-Hoax-John-H.-McWhorter-‹-Terence-Edens-Blog-—-WordPress.png" alt="Screenshot of a box to enter alt text. It is two lines high and is resizeable." width="548" height="512" class="aligncenter size-full wp-image-43915">

<p>Because the text entry uses <code>&lt;textarea&gt;</code> most browsers will also show any spelling errors. Good spelling is essential for people who use text-to-speech to read out alt text.</p>

<p>Huge thanks to the WordPress team for doing <a href="https://core.trac.wordpress.org/ticket/50066">all the hard work</a> to make sure this works properly. I hope this will encourage people to write longer and more useful alt text.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43914&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/11/woohoo-wordpress-accepted-my-accessibility-pr/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Different ways to do separators in horizontal text]]></title>
		<link>https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/</link>
					<comments>https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 16 May 2022 11:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[semantic web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42489</guid>

					<description><![CDATA[Quite often on the web, you&#039;ll see a set of &#34;things&#34; with a separator between them.  For example, at the top of this post, you&#039;ll see  Thing 1 &#124; Something Else &#124; Another Thing.  This provides clear visual separation between logical groups. But there are a couple of problems. Firstly, the separator character may not be interpreted correctly by screen readers. They may read out &#34;Vertical Pipe&#34;,…]]></description>
										<content:encoded><![CDATA[<p>Quite often on the web, you'll see a set of "things" with a separator between them.  For example, at the top of this post, you'll see</p>

<p>Thing 1 | Something Else | Another Thing.</p>

<p>This provides clear <em>visual</em> separation between logical groups. But there are a couple of problems. Firstly, the separator character may not be interpreted correctly by screen readers. They may read out "Vertical Pipe", which isn't very user friendly. Similarly, robots may not attach the correct semantics to the separator. Which is a problem if you're trying to do machine learning on text.</p>

<p>HTML and CSS are about the separation of content and style. So let's examine the ways we can provide a better way to do separators.</p>

<h2 id="hide-them"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#hide-them">Hide Them</a></h2>

<p>I think that this is the least satisfying method.</p>

<pre><code class="language-html">&lt;span aria-hidden="true"&gt;|&lt;/span&gt; Thing 1 &lt;span aria-hidden="true"&gt;|&lt;/span&gt; Something else
</code></pre>

<p>The <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-hidden"><code>aria-hidden</code></a> tag hides the content from accessibility software. It is specifically designed to remove purely decorative items. But, because the separators are simply removed, the text runs together. That's a problem for screen readers.</p>

<h2 id="css-borders"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#css-borders">CSS Borders</a></h2>

<p>This is another popular way to visually distinguish groups.</p>

<pre><code class="language-css">span {
   border-right: solid #000 1px;
}
</code></pre>

<pre><code class="language-html">&lt;span&gt;Thing 1&lt;/span&gt; &lt;span&gt;Another thing&lt;/span&gt;
</code></pre>

<p>You can style the CSS however you like. Depending on your layout, you may need to use <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:not"><code>:not()</code></a> on the last element to prevent an unnecessary separator.</p>

<p>But, again, there's no way for a screen reader or robot to know that the content is supposed to be distinct from each other.</p>

<h2 id="%e2%8b%aebefore-and-after"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#%e2%8b%aebefore-and-after"><code>⋮:before</code> and <code>::after</code>?</a></h2>

<p>Similarly, the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::before"><code>::before</code></a> and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/::after"><code>::after</code></a> selectors can be used to add content before/after an element:</p>

<pre><code class="language-css">span::after {
   content: " | ";
}
</code></pre>

<pre><code class="language-html">&lt;span&gt;Thing 1&lt;/span&gt; &lt;span&gt;Another thing&lt;/span&gt;
</code></pre>

<h2 id="abuse-the-element"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#abuse-the-element">Abuse the <code>&lt;hr&gt;</code> element?</a></h2>

<p>This is a bit wacky. The <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr"><code>&lt;hr&gt;</code></a> element is a - somewhat - outdated way to provide a sectioning break by drawing a horizontal line. But it is accessible in CSS. By changing its rotation and width, it makes a passable vertical separator!</p>

<pre><code class="language-css">hr {
   rotate: 90deg;
   width: 1em;
}
</code></pre>

<pre><code class="language-html">Thing 1 &lt;hr style=""&gt; Another thing
</code></pre>

<p>It can be a bit tricky to get the styling just right - but it will effectively separate logical groups.</p>

<h2 id="list-styling"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#list-styling">List styling</a></h2>

<p>I like using lists for things like this. It groups the items together and provides a logical "block" that either a human or robot can interpret or skip.</p>

<p>Here's a baroque method to make a list horizontal and to replace the content of the bullet.</p>

<pre><code class="language-css">#hz &gt; li::before {
    display: list-item;
    content: "";
    position: absolute;
    margin-inline-start: -.5em;
}
#hz &gt; li {
    display: inline-block;
    list-style-type: "|";
    padding-right: 1em;
}
#hz &gt; li:first-child {
    list-style-type: "";
}
</code></pre>

<pre><code class="language-html">&lt;ul id="hz"&gt;
    &lt;li&gt;Thing 1&lt;/li&gt;
    &lt;li&gt;Another thing&lt;/li&gt;
&lt;/ul&gt;
</code></pre>

<p>That removes all the bullets. Then replaces every one except the first with a pipe spaced back a little from the text. And lays the list out horizontally.</p>

<p>If you want to change the colour or position of the bullet, you can use <a href="https://web.dev/css-marker-pseudo-element/"><code>::marker</code></a> instead.</p>

<h2 id="mix-and-match"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#mix-and-match">Mix And Match</a></h2>

<p>My preferred way is to use <code>&lt;li&gt;</code>, remove the bullets, and then style a border on the left - except for the first one.  This keeps the semantics of the list, and is a relatively simple piece of CSS.</p>

<pre><code class="language-css">#hz &gt; li {
    display: inline-block;
    border-left: solid #000 1px;
    padding: 0 1em 0 1em;
}
#hz &gt; li:first-child {
    border: none;
}
</code></pre>

<pre><code class="language-html">&lt;ul id="hz"&gt;
    &lt;li&gt;Thing 1&lt;/li&gt;
    &lt;li&gt;Another thing&lt;/li&gt;
&lt;/ul&gt;
</code></pre>

<h2 id="is-there-a-best-way"><a href="https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/#is-there-a-best-way">Is there a <em>best</em> way?</a></h2>

<p>No, it is a matter of personal taste and appetite for complexity.  My "strong opinion weakly held" is that semantic HTML is nearly always preferable to just chucking stuff in a load of <code>&lt;span</code>&gt;s and <code>&lt;div&gt;</code>s. It makes the content easy to understand if you're browsing without CSS, or if you're a robot trying to understand the world.</p>

<p>Similarly, I think simple CSS is better than complicated CSS. Something small and human-readable is always going to be easier to understand and manage in the future.</p>

<p>But, if you think I'm wrong - or know a better way to lay things out - please let me know in the comments.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42489&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/05/different-ways-to-do-separators-in-horizontal-text/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Adding a language tag to image elements]]></title>
		<link>https://shkspr.mobi/blog/2021/08/adding-a-language-tag-to-image-elements/</link>
					<comments>https://shkspr.mobi/blog/2021/08/adding-a-language-tag-to-image-elements/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 16 Aug 2021 11:20:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39901</guid>

					<description><![CDATA[(You may already know this, but I didn&#039;t. Every day is a school day.)  HTML has the concept of the lang attribute. It allows you to say that a specific element contains text in a specific human language.  For example, this page starts with:  &#60;html lang=&#34;en-GB&#34;&#62;   That says the entire page is written in English, with the sub-type of Great Britain. This means your browser might offer to translate…]]></description>
										<content:encoded><![CDATA[<p>(You may already know this, but I didn't. Every day is a school day.)</p>

<p>HTML has the concept of the <code>lang</code> attribute. It allows you to say that a specific element contains text in a specific human language.  For example, this page starts with:</p>

<pre><code class="language-HTML">&lt;html lang="en-GB"&gt;
</code></pre>

<p>That says the entire page is written in English, with the sub-type of Great Britain. This means your browser might offer to translate the page, if that isn't a language you can read. Or it might read the page aloud in a "British" accent (as opposed to American or Australian).</p>

<p>You can mix and match languages in a document. For example:</p>

<pre><code class="language-HTML">&lt;p lang="en"&gt;My favourite book is "&lt;span lang="fr"&gt;Les Misérables&lt;/span&gt;&lt;/p&gt;".
</code></pre>

<p>If you don't do this, you can end up with some weird results. Imagine a page in <code>en-AU</code> which contained a quotes in German, which <em>didn't</em> use <code>lang="de"</code>. Your computer might read it out loud and it would sound like this:</p>

<p></p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/German-in-Australian.mp3">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2021/08/German-in-Australian.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>Yikes!</p>

<p>It turns out, you can add the <code>lang</code> <em>anywhere</em>:</p>

<blockquote><p>The <code>lang</code> attribute in no namespace may be used on any HTML element.
<a href="https://html.spec.whatwg.org/multipage/dom.html#attr-lang">HTML specification</a></p></blockquote>

<p>So, why would you want to add <em>language</em> to an <em>image</em>?</p>

<p>For accessibility, of course!</p>

<p>Consider this image</p>

<p><a href="https://www.flickr.com/photos/whatleydude/5680222671/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/No-u-turn.jpg" lang="zh-CN" alt="大型载客汽车" width="512" class="aligncenter size-full wp-image-39905"></a></p>

<p>The HTML behind that image is:</p>

<pre><code class="language-HTML">&lt;img lang="zh-CN" alt="大型载客汽车" src="example.jpg" /&gt;
</code></pre>

<p>That means a user-agent can offer a translation, or read the text with the correct voice Nifty!</p>

<p>There is, of course, a drawback.  You can't include <em>multiple</em> languages.</p>

<p>Consider this photo:
<a href="https://www.flickr.com/photos/whatleydude/5686696002/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/crossing.jpg" alt="Text in a mixture of Chinese and English." width="512" class="aligncenter size-full wp-image-39908"></a></p>

<p>There's no way to add multiple <code>lang</code>s in an element.  This is similar to the <a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/">limitations of HTML's title element</a>.</p>

<p>There are a <a href="https://www.w3.org/WAI/tutorials/images/complex/">bunch of ways to add long and complex descriptions to images</a> which are probably a more appropriate way to add multilingual text.</p>

<p>But, there you go. If you need to add a specific language to an image, you can!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39901&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/08/adding-a-language-tag-to-image-elements/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2021/08/German-in-Australian.mp3" length="156141" type="audio/mpeg" />

			</item>
		<item>
		<title><![CDATA[3 years to fix bad alt text]]></title>
		<link>https://shkspr.mobi/blog/2020/12/3-years-to-fix-bad-alt-text/</link>
					<comments>https://shkspr.mobi/blog/2020/12/3-years-to-fix-bad-alt-text/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 14 Dec 2020 14:10:37 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37368</guid>

					<description><![CDATA[Back in 2017, I noticed that the UK Post Office was doing very dodgy things with their alt text.  Lots of their pages had this snippet of code:    Rather than add properly accessible alt text, a developer added placeholder Latin text.  Being a good webizen, I tried to report this.  Terence Eden is on Mastodon@edentHi @PostOffice,Why is your website&#039;s alt text written in Latin? I don&#039;t think that…]]></description>
										<content:encoded><![CDATA[<p>Back in 2017, I noticed that the UK Post Office was <a href="https://shkspr.mobi/blog/2017/11/noli-scribere-latine-imaginem-describere/">doing very dodgy things with their <code>alt</code> text</a>.</p>

<p>Lots of their pages had this snippet of code:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/10/Screen-Shot-2017-10-17-at-14.50.35.png" alt="HTML code. The alt text of the image is in Latin" width="495" height="96" class="aligncenter size-full wp-image-28727">

<p>Rather than add properly accessible alt text, a developer added placeholder Latin text.</p>

<p>Being a good <a href="https://shkspr.mobi/blog/2020/04/netizens-or-webizens/">webizen</a>, I tried to report this.</p>

<blockquote class="social-embed" id="social-embed-930092575708598272" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-930042577025490946" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Hi <a href="https://twitter.com/PostOffice">@PostOffice</a>,<br>Why is your website's alt text written in Latin? I don't think that is very accessible.<br><a href="https://shkspr.mobi/blog/2017/11/noli-scribere-latine-imaginem-describere/">shkspr.mobi/blog/2017/11/n…</a> <a href="https://x.com/edent/status/930042577025490946/photo/1">pic.x.com/9fQYq92P9g</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/DOgsyiJW4AAtfK9.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="Screenshot of the HTML code on the Post Office website. The alt text is the Latin phrase &quot;Lorem Ipsum&quot;. " src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/930042577025490946"><span aria-label="8 likes" class="social-embed-meta">❤️ 8</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="2 reposts" class="social-embed-meta">🔁 2</span><time datetime="2017-11-13T12:00:04.000Z" itemprop="datePublished">12:00 - Mon 13 November 2017</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/PostOffice" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRjgCAABXRUJQVlA4ICwCAABQCwCdASowADAAPrVWpU2nJKOiJzgJIOAWiWwAyjOx4QNwBvAG8oOAhGB2BBgSoJFL6KOd76bQZ/CHth6OMuqiuuYA48PjHCDDj8I6wEonnnNSFKGHuG09wkCrpa+VGF8CtAAA/v4uojWelBrwAKOC3a/yPV0g5afIZLXOumbbW43j/+O2+4UXg+dNS4lYLnO6XQyNwaOSjVh9/5udLVOzQiIlQJ5rYXbgcRWzu+4gWY4fTAKGiRGyE9CzY3R2Lb19TB7CLSdX5iQNYRa+8vji/m1jEkgcWladnxEjuWp1nE5OIqqxqDkI7wnT4B0Nh/3raZJo9boxE3uWJVqoQMvk+ONI745DqTs4xinrvbGCdMmPsmGWvoj16/1gK/Y/XMZEl/l1g9G3WJNJYYrAu4QA+upmuFeCtP/4koDjMfwwYSL2wgmQsgNDO0lwo0ZnG2Oo6rL5r4Qon/OpcyDRxrt/YElB06aSUHDxI5gTtLjqfj5vwqggLrXWMJDDzhWD7fiduJfw2VFcV4bDAbRGGKIssLjbIG6l6VzT4n69wO6FaB/Pz4CEk0yY643nP78Oc+fDuys6bu3WWkoyOVUTbu0V5ZXDgXRGuaJGZlEhfr8prVE3rWmZfxGiWAWy80aDT5SO+LvsVgOf0xcX+42TGQxkgvcNLDywen5tzeGMNhpmnEexoH7/bhIpzovhc0Qwefyem23cqUh3EHmDRFAGOP/FpDGNLfHZnwB4jAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Post Office</p>@PostOffice</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/930042577025490946">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Hi Terence, we are looking into this for you. We'll be in touch once we have more info. ~Stacey</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/PostOffice/status/930092575708598272"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-11-13T15:18:44.000Z" itemprop="datePublished">15:18 - Mon 13 November 2017</time></a></footer></blockquote>

<p>Of course, Twitter is where good customer service goes to die. So, it wasn't much of a surprise when it wasn't fixed a year later.</p>

<blockquote class="social-embed" id="social-embed-1060212481677766656" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1060208437370515457" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/pigsonthewing" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRrYDAABXRUJQVlA4IKoDAADwEQCdASowADAAPq08nEmmIyKhMdzMAMAViWkAE5p6E/xXik6xN8Zwr7T/+F3wLlP89/2vfqakd6L/tvJJ8EWL7/r/cB8cuc/6O/6PuC/zD+s/8Lseeh3+wDbdZZIOUutWeAlrKn0vZLhoUfe59gJtXuiynqfdB/Dddl//olVMU0LjG9WXfeLJgpiIk34Ijxvl5+PHy9yoAAD+/xJ782o2s7OG+c8yViHQzcD//PJDdiXuQvetMArL7g4N6X7rcYsgDz1fd96/hGmJbkN+Z5QmPCC97b/IeP8CMhbYNwTuSVafN3PxoWesOXdtQMZznzLfs0l33lbgKtPxX1zcmPwOYniW1w/80D8d28kVwj1tJVNi4MUtiV7R72bZIW49bKFoOvjk2Mbxqt7yqcHc7LWw9YzqvGg6w4iDvJEli7OXx2r+xkn3+pUxW52dKsJuckC3g8PJcmp/p9hykuafjy1z69z1+nkvKKv57SZ8b0gUU4wepbX2w/2Zih0vrdmRQfJ4c2zQiEIwC7+G/r0gidEX/irE1+oAj9QwObbawaAKDu35rQ6Hy74Io99V7D5OnmrkeDP2hbqeiAdvlHnGPovshZUhWLcywrYomB5lrQ/3BmqnNvVf6u0ObEc9gclPAGY96PZULHDsZ3z/cm4NKpEesAm/SmEFiAWcifsPWEB6rf2j9XbFqJDffBu8tHEqi5s6A5XyiO5yz7QNDSjq4pRe2Wt9x0gkzn5Y5dpZU/9j7psMtou27d9JEzP0WV04IKvsJkSbynkn+8XBmNMBL3sg7BKzP7RQxcVzYIjG1u82WMz9hBQWn6oz09ryl6axXcAnYkwhpVLUH/sVu0wTYNcOCvqhLZG11G2LRm+27O7I+Mr02ttiVC4vFhorifmBBB/3lvsHaI0jCpDpRHAPv/vZme0UX+yd+4QoKacMXGTHuXp6sjOBALdafy/LlibgvSSa//6ex6ACSvMlBN4iIEFvdV/XcoL/xhZSr7HF0+C+Tyv7CA6XawEcFCGzCd0wNbmTmHaNpBlP0yDrGjdPUF7BFEFZcBAwECiEFTCFjed2ObKZMRFtAvg9FKAUvT+g5d+1CyyCoZF4fEf/u8JThe6sdniY95G2tsVub4Wr14o47Jeb5X1ef+0l/kDGrDDrScm5mRiEMBuPyB5311AfYvu8InJ/8YaPxLcMoMsR9Vjq/vAzEeKNVnWSPmV60BnYjq0W3WODb1yjgMyR/CIEJX7uGXB1p1+Y8AAAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Andy Mabbett</p>@pigsonthewing</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/PostOffice/status/930092575708598272">Replying to @PostOffice</a></small><a href="https://twitter.com/PostOffice">@PostOffice</a> <a href="https://twitter.com/edent">@edent</a> One year on, it seem that you have not fixed this accessibility issue. The "lorem ipsum" alt attribute is still in the source of, for example, <a href="https://www.postoffice.co.uk/savings-accounts/if-saving-for-a-car">postoffice.co.uk/savings-accoun…</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/pigsonthewing/status/1060208437370515457"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-11-07T16:32:43.000Z" itemprop="datePublished">16:32 - Wed 07 November 2018</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/PostOffice" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRjgCAABXRUJQVlA4ICwCAABQCwCdASowADAAPrVWpU2nJKOiJzgJIOAWiWwAyjOx4QNwBvAG8oOAhGB2BBgSoJFL6KOd76bQZ/CHth6OMuqiuuYA48PjHCDDj8I6wEonnnNSFKGHuG09wkCrpa+VGF8CtAAA/v4uojWelBrwAKOC3a/yPV0g5afIZLXOumbbW43j/+O2+4UXg+dNS4lYLnO6XQyNwaOSjVh9/5udLVOzQiIlQJ5rYXbgcRWzu+4gWY4fTAKGiRGyE9CzY3R2Lb19TB7CLSdX5iQNYRa+8vji/m1jEkgcWladnxEjuWp1nE5OIqqxqDkI7wnT4B0Nh/3raZJo9boxE3uWJVqoQMvk+ONI745DqTs4xinrvbGCdMmPsmGWvoj16/1gK/Y/XMZEl/l1g9G3WJNJYYrAu4QA+upmuFeCtP/4koDjMfwwYSL2wgmQsgNDO0lwo0ZnG2Oo6rL5r4Qon/OpcyDRxrt/YElB06aSUHDxI5gTtLjqfj5vwqggLrXWMJDDzhWD7fiduJfw2VFcV4bDAbRGGKIssLjbIG6l6VzT4n69wO6FaB/Pz4CEk0yY643nP78Oc+fDuys6bu3WWkoyOVUTbu0V5ZXDgXRGuaJGZlEhfr8prVE3rWmZfxGiWAWy80aDT5SO+LvsVgOf0xcX+42TGQxkgvcNLDywen5tzeGMNhpmnEexoH7/bhIpzovhc0Qwefyem23cqUh3EHmDRFAGOP/FpDGNLfHZnwB4jAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Post Office</p>@PostOffice</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/pigsonthewing/status/1060208437370515457">Replying to @pigsonthewing</a></small><a href="https://twitter.com/pigsonthewing">@pigsonthewing</a> Hi Andy, I am sorry to hear it! I'll pass this on to our Web team. ~Stacey</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/PostOffice/status/1060212481677766656"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-11-07T16:48:48.000Z" itemprop="datePublished">16:48 - Wed 07 November 2018</time></a></footer></blockquote>

<p>I didn't make a big fuss of the 2nd anniversary. But I thought it would be nice to mark its 3rd birthday.</p>

<blockquote class="social-embed" id="social-embed-1331555348390490113" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1331552256437616640" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/PostOffice/status/1327169220631801856">Replying to @PostOffice</a></small><a href="https://twitter.com/PostOffice">@PostOffice</a> Please can I have an update to this issue? Thanks.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1331552256437616640"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-25T10:56:11.000Z" itemprop="datePublished">10:56 - Wed 25 November 2020</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/PostOffice" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRjgCAABXRUJQVlA4ICwCAABQCwCdASowADAAPrVWpU2nJKOiJzgJIOAWiWwAyjOx4QNwBvAG8oOAhGB2BBgSoJFL6KOd76bQZ/CHth6OMuqiuuYA48PjHCDDj8I6wEonnnNSFKGHuG09wkCrpa+VGF8CtAAA/v4uojWelBrwAKOC3a/yPV0g5afIZLXOumbbW43j/+O2+4UXg+dNS4lYLnO6XQyNwaOSjVh9/5udLVOzQiIlQJ5rYXbgcRWzu+4gWY4fTAKGiRGyE9CzY3R2Lb19TB7CLSdX5iQNYRa+8vji/m1jEkgcWladnxEjuWp1nE5OIqqxqDkI7wnT4B0Nh/3raZJo9boxE3uWJVqoQMvk+ONI745DqTs4xinrvbGCdMmPsmGWvoj16/1gK/Y/XMZEl/l1g9G3WJNJYYrAu4QA+upmuFeCtP/4koDjMfwwYSL2wgmQsgNDO0lwo0ZnG2Oo6rL5r4Qon/OpcyDRxrt/YElB06aSUHDxI5gTtLjqfj5vwqggLrXWMJDDzhWD7fiduJfw2VFcV4bDAbRGGKIssLjbIG6l6VzT4n69wO6FaB/Pz4CEk0yY643nP78Oc+fDuys6bu3WWkoyOVUTbu0V5ZXDgXRGuaJGZlEhfr8prVE3rWmZfxGiWAWy80aDT5SO+LvsVgOf0xcX+42TGQxkgvcNLDywen5tzeGMNhpmnEexoH7/bhIpzovhc0Qwefyem23cqUh3EHmDRFAGOP/FpDGNLfHZnwB4jAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Post Office</p>@PostOffice</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1331552256437616640">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Hi, we have a team looking into this currently now Terence as we are concerned that you have reported this previously and it is still ongoing. I'll see if I can get you an update and thanks for your patience - Ryan</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/PostOffice/status/1331555348390490113"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-25T11:08:28.000Z" itemprop="datePublished">11:08 - Wed 25 November 2020</time></a></footer></blockquote>

<p>Which was shortly followed by:</p>

<blockquote class="social-embed" id="social-embed-1331559561614987266" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1331552256437616640" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/PostOffice/status/1327169220631801856">Replying to @PostOffice</a></small><a href="https://twitter.com/PostOffice">@PostOffice</a> Please can I have an update to this issue? Thanks.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1331552256437616640"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-25T10:56:11.000Z" itemprop="datePublished">10:56 - Wed 25 November 2020</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/PostOffice" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRjgCAABXRUJQVlA4ICwCAABQCwCdASowADAAPrVWpU2nJKOiJzgJIOAWiWwAyjOx4QNwBvAG8oOAhGB2BBgSoJFL6KOd76bQZ/CHth6OMuqiuuYA48PjHCDDj8I6wEonnnNSFKGHuG09wkCrpa+VGF8CtAAA/v4uojWelBrwAKOC3a/yPV0g5afIZLXOumbbW43j/+O2+4UXg+dNS4lYLnO6XQyNwaOSjVh9/5udLVOzQiIlQJ5rYXbgcRWzu+4gWY4fTAKGiRGyE9CzY3R2Lb19TB7CLSdX5iQNYRa+8vji/m1jEkgcWladnxEjuWp1nE5OIqqxqDkI7wnT4B0Nh/3raZJo9boxE3uWJVqoQMvk+ONI745DqTs4xinrvbGCdMmPsmGWvoj16/1gK/Y/XMZEl/l1g9G3WJNJYYrAu4QA+upmuFeCtP/4koDjMfwwYSL2wgmQsgNDO0lwo0ZnG2Oo6rL5r4Qon/OpcyDRxrt/YElB06aSUHDxI5gTtLjqfj5vwqggLrXWMJDDzhWD7fiduJfw2VFcV4bDAbRGGKIssLjbIG6l6VzT4n69wO6FaB/Pz4CEk0yY643nP78Oc+fDuys6bu3WWkoyOVUTbu0V5ZXDgXRGuaJGZlEhfr8prVE3rWmZfxGiWAWy80aDT5SO+LvsVgOf0xcX+42TGQxkgvcNLDywen5tzeGMNhpmnEexoH7/bhIpzovhc0Qwefyem23cqUh3EHmDRFAGOP/FpDGNLfHZnwB4jAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Post Office</p>@PostOffice</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1331552256437616640">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> From the conversations I have been CC;d into it is looking like there is a fix for this and it is being implemented next week. Thank you for drawing this to our attention again and apologies it has taken so long - Ryan</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/PostOffice/status/1331559561614987266"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-25T11:25:13.000Z" itemprop="datePublished">11:25 - Wed 25 November 2020</time></a></footer></blockquote>

<p>A quick check and it has finally been fixed!</p>

<p>It is annoying that there's no real way to get companies to fix their broken stuff. If you report it to customer services - you'll likely be ignored. It makes me wish that there were public bug trackers for <em>everything!</em></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37368&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/12/3-years-to-fix-bad-alt-text/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Making Time More Accessible]]></title>
		<link>https://shkspr.mobi/blog/2020/12/making-time-more-accessible/</link>
					<comments>https://shkspr.mobi/blog/2020/12/making-time-more-accessible/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 13 Dec 2020 12:00:32 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[HTML]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37408</guid>

					<description><![CDATA[There&#039;s an HTML element called &#60;time&#62;. It is a semantic element. That means robots can read and understand it.  For example, if my code says:  &#60;p&#62;  The concert is &#60;time datetime=&#34;2020-12-24&#34;&#62;tomorrow&#60;/time&#62; &#60;/p&#62;   Then the computer knows the specific date I&#039;m talking about. A browser could offer to add the event to your calendar, or a search engine could find events which are happening on a…]]></description>
										<content:encoded><![CDATA[<p>There's an HTML element called <code>&lt;time&gt;</code>. It is a <em>semantic</em> element. That means robots can read and understand it.  For example, if my code says:</p>

<pre><code class="language-html">&lt;p&gt;
 The concert is &lt;time datetime="2020-12-24"&gt;tomorrow&lt;/time&gt;
&lt;/p&gt;
</code></pre>

<p>Then the computer knows the specific date I'm talking about. A browser could offer to add the event to your calendar, or a search engine could find events which are happening on a specific date. Nifty!</p>

<h2 id="problems-in-the-wild"><a href="https://shkspr.mobi/blog/2020/12/making-time-more-accessible/#problems-in-the-wild">Problems in the wild</a></h2>

<p>The problem comes when people use abbreviations which may not be accessible to people who use assistive technology like screen readers.</p>

<p>Here's an example from the BBC's news front page. That "1h" means the story was published 1 hour ago. Take a look at the code behind it:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/EoAEE5KW8AAl33L.png" alt="Dev tools showing the HTML code behind the BBC news site." width="660" height="337" class="aligncenter size-full wp-image-37411">
The <code>&lt;time&gt;</code> element represents <em>when</em> the story was originally published.
The <code>qa-status-date-output</code> is an abbreviation of the <em>relative</em> time since the story was published. It is hidden from screen readers with <code>aria-hidden="true"</code>.
The <code>gs-u-vh</code> is the alternative text for screen readers. It is hidden from sighted users with CSS.</p>

<p>There are a few problems with this approach:</p>

<ol>
<li>It violates the <abbr title="Don't repeat yourself" aria-label="DRY - don't repeat yourself">DRY</abbr> principle. The time is effectively written out three times.</li>
<li>It produces conflicting or ambiguous information. All three times contradict each other.</li>
<li>If CSS isn't working, both times are displayed.</li>
</ol>

<blockquote class="social-embed" id="social-embed-1333076736850931712" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1333073483639697411">Replying to @edent</a></small>I found this due to the strange way Lynx renders the timestamps.<br>Because half of them are hidden using CSS, it becomes unreadable. <a href="https://twitter.com/edent/status/1333076736850931712/photo/1">pic.x.com/7obyophheb</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/EoAJ-ACXEAEjdeC.png" class="social-embed-media-link"><img class="social-embed-media" alt="Times are listed as &quot;1 han hour ago&quot; and &quot;4h4 hours ago&quot;." src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1333076736850931712"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-29T15:53:56.000Z" itemprop="datePublished">15:53 - Sun 29 November 2020</time></a></footer></blockquote>

<p>It also has issues when search engines see the content:</p>

<p><a href="https://web.archive.org/web/20230122204343/https://twitter.com/mattpointblank/status/1338439175125819400?ref_src=twsrc%5Etfw"><img src="https://shkspr.mobi/blog/wp-content/uploads/2020/12/10d10.jpeg" alt="Screenshot of a search engine result. The time is listed as 10d10" width="1056" height="676" class="aligncenter size-full wp-image-52772"></a></p>

<p>To be clear, I'm not dunking on the Beeb. They have a great set of accessibility people.
I'm just wondering if there's a simpler / better way to do things?</p>

<h2 id="possible-solutions"><a href="https://shkspr.mobi/blog/2020/12/making-time-more-accessible/#possible-solutions">Possible Solutions</a></h2>

<p>Ideally, there would be something like <code>aria-datetime</code> to read out the time. <a href="https://github.com/w3c/aria/issues/898">But that doesn't exist</a>.</p>

<p>Or, screen readers could interpret the <code>&lt;time&gt;</code> element and do something with it. <a href="https://twitter.com/LeonieWatson/status/1333078194925264898">But that doesn't seem well supported</a>. And, how will a screen reader know that the salient information is a relative duration, rather than a specific datetime?</p>

<p>ISO8601 - the datetime standard - allows for <a href="https://en.wikipedia.org/?title=ISO_8601#Durations">durations</a>. So you could write <code>datetime="TP30M"</code> to mean 30 minutes. But that doesn't say it was 30 minutes <em>ago</em> and you lose the full datetime.</p>

<p>Here's how I would solve it:</p>

<pre><code class="language-html">&lt;time datetime="2020-11-30T09:23:48.000Z"&gt;
   &lt;abbr aria-label="1 hour ago"&gt;1h&lt;/abbr&gt;
&lt;/time&gt;
</code></pre>

<p>That uses the <a href="https://www.w3.org/TR/html52/textlevel-semantics.html#the-abbr-element"><code>&lt;abbr&gt;</code> abbreviation element</a>.  A sighted reader will see the "1h", a screen reader will read out "One Hour Ago", and someone browsing in text mode will just the "1h".</p>

<p>I think that's a pretty optimal solution. It's clean, readable, doesn't rely on hiding any elements, and should be easy to keep in sync.</p>

<p>Think there's a better way? Let me know in the comment box.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37408&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/12/making-time-more-accessible/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA["I could build that in five minutes!"]]></title>
		<link>https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/</link>
					<comments>https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 06 Aug 2020 11:15:07 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=35789</guid>

					<description><![CDATA[It&#039;s rather dispiriting when you launch something, only to have people berate you for not launching sooner.  A few months ago, I was involved in a medical questionnaire launch. Before it was released, I had several people send me polite (and not-so-polite) queries as to why it was taking so long. &#34;I could build that in five minutes!&#34; was the common refrain.  Some people, dissatisfied with our…]]></description>
										<content:encoded><![CDATA[<p>It's rather dispiriting when you launch something, only to have people berate you for not launching sooner.</p>

<p>A few months ago, I was involved in a medical questionnaire launch. Before it was released, I had several people send me polite (and not-so-polite) queries as to why it was taking so long. "I could build that in five minutes!" was the common refrain.</p>

<p>Some people, dissatisfied with our progress, did just that. They quickly built their own questionnaires and opened them to the public. That's the joy of the Web - you don't need to ask anyone's permission to publish.  Some of the questionnaires were pretty good - but many were not.</p>

<p>Here are some of the problems I found with things which people launched in five minutes. This is non-exhaustive, and lightly edited for anonymity.  But they were all genuine problems that were found. The problems broadly fell into two categories:</p>

<h2 id="security"><a href="https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/#security">Security</a></h2>

<ul>
<li>Submitted medical data over http.</li>
<li>Allowed anyone to look up a previous submission.</li>
<li>Stored medical data on a shared webhost in the USA.</li>
<li>Any user could edit another user's medical information.</li>
<li>Invasive advertising tracking on the form.</li>
<li>No mechanism to prevent duplicate submissions.</li>
<li>Loaded 3rd party JavaScript without SRI.</li>
<li>Vulnerable to SQL injection.</li>
</ul>

<h2 id="usefulness"><a href="https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/#usefulness">Usefulness</a></h2>

<ul>
<li>Asked for information which wasn't medically relevant.</li>
<li>Didn't ask for specific information which was medically useful.</li>
<li>Questions assumed users understood medical terminology.</li>
<li>Used free-text boxes which another form control would be more suitable.</li>
<li>Poor accessibility meant visually impaired users couldn't reliably answer some questions.</li>
</ul>

<h2 id="just-five-minutes"><a href="https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/#just-five-minutes">Just Five Minutes</a></h2>

<p>It's <em>really</em> easy to build a form in 5 minutes. What takes the time is <em>doing it right way</em>.</p>

<p>Most of the time, getting the wrong answer quickly is not as useful as getting the right answer slowly.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=35789&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/08/i-could-build-that-in-five-minutes/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
	</channel>
</rss>
