FCX

Mejora la navegación en ForoCoches.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         FCX
// @namespace    https://github.com/mdmrk/fcx
// @version      0.1.0
// @description  Mejora la navegación en ForoCoches.
// @license      GNU General Public License v3.0
// @author       mdmrk
// @match        https://forocoches.com/*
// @icon         data:image/png;base64,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
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @run-at       document-end
// @noframes
// ==/UserScript==

// src/style.css
var style_default = ".infinite-scroll-separator{justify-content:center;align-items:center;margin:20px 0;display:flex;position:relative}.infinite-scroll-separator-line{background-color:var(--border-color,#e5e7eb);z-index:1;height:1px;position:absolute;left:0;right:0}.infinite-scroll-separator-text{background-color:var(--bg-color,#fff);color:var(--text-secondary,#6b7280);z-index:2;border:1px solid var(--border-color,#e5e7eb);border-radius:9999px;padding:0 16px;font-size:.875rem;font-weight:500}#fcx-config-backdrop{z-index:9998;background:#00000080;width:100%;height:100%;position:fixed;top:0;left:0}#fcx-config-panel{color:#ccc;z-index:9999;opacity:0;background:#1e1e1e;border:1px solid #444;border-radius:4px;flex-direction:column;width:900px;max-width:95%;max-height:90vh;font-size:13px;display:flex;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)scale(.95);box-shadow:0 10px 25px #00000080}#fcx-config-header{color:#fff;background:linear-gradient(#2a2a2a,#1a1a1a);border-bottom:1px solid #000;padding:8px 10px;font-weight:700}#fcx-config-content{flex:1;padding:0;overflow-y:auto}#fcx-config-table{border-collapse:collapse;width:100%}#fcx-config-table th,#fcx-config-table td{text-align:left;border-bottom:1px solid #333;padding:10px}#fcx-config-table th{color:#fe5e00;z-index:10;background:#252525;font-weight:700;position:sticky;top:0}#fcx-config-table th.fcx-col-opt{width:auto}#fcx-config-table th.fcx-col-chk{text-align:center;width:80px}#fcx-config-table td.fcx-col-chk{text-align:center}.fcx-desc{color:#888;margin-top:4px;font-size:11px;display:block}.fcx-label{color:#eee;font-weight:700}.fcx-disabled{opacity:.3;pointer-events:none}#fcx-footer{text-align:right;color:#666;background:#1a1a1a;border-top:1px solid #333;padding:5px 10px;font-size:11px}#fcx-footer a{color:#888;cursor:pointer;margin-left:10px;text-decoration:none}#fcx-footer a:hover{color:#ccc}";

// src/utils/inject-console.ts
var consoleMethodsThatDontBreakWhenArgumentIsString = [
  "log",
  "error",
  "warn",
  "info",
  "debug",
  "trace"
];
function injectConsole(prefix) {
  const originalConsole = globalThis.console;
  globalThis.console = new Proxy(originalConsole, {
    get(target, prop, receiver) {
      const method = Reflect.get(target, prop, receiver);
      return consoleMethodsThatDontBreakWhenArgumentIsString.some((propName) => propName === prop) ? method.bind(target, `[${prefix}]
`) : method;
    }
  });
}

// src/config.ts
var devMode = false;
var theme = {
  enhancedCommentClass: "enhanced-comment"
};
var oldSelectors = {
  feedContainer: "#posts",
  commentItem: "table[id^='post']",
  avatar: ".avatar",
  authorName: ".bigusername",
  content: "div[id^='post_message_']",
  nextPageLink: "a[rel='next']",
  prevPageLink: "a[rel='prev']",
  activePage: "td.alt2 .mfont strong"
};
var newSelectors = {
  feedContainer: "#posts",
  commentItem: ".postbit_wrapper",
  avatar: ".thread-profile-image",
  authorName: "div[id^='postmenu_'] > a",
  content: "div[id^='post_message_']",
  nextPageLink: "a:has(span[style*='--next-right-icon'])",
  prevPageLink: "a:has(span[style*='--next-left-icon'])",
  activePage: "span[title*='Mostrando resultados'] > strong"
};

// src/utils/logger.ts
var logger = {
  log: (...args) => {
    if (devMode)
      console.log(...args);
  },
  warn: (...args) => {
    if (devMode)
      console.warn(...args);
  },
  error: (...args) => {
    if (devMode)
      console.error(...args);
  },
  info: (...args) => {
    if (devMode)
      console.info(...args);
  }
};

