5709a7858d5c197721be66d5218a79124abadb70
lrnassar
  Tue Mar 17 08:46:31 2026 -0700
Adding alt text to images across static documentation pages, CGI headers, markdown docs, and Pandoc templates. Content images receive AI-generated descriptive alt text; decorative images (icons, spacers, toggles) receive alt="" per WCAG best practice. Also adds Image Descriptions section to the accessibility page, and fixes Pandoc Lua writers to output alt attributes. 67 files, covering help docs, news archive, ENCODE pages, portal pages, and session examples. refs #37254

diff --git src/hg/htdocs/contacts.html src/hg/htdocs/contacts.html
index f8fef9c9c0a..f78068ffa2d 100755
--- src/hg/htdocs/contacts.html
+++ src/hg/htdocs/contacts.html
@@ -1,238 +1,238 @@
 <!DOCTYPE html>
 <!--#set var="TITLE" value="Genome Browser Contacts" -->
 <!--#set var="ROOT" value="." -->
 
 <!-- Relative paths to support mirror sites with non-standard GB docs install -->
 <!--#include virtual="$ROOT/inc/gbPageStart.html" -->
 
 <!--#include virtual="$ROOT/redmineWidget.html" -->
 
 <style>
 .responsive-icon {
     max-height: 60px;
     width: auto;
     height: auto;
     margin-left: 0px !important;
     border: none !important;
 }
 .shortParagraph {
     margin-top: 0px !important;
 }
 </style>
 
 <h1 style="font-size: 27px">Support Center</h1>
 
 <p>
 <div class="row" style="margin-top: -25px;">
 <div class="col-md-6">
     <h2 style="font-size: 21px;text-align: center;">Contact</h2>
       <div id="newsBox" class="jwSection">
         <div class="jwSectionContents" style="margin: 5px;">
           <div id="newsItems">
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: -10px !important;"><a target="_blank" href="https://groups.google.com/a/soe.ucsc.edu/forum/#!forum/genome">
-<img class='text-center responsive-icon' src="images/googleGroupsIcon.png"></a>
+<img alt="" class='text-center responsive-icon' src="images/googleGroupsIcon.png"></a>
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 18px;"><a href="https://groups.google.com/a/soe.ucsc.edu/forum/#!forum/genome"
 target="_blank">Public Mailing List</a> -
 <a href="mailto:&#103;&#101;n&#111;m&#101;&#64;&#115;&#111;&#101;.&#117;&#99;s&#99;.&#101;d&#117;">&#103;&#101;n&#111;m&#101;&#64;&#115;&#111;&#101;.&#117;&#99;s&#99;.&#101;d&#117;</a></span><br>
 Interactive public <a target="_blank" href="https://groups.google.com/a/soe.ucsc.edu/forum/#!forum/genome">discussion forum</a></p>
   </div>
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;" class="shortParagraph">
-<img class='text-center responsive-icon' src="images/hiddenIcon.png">
+<img alt="" class='text-center responsive-icon' src="images/hiddenIcon.png">
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 18px;"><b>Private Mailing List</b> -
 <a href="mailto:&#103;&#101;&#110;o&#109;&#101;-&#119;&#119;&#119;&#64;&#115;o&#101;.&#117;c&#115;&#99;.e&#100;&#117;">&#103;&#101;&#110;o&#109;&#101;-&#119;&#119;&#119;&#64;&#115;o&#101;.&#117;c&#115;&#99;.e&#100;&#117;</a></span><br>
 Confidential list visible only to our staff</p>
   </div>
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;" class="shortParagraph"><a target="_blank" href="training/index.html">
-<img class='text-center responsive-icon' src="images/trainingIcon.png"></a>
+<img alt="" class='text-center responsive-icon' src="images/trainingIcon.png"></a>
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 18px;"><b>Training</b></span><br>For information about virtual or in-person training,
      <a href="mailto:genome-www@soe.ucsc.edu" target="_blank">please email us</a></p>
   </div>
           </div>
           </p>
         </div>
       </div>
 </div>
 <div class="col-md-6">
     <h2 style="font-size: 21px;text-align: center;">Follow us</h2>
       <div id="newsBox" class="jwSection">
         <div class="jwSectionContents"  style="margin: 5px;">
           <div id="newsItems">
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: -10px !important;"><a target="_blank" href="https://groups.google.com/a/soe.ucsc.edu/forum/#!forum/genome-announce">
-<img class='text-center responsive-icon' src="images/megaphoneIcon.png"></a>
+<img alt="" class='text-center responsive-icon' src="images/megaphoneIcon.png"></a>
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 17px;">
 <a href="https://groups.google.com/a/soe.ucsc.edu/forum/#!forum/genome-announce"
 target="_blank">Genome Browser Announcements</a> -
 <a href="mailto:genome-announce+subscribe@soe.ucsc.edu"
 target="_blank">Subscribe</a></span><br>
 Notifications about new software and data, and
 other announcements (low volume)</p>
   </div>
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;" class="shortParagraph"><a target="_blank" href="https://www.youtube.com/@ucscgenomebrowser">
-<img class='text-center responsive-icon' src="images/youtubeIcon.png"></a>
+<img alt="" class='text-center responsive-icon' src="images/youtubeIcon.png"></a>
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 17px;">
 <a href="https://www.youtube.com/@ucscgenomebrowser"
 target="_blank">YouTube</a></span><br>
 See our YouTube for Genome Browser training videos</p>
   </div>
 
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;" class="shortParagraph"><a target="_blank" href="https://bsky.app/profile/genomebrowser.bsky.social">
-<img class='text-center responsive-icon' src="images/blueskyIcon.svg"></a>
+<img alt="" class='text-center responsive-icon' src="images/blueskyIcon.svg"></a>
 </p>
   </div>
   <div class="jwNewsItem jwSingleLineRightColumn">
 <p style="text-align: center;margin-top: 0px;">
 <span style="font-size: 17px;">
 <a href="https://bsky.app/profile/genomebrowser.bsky.social"
 target="_blank">Bluesky</a></span><br>
 Follow for data and software releases as well as scheduled maintenance
 and service interruption announcements</p>
   </div>
           </div>
           </p>
         </div>
       </div>
 </div>
 </div>
 </p>
 
 <a name = "queries"></a>
 <h2 style="font-size: 21px;margin-top: -10px;">Help us to resolve your question quickly</h2>
 <!--#if expr='"$SERVER_NAME" != /.*.ucsc.edu/ && "$SERVER_NAME" != /.*.sdsc.edu/ 
 && "$SERVER_NAME" != /browser/'-->
 <!-- 'browser' = GBiB -->
 <p>
 <strong>This website <em><!--#echo var="HTTP_HOST" --></em> is a &quot;mirror&quot; not run by
 UCSC.</strong> Please try to contact the person who manages this mirror with questions.</p>
 <p> 
 <strong>If you mail the UCSC mailing list, please include this mirror's address 
 <em>http://<!--#echo var="HTTP_HOST" --></em> with any questions.</strong></p>
 <!--#else -->
 <!--#endif -->
 
 <p>
 Before posting, we strongly recommend 
 <a target="_blank" href="https://groups.google.com/a/soe.ucsc.edu/g/genome">
 searching our mailing list archives</a> and using our website search below
 to match documentation:</p>
   <p style="text-align: inherit;">
     <input size=50 name="searchString" id="searchBarSearchString" type="text"
         placeholder="Search documentation and data..."></input>
     <input name="searchButton" id="searchBarSearchButton" type="submit" value="Search"></input>
     <script>
     function searchBarClick() {
         searchStr = document.getElementById('searchBarSearchString').value;
         if (searchStr.length > 0) {
             // helper functions for checking whether a plain chrom name was searched for
             term = encodeURIComponent(searchStr.replace(/^[\s]*/,'').replace(/[\s]*$/,''));
             function onSuccess(jqXHR, textStatus) {
                 if (jqXHR.chromName !== null) {
                     window.location.assign("../cgi-bin/hgTracks?position=" + term );
                 } else {
                     window.location.assign("../cgi-bin/hgSearch?search=" + term);
                 }
             }
             function onFail(jqXHR, textStatus) {
                 window.location.assign("../cgi-bin/hgSearch?search=" + term);
             }
 
             // redirect to search disambiguation page if it looks like we didn't enter a regular position:
             var canonMatch = searchStr.match(canonicalRangeExp)
             var gbrowserMatch = searchStr.match(gbrowserRangeExp);
             var lengthMatch = searchStr.match(lengthRangeExp);
             var bedMatch = searchStr.match(bedRangeExp);
             var sqlMatch = searchStr.match(sqlRangeExp);
             var singleMatch = searchStr.match(singleBaseExp);
             var positionMatch = canonMatch || gbrowserMatch || lengthMatch || bedMatch || sqlMatch || singleMatch;
 
             // the following encodes the cartJson cmd as a query string, skipping reliance
             // on hgTracks.js:cart:varsToUrlData()
             const url = new URL(window.location.href);
             const params = new URLSearchParams(url.search);
             params.append("cjCmd", '{"getChromName": {"searchTerm": "' + term + '"}}');
             if (positionMatch === null) {
                 // user may have entered a full chromosome name, check for that asynchronosly:
                 $.ajax({
                     type: "GET",
                     url: "../cgi-bin/hgSearch",
                     data:  params.toString(),
                     dataType: "json",
                     trueSuccess: onSuccess,
                     success: onSuccess,
                     error: onFail,
                     cache: true
                 });
                 return false;
             }
 
         }
     }
     document.getElementById('searchBarSearchButton').addEventListener('click', searchBarClick);
     $('#searchBarSearchString').bind('keypress', function(e) {  // binds listener to url field
         if (e.which === 13) {  // listens for return key
              e.preventDefault();   // prevents return from also submitting whole form
              searchBarClick();
         }
     });
     </script>
   </p>
 <p>
 When posting a question, please consider these points to ensure we can assist swiftly:
 <ul>
 <li>Include <b>screenshots and URLs</b> whenever possible. For errors,
 describe the steps taken that led to the error.</li>
 <li>When sending a <a href="cgi-bin/hgTracks" target="_blank">tracks display</a> 
 URL, use the <a href="cgi-bin/hgSession" target="_blank">Session tool</a>. Web browser 
 URLs can <b>change or expire</b> for our tracks display.</li>
 <li>If your issue is regarding custom data, <b>include that data</b> (or a small subset) 
 in your message so that we may replicate the problem.</li>
 <li>If you are requesting a <b>liftOver file</b>, include the GenBank (GCA_*) 
 or RefSeq (GCF_*) identifier in the message.</li>
 <li>If you would like to request a browser for a new assembly, use our 
 <a href="https://genome.ucsc.edu/assemblyRequest.html?all" target="_blank">GenArk 
 assembly request</a> form.</li>
 </ul></p>
 
 <h2 style="font-size: 20px;">Commercial licensing inquiries</h2>
 <p>
 <strong>Genome Browser: </strong>
 <a href="mailto:&#103;&#101;&#110;o&#109;&#101;-&#119;&#119;&#119;&#64;&#115;o&#101;.&#117;c&#115;&#99;.e&#100;&#117;">&#103;&#101;&#110;o&#109;&#101;-&#119;&#119;&#119;&#64;&#115;o&#101;.&#117;c&#115;&#99;.e&#100;&#117;</a><br>
 <!--above address is genome-www at soe.ucsc.edu -->
 <em>Private list for licensing questions. For more information about licensing the Genome Browser
 software, see the <a href="license/">software licensing requirements</a>. </em></p>
 <p>
 <strong>Blat and In-Silico PCR: </strong> 
 See <a href="http://www.kentinformatics.com"
 target="_blank">Kent Informatics</a>.</p>
 
 <!--#include virtual="$ROOT/inc/gbPageEnd.html" -->