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

в 19:12, , рубрики: javascript, Мегамозг, объединение, хабрахабр

«Дуров, верни стену» или «Хабрахабр + Geektimes + Мегамозг» в одной ленте - 1

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

Вчера же, случилось еще одно разделение, у Хабра появляется «кузен гуманитарий» — Мегамозг. Добавить его ленту в общую ленту на Хабре Мне не составило труда. Увидев настроение пользователей от всех этих разделений, Я решил выложить это расширение в общий доступ, возможно Вам тоже будет удобней так читать Хабр (по старинке).


Расширение работает только на вкладках:

Для зарегистрированных «все подряд» — http://habrahabr.ru/feed/all/
Для незарегистрированных «лучшее за сутки» — http://habrahabr.ru/posts/top/daily/

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

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

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

«Дуров, верни стену» или «Хабрахабр + Geektimes + Мегамозг» в одной ленте - 2 «Дуров, верни стену» или «Хабрахабр + Geektimes + Мегамозг» в одной ленте - 3

Кому интересен исходник, вот:

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") right top 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(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();

PS: Автор extensionsapp не состоит в Клубе Веселых и Находчивых, потому, кто щедр на инвайты, всегда рад будет его получить и за одно рассказать об одном довольно интересном расширении.

Автор: botaniQQQ

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js