1(function () { 2 3 'use strict'; 4 5 Drupal.behaviors.quicklink = { 6 attach: function attachQuicklink(context, settings) { 7 var debug = settings.quicklink.debug; 8 9 function hydrateQuicklinkConfig() { 10 settings.quicklink.quicklinkConfig = settings.quicklink.quicklinkConfig || {}; 11 settings.quicklink.ignoredLinks = settings.quicklink.ignoredLinks || []; 12 13 var quicklinkConfig = settings.quicklink.quicklinkConfig; 14 15 quicklinkConfig.ignores = []; 16 17 // Loop through all the patterns to ignore, and generate rules to ignore URL patterns. 18 for (var i = 0; i < settings.quicklink.url_patterns_to_ignore.length; i++) { 19 var pattern = settings.quicklink.url_patterns_to_ignore[i]; 20 21 (function (i, pattern) { 22 if (pattern.length) { 23 quicklinkConfig.ignores.push(function (uri, elem) { 24 var ruleName = 'Pattern found in href. See ignored URL patterns log.'; 25 var ruleFunc = uri.includes(pattern); 26 27 outputDebugInfo(ruleFunc, ruleName, uri, elem, pattern); 28 29 return ruleFunc; 30 }); 31 } 32 })(i, pattern); 33 } 34 35 // Loop through all the "ignore selectors", and generate rules. 36 if (settings.quicklink.ignore_selectors) { 37 for (var i = 0; i < settings.quicklink.ignore_selectors.length; i++) { 38 var pattern = settings.quicklink.ignore_selectors[i]; 39 40 (function (i, pattern) { 41 if (pattern.length) { 42 quicklinkConfig.ignores.push(function (uri, elem) { 43 var ruleName = 'Element matches custom selectors within "ignore selectors" array. See log.'; 44 var ruleFunc = elem.matches(pattern); 45 46 outputDebugInfo(ruleFunc, ruleName, uri, elem, pattern); 47 48 return ruleFunc; 49 }); 50 } 51 })(i, pattern); 52 } 53 } 54 55 if (settings.quicklink.ignore_admin_paths) { 56 var adminLinkContainerPatterns = settings.quicklink.admin_link_container_patterns.join(); 57 58 quicklinkConfig.ignores.push(function (uri, elem) { 59 var ruleName = 'Exists in admin element container.'; 60 var ruleFunc = elem.matches(adminLinkContainerPatterns); 61 62 outputDebugInfo(ruleFunc, ruleName, uri, elem); 63 64 return ruleFunc; 65 }); 66 } 67 68 if (settings.quicklink.ignore_ajax_links) { 69 quicklinkConfig.ignores.push(function (uri, elem) { 70 var ruleName = 'Link has "use-ajax" CSS class.'; 71 var ruleFunc = elem.classList.contains('use-ajax'); 72 73 outputDebugInfo(ruleFunc, ruleName, uri, elem); 74 75 return ruleFunc; 76 }); 77 78 quicklinkConfig.ignores.push(function (uri, elem) { 79 var ruleName = 'Link has "/ajax" in url.'; 80 var ruleFunc = uri.includes('/ajax'); 81 82 outputDebugInfo(ruleFunc, ruleName, uri, elem); 83 84 return ruleFunc; 85 }); 86 } 87 88 if (settings.quicklink.ignore_file_ext) { 89 quicklinkConfig.ignores.push(function (uri, elem) { 90 var ruleName = 'Contains file extension at end of href.'; 91 var ruleFunc = uri.match(/(\.[^\/]{1,5}\?)|(\.[^\/]{1,5}$)/); 92 93 outputDebugInfo(ruleFunc, ruleName, uri, elem); 94 95 return ruleFunc; 96 }); 97 } 98 99 if (settings.quicklink.total_request_limit) { 100 quicklinkConfig.limit = parseInt(settings.quicklink.total_request_limit); 101 } 102 103 if (settings.quicklink.concurrency_throttle_limit) { 104 quicklinkConfig.throttle = parseInt(settings.quicklink.concurrency_throttle_limit); 105 } 106 107 if (settings.quicklink.idle_wait_timeout) { 108 quicklinkConfig.timeout = parseInt(settings.quicklink.idle_wait_timeout); 109 } 110 111 if (settings.quicklink.viewport_delay) { 112 quicklinkConfig.delay = parseInt(settings.quicklink.viewport_delay); 113 } 114 115 quicklinkConfig.ignores.push(function (uri, elem) {
116 var ruleName = 'Contains noprefetch attribute.'; 117 var ruleFunc = elem.hasAttribute('noprefetch'); 118 119 outputDebugInfo(ruleFunc, ruleName, uri, elem); 120 121 return ruleFunc; 122 }); 123 124 quicklinkConfig.ignores.push(function (uri, elem) { 125 var ruleName = 'Contains download attribute.'; 126 var ruleFunc = elem.hasAttribute('download'); 127 128 outputDebugInfo(ruleFunc, ruleName, uri, elem); 129 130 return ruleFunc; 131 }); 132 133 quicklinkConfig.origins = (settings.quicklink.allowed_domains) ? settings.quicklink.allowed_domains : false; 134 } 135 136 function outputDebugInfo(ruleFunc, ruleName, uri, elem, pattern) { 137 if (debug && ruleFunc) { 138 var debugMessage = ruleName + ' Link ignored.'; 139 var thisLog = {}; 140 var urlPattern = pattern || false; 141 142 elem.classList.add('quicklink-ignore'); 143 elem.textContent += 'ð«'; 144 elem.dataset.quicklinkMatch = debugMessage; 145 146 thisLog.ruleName = ruleName; 147 thisLog.uri = uri; 148 thisLog.elem = elem; 149 thisLog.message = debugMessage; 150 151 if (urlPattern) { 152 thisLog.urlPattern = urlPattern; 153 } 154 155 (function (thisLog) { 156 settings.quicklink.ignoredLinks.push(thisLog); 157 })(thisLog); 158 } 159 } 160 161 function loadQuicklink() { 162 var urlParams = new URLSearchParams(window.location.search); 163 var noprefetch = urlParams.get('noprefetch') !== null || window.location.hash === '#noprefetch' ; 164 165 if (noprefetch && debug) { 166 // eslint-disable-next-line no-console 167 console.info('The "noprefetch" parameter or hash exists in the URL. Quicklink library not loaded.'); 168 } 169 170 return window.quicklink && !noprefetch; 171 } 172 173 if (!settings.quicklink.quicklinkConfig) { 174 hydrateQuicklinkConfig(); 175 } 176 177 settings.quicklink.quicklinkConfig.el = (settings.quicklink.selector) ? context.querySelector(settings.quicklink.selector) : context; 178 179 if (loadQuicklink()) { 180 if (settings.quicklink.prefetch_only_paths) { 181 quicklink.prefetch(settings.quicklink.prefetch_only_paths); 182 } 183 else { 184 try { 185 quicklink.listen(settings.quicklink.quicklinkConfig); 186 } 187 catch(err) { 188 console.error('quicklink.listen is not found. Please verify you are running version 2 of the Quicklink library.', err); 189 } 190 } 191 } 192 193 if (debug) { 194 console.info('Quicklink config object', settings.quicklink.quicklinkConfig); // eslint-disable-line no-console 195 console.info('Quicklink module debug log', settings.quicklink.debug_log); // eslint-disable-line no-console 196 console.info('Quicklink ignored links', settings.quicklink.ignoredLinks); // eslint-disable-line no-console 197 } 198 } 199 }; 200})();
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.