extensionsapp / habrahabr-userscript

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