Skip to content

Instantly share code, notes, and snippets.

@extensionsapp
Last active November 17, 2017 18:07
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save extensionsapp/946a14d5c820d57ac7c4 to your computer and use it in GitHub Desktop.
Save extensionsapp/946a14d5c820d57ac7c4 to your computer and use it in GitHub Desktop.
Объединение постов Хабрахабр + Geektimes, в одну ленту на Habrahabr.ru
// ==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();
@KOLANICH
Copy link

Есть же GM_safeHTMLParser

@KOLANICH
Copy link

И вообще, залейте на greasefork и openuserjs (умеют из гитхаб-репозитория брать, включая гисты, но лучше сделать полноценный репозиторий, так как в них есть хуки)

@extensionsapp
Copy link
Author

Заменял 2 строчки

var html = document.createElement('div');
html.innerHTML = response.responseText;

на одну

var html = GM_safeHTMLParser(response.responseText);

Не хочет работать.

@extensionsapp
Copy link
Author

@and7ey
Copy link

and7ey commented May 18, 2016

В Google Chrome последний как ставить? Он по умолчанию не разрешает ставить расширения не из магазина.

@extensionsapp
Copy link
Author

Устанавливаем это расширение (обезьянка):
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment