Pogdesign-Widgets

Add links relative to the episode

目前为 2022-02-06 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Pogdesign-Widgets
  3. // @namespace https://github.com/fabiencrassat
  4. // @version 1.3.18
  5. // @description Add links relative to the episode
  6. // @author Fabien Crassat <fabien@crassat.com>
  7. // @match https://www.pogdesign.co.uk/cat/
  8. // @match http://www.pogdesign.co.uk/cat/
  9. // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\d{1,}-\d{4}/
  10. // eslint-disable-next-line max-len
  11. // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/day\/\d{1,}-\d{1,}-\d{4}/
  12. // eslint-disable-next-line max-len
  13. // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*\/Season-\d+\/Episode-\d+/
  14. // @include /^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*-summary/
  15. // eslint-disable-next-line max-len
  16. // @require https://greasyfork.org/scripts/35624-pogdesign-widgets-js/code/Pogdesign-Widgetsjs.js?version=891915
  17. // @grant none
  18. // @run-at document-end
  19. // ==/UserScript==
  20.  
  21. /* global $, fabiencrassat */
  22. 'use strict';
  23.  
  24. // eslint-disable-next-line max-lines-per-function
  25. const pages = function pages() {
  26. const { externalLinks } = fabiencrassat.view;
  27. const { controller, shared } = fabiencrassat.main;
  28.  
  29. const page = {
  30. calendar: {
  31. displayExternalLinksPopup(element) {
  32. const popup = externalLinks
  33. .create('fcr-calendar-page', 'block');
  34. element
  35. .parent()
  36. .parent()
  37. .parent()
  38. .after(popup);
  39. },
  40. extractSeasonAndEpisode(element) {
  41. return element
  42. .prev()
  43. .text();
  44. },
  45. extractTitle(element) {
  46. return element
  47. .parent()
  48. .prev()
  49. .text();
  50. },
  51. insertExternalLink(element) {
  52. $(element)
  53. .wrap('<span class="fcr-episodeContainer"></span>');
  54. $('span.fcr-episodeContainer > :last-child')
  55. .after(shared.externalImageLink());
  56. },
  57. isInLocationPage() {
  58. /* The regex is the same than the @include in the header */
  59. // eslint-disable-next-line prefer-named-capture-group, max-len
  60. return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/($|\d{1,}-\d{4})/gu);
  61. },
  62. stylesheets() {
  63. return `
  64. span.fcr-episodeContainer > :last-child {
  65. float: right;
  66. }
  67. span.fcr-episodeContainer > :first-child {
  68. float: left;
  69. }
  70. .ep.infochecked .fcr-externalLink-image {
  71. filter: contrast(0);
  72. }
  73. .fcr-externalLink-image {
  74. height: 12px;
  75. width: 12px;
  76. background-image: url('${shared.linkImage}');
  77. }`;
  78. }
  79. },
  80. day: {
  81. displayExternalLinksPopup(element) {
  82. page.summary.displayExternalLinksPopup(element);
  83. },
  84. extractSeasonAndEpisode(element) {
  85. const seasonAndEpisode = element
  86. .parent()
  87. .next()
  88. .text();
  89. // eslint-disable-next-line prefer-named-capture-group
  90. const regex = /^Season (\d{1,}), Episode (\d{1,})/gu;
  91. return {
  92. episode: seasonAndEpisode.replace(regex, '$2'),
  93. season: seasonAndEpisode.replace(regex, '$1')
  94. };
  95. },
  96. extractTitle(element) {
  97. return element
  98. .parent()
  99. .prev()
  100. .text();
  101. },
  102. insertExternalLink(element) {
  103. $('<span class="fcr-episodeContainer"></span>')
  104. .insertAfter(element);
  105. $(shared.externalImageLink())
  106. .appendTo('span.fcr-episodeContainer');
  107. },
  108. isInLocationPage() {
  109. // eslint-disable-next-line max-len
  110. return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/day\/\d{1,}-\d{1,}-\d{4}/gu);
  111. },
  112. stylesheets() {
  113. return `
  114. .overbox h4 a {
  115. width: 35%;
  116. padding-right: 0;
  117. margin-right: 25%;
  118. }
  119. span.fcr-episodeContainer {
  120. padding-top: 24px !important;
  121. padding-left: 30px !important;
  122. float: left !important;
  123. width: 36px !important;
  124. }
  125. .fcr-externalLink-image {
  126. height: 12px;
  127. width: 12px !important;
  128. padding: 0 !important;
  129. background-image: url('${shared.linkImage}');
  130. }
  131. .fcr-external-links-popup #poptext > span > a {
  132. color: #66bbff;
  133. }`;
  134. }
  135. },
  136. episode: {
  137. displayExternalLinksPopup(element) {
  138. const popup = externalLinks
  139. .create('fcr-external-links-popup', 'inline-flex');
  140. element
  141. .after(popup);
  142. },
  143. extractSeasonAndEpisode() {
  144. return $('h3.sdfsdf')
  145. .children()
  146. .first()
  147. .text();
  148. },
  149. extractTitle() {
  150. return $('.furtherinfo a:first')
  151. .text();
  152. },
  153. insertExternalLink(element) {
  154. $(`<span> ${shared.externalTextLink()}</span>`)
  155. .appendTo(element);
  156. },
  157. isInLocationPage() {
  158. /* The regex is the same than the @include in the header */
  159. // eslint-disable-next-line prefer-named-capture-group, max-len
  160. return controller.isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*\/Season-\d+\/Episode-\d+/gu);
  161. },
  162. stylesheets() {
  163. return page.summary.stylesheets();
  164. }
  165. },
  166. summary: {
  167. displayExternalLinksPopup(element) {
  168. const offsetLeft = -200;
  169. const offsetTop = 20;
  170. const position = {
  171. left: element.offset().left + offsetLeft,
  172. top: element.offset().top + offsetTop
  173. };
  174. const popup = externalLinks
  175. .create('fcr-external-links-popup', 'block', position);
  176. $('body > div:last')
  177. .after(popup);
  178. },
  179. extractSeasonAndEpisode(element) {
  180. const seasonAndEpisodeElement = element
  181. .parent()
  182. .parent()
  183. .parent();
  184. return {
  185. episode: seasonAndEpisodeElement
  186. .find('[itemprop=episodeNumber]')
  187. .text(),
  188. season: seasonAndEpisodeElement
  189. .find('[itemprop=seasonNumber]')
  190. .text()
  191. };
  192. },
  193. extractTitle() {
  194. return $('h2.sumhead > a')
  195. .text()
  196. .replace(/ {1}Summary & Series Guide/gu, '');
  197. },
  198. insertExternalLink(element) {
  199. $(element)
  200. .wrap('<span class="fcr-episodeContainer"></span>');
  201. $(shared.externalImageLink())
  202. .appendTo('span.fcr-episodeContainer');
  203. },
  204. isInLocationPage() {
  205. /* The regex is the same than the @include in the header */
  206. return controller
  207. // eslint-disable-next-line prefer-named-capture-group, max-len
  208. .isInLocationPage(/^https:\/\/www\.pogdesign\.co\.uk\/cat\/\w+(-*\w+)*-summary/gu);
  209. },
  210. stylesheets() {
  211. return `
  212. span.fcr-episodeContainer {
  213. display: flex;
  214. }
  215. .fcr-externalLink-image {
  216. height: 12px !important;
  217. width: 12px !important;
  218. filter: contrast(0);
  219. margin: 9px -12px 9px 54px;
  220. background-image: url('${shared.linkImage}');
  221. }
  222. .ep.infochecked .fcr-externalLink-image {
  223. filter: contrast(0.4);
  224. }
  225. .fcr-external-links-popup #pop {
  226. padding: 1px;
  227. font-size: initial;
  228. letter-spacing: initial;
  229. line-height: 1.5;
  230. border: 1px solid #000;
  231. border-radius: 10px;
  232. box-shadow: 0px 0px 21px rgba(0, 0, 0, 0.5);
  233. text-shadow: 1px 1px 0 #000;
  234. background-color: rgba(38, 38, 38, 0.9);
  235. opacity: .95;
  236. }
  237. .fcr-external-links-popup #popheader {
  238. background-color: rgba(0, 0, 0, 0.3);
  239. color: #fff;
  240. border-radius: 9px 9px 0 0;
  241. }
  242. .fcr-external-links-popup #poptext > span > a {
  243. color: #66bbff;
  244. }
  245. .fcr-external-links-popup #popfooter {
  246. background-color: rgba(0, 0, 0, 0.3);
  247. color: #FF9326;
  248. border-radius: 0 0 9px 9px;
  249. }`;
  250. }
  251. }
  252. };
  253.  
  254. return {
  255. calendar: page.calendar,
  256. day: page.day,
  257. episode: page.episode,
  258. summary: page.summary
  259. };
  260. };
  261.  
  262. const scriptElement = document.createElement('script');
  263. const textNode = `var fabiencrassat = fabiencrassat || {};
  264. fabiencrassat.page = (${pages})();`;
  265. scriptElement.appendChild(document.createTextNode(textNode));
  266.  
  267. (document.body || document.head || document.documentElement)
  268. .appendChild(scriptElement);
  269.  
  270. window.addEventListener('load', () => {
  271. // Add search episode links for calendar pages
  272. fabiencrassat.main.controller.addExternalLink(
  273. fabiencrassat.page.calendar,
  274. '#month_box p > :last-child'
  275. );
  276. // Add search episode links for day pages
  277. fabiencrassat.main.controller.addExternalLink(
  278. fabiencrassat.page.day,
  279. '.overbox > h4 > a'
  280. );
  281. // Add search episode links for summary page
  282. fabiencrassat.main.controller.addExternalLink(
  283. fabiencrassat.page.summary,
  284. 'li.ep > strong > a'
  285. );
  286. // Add search episode links for episode page
  287. fabiencrassat.main.controller.addExternalLink(
  288. fabiencrassat.page.episode,
  289. 'h3.sdfsdf'
  290. );
  291. // No page found
  292. }, false);