1/** 2 * @file 3 * Dialog initialization for mail preview. 4 */ 5 6(function ($, Drupal, drupalSettings, once) { 7 'use strict'; 8 var $window = $(window); 9 10 Drupal.behaviors.externalLinkPopup = { 11 attach: function (context) { 12 var self = this; 13 var settings = drupalSettings.external_link_popup; 14 15 if ( 16 !settings.popups 17 || !settings.popups.length 18 || !$(once('external-link-popup', 'body', context)).length 19 ) { 20 return; 21 } 22 23 // RegExp /\s*,\s*|\s+/ supports both space and comma delimiters 24 // and its combination. 25 var whitelist = settings.whitelist ? settings.whitelist.split(/\s*,\s*|\s+/) : []; 26 var current = window.location.host || window.location.hostname; 27 var popup; 28 29 whitelist.unshift(current); 30 if (current.substr(0, 4) === 'www.') { 31 whitelist.push(current.substr(4)); 32 } 33 else { 34 whitelist.push('www.' + current); 35 } 36 37 // $.once checked above. 38 $('body', context).on('click', 'a', function (e) { 39 var element = $(this).get(0); 40 var popupId = element.getAttribute('data-external-link-popup-id'); 41 var domain = self.getDomain(element.getAttribute('href')); 42 if (!domain && !popupId) { 43 // It's internal link, return without events. 44 return; 45 } 46 if ( 47 $(element).hasClass('external-link-popup-disabled') || 48 !popupId && 49 self.inDomain(domain, whitelist) 50 ) { 51 $window.trigger({ 52 type: 'externalLinkPopup:skipped', 53 popupId: null, 54 domain: domain, 55 target: element 56 }); 57 return; 58 } 59 60 for (var i = 0; i < settings.popups.length; i++) { 61 popup = settings.popups[i]; 62 if (!popupId && popup.domains !== '*' && !self.inDomain(domain, popup.domains.split(/\s*,\s*|\s+/))) { 63 continue; 64 } 65 if (popupId && popupId !== popup.id) { 66 continue; 67 } 68 e.preventDefault(); 69 return self.openDialog( 70 element, 71 popup, 72 domain 73 ); 74 } 75 76 $window.trigger({ 77 type: 'externalLinkPopup:notFound', 78 popupId: null, 79 domain: domain, 80 target: element 81 }); 82 }); 83 }, 84 inDomain: function (domain, domains) { 85 if (typeof domain !== 'string') { 86 return false; 87 } 88 for (var i in domains) { 89 if ( 90 domain.toLowerCase() === domains[i].toLowerCase() || 91 domain.match(new RegExp('\\.' + this.pregEscape(domains[i]) + '$', 'i')) 92 ) { 93 return true; 94 } 95 } 96 return false; 97 }, 98 getDomain: function (url) { 99 if (typeof url !== 'string') { 100 return null; 101 } 102 var matches = url.match(/\/\/([^/]+)\/?/); 103 return matches && matches[1]; 104 }, 105 pregEscape: function (str) { 106 return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]', 'g'), '\\$&'); 107 }, 108 openDialog: function (element, popup, domain) { 109 var dialog; 110 var yes = false; 111 var body = document.createElement('div'); 112 var content = document.createElement('div'); 113 var options = { 114 title: popup.title, 115 width: drupalSettings.external_link_popup.width || '85%', 116 buttons: [ 117 { 118 text: popup.labelyes, 119 click: function () { 120 yes = true; 121 $(this).dialog('close'); 122 $window.trigger({ 123 type: 'externalLinkPopup:yes', 124 popupId: popup.id, 125 domain: domain, 126 target: element 127 }); 128 var target = window.open(element.href, element.target || popup.target); 129 target.focus(); 130 } 131 } 132 ], 133 create: function () { 134 var $widget = $(this).parent(); 135 136 if (!$widget.length) { 137 // Bootstrap theme modal. 138 $widget = $('.modal-dialog', this); 139 } 140 $widget.addClass('external-link-popup') 141 .addClass('external-link-popup-id-' + popup.id.replace('_', '-')); 142 if (!popup.close) { 143 $widget.find('.ui-dialog-titlebar-close').remove(); 144 } 145 if (!popup.title && !popup.close) { 146 $widget.find('.ui-dialog-titlebar').remove(); 147 } 148 }, 149 close: function () { 150 var $element = $(this); 151 if (dialog && dialog.open) { 152 dialog.close(); 153 } 154 $element.dialog('destroy'); 155 if (!yes) { 156 $window.trigger({ 157 type: 'externalLinkPopup:no', 158 popupId: popup.id, 159 domain: domain, 160 target: element 161 }); 162 } 163 } 164 }; 165 if (popup.labelno) { 166 options.buttons.push({ 167 text: popup.labelno, 168 click: function () { 169 $(this).dialog('close'); 170 } 171 }); 172 } 173 174 // Take care about tokens. 175 var url = $(element).attr('href'); 176 var text = $(element).text(); 177 var bodyHtml = popup.body 178 .replace('[link:url]', this.htmlEncode(url)) 179 .replace('[link:text]', this.htmlEncode(text)); 180 181 content.className = 'external-link-popup-content'; 182 body.innerHTML = bodyHtml; 183 body.className = 'external-link-popup-body'; 184 content.appendChild(body); 185 186 dialog = Drupal.dialog(content, options); 187 dialog.showModal(); 188 }, 189 htmlEncode: function (value) { 190 return $('<div/>').text(value).html(); 191 } 192 }; 193})(jQuery, Drupal, drupalSettings, once);
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.