// src/utils/detect-interface.ts
var isNewInterface = () => {
  return !!document.getElementById("fc-desktop-version-tag-for-monitoring");
};

// src/utils/page-state.ts
var detectPageType = () => {
  const url = window.location.href;
  if (url.includes("showthread.php")) {
    return "THREAD" /* THREAD */;
  }
  if (url.includes("forumdisplay.php")) {
    return "CATEGORY" /* CATEGORY */;
  }
  if (/\/foro\/?($|\?|#)/.test(url)) {
    return "HOME" /* HOME */;
  }
  if (/^https?:\/\/[^/]+\/?(?:$|\?|#)/.test(url)) {
    return "HOME" /* HOME */;
  }
  return "UNKNOWN" /* UNKNOWN */;
};
var currentPageType = detectPageType();

// src/config-registry.ts
var CONFIG_KEYS = {
  REMOVE_SIDEBAR: "remove_sidebar",
  INFINITE_SCROLL: "infinite_scroll",
  REMOVE_BANNERS: "remove_banners"
};
var configs = [
  {
    key: CONFIG_KEYS.REMOVE_SIDEBAR,
    label: "Eliminar Barra Lateral",
    description: "Elimina la barra lateral derecha y expande el área de contenido principal.",
    defaultValue: false,
    type: "checkbox",
    scopes: ["new"]
  },
  {
    key: CONFIG_KEYS.INFINITE_SCROLL,
    label: "Scroll Infinito",
    description: "Carga automáticamente la siguiente página de hilos al llegar al final.",
    defaultValue: true,
    type: "checkbox"
  },
  {
    key: CONFIG_KEYS.REMOVE_BANNERS,
    label: "Eliminar Publicidad",
    description: "Oculta los banners de publicidad.",
    defaultValue: true,
    type: "checkbox"
  }
];

// src/utils/storage.ts
var getConfig = (key, defaultValue) => {
  if (typeof GM_getValue !== "undefined") {
    return GM_getValue(key, defaultValue);
  }
  const val = localStorage.getItem(`fcx_${key}`);
  if (val === null)
    return defaultValue;
  try {
    return JSON.parse(val);
  } catch {
    return val;
  }
};
var setConfig = (key, value) => {
  if (typeof GM_setValue !== "undefined") {
    GM_setValue(key, value);
    return;
  }
  localStorage.setItem(`fcx_${key}`, JSON.stringify(value));
};
var resetConfig = (key, defaultValue) => {
  setConfig(key, defaultValue);
};
var getScopedConfigKey = (key, scope) => {
  return `${key}_${scope}`;
};
var getEffectiveConfig = (key, scope) => {
  const general = getConfig(key, false);
  if (general === true)
    return true;
  const scopedKey = getScopedConfigKey(key, scope);
  return getConfig(scopedKey, false);
};

// src/ui/config-panel.ts
var createCheckbox = (checked, onChange) => {
  const input = document.createElement("input");
  input.type = "checkbox";
  input.checked = checked;
  input.onchange = (e) => {
    onChange(e.target.checked);
  };
  return input;
};
var renderRow = (item) => {
  const tr = document.createElement("tr");
  const tdName = document.createElement("td");
  const label = document.createElement("div");
  label.className = "fcx-label";
  label.textContent = item.label;
  const desc = document.createElement("span");
  desc.className = "fcx-desc";
  desc.textContent = item.description;
  tdName.append(label, desc);
  const tdGeneral = document.createElement("td");
  tdGeneral.className = "fcx-col-chk";
  const generalChecked = getConfig(item.key, item.defaultValue);
  const updateRowState = (isGeneralChecked) => {
    if (isGeneralChecked) {
      tdNew.classList.add("fcx-disabled");
      tdOld.classList.add("fcx-disabled");
    } else {
      tdNew.classList.remove("fcx-disabled");
      tdOld.classList.remove("fcx-disabled");
    }
  };
  const checkGeneral = createCheckbox(generalChecked, (val) => {
    setConfig(item.key, val);
    updateRowState(val);
  });
  tdGeneral.append(checkGeneral);
  const tdNew = document.createElement("td");
  tdNew.className = "fcx-col-chk";
  if (!item.scopes || item.scopes.includes("new")) {
    const keyNew = getScopedConfigKey(item.key, "new");
    const checkNew = createCheckbox(getConfig(keyNew, false), (val) => setConfig(keyNew, val));
    tdNew.append(checkNew);
  }
  const tdOld = document.createElement("td");
  tdOld.className = "fcx-col-chk";
  if (!item.scopes || item.scopes.includes("old")) {
    const keyOld = getScopedConfigKey(item.key, "old");
    const checkOld = createCheckbox(getConfig(keyOld, false), (val) => setConfig(keyOld, val));
    tdOld.append(checkOld);
  }
  updateRowState(generalChecked);
  tr.append(tdName, tdGeneral, tdNew, tdOld);
  return tr;
};
var toggleConfigPanel = () => {
  if (document.getElementById("fcx-config-panel")) {
    closePanel();
    return;
  }
  openPanel();
};
var openPanel = () => {
  const backdrop = document.createElement("div");
  backdrop.id = "fcx-config-backdrop";
  backdrop.onclick = closePanel;
  const panel = document.createElement("div");
  panel.id = "fcx-config-panel";
  const header = document.createElement("div");
  header.id = "fcx-config-header";
  header.textContent = "Configuración FCX";
  const content = document.createElement("div");
  content.id = "fcx-config-content";
  const table = document.createElement("table");
  table.id = "fcx-config-table";
  const thead = document.createElement("thead");
  const trHead = document.createElement("tr");
  const thName = document.createElement("th");
  thName.className = "fcx-col-opt";
  thName.textContent = "Opción";
  const thGen = document.createElement("th");
  thGen.className = "fcx-col-chk";
  thGen.textContent = "General";
  const thNew = document.createElement("th");
  thNew.className = "fcx-col-chk";
  thNew.textContent = "Nuevo";
  const thOld = document.createElement("th");
  thOld.className = "fcx-col-chk";
  thOld.textContent = "Antiguo";
  trHead.append(thName, thGen, thNew, thOld);
  thead.append(trHead);
  table.append(thead);
  const tbody = document.createElement("tbody");
  configs.forEach((item) => {
    if (item.type === "checkbox") {
      tbody.append(renderRow(item));
    }
  });
  table.append(tbody);
  content.append(table);
  const footer = document.createElement("div");
  footer.id = "fcx-footer";
  const closeLink = document.createElement("a");
  closeLink.textContent = "Cerrar";
  closeLink.onclick = closePanel;
  const resetLink = document.createElement("a");
  resetLink.textContent = "Restaurar todo";
  resetLink.onclick = () => {
    if (confirm("¿Restaurar toda la configuración?")) {
      configs.forEach((c) => {
        resetConfig(c.key, c.defaultValue);
        if (!c.scopes || c.scopes.includes("new")) {
          resetConfig(getScopedConfigKey(c.key, "new"), false);
        }
        if (!c.scopes || c.scopes.includes("old")) {
          resetConfig(getScopedConfigKey(c.key, "old"), false);
        }
      });
      closePanel();
      openPanel();
    }
  };
  footer.append(resetLink, document.createTextNode(" | "), closeLink);
  panel.append(header, content, footer);
  document.body.append(backdrop, panel);
  requestAnimationFrame(() => {
    backdrop.style.opacity = "1";
    panel.style.opacity = "1";
    panel.style.transform = "translate(-50%, -50%) scale(1)";
  });
};
var closePanel = () => {
  const b = document.getElementById("fcx-config-backdrop");
  const p = document.getElementById("fcx-config-panel");
  if (b && p) {
    b.style.opacity = "0";
    p.style.opacity = "0";
    setTimeout(() => {
      b.remove();
      p.remove();
    }, 200);
  }
};

// src/lib/style-comment.ts
var styleComment = (element, _selectors) => {
  if (element.dataset.processed === "true")
    return;
  element.dataset.processed = "true";
  element.classList.add(theme.enhancedCommentClass);
};

// src/lib/watch-feed.ts
var watchFeed = (selectors) => {
  if (!window.location.href.includes("showthread.php")) {
    logger.log("Watch Feed: Not a thread page.");
    return () => {};
  }
  const feed = document.querySelector(selectors.feedContainer);
  if (!feed) {
    logger.warn("Feed container not found, retrying in 1s...");
    const timer = setTimeout(() => watchFeed(selectors), 1000);
    return () => clearTimeout(timer);
  }
  logger.log("Feed found, starting watcher...");
  const existing = feed.querySelectorAll(selectors.commentItem);
  existing.forEach((el) => {
    styleComment(el, selectors);
  });
  const observer = new MutationObserver((mutations) => {
    for (const mutation of mutations) {
      for (const node of mutation.addedNodes) {
        if (node instanceof HTMLElement) {
          if (node.matches(selectors.commentItem)) {
            styleComment(node, selectors);
          } else {
            const children = node.querySelectorAll(selectors.commentItem);
            children.forEach((el) => {
              styleComment(el, selectors);
            });
          }
        }
      }
    }
  });
  observer.observe(feed, { childList: true, subtree: true });
  return () => {
    observer.disconnect();
    logger.log("Feed watcher stopped");
  };
};

// src/lib/infinite-scroll.ts
var isLoading = false;
var nextUrl = null;
var prevUrl = null;
var currentSelectors = null;
var initInfiniteScroll = (selectors) => {
  currentSelectors = selectors;
  if (currentPageType !== "THREAD" /* THREAD */) {
    logger.log("Infinite Scroll: Not a thread page.");
    return;
  }
  const prevLink = document.querySelector(selectors.prevPageLink);
  if (prevLink) {
    prevUrl = prevLink.href;
    logger.log("Infinite Scroll: Prev page is", prevUrl);
    const topSentry = document.createElement("div");
    topSentry.id = "infinite-scroll-top-sentry";
    topSentry.innerHTML = "<p style='color: #666; font-weight: bold;'>Cargando página anterior...</p>";
    topSentry.style.textAlign = "center";
    topSentry.style.padding = "40px";
    const feed = document.querySelector(selectors.feedContainer);
    if (feed)
      feed.before(topSentry);
    const topObserver = new IntersectionObserver((entries) => {
      const entry = entries[0];
      if (entry.isIntersecting && !isLoading && prevUrl) {
        loadPrevPage();
      }
    }, { rootMargin: "300px" });
    topObserver.observe(topSentry);
  }
  const nextLink = document.querySelector(selectors.nextPageLink);
  if (!nextLink) {
    logger.log("Infinite Scroll: No next page found.");
  } else {
    nextUrl = nextLink.href;
    logger.log("Infinite Scroll: Next page is", nextUrl);
    const bottomSentry = document.createElement("div");
    bottomSentry.id = "infinite-scroll-bottom-sentry";
    bottomSentry.innerHTML = "<p style='color: #666; font-weight: bold;'>Cargando página siguiente...</p>";
    bottomSentry.style.textAlign = "center";
    bottomSentry.style.padding = "40px";
    const feed = document.querySelector(selectors.feedContainer);
    if (feed)
      feed.after(bottomSentry);
    const bottomObserver = new IntersectionObserver((entries) => {
      const entry = entries[0];
      if (entry.isIntersecting && !isLoading && nextUrl) {
        loadNextPage();
      }
    }, { rootMargin: "300px" });
    bottomObserver.observe(bottomSentry);
  }
};
var getPageNumber = (url) => {
  try {
    const urlObj = new URL(url);
    const params = new URLSearchParams(urlObj.search);
    return params.get("page");
  } catch (e) {
    console.error("Error parsing URL for page number", e);
    return null;
  }
};
var getPageNumberFromDoc = (doc) => {
  if (currentSelectors?.activePage) {
    const activePageEl = doc.querySelector(currentSelectors.activePage);
    if (activePageEl?.textContent) {
      return activePageEl.textContent.trim();
    }
  }
  return null;
};
var createSeparator = (pageNumber) => {
  const div = document.createElement("div");
  div.classList.add("infinite-scroll-separator");
  const line = document.createElement("div");
  line.classList.add("infinite-scroll-separator-line");
  const span = document.createElement("span");
  span.textContent = `Página ${pageNumber}`;
  span.classList.add("infinite-scroll-separator-text");
  div.appendChild(line);
  div.appendChild(span);
  return div;
};
var loadPrevPage = async () => {
  if (!prevUrl)
    return;
  isLoading = true;
  try {
    const response = await fetch(prevUrl);
    const text = await response.text();
    const parser = new DOMParser;
    const doc = parser.parseFromString(text, "text/html");
    const newFeed = doc.querySelector(currentSelectors.feedContainer);
    const currentFeed = document.querySelector(currentSelectors.feedContainer);
    if (newFeed && currentFeed) {
      const oldScrollHeight = document.documentElement.scrollHeight;
      const oldScrollTop = document.documentElement.scrollTop;
      Array.from(newFeed.children).reverse().forEach((child) => {
        const importedNode = document.importNode(child, true);
        currentFeed.insertBefore(importedNode, currentFeed.firstChild);
      });
      const pageNum = getPageNumberFromDoc(doc) || getPageNumber(prevUrl);
      if (pageNum) {
        const separator = createSeparator(pageNum);
        currentFeed.insertBefore(separator, currentFeed.firstChild);
      }
      const newScrollHeight = document.documentElement.scrollHeight;
      document.documentElement.scrollTop = oldScrollTop + (newScrollHeight - oldScrollHeight);
    }
    const prevLink = doc.querySelector(currentSelectors.prevPageLink);
    if (prevLink) {
      prevUrl = prevLink.href;
    } else {
      prevUrl = null;
      document.querySelector("#infinite-scroll-top-sentry")?.remove();
    }
  } catch (err) {
    console.error("Infinite Scroll (Prev) Error:", err);
  } finally {
    isLoading = false;
  }
};
var loadNextPage = async () => {
  if (!nextUrl)
    return;
  isLoading = true;
  try {
    const response = await fetch(nextUrl);
    const text = await response.text();
    const parser = new DOMParser;
    const doc = parser.parseFromString(text, "text/html");
    const newFeed = doc.querySelector(currentSelectors.feedContainer);
    const currentFeed = document.querySelector(currentSelectors.feedContainer);
    if (newFeed && currentFeed) {
      const pageNum = getPageNumberFromDoc(doc) || getPageNumber(nextUrl);
      if (pageNum) {
        const separator = createSeparator(pageNum);
        currentFeed.appendChild(separator);
      }
      Array.from(newFeed.children).forEach((child) => {
        const importedNode = document.importNode(child, true);
        currentFeed.appendChild(importedNode);
      });
    }
    const nextLink = doc.querySelector(currentSelectors.nextPageLink);
    if (nextLink) {
      nextUrl = nextLink.href;
    } else {
      nextUrl = null;
      document.querySelector("#infinite-scroll-bottom-sentry")?.remove();
    }
  } catch (err) {
    console.error("Infinite Scroll Error:", err);
  } finally {
    isLoading = false;
  }
};

// src/lib/remove-banners.ts
var removeBanners = (scope) => {
  const shouldRemove = getEffectiveConfig(CONFIG_KEYS.REMOVE_BANNERS, scope);
  if (!shouldRemove)
    return;
  const banner = document.getElementById("notices-wrapper");
  if (banner) {
    banner.remove();
  }
};

// src/adapters/new-adapter.ts
class NewSiteAdapter {
  name = "New Interface";
  selectors;
  constructor() {
    this.selectors = newSelectors;
  }
  init() {
    logger.log(`Initializing ${this.name} adapter...`);
    this.removeSidebar();
    removeBanners("new");
  }
  removeSidebar() {
    const shouldRemove = getEffectiveConfig(CONFIG_KEYS.REMOVE_SIDEBAR, "new");
    if (!shouldRemove)
      return;
    const sidebar = document.querySelector("#sidebar");
    if (sidebar)
      sidebar.remove();
    const main = document.querySelector("main");
    if (main)
      main.style.display = "block";
  }
  setupFeatures() {
    watchFeed(this.selectors);
    if (getEffectiveConfig(CONFIG_KEYS.INFINITE_SCROLL, "new")) {
      initInfiniteScroll(this.selectors);
    }
  }
}

// src/adapters/old-adapter.ts
class OldSiteAdapter {
  name = "Old Interface";
  selectors;
  constructor() {
    this.selectors = oldSelectors;
  }
  init() {
    logger.log(`Initializing ${this.name} adapter...`);
    removeBanners("old");
  }
  setupFeatures() {
    watchFeed(this.selectors);
    if (getEffectiveConfig(CONFIG_KEYS.INFINITE_SCROLL, "old")) {
      initInfiniteScroll(this.selectors);
    }
  }
}

// src/index.ts
(() => {
  injectConsole("FCX");
  GM_addStyle(style_default);
  const isNew = isNewInterface();
  logger.log("Script initializing...");
  logger.log(`Interface: ${isNew ? "New" : "Old"}`);
  logger.log(`Page Type: ${currentPageType}`);
  const adapter = isNew ? new NewSiteAdapter : new OldSiteAdapter;
  adapter.init();
  adapter.setupFeatures();
  GM_registerMenuCommand("Configuración", toggleConfigPanel);
  return () => {
    logger.log("Script unloaded");
  };
})();