-
Notifications
You must be signed in to change notification settings - Fork 31
/
content.js
104 lines (92 loc) · 3.38 KB
/
content.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
// Make Medium Readable Again
//
var makeReadable = function() {
// Un-position:fixed the top nav bar
var topNav = document.querySelector('.metabar.u-fixed');
if (topNav) {
topNav.classList.remove('u-fixed');
}
// Remove the "Pardon the interruption" popup.
// We do this with JS because the .overlay.overlay--lighter element is used
// for interactions we consent to, like the sign up / log in dialogs, so we
// don't want to obliterate them too.
// FIXME: prevent this from breaking signup/login dialogs when the popup
// is removed (it works after changing pages).
var headings = document.evaluate("//h1[contains(., 'Pardon the interruption.')]", document, null, XPathResult.ANY_TYPE, null );
var thisHeading = headings.iterateNext();
if (thisHeading != null) {
var $overlay = thisHeading.parentNode.parentNode.parentNode.parentNode;
$overlay.parentNode.removeChild($overlay);
}
// Inject remaining styles
// This check makes sure the extension works on Chrome and Firefox.
if (typeof browser === 'undefined') {
browser = chrome;
}
document.head.insertAdjacentHTML('beforeend', '<link rel="stylesheet" type="text/css" href="' + browser.runtime.getURL("medium.css") + '">');
};
var hideHighlightMenu = function() {
document.head.insertAdjacentHTML('beforeend', '<style type="text/css">.highlightMenu { display: none; }</style>');
};
var hideDickbar = function() {
var dickbar = document.querySelector('.js-postShareWidget');
if (dickbar) {
dickbar.style.display = 'none';
}
var footerDickbar = document.querySelector('footer > .container:first-child');
if (footerDickbar) {
footerDickbar.style.display = 'none';
}
};
var disableLazyLoading = function() {
// Get all <noscript> tags accompanying dynamically-loading <img>s
var hiddenMedia = document.querySelectorAll('noscript.js-progressiveMedia-inner');
if (hiddenMedia.length === 0) {
return;
}
for (var i=0; i<hiddenMedia.length; i++) {
// Create new <img> element from the one in <noscript> and add it in.
// This is certainly a roundabout way of doing things, but I didn't want to
// spend more time reverse-engineering Medium's lazy-loading code.
var img = new Image();
var srcMatch = hiddenMedia[i].textContent.match(/src="(https:\/\/[^"]+)"/);
if (srcMatch != null) {
img.src = srcMatch[1];
img.className = hiddenMedia[i].textContent.match(/class="([^"]+)"/)[1];
hiddenMedia[i].parentNode.appendChild(img);
}
}
};
var shrinkHeaderImages = function() {
var ridiculousHeaderImage = document.querySelector('figure.graf--layoutFillWidth');
if (ridiculousHeaderImage) {
ridiculousHeaderImage.style.maxWidth = '700px';
ridiculousHeaderImage.style.margin = '0 auto';
}
}
var observer = new MutationObserver(function(mutations){
mutations.forEach(function(){
makeReadable();
shrinkHeaderImages();
});
});
var config = {attributes: true};
// This extension runs on all domains so it can Make Medium Readable Again even for publications on custom domains.
// Here we make sure the code only runs on Medium sites.
if (document.querySelector('head meta[property="al:ios:app_name"][content="medium" i]')) {
makeReadable();
shrinkHeaderImages();
chrome.storage.sync.get(null, function(items) {
if (items.hideDickbar) {
hideDickbar();
}
if (items.disableLazyImages) {
disableLazyLoading();
}
if (items.hideHighlightMenu) {
hideHighlightMenu();
}
});
observer.observe(document.body, config);
}