functions.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // global variables
  2. const doc = document.documentElement;
  3. const inline = ":inline";
  4. // variables read from your hugo configuration
  5. const parentURL = '{{ absURL "" }}';
  6. function isObj(obj) {
  7. return (obj && typeof obj === 'object' && obj !== null) ? true : false;
  8. }
  9. function createEl(element = 'div') {
  10. return document.createElement(element);
  11. }
  12. function elem(selector, parent = document){
  13. let elem = parent.querySelector(selector);
  14. return elem != false ? elem : false;
  15. }
  16. function elems(selector, parent = document) {
  17. let elems = parent.querySelectorAll(selector);
  18. return elems.length ? elems : false;
  19. }
  20. function pushClass(el, targetClass) {
  21. if (isObj(el) && targetClass) {
  22. elClass = el.classList;
  23. elClass.contains(targetClass) ? false : elClass.add(targetClass);
  24. }
  25. }
  26. function hasClasses(el) {
  27. if(isObj(el)) {
  28. const classes = el.classList;
  29. return classes.length
  30. }
  31. }
  32. (function markInlineCodeTags(){
  33. const codeBlocks = elems('code');
  34. if(codeBlocks) {
  35. codeBlocks.forEach(function(codeBlock){
  36. hasClasses(codeBlock) ? false: pushClass(codeBlock, 'noClass');
  37. });
  38. }
  39. })();
  40. function deleteClass(el, targetClass) {
  41. if (isObj(el) && targetClass) {
  42. elClass = el.classList;
  43. elClass.contains(targetClass) ? elClass.remove(targetClass) : false;
  44. }
  45. }
  46. function modifyClass(el, targetClass) {
  47. if (isObj(el) && targetClass) {
  48. elClass = el.classList;
  49. elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass);
  50. }
  51. }
  52. function containsClass(el, targetClass) {
  53. if (isObj(el) && targetClass && el !== document ) {
  54. return el.classList.contains(targetClass) ? true : false;
  55. }
  56. }
  57. function elemAttribute(elem, attr, value = null) {
  58. if (value) {
  59. elem.setAttribute(attr, value);
  60. } else {
  61. value = elem.getAttribute(attr);
  62. return value ? value : false;
  63. }
  64. }
  65. function wrapEl(el, wrapper) {
  66. el.parentNode.insertBefore(wrapper, el);
  67. wrapper.appendChild(el);
  68. }
  69. function deleteChars(str, subs) {
  70. let newStr = str;
  71. if (Array.isArray(subs)) {
  72. for (let i = 0; i < subs.length; i++) {
  73. newStr = newStr.replace(subs[i], '');
  74. }
  75. } else {
  76. newStr = newStr.replace(subs, '');
  77. }
  78. return newStr;
  79. }
  80. function isBlank(str) {
  81. return (!str || str.trim().length === 0);
  82. }
  83. function isMatch(element, selectors) {
  84. if(isObj(element)) {
  85. if(selectors.isArray) {
  86. let matching = selectors.map(function(selector){
  87. return element.matches(selector)
  88. })
  89. return matching.includes(true);
  90. }
  91. return element.matches(selectors)
  92. }
  93. }
  94. function copyToClipboard(str) {
  95. let copy, selection, selected;
  96. copy = createEl('textarea');
  97. copy.value = str;
  98. copy.setAttribute('readonly', '');
  99. copy.style.position = 'absolute';
  100. copy.style.left = '-9999px';
  101. selection = document.getSelection();
  102. doc.appendChild(copy);
  103. // check if there is any selected content
  104. selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
  105. copy.select();
  106. document.execCommand('copy');
  107. doc.removeChild(copy);
  108. if (selected) { // if a selection existed before copying
  109. selection.removeAllRanges(); // unselect existing selection
  110. selection.addRange(selected); // restore the original selection
  111. }
  112. }
  113. function loadSvg(file, parent, path = 'icons/') {
  114. const link = `${parentURL}${path}${file}.svg`;
  115. fetch(link)
  116. .then((response) => {
  117. return response.text();
  118. })
  119. .then((data) => {
  120. parent.innerHTML = data;
  121. });
  122. }
  123. function getMobileOperatingSystem() {
  124. let userAgent = navigator.userAgent || navigator.vendor || window.opera;
  125. if (/android/i.test(userAgent)) {
  126. return "Android";
  127. }
  128. if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
  129. return "iOS";
  130. }
  131. return "unknown";
  132. }
  133. function horizontalSwipe(element, func, direction) {
  134. // call func if result of swipeDirection() 👇🏻 is equal to direction
  135. let touchstartX = 0;
  136. let touchendX = 0;
  137. let swipeDirection = null;
  138. function handleGesure() {
  139. return (touchendX + 50 < touchstartX) ? 'left' : (touchendX < touchstartX + 50) ? 'right' : false;
  140. }
  141. element.addEventListener('touchstart', e => {
  142. touchstartX = e.changedTouches[0].screenX
  143. });
  144. element.addEventListener('touchend', e => {
  145. touchendX = e.changedTouches[0].screenX
  146. swipeDirection = handleGesure()
  147. swipeDirection === direction ? func() : false;
  148. });
  149. }
  150. function parseBoolean(string) {
  151. let bool;
  152. string = string.trim().toLowerCase();
  153. switch (string) {
  154. case 'true':
  155. return true;
  156. case 'false':
  157. return false;
  158. default:
  159. return undefined;
  160. }
  161. };
  162. (function() {
  163. const bodyElement = elem('body');
  164. const platform = navigator.platform.toLowerCase();
  165. if(platform.includes("win")) {
  166. pushClass(bodyElement, 'windows');
  167. }
  168. })();