-
-
Save extensionsapp/946a14d5c820d57ac7c4 to your computer and use it in GitHub Desktop.
| // ==UserScript== | |
| // @name habrahabr-userscript | |
| // @description Объединение постов Хабрахабр + Geektimes, в одну ленту на Habrahabr.ru | |
| // @author ExtensionsApp | |
| // @license MIT | |
| // @version 2.0.18 | |
| // @include https://habrahabr.ru/feed/all/* | |
| // @include https://habrahabr.ru/feed/interesting/* | |
| // @include https://habrahabr.ru/all/* | |
| // @grant GM_setValue | |
| // @grant GM_getValue | |
| // @grant GM.xmlHttpRequest | |
| // ==/UserScript== | |
| var habr = { | |
| init: function() { | |
| var styleEl = document.createElement("style"); | |
| styleEl.type = "text/css"; | |
| styleEl.media = "screen"; | |
| styleEl.innerHTML = '.fonts-loaded .post__flow, .fonts-loaded .post__title, .fonts-loaded .post__title_link { font-family: Arial, \'Helvetica Neue\' ,Helvetica, sans-serif !important; } .post__flow, .post__title, .post__title_link {font-size: 20px !important; font-family: Arial, \'Helvetica Neue\' ,Helvetica, sans-serif !important; }'; | |
| document.getElementsByTagName('head')[0].appendChild(styleEl); | |
| var last = document.createElement('li'), | |
| article = document.createElement('article'), | |
| header = document.createElement('header'), | |
| time = document.createElement('span'); | |
| last.setAttribute('id', 'last_id'); | |
| last.setAttribute('class', 'content-list__item content-list__item_post'); | |
| last.setAttribute('style', 'display:none;'); | |
| article.setAttribute('class', 'post post_preview'); | |
| header.setAttribute('class', 'post post__meta'); | |
| time.setAttribute('class', 'post__time'); | |
| time.innerHTML = '20 января 2015 в 00:01'; | |
| header.appendChild(time); | |
| article.appendChild(header); | |
| last.appendChild(article); | |
| document.getElementsByClassName('content-list_posts')[0].appendChild(last); | |
| habr.feed('geektimes.ru'); | |
| }, | |
| feed: function(host) { | |
| var href = location.href; | |
| href = href.replace('habrahabr.ru',host); | |
| GM.xmlHttpRequest({ | |
| method: "GET", | |
| url: href, | |
| onload: function(response) { | |
| if (response.readyState == 4) { | |
| var html = document.createElement('div'); | |
| var https = (response.responseText).replace(/http:\/\//g, 'https://'); | |
| html.innerHTML = https; | |
| var posts = html.getElementsByClassName('content-list__item_post'); | |
| for (var i = 0; i < posts.length; i++) { | |
| var post = document.createElement('li'); | |
| post.setAttribute('id', posts[i].id); | |
| post.setAttribute('class', 'content-list__item content-list__item_post'); | |
| post.innerHTML = posts[i].innerHTML; | |
| var date; | |
| if (post.getElementsByClassName('published').length > 0) { | |
| date = post.getElementsByClassName('published')[0].innerHTML; | |
| } | |
| else if (post.getElementsByClassName('post__time_published').length > 0) { | |
| date = post.getElementsByClassName('post__time_published')[0].innerHTML; | |
| } | |
| else if (post.getElementsByClassName('post__time').length > 0) { | |
| date = post.getElementsByClassName('post__time')[0].innerHTML; | |
| } | |
| else if (post.getElementsByClassName('megapost-head__meta').length > 0) { | |
| var meta = document.createElement('div'); | |
| meta.innerHTML = post.getElementsByClassName('megapost-head__meta')[0].innerHTML; | |
| date = meta.getElementsByClassName('list__item')[0].innerHTML; | |
| } | |
| else { | |
| continue; | |
| } | |
| var postDate = habr.getDate(date); | |
| if ((post.getElementsByClassName('title').length > 0)) { | |
| post.getElementsByClassName('title')[0].setAttribute('style','padding-right:71px;'); | |
| } | |
| if ((post.getElementsByClassName('post__title').length > 0)) { | |
| post.getElementsByClassName('post__title')[0].setAttribute('style','padding-right:71px;'); | |
| } | |
| if ((post.getElementsByClassName('favorite').length > 0)) { | |
| post.getElementsByClassName('favorite')[0].parentNode.removeChild(post.getElementsByClassName('favorite')[0]); | |
| } | |
| if ((post.getElementsByClassName('js-plus').length > 0)) { | |
| post.getElementsByClassName('js-plus')[0].parentNode.removeChild(post.getElementsByClassName('js-plus')[0]); | |
| } | |
| if ((post.getElementsByClassName('js-minus').length > 0)) { | |
| post.getElementsByClassName('js-minus')[0].parentNode.removeChild(post.getElementsByClassName('js-minus')[0]); | |
| } | |
| if ((post.getElementsByClassName('plus').length > 0)) { | |
| post.getElementsByClassName('plus')[0].parentNode.removeChild(post.getElementsByClassName('plus')[0]); | |
| } | |
| if ((post.getElementsByClassName('minus').length > 0)) { | |
| post.getElementsByClassName('minus')[0].parentNode.removeChild(post.getElementsByClassName('minus')[0]); | |
| } | |
| if ((post.getElementsByClassName('post-stats__item_voting-wjt').length > 0)) { | |
| post.getElementsByClassName('post-stats__item_voting-wjt')[0].parentNode.removeChild(post.getElementsByClassName('post-stats__item_voting-wjt')[0]); | |
| } | |
| if ((post.getElementsByClassName('bookmark-btn_post').length > 0)) { | |
| post.getElementsByClassName('bookmark-btn_post')[0].parentNode.removeChild(post.getElementsByClassName('bookmark-btn_post')[0]); | |
| } | |
| habr.addChild(post.innerHTML, postDate, host, post.id); | |
| } | |
| } | |
| } | |
| }); | |
| }, | |
| addChild: function(data, time, host, id) { | |
| var posts = document.getElementsByClassName('content-list__item_post'); | |
| for (var i = 0; i < posts.length; i++) { | |
| var date; | |
| if (posts[i].getElementsByClassName('published').length > 0) { | |
| date = posts[i].getElementsByClassName('published')[0].innerHTML; | |
| } | |
| else if (posts[i].getElementsByClassName('post__time_published').length > 0) { | |
| date = posts[i].getElementsByClassName('post__time_published')[0].innerHTML; | |
| } | |
| else if (posts[i].getElementsByClassName('post__time').length > 0) { | |
| date = posts[i].getElementsByClassName('post__time')[0].innerHTML; | |
| } | |
| else if (posts[i].getElementsByClassName('megapost-head__meta').length > 0) { | |
| var meta = document.createElement('div'); | |
| meta.innerHTML = posts[i].getElementsByClassName('megapost-head__meta')[0].innerHTML; | |
| date = meta.getElementsByClassName('list__item')[0].innerHTML; | |
| } | |
| else { | |
| continue; | |
| } | |
| var postDate = habr.getDate(date); | |
| var postAdd = document.createElement('li'); | |
| postAdd.setAttribute('class', 'content-list__item content-list__item_post'); | |
| postAdd.setAttribute('id', id); | |
| postAdd.setAttribute('style', 'background:url("https://' + host + '/images/logo.svg") right top no-repeat; background-size: 71px;'); | |
| postAdd.innerHTML = data; | |
| if (time >= postDate) { | |
| document.getElementsByClassName('content-list_posts')[0].insertBefore(postAdd, document.getElementById(posts[i].id)); | |
| break; | |
| } | |
| } | |
| }, | |
| getDate: function(date) { | |
| var d = new Date(), | |
| dateYear, | |
| dateMonth, | |
| dateDay, | |
| dateHour, | |
| dateMin, | |
| dateMinSec, | |
| parseDate; | |
| if (date.indexOf('сегодня') + 1) { | |
| date = date.replace('сегодня в ', ''); | |
| dateMinSec = date.split(':'); | |
| dateYear = d.getFullYear(); | |
| dateMonth = d.getMonth(); | |
| dateDay = d.getDate(); | |
| dateHour = dateMinSec[0]; | |
| dateMin = dateMinSec[1]; | |
| } | |
| else if (date.indexOf('вчера') + 1) { | |
| date = date.replace('вчера в ', ''); | |
| dateMinSec = date.split(':'); | |
| dateYear = d.getFullYear(); | |
| dateMonth = d.getMonth(); | |
| dateDay = d.getDate()-1; | |
| dateHour = dateMinSec[0]; | |
| dateMin = dateMinSec[1]; | |
| } | |
| else { | |
| parseDate = /([0-9]{1,2})\s(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\s([0-9]{4})\sв\s([0-9]{2}):([0-9]{2})/gi.exec(date); | |
| if (!parseDate) { | |
| parseDate = /([0-9]{1,2})\s(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\sв\s([0-9]{2}):([0-9]{2})/gi.exec(date); | |
| dateYear = d.getFullYear(); | |
| dateDay = parseDate[1]; | |
| dateHour = parseDate[3]; | |
| dateMin = parseDate[4]; | |
| } | |
| else { | |
| dateYear = parseDate[3]; | |
| dateDay = parseDate[1]; | |
| dateHour = parseDate[4]; | |
| dateMin = parseDate[5]; | |
| } | |
| switch (parseDate[2]) { | |
| case 'января': | |
| dateMonth = 0; | |
| break; | |
| case 'февраля': | |
| dateMonth = 1; | |
| break; | |
| case 'марта': | |
| dateMonth = 2; | |
| break; | |
| case 'апреля': | |
| dateMonth = 3; | |
| break; | |
| case 'мая': | |
| dateMonth = 4; | |
| break; | |
| case 'июня': | |
| dateMonth = 5; | |
| break; | |
| case 'июля': | |
| dateMonth = 6; | |
| break; | |
| case 'августа': | |
| dateMonth = 7; | |
| break; | |
| case 'сентября': | |
| dateMonth = 8; | |
| break; | |
| case 'октября': | |
| dateMonth = 9; | |
| break; | |
| case 'ноября': | |
| dateMonth = 10; | |
| break; | |
| case 'декабря': | |
| dateMonth = 11; | |
| break; | |
| default : | |
| dateMonth = 0; | |
| } | |
| } | |
| return new Date(dateYear, dateMonth, dateDay, dateHour, dateMin); | |
| } | |
| }; | |
| habr.init(); |
И вообще, залейте на greasefork и openuserjs (умеют из гитхаб-репозитория брать, включая гисты, но лучше сделать полноценный репозиторий, так как в них есть хуки)
Заменял 2 строчки
var html = document.createElement('div');
html.innerHTML = response.responseText;
на одну
var html = GM_safeHTMLParser(response.responseText);
Не хочет работать.
В Google Chrome последний как ставить? Он по умолчанию не разрешает ставить расширения не из магазина.
Устанавливаем это расширение (обезьянка):
Opera - https://addons.opera.com/ru/extensions/details/violent-monkey/
Mozilla - https://addons.mozilla.org/ru/firefox/addon/greasemonkey/
Chrome - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
Safari - http://8-p.info/greasekit/
Затем нажать Raw на этой странице вверху или установить через openuserjs - https://openuserjs.org/scripts/extensionsapp/habrahabr-userscript
Есть же GM_safeHTMLParser