printables_hide_by_keywords

hide articles matching some keywords / coded in cooperation with perplexity ai ;) To add words see menue of script

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         printables_hide_by_keywords
// @namespace    https://greasyfork.org/de/users/157797-lual
// @version      0.2
// @description  hide articles matching some keywords / coded in cooperation with perplexity ai ;) To add words see menue of script
// @author       lual
// @match        https://www.printables.com/*
// @icon         https://icons.duckduckgo.com/ip2/prusaprinters.org.ico
// @license MIT
// @grant    GM_getValue
// @grant    GM_setValue
// @grant    GM_registerMenuCommand
// ==/UserScript==
//
(function() {
  'use strict';

  ////////////////////////////////////////////////////////////////////
  // wortliste im browser verwalten...
  //
  // Initiale Wortliste
  let wordsToHide = GM_getValue('wordsToHide', ['gridfinity', 'benchy']);

  // Speichern der initialen Liste, falls sie noch nicht existiert
  if (!GM_getValue('wordsToHide')) {
    GM_setValue('wordsToHide', wordsToHide);
  }

  function addWord() {
    const newWord = prompt('Geben Sie ein neues Wort zum Verbergen ein:');
    if (newWord && !wordsToHide.includes(newWord)) {
      wordsToHide.push(newWord);
      GM_setValue('wordsToHide', wordsToHide);
      alert(`"${newWord}" wurde zur Liste hinzugefügt.`);
      loadWords();
      forgetCheckedArticles();
      hideAndReplaceArticles();
    }
  }

  function removeWord() {
    const wordToRemove = prompt('Geben Sie das zu entfernende Wort ein:');

    const index = wordsToHide.indexOf(wordToRemove);
    if (index > -1) {
      wordsToHide.splice(index, 1);
      GM_setValue('wordsToHide', wordsToHide);
      alert(`"${wordToRemove}" wurde aus der Liste entfernt. (Bitte Seite neu laden (F5))`);
      loadWords();
      forgetCheckedArticles();
    } else {
      alert(`"${wordToRemove}" wurde nicht in der Liste gefunden.`);
    }
  }

  function showWords() {
    alert('Aktuelle Liste der zu verbergenden Wörter:\n' + wordsToHide.join(', '));
  }

  GM_registerMenuCommand('Wort hinzufügen', addWord);
  GM_registerMenuCommand('Wort entfernen', removeWord);
  GM_registerMenuCommand('Wortliste anzeigen', showWords);

  // Hauptfunktion zum Verbergen der Wörter
  function loadWords() {
    // Holen Sie sich die aktuelle Liste der zu verbergenden Wörter
    wordsToHide = GM_getValue('wordsToHide', []);
  }

  loadWords();
  //alert('Aktuelle Liste der zu verbergenden Wörter:\n' + wordsToHide.join(', '));

  ///////////////////////////////////////////////////////////////////////////



  // Objekt zur Verfolgung der Anzahl der ausgeblendeten Artikel pro Wort
  const wordCounters = {};
  wordsToHide.forEach(word => wordCounters[word] = 0);

  function forgetCheckedArticles() {
    const articles = document.querySelectorAll('article');
    articles.forEach(article => {
      article.dataset.checked = 'false';
    });
  }

  function hideAndReplaceArticles() {
    const articles = document.querySelectorAll('article');

    articles.forEach(article => {
      if (article.dataset.checked) return; // Überspringe bereits überprüfte Artikel

      const hDiv = article.querySelector('article div div div h5 a.h.clamp-two-lines');

      if (hDiv) {

        const textorig = hDiv.textContent;
        const text = hDiv.textContent.toLowerCase();

        for (const word of wordsToHide) {
          if (text.includes(word.toLowerCase())) {
            wordCounters[word]++;
            const replacementDiv = document.createElement('div');
            replacementDiv.className = 'article-replacement';
            replacementDiv.style.cssText = `
                            color: #555555;
                            #background-color: #f0f0f0;
                            padding: 10px;
                            margin: 0px 0;
                            border: 1px solid #555555;
                            border-radius: 1px;
                            font-style: italic;
                        `;

            // Hinweis Dv
            const hinweisDiv = document.createElement('div');


            hinweisDiv.textContent = `(Hidden - because keyword "${word}" was found (${wordCounters[word]}))`;
            hinweisDiv.style.cssText = `
                            color: #555555;
                            font-size: 14px;
                            #background-color: #f0f0f0;
                            padding: 10px;
                            margin: 0px 0;
                            #border: 1px solid #555555;
                            #border-radius: 1px;
                            font-style: italic;
                        `;
            replacementDiv.appendChild(hinweisDiv);

            // Zusätzliches Div
            const additionalDiv = document.createElement('div');
            additionalDiv.className = 'additional-content';
            additionalDiv.textContent = ` ${textorig} `;
            additionalDiv.style.cssText = `
                            padding: 10px;
                            font-size: 16px;
                            font-weight: 700
                        `;
            // replacementDiv.appendChild(additionalDiv);
            hDiv.style.cssText = `
                            color: #555555;
                            padding: 10px;
                            font-size: 16px;
                            font-weight: 700
                        `;
            replacementDiv.appendChild(hDiv);

            article.parentNode.replaceChild(replacementDiv, article);
            break;
          }
        }
      }
      article.dataset.checked = 'true'; // Markiere den Artikel als überprüft
    });
  }

  // Throttle-Funktion zur Leistungsoptimierung
  function throttle(func, limit) {
    let inThrottle;
    return function() {
      const args = arguments;
      const context = this;
      if (!inThrottle) {
        func.apply(context, args);
        inThrottle = true;
        setTimeout(() => inThrottle = false, limit);
      }
    };
  }

  // Funktion zum Ausführen des Skripts
  function runScript() {
    hideAndReplaceArticles();
    // Füge einen Scroll-Event-Listener hinzu
    window.addEventListener('scroll', throttle(hideAndReplaceArticles, 250));
  }

  // Führe das Skript aus, wenn das DOM geladen ist
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', runScript);
  } else {
    runScript();
  }

  // Zusätzlicher MutationObserver für dynamisch geladene Inhalte
  const observer = new MutationObserver(throttle(() => {
    hideAndReplaceArticles();
  }, 250));

  observer.observe(document.body, {
    childList: true,
    subtree: true
  });
})();