PageSourceSearch

https://thewordfoundation.org/hlib/hlib.js?v=111

js thewordfoundation.org collected 2026-09-24 22:16:19 UTC 15,565 bytes, 345 lines download raw bytes

1/*
2  Javascript for TWF HTML library
3*/
4  
5/* Do Matomo tracking of current page */
6
7var _paq = window._paq = window._paq || [];
8_paq.push(['trackPageView']);
9_paq.push(['enableLinkTracking']);
10(function() {
11  var u="//thewordfoundation.org/matomo/";
12  _paq.push(['setTrackerUrl', u+'matomo.php']);
13  _paq.push(['setSiteId', '1']);
14  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
15  g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
16})();
17
18/* Jump to another element on same page and scroll up past navigation buttons */
19
20function JumpId(sId) {
21  document.location.href = '#' + sId;
22  const eNav = document.getElementById('defnav');
23  window.scrollBy(0, -eNav.clientHeight);
24} // JumpId
25
26/* Toggle visibility of element */
27
28function ShowHide(sItem) {
29  const eItem = document.getElementById(sItem);
30  eItem.className = (eItem.className === 'show') ? 'hide' : 'show';
31} // ShowHide
32
33/* Toggle display of audio and play if displayed */
34
35function ShowHidePlay(sItem) {
36  const eItem = document.getElementById(sItem);
37  if (eItem.className === 'show') {
38    eItem.className = 'hide';
39    eItem.pause();
40  } else {
41    eItem.className = 'show';
42    eItem.play();
43  }
44} // ShowHidePlay
45
46/* Toggle visibility of abbreviation popup, with abbreviation title */
47
48function ShowHideAbbr(eAbbr) {
49  const eIns  = eAbbr.nextElementSibling;
50  const sTerm = eAbbr.title + ' <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="close" onclick="HideAbbr(this);"><g transform="translate(+08,+08)"><line x1="-04" y1="-04" x2="+04" y2="+04" class="plot" /><line x1="-04" y1="+04" x2="+04" y2="-04" class="plot" /></g></svg>';
51  if (!eIns.innerHTML) eIns.innerHTML = sTerm;
52  // eIns.className = (eIns.className === 'show') ? 'hide' : 'show';
53  eIns.style.display = (eIns.style.display === 'inline') ? 'none' : 'inline';
54} // ShowHideAbbr
55
56/* Close zodiacal abbreviation popup - called from close button in popup */
57
58function HideAbbr(eSvg) {
59  const eIns = eSvg.parentElement;
60  // eIns.className = 'hide';
61  eIns.style.display = 'none';
62} // HideAbbr
63
64/* Toggle visibility of footnote - called from preceding element */
65
66function ShowHideFootNote(eMark) {
67  const aIns = eMark.nextElementSibling.classList;
68  if (aIns.contains('show')) {
69    aIns.remove('show');
70    aIns.add('hide');
71  } else {
72    aIns.remove('hide');
73    aIns.add('show');
74  }
75} // ShowHideFootNote
76
77/* Close footnote - called from close button within footnote */
78
79function HideFootNote(eSvg) {
80  const aIns = eSvg.parentElement.classList;
81  aIns.remove('show');
82  aIns.add('hide');
83} // HideFootNote
84
85/* Close opened menus */
86
87function HideMenus() {
88  var eMenu;
89  eMenu = document.getElementById('mainmenu'   )
90  if (eMenu) eMenu.className = 'main';
91  eMenu = document.getElementById('aboutmenu'  )
92  if (eMenu) eMenu.className = 'hide';
93  eMenu = document.getElementById('librarymenu')
94  if (eMenu) eMenu.className = 'hide';
95  eMenu = document.getElementById('ordermenu'  )
96  if (eMenu) eMenu.className = 'hide';
97}  // HideMenus
98
99/* Close dialog element - used by close button */
100
101function CloseDialog(eSvg) {
102  const eDialog = eSvg.parentElement;
103  eDialog.close();
104} // CloseDialog
105
106/* Close opened menus and footnotes when user clicks outside them */
107
108window.onclick = (event) => {
109  if (!(event.target.matches('header nav *')    || 
110        event.target.matches('body > nav *')    ||
111        event.target.matches('article > nav *') )) 
112    HideMenus();
113  if (!(event.target.matches('article mark' ) ||
114        event.target.matches('article abbr' ) ||
115        event.target.matches('article ins'  ) ||
116        event.target.matches('article ins *') )) {
117    for (const eIns of document.getElementsByTagName('INS')) {
118      if (eIns.matches('mark+ins')) eIns.className = 'hide';
119      if (eIns.matches('abbr+ins')) eIns.style.display = 'none';
120    }  
121  }  
122  if (!(event.target.matches('article mark'         ) ||
123        event.target.matches('article figure.symbol') )) {
124    for (const eSymbol of document.getElementsByClassName('symbol')) {
125      if (eSymbol.tagName === 'IFRAME') eSymbol.style.display = 'none';
126    }  
127  }  
128  const eShare = document.getElementById('share');
129  if (event.target == eShare) {
130    eShare.close();
131  }
132  const eAlpha = document.getElementById('alpha');
133  if (event.target == eAlpha) {
134    eAlpha.close();
135  }
136} // window.onclick
137
138/* Show share dialog - called from share button */
139
140function ShowShare() {
141  const eTextArea = document.getElementById('sharetext');
142  if (eTextArea.value == '') {
143    const sTitle = document.title + ' • Harold W. Percival';
144    const sCurl  = document.querySelector("link[rel='canonical']").href;
145    eTextArea.value = sTitle + '\n' + sCurl;
146  }
147  document.getElementById('share').showModal()
148} // ShowShare
149
150/* Copy input text to clipboard */
151
152function CopyText(sInput, sConfirm) {
153  const eInput = document.getElementById(sInput);
154  eInput.select();
155  eInput.setSelectionRange(0, eInput.value.length);
156  navigator.clipboard.writeText(eInput.value);
157  const eConfirm = document.getElementById(sConfirm);
158  eConfirm.className = 'show';
159  eConfirm.focus();
160  setTimeout(() => {eConfirm.className = 'hide';}, 2000);
161} // CopyText
162
163/* Generate link from this site to social media site */
164
165function ShareLink(eLink) {
166  const sECurl  = encodeURIComponent(document.querySelector("link[rel='canonical']").href);
167  const sETitle = encodeURIComponent(document.title + ' • Harold W. Percival');
168  ShareLinkSite(eLink, sECurl, sETitle);
169} // ShareLink
170
171/* Go to social media site - used by ShareLink() and ShareLinkFragment() */
172
173function ShareLinkSite(eLink, sECurl, sETitle) {
174  switch (eLink.className) {
175    case 'facebook': 
176      eLink.href = 'https://facebook.com/sharer/sharer.php?u=' + sECurl;
177      break;
178    case 'twitter':
179      eLink.href = 'https://twitter.com/intent/tweet/?text=' + sETitle + '&amp;url=' + sECurl;
180      break;
181    case 'email':
182      eLink.href = 'mailto:?subject=' + sETitle + '&body=' + sECurl;
183      break;
184    case 'sms':
185      eLink.href = 'sms:?body=' + sETitle + '%0D%0A' + sECurl;
186      break;
187    case 'pinterest':
188      eLink.href = 'https://pinterest.com/pin/create/button/?url=' + sECurl + '&amp;media=' + sECurl + '&amp;description=' + sETitle;
189      break;
190    case 'linkedin':
191      eLink.href = 'https://www.linkedin.com/sharing/share-offsite/?url=' + sECurl
192      break;
193    case 'reddit':
194      eLink.href = 'https://reddit.com/submit/?url=' + sECurl + '&amp;resubmit=true&amp;title=' + sETitle;
195      break;
196    case 'whatsapp':
197      eLink.href = 'whatsapp://send?text=' + sETitle + '%20' + sECurl;
198      break;
199    case 'telegram':
200      eLink.href = 'https://telegram.me/share/url?text=' + sETitle + '&amp;url=' + sECurl;
201      break;
202    case 'addtoany':
203      eLink.href = 'https://www.addtoany.com/share#url=' + sECurl + '&title=' + sETitle
204      break;
205  }
206} // ShareLinkSite
207
208/* GTranslate */
209
210function doGTranslate(lang_pair) {
211  if (lang_pair.value) lang_pair = lang_pair.value;
212  if (lang_pair == '') return;
213  const nlang = lang_pair.split('|')[1];
214  if (typeof _gaq != 'undefined') {
215    _gaq.push(['_trackEvent', 'GTranslate', nlang, location.hostname + location.pathname + location.search]);
216  } else {
217    if(typeof ga != 'undefined') ga('send', 'event', 'GTranslate', nlang, location.hostname + location.pathname + location.search);
218  }
219  let plang = 'en';
220  const domain = gt_request_uri.split('/')[2].split('.');
221  if (domain.length === 3) {
222    plang = domain[0];
223  }
224  if (plang == 'en') {
225    if (nlang == 'en') {
226      location.href = gt_request_uri;
227    } else {
228      location.href = gt_request_uri.replace('://', '://' + nlang + '.');
229    }
230  } else {
231    if (nlang == 'en') {
232      location.href = gt_request_uri.replace('://' + plang + '.', '://');
233    } else {
234      location.href = gt_request_uri.replace('://' + plang + '.', '://' + nlang + '.');
235    }
236  }
237}
238
239function setGTranslate() {
240  const eSwitcher = document.getElementById("gtranslate_element");
241  eSwitcher.innerHTML = `
242    <select onchange="doGTranslate(this);" id="gtranslate_selector" aria-label="Website Language Selector">
243      <option value="">Select Language</option>
244      <option value="en|af" class="notranslate">Afrikaans</option>
245      <option value="en|so" class="notranslate">Afsoomaali</option>
246      <option value="en|az" class="notranslate">Azərbaycan dili</option>
247      <option value="en|id" class="notranslate">Bahasa Indonesia</option>
248      <option value="en|ms" class="notranslate">Bahasa Melayu</option>
249      <option value="en|jw" class="notranslate">Basa Jawa</option>
250      <option value="en|su" class="notranslate">Basa Sunda</option>
251      <option value="en|bs" class="notranslate">Bosanski</option>
252      <option value="en|ca" class="notranslate">Català</option>
253      <option value="en|ceb" class="notranslate">Cebuano</option>
254      <option value="en|cs" class="notranslate">Čeština‎</option>
255      <option value="en|ny" class="notranslate">Chichewa</option>
256      <option value="en|co" class="notranslate">Corsu</option>
257      <option value="en|cy" class="notranslate">Cymraeg</option>
258      <option value="en|da" class="notranslate">Dansk</option>
259      <option value="en|de" class="notranslate">Deutsch</option>
260      <option value="en|et" class="notranslate">Eesti</option>
261      <option value="en|en" class="notranslate">English</option>
262      <option value="en|es" class="notranslate">Español</option>
263      <option value="en|eo" class="notranslate">Esperanto</option>
264      <option value="en|eu" class="notranslate">Euskara</option>
265      <option value="en|tl" class="notranslate">Filipino</option>
266      <option value="en|fr" class="notranslate">Français</option>
267      <option value="en|ga" class="notranslate">Gaelige</option>
268      <option value="en|gd" class="notranslate">Gàidhlig</option>
269      <option value="en|gl" class="notranslate">Galego</option>
270      <option value="en|ha" class="notranslate">Harshen Hausa</option>
271      <option value="en|hmn" class="notranslate">Hmong</option>
272      <option value="en|hr" class="notranslate">Hrvatski</option>
273      <option value="en|ig" class="notranslate">Igbo</option>
274      <option value="en|xh" class="notranslate">isiXhosa</option>
275      <option value="en|is" class="notranslate">Íslenska</option>
276      <option value="en|it" class="notranslate">Italiano</option>
277      <option value="en|sw" class="notranslate">Kiswahili</option>
278      <option value="en|ht" class="notranslate">Kreyol ayisyen</option>
279      <option value="en|lv" class="notranslate">Latviešu valoda</option>
280      <option value="en|lt" class="notranslate">Lietuvių kalba</option>
281      <option value="en|hu" class="notranslate">Magyar</option>
282      <option value="en|mg" class="notranslate">Malagasy</option>
283      <option value="en|mt" class="notranslate">Maltese</option>
284      <option value="en|nl" class="notranslate">Nederlands</option>
285      <option value="en|no" class="notranslate">Norsk bokmål</option>
286      <option value="en|haw" class="notranslate">Ōlelo Hawaiʻi</option>
287      <option value="en|uz" class="notranslate">O‘zbekcha</option>
288      <option value="en|pl" class="notranslate">Polski</option>
289      <option value="en|pt" class="notranslate">Português</option>
290      <option value="en|ro" class="notranslate">Română</option>
291      <option value="en|st" class="notranslate">Sesotho</option>
292      <option value="en|sn" class="notranslate">Shona</option>
293      <option value="en|sq" class="notranslate">Shqip</option>
294      <option value="en|sk" class="notranslate">Slovenčina</option>
295      <option value="en|sl" class="notranslate">Slovenščina</option>
296      <option value="en|fi" class="notranslate">Suomi</option>
297      <option value="en|sv" class="notranslate">Svenska</option>
298      <option value="en|mi" class="notranslate">Te Reo Māori</option>
299      <option value="en|vi" class="notranslate">Tiếng Việt</option>
300      <option value="en|tr" class="notranslate">Türkçe</option>
301      <option value="en|yo" class="notranslate">Yorùbá</option>
302      <option value="en|zu" class="notranslate">Zulu</option>
303      <option value="en|el" class="notranslate">Ελληνικά</option>
304      <option value="en|be" class="notranslate">Беларуская мова</option>
305      <option value="en|bg" class="notranslate">Български</option>
306      <option value="en|kk" class="notranslate">Қазақ тілі</option>
307      <option value="en|ky" class="notranslate">
307Кыргызча</option>
308      <option value="en|mk" class="notranslate">Македонски јазик</option>
309      <option value="en|mn" class="notranslate">Монгол</option>
310      <option value="en|ru" class="notranslate">Русский</option>
311      <option value="en|sr" class="notranslate">Српски језик</option>
312      <option value="en|tg" class="notranslate">Тоҷикӣ</option>
313      <option value="en|uk" class="notranslate">Українська</option>
314      <option value="en|hy" class="notranslate">Հայերեն</option>
315      <option value="en|ka" class="notranslate">ქართული</option>
316      <option value="en|am" class="notranslate">አማርኛ</option>
317      <option value="en|yi" class="notranslate">יידיש</option>
318      <option value="en|iw" class="notranslate">עִבְרִית</option>
319      <option value="en|ur" class="notranslate">اردو</option>
320      <option value="en|ar" class="notranslate">العربية</option>
321      <option value="en|sd" class="notranslate">سنڌي</option>
322      <option value="en|fa" class="notranslate">فارسی</option>
323      <option value="en|ku" class="notranslate">كوردی‎</option>
324      <option value="en|ps" class="notranslate">پښتو</option>
325      <option value="en|ne" class="notranslate">नेपाली</option>
326      <option value="en|mr" class="notranslate">मराठी</option>
327      <option value="en|hi" class="notranslate">हिन्दी</option>
328      <option value="en|bn" class="notranslate">বাংলা</option>
329      <option value="en|pa" class="notranslate">ਪੰਜਾਬੀ</option>
330      <option value="en|gu" class="notranslate">ગુજરાતી</option>
331      <option value="en|ta" class="notranslate">தமிழ்</option>
332      <option value="en|te" class="notranslate">తెలుగు</option>
333      <option value="en|kn" class="notranslate">ಕನ್ನಡ</option>
334      <option value="en|ml" class="notranslate">മലയാളം</option>
335      <option value="en|si" class="notranslate">සිංහල</option>
336      <option value="en|th" class="notranslate">ไทย</option>
337      <option value="en|lo" class="notranslate">ພາສາລາວ</option>
338      <option value="en|my" class="notranslate">ဗမာစာ</option>
339      <option value="en|ko" class="notranslate">한국어</option>
340      <option value="en|km" class="notranslate">ភាសាខ្មែរ</option>
341      <option value="en|ja" class="notranslate">日本語</option>
342      <option value="en|zh-CN" class="notranslate">简体中文</option>
343      <option value="en|zh-TW" class="notranslate">繁體中文</option>
344    </select>`;
345} // setGTranslate

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.