pixiv Tabs Restorer

Adds “All”, “Follow”, “My pixiv”, and “Tag Index” tabs to user pages etc. and “Illustrations”, “Manga”, and “Ugoira” tabs to search result pages.

当前为 2019-02-19 提交的版本,查看 最新版本

// ==UserScript==
// @name        pixiv Tabs Restorer
// @name:ja     pixiv タブを復活
// @description Adds “All”, “Follow”, “My pixiv”, and “Tag Index” tabs to user pages etc. and “Illustrations”, “Manga”, and “Ugoira” tabs to search result pages.
// @description:ja ユーザーページなどに「すべて」「フォロー」「マイピク」「タグ一覧」タブを、検索結果に「イラスト」「マンガ」「うごイラ」タブを補完します。
// @namespace   https://gf.qytechs.cn/users/137
// @version     1.1.1
// @match       https://www.pixiv.net/*
// @exclude     https://www.pixiv.net/member_illust.php?*mode=manga*
// @exclude     https://www.pixiv.net/apps.php*
// @require     https://gf.qytechs.cn/scripts/19616/code/utilities.js?version=230651
// @require     https://gf.qytechs.cn/scripts/17896/code/start-script.js?version=112958
// @license     MPL-2.0
// @compatible  Edge 最新安定版 / Latest stable (非推奨 / Deprecated)
// @compatible  Firefox
// @compatible  Opera
// @compatible  Chrome
// @grant       dummy
// @noframes
// @run-at      document-start
// @icon        data:image/vnd.microsoft.icon;base64,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
// @author      100の人
// @homepageURL https://gf.qytechs.cn/users/137
// ==/UserScript==

