// ==UserScript==
// @name Хабраторт
// @id habratort
// @description Возврат старого дизайна Хабрахабра
// @author Vladimir Atamanenko
// @version 3.0
// @include http*://habr.com/*
// @match *://habr.com/*
// @namespace https://greasyfork.org/users/216669
// @downloadURL https://update.greasyfork.icu/scripts/372721/%D0%A5%D0%B0%D0%B1%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%82.user.js
// @updateURL https://update.greasyfork.icu/scripts/372721/%D0%A5%D0%B0%D0%B1%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%82.meta.js
// ==/UserScript==
/* Определяем данные пользователя */
function defineUser() {
let user = {
status: "guest", // guest, readonly, user
csrf: "",
tracker_notifies: "",
dialogs_notifies: "",
name: "",
votes: "",
avatar: "",
ppa: ""
};
if (document.querySelector('.user-info__nickname') !== null && document.querySelector('.btn_navbar_user-dropdown img') !== null) {
user.name = document.querySelector('.user-info__nickname').innerHTML;
user.avatar = document.querySelector('.btn_navbar_user-dropdown img').src;
if (document.querySelector('.btn_navbar_tracker .badge_count_navbar') !== null) {
user.tracker_notifies = document.querySelector('.btn_navbar_tracker .badge_count_navbar').innerHTML;
if (user.tracker_notifies != "") {
user.tracker_notifies = '+' + user.tracker_notifies;
}
}
if (document.querySelector('.btn_navbar_user-dropdown .badge_count_navbar') !== null) {
user.dialogs_notifies = document.querySelector('.btn_navbar_user-dropdown .badge_count_navbar').innerHTML;
if (user.dialogs_notifies != "") {
user.dialogs_notifies = '+' + user.dialogs_notifies;
}
}
let logout_raw = document.querySelector("a[href^='https://habr.com/logout/']").href.split("/");
logout_raw.splice(-1);
user.csrf = logout_raw.slice(-1)[0];
if (document.querySelector('.btn_navbar_write-topic').href.indexOf('sandbox') >= 0) {
user.status = 'readonly';
} else {
user.status = 'user';
user.votes = document.querySelector('.dropdown__user-stats').innerHTML;
user.votes = user.votes.replace(/карму и публикации/g, 'карму/топики');
user.votes = user.votes.replace(/, и еще/g, ' и');
user.votes = '' + user.votes + '';
if (document.querySelector('.ppa-balance') !== null) {
user.ppa = document.querySelector('.ppa-balance').innerHTML;
}
}
}
return user;
}
function buildHeader(user) {
document.querySelector('.layout__row_services').style.display = 'none';
document.querySelector('.main-navbar').innerHTML = document.querySelector('.main-navbar__section_left').innerHTML;
document.querySelector('.main-navbar').parentNode.innerHTML += `
`;
document.querySelector('.btn_search-close').remove();
document.querySelector('.search-form').className = '';
document.querySelector('.search-form__field-wrapper').className = '';
document.querySelector('#search-form-field').parentNode.innerHTML +=
'';
document.querySelector('#search-form').innerHTML = document.querySelector('#search-form label').innerHTML;
document.querySelector('.nav-links').remove();
document.querySelector('.logo-wrapper').className = 'userpanel';
document.querySelector('.userpanel').outerHTML += '';
if (user.status === 'guest') {
document.querySelector('.userpanel').innerHTML = 'войти зарегистрироваться';
} else {
let ppa_link = "";
if (user.ppa !== '') {
ppa_link = 'ппа'+user.ppa+'';
}
document.querySelector('.userpanel').innerHTML =
''+user.name+'' +
'настройки' +
ppa_link +
'выход
' +
'трекер'+user.tracker_notifies+'' +
'диалоги'+user.dialogs_notifies+'' +
'избранное
' +
user.votes;
}
let flows_dropdown = document.querySelector('.page-header');
if (typeof flows_dropdown !== "undefined" && flows_dropdown !== null) {
if (flows_dropdown.innerHTML.indexOf('btn_flow-toggle') >= 0) {
flows_dropdown.remove();
}
}
}
function addStyles() {
//https://stackoverflow.com/questions/5113105/manipulating-innerhtml-removes-the-event-handler-of-a-child-element
document.body.insertAdjacentHTML('beforeend', ``);
}
function updateTabsMenu() {
let tabs_menu = document.querySelector('.tabs-menu');
if (tabs_menu !== null) {
tabs_menu.innerHTML = tabs_menu.innerHTML.replace(/Все подряд/g,'Тематические');
}
let active_item = document.querySelector('.tabs-menu__item-text_active');
if (active_item !== null) {
active_item.parentNode.classList.add('active');
}
let toggle_menu = document.querySelector('.toggle-menu');
if (toggle_menu !== null) {
let toggle_menu_items = toggle_menu.getElementsByClassName('toggle-menu__item');
let html = toggle_menu.innerHTML;
html = html.replace(/Сутки/g, 'За сутки');
html = html.replace(/Неделя/g, 'За неделю');
html = html.replace(/Месяц/g, 'За месяц');
html = html.replace(/Год/g, 'За год');
toggle_menu.innerHTML = html;
if (html.indexOf('За сутки') >= 0) {
toggle_menu_items[toggle_menu_items.length-1].outerHTML += `
`;
}
if (html.indexOf('Без порога') >= 0) {
toggle_menu_items[toggle_menu_items.length-1].outerHTML += `
`;
}
}
let tabsMenuItems = document.querySelectorAll('.tabs-menu__item');
if (tabsMenuItems !== null && tabsMenuItems.length > 0) {
if (tabsMenuItems[0].innerHTML.indexOf('Лучшие') >= 0) {
tabsMenuItems[0].classList.add('narrow');
}
if (tabsMenuItems[tabsMenuItems.length - 1].classList.contains('active')) {
let tabs_level_bottom = document.querySelector('.tabs__level_bottom');
if (tabs_level_bottom !== null) {
tabs_level_bottom.classList.add('right');
}
}
}
}
function moveSimilarPosts() {
let defaultBlocksHeaders = document.querySelectorAll('.default-block__header');
if (defaultBlocksHeaders !== null) {
for (let defaultBlockHeader of defaultBlocksHeaders) {
if (defaultBlockHeader.innerHTML.indexOf('Похожие') >= 0) {
defaultBlockHeader.parentNode.classList.add('similar-posts');
let newBlock = defaultBlockHeader.parentNode.outerHTML;
defaultBlockHeader.parentNode.remove();
let sidebarSticky = document.querySelector('.sidebar_content-area .js-ad_sticky');
sidebarSticky.innerHTML += newBlock;
sidebarSticky.outerHTML = sidebarSticky.innerHTML;
}
}
}
}
function detectActiveMenuItem() {
let active_item = 'посты'; // посты, пользователи, хабы, компании
if (window.location.href.indexOf('users') >= 0 ||
window.location.href.indexOf('auth') >= 0 ||
window.location.href.indexOf('tracker') >= 0 ||
window.location.href.indexOf('conversations') >= 0) {
active_item = 'пользователи';
} else if (window.location.href.indexOf('hubs') >= 0) {
active_item = 'хабы';
} else if (window.location.href.indexOf('companies') >= 0) {
active_item = 'компании';
}
return active_item;
}
function updateActiveMenuItem(active_item) {
let menu_items = document.querySelectorAll('.main_menu a');
for (let item of menu_items) {
if (item.innerHTML == active_item) {
item.className = "active";
} else {
item.className = "";
}
}
}
function updatePageHeader(user) {
let page_header = document.querySelector('.page-header');
if (page_header !== null) {
if (page_header.innerHTML.indexOf('Диалоги') >= 0) {
document.querySelector("a[href^='/conversations/']").classList.add('active');
}
if (page_header.innerHTML.indexOf('Трекер') >= 0) {
document.querySelector("a[href^='/tracker/']").classList.add('active');
}
if (!page_header.classList.contains('page-header_full') && document.querySelector('.media-obj_conversation-header') === null) {
page_header.remove();
}
}
if (document.location.href.indexOf('users/'+user.name) >= 0) {
document.querySelector("a[href^='/users/"+user.name+"']").classList.add('active');
}
if (document.location.href.indexOf('users/'+user.name+'/favorites') >= 0) {
document.querySelector("a[href^='/users/"+user.name+"/favorites']").classList.add('active');
}
if (document.location.href.indexOf('ppa') >= 0) {
document.querySelector("a[href^='/ppa']").classList.add('active');
}
if (document.location.href.indexOf('auth/settings/profile') >= 0) {
document.querySelector("a[href^='/auth/settings/profile/']").classList.add('active');
}
}
function orthodoxatePublications() {
let blocks = document.querySelectorAll('.toggle-menu, .similar-posts .default-block__header-title');
if (blocks !== null && blocks.length > 0) {
for (let block of blocks) {
block.innerHTML = block.innerHTML.replace(/публикации/g, 'посты');
}
}
document.querySelector('title').innerHTML = document.querySelector('title').innerHTML.replace(/публикации/g, 'посты');
document.querySelector('title').innerHTML = document.querySelector('title').innerHTML.replace(/Публикации/g, 'Посты');
}
function getMegaPosts() {
if (document.querySelector('.bmenu_inner') !== null) {
let megaPostsLoaded = (document.querySelectorAll('.bmenu_inner .slink a') !== null && document.querySelectorAll('.bmenu_inner .slink a').length > 0);
if (megaPostsLoaded) {
document.querySelector('#search-form').outerHTML = ''+document.querySelector('#search-form').outerHTML+''+document.querySelector('.bmenu_inner').innerHTML+'
';
} else {
setTimeout(getMegaPosts, 500);
}
}
}
function marksToFlags() {
let allPostMarks = document.querySelectorAll('.post__marks');
if (allPostMarks !== null && allPostMarks.length > 0) {
for (let postMarks of allPostMarks) {
let spans = postMarks.querySelectorAll('span');
let anchors = postMarks.querySelectorAll('a');
if (anchors.length > 0) {
if (spans.length > 0) {
spans.concat(anchors);
}
else {
spans = anchors;
}
}
let correctHTML = '';
for (let span of spans) {
let type = '';
switch (span.innerHTML) {
case 'Новость':
type = 'flag_solution';
break;
case 'Перевод':
type = 'flag_translation';
break;
case 'Из песочницы':
type = 'flag_sandbox';
break;
case 'Tutorial':
type = 'flag_tutorial';
break;
default:
type = 'flag_solution';
break;
}
span.className = '';
span.classList.add('flag');
span.classList.add(type);
correctHTML += span.outerHTML;
}
let title = postMarks.parentNode.querySelector('.post__title');
if (title !== null) {
title.innerHTML += correctHTML;
postMarks.remove();
} else {
console.log('Не получилось состарить флаги :(');
}
}
}
}
function replaceDefaultAvatars() {
let avatars = document.querySelectorAll('.user-info .default-image_mini, .default-image_medium, .user-popover__image .default-image');
if (avatars !== null && avatars.length > 0) {
for (let avatar of avatars) {
if (avatar.querySelector('svg') !== null) {
avatar = avatar.querySelector('svg');
}
avatar.innerHTML = '';
}
}
}
function replaceBadges() {
let badges = document.querySelectorAll('.profile-section__user-badge, .h-info-badge');
if (badges !== null && badges.length > 0) {
for (let badge of badges) {
let type = '';
switch (badge.innerHTML) {
case 'Старожил':
type = 'oldresident';
break;
case 'Захабренный':
type = 'habred';
break;
case 'Отхабренный':
type = 'unhabred';
break;
case 'Автор':
type = 'author';
break;
case 'Звезда':
type = 'star';
break;
case 'Легенда':
type = 'legend';
break;
case 'Комментатор':
type = 'commentator';
break;
case 'Переводчик':
type = 'translator';
break;
case 'Тролль':
type = 'troll';
break;
case 'Бета-тестер':
type = 'betatester';
break;
default:
console.log('Неизвестный значок: ' + badge.innerHTML)
type = 'unknown';
break;
}
if (type !== "unknown") {
badge.className = '';
badge.classList.add('old-tag');
badge.classList.add(type);
badge.innerHTML = '';
}
}
}
}
function insertNewPostButton(user) {
let tabs = document.querySelector('.content_left .tabs');
if (tabs !== null && user.status !== 'guest') {
tabs.insertAdjacentHTML('beforeend',
'' +
'
' +
''
);
}
}
let user = defineUser();
buildHeader(user);
updateTabsMenu();
moveSimilarPosts();
let active_item = detectActiveMenuItem();
updateActiveMenuItem(active_item);
if (active_item == 'посты') {
insertNewPostButton(user);
}
updatePageHeader(user);
addStyles();
orthodoxatePublications();
marksToFlags();
replaceDefaultAvatars();
replaceBadges();
getMegaPosts();