-
Notifications
You must be signed in to change notification settings - Fork 0
/
freedium-to-medium.js
57 lines (48 loc) · 1.81 KB
/
freedium-to-medium.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// ==UserScript==
// @name Medium to Freedium
// @namespace Violentmonkey Scripts
// @match *://*.medium.com/*
// @grant none
// @version 1.3
// @description 30/06/2024, 11:35:39
// @require https://unpkg.com/@violentmonkey/url
// @include /.*\..*\..*\/.*/
// @license MIT
// @updateURL https://raw.githubusercontent.com/intercepted16/freedium-to-medium/master/freedium-to-medium.js
// @downloadURL https://raw.githubusercontent.com/intercepted16/freedium-to-medium/master/freedium-to-medium.js
// ==/UserScript==
const { onNavigate } = VM;
function handleNavigate() {
/* The script is also run on two subdomains as some Medium articles are on those.
As Medium is an SPA, we have to use `onNavigate`
However, we might not be on an article */
if (window.location.hostname === "medium.com") {
if (!/.*\:\/\/.*medium\.com\/.*\/.*/.test(window.location.href)) {
return;
}
}
/* As mentioned earlier, we might be on two nested subdomains that are a Medium article. We can check this:
the include patterns are setup to match that */
document.querySelectorAll("meta").forEach((el) => {
if (el.getAttribute("content") === "Medium") {
onMedium();
return;
}
});
}
// Watch route change
VM.onNavigate(handleNavigate);
// Call it once for the initial state
handleNavigate();
function onMedium() {
// Remove all elements from the page
document.body.innerHTML = '';
document.head.innerHTML = '';
// Add custom styles to prevent FOUC
const style = document.createElement('style');
style.innerHTML = "body { background-color: rgb(31, 41, 55); }";
document.head.appendChild(style);
// Redirect to Freedium
const redirectTo = `https://freedium.cfd/${window.location.hostname}/${window.location.pathname}`;
window.location.replace(redirectTo);
}