1/** 2 * W3C Internationalization Site Page Structure Script 3 * 4 * This script manages the structure, navigation, and localization features 5 * for W3C Internationalization Activity pages. It handles: 6 * - Language detection and switching 7 * - Cookie-based language preferences 8 * - Site navigation and breadcrumbs 9 * - Page metadata and timestamps 10 * - Search functionality 11 */ 12 13var g = { } 14 15var base = '' 16if (! window.location.href.match('www.w3.org') && ! window.location.href.match('localhost')) { 17 base = 'https://www.w3.org' 18 } 19 20// LANGUAGE RELATED STUFF 21 22/** 23 * Native language names mapping 24 * Maps language tags to their native language names for display 25 * Used in language switcher dropdowns and navigation 26 */ 27g.nativeText = { 28'ar':'عربÙ', 29'bg':'ÐÑлгаÑÑки', 30'de':'Deutsch', 31'da':'Dansk', 32'el':'Îλληνικά', 33'en':'English', 34'es':'Español', 35'fr':'Français', 36'gl':'Galego', 37'he':'×¢×ר×ת', 38'hi':'हिनà¥à¤¦à¥', 39'hu':'Magyar', 40'it':'Italiano', 41'ja':'æ¥æ¬èª', 42'ko':'íêµì´', 43'nl':'Nederlands', 44'pes':'ÙØ§Ø±Ø³Û', 45'pl':'Polski', 46'pt':'Português', 47'pt-br':'Português-BR', 48'ro':'RomânÄ', 49'ru':'PÑÑÑкий', 50'sv':'Svenska', 51'th':'à¹à¸à¸¢', 52'tr':'Türkçe', 53'uk':'УкÑаÑнÑÑка', 54'vi':'Tiếng Anh', 55'zh-hans':'ç®ä½ä¸æ', 56'zh-hant':'ç¹é«ä¸æ' 57} 58 59 60f.clang = document.querySelector('html').lang 61if (f.clang != 'en') { g.isTranslation = true } else { g.isTranslation = false } 62 63 64// COOKIE 65// when clicking on a language selector, ask the user if they want to set cookie to remember that language - cookie is read by /International/.htaccess 66 67var cn = { } 68 69cn.ar = "إذا Ø³Ù ØØª ÙÙÙ ØªØµÙØ بتعÙÙÙ Ù Ù٠تعرÙÙ Ø§ÙØ§Ø±ØªØ¨Ø§Ø· (Cookie
69s)Ø ÙØ³ØªØ³ØªÙ ر ÙÙ Ù Ø´Ø§ÙØ¯Ø© ØµÙØØ§Øª ÙØ´Ø§Ø· Ø§ÙØªØ¯ÙÙÙ W3C (Ø¥Ù ÙØ¬Ø¯Øª) باÙÙØºØ© Ø§ÙØªÙ Ø§Ø®ØªØ±ØªÙØ§. Ù٠ترغب ÙÙ Ø¥ÙØ´Ø§Ø¡ Ù Ù٠تعرÙÙ Ø§ÙØ§Ø±ØªØ¨Ø§Ø·?" 70cn.bg = "Ðко ÑазÑеÑиÑе бÑаÑзÑÑа да запиÑе биÑквиÑка, Ñе пÑодÑлжиÑе да виждаÑе W3C Internationalization Activity ÑÑÑаниÑиÑе (кÑдеÑо Ñа налиÑни) на избÑÐ°Ð½Ð¸Ñ Ð¾Ñ Ð²Ð°Ñ ÐµÐ·Ð¸Ðº. ÐÑкаÑе ли да запиÑеÑе биÑквиÑкаÑ?" 71cn.de = "Wenn Sie der Verwendung eines Cookies zustimmen, werden Ihnen die Seiten der W3C-Internationalisierungstätigkeit (sofern verfügbar) in Ihrer gewählten Sprache angezeigt. Möchten Sie den Cookie setzen?" 72cn.en = "If you let the browser set a cookie, you will continue to see W3C Internationalization Activity pages (where available) in the language you chose. Do you want to set the cookie?" 73cn.es = "Si permite que el navegador establezca una cookie, continuará viendo las páginas de Actividad de Internacionalización de W3C (si existieran) en el idioma de su elección. ¿Quiere establecer la cookie?" 74cn.fr = "Si vous acceptez que votre navigateur crée un cookie, vous continuerez de voir les pages dâactivité dâinternationalisation de W3C (lorsque cela est possible) dans la langue de votre choix. Souhaitez-vous créer le cookie\u00A0?" 75cn.gl = "Se deixas que o navegador configure unha cookie, continuará a ver páxinas da Actividade de Internacionalización da W3C (onde está dispoñible) no idioma que escolliches. Queres configurar a cookie?" 76cn.hi = "यदि à¤à¤ª बà¥à¤°à¤¾à¤à¤à¤¼à¤° à¤à¥ दà¥à¤µà¤¾à¤°à¤¾ à¤à¥à¤à¥ सà¥à¤ à¤à¤°à¤¤à¥ हà¥à¤, तॠà¤à¤ª ठपनॠदà¥à¤µà¤¾à¤°à¤¾ à¤à¥à¤¨à¥ à¤à¤ à¤à¤¾à¤·à¤¾ मà¥à¤ W3C ठà¤à¤¤à¤°à¥à¤°à¤¾à¤·à¥à¤à¥à¤°à¥à¤¯à¤à¤°à¤£ à¤à¤¤à¤¿à¤µà¤¿à¤§à¤¿ पà¥à¤·à¥à¤ (à¤à¤¹à¤¾à¤ à¤à¤ªà¤²à¤¬à¥à¤§ हà¥) दà¥à¤à¤¨à¤¾ à¤à¤¾à¤°à¥ रà¤à¥à¤à¤à¥à¥¤ à¤à¥à¤¯à¤¾ à¤à¤ª à¤à¥à¤à¥ सà¥à¤ à¤à¤°à¤¨à¤¾ à¤à¤¾à¤¹à¤¤à¥ हà¥à¤?" 77cn.hu = "Amennyiben hozzájárul egy süti elfogadásához, a W3C NemzetköziesÃtés Fejlesztési Tevékenység lapjait az ön által választott nyelven is el tudja érni (amennyiben rendelkezésre állnak). Hozzájárul a süti használatához?" 78cn.it = "Se consenti al browser di impostare un cookie, continuerai a visualizzare le pagine W3C Internationalization Activity (ove disponibili) nella lingua selezionata. Vuoi impostare il cookie?" 79cn.ja = "ãã©ã¦ã¶ã¼ã®ã¯ããã¼ã許å¯ããã¨ãW3C å½éåã¢ã¯ãã£ããã£ã®ãã¼ã¸ã(ãããããªã)鏿ããè¨èªã§ç¶ãã¦è¡¨ç¤ºãã¾ããã¯ããã¼ãè¨å®ãã¾ããï¼" 80cn.nl = "Als je de browser een cookie laat zetten, krijg je in het vervolg de pagina's van W3C's Internationalisatie-activiteit (voorzover beschikbaar) in de gekozen taal. Wil je een cookie zetten?" 81cn.pes = "اگر اجاز٠دÙÛØ¯ Ù Ø±ÙØ±Ú¯Ø± ÛÚ© Ú©ÙÚ©Û ØªÙØ¸ÛÙ Ú©ÙØ¯Ø ÙÙ ÚÙØ§Ù برگÙâÙØ§Û ÙØ¹Ø§ÙÛØª بÛÙâØ§ÙÙ ÙÙÛâØ³Ø§Ø²Û W3C (در ØµÙØ±Øª Ù ÙØ¬Ùد Ø¨ÙØ¯Ù) را ب٠زباÙÛ Ú©Ù Ø§ÙØªØ®Ø§Ø¨ کردÙâØ§ÛØ¯ Ù Ø´Ø§ÙØ¯Ù Ø®ÙØ§ÙÛØ¯ کرد. Ø¢ÛØ§ Ù ÛâØ®ÙØ§ÙÛØ¯ Ú©ÙÚ©Û ØªÙØ¸ÛÙ Ø´ÙØ¯Ø" 82cn.pl = "JeÅli pozwolisz przeglÄ darce ustawiÄ plik cookie bÄdziesz kontynuowaÄ przeglÄ danie (tam gdzie to możliwe) stron Internaconalizacji W3C w jÄzyku, który wybierzesz. Czy chcesz ustawiÄ plik cookie?" 83cn['pt-br'] = "Se você deixar o navegador definir um cookie, você vai continuar a ver páginas W3C Internacionalização Atividade (quando disponÃvel) no idioma que você escolheu. Você quer definir o cookie?" 84cn.ru = "ÐÑли Ð²Ñ ÑазÑеÑиÑе бÑаÑзеÑÑ ÑÑÑановиÑÑ cookie, Ð²Ñ Ð±ÑдеÑе видеÑÑ ÑÑÑаниÑÑ W3C Internationalization Activity на вÑбÑанном вами ÑзÑке (Ñам, где ÑÑо доÑÑÑпно). УÑÑановиÑÑ cookie?" 85cn.sv = "Om du tillÃ¥ter webbläsaren att spara en kaka (cookie), sÃ¥ kommer du i fortsättningen att se sidor frÃ¥n W3C Internationalization Activity i det sprÃ¥k du valt (när sÃ¥dana översättningar finns). Vill du spara kakan?" 86cn.uk = "ЯкÑо ви дозволиÑе бÑаÑÐ·ÐµÑ Ð²ÑÑановиÑи кÑки, ви бÑдеÑе пÑодовжÑваÑи баÑиÑи ÑÑоÑÑнки W3C ÐнÑеÑнаÑÑоналÑзаÑÑÑ Ð°ÐºÑивнÑÑÑÑ (за наÑвноÑÑÑ) на мовÑ, Ñкий ви обÑали. Ðи Ñ Ð¾ÑеÑе, Ñоб вÑÑановиÑи пеÑиво?" 87cn['zh-hans'] = "æ¨å¯ä»¥è®©æµè§å¨è®¾ç½®cookieï¼ä»¥ç»§ç»ä½¿ç¨æ¨éæ©çè¯è¨æµè§ W3C å½é åæ å计å页é¢ï¼å¦æè¯¥è¯è¨çç¿»è¯ï¼ãæ¨æ³è®¾ç½®cookieåï¼" 88 89function stickyConneg (filename, cLang, targetLang) { 90 var response = false 91 var msg = '['+cLang+'] '+cn[cLang] 92 msg += '\n\n'+'['+targetLang+'] '+cn[targetLang] 93 if (targetLang !== 'en' && cLang !== 'en') msg += '\n\n'+'[en] '+cn.en 94 response = confirm(msg) 95 if (response == true) { 96 var d = new Date() 97 d.setTime(d.getTime() + 60*24*60*60*1000) 98 var expires = ';expires='+d.toUTCString() 99 var path = ";path=/" 100 document.cookie = 'w3ci18nlang='+targetLang+expires+path 101 } 102 if (targetLang === 'en') targetLang = '.en.html' 103 else targetLang = '.'+targetLang+'.html' 104 document.location.assign(filename+targetLang) 105 } 106 107 108 109 110// MAIN NAVIGATION 111 112//g.siteSearch = '<div class="noprint"><form method="get" action="/International/site-search.php" enctype="application/x-www-form-urlencoded"><div id="searchSite" class="topRight">'+s.searchI18nSite+'<br/><input name="q" type="text" size="15" id="searchField" accesskey="E" maxlength="255"/></div></form></div>'+ 113// '<div class="noprint"> <a href="'+base+'/International/log/description"><span class="topRight">
113 RSS Feeds </span><img src="'+f.path+'icons/rssLink.gif" alt="RSS feed"/></a></div></div>' 114 115g.siteSearch = '<div class="noprint"><form method="get" action="/International/site-search.php" enctype="application/x-www-form-urlencoded"><div id="searchSite" class="topRight"><input name="q" type="text" size="15" id="searchField" placeholder="ð '+s.searchI18nSite+'" accesskey="E" maxlength="255"/></div></form></div></div>' 116 117g.breadcrumbs = "<a href='"+base+"/International/'>"+s.home+"</a> > <a href='"+base+"/International/resources'>"+s.resources+"</a> > " 118if (f.breadcrumb == 'tests') g.breadcrumbs += "<a href='"+base+"/International/tests/'>"+s.tests+"</a>" 119else g.breadcrumbs += "<a href='"+base+"/International/articlelist#"+f.breadcrumb+"'>"+s.articles+"</a>" 120 121g.about = "<h2 id='abouthead' class='notoc'>"+s.aboutThisArticle+"</h2>\n" 122if (f.status == "draft") { g.about += "<p style='color:red;'>"+s.status_draft+"</p>" } 123if (f.status == "review") { g.about += "<p style='color:red;'>"+s.status_review+"</p>" } 124if (f.status == "published") { g.about += "<p>"+s.status_published+"</p>" } 125if (f.status == "notreviewed") { g.about += "<p>"+s.status_notreviewed+"</p>" } 126if (f.status == "obsolete") { g.about += "<p style='color:red;'>"+s.status_obsolete+"</p>" } 127 128var fontlink = '' 129 130/** 131 * Version/translation links 132 * Creates language switcher links for available translations 133 */ 134var versionList = '' 135if (trans.versions && !(trans.versions[0] == f.clang && trans.versions.length == 1) ) { 136 versionList = '<p class="noprint"> ' 137 var translationCount = 0 138 // First pass: count how many translations we'll actually show 139 for (lang=0; lang<trans.versions.length; lang++) { 140 if (f.clang != trans.versions[lang]) { 141 translationCount++ 142 } 143 } 144 145 var currentTranslation = 0 146 for (lang=0; lang<trans.versions.length; lang++) { 147 // Skip current language in the list 148 if (f.clang != trans.versions[lang]) { 149 versionList += '<bdi title="'+s.currLang[trans.versions[lang]]+'"><a href="#" onclick="stickyConneg(\''+f.filename+'\',\''+f.clang+'\',\''+trans.versions[lang]+'\'); return false;" lang="'+trans.versions[lang]+ 150 '" translate="no" dir="auto">'+g.nativeText[trans.versions[lang]]+'</a></bdi>'+s.rlm+' ' 151 currentTranslation++ 152 // Only add bullet separator if there are more than 1 translation and this isn't the last one 153 if (translationCount > 1 && currentTranslation < translationCount) versionList += ' ⢠' 154 } 155 } 156 versionList += '</p>'; 157 } 158 159/** 160 * Translation disclaimer 161 * Shows disclaimer and translator credits for translated pages 162 */ 163if (g.isTranslation) g.disclaimer = '<div id="disclaimer"><p>'+s.translationDisclaimer+'</p><p>'+s.translatedBy+f.translators+'</p></div>' 164else g.disclaimer = '' 165 166 167var mainNavigation = '<div id="search">'+g.siteSearch+'</div>'+ 168`<span class="logo"><a href="https://www.w3.org/"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" aria-hidden="true" overflow="visible" viewBox="0 0 72 48" width="72px" height="48px"><defs></defs><g image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision"><path fill="#FFF" fill-rule="evenodd" d="M0 0h72v48H0z" clip-rule="evenodd"></path><path fill="#005A9C" d="M18.117 8.006l5.759 19.58 5.759-19.58h15.614v1.946L39.37 20.08c2.065.663 3.627 1.868 4.686 3.615 1.059 1.748 1.589 3.799 1.589 6.155 0 2.914-.775 5.363-2.324 7.348s-3.555 2.978-6.017 2.978c-1.854 0-3.469-.589-4.845-1.767-1.377-1.178-2.396-2.773-3.058-4.786l3.256-1.35c.477 1.218 1.106 2.178 1.887 2.879a3.993 3.993 0 002.76 1.052c1.112 0 2.052-.622 2.82-1.866.768-1.245 1.152-2.74 1.152-4.489 0-1.933-.411-3.429-1.231-4.488-.954-1.244-2.45-1.867-4.489-1.867h-1.588v-1.906l5.56-9.612h-6.712l-.382.65-8.163 27.548h-.397l-5.958-19.937-5.957 19.937h-.397L2.032 8.006h4.17l5.759 19.58 3.892-13.185-1.906-6.395h4.17z"></path><path fill="#221B0A" d="M66.92 8.006c-.819 0-1.554.295-2.111.861-.591.6-.92 1.376-.92 2.178a3 3 0 00.887 2.128 2.979 2.979 0 002.145.912c.793 0 1.562-.321 2.161-.903.574-.557.887-1.3.887-2.136 0-.811-.321-1.57-.878-2.136a3 3 0 00-2.171-.904zm2.643 3.065c0 .701-.271 1.351-.768 1.832a2.671 2.671 0 01-1.892.777c-.675 0-1.342-.278-1.84-.785s-.777-1.157-.777-1.849.287-1.368.802-1.891a2.54 2.54 0 011.84-.751c.726 0 1.376.271 1.883.785.49.489.752 1.147.752 1.882zm-2.559-1.807h-1.3v3.445h.65V11.24h.642l.701 1.469h.726l-.769-1.57c.498-.102.785-.439.785-.929 0-.625-.472-.946-1.435-.946zm-.118.422c.608 0 .886.169.886.591 0 .405-.278.549-.87.549h-.549v-1.14h.533z" clip-rule="evenodd"></path><g><path fill="#221B0A" d="M61.807 7.825l.676 4.107-2.391 4.575s-.918-1.941-2.443-3.015c-1.285-.905-2.122-1.102-3.431-.832-1.681.347-3.587 2.357-4.419 4.835-.995 2.965-1.005 4.4-1.04 5.718-.056 2.113.277 3.362.277 3.362s-1.452-2.686-1.438-6.62c.009-2.808.451-5.354 1.75-7.867 1.143-2.209 2.842-3.535 4.35-3.691 1.559-.161 2.791.59 3.743 1.403 1 .854 2.01 2.721 2.01 2.721l2.356-4.696zM62.102 31.063s-1.057 1.889-1.715 2.617c-.659.728-1.837 2.01-3.292 2.651s-2.218.762-3.656.624c-1.437-.138-2.772-.97-3.24-1.317-.468-.347-1.664-1.369-2.34-2.322-.676-.953-1.733-2.859-1.733-2.859s.589 1.91.958 2.721c.212.467.864 1.894 1.789 3.136.863 1.159 2.539 3.154 5.086 3.604 2.547.451 4.297-.693 4.73-.97.433-.277 1.346-1.042
1681.924-1.66.603-.645 1.174-1.468 1.49-1.962.231-.36.607-1.092.607-1.092l-.608-3.171z"></path></g></g></svg></a></span>` + 169'<!--div style="float:left;"><a href="https://www.w3.org/"><img src="https://www.w3.org/Icons/w3c_home" alt="W3C" height="48" width="72" /></a></div-->'+ 170'<div id="banner"><a href="'+base+'/International"><p id="sitename" style="font-family: Arial, Helvetica, sans-serif; font-size: 22px; border-bottom: 2px solid brown; color: #4c5c9c; margin:0; display: inline-block;">Internationalization (i18n)</p>'+ 171' <p id="subtitle">'+s.worldwide+'</p></a></div>'+ 172//' <br style="clear:both;" />'+ 173' <nav id="boilerplate">'+ 174' <div id="sitelinks" class="noprint">'+ 175' <bdi><a href="'+base+'/International/i18n-drafts/nav/learn" title="'+s.taskBasedIndex+'">'+s.techniques+'</a></bdi> '+s.rlm+ 176' <bdi><a href="'+base+'/International/i18n-drafts/nav/find" title="'+s.informationResources+'">'+s.resources+'</a></bdi> '+s.rlm+ 177' <bdi><a href="'+base+'/International/i18n-drafts/nav/ask" title="'+s.askI18nActivity+'">'+s.ask+'</a></bdi> '+s.rlm+ 178' <bdi><a href="'+base+'/International/i18n-drafts/nav/follow" title="'+s.newsFiltersAndFeeds+'">'+s.news+'</a></bdi> '+s.rlm+ 179' <bdi><a href="'+base+'/International/i18n-drafts/nav/participate" title="'+s.groupsThatMakeUp+'">'+s.groups+'</a></bdi> '+s.rlm+ 180' <bdi><a href="'+base+'/International/i18n-drafts/nav/about" title="'+s.aboutI18nActivity+'">'+s.about+'</a></bdi> '+s.rlm+ 181'   </div><div id="line"> </div>'+ 182' </nav>'+ 183' <div class="directory"><div id="site-navigation">'+ 184 versionList+ 185' </div>'+ 186 g.disclaimer 187if (f.toc && f.toc === 'no') { console.log('Doing nothing wrt toc.') } //do nothing 188else mainNavigation += '<nav class="noprint" id="level2toc">'+ 189' <h2 id="internal-links" class="notoc">'+s.onThisPage+'</h2>'+ 190' <div id="toc"> </div>'+ 191' </nav>'+ 192' <nav id="relatedlinks"></nav>'+ 193' </div>' 194 195 196// ======================================== 197// TRANSLATION STATUS UPDATES 198// ======================================== 199 200/** 201 * Check if current page is an out-of-date translation 202 */ 203var outOfDateTranslation = false 204if (trans.outofdatetranslations.length > 0) { 205 for (var lang in trans.outofdatetranslations) { 206 if (f.clang == trans.outofdatetranslations[lang]) { 207 outOfDateTranslation = true 208 break 209 } 210 } 211 } 212 213/** 214 * Check if current page is an unlinked translation 215 */ 216var unlinkedTranslation = false 217if (trans.unlinkedtranslations.length > 0) { 218 for (var lang in trans.unlinkedtranslations) { 219 if (f.clang == trans.unlinkedtranslations[lang]) { 220 unlinkedTranslation = true 221 break 222 } 223 } 224 } 225 226 var updatedTranslation = false 227if (trans.updatedtranslations.length > 0) { 228 for (var lang in trans.updatedtranslations) { 229 if (f.clang == trans.updatedtranslations[lang]) { 230 updatedTranslation = true 231 break 232 } 233 } 234 } 235 236g.updated = '' 237if (! g.isTranslation && f.firstPubDate && f.lastSubstUpdate && f.firstPubDate != f.lastSubstUpdate) { 238 g.updated = "<p class='updated'>"+s.updated+" <time datetime='"+f.lastSubstUpdate.date+"T"+f.lastSubstUpdate.time+"Z'>"+f.lastSubstUpdate.date+" "+f.lastSubstUpdate.time+"</time></p>" 239 } 240if (outOfDateTranslation) g.updated += "<p class='outofdate'>"+s.untranslatedChanges+" </p>" 241else if (unlinkedTranslation) g.updated += "<p class='unlinked'>"+s.unlinkedTranslation+" </p>" 242else if (g.isTranslation && updatedTranslation) {g.updated ="<p class='updated'>"+s.translation_updated+" <time datetime='"+f.thisVersion.date+"T"+f.thisVersion.time+"Z'>"+f.thisVersion.date+" "+f.thisVersion.time+"</time></p>" } 243 244 245// SURVEY 246 247/** 248 * Build feedback survey section 249 * Creates links for GitHub issues and RSS feeds 250 */ 251// Extract current page URL without query parameters for feedback 252var body = window.location.href 253var qm = body.search(/\?/) 254if (qm > 0) body = body.substr(0,qm) 255body = encodeURIComponent('[source] ('+body+') ['+f.clang+']') 256var title = 'Feedback on '+f.directory+f.filename 257 258// Survey section with GitHub feedback link and RSS subscription 259g.survey = '<p>'+s.tellUsWhatYouThink+'</p>'+ 260 '<p><a class="interaction" target="_blank" href="https://github.com/w3c/i18n-drafts/issues/new?title='+title+'&body='+body+'%0A%0A">
260'+s.sendAComment+'</a></p>'+ 261 '<p style="margin-top:1em">'+s.followOurNews+'</p>'+ 262 //'<p><a class="interaction" href="https://twitter.com/webi18n" title="Twitter: @webi18n"><img src="'+f.path+'icons/twitter-bird.png" style="vertical-align: middle;" alt=" " /> ‎@webi18n</a></p>'+ 263 '<p><a class="interaction" href="https://www.w3.org/blog/International/feed/rdf/" title="RSS"><img src="'+f.path+'icons/rssLink.png" alt=" " /> RSS</a></p>' 264 265 266 267// BOTTOM OF PAGE 268 269g.dateStamp = '' 270if (g.isTranslation) g.dateStamp = '<small>'+s.translatedFromEnglishVer+'</small>' 271else g.dateStamp = "<small id='version'>Content first published <time datetime='"+f.firstPubDate+"'>"+f.firstPubDate+"</time>. Last substantive update <time datetime='"+f.lastSubstUpdate.date+"T"+f.lastSubstUpdate.time+"Z'>"+f.lastSubstUpdate.date+" "+f.lastSubstUpdate.time+" GMT</time>. This version <time datetime='"+f.thisVersion.date+"T"+f.thisVersion.time+"Z'>"+f.thisVersion.date+" "+f.thisVersion.time+" GMT</time></small>"; 272 273if (g.isTranslation == 'yes') g.dateStamp = '<p>'+s.translatedFromEnglishVer+'</p>' 274else g.dateStamp = "<span id='version' dir='auto'>"+s.lastChanged+dt.thisVersionPlain+"</span>"; 275 276var previousCredit = '' 277if (f.previousauthors && f.previousauthors != '') previousCredit = ' '+s.previousAuthors+' '+f.previousauthors+s.sentenceDelimiter 278 279var modCredit = '' 280if (f.modifiers && f.modifiers != '') modCredit = s.modifiedBy+f.modifiers+s.sentenceDelimiter 281 282var translatorCredit = '' 283if (g.isTranslation) translatorCredit = s.translatedBy+f.translators+s.sentenceDelimiter 284 285var credits = "<p>"+s.author+f.authors+s.sentenceDelimiter+' '+previousCredit+modCredit+translatorCredit+"</p>" 286if (f.contributors && f.contributors != '') credits += "<p class='acknowledgements'>"+s.acknowledgements+f.contributors+"</p>" 287 288 289 290var copyright = '<span class="copyright" dir="ltr">Copyright © '+ 291 dt.copyrightYear+' <a href="https://www.w3.org/">World Wide Web Consortium</a>.<br> <abbr title="World Wide Web Consortium">W3C</abbr><sup>®</sup> <a href="https://www.w3.org/policies/#disclaimers">liability</a>, <a href="https://www.w3.org/policies/#trademarks">trademark</a> and <a rel="license" href="https://www.w3.org/copyright/document-license/" title="W3C Document License">permissive license</a> rules apply.</span>'; 292 293 294g.bottomOfPage = 295'<div id="referencesList"></div>'+ 296'<hr style="margin-top: 3em; margin-inline: 5rem;">'+ 297'<div class="section">'+ 298'<div class="smallprint">'+ 299 copyright+'<br />'+g.dateStamp+'.'+ 300' </div>'+ 301'</div>'+ 302'</div> <!--end of content div-->' 303 304 305 306// COMPLETE PAGE 307 308function completePageOLD () { 309 var sidebarExtras = '' 310 if (document.getElementById('sidebarExtras')) { 311 sidebarExtras = document.getElementById('sidebarExtras').innerHTML 312 document.getElementById('relatedlinks').innerHTML = sidebarExtras 313 } 314 //fillinTranslations() 315 if (document.getElementById("toc")) createtoc(3); 316 getURLs() 317 } 318 319 320function completePage (depth) { 321 if (typeof depth === 'undefined') depth = 2 322 var sidebarExtras = '' 323 if (document.getElementById('sidebarExtras')) { 324 sidebarExtras = document.getElementById('sidebarExtras').innerHTML 325 document.getElementById('relatedlinks').innerHTML = sidebarExtras 326 } 327 //fillinTranslations() 328 if (document.getElementById("toc")) createtoc(depth) 329 getURLs() 330 } 331 332 333function fillinTranslations () { 334 if (g.isTranslation) { 335 if (document.getElementById('intendedAudience')) document.getElementById('intendedAudience').textContent = s.intendedAudience 336 if (document.getElementById('question')) document.getElementById('question').firstChild.textContent = s.question 337 if (document.getElementById('answer')) document.getElementById('answer').firstChild.textContent = s.answer 338 if (document.getElementById('quickanswer')) document.getElementById('quickanswer').firstChild.textContent = s.quickanswer 339 if (document.getElementById('bytheway')) document.getElementById('bytheway').firstChild.textContent = s.byTheWay 340 if (document.getElementById('endlinks') && document.getElementById('endlinks').firstChild) document.getElementById('endlinks').firstChild.textContent = s.furtherReading 341 } 342 } 343 344 345function getURLs () { 346 // makes a list of URLs and adds footnote markers and footnotes to the bottom of the page 347 // this is revealed only when printing, and applies only to a tags with class print 348 349 var links = document.querySelectorAll('a.print') 350 var out = '<h3 class="notoc"><a href="#printLinks">Links in this document:</a></h3><ol>\n' 351 for (var l=0;l<links.length;l++) { 352 links[l].title = l+1 353 out += '<li>'+links[l].href+'</li>\n' 354 } 355 out += '</ol>' 356 var container = document.createElement('section') 357 container.id = "printLinks" 358 container.innerHTML = out 359 document.querySelector('#referencesList').appendChild(container) 360 361 } 362 363 364// Keyboard shortcuts for search functionality 365document.addEventListener('keydown', function(event) { 366 // Check if the key pressed is '/' 367 if (event.key === '/') { 368 // Don't trigger when typing in input fields, textareas, or contenteditable elements 369 if ( 370 event.target.tagName === 'INPUT' || 371 event.target.tagName === 'TEXTAREA' || 372 event.target.isContentEditable 373 ) { 374 return; 375 } 376 377 event.preventDefault(); 378
379 // Find the search field and focus it 380 const searchField = document.getElementById('searchField'); 381 if (searchField) { 382 searchField.focus(); 383 384 // If the search field has a default value, select it so typing will replace it 385 if (searchField.value && searchField.value !== '') { 386 searchField.select(); 387 } 388 } 389 } 390 391 // Check if the key pressed is 'Escape' 392 if (event.key === 'Escape') { 393 // Only handle Escape if we're in the search field 394 if (event.target.id === 'searchField') { 395 // Clear the search field 396 event.target.value = ''; 397 398 // Blur (unfocus) the search field 399 event.target.blur(); 400 401 event.preventDefault(); 402 } 403 } 404});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.