1/*! 2 * Share Selected Text 3 * version: 1.1.0 4 * license: MIT 5 * url: https://github.com/VincentLoy/share-selected-text 6 * author: Vincent Loy <[email protected]> 7 * contributors: 8 * - Wendy Beth <[email protected]> 9 * - Dmitry Motorin <[email protected]> 10 */ 11'use strict'; 12(function (exports) { 13 'use strict'; 14 var getPageUrl = function getPageUrl() { 15 if (document.querySelector('meta[property="og:url"]') && document.querySelector('meta[property="og:url"]').getAttribute('content')) { 16 return document.querySelector('meta[property="og:url"]').getAttribute('content'); 17 } 18 return window.location.href; 19 }; 20 // constants 21 var TOOLTIP_HEIGHT = 50; 22 var FACTOR = 1.33; 23 var BLUESKY_LIMIT_LENGTH = 300; 24 var BLUESKY_URL_LENGTH_COUNT = 24; 25 var BLUESKY_QUOTES = 2; 26 var BLUESKY_DOTS = 3; 27 var TOOLTIP_TIMEOUT = 250; 28 var FACEBOOK_DISPLAY_MODES = { 29 popup: 'popup', 30 page: 'page' 31 }; 32 var REAL_BLUESKY_LIMIT = BLUESKY_LIMIT_LENGTH - BLUESKY_URL_LENGTH_COUNT - BLUESKY_QUOTES - BLUESKY_DOTS; 33 var SOCIAL = { 34 twitter: 'twitter', 35 bluesky: 'bluesky', 36 buffer: 'buffer', 37 digg: 'digg', 38 linkedin: 'linkedin', 39 stumbleupon: 'stumbleupon', 40 reddit: 'reddit', 41 tumblr: 'tumblr', 42 facebook: 'facebook' 43 }; 44 var NO_START_WITH = /[ .,!?/\\\+\-=*ã$â¬:~ç%^õ)(|@"{}&#><_]/g; 45 var NO_ENDS_WITH = /[ ,/\\\+\-=*ã$â¬:~ç%^õ)(|@"{}&#><_]/g; 46 var PAGE_URL = getPageUrl(); 47 // globals 48 var tooltip = undefined; 49 var parameters = undefined; 50 var selected = {}; 51 var extend = function extend(out) { 52 out = out || {}; 53 for (var i = 1; i < arguments.length; i += 1) { 54 if (arguments[i]) { 55 for (var key in arguments[i]) { 56 if (arguments[i].hasOwnProperty(key)) { 57 out[key] = arguments[i][key]; 58 } 59 } 60 } 61 } 62 return out; 63 }; 64 var hideTooltip = function hideTooltip() { 65 tooltip.classList.remove('active'); 66 }; 67 var showTooltip = function showTooltip() { 68 tooltip.classList.add('active'); 69 }; 70 var smartSanitize = function smartSanitize(text) { 71 while (text.length && text[0].match(NO_START_WITH)) { 72 text = text.substring(1, text.length); 73 } 74 while (text.length && text[text.length - 1].match(NO_ENDS_WITH)) { 75 text = text.substring(0, text.length - 1); 76 } 77 return text; 78 }; 79 var sanitizeText = function sanitizeText(text) { 80 var sociaType = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1]; 81 var author = ''; 82 var postLimit = REAL_BLUESKY_LIMIT; 83 if (!text) { 84 return ''; 85 }
86 if (parameters.twitterUsername && (sociaType === SOCIAL.twitter || sociaType === SOCIAL.bluesky)) { 87 author = ' via @' + parameters.twitterUsername; 88 postLimit = REAL_BLUESKY_LIMIT - author.length; 89 } 90 if (text.length > REAL_BLUESKY_LIMIT) { 91 text = text.substring(0, postLimit); 92 text = text.substring(0, text.lastIndexOf(' ')) + '...'; 93 } else { 94 text = text.substring(0, postLimit + BLUESKY_DOTS); 95 } 96 return smartSanitize(text); 97 }; 98 99 var title = $('h1').text(); 100 101 var generateSocialUrl = function generateSocialUrl(socialType, text) { 102 if (parameters.sanitize) { 103 text = sanitizeText(text, socialType); 104 } else { 105 text = smartSanitize(text); 106 } 107 var twitterUrl = 'https://twitter.com/intent/tweet?url=' + PAGE_URL + '&text="' + text + '"'; 108 if (parameters.twitterUsername && parameters.twitterUsername.length) { 109 twitterUrl += '&via=' + parameters.twitterUsername; 110 } 111 var blueskyUrl = 'https://bsky.app/intent/compose?text=' + encodeURIComponent('"' + text + '" ' + PAGE_URL); 112 var facebookUrl = 'https://www.facebook.com/sharer/sharer.php?u=' + PAGE_URL + '&title='+title+'&description="' + text + '"'; 113 114 var textLong = getSelectedText(); 115 116 if($('.article-full').length>0 || $('.article-map').length>0){ 117 var emailTextArticle = mapConfig.share_text_for_email; 118 119 if(text !== undefined) { 120 emailTextArticle = emailTextArticle.replace(/textReplace/, textLong.text); 121 } 122 } else { 123 emailTextArticle = 'mailto:?subject=Article from World of Labour%0D%0A&body='+PAGE_URL+' + '+textLong.text+''; 124 }; 125 126 var urls = { 127 twitter: twitterUrl, 128 bluesky: blueskyUrl, 129 buffer: 'https://buffer.com/add?text="' + text + '"&url=' + PAGE_URL, 130 digg: 'http://digg.com/submit?url=' + PAGE_URL + '&title=' + text, 131 linkedin: 'https://www.linkedin.com/shareArticle?url=' + PAGE_URL + '&summary=' + text + '&title=' + title, 132 stumbleupon: 'http://www.stumbleupon.com/submit?url=' + PAGE_URL + '&title=' + text, 133 reddit: 'https://reddit.com/submit?url=' + PAGE_URL + '&title=' + text, 134 tumblr: emailTextArticle, 135 facebook: facebookUrl 136 }; 137 if (urls.hasOwnProperty(socialType)) { 138 return urls[socialType]; 139 } 140 return ''; 141 }; 142 var updateTooltip = function updateTooltip(rect) { 143 var actualPosition = document.documentElement.scrollTop || document.body.scrollTop; 144 var body = document.querySelector('body'); 145 tooltip.style.top = actualPosition + rect.top - TOOLTIP_HEIGHT * FACTOR + 'px'; 146 tooltip.style.left = rect.left + rect.width / 2 - body.getBoundingClientRect().width / 2 + 'px'; 147 Array.prototype.forEach.call(parameters.buttons, function (btn) { 148 tooltip.querySelector('.share-selected-text-btn-' + btn).href = generateSocialUrl(btn, selected.text); 149 }); 150 window.setTimeout(function () { 151 showTooltip(); 152 }, parameters.tooltipTimeout); 153 }; 154 var generateAnchorTag = function generateAnchorTag(anchorType) { 155 var customIconClass = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; 156 var anchorTag = document.createElement('A'); 157 var anchorIcon = document.createElement('i'); 158 if (parameters.anchorsClass) { 159 anchorTag.classList.add('share-selected-text-btn', 'share-selected-text-btn-' + anchorType, '' + parameters.anchorsClass); 160 } else { 161 anchorTag.classList.add('share-selected-text-btn', 'share-selected-text-btn-' + anchorType); 162 } 163 if (customIconClass) { 164 anchorIcon.classList.add('' + customIconClass); 165 } else { 166 anchorIcon.classList.add('icon-sst-' + anchorType, 'fa', 'fa-' + anchorType); 167 } 168 anchorIcon.style.pointerEvents = 'none'; 169 anchorTag.addEventListener('click', function (e) { 170 e.preventDefault();
171 var windowFeatures = 'status=no,menubar=no,location=no,scrollbars=no,width=720,height=540'; 172 var url = e.target.href; 173 window.open(url, 'Share this post', windowFeatures); 174 }); 175 anchorTag.href = generateSocialUrl(anchorType, selected.text ? selected.text : ''); 176 anchorTag.appendChild(anchorIcon); 177 return anchorTag; 178 }; 179 var generateTooltip = function generateTooltip() { 180 var body = document.querySelector('body'); 181 var mainDiv = document.createElement('DIV'); 182 var btnContainer = document.createElement('DIV'); 183 mainDiv.classList.add('share-selected-text-main-container'); 184 btnContainer.classList.add('share-selected-text-inner'); 185 if (parameters.tooltipClass) { 186 btnContainer.classList.add(parameters.tooltipClass); 187 } 188 mainDiv.style.height = TOOLTIP_HEIGHT + 'px'; 189 mainDiv.style.top = 0; 190 mainDiv.style.left = 0; 191 Array.prototype.forEach.call(parameters.buttons, function (btn) { 192 var aTag = generateAnchorTag(btn); 193 btnContainer.appendChild(aTag); 194 }); 195 mainDiv.appendChild(btnContainer); 196 body.appendChild(mainDiv); 197 return mainDiv; 198 }; 199 var getSelectedText = function getSelectedText() { 200 var text = ''; 201 var selection = undefined; 202 if (window.getSelection) { 203 selection = window.getSelection(); 204 text = selection.toString(); 205 } else if (document.selection && document.selection.type !== 'Control') { 206 selection = document.selection.createRange(); 207 text = selection.text; 208 } 209 return { 210 selection: selection, 211 text: text 212 }; 213 }; 214 var shareTooltip = function shareTooltip() { 215 selected = getSelectedText(); 216 if (selected.text.length) { 217 var oRange = selected.selection.getRangeAt(0); 218 var oRect = oRange.getBoundingClientRect(); 219 updateTooltip(oRect); 220 } else { 221 hideTooltip(); 222 } 223 }; 224 exports.shareSelectedText = function (element, args) { 225 var elt = document.querySelectorAll(element); 226 parameters = extend({ 227 tooltipClass: '', 228 sanitize: true, 229 buttons: [SOCIAL.bluesky, SOCIAL.buffer], 230 anchorsClass: '', 231 twitterUsername: '', 232 facebookAppID: '', 233 facebookDisplayMode: FACEBOOK_DISPLAY_MODES.popup, 234 tooltipTimeout: TOOLTIP_TIMEOUT 235 }, args); 236 tooltip = generateTooltip(); 237 Array.prototype.forEach.call(elt, function (el) { 238 el.addEventListener('mouseup', function () { 239 shareTooltip(); 240 }); 241 }); 242 }; 243})(window); 244 245/*global jQuery, shareSelectedText*/ 246if (window.jQuery) { 247 (function ($, shareSelected) { 248 'use strict'; 249 250 var shareSelectedify = function shareSelectedify(el, options) { 251 shareSelected(el, options); 252 }; 253 254 $.fn.shareSelectedText = function (options) { 255 return shareSelectedify(this.selector, options); 256 }; 257 })(jQuery, shareSelectedText); 258}
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.