«Дуров, поверни стіну» або «Хабрахабр + Geektimes + Мегамозок» в одній стрічці



Коли розбушувався Роскомнагляд і Хабр з вимушеним причин розділився, з'явився «молодший брат», якого не шкода — Geektimes. Мені такий поділ довелося не до душі і Я зробив для локального користування невелике розширення для браузера, яке виводить пости Geektimes на Хабре в одній стрічці.

Вчора ж, сталося ще одне поділ, у Хабра з'являється «кузен гуманітарій» — Мегамозок. Додати стрічку в загальну стрічку на Хабре Мені не склало праці. Побачивши настрій користувачів від усіх цих розділень, Я вирішив викласти це розширення в загальний доступ, можливо Вам теж так буде зручніше читати Хабр (по-старому).


Розширення працює тільки на вкладках:

Для зареєстрованих «все підряд» — http://habrahabr.ua/feed/all/
Для незареєстрованих «краще за добу» — http://habrahabr.ua/posts/top/daily/

Робота досить проста, при заході, робиться додатково два GET запиту на geektimes і megamozg, виходять пости і вставляються між існуючими на Хабре, відсортовані за часом.

Синхронізація з geektimes досить гарно все показується, а з megamozg поки є проблеми, із-за того, що там досить мало постів в день, думаю скоро все зміниться.

Додати в браузер:



Кому цікавий исходник, ось:

var habr = {

init: function() {

var last = document.createElement('div'),
published = document.createElement('div');
last.setAttribute('id', 'last_id');
last.setAttribute('class', 'post shortcuts_item');
last.setAttribute('style', 'display:none;');
published.setAttribute('class', 'published');
published.innerText = '20 січня 2015 в 00:01';
last.appendChild(published);
document.getElementsByClassName('posts')[0].appendChild(last);

habr.feed('geektimes.ru');

},

feed: function(host) {

var href = location.href;
href = href.replace('habrahabr.ru/posts/top/daily/',host + '/interesting/');
href = href.replace('habrahabr.ru/feed',host);

var xhr = new XMLHttpRequest();
xhr.open("GET", href, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {

var html = document.createElement('div');
html.innerHTML = xhr.responseText;
var posts = html.getElementsByClassName('post');

for (var i = 0; i < posts.length; i++) {

var post = document.createElement('div');
post.innerHTML = posts[i].innerHTML;

var date = post.getElementsByClassName('published')[0].innerText;

var postDate = habr.getDate(date);

post.getElementsByClassName('title')[0].setAttribute('style','padding-right:71px;');
post.getElementsByClassName('favorite')[0].parentNode.removeChild(post.getElementsByClassName('favorite')[0]);
post.getElementsByClassName('plus')[0].parentNode.removeChild(post.getElementsByClassName('plus')[0]);
post.getElementsByClassName('minus')[0].parentNode.removeChild(post.getElementsByClassName('minus')[0]);

habr.addChild(post.innerHTML, postDate, host, posts[i].id);

if (i == posts.length-1 && host == 'geektimes.ru') {
habr.feed('megamozg.ru');
}

}

}
};
xhr.send(null);

},

addChild: function(data, time, host id) {

var posts = document.getElementsByClassName('post');

for (var i = 0; i < posts.length; i++) {

var date = posts[i].getElementsByClassName('published')[0].innerText;

var postDate = habr.getDate(date);

var postAdd = document.createElement('div');
postAdd.setAttribute('class', 'post shortcuts_item');
postAdd.setAttribute('id', id);
postAdd.setAttribute('style', 'background:url("http://' + host + '/images/logo.svg") top right no-repeat; background-size: 71px;');
postAdd.innerHTML = data;

if (time >= postDate) {
document.getElementsByClassName('posts')[0].insertBefore(postAdd, document.getElementById(posts[i].id));
break;
}

}

},

getDate: function(data) {

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();


PS: Автор extensionsapp не полягає в Клубі Веселих і Кмітливих, тому, хто щедрий на інвайт, завжди радий буде його отримати і за одне розповісти про один досить цікавий розширення.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.