| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- (function () {
- var LOGO_URL = '/fb-logo.png?v=20260306w';
- var HOME_SEARCH_CACHE_KEY = 'fb.home.search.q';
- function setFavicons() {
- var rels = ['icon', 'shortcut icon', 'apple-touch-icon'];
- rels.forEach(function (rel) {
- var link = document.querySelector('link[rel="' + rel + '"]');
- if (!link) {
- link = document.createElement('link');
- link.setAttribute('rel', rel);
- document.head.appendChild(link);
- }
- link.setAttribute('href', LOGO_URL);
- link.setAttribute('type', 'image/png');
- });
- var msTile = document.querySelector('meta[name="msapplication-TileImage"]');
- if (msTile) msTile.setAttribute('content', LOGO_URL);
- }
- function ensureStaticStyles() {
- if (document.getElementById('fb-brand-style')) return;
- var style = document.createElement('style');
- style.id = 'fb-brand-style';
- style.textContent = [
- '.credits { display: none !important; }',
- '[class*="credits"] { display: none !important; }',
- '#fb-header-brand {',
- ' display: inline-flex;',
- ' align-items: center;',
- ' margin-right: 10px;',
- ' line-height: 1;',
- ' pointer-events: none;',
- ' user-select: none;',
- '}',
- '#fb-header-brand img { width: 26px; height: 26px; object-fit: contain; display:block; }',
- '#fb-top-corner-brand {',
- ' position: fixed;',
- ' top: 10px;',
- ' left: 12px;',
- ' z-index: 2147483000;',
- ' display: inline-flex;',
- ' align-items: center;',
- ' justify-content: center;',
- ' width: 40px;',
- ' height: 40px;',
- ' border-radius: 10px;',
- ' background: rgba(41,44,60,.75);',
- ' border: 1px solid rgba(198,208,245,.25);',
- ' backdrop-filter: blur(8px);',
- ' pointer-events: none;',
- ' user-select: none;',
- '}',
- '#fb-top-corner-brand img { width: 22px; height: 22px; object-fit: contain; display:block; }',
- 'body#login-page #fb-top-corner-brand, #login #fb-top-corner-brand { display: none !important; }',
- 'body#login-page #fb-header-brand, #login #fb-header-brand { display: none !important; }',
- '@media (max-width: 736px) { #fb-top-corner-brand { top: 8px; left: 8px; width: 34px; height: 34px; } }'
- ].join('\n');
- document.head.appendChild(style);
- }
- function tuneLoginBrand() {
- var login = document.getElementById('login');
- if (!login) return;
- var form = login.querySelector('form');
- if (!form) return;
- var imgs = form.querySelectorAll('img');
- if (imgs.length > 0) {
- imgs.forEach(function (img, idx) {
- if (idx === 0) {
- if (img.dataset.fbLogoReady !== '1') {
- img.src = LOGO_URL;
- img.srcset = '';
- img.style.width = '92px';
- img.style.height = '92px';
- img.style.objectFit = 'contain';
- img.style.display = 'block';
- img.style.margin = '0 auto 8px';
- img.dataset.fbLogoReady = '1';
- }
- } else {
- img.remove();
- }
- });
- }
- var title = form.querySelector('h1');
- if (title && title.textContent !== '繁星文档') {
- title.textContent = '繁星文档';
- title.style.marginTop = '6px';
- }
- }
- function suppressNativeHeaderBrand() {
- if (location.pathname.indexOf('/login') === 0 || document.getElementById('login')) return;
- var header = document.querySelector('header');
- if (!header) return;
- var walker = document.createTreeWalker(header, NodeFilter.SHOW_TEXT, null);
- var node;
- while ((node = walker.nextNode())) {
- var txt = (node.nodeValue || '').trim();
- if (txt === 'File Browser' || txt === '文件浏览器') {
- node.nodeValue = '';
- }
- }
- var nativeImgs = header.querySelectorAll('img:not(#fb-header-brand img)');
- nativeImgs.forEach(function (img) {
- if (img.closest && img.closest('#fb-header-brand')) return;
- img.style.display = 'none';
- });
- }
- function ensureHeaderBrand() {
- var onLogin = location.pathname.indexOf('/login') === 0 || !!document.getElementById('login');
- var old = document.getElementById('fb-header-brand');
- if (onLogin) {
- if (old) old.remove();
- return false;
- }
- var header = document.querySelector('header');
- if (!header) return false;
- var brand = old;
- if (!brand) {
- brand = document.createElement('div');
- brand.id = 'fb-header-brand';
- brand.setAttribute('aria-hidden', 'true');
- brand.innerHTML = '<img src="' + LOGO_URL + '" alt="logo" />';
- header.insertBefore(brand, header.firstChild);
- } else {
- var img = brand.querySelector('img');
- if (img) img.src = LOGO_URL;
- if (brand.parentElement !== header) {
- header.insertBefore(brand, header.firstChild);
- }
- }
- return true;
- }
- function ensureTopCornerFallback(useHeader) {
- var onLogin = location.pathname.indexOf('/login') === 0 || !!document.getElementById('login');
- var el = document.getElementById('fb-top-corner-brand');
- if (onLogin || useHeader) {
- if (el) el.remove();
- return;
- }
- if (!el) {
- el = document.createElement('div');
- el.id = 'fb-top-corner-brand';
- el.setAttribute('aria-hidden', 'true');
- el.innerHTML = '<img src="' + LOGO_URL + '" alt="logo" />';
- document.body.appendChild(el);
- } else {
- var img = el.querySelector('img');
- if (img) img.src = LOGO_URL;
- }
- }
- function renameSidebarRoot() {
- var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
- var node;
- while ((node = walker.nextNode())) {
- var txt = (node.nodeValue || '').trim();
- if (txt === '我的文件' || txt === 'My Files') {
- node.nodeValue = node.nodeValue.replace(txt, '繁星文档');
- }
- }
- }
- function removeLegacyInlineSearch() {
- var legacy = document.getElementById('fb-inline-search');
- if (legacy) legacy.remove();
- var legacyStyle = document.getElementById('fb-inline-search-style');
- if (legacyStyle) legacyStyle.remove();
- var search = document.getElementById('search');
- if (search && search.style && search.style.display === 'none') search.style.display = '';
- }
- function isSearchInput(el) {
- if (!el || el.tagName !== 'INPUT') return false;
- var t = (el.getAttribute('type') || '').toLowerCase();
- var p = (el.getAttribute('placeholder') || '').toLowerCase();
- if (t === 'search') return true;
- if (p.indexOf('search') >= 0 || p.indexOf('搜索') >= 0) return true;
- if ((el.className || '').toString().toLowerCase().indexOf('search') >= 0) return true;
- return false;
- }
- function readCachedHomeSearch() {
- try {
- return (sessionStorage.getItem(HOME_SEARCH_CACHE_KEY) || '').trim();
- } catch (e) {
- return '';
- }
- }
- function writeCachedHomeSearch(q) {
- try {
- sessionStorage.setItem(HOME_SEARCH_CACHE_KEY, (q || '').trim());
- } catch (e) {}
- }
- function goSearch(q) {
- if (location.pathname === '/search') return;
- var qs = (q || '').trim();
- if (!qs) qs = readCachedHomeSearch();
- location.assign('/search' + (qs ? ('?q=' + encodeURIComponent(qs)) : ''));
- }
- function installSearchRedirectGuards() {
- if (window.__fbSearchRedirectGuardInstalled) return;
- window.__fbSearchRedirectGuardInstalled = true;
- // Keep home search input value cached for /search fallback.
- document.addEventListener('input', function (e) {
- if (location.pathname.indexOf('/login') === 0) return;
- var homeInput = e.target && e.target.closest && e.target.closest('#search input, #search #input input');
- if (!homeInput) return;
- writeCachedHomeSearch(e.target.value || '');
- }, true);
- document.addEventListener('click', function (e) {
- if (location.pathname.indexOf('/login') === 0) return;
- var inSearch = e.target && e.target.closest && e.target.closest('#search');
- if (!inSearch) return;
- var onInput = e.target && e.target.closest && e.target.closest('#search input, #search #input input');
- if (onInput) return; // keep typing, no redirect on click.
- // Intercept magnifier / action click to prevent built-in index popup.
- var icon = e.target && e.target.closest && e.target.closest('.search-button,header .search-button,#search #input > i,#search .search-button,#search .action,#search [title*="search" i],#search [aria-label*="search" i],#search [title*="搜索" i],#search [aria-label*="搜索" i],#search i');
- if (!icon) return;
- e.preventDefault();
- e.stopPropagation();
- if (e.stopImmediatePropagation) e.stopImmediatePropagation();
- }, true);
- document.addEventListener('keydown', function (e) {
- if (location.pathname.indexOf('/login') === 0) return;
- if (location.pathname === '/search') return;
- var homeInput = e.target && e.target.closest && e.target.closest('#search input, #search #input input');
- if (!homeInput) return;
- if (e.key !== 'Enter') return;
- var q = (e.target.value || '').trim();
- writeCachedHomeSearch(q);
- e.preventDefault();
- e.stopPropagation();
- if (e.stopImmediatePropagation) e.stopImmediatePropagation();
- goSearch(q);
- }, true);
- }
- function apply() {
- setFavicons();
- ensureStaticStyles();
- tuneLoginBrand();
- suppressNativeHeaderBrand();
- var ok = ensureHeaderBrand();
- ensureTopCornerFallback(ok);
- renameSidebarRoot();
- removeLegacyInlineSearch();
- installSearchRedirectGuards();
- }
- var timer = null;
- var ob = new MutationObserver(function () {
- if (timer) clearTimeout(timer);
- timer = setTimeout(apply, 20);
- });
- ob.observe(document.documentElement, { childList: true, subtree: true });
- apply();
- if (window.requestAnimationFrame) requestAnimationFrame(apply);
- setTimeout(apply, 30);
- })();
|