PageSourceSearch

https://wol.iza.org/js/plugins/share-text.js

js iza.org collected 2026-09-24 06:49:18 UTC 10,255 bytes, 258 lines download raw bytes

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.