(function () {
'use strict';

// L10N
Gettext.setLocalizedTexts({
	/*eslint-disable quote-props, max-len */
	'en': {
		'すべて': 'All',
		'フォロー': 'Follow',
		'マイピク': 'My pixiv',
		'タグ一覧': 'Tag Index',
		'イラスト': 'Illustrations',
		'マンガ': 'Manga',
		'うごイラ': 'Ugoira',
	},
	'ko': {
		'すべて': '전체',
		'フォロー': '팔로우',
		'マイピク': '마이픽',
		'タグ一覧': '태그 목록',
		'イラスト': '일러스트',
		'マンガ': '만화',
		'うごイラ': '움직이는 일러스트',
	},
	'zh': {
		'すべて': '全部',
		'フォロー': '关注',
		'マイピク': '好P友',
		'タグ一覧': '标签一览',
		'イラスト': '插画',
		'マンガ': '漫画',
		'うごイラ': '动图',
	},
	'zh-tw': {
		'すべて': '全部',
		'フォロー': '關注',
		'マイピク': '好P友',
		'タグ一覧': '標籤一覽',
		'イラスト': '插畫',
		'マンガ': '漫畫',
		'うごイラ': '動圖',
	},
	/*eslint-enable quote-props, max-len */
});

class UserPageTabCompleter
{
	/**
	 * @access private
	 * @constant {number}
	 */
	static get URLS_AND_LABLES() {return [
		{ path: '/member_illust.php', label: _('すべて'), afterUserPageTab: true },
		{ path: '/bookmark.php', type: 'user', label: _('フォロー') },
		{ path: '/mypixiv_all.php', label: _('マイピク') },
		{ path: '/member_tag_all.php', label: _('タグ一覧') },
	];}

	constructor()
	{
		const root = document.getElementById('root');
		if (!root) {
			return;
		}

		Gettext.setLocale(document.documentElement.lang);

		// カレントタブのスタイル切り替え
		addEventListener('click', event => {
			if (!event.defaultPrevented || !event.target.matches('#root > :not(header) nav > a')) {
				return;
			}

			for (const tab of event.target.parentElement.querySelectorAll('[aria-current]')) {
				if (tab.href !== location.href) {
					tab.removeAttribute('aria-current');
					tab.classList.remove(...this.currentTabClasses);
				}
			}

			if (!event.target.hasAttribute('aria-current')) {
				event.target.setAttribute('aria-current', 'page');
				event.target.classList.add(...this.currentTabClasses);
			}
		});

		new MutationObserver(mutations => {
			for (const mutation of mutations) {
				let findChild;
				if (mutation.target.matches('#root > div[class] > div[class]')) {
					findChild = node => node.localName === 'div' && node.hasAttribute('class');
				} else if (mutation.target.matches('#root > div[class] > div[class] > div[class]')) {
					//
					findChild = node => node.localName === 'nav';
				}
				if (!findChild) {
					continue;
				}

				const parent = Array.from(mutation.addedNodes).find(findChild);
				if (parent) {
					if (parent.querySelector('[href*="/mypixiv_all.php?"]')) {
						return;
					}
					this.complete();
					return;
				}
			}
		}).observe(root, {childList: true, subtree: true});
	}

	/**
	 *
	 * @access private
	 */
	async complete()
	{
		const list = document.querySelector('#root > :not(header) nav');
		if (!this.currentTabClasses) {
			const currentTab = list.querySelector('[aria-current="page"]');
			const noCurrentTabClassList = Array.from(Array.from(list.children).find(tab => tab !== currentTab).classList);
			this.currentTabClasses = Array.from(currentTab.classList).filter(token => !noCurrentTabClassList.includes(token));
		}

		const userPageTab = list.firstElementChild;

		const templateTab = userPageTab.cloneNode(true);
		templateTab.removeAttribute('aria-current');
		templateTab.classList.remove(...this.currentTabClasses);
		const param = new URLSearchParams(userPageTab.search);

		for (const {path, type, label, afterUserPageTab} of UserPageTabCompleter.URLS_AND_LABLES) {
			let tab;
			if (path === '/member_illust.php') {
				tab = document.querySelector('[href^="/member_illust.php?id="]:not([href*="type="])');
				if (tab) {
					tab.classList = templateTab.classList;
				}
			}

			if (!tab) {
				tab = templateTab.cloneNode(true);
			}

			tab.pathname = path;
			if (type) {
				param.set('type', type);
				tab.search = param;
			}
			tab.text = label;
			if (afterUserPageTab) {
				userPageTab.after(tab);
			} else {
				list.append(tab);
			}
		}

		if (userPageTab.hasAttribute('aria-current') && location.pathname === '/member_illust.php') {
			userPageTab.replaceWith(templateTab);
			const illustAndMangaTab = list.querySelector('[href*="/member_illust.php"]:not([href*="type="])');
			illustAndMangaTab.setAttribute('aria-current', 'page');
			illustAndMangaTab.classList.add(...this.currentTabClasses);
		}
	}
}

if (['/search.php', '/novel/search.php', '/search_user.php'].includes(location.pathname)) {
	startScript(
		function () {
			Gettext.setLocale(document.documentElement.lang);

			const typesAndLabels = [
				{ type: 'illust', label: _('イラスト') },
				{ type: 'manga' , label: _('マンガ') },
				{ type: 'ugoira', label: _('うごイラ') },
			];

			const list = document.getElementsByClassName('tabs')[0];
			const allTab = list.firstElementChild;
			const afterTab = allTab.nextElementSibling;

			const allTabAnchor = allTab.getElementsByTagName('a')[0];
			const query = new URLSearchParams(allTabAnchor.search);
			query.delete('p');

			const currentType = new URLSearchParams(location.search).get('type');

			for (const {type, label} of typesAndLabels) {
				const tab = allTab.cloneNode(true);
				const anchor = tab.getElementsByTagName('a')[0];
				query.set('type', type);
				anchor.search = query;
				anchor.text = label;
				anchor.classList[currentType === type ? 'add' : 'remove']('current');
				afterTab.before(tab);
			}

			allTabAnchor.text = _('すべて');
			if (list.getElementsByClassName('current').length > 1) {
				allTabAnchor.classList.remove('current');
			}
		},
		parent => parent.classList.contains('tabs'),
		target => target.previousElementChild,
		() => document.querySelector('.tabs > li:nth-of-type(2)')
	);
} else {
	document.addEventListener('DOMContentLoaded', function () {
		new UserPageTabCompleter();
	}, { passive: true, once: true });
}

})();
	

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址