您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add links relative to the episode
// ==UserScript== // @name Pogdesign-Widgets // @namespace https://github.com/fabiencrassat // @version 1.3.18 // @description Add links relative to the episode // @author Fabien Crassat <[email protected]> // @match https://www.pogdesign.co.uk/cat/ // @match http://www.pogdesign.co.uk/cat/ // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\d{1,}-\d{4}/ // eslint-disable-next-line max-len // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/day\/\d{1,}-\d{1,}-\d{4}/ // eslint-disable-next-line max-len // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*\/Season-\d+\/Episode-\d+/ // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*-summary/ // eslint-disable-next-line max-len // @require https://greasyfork.org/scripts/35624-pogdesign-widgets-js/code/Pogdesign-Widgetsjs.js?version=891915 // @grant none // @run-at document-end // ==/UserScript== /* global $, fabiencrassat */ 'use strict'; // eslint-disable-next-line max-lines-per-function const pages = function pages() { const { externalLinks } = fabiencrassat.view; const { controller, shared } = fabiencrassat.main; const page = { calendar: { displayExternalLinksPopup(element) { const popup = externalLinks .create('fcr-calendar-page', 'block'); element .parent() .parent() .parent() .after(popup); }, extractSeasonAndEpisode(element) { return element .prev() .text(); }, extractTitle(element) { return element .parent() .prev() .text(); }, insertExternalLink(element) { $(element) .wrap('<span class="fcr-episodeContainer"></span>'); $('span.fcr-episodeContainer > :last-child') .after(shared.externalImageLink()); }, isInLocationPage() { /* The regex is the same than the @include in the header */ // eslint-disable-next-line prefer-named-capture-group, max-len return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/($|\d{1,}-\d{4})/gu); }, stylesheets() { return ` span.fcr-episodeContainer > :last-child { float: right; } span.fcr-episodeContainer > :first-child { float: left; } .ep.infochecked .fcr-externalLink-image { filter: contrast(0); } .fcr-externalLink-image { height: 12px; width: 12px; background-image: url('${shared.linkImage}'); }`; } }, day: { displayExternalLinksPopup(element) { page.summary.displayExternalLinksPopup(element); }, extractSeasonAndEpisode(element) { const seasonAndEpisode = element .parent() .next() .text(); // eslint-disable-next-line prefer-named-capture-group const regex = /^Season (\d{1,}), Episode (\d{1,})/gu; return { episode: seasonAndEpisode.replace(regex, '$2'), season: seasonAndEpisode.replace(regex, '$1') }; }, extractTitle(element) { return element .parent() .prev() .text(); }, insertExternalLink(element) { $('<span class="fcr-episodeContainer"></span>') .insertAfter(element); $(shared.externalImageLink()) .appendTo('span.fcr-episodeContainer'); }, isInLocationPage() { // eslint-disable-next-line max-len return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/day\/\d{1,}-\d{1,}-\d{4}/gu); }, stylesheets() { return ` .overbox h4 a { width: 35%; padding-right: 0; margin-right: 25%; } span.fcr-episodeContainer { padding-top: 24px !important; padding-left: 30px !important; float: left !important; width: 36px !important; } .fcr-externalLink-image { height: 12px; width: 12px !important; padding: 0 !important; background-image: url('${shared.linkImage}'); } .fcr-external-links-popup #poptext > span > a { color: #66bbff; }`; } }, episode: { displayExternalLinksPopup(element) { const popup = externalLinks .create('fcr-external-links-popup', 'inline-flex'); element .after(popup); }, extractSeasonAndEpisode() { return $('h3.sdfsdf') .children() .first() .text(); }, extractTitle() { return $('.furtherinfo a:first') .text(); }, insertExternalLink(element) { $(`<span> ${shared.externalTextLink()}</span>`) .appendTo(element); }, isInLocationPage() { /* The regex is the same than the @include in the header */ // eslint-disable-next-line prefer-named-capture-group, max-len return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*\/Season-\d+\/Episode-\d+/gu); }, stylesheets() { return page.summary.stylesheets(); } }, summary: { displayExternalLinksPopup(element) { const offsetLeft = -200; const offsetTop = 20; const position = { left: element.offset().left + offsetLeft, top: element.offset().top + offsetTop }; const popup = externalLinks .create('fcr-external-links-popup', 'block', position); $('body > div:last') .after(popup); }, extractSeasonAndEpisode(element) { const seasonAndEpisodeElement = element .parent() .parent() .parent(); return { episode: seasonAndEpisodeElement .find('[itemprop=episodeNumber]') .text(), season: seasonAndEpisodeElement .find('[itemprop=seasonNumber]') .text() }; }, extractTitle() { return $('h2.sumhead > a') .text() .replace(/ {1}Summary & Series Guide/gu, ''); }, insertExternalLink(element) { $(element) .wrap('<span class="fcr-episodeContainer"></span>'); $(shared.externalImageLink()) .appendTo('span.fcr-episodeContainer'); }, isInLocationPage() { /* The regex is the same than the @include in the header */ return controller // eslint-disable-next-line prefer-named-capture-group, max-len .isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*-summary/gu); }, stylesheets() { return ` span.fcr-episodeContainer { display: flex; } .fcr-externalLink-image { height: 12px !important; width: 12px !important; filter: contrast(0); margin: 9px -12px 9px 54px; background-image: url('${shared.linkImage}'); } .ep.infochecked .fcr-externalLink-image { filter: contrast(0.4); } .fcr-external-links-popup #pop { padding: 1px; font-size: initial; letter-spacing: initial; line-height: 1.5; border: 1px solid #000; border-radius: 10px; box-shadow: 0px 0px 21px rgba(0, 0, 0, 0.5); text-shadow: 1px 1px 0 #000; background-color: rgba(38, 38, 38, 0.9); opacity: .95; } .fcr-external-links-popup #popheader { background-color: rgba(0, 0, 0, 0.3); color: #fff; border-radius: 9px 9px 0 0; } .fcr-external-links-popup #poptext > span > a { color: #66bbff; } .fcr-external-links-popup #popfooter { background-color: rgba(0, 0, 0, 0.3); color: #FF9326; border-radius: 0 0 9px 9px; }`; } } }; return { calendar: page.calendar, day: page.day, episode: page.episode, summary: page.summary }; }; const scriptElement = document.createElement('script'); const textNode = `var fabiencrassat = fabiencrassat || {}; fabiencrassat.page = (${pages})();`; scriptElement.appendChild(document.createTextNode(textNode)); (document.body || document.head || document.documentElement) .appendChild(scriptElement); window.addEventListener('load', () => { // Add search episode links for calendar pages fabiencrassat.main.controller.addExternalLink( fabiencrassat.page.calendar, '#month_box p > :last-child' ); // Add search episode links for day pages fabiencrassat.main.controller.addExternalLink( fabiencrassat.page.day, '.overbox > h4 > a' ); // Add search episode links for summary page fabiencrassat.main.controller.addExternalLink( fabiencrassat.page.summary, 'li.ep > strong > a' ); // Add search episode links for episode page fabiencrassat.main.controller.addExternalLink( fabiencrassat.page.episode, 'h3.sdfsdf' ); // No page found }, false);