Adds PDF, DOC, and PPT tabs to Google search results
目前為
// ==UserScript==
// @name Add Pdf, Doc, Ppt Tabs
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Adds PDF, DOC, and PPT tabs to Google search results
// @author Bui
// @match *://www.google.com/search*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const fileTabs = [
{ label: 'Pdf', query: 'filetype:pdf' },
{ label: 'Doc', query: '(filetype:doc OR filetype:docx)' },
{ label: 'Ppt', query: '(filetype:ppt OR filetype:pptx)' },
];
function addFileTabs() {
const tabItems = [...document.querySelectorAll('div[role="listitem"]')];
if (tabItems.length === 0) return;
const tabContainer = tabItems[0].parentElement;
const currentQuery = new URLSearchParams(window.location.search).get('q') || '';
if (!currentQuery || currentQuery.toLowerCase().includes('filetype:')) return;
const existingLabels = new Set(tabItems.map(t => t.textContent.trim()));
const baseTab = tabItems[0];
fileTabs.forEach(({ label, query: extra }) => {
if (existingLabels.has(label)) return;
const url = `/search?q=${encodeURIComponent(`${currentQuery} ${extra}`)}`;
const newItem = document.createElement('div');
newItem.setAttribute('role', 'listitem');
newItem.className = baseTab.className;
const a = document.createElement('a');
const baseAnchor = baseTab.querySelector('a');
a.className = baseAnchor?.className || '';
a.setAttribute('href', url);
a.setAttribute('role', 'link');
const contentDiv = document.createElement('div');
const baseContent = baseTab.querySelector('div');
contentDiv.className = baseContent?.className || '';
contentDiv.textContent = label;
a.appendChild(contentDiv);
newItem.appendChild(a);
tabContainer.appendChild(newItem);
});
}
addFileTabs();
new MutationObserver(addFileTabs).observe(document.body, { childList: true, subtree: true });
})();