User JS: Difference between revisions

From Soyjak Wiki, The Free Soycyclopedia
Jump to navigationJump to search
No edit summary
No edit summary
(45 intermediate revisions by 12 users not shown)
Line 1: Line 1:
<s>On soyjak.party users can add custom javascript under Options->User JS in the top right of the page to customize their browsing experience.</s> On December 28, 2022, the option to set custom JS was removed. You can still use Tampermonkey or another extension that allows custom JS.
The theme and functionality of soyjak.party can be endlessly customized. This page catalogs working stylesheets and user scripts that soyjak.party users have created.  


== Merging Scripts ==
To add a CSS theme from here, on the soyjak.party website in the top right go to the '''Options->User CSS'''  and paste it in the text box. To add javascript code snippets from here, copy and paste them into '''Options->User JS'''
You can use any of these scripts at once by pasting them one after another in Options->User JS.


== Code Snippets ==
== Code Snippets ==


==== Sharty Fixes Gemerald ====
==== Sharty Fixes Gemerald ====
The original Sharty Fixes was deleted for an unknown reason.
The original Sharty Fixes was deleted for an unknown reason. If [[you]] wish to use the original Sharty Fixes instead, [https://files.soyjak.wiki/shartyfixes.js it can be installed from here.]


A small userscript that fixes the following bugs with the sharty:
A small userscript that fixes the following bugs with the sharty:
Line 40: Line 39:
==== Sharty Themes ====
==== Sharty Themes ====
Should be used with Sharty Fixes Gemerald
Should be used with Sharty Fixes Gemerald
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
// ==UserScript==
// @name        Sharty Themes
// @namespace  soyjak.partythemes
// @match      http*://soyjak.party/*
// @match      http*://www.soyjak.party/*
// @grant      GM_getValue
// @grant      GM_setValue
// @grant      GM_xmlhttpRequest
// @grant      GM_addStyle
// @connect    *
// @license MIT
// @version    1.0
// @author      Base framework by Zyl, Mainly created by Doughy
// @description The Gemmiest Enhancements for the 'ty
// ==/UserScript==


const version = "v1.0";
Install from [https://greasyfork.org/en/scripts/458480-sharty-themes Greasy Fork] userscript manager.
console.log(`Sharty Themes ${version}`);


const namespace = "ShartyThemes.";
====SoyParty-X====
function setValue(key, value) {
Features:
  if (key == "hiddenthreads" || key == "hiddenimages") {
    if (typeof GM_setValue == "function") {
      GM_setValue(key, value);
    }
    localStorage.setItem(key, value);
  } else {
    if (typeof GM_setValue == "function") {
      GM_setValue(namespace + key, value);
    } else {
      localStorage.setItem(namespace + key, value);
    }
  }
}


function getValue(key) {
* Detects flood posts and hides them (you can set amount of lines and words to hide)
  if (key == "hiddenthreads" || key == "hiddenimages") {
    if (typeof GM_getValue == "function" && GM_getValue(key)) {
      localStorage.setItem(key, GM_getValue(key).toString());
    }
    return localStorage.getItem(key);
  }
  if (typeof GM_getValue == "function") {
    return GM_getValue(namespace + key);
  } else {
    return localStorage.getItem(namespace + key);
  }
}


function themeEnabled(key) {
* Forced anonymity (hides namefags, can be disabled)
  let value = getValue(key);
  if (value == null) {
    value = optionsEntries[key][2];
    setValue(key, value);
  }
  return value.toString() == "true";
}


function getNumber(key) {
* Hides emailfags or sagefags (can be disabled for sagefags)
  let value = parseInt(getValue(key));
  if (Number.isNaN(value)) {
    value = 0;
  }
  return value;
}


function getJson(key) {
* Highlights triple parentheses
  let value = getValue(key);
  if (value == null) {
    value = "{}";
  }
  return JSON.parse(value);
}


function addToJson(key, jsonKey, value) {
* Highlights datamining (makes posts glow)
  let json = getJson(key);
  let parent = json;
  jsonKey.split(".").forEach((e, index, array) => {
    if (index < array.length - 1) {
      if (!parent.hasOwnProperty(e)) {
        parent[e] = {};
      }
      parent = parent[e];
    } else {
      parent[e] = value;
    }
  });
  setValue(key, JSON.stringify(json));
  return json;
}


function removeFromJson(key, jsonKey) {
* Inline Youtube Previews (+invidious support)
  let json = getJson(key);
  let parent = json;
  jsonKey.split(".").forEach((e, index, array) => {
    if (index < array.length - 1) {
      parent = parent[e];
    } else {
      delete parent[e];
    }
  });
  setValue(key, JSON.stringify(json));
  return json;
}


function customAlert(a) {
* Replaces "Gem" and "Coal" with minecraft icons
    document.body.insertAdjacentHTML("beforeend", `
<div id="alert_handler">
  <div id="alert_background" onclick="this.parentNode.remove()"></div>
  <div id="alert_div">
    <a id='alert_close' href="javascript:void(0)" onclick="this.parentNode.parentNode.remove()"><i class='fa fa-times'></i></a>
    <div id="alert_message">${a}</div>
    <button class="button alert_button" onclick="this.parentNode.parentNode.remove()">OK</button>
  </div>
</div>`);
}


* Replaces "Bump" and "Sage" with upvote and downvote icons
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|+
|<pre>// ==UserScript==
// @name        SoyParty-X
// @namespace    datamining
// @version      0.2
// @description  Cure the cancer that is killing soyjak.party
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==


const optionsEntries = {
/* eslint-env jquery */
  "underwater": ["checkbox", "Underwater Theme", false],
  "soot": ["checkbox", "Soot Theme", false],
  "beta": ["checkbox", "Beta Theme", false],
  "leftypol": ["checkbox", "Leftycoal Theme", false],
  "cafe": ["checkbox", "Crystal Theme", false],
  "gurochan": ["checkbox", "Gurochan Theme", false],
  "colorjak": ["checkbox", "Colorjak Theme", false],
}


/*


Changelog:


0.2:


- hidePosts() now detects flood posts.


0.1:


let options = Options.add_tab("sharty-themes", "gear", "Sharty Themes").content[0];
- hidePosts()
 
- forcedAnonymity()
 
- highlightTripleParentheses()
let optionsHTML = `<span style="display: block; text-align: center">${version}</span>`;
- highlightDatamining()
optionsHTML += `<a style="display: block; text-align: center" href="https://greasyfork.org/en/scripts/456980-sharty-fixes-gemerald">Best used with Sharty Fixes Gemerald</a><br>`;
- inlineYoutubePreviews()
optionsHTML += `<span style="display: block; text-align: center"><h1></h1></span>`;
- replaceCoalAndGemsWithIcon()
for ([optKey, optValue] of Object.entries(optionsEntries)) {
- replaceBumpAndSageWithIcons()
  optionsHTML += `<input type="${optValue[0]}" id="${optKey}" name="${optKey}"><label for="${optKey}">${optValue[1]}</label><br>`;
}
options.insertAdjacentHTML("beforeend", optionsHTML);


options.querySelectorAll("input[type=checkbox]").forEach(e => {
*/
  e.checked = themeEnabled(e.id);
  e.addEventListener("change", e => {
    setValue(e.target.id, e.target.checked);
  });
});


(function SoyPartyX() {
  // true = hide posts where the e-mail is "sage".
  const _hideMailtoSage = true;


  // true = scrub email, trip, and force all names to be "Chud".
  // - Emailfags and tripfags are already hidden.
  // - Namefags aren't hidden, but turning this on will anonymize them.
  // false = don't change posts (default).
  const _enableForcedAnonymity = false;


  // Sets the limit for a post to be considered a flood post.
  // If one of the criteria is met, the post is hidden.
  const floodThresholdLines = 30;
  const floodThresholdCharacters = 3000;


document.head.insertAdjacentHTML("beforeend", `
  hidePosts();
<style>
  forcedAnonymity(); // Must come AFTER hidePosts()
  highlightTripleParentheses();
  highlightDatamining();
  inlineYoutubePreviews();
  replaceCoalAndGemsWithIcon();
  replaceBumpAndSageWithIcons();


  function hidePosts() {
    $(".post").each((i, el) => {
      const $el = $(el);
      const reasons = [];


      const isOp = $el.hasClass("op");


      if ($el.has(".trip").length) {
        reasons.push("tripfag");
      }
      if (_hideMailtoSage && $el.has('a.email[href^="mailto:sage"]').length) {
        reasons.push("sagefag");
      }
      if ($el.has('a.email:not([href^="mailto:sage"])').length) {
        reasons.push("emailfag");
      }


      const body = $el.has(".body");
      const bodyLines = body.html().split("<br>").length;
      const bodyLength = body.text().length;


      if (
        bodyLines > floodThresholdLines ||
        bodyLength > floodThresholdCharacters
      ) {
        reasons.push(
          `possible flooding: ${bodyLength} characters in ${bodyLines} lines`
        );
      }


      if (reasons.length) {
        const $notice = $("<div>")
          .addClass(`post ${isOp ? "op" : "reply"}`)
          .html(
            `<div class='body'><em>Post hidden (${reasons.join(
              ", "
            )}). Click to show.</em></div>`
          )
          .after($("<br>"));
        $notice.click(() => {
          $el.show();
          if (isOp) $el.prev(".files").show();
          $notice.hide();
        });
        $el.after($notice);
        $el.hide();
        if (isOp) $el.prev(".files").hide();
      }
    });
  }


${themeEnabled("gurochan") ? `
  function forcedAnonymity() {
html, body {
    if (!_enableForcedAnonymity) return;
        font-size:10pt;
    // Remove all emails.
        background:#EDDAD2;
    $("a.email").prop("outerHTML", "<span class='name'>Chud</span>");
        color: #800;
    // Remove all tripcodes.
}
    $(".trip").prop("outerHTML", "");
* {
    // Set all names to Chud.
        font-family: Tahoma, Verdana, Arial, sans-serif;
    // Make sure not to overwrite (You)'s.
        font-size: 10pt;
    $(".name")
}
      .filter((i, el) => !$(el).has(".own_post").length)
input, textarea {
      .text("Chud");
        background-color: #E6CBC0;
  }
        border: 1px solid #CA927B;
}
 
a, a:visited{
color: #AF0A0F;
}
 


a:hover {
  function replaceWordWithIcon(re, icon) {
color: #D00;
    const matchesRe = (index, post) => $(post).html().match(re);
}


a.quotelink {
    const template = (match) =>
        color:#DD0000;
      `<img src="${icon}" style="max-height:2em; vertical-align:middle">`;
}
div.post.reply.highlighted{
        background:#D9AF9E
}
form table tr th {
        background: #D9AF9E;
        border: 1px solid #CA927B;
        padding: 2px 5px 2px 5px;
}
div.banner{
        background: #D9AF9E;
        border: 1px solid #CA927B;
        color: #800;
        font-weight: bold;
        padding: 2px 5px 2px 5px;
}
div.post.reply{
        padding: 2px 5px 2px 5px;
background:#E6CBC0;
color:#800;
border:1px solid #D9AF9E;
}
div.post.reply div.body a{
      color: #AF0A0F;
}


.bar
    const applyTemplate = (index, post) => {
{
      const $post = $(post);
      background:#D9AF9E;
      const html = $post.html();
      color:#800;
      $post.html(html.replace(re, template));
}
    };


.bar a {
    $("div.body").filter(matchesRe).each(applyTemplate);
        color:#800;
  }
}


.bar.bottom {
  function replaceCoalAndGemsWithIcon() {
     border-top: 1px solid #CA927B;
    replaceWordWithIcon(/coal/gi, "https://i.imgur.com/O9iRcRv.png");
}
     replaceWordWithIcon(/gems?/gi, "https://i.imgur.com/BvjFdau.png");
  }


.desktop-style div.boardlist:not(.bottom), .desktop-style div.boardlist:not(.bottom) a {
  function replaceBumpAndSageWithIcons() {
    font-size: 10pt;
    // replaceWordWithIcon(/bump/gi, "https://i.imgur.com/zM2xOGh.png");
     background:#D9AF9E;
     // replaceWordWithIcon(/sage/gi, "https://i.imgur.com/2bsauzj.png");
     color:#800;
     replaceWordWithIcon(/bump/gi, "https://i.imgur.com/Y7cpsW0.png");
     border-bottom: 1px solid #CA927B;
     replaceWordWithIcon(/\bsage\b/gi, "https://i.imgur.com/ZarQtY3.png");
}
  }


h1.glitch a{
  function highlightTripleParentheses() {
        font-size: 24pt;
    const re = /\(\(\(.+?\)\)\)/g;
        color: #AF0A0F;
    const hasRe = (i, post) => post.innerHTML.match(re);
        font-family: "Trebuchet MS", Tahoma, Verdana, Arial, sans-serif;
}
h1.glitch {
        font-size: 24pt;
        color: #AF0A0F;
        font-family: "Trebuchet MS", Tahoma, Verdana, Arial, sans-serif;
}
hr {
        border-top: 1px dotted #D9AF9E;
}
#options_div {
        background: #D9AF9E;
        border: 2px solid #CA927B;
}
#options_tablist {
border: 1px solid #CA927B;
}
div.module, div.ban {
        background: #D9AF9E;
        border: 1px solid #CA927B;
}
div.ban h2 {
        background: #CA927B;
}
.fc td, .fc th {
        background: #CA927B;
}
.hljs, .hljs-subst {
        background: #EDDAD2;
        border: 1px solid #CA927B;
}


.intro a.email:hover{
    const template = (match) =>
     color: #D00;
      `<span style='background-color:white;color:#0038B8;font-family:monospace;'>${match}</span>`;
}
     const applyTemplate = (i, post) => {
      post.innerHTML = post.innerHTML.replace(re, template);
    };


.intro a.email span.name {
    $("div.body").filter(hasRe).each(applyTemplate);
    color: #AF0A0F;
  }
}


.intro span.name {
  function highlightDatamining() {
    color: #AF0A0F;
    const reGlowie =
}
      /data(\s*|-)min(ing|er|ed)|(sell|selling|sold)\s+(my|our)?\s+data|cuckflare|cloudflare|cloud fleur/i;
    const hasReGlowie = (i, post) => post.innerHTML.match(reGlowie);
    const applyTemplate = (i, post) =>
      $(post).css({
        backgroundColor: "#D7EFD7",
        boxShadow: "#66FF66 0 0 2rem 0",
      });
    $(".reply").filter(hasReGlowie).each(applyTemplate);
  }


.intro span.subject {
  function inlineYoutubePreviews() {
     color: #800;
    const re = /(?:youtu\.be\/|\/watch\?v=)(.{11})/;
}
     const previewTemplate = (videoId) =>
      `<a href="https://youtube.com/watch?v=${videoId}">https://youtube.com/watch?v=${videoId}</a><br><img style="max-width:255px;max-height:255px" src="https://i.ytimg.com/vi/${videoId}/hqdefault.jpg" /><br><em>Watch on <a href="https://yewtu.be/${videoId}">Invidious</a> (less datamining)</em><br>`;
    $(".body a")
      .filter(function (i) {
        return $(this).prop("href").match(re);
      })
      .each(function (i) {
        $(this).prop("outerHTML", previewTemplate(this.href.match(re)[1]));
      });
  }
})();
</pre>
|}
====Post Filters====
Allows you to filter posts based on comments, subject, name, and tripcode
To access filters click on options button.


.options_tab_icon{
<i>Expand to view the script</i>
    color: #AF0A0F;
{| class="mw-collapsible mw-collapsed"
}
|+
 
|<pre>
 
// @name        Post Filters for soyjak.party
#quick-reply th {
// @namespace    datamining
    border: 1px solid #D9AF9E;
// @version      0.1
}
// @description  Filter posts on soyjak.party
 
// @author      Chud (You)
 
// @match        https://soyjak.party/*
div.pages input{
// @icon        https://soyjak.party/static/favicon.png
    background:#D9AF9E;
// @grant        none
    color:#800;
// ==/UserScript==
}
/*
 
* post-menu.js - adds dropdown menu to posts
div.pages a.selected{
*
     color:#800;
* Creates a global Menu object with four public methods:
}
*
 
*  Menu.onclick(fnc)
.quote {
*    registers a function to be executed after button click, before the menu is displayed
     color: #866;
*  Menu.add_item(id, text[, title])
}
*     adds an item to the top level of menu
 
*  Menu.add_submenu(id, text)
 
*    creates and returns a List object through which to manipulate the content of the submenu
div.banner a, textarea {
*  Menu.get_submenu(id)
     color: #800;
*     returns the submenu with the specified id from the top level menu
}
*
 
*  The List object contains all the methods from Menu except onclick()
 
*
a.selected:nth-child(1) {
*  Example usage:
         color:#800;
*    Menu.add_item('filter-menu-hide', 'Hide post');
}
*     Menu.add_item('filter-menu-unhide', 'Unhide post');
` : ""}
*
 
*    submenu = Menu.add_submenu('filter-menu-add', 'Add filter');
 
*        submenu.add_item('filter-add-post-plus', 'Post +', 'Hide post and all replies');
${themeEnabled("underwater") ? `
*         submenu.add_item('filter-add-id', 'ID');
 
a:link, a:visited {
* Usage:
text-decoration: none;
*  $config['additional_javascript'][] = 'js/jquery.min.js';
color: #00637B;
*  $config['additional_javascript'][] = 'js/post-menu.js';
}
*/
$(document).ready(function () {


a:link:hover, a:visited:hover {
var List = function (menuId, text) {
color: #DD0000;
this.id = menuId;
}
this.text = text;
this.items = [];


a.post_no {
this.add_item = function (itemId, text, title) {
color: #000033;
this.items.push(new Item(itemId, text, title));
}
};
this.list_items = function () {
var array = [];
var i, length, obj, $ele;


.intro a.email span.name {
if ($.isEmptyObject(this.items))
color: #0093AB;
return;
}


.intro a.email:hover span.name {
length = this.items.length;
color: #DD0000;
for (i = 0; i < length; i++) {
}
obj = this.items[i];


h2, div.title, h1 {
$ele = $('<li>', {id: obj.id}).text(obj.text);
color: #800000;
if ('title' in obj) $ele.attr('title', obj.title);
}


form table tr th {
if (obj instanceof Item) {
background: #95D2D3;
$ele.addClass('post-item');
}
} else {
$ele.addClass('post-submenu');


div.banner {
$ele.prepend(obj.list_items());
background-color: #E04000;
$ele.append($('<span>', {class: 'post-menu-arrow'}).text('»'));
}
}


div.post.op hr {
array.push($ele);
border-color: #B7C9D5;
}
}


.intro span.subject {
return $('<ul>').append(array);
color: #117743;
};
font-weight: 800;
this.add_submenu = function (menuId, text) {
}
var ele = new List(menuId, text);
this.items.push(ele);
return ele;
};
this.get_submenu = function (menuId) {
for (var i = 0; i < this.items.length; i++) {
if ((this.items[i] instanceof Item) || this.items[i].id != menuId) continue;
return this.items[i];
}
};
};


.intro span.name {
var Item = function (itemId, text, title) {
color: #117743;
this.id = itemId;
font-weight: 800;
this.text = text;
}


div.post.reply.highlighted {
// optional
background: #a9d8ff;
if (typeof title != 'undefined') this.title = title;
}
};
 
function buildMenu(e) {
var pos = $(e.target).offset();
var i, length;
 
var $menu = $('<div class="post-menu"></div>').append(mainMenu.list_items());


div.post.reply {
//  execute registered click handlers
background: #B6DDDE;
length = onclick_callbacks.length;
border-color: #8FCCCD;
for (i = 0; i < length; i++) {
}
onclick_callbacks[i](e, $menu);
}


div.ban {
//  set menu position and append to page
border: 1px solid #0093AB;
$menu.css({top: pos.top, left: pos.left + 20});
$('body').append($menu);
}
}


div.ban h2 {
function addButton(post) {
background: #B6DDDE;
var $ele = $(post);
color: #0093AB;
$ele.find('input.delete').after(
$('<a>', {href: '#', class: 'post-btn', title: 'Post menu'}).text('▶')
);
}
}


div.pages {
color: #8899AA;
background: #B6DDDE;
border-right: 1px solid #8FCCCD;
border-bottom: 1px solid #8FCCCD;
}


hr {
/* * * * * * * * * *
border-color: #B7D9C5;
    Public methods
}
* * * * * * * * * */
var Menu = {};
var mainMenu = new List();
var onclick_callbacks = [];


div.boardlist {
Menu.onclick = function (fnc) {
color: #0093AB;
onclick_callbacks.push(fnc);
    background-color: rgba(65%, 85%, 95%, 0.2);
};
}


.desktop-style div.boardlist:nth-child(1) {
Menu.add_item = function (itemId, text, title) {
  text-shadow: #D2FFEE 1px 1px 1px, #D2FFEE -1px -1px 1px;
mainMenu.add_item(itemId, text, title);
}
};
* {
  background-image: url('https://files.catbox.moe/hp03xs.png');
}


.soifish {
Menu.add_submenu = function (menuId, text) {
  background-image: url('https://files.catbox.moe/rxmvyr.png');
return mainMenu.add_submenu(menuId, text);
  position: fixed;
};
    pointer-events: none;
 
  -webkit-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
Menu.get_submenu = function (id) {
  -moz-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
return mainMenu.get_submenu(id);
  -o-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
};
  animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
 
}
window.Menu = Menu;


@-webkit-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-moz-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-o-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@keyframes moveX {
  from { left: 0; } to { left: 100%; }
}


@-webkit-keyframes moveY {
/* * * * * * * *
  from { top: 0; } to { top: 100%; }
    Initialize
}
* * * * * * * */
@-moz-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@-o-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@keyframes moveY {
  from { top: 0; } to { top: 100%; }
}


/*  Styling
*/
var $ele, cssStyle, cssString;


$ele = $('<div>').addClass('post reply').hide().appendTo('body');
cssStyle = $ele.css(['border-top-color']);
cssStyle.hoverBg = $('body').css('background-color');
$ele.remove();


.post.reply .body a:hover:after {
cssString =
    content: url(https://soyjak.download/f.php?h=0lnyi5TW&p=1);
'\n/*** Generated by post-menu ***/\n' +
    display: block;
'.post-menu {position: absolute; font-size: 12px; line-height: 1.3em;}\n' +
    position: absolute;
'.post-menu ul {\n' +
    left: 20px;
'    background-color: '+ cssStyle['border-top-color'] +'; border: 1px solid #666;\n' +
    top: -255px;
'    list-style: none; padding: 0; margin: 0; white-space: nowrap;\n}\n' +
    pointer-events: none;
'.post-menu .post-submenu{white-space: normal; width: 90px;}' +
    z-index: 999;
'.post-menu .post-submenu>ul{white-space: nowrap; width: auto;}' +
}
'.post-menu li {cursor: pointer; position: relative; padding: 4px 4px; vertical-align: middle;}\n' +
'.post-menu li:hover {background-color: '+ cssStyle.hoverBg +';}\n' +
'.post-menu ul ul {display: none; position: absolute;}\n' +
'.post-menu li:hover>ul {display: block; left: 100%; margin-top: -3px;}\n' +
'.post-menu-arrow {float: right; margin-left: 10px;}\n' +
'.post-menu.hidden, .post-menu .hidden {display: none;}\n' +
'.post-btn {transition: transform 0.1s; width: 15px; text-align: center; font-size: 10pt; opacity: 0.8; text-decoration: none; margin: -6px 0px 0px -5px !important; display: inline-block;}\n' +
'.post-btn:hover {opacity: 1;}\n' +
'.post-btn-open {transform: rotate(90deg);}\n';


.post.reply .body a:hover {
if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
    position: relative;
$('style.generated-css').html($('style.generated-css').html() + cssString);
}


body:after {
/*  Add buttons
    content: url(https://soyjak.download/f.php?h=3EFSgyRY&p=1);
*/
    display: block;
$('.reply:not(.hidden), .thread>.op').each(function () {
    position: fixed;
addButton(this);
    bottom: 0px;
});
    right: 0px;
    pointer-events: none;


.desktop-style div.boardlist:nth-child(1):hover, .desktop-style div.boardlist:nth-child(1).cb-menu {
/*  event handlers
  background-color: rgba(70%, 95%, 100%, 0.45);
  */
}` : ""}
$('form[name=postcontrols]').on('click', '.post-btn', function (e) {
e.preventDefault();
var post = e.target.parentElement.parentElement;
$('.post-menu').remove();


if ($(e.target).hasClass('post-btn-open')) {
$('.post-btn-open').removeClass('post-btn-open');
} else {
//  close previous button
$('.post-btn-open').removeClass('post-btn-open');
$(post).find('.post-btn').addClass('post-btn-open');


${themeEnabled("soot") ? `
buildMenu(e);
@import url("/stylesheets/dark.css");
}
/*soot theme*/
});


.name {
$(document).on('click', function (e){
    color: #FDD73A !important;
if ($(e.target).hasClass('post-btn') || $(e.target).hasClass('post-submenu'))
}
return;


body {
$('.post-menu').remove();
    background: black url(https://i.imgur.com/FeQmhfL.png) right bottom no-repeat fixed;
$('.post-btn-open').removeClass('post-btn-open');
}
});


div.post.reply {
// on new posts
    background-color: #646464 !important;
$(document).on('new_post', function (e, post) {
    color: black;
addButton(post);
    border-radius:0;
});
}


div#post-moderation-fields , div#style-select {
$(document).trigger('menu_ready');
    padding:4px;
});
    background-color:rgba(0,0,0,28);
}


span.heading {
    color: #FF565C !important;
}


.remove-btn {
// Post Filters
    color: rgba(255,255,255,128) !important;
if (active_page === 'thread' || active_page === 'index' || active_page === 'catalog' || active_page === 'ukko') {
}
$(document).on('menu_ready', function () {
'use strict';
// returns blacklist object from storage
function getList() {
return JSON.parse(localStorage.postFilter);
}


hr {
// stores blacklist into storage and reruns the filter
    border-color:transparent;
function setList(blacklist) {
}
localStorage.postFilter = JSON.stringify(blacklist);
$(document).trigger('filter_page');
}


` : ""}
// unit: seconds
function timestamp() {
return Math.floor((new Date()).getTime() / 1000);
}


function initList(list, boardId, threadId) {
if (typeof list.postFilter[boardId] == 'undefined') {
list.postFilter[boardId] = {};
list.nextPurge[boardId] = {};
}
if (typeof list.postFilter[boardId][threadId] == 'undefined') {
list.postFilter[boardId][threadId] = [];
}
list.nextPurge[boardId][threadId] = {timestamp: timestamp(), interval: 86400};  // 86400 seconds == 1 day
}


${themeEnabled("beta") ? `
function addFilter(type, value, useRegex) {
@import url("https://soyjak.party/stylesheets/dark.css");
var list = getList();
/**
var filter = list.generalFilter;
* Beta.css
var obj = {
* by kalyx
type: type,
*this might work well on phones
value: value,
*/
regex: useRegex
 
};
body
{
display:block;
padding-top: 26px;
background: #0d1010;
color: #e8e8e3;
font-family: sans-serif;
font-size: 18px;


for (var i=0; i<filter.length; i++) {
if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex)
return;
}


width: 100%;
filter.push(obj);
}
setList(list);
drawFilterList();
}


html {
function removeFilter(type, value, useRegex) {
/* Size of largest container or bigger */
var list = getList();
  background:#0d1010;
var filter = list.generalFilter;
width: 100%;
margin-left: auto;
  margin-right: auto;
 
}
/*banner*/
.board_image{
border: double 0px #e8e8e3;
box-shadow: 2px 2px #e8e8e3;
}


    /*gives images border/shadow*/
for (var i=0; i<filter.length; i++) {
    div.files img.post-image {
if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex) {
border: solid 1px #e8e8e3;
filter.splice(i, 1);
box-shadow: 2px 2px #e8e8e3;
break;
        padding: 0px;
}
        border-radius: 0;
}
        margin-bottom: 5px;
}
div.sidearrows{
display: none;
}


span.quote
setList(list);
{
drawFilterList();
    color:#e8d928;
}
}
@font-face
{
  font-family: 'lain';
  src: url('./fonts/nrdyyh.woff') format('woff'),
      url('./fonts/tojcxo.TTF') format('truetype');
}
h1
{
display: none;
font-family: 'lain', tahoma;


letter-spacing: -2px;
function nameSpanToString(el) {
font-size: 42pt;
var s = '';  
text-align: center;
color: #e8e8e3;


}
$.each($(el).contents(), function(k,v) {
header div.subtitle
if (v.nodeName === 'IMG')
{
s=s+$(v).attr('alt')
display: none;
    color: #e8e8e3;
if (v.nodeName === '#text')
font-size: 13px;
s=s+v.nodeValue
  margin-left: auto;
});
  margin-right: auto;
return s.trim();
max-width:385px;
}
}
div.title
{
display: none;
color: #e8e8e3;
font-family: Arial, Helvetica, sans-serif;


}
var blacklist = {
div.title p
add: {
{
post: function (boardId, threadId, postId, hideReplies) {
font-size: 8px;
var list = getList();
color: #e8e8e3;
var filter = list.postFilter;
}
a:link, a:visited, p.intro a.email span.name
{
color: #e8e8e3;
text-transform: uppercase;
font-size: 10px;
text-decoration: none;
font-family: sans-serif;
}
a:link, a:visited, p.intro a.email span.name
{
        -moz-transition: 0.15s text-shadow, 0.15s color;
-webkit-transition: 0.15s text-shadow, 0.15s color;
-khtml-transition: 0.15s text-shadow, 0.15s color;
-o-transition: 0.15s text-shadow, 0.15s color;
-ms-transition: 0.15s text-shadow, 0.15s color;
transition: 0.15s text-shadow, 0.15s color;
}
input[type="text"], textarea
{
-moz-transition: 0.15s border-color;
-webkit-transition: 0.15s border-color;
-khtml-transition: 0.15s border-color;
-o-transition: 0.15s border-color;
-ms-transition: 0.15s border-color;
transition: 0.15s border-color;
}
input[type="submit"]
{
-moz-transition: 0.15s border-color, 0.15s background-color, 0.15s color;
-webkit-transition: 0.15s border-color, 0.15s background-color, 0.15s color;
-khtml-transition: 0.15s border-color, 0.15s background-color, 0.15s color;
-o-transition: 0.15s border-color, 0.15s background-color, 0.15s color;
-ms-transition: 0.15s border-color, 0.15s background-color, 0.15s color;
transition: 0.15s border-color, 0.15s background-color, 0.15s color;
}
a:link:hover, a:visited:hover
{
color: #e8d928;
font-family: sans-serif;
text-decoration: none;
text-shadow: 0px 0px 5px #d2e7e8;
}
a.post_no
{
color: #e8d928;
text-decoration: none;
}
p.intro a.post_no:hover
{
        color: #e8d928!important;
}
div.post.reply
{
background: #0d1010;
align: center;
max-width:100% !important;
min-width: 100%!important;
border: solid  1px #e8e8e3;
box-shadow: 2px 2px #e8e8e3;


initList(list, boardId, threadId);


}
for (var i in filter[boardId][threadId]) {
 
if (filter[boardId][threadId][i].post == postId) return;
div.postcontainer
}
{
filter[boardId][threadId].push({
max-width:100% !important;
post: postId,
min-width: 100%!important;
hideReplies: hideReplies
 
});
}
setList(list);
div.post.reply.highlighted
},
{
uid: function (boardId, threadId, uniqueId, hideReplies) {
background: #1e2324;
var list = getList();
border: solid 1px #93e0e3;
var filter = list.postFilter;
        box-shadow: 3px 5px #5c8c8e;
  margin-left: auto;
  margin-right: auto;
}
div.post.reply div.body a:link, div.post.reply div.body a:visited
{
color: #CCCCCC;


}
initList(list, boardId, threadId);
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover
{
color: #e8d928;


}
for (var i in filter[boardId][threadId]) {
p.intro span.subject
if (filter[boardId][threadId][i].uid == uniqueId) return;
{
}
font-size: 12px;
filter[boardId][threadId].push({
font-family: sans-serif;
uid: uniqueId,
color: #e8d928;
hideReplies: hideReplies
font-weight: 800;
});
setList(list);
}
},
remove: {
post: function (boardId, threadId, postId) {
var list = getList();
var filter = list.postFilter;


}
// thread already pruned
p.intro span.name
if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
{
return;
color: #c3e849;
font-weight: 800;
}
p.intro a.capcode, p.intro a.nametag
{
color: magenta;
margin-left: 0;
}
p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name
{
color: #d2e7e8;


}
for (var i=0; i<filter[boardId][threadId].length; i++) {
input[type="text"], textarea, select
if (filter[boardId][threadId][i].post == postId) {
{
filter[boardId][threadId].splice(i, 1);
background: #0d1010!important;
break;
color: #CCCCCC!important;
}
border: solid  1px #e8e8e3;
}
box-shadow: 1px 1px #0d1010;
  margin-left: auto;
  margin-right: auto;


if ($.isEmptyObject(filter[boardId][threadId])) {
delete filter[boardId][threadId];
delete list.nextPurge[boardId][threadId];


}
if ($.isEmptyObject(filter[boardId])) {
input[type="password"]
delete filter[boardId];
{
delete list.nextPurge[boardId];
background: #0d1010!important;
}
color: #CCCCCC!important;
}
border: #d2e7e8 1px double!important;
setList(list);
}
},
form table tr th
uid: function (boardId, threadId, uniqueId) {
{
var list = getList();
background: #0d1010!important;
var filter = list.postFilter;
color: #e8e8e3!important;
border: solid  1px #d2e7e8;
box-shadow: 1px 1px #0d1010;
text-align: right;


}
// thread already pruned
div.banner
if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
{
return;


background: #E04000;
for (var i=0; i<filter[boardId][threadId].length; i++) {
border: 0px solid hsl(17, 100%, 60%);
if (filter[boardId][threadId][i].uid == uniqueId) {
color: #EEE;
filter[boardId][threadId].splice(i, 1);
text-align: center;
break;
height: 15px;
}
padding: 1px 1px 4px 1px;
}
margin-left: auto;
margin-right: auto;
}
div.banner a
{
    color:#000;
}
input[type="submit"]
{
background: #333333;
border: #666 1px solid;
color: #CCCCCC;
}
input[type="submit"]:hover
{
background: #555;
border: #888 1px solid;
color: #e8d928;
}
input[type="text"]:focus, textarea:focus
{
    border:#888 1px solid!important;
}
p.fileinfo a:hover
{
text-decoration: underline;
}
span.trip
{
color: #AAA;
}
.bar
{
background: #0c0c0c!important;
-moz-box-shadow: 0 0 0px #000;
-webkit-box-shadow: 0 0 0px #000;


if ($.isEmptyObject(filter[boardId][threadId])) {
delete filter[boardId][threadId];
delete list.nextPurge[boardId][threadId];


if ($.isEmptyObject(filter[boardId])) {
delete filter[boardId];
delete list.nextPurge[boardId];
}
}
setList(list);
}
}
};


/*
*  hide/show the specified thread/post
*/
function hide(ele) {
var $ele = $(ele);


}
if ($(ele).data('hidden'))
.bar.top
return;
{
border: solid  1px #e8e8e3;
box-shadow: 0px 1px #d2e7e8;


}
$(ele).data('hidden', true);
.bar.bottom
if ($ele.hasClass('op')) {
{
$ele.parent().find('.body, .files, .video-container').not($ele.children('.reply').children()).hide();
border-top: 0px solid #666;
border: solid  1px #e8e8e3;


// hide thread replies on index view
if (active_page == 'index' || active_page == 'ukko') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').hide();
} else {
// normal posts
$ele.children('.body, .files, .video-container').hide();
}
}
function show(ele) {
var $ele = $(ele);


}
$(ele).data('hidden', false);
div.pages
if ($ele.hasClass('op')) {
{
$ele.parent().find('.body, .files, .video-container').show();
color: #d2e7e8 ;
if (active_page == 'index') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').show();
background: #333;
} else {
border: #666 0px solid;
// normal posts
font-family: sans-serif;
$ele.children('.body, .files, .video-container').show();
font-size: 10pt;
}
}
}
div.pages a.selected
 
{
/*
color: #d2e7e8 ;
*  create filter menu when the button is clicked
}
*/
hr
function initPostMenu(pageData) {
{
var Menu = window.Menu;
height: 0px;
var submenu;
border: #e8e8e3 2px solid;
Menu.add_item('filter-menu-hide', _('Hide post'));
Menu.add_item('filter-menu-unhide', _('Unhide post'));


}
submenu = Menu.add_submenu('filter-menu-add', _('Add filter'));
div.boardlist
submenu.add_item('filter-add-post-plus', _('Post +'), _('Hide post and all replies'));
{
submenu.add_item('filter-add-id', _('ID'));
color: #e8e8e3;
submenu.add_item('filter-add-id-plus', _('ID +'), _('Hide ID and all replies'));
}
submenu.add_item('filter-add-name', _('Name'));
submenu.add_item('filter-add-trip', _('Tripcode'));


div.ban
submenu = Menu.add_submenu('filter-menu-remove', _('Remove filter'));
{
submenu.add_item('filter-remove-id', _('ID'));
background-color: #0d1010;
submenu.add_item('filter-remove-name', _('Name'));
border: 0px solid #555;
submenu.add_item('filter-remove-trip', _('Tripcode'));
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
text-align: left!important;
font-size: 13px;


}
Menu.onclick(function (e, $buffer) {
div.ban h2
var ele = e.target.parentElement.parentElement;
{
var $ele = $(ele);
background: #333;
color: #e8e8e3;
padding: 3px 7px;
font-size: 12pt;
border-bottom: 1px solid #555;
}
div.ban h2:not(:nth-child(1))
{
border-top: 0px solid #555;
}
table.modlog tr th
{
background: #333;
color: #AAA;
}


div.report
var threadId = $ele.parent().attr('id').replace('thread_', '');
{
var boardId = $ele.parent().data('board');
color: #666;
var postId = $ele.find('.post_no').not('[id]').text();
}
if (pageData.hasUID) {
.pages, .board_image, input, .reply, form table th, textarea, a img, select, .banner
var postUid = $ele.find('.poster_id').text();
{
}
        -webkit-border-radius: 2px;
        -khtml-border-radius: 2px;
        -moz-border-radius: 2px;
-o-border-radius: 2px;
-ms-border-radius: 2px;
        border-radius: 2px;
}
.blur
{
    filter: blur(20px);
    -webkit-filter: blur(23px);
    -moz-filter: blur(23px);
    -o-filter: blur(23px);
    -ms-filter: blur(23px);
    filter: url(svg/blur.svg#blur);
}


/* options.js */
var postName;
#options_div
var postTrip = '';
{
if (!pageData.forcedAnon) {
      background: #333333;
postName = (typeof $ele.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($ele.find('.name')[0]);
}
postTrip = $ele.find('.trip').text();
.options_tab_icon
}
{
      color: #AAAAAA;
}
.options_tab_icon.active
{
      color: #FFFFFF;
}


/*  display logic and bind click handlers
*/


// unhide button
if ($ele.data('hidden')) {
$buffer.find('#filter-menu-unhide').click(function () {
//  if hidden due to post id, remove it from blacklist
//  otherwise just show this post
blacklist.remove.post(boardId, threadId, postId);
show(ele);
});
$buffer.find('#filter-menu-hide').addClass('hidden');
} else {
$buffer.find('#filter-menu-unhide').addClass('hidden');
$buffer.find('#filter-menu-hide').click(function () {
blacklist.add.post(boardId, threadId, postId, false);
});
}


.blotter
//  post id
{
if (!$ele.data('hiddenByPost')) {
color: #e8e8e3!important;
$buffer.find('#filter-add-post-plus').click(function () {
}
blacklist.add.post(boardId, threadId, postId, true);
s` : ""}
});
 
} else {
$buffer.find('#filter-add-post-plus').addClass('hidden');
}


// UID
if (pageData.hasUID && !$ele.data('hiddenByUid')) {
$buffer.find('#filter-add-id').click(function () {
blacklist.add.uid(boardId, threadId, postUid, false);
});
$buffer.find('#filter-add-id-plus').click(function () {
blacklist.add.uid(boardId, threadId, postUid, true);
});


$buffer.find('#filter-remove-id').addClass('hidden');
} else if (pageData.hasUID) {
$buffer.find('#filter-remove-id').click(function () {
blacklist.remove.uid(boardId, threadId, postUid);
});


${themeEnabled("leftypol") ? `
$buffer.find('#filter-add-id').addClass('hidden');
body {
$buffer.find('#filter-add-id-plus').addClass('hidden');
background: #1E1E1E;
} else {
color: #999999;
// board doesn't use UID
font-family: Verdana, sans-serif;
$buffer.find('#filter-add-id').addClass('hidden');
font-size: 14px;
$buffer.find('#filter-add-id-plus').addClass('hidden');
}
$buffer.find('#filter-remove-id').addClass('hidden');
.quote {
}
    color:#B8D962;
}
@font-face {
  font-family: 'lain';
  src: url('./fonts/nrdyyh.woff') format('woff'),
        url('./fonts/tojcxo.TTF') format('truetype');
}
h1
{
letter-spacing: -2px;
font-size: 20pt;
text-align: center;
color: #32DD72;
}
div.title, h1 {
color: #32DD72;
}
div.title p {
font-size: 10px;
}
a:link, a:visited, .intro a.email span.name {
color: #CCCCCC;
text-decoration: none;
font-family: sans-serif;
}
a:link:hover, a:visited:hover {
color: #fff;
font-family: sans-serif;
text-decoration: none;
}
a.post_no {
color: #AAAAAA;
text-decoration: none;
}
a.post_no:hover {
color: #32DD72 !important;
text-decoration: underline overline;
}
div.post.reply {
background: #333333;
border: #555555 1px solid;
}
div.post.reply.highlighted {
background: #555;
border: transparent 1px solid;
}
div.post.reply div.body a:link, div.post.reply div.body a:visited {
color: #CCCCCC;
}
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover {
color: #32DD72;
}
.intro span.subject {
font-size: 12px;
font-family: sans-serif;
color: #446655;
font-weight: 800;
}
.intro span.name {
color: #32DD72;
font-weight: 800;
}
.intro a.capcode, p.intro a.nametag {
color: magenta;
margin-left: 0;
}
.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
color: #32ddaf;
}
input[type="text"], textarea, select {
background: #333333;
color: #CCCCCC;
border: #666666 1px solid;
padding-left: 5px;
padding-right: -5px;
font-family: sans-serif;
font-size: 10pt;
}
input[type="password"] {
background: #333333;
color: #CCCCCC;
border: #666666 1px solid;
}
form table tr th {
background: #333333;
color: #AAAAAA;
font-weight: 800;
text-align: left;
padding: 0;
}
div.banner {
background: #32DD72;
color: #000;
text-align: center;
width: 250px;
padding: 4px;
padding-left: 12px;
padding-right: 12px;
margin-left: auto;
margin-right: auto;
font-size: 12px;
}
div.banner a {
    color:#000;
}
input[type="submit"] {
background: #333333;
border: #888888 1px solid;
color: #CCCCCC;
}
input[type="submit"]:hover {
background: #555555;
border: #888888 1px solid;
color: #32DD72;
}
input[type="text"]:focus {
    border:#aaa 1px solid;
}
p.fileinfo a:hover {
text-decoration: underline;
}
span.trip {
color: #AAAAAA;
}
div.pages {
background: #1E1E1E;
font-family: sans-serif;
}
.bar.bottom {
    bottom: 0px;
    border-top: 1px solid #333333;
    background-color: #1E1E1E;
}
div.pages a.selected {
color: #CCCCCC;
}
hr {
height: 1px;
border: #333333 1px solid;
}
div.boardlist {
text-align: center;
color: #999999;
}
div.ban {
background-color: transparent;
border: transparent 0px solid;
}
div.ban h2 {
background: transparent;
color: lime;
font-size: 12px;
}
table.modlog tr th {
background: #333333;
color: #AAAAAA;
}
div.boardlist:not(.bottom) {
  background-color: #1E1E1E;


  }
// name
.desktop-style div.boardlist:not(.bottom) {
if (!pageData.forcedAnon && !$ele.data('hiddenByName')) {
  position:static;
$buffer.find('#filter-add-name').click(function () {
  text-shadow: black 1px 1px 1px, black -1px -1px 1px, black -1px 1px 1px, black 1px -1px 1px;
addFilter('name', postName, false);
  color: #999999;
});
  background-color: #1E1E1E;
}
div.report {
color: #666666;
}
#options_div, #alert_div {
background: #333333;
}
.options_tab_icon {
color: #AAAAAA;
}
.options_tab_icon.active {
color: #FFFFFF;
}
#quick-reply table {
background: none repeat scroll 0% 0% #333 !important;
}
.modlog tr:nth-child(even), .modlog th {
background-color: #282A2E;
}
.box {
background: #333333;
border-color: #555555;
color: #C5C8C6;
border-radius: 10px;
}
.box-title {
background: transparent;
color: #32DD72;
}
table thead th {
background: #333333;
border-color: #555555;
color: #C5C8C6;
border-radius: 4px;
}
table tbody tr:nth-of-type( even ) {
background-color: #333333;
}
table.board-list-table .board-uri .board-sfw {
color: #CCCCCC;
}
tbody.board-list-omitted td {
background: #333333;
border-color: #555555;
}
table.board-list-table .board-tags .board-cell:hover {
background: #1e1e1e;
}
table.board-list-table tr:nth-of-type( even ) .board-tags .board-cell {
background: #333333;
}
/* red accents */
div.blotter, h1, h2, header div.subtitle, div.title, a:link:hover, a:visited:hover p.intro a.post_no:hover,
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover, p.intro span.name,
p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name,
input[type="submit"]:hover, div.ban h2 {
color: #DD3232;
}


p.intro span.subject {
$buffer.find('#filter-remove-name').addClass('hidden');
color: #962C22;
} else if (!pageData.forcedAnon) {
}` : ""}
$buffer.find('#filter-remove-name').click(function () {
removeFilter('name', postName, false);
});


$buffer.find('#filter-add-name').addClass('hidden');
} else {
// board has forced anon
$buffer.find('#filter-remove-name').addClass('hidden');
$buffer.find('#filter-add-name').addClass('hidden');
}


${themeEnabled("colorjak") ? `
//  tripcode
if (!pageData.forcedAnon && !$ele.data('hiddenByTrip') && postTrip !== '') {
$buffer.find('#filter-add-trip').click(function () {
addFilter('trip', postTrip, false);
});


*{
$buffer.find('#filter-remove-trip').addClass('hidden');
    background-image: url('https://soyjak.download/f.php?h=0ubQjIwX&p=1');
} else if (!pageData.forcedAnon && postTrip !== '') {
}
$buffer.find('#filter-remove-trip').click(function () {
removeFilter('trip', postTrip, false);
});


.soifish {
$buffer.find('#filter-add-trip').addClass('hidden');
    background-image: ('https//files.catbox.moe/rxmvyr.png');
} else {
    position: absolute;
// board has forced anon
    -webkit-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
$buffer.find('#filter-remove-trip').addClass('hidden');
    -moz-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
$buffer.find('#filter-add-trip').addClass('hidden');
    -o-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
}
    animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
}


@-webkit-keyframes moveX {
/*  hide sub menus if all items are hidden
    from { left: 0; } to { left: 100%; }
*/
}
if (!$buffer.find('#filter-menu-remove > ul').children().not('.hidden').length) {
@-moz-keyframes moveX {
$buffer.find('#filter-menu-remove').addClass('hidden');
    from { left: 0; } to { left: 100%; }
}
}
if (!$buffer.find('#filter-menu-add > ul').children().not('.hidden').length) {
@-o-keyframes moveX {
$buffer.find('#filter-menu-add').addClass('hidden');
    from { left: 0; } to { left: 100%; }
}
}
});
@keyframes moveX {
}
    from { left: 0; } to { left: 100%;}
}


@-webkit-keyframes moveY {
/*
    from { top: 0; } to { top: 100%; }
*  hide/unhide thread on index view
}
*/
@-moz-keyframes moveY {
function quickToggle(ele, threadId, pageData) {
    from { top: 0; } to { top: 100%; }
/*if ($(ele).find('.hide-thread-link').length)
}
$('.hide-thread-link').remove();*/
@-o-keyframes moveY {
    from { top: 0; } to { top: 100%; }
}
@keyframes moveY {
    from { top: 0; } to { top: 100%; }
}


` : ""}
if ($(ele).hasClass('op') && !$(ele).find('.hide-thread-link').length) {
$('<a class="hide-thread-link" style="float:left;margin-right:5px" href="javascript:void(0)">[' + ($(ele).data('hidden') ? '+' : '&ndash;') + ']</a>')
.insertBefore($(ele).find(':not(h2,h2 *):first'))
.click(function() {
var postId = $(ele).find('.post_no').not('[id]').text();
var hidden = $(ele).data('hidden');
var boardId = $(ele).parents('.thread').data('board');
if (hidden) {
blacklist.remove.post(boardId, threadId, postId, false);
$(this).html('[&ndash;]');
} else {
blacklist.add.post(boardId, threadId, postId, false);
$(this).text('[+]');
}
});
}
}


/*
*  determine whether the reply post should be hidden
*  - applies to all posts on page load or filtering rule change
*  - apply to new posts on thread updates
*  - must explicitly set the state of each attributes because filter will reapply to all posts after filtering rule change
*/
function filter(post, threadId, pageData) {
var $post = $(post);


${themeEnabled("cafe") ? `
var list = getList();
body{background:#fdfdfe;color:#666;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;margin:0 8px;padding-left:5px;padding-right:5px}table *{margin:0}a,a:visited{text-decoration:none;color:#2b0f51!important}a.post_no{text-decoration:none;margin:0;padding:0}p.intro a.post_no{color:inherit}p.intro a.post_no,p.intro a.email{margin:0}p.intro a.email span.name{color:#34345c}p.intro a.email:hover span.name{color:red}p.intro label{display:inline}p.intro time,p.intro a.ip-link,p.intro a.capcode{direction:ltr;unicode-bidi:embed}h2{color:#af0a0f;font-size:11pt;margin:0;padding:0}header{margin:1em 0}h1{font-family:tahoma;letter-spacing:-2px;font-size:20pt;margin:0}header div.subtitle,h1{color:#af0a0f;text-align:center}header div.subtitle{font-size:8pt}form{margin-bottom:2em!important}form table{margin:auto}form table input{height:auto}input[type=text],input[type=password],textarea{border:1px solid #a9a9a9;text-indent:0;text-shadow:none;text-transform:none;word-spacing:normal}form table tr td{text-align:left;margin:0;padding:0}form table.mod tr td{padding:2px}form table tr th{text-align:left;padding:4px}form table tr th{background:#98e}form table tr td div{text-align:center;float:left;padding-left:3px}form table tr td div input{display:block;margin:2px auto 0}form table tr td div label{font-size:10px}.unimportant,.unimportant *{font-size:10px}p.fileinfo{display:block;margin:0;padding-right:7em}div.banner{background-color:#ffb0aa;text-align:center;font-size:12pt;font-weight:700;text-align:center;margin:1em 0;padding-bottom:2px}div.banner,div.banner a{color:#fff}div.banner a:hover{color:#eef2ff;text-decoration:none}img.banner{display:block;width:300px;height:100px;border:1px solid #a9a9a9;margin:20px auto 0}img.post-image{display:block;float:left;margin:10px 20px;border:none}div.post img.post-image{padding:5px;margin:5px 20px 0 0}div.post img.icon{display:inline;margin:0 5px;padding:0}div.post i.fa{margin:0 4px;font-size:16px}div.post.op{margin-right:20px;margin-bottom:5px}div.post.op hr{border-color:#d9bfb7}p.intro{margin:.5em 0;padding:0;padding-bottom:.2em}input.delete{float:left;margin:1px 6px 0 0}p.intro span.subject{color:#0f0c5d;font-weight:700}p.intro span.name{color:#117743;font-weight:700}p.intro span.capcode,p.intro a.capcode,p.intro a.nametag{color:#f00000;margin-left:0}p.intro a{margin-left:8px}div.delete{float:right}div.post.reply p{margin:.3em 0 0}div.post.reply div.body{margin-left:1.8em;margin-top:.8em;padding-right:3em;padding-bottom:.3em}div.post.reply.highlighted{background:#d6bad0}div.post.reply div.body a{color:#d00}div.post{max-width:97%}div.post div.body{word-wrap:break-word;white-space:pre-wrap}div.post.reply{background:#d6daf0;margin:.2em 16px;padding:.2em .3em .5em .7em;border-width:1px;border-style:none solid solid none;border-color:#b7c5d9;display:inline-block}span.trip{color:#228854}span.quote{color:#789922}span.omitted{display:block;margin-top:1em}br.clear{clear:left;display:block}span.controls{float:right;margin:0;padding:0;font-size:80%}span.controls.op{float:none;margin-left:10px}span.controls a{margin:0}div#wrap{width:900px;margin:0 auto}div.ban{background:#fff;border:1px solid #98e;max-width:700px;margin:30px auto}div.ban p,div.ban h2{padding:3px 7px}div.ban h2{background:#98e;color:#000;font-size:12pt}div.ban p{font-size:12px;margin-bottom:12px}div.ban p.reason{font-weight:700}span.heading{color:#af0a0f;font-size:11pt;font-weight:700}span.spoiler{background:#000;color:#000;padding:0 1px}div.post.reply div.body span.spoiler a{color:#000}span.spoiler:hover,div.post.reply div.body span.spoiler:hover a{color:#fff}div.styles{float:right;padding-bottom:20px}div.styles a{margin:0 10px}div.styles a.selected{text-decoration:none}table.test{width:100%}table.test td,table.test th{text-align:left;padding:5px}table.test tr.h th{background:#98e}table.test td img{margin:0}fieldset label{display:block}div.pages{color:#89a;background:#d6daf0;display:inline;padding:8px;border-right:1px solid #b7c5d9;border-bottom:1px solid #b7c5d9}div.pages.top{display:block;padding:5px 8px;margin-bottom:5px;position:fixed;top:0;right:0;opacity:.9}@media screen and (max-width:800px){div.pages.top{display:none!important}}div.pages a.selected{color:#000;font-weight:bolder}div.pages a{text-decoration:none}div.pages form{margin:0;padding:0;display:inline}div.pages form input{margin:0 5px;display:inline}hr{border:none;border-top:1px solid #b7c5d9;height:0;clear:left}div.boardlist{color:#89a;font-size:9pt;margin-top:3px}div.boardlist.bottom{margin-top:30px!important}div.boardlist a{text-decoration:none}div.report{color:#333}table.modlog{margin:auto;width:100%}table.modlog tr td{text-align:left;margin:0;padding:4px 15px 0 0}table.modlog tr th{text-align:left;padding:4px 15px 5px 5px;white-space:nowrap}table.modlog tr th{background:#98e}td.minimal,th.minimal{width:1%;white-space:nowrap}div.top_notice{text-align:center;margin:5px auto}span.public_ban{display:block;color:red;font-weight:700;margin-top:15px}span.toolong{display:block;margin-top:15px}div.blotter{color:red;font-weight:700;text-align:center}table.mod.config-editor{font-size:9pt;width:100%}table.mod.config-editor td{text-align:left;padding:5px;border-bottom:1px solid #98e}table.mod.config-editor input[type=text]{width:98%}p.intro.thread-hidden{margin:0;padding:0}form.ban-appeal{margin:9px 20px}form.ban-appeal textarea{display:block}.theme-catalog div.thread img{float:none!important;margin:auto;margin-bottom:12px;max-height:150px;max-width:200px;box-shadow:0 0 4px rgba(0,0,0,.55);border:2px solid transparent}.theme-catalog div.thread{display:inline-block;vertical-align:top;margin-bottom:25px;margin-left:20px;margin-right:15px;text-align:center;font-weight:400;width:205px;overflow:hidden;position:relative;font-size:11px;padding:15px;max-height:300px;background:rgba(182,182,182,.12);border:2px solid rgba(111,111,111,.34)}.theme-catalog div.thread strong{display:block}.compact-boardlist{padding:3px;padding-bottom:0}.compact-boardlist .cb-item{display:inline-block;vertical-align:middle}.compact-boardlist .cb-icon{padding-bottom:1px}.compact-boardlist .cb-fa{font-size:21px;padding:2px;padding-top:0}.compact-boardlist .cb-cat{padding:5px 6px 8px}.cb-menuitem{display:table-row}.cb-menuitem span{padding:5px;display:table-cell;text-align:left;border-top:1px solid rgba(0,0,0,.5)}.cb-menuitem span.cb-uri{text-align:right}.boardlist:not(.compact-boardlist) #watch-pinned::before{content:" [ "}.boardlist:not(.compact-boardlist) #watch-pinned::after{content:" ] "}.boardlist:not(.compact-boardlist) #watch-pinned{display:inline}.boardlist:not(.compact-boardlist) #watch-pinned a{margin-left:3pt}.boardlist:not(.compact-boardlist) #watch-pinned a:first-child{margin-left:0}.compact-boardlist #watch-pinned{display:inline-block;vertical-align:middle}video.post-image{display:block;float:left;margin:10px 20px;border:none}div.post video.post-image{padding:0;margin:10px 25px 5px 5px}span.settings{display:inline;float:right;margin-left:10px;margin-top:30px}.archive-link{font-weight:700;margin-left:5px;color:#1100c0!important}.blinker{color:#ff0404;font-family:comic sans ms;font-size:115%}.mentioned{word-wrap:break-word}.yt-dl-link{font-weight:700}.yt-dl-embed{float:left;clear:both;margin:5px 0 12px 5px}.video-container+.body{clear:left}.label-block{margin:10px 10px 0 5px}.label-img{display:inline-block;padding:5px;max-height:90px}.capcode-owner{color:#9370db!important;font-weight:700}#canvas-loading{display:none;background-image:url(https://i.imgur.com/c7z4Rx0.gif);width:20px;height:20px}#canvas-box{display:none}#literally-canvas{height:500px;width:600px}.canvas-button{cursor:pointer}#show-oekaki{cursor:pointer}.lol{cursor:pointer}#search-bar{width:25%;padding-top:10px;margin-bottom:25px;margin-left:5px}.forum-using{padding-left:3px;font-style:italic}.use-button{margin-left:2px}.reset-button{margin-left:5px}.avatar.forum{display:none}.signature.forum{display:none}.signature-text-forum{display:none}#chatango-prompt{margin-top:35px;margin-bottom:45px;margin-left:63px;width:160px;cursor:pointer;font-weight:700}.hide-chatango iframe[width='75px']{display:none!important}body{background-image:url(https://i.imgur.com/P31ggRr.png);color:#666;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;margin:0 8px;padding-left:5px;padding-right:5px}hr{border:none;border-top:1px solid #649e66;height:0;clear:left}div.pages.top{display:block;padding:5px 8px;margin-bottom:5px;position:fixed;top:3px;right:3px;opacity:.9;border-radius:5px}div.pages{color:#6d6d6d;background:#ffd0cd;display:inline;padding:8px;border-right:1px solid #da7c75;border-bottom:1px solid #c17b76;border-radius:5px}form table tr th{padding:3px 5px 4px 4px!important;font-size:97%!important;background:rgba(34,228,85,.16);border-radius:7px}div.post.reply{background:#d7ffd8;margin:.2em 16px;padding:.2em .3em .5em .7em!important;border-width:1px;border-style:none solid solid none;border-color:#6cce70;display:inline-block;border-radius:10px}div.post.reply.highlighted{background:#ffd2cf;border-color:#e69994}div.blotter{color:#af0a0f;font-weight:700;text-align:center}header div.subtitle,h1{color:##b1362d;text-align:center}p.intro span.subject{color:#fd4b4b;font-weight:700}#spoiler{padding-left:3px;margin-left:3px;margin-right:3px}#sage{padding-left:3px;margin-left:3px;margin-right:3px}.sage-tip{font-size:85%;color:#a8ada8}.post-arrow{font-size:12px!important;margin-left:0!important}a.arrow-post-options:hover{color:#4e366f!important}.date-link{color:#807e7e!important;font-size:11.5px;margin-right:6px!important}a.date-link:hover{color:#807e7e!important;text-decoration:underline}.thread-hide-button{margin-right:1px;font-size:95%}.fileinfo a{font-size:85%}.fileinfo.reply{margin-left:3px!important}.boardlist{text-align:center!important;font-size:9.3pt!important;margin-top:6px!important;margin-bottom:24px!important}.scroll-button{color:#1a4c0a!important}
var postId = $post.find('.post_no').not('[id]').text();
var name, trip, uid, subject, comment;
var i, length, array, rule, pattern; // temp variables


.desktop-style div.boardlist:nth-child(1) {
var boardId       = $post.data('board');
background-color: rgba(255,0,0,0);
if (!boardId) boardId = $post.parents('.thread').data('board');
}


var localList  = pageData.localList;
var noReplyList = pageData.noReplyList;
var hasUID      = pageData.hasUID;
var forcedAnon  = pageData.forcedAnon;


` : ""}
var hasTrip = ($post.find('.trip').length > 0);
 
var hasSub = ($post.find('.subject').length > 0);
 
</style>
`);


$post.data('hidden', false);
$post.data('hiddenByUid', false);
$post.data('hiddenByPost', false);
$post.data('hiddenByName', false);
$post.data('hiddenByTrip', false);
$post.data('hiddenBySubject', false);
$post.data('hiddenByComment', false);


// add post with matched UID to localList
if (hasUID &&
typeof list.postFilter[boardId] != 'undefined' &&
typeof list.postFilter[boardId][threadId] != 'undefined') {
uid = $post.find('.poster_id').text();
array = list.postFilter[boardId][threadId];


for (i=0; i<array.length; i++) {
if (array[i].uid == uid) {
$post.data('hiddenByUid', true);
localList.push(postId);
if (array[i].hideReplies) noReplyList.push(postId);
break;
}
}
}


initFixes();
// match localList
</pre>
if (localList.length) {
|}
if ($.inArray(postId, localList) != -1) {
if ($post.data('hiddenByUid') !== true) $post.data('hiddenByPost', true);
hide(post);
}
}


====SoyParty-X====
// matches generalFilter
Features:
if (!forcedAnon)
name = (typeof $post.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($post.find('.name')[0]);
if (!forcedAnon && hasTrip)
trip = $post.find('.trip').text();
if (hasSub)
subject = $post.find('.subject').text();


* Detects flood posts and hides them (you can set amount of lines and words to hide)
array = $post.find('.body').contents().filter(function () {if ($(this).text() !== '') return true;}).toArray();
array = $.map(array, function (ele) {
return $(ele).text().trim();
});
comment = array.join(' ');


* Forced anonymity (hides namefags, can be disabled)


* Hides emailfags or sagefags (can be disabled for sagefags)
for (i = 0, length = list.generalFilter.length; i < length; i++) {
rule = list.generalFilter[i];


* Highlights triple parentheses
if (rule.regex) {
 
pattern = new RegExp(rule.value);
* Highlights datamining (makes posts glow)
switch (rule.type) {
 
case 'name':
* Inline Youtube Previews (+invidious support)
if (!forcedAnon && pattern.test(name)) {
 
$post.data('hiddenByName', true);
* Replaces "Gem" and "Coal" with minecraft icons
hide(post);
 
}
* Replaces "Bump" and "Sage" with upvote and downvote icons
break;
<i>Expand to view the script</i>
case 'trip':
{| class="mw-collapsible mw-collapsed"
if (!forcedAnon && hasTrip && pattern.test(trip)) {
|+
$post.data('hiddenByTrip', true);
|<pre>// ==UserScript==
hide(post);
// @name        SoyParty-X
}
// @namespace    datamining
break;
// @version      0.2
case 'sub':
// @description  Cure the cancer that is killing soyjak.party
if (hasSub && pattern.test(subject)) {
// @author      Chud (You)
$post.data('hiddenBySubject', true);
// @match        https://soyjak.party/*
hide(post);
// @icon        https://soyjak.party/static/favicon.png
}
// @grant        none
break;
// ==/UserScript==
case 'com':
 
if (pattern.test(comment)) {
/* eslint-env jquery */
$post.data('hiddenByComment', true);
 
hide(post);
/*
}
 
break;
Changelog:
}
 
} else {
0.2:
switch (rule.type) {
case 'name':
if (!forcedAnon && rule.value == name) {
$post.data('hiddenByName', true);
hide(post);
}
break;
case 'trip':
if (!forcedAnon && hasTrip && rule.value == trip) {
$post.data('hiddenByTrip', true);
hide(post);
}
break;
case 'sub':
pattern = new RegExp('\\b'+ rule.value+ '\\b');
if (hasSub && pattern.test(subject)) {
$post.data('hiddenBySubject', true);
hide(post);
}
break;
case 'com':
pattern = new RegExp('\\b'+ rule.value+ '\\b');
if (pattern.test(comment)) {
$post.data('hiddenByComment', true);
hide(post);
}
break;
}
}
}


- hidePosts() now detects flood posts.
// check for link to filtered posts
$post.find('.body a').not('[rel="nofollow"]').each(function () {
var replyId = $(this).text().match(/^>>(\d+)$/);


0.1:
if (!replyId)
return;
 
replyId = replyId[1];
if ($.inArray(replyId, noReplyList) != -1) {
hide(post);
}
});


- hidePosts()
// post didn't match any filters
- forcedAnonymity()
if (!$post.data('hidden')) {
- highlightTripleParentheses()
show(post);
- highlightDatamining()
}
- inlineYoutubePreviews()
}
- replaceCoalAndGemsWithIcon()
- replaceBumpAndSageWithIcons()


*/
/*  (re)runs the filter on the entire page
*/
function filterPage(pageData) {
var list = getList();


(function SoyPartyX() {
if (active_page != 'catalog') {
  // true = hide posts where the e-mail is "sage".
  const _hideMailtoSage = true;


  // true = scrub email, trip, and force all names to be "Chud".
// empty the local and no-reply list
  // - Emailfags and tripfags are already hidden.
pageData.localList = [];
  // - Namefags aren't hidden, but turning this on will anonymize them.
pageData.noReplyList = [];
  // false = don't change posts (default).
  const _enableForcedAnonymity = false;


  // Sets the limit for a post to be considered a flood post.
$('.thread').each(function () {
  // If one of the criteria is met, the post is hidden.
var $thread = $(this);
  const floodThresholdLines = 30;
// disregard the hidden threads constructed by post-hover.js
  const floodThresholdCharacters = 3000;
if ($thread.css('display') == 'none')
return;


  hidePosts();
var threadId = $thread.attr('id').replace('thread_', '');
  forcedAnonymity(); // Must come AFTER hidePosts()
var boardId = $thread.data('board');
  highlightTripleParentheses();
var op = $thread.children('.op')[0];
  highlightDatamining();
var i, array; // temp variables
  inlineYoutubePreviews();
  replaceCoalAndGemsWithIcon();
  replaceBumpAndSageWithIcons();


  function hidePosts() {
// add posts to localList and noReplyList
    $(".post").each((i, el) => {
if (typeof list.postFilter[boardId] != 'undefined' && typeof list.postFilter[boardId][threadId] != 'undefined') {
      const $el = $(el);
array = list.postFilter[boardId][threadId];
      const reasons = [];
for (i=0; i<array.length; i++) {
if ( typeof array[i].post == 'undefined')
continue;


      const isOp = $el.hasClass("op");
pageData.localList.push(array[i].post);
if (array[i].hideReplies) pageData.noReplyList.push(array[i].post);
}
}
// run filter on OP
filter(op, threadId, pageData);
quickToggle(op, threadId, pageData);


      if ($el.has(".trip").length) {
// iterate filter over each post
        reasons.push("tripfag");
if (!$(op).data('hidden') || active_page == 'thread') {
      }
$thread.find('.reply').not('.hidden').each(function () {
      if (_hideMailtoSage && $el.has('a.email[href^="mailto:sage"]').length) {
filter(this, threadId, pageData);
        reasons.push("sagefag");
});
      }
}
      if ($el.has('a.email:not([href^="mailto:sage"])').length) {
        reasons.push("emailfag");
      }


      const body = $el.has(".body");
});
      const bodyLines = body.html().split("<br>").length;
} else {
      const bodyLength = body.text().length;
var postFilter = list.postFilter[pageData.boardId];
var $collection = $('.mix');


      if (
if ($.isEmptyObject(postFilter))
        bodyLines > floodThresholdLines ||
return;
        bodyLength > floodThresholdCharacters
      ) {
        reasons.push(
          `possible flooding: ${bodyLength} characters in ${bodyLines} lines`
        );
      }


      if (reasons.length) {
// for each thread that has filtering rules
        const $notice = $("<div>")
// check if filter contains thread OP and remove the thread from catalog
          .addClass(`post ${isOp ? "op" : "reply"}`)
$.each(postFilter, function (key, thread) {
          .html(
var threadId = key;
            `<div class='body'><em>Post hidden (${reasons.join(
$.each(thread, function () {
              ", "
if (this.post == threadId) {
            )}). Click to show.</em></div>`
$collection.filter('[data-id='+ threadId +']').remove();
          )
}
          .after($("<br>"));
});
        $notice.click(() => {
});
          $el.show();
}
          if (isOp) $el.prev(".files").show();
}
          $notice.hide();
        });
        $el.after($notice);
        $el.hide();
        if (isOp) $el.prev(".files").hide();
      }
    });
  }


  function forcedAnonymity() {
function initStyle() {
    if (!_enableForcedAnonymity) return;
var $ele, cssStyle, cssString;
    // Remove all emails.
    $("a.email").prop("outerHTML", "<span class='name'>Chud</span>");
    // Remove all tripcodes.
    $(".trip").prop("outerHTML", "");
    // Set all names to Chud.
    // Make sure not to overwrite (You)'s.
    $(".name")
      .filter((i, el) => !$(el).has(".own_post").length)
      .text("Chud");
  }


  function replaceWordWithIcon(re, icon) {
$ele = $('<div>').addClass('post reply').hide().appendTo('body');
    const matchesRe = (index, post) => $(post).html().match(re);
cssStyle = $ele.css(['background-color', 'border-color']);
cssStyle.hoverBg = $('body').css('background-color');
$ele.remove();


    const template = (match) =>
cssString = '\n/*** Generated by post-filter ***/\n' +
      `<img src="${icon}" style="max-height:2em; vertical-align:middle">`;
'#filter-control input[type=text] {width: 130px;}' +
'#filter-control input[type=checkbox] {vertical-align: middle;}' +
'#filter-control #clear {float: right;}\n' +
'#filter-container {margin-top: 20px; border: 1px solid; height: 270px; overflow: auto;}\n' +
'#filter-list {width: 100%; border-collapse: collapse;}\n' +
'#filter-list th {text-align: center; height: 20px; font-size: 14px; border-bottom: 1px solid;}\n' +
'#filter-list th:nth-child(1) {text-align: center; width: 70px;}\n' +
'#filter-list th:nth-child(2) {text-align: left;}\n' +
'#filter-list th:nth-child(3) {text-align: center; width: 58px;}\n' +
'#filter-list tr:not(#header) {height: 22px;}\n' +
'#filter-list tr:nth-child(even) {background-color:rgba(255, 255, 255, 0.5);}\n' +
'#filter-list td:nth-child(1) {text-align: center; width: 70px;}\n' +
'#filter-list td:nth-child(3) {text-align: center; width: 58px;}\n' +
'#confirm {text-align: right; margin-bottom: -18px; padding-top: 2px; font-size: 14px; color: #FF0000;}';


    const applyTemplate = (index, post) => {
if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
      const $post = $(post);
$('style.generated-css').html($('style.generated-css').html() + cssString);
      const html = $post.html();
}
      $post.html(html.replace(re, template));
    };


    $("div.body").filter(matchesRe).each(applyTemplate);
function drawFilterList() {
  }
var list = getList().generalFilter;
var $ele = $('#filter-list');
var $row, i, length, obj, val;


  function replaceCoalAndGemsWithIcon() {
var typeName = {
    replaceWordWithIcon(/coal/gi, "https://i.imgur.com/O9iRcRv.png");
name: 'name',
    replaceWordWithIcon(/gems?/gi, "https://i.imgur.com/BvjFdau.png");
trip: 'tripcode',
  }
sub: 'subject',
com: 'comment'
};


  function replaceBumpAndSageWithIcons() {
$ele.empty();
    // replaceWordWithIcon(/bump/gi, "https://i.imgur.com/zM2xOGh.png");
    // replaceWordWithIcon(/sage/gi, "https://i.imgur.com/2bsauzj.png");
    replaceWordWithIcon(/bump/gi, "https://i.imgur.com/Y7cpsW0.png");
    replaceWordWithIcon(/\bsage\b/gi, "https://i.imgur.com/ZarQtY3.png");
  }


  function highlightTripleParentheses() {
$ele.append('<tr id="header"><th>Type</th><th>Content</th><th>Remove</th></tr>');
    const re = /\(\(\(.+?\)\)\)/g;
for (i = 0, length = list.length; i < length; i++) {
    const hasRe = (i, post) => post.innerHTML.match(re);
obj = list[i];


    const template = (match) =>
// display formatting
      `<span style='background-color:white;color:#0038B8;font-family:monospace;'>${match}</span>`;
val = (obj.regex) ? '/'+ obj.value +'/' : obj.value;
    const applyTemplate = (i, post) => {
      post.innerHTML = post.innerHTML.replace(re, template);
    };


    $("div.body").filter(hasRe).each(applyTemplate);
$row = $('<tr>');
  }
$row.append(
 
'<td>'+ typeName[obj.type] +'</td>',
  function highlightDatamining() {
'<td>'+ val +'</td>',
    const reGlowie =
$('<td>').append(
      /data(\s*|-)min(ing|er|ed)|(sell|selling|sold)\s+(my|our)?\s+data|cuckflare|cloudflare|cloud fleur/i;
$('<a>').html('X')
    const hasReGlowie = (i, post) => post.innerHTML.match(reGlowie);
.addClass('del-btn')
    const applyTemplate = (i, post) =>
.attr('href', '#')
      $(post).css({
.data('type', obj.type)
        backgroundColor: "#D7EFD7",
.data('val', obj.value)
        boxShadow: "#66FF66 0 0 2rem 0",
.data('useRegex', obj.regex)
      });
)
    $(".reply").filter(hasReGlowie).each(applyTemplate);
);
  }
$ele.append($row);
}
}


  function inlineYoutubePreviews() {
function initOptionsPanel() {
    const re = /(?:youtu\.be\/|\/watch\?v=)(.{11})/;
if (window.Options && !Options.get_tab('filter')) {
    const previewTemplate = (videoId) =>
Options.add_tab('filter', 'list', _('Filters'));
      `<a href="https://youtube.com/watch?v=${videoId}">https://youtube.com/watch?v=${videoId}</a><br><img style="max-width:255px;max-height:255px" src="https://i.ytimg.com/vi/${videoId}/hqdefault.jpg" /><br><em>Watch on <a href="https://yewtu.be/${videoId}">Invidious</a> (less datamining)</em><br>`;
Options.extend_tab('filter',
    $(".body a")
'<div id="filter-control">' +
      .filter(function (i) {
'<select>' +
        return $(this).prop("href").match(re);
'<option value="name">'+_('Name')+'</option>' +
      })
'<option value="trip">'+_('Tripcode')+'</option>' +
      .each(function (i) {
'<option value="sub">'+_('Subject')+'</option>' +
        $(this).prop("outerHTML", previewTemplate(this.href.match(re)[1]));
'<option value="com">'+_('Comment')+'</option>' +
      });
'</select>' +
  }
'<input type="text">' +
})();
'<input type="checkbox">' +
</pre>
'regex ' +
|}
'<button id="set-filter">'+_('Add')+'</button>' +
====Post Filters====
'<button id="clear">'+_('Clear all filters')+'</button>' +
Allows you to filter posts based on comments, subject, name, and tripcode
'<div id="confirm" class="hidden">' +
To access filters click on options button.
_('This will clear all filtering rules including hidden posts.')+' <a id="confirm-y" href="#">'+_('yes')+'</a> | <a id="confirm-n" href="#">'+_('no')+'</a>' +
'</div>' +
'</div>' +
'<div id="filter-container"><table id="filter-list"></table></div>'
);
drawFilterList();
 
// control buttons
$('#filter-control').on('click', '#set-filter', function () {
var type = $('#filter-control select option:selected').val();
var value = $('#filter-control input[type=text]').val();
var useRegex = $('#filter-control input[type=checkbox]').prop('checked');
 
//clear the input form
$('#filter-control input[type=text]').val('');
 
addFilter(type, value, useRegex);
drawFilterList();
});
$('#filter-control').on('click', '#clear', function () {
$('#filter-control #clear').addClass('hidden');
$('#filter-control #confirm').removeClass('hidden');
});
$('#filter-control').on('click', '#confirm-y', function (e) {
e.preventDefault();
 
$('#filter-control #clear').removeClass('hidden');
$('#filter-control #confirm').addClass('hidden');
setList({
generalFilter: [],
postFilter: {},
nextPurge: {},
lastPurge: timestamp()
});
drawFilterList();
});
$('#filter-control').on('click', '#confirm-n', function (e) {
e.preventDefault();
 
$('#filter-control #clear').removeClass('hidden');
$('#filter-control #confirm').addClass('hidden');
});


<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|+
|<pre>
// @name        Post Filters for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Filter posts on soyjak.party
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
/*
* post-menu.js - adds dropdown menu to posts
*
* Creates a global Menu object with four public methods:
*
*  Menu.onclick(fnc)
*    registers a function to be executed after button click, before the menu is displayed
*  Menu.add_item(id, text[, title])
*    adds an item to the top level of menu
*  Menu.add_submenu(id, text)
*    creates and returns a List object through which to manipulate the content of the submenu
*  Menu.get_submenu(id)
*    returns the submenu with the specified id from the top level menu
*
*  The List object contains all the methods from Menu except onclick()
*
*  Example usage:
*    Menu.add_item('filter-menu-hide', 'Hide post');
*    Menu.add_item('filter-menu-unhide', 'Unhide post');
*
*    submenu = Menu.add_submenu('filter-menu-add', 'Add filter');
*        submenu.add_item('filter-add-post-plus', 'Post +', 'Hide post and all replies');
*        submenu.add_item('filter-add-id', 'ID');
* Usage:
*  $config['additional_javascript'][] = 'js/jquery.min.js';
*  $config['additional_javascript'][] = 'js/post-menu.js';
*/
$(document).ready(function () {


var List = function (menuId, text) {
// remove button
this.id = menuId;
$('#filter-list').on('click', '.del-btn', function (e) {
this.text = text;
e.preventDefault();
this.items = [];


this.add_item = function (itemId, text, title) {
var $ele = $(e.target);
this.items.push(new Item(itemId, text, title));
var type = $ele.data('type');
};
var val = $ele.data('val');
this.list_items = function () {
var useRegex = $ele.data('useRegex');
var array = [];
var i, length, obj, $ele;


if ($.isEmptyObject(this.items))
removeFilter(type, val, useRegex);
return;
});
}
}


length = this.items.length;
/*
for (i = 0; i < length; i++) {
*  clear out pruned threads
obj = this.items[i];
*/
function purge() {
var list = getList();
var board, thread, boardId, threadId;
var deferred;
var requestArray = [];


$ele = $('<li>', {id: obj.id}).text(obj.text);
var successHandler = function (boardId, threadId) {
if ('title' in obj) $ele.attr('title', obj.title);
return function () {
// thread still alive, keep it in the list and increase the time between checks.
var list = getList();
var thread = list.nextPurge[boardId][threadId];


if (obj instanceof Item) {
thread.timestamp = timestamp();
$ele.addClass('post-item');
thread.interval = Math.floor(thread.interval * 1.5);
} else {
setList(list);
$ele.addClass('post-submenu');
};
};
var errorHandler = function (boardId, threadId) {
return function (xhr) {
if (xhr.status == 404) {
var list = getList();


$ele.prepend(obj.list_items());
delete list.nextPurge[boardId][threadId];
$ele.append($('<span>', {class: 'post-menu-arrow'}).text('»'));
delete list.postFilter[boardId][threadId];
if ($.isEmptyObject(list.nextPurge[boardId])) delete list.nextPurge[boardId];
if ($.isEmptyObject(list.postFilter[boardId])) delete list.postFilter[boardId];
setList(list);
}
};
};
 
if ((timestamp() - list.lastPurge) < 86400) // less than 1 day
return;
for (boardId in list.nextPurge) {
board = list.nextPurge[boardId];
for (threadId in board) {
thread = board[threadId];
if (timestamp() > (thread.timestamp + thread.interval)) {
// check if thread is pruned
deferred = $.ajax({
cache: false,
url: '/'+ boardId +'/res/'+ threadId +'.json',
success: successHandler(boardId, threadId),
error: errorHandler(boardId, threadId)
});
requestArray.push(deferred);
}
}
}
}


array.push($ele);
// when all requests complete
$.when.apply($, requestArray).always(function () {
var list = getList();
list.lastPurge = timestamp();
setList(list);
});
}
}


return $('<ul>').append(array);
function init() {
};
if (typeof localStorage.postFilter === 'undefined') {
this.add_submenu = function (menuId, text) {
localStorage.postFilter = JSON.stringify({
var ele = new List(menuId, text);
generalFilter: [],
this.items.push(ele);
postFilter: {},
return ele;
nextPurge: {},
};
lastPurge: timestamp()
this.get_submenu = function (menuId) {
});
for (var i = 0; i < this.items.length; i++) {
}
if ((this.items[i] instanceof Item) || this.items[i].id != menuId) continue;
return this.items[i];
}
};
};


var Item = function (itemId, text, title) {
var pageData = {
this.id = itemId;
boardId: board_name, // get the id from the global variable
this.text = text;
localList: [], // all the blacklisted post IDs or UIDs that apply to the current page
noReplyList: [],  // any posts that replies to the contents of this list shall be hidden
hasUID: (document.getElementsByClassName('poster_id').length > 0),
forcedAnon: ($('th:contains(Name)').length === 0)  // tests by looking for the Name label on the reply form
};


// optional
initStyle();
if (typeof title != 'undefined') this.title = title;
initOptionsPanel();
};
initPostMenu(pageData);
filterPage(pageData);


function buildMenu(e) {
// on new posts
var pos = $(e.target).offset();
$(document).on('new_post', function (e, post) {
var i, length;
var threadId;


var $menu = $('<div class="post-menu"></div>').append(mainMenu.list_items());
if ($(post).hasClass('reply')) {
threadId = $(post).parents('.thread').attr('id').replace('thread_', '');
} else {
threadId = $(post).attr('id').replace('thread_', '');
post = $(post).children('.op')[0];
}


//  execute registered click handlers
filter(post, threadId, pageData);
length = onclick_callbacks.length;
quickToggle(post, threadId, pageData);
for (i = 0; i < length; i++) {
});
onclick_callbacks[i](e, $menu);
}


// set menu position and append to page
$(document).on('filter_page', function () {
$menu.css({top: pos.top, left: pos.left + 20});
filterPage(pageData);
$('body').append($menu);
});
 
// shift+click on catalog to hide thread
if (active_page == 'catalog') {
$(document).on('click', '.mix', function(e) {
if (e.shiftKey) {
var threadId = $(this).data('id').toString();
var postId = threadId;
blacklist.add.post(pageData.boardId, threadId, postId, false);
}
});
}
 
// clear out the old threads
purge();
}
init();
});
if (typeof window.Menu !== "undefined") {
$(document).trigger('menu_ready');
}
}
}


function addButton(post) {
</pre>
var $ele = $(post);
|}
$ele.find('input.delete').after(
$('<a>', {href: '#', class: 'post-btn', title: 'Post menu'}).text('▶')
);
}


==== Mass reply ====
<big><i>This is now included in  [[#Sharty fixes|Sharty Fixes]]</i></big>


/* * * * * * * * * *
Reply to everyone in a thread.
    Public methods
* * * * * * * * * */
var Menu = {};
var mainMenu = new List();
var onclick_callbacks = [];


Menu.onclick = function (fnc) {
<i>Expand to view the script</i>
onclick_callbacks.push(fnc);
{| class="mw-collapsible mw-collapsed"
};
|+
|


Menu.add_item = function (itemId, text, title) {
<pre>
mainMenu.add_item(itemId, text, title);
// ==UserScript==
};
// @name        Mass Reply for soyjak.party
 
// @namespace    datamining
Menu.add_submenu = function (menuId, text) {
// @version      0.1
return mainMenu.add_submenu(menuId, text);
// @description  Mass reply
};
// @author      Chud (You)
 
// @match        https://soyjak.party/*
Menu.get_submenu = function (id) {
// @icon        https://soyjak.party/static/favicon.png
return mainMenu.get_submenu(id);
// @grant        none
};
// ==/UserScript==
 
(function () {
window.Menu = Menu;
  function insert_after(new_node, ref_node) {
 
    ref_node.parentNode.insertBefore(new_node, ref_node.nextSibling);
 
  }
/* * * * * * * *
  function mass_reply() {
     Initialize
    let form_textarea = document.getElementById('body');
* * * * * * * */
 
    let post_no_nodes = document.getElementsByClassName("post_no");
/*  Styling
    for(const node of post_no_nodes) {
*/
      let post_no_text = node.textContent;
var $ele, cssStyle, cssString;
      if(!post_no_text.includes("No")) {
 
        form_textarea.value += `>>${post_no_text}\n`;
$ele = $('<div>').addClass('post reply').hide().appendTo('body');
      }
cssStyle = $ele.css(['border-top-color']);
    }
cssStyle.hoverBg = $('body').css('background-color');
    form_textarea.focus();
$ele.remove();
  }
 
  function add_button() {
    let ref_node = document.querySelectorAll(".op .intro .post_no")[1];
    let button = document.createElement("input");
    button.type = "button";
    button.value = "Mass Reply";
    button.style.marginLeft = "5px";
    button.addEventListener("click", function() {
      mass_reply();
     }, false);
   
    insert_after(button, ref_node);
  }
 
  add_button();
})();</pre>
|}
 
==== Wojakificator ====
Wojakificator is a JS script made by a [[bunkerchan]] user that automatically quotes any post you want an attaches a soyjak image
 
The script might work  using User JS option, but it is recommended to use a userscript manager like [https://violentmonkey.github.io/ Violentmonkey] instead
 
[https://github.com/Wojakposter/Wojakificator Source code]


cssString =
{{Redtext|Warning: includes some lefty and NAS images}}
'\n/*** Generated by post-menu ***/\n' +
'.post-menu {position: absolute; font-size: 12px; line-height: 1.3em;}\n' +
'.post-menu ul {\n' +
'    background-color: '+ cssStyle['border-top-color'] +'; border: 1px solid #666;\n' +
'    list-style: none; padding: 0; margin: 0; white-space: nowrap;\n}\n' +
'.post-menu .post-submenu{white-space: normal; width: 90px;}' +
'.post-menu .post-submenu>ul{white-space: nowrap; width: auto;}' +
'.post-menu li {cursor: pointer; position: relative; padding: 4px 4px; vertical-align: middle;}\n' +
'.post-menu li:hover {background-color: '+ cssStyle.hoverBg +';}\n' +
'.post-menu ul ul {display: none; position: absolute;}\n' +
'.post-menu li:hover>ul {display: block; left: 100%; margin-top: -3px;}\n' +
'.post-menu-arrow {float: right; margin-left: 10px;}\n' +
'.post-menu.hidden, .post-menu .hidden {display: none;}\n' +
'.post-btn {transition: transform 0.1s; width: 15px; text-align: center; font-size: 10pt; opacity: 0.8; text-decoration: none; margin: -6px 0px 0px -5px !important; display: inline-block;}\n' +
'.post-btn:hover {opacity: 1;}\n' +
'.post-btn-open {transform: rotate(90deg);}\n';


if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
<i>Expand to view the script</i>
$('style.generated-css').html($('style.generated-css').html() + cssString);
{| class="mw-collapsible mw-collapsed"
|+
|[https://soyjak.download/f.php?h=3KGYIYNd Download link]
|}


/*  Add buttons
==== Anti 4channeler posts ====
*/
Hides posts made by 4channelers.
$('.reply:not(.hidden), .thread>.op').each(function () {
addButton(this);
});


/*  event handlers
{{Redtext|Warning: Updates the page every 4 seconds to check for new posts, can be adjusted.}}
  */
$('form[name=postcontrols]').on('click', '.post-btn', function (e) {
e.preventDefault();
var post = e.target.parentElement.parentElement;
$('.post-menu').remove();


if ($(e.target).hasClass('post-btn-open')) {
<i>Expand to view the script</i>
$('.post-btn-open').removeClass('post-btn-open');
{| class="mw-collapsible mw-collapsed"
} else {
|+
//  close previous button
|
$('.post-btn-open').removeClass('post-btn-open');
$(post).find('.post-btn').addClass('post-btn-open');


buildMenu(e);
<pre>
}
// ==UserScript==
});
// @name        Anti 4channeler posts on soyjak.party
 
// @namespace    datamining
$(document).on('click', function (e){
// @version      0.1
if ($(e.target).hasClass('post-btn') || $(e.target).hasClass('post-submenu'))
// @description  Hides 4channeler posts
return;
// @author      Chud (You)
 
// @match        https://soyjak.party/*
$('.post-menu').remove();
// @icon        https://soyjak.party/static/favicon.png
$('.post-btn-open').removeClass('post-btn-open');
// @grant        none
});
// ==/UserScript==
 
let posts = document.querySelectorAll('.body');
// on new posts
let replies = document.querySelectorAll(".replies");
$(document).on('new_post', function (e, post) {
keys= [
addButton(post);
  "newfag",
});
  "fag",
 
  "gem",
$(document).trigger('menu_ready');
  "faggot",
});
  "new fag",
 
  "newfren",
 
  "newfrien",
// Post Filters
  "chud",
if (active_page === 'thread' || active_page === 'index' || active_page === 'catalog' || active_page === 'ukko') {
  "frogposter",
$(document).on('menu_ready', function () {
  "nas",
'use strict';
  "kys",
  "killyourself",
// returns blacklist object from storage
  "go back",
function getList() {
  "goback",
return JSON.parse(localStorage.postFilter);
  "reddit",
}
  "kill yourself",
  "hang",
  "coal",
  "reddit frog",
    "frog",
    "what does the reddit",
    "frog has to do with",
    "redditfrog",
    "frogtranny",
"nigger",
    "tranny"
]
function containsNonLatinCodepoints(s) {
    return /[^\u0000-\u00ff]/.test(s);
}
function start_filtering()
{
posts = document.querySelectorAll('.body');
replies = document.querySelectorAll(".replies");
for(let i =0 ; i<posts.length;i++)
{
for(let j=0;j<keys.length;j++)
{
  if(posts[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()) || containsNonLatinCodepoints(posts[i].innerHTML.toLowerCase()) == true )
{
posts[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
}


// stores blacklist into storage and reruns the filter
for(let i =0 ; i<replies.length;i++)
function setList(blacklist) {
{
localStorage.postFilter = JSON.stringify(blacklist);
for(let j=0;j<keys.length;j++)
$(document).trigger('filter_page');
{
}
  if(replies[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()))
{
replies[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
}
 
}


// unit: seconds
start_filtering();
function timestamp() {
setInterval(start_filtering,2000);
return Math.floor((new Date()).getTime() / 1000);
//Interval
}


function initList(list, boardId, threadId) {
if (typeof list.postFilter[boardId] == 'undefined') {
list.postFilter[boardId] = {};
list.nextPurge[boardId] = {};
}
if (typeof list.postFilter[boardId][threadId] == 'undefined') {
list.postFilter[boardId][threadId] = [];
}
list.nextPurge[boardId][threadId] = {timestamp: timestamp(), interval: 86400};  // 86400 seconds == 1 day
}


function addFilter(type, value, useRegex) {
//Gifs hider
var list = getList();
document.querySelectorAll("img").forEach(i=>{if(i.src.includes(".gif")){i.src="";}});</pre>
var filter = list.generalFilter;
|}
var obj = {
type: type,
value: value,
regex: useRegex
};


for (var i=0; i<filter.length; i++) {
==== Preview for Youtube Videos ====
if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex)
Show preview for youtube video links.
return;
}


filter.push(obj);
<i>Expand to view the script</i>
setList(list);
{| class="mw-collapsible mw-collapsed"
drawFilterList();
|+
}
|<pre>
 
// ==UserScript==
function removeFilter(type, value, useRegex) {
// @name        YouTube preview for soyjak.party
var list = getList();
// @namespace    datamining
var filter = list.generalFilter;
// @version      0.1
// @description  Previews YouTube videos
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
(function youtubeInlinePreviews() {
 
const re = /(?:youtube\.com\/watch\?v=|youtu\.be\/)(.{11})/;


for (var i=0; i<filter.length; i++) {
const previewTemplate = (videoId) => `<img
if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex) {
filter.splice(i, 1);
break;
}
}


setList(list);
style="max-width:255px;max-height:255px"
drawFilterList();
}


function nameSpanToString(el) {
src="<nowiki>https://i.ytimg.com/vi/${videoId}/hqdefault.jpg</nowiki>"
var s = '';


$.each($(el).contents(), function(k,v) {
/>`;
if (v.nodeName === 'IMG')
s=s+$(v).attr('alt')
if (v.nodeName === '#text')
s=s+v.nodeValue
});
return s.trim();
}


var blacklist = {
Array.from(document.querySelectorAll(".body a"))
add: {
 
post: function (boardId, threadId, postId, hideReplies) {
.filter((link) => link.href.match(re))
var list = getList();
 
var filter = list.postFilter;
.forEach((link) => {
 
const videoId = link.href.match(re)[1];


initList(list, boardId, threadId);
const inlinePreview = previewTemplate(videoId);


for (var i in filter[boardId][threadId]) {
link.innerHTML = inlinePreview;
if (filter[boardId][threadId][i].post == postId) return;
}
filter[boardId][threadId].push({
post: postId,
hideReplies: hideReplies
});
setList(list);
},
uid: function (boardId, threadId, uniqueId, hideReplies) {
var list = getList();
var filter = list.postFilter;


initList(list, boardId, threadId);
});


for (var i in filter[boardId][threadId]) {
})();</pre>
if (filter[boardId][threadId][i].uid == uniqueId) return;
|}
}
filter[boardId][threadId].push({
uid: uniqueId,
hideReplies: hideReplies
});
setList(list);
}
},
remove: {
post: function (boardId, threadId, postId) {
var list = getList();
var filter = list.postFilter;


// thread already pruned
==== Filter tripchuds ====
if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
To use it, change "!!TRIP GOES HERE" to any trip you want to filter (ex: !incelchud1 or !!incelchud1), can also be used to filter names if you change <blockquote> (/class="trip">!!TRIP GOES HERE</) </blockquote> to <blockquote> (/class="name">name of the chudcel you want to filter</) </blockquote>
return;
if you want to filter multiple tripchuds, you have to do this <blockquote> (/class="trip">!!FIRST TRIP CHUD|!SECOND TRIPCHUD|!THIRD TRIPCHUD</) </blockquote>


for (var i=0; i<filter[boardId][threadId].length; i++) {
<i>Expand to view the script</i>
if (filter[boardId][threadId][i].post == postId) {
{| class="mw-collapsible mw-collapsed"
filter[boardId][threadId].splice(i, 1);
|+
break;
|<pre>
}
// ==UserScript==
}
// @name        Tripfag filter for soyjak.party
 
// @namespace    datamining
if ($.isEmptyObject(filter[boardId][threadId])) {
// @version      0.1
delete filter[boardId][threadId];
// @description  Filters tripfags
delete list.nextPurge[boardId][threadId];
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
$(".post")
  .filter(function (index) {
    return this.innerHTML.match(/class="trip">!!TRIP GOES HERE</);
  })
  .each(function (index) {
    let whatToHide = "#" + this.id;
    if (this.id.startsWith("op_")) {
      whatToHide = "#" + this.id.replace("op_", "thread_");
    }
    $(whatToHide).hide();
  });


if ($.isEmptyObject(filter[boardId])) {
if (!localStorage.favorites) {
delete filter[boardId];
localStorage.favorites = '[]';
delete list.nextPurge[boardId];
}</pre>
}
|}
}
setList(list);
},
uid: function (boardId, threadId, uniqueId) {
var list = getList();
var filter = list.postFilter;


// thread already pruned
==== Hide tripchud posts from catalog ====
if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
Hides all tripchud posts from catalog, no exceptions.
return;


for (var i=0; i<filter[boardId][threadId].length; i++) {
<i>Expand to view the script</i>
if (filter[boardId][threadId][i].uid == uniqueId) {
{| class="mw-collapsible mw-collapsed"
filter[boardId][threadId].splice(i, 1);
|+
break;
|<pre>// ==UserScript==
}
// @name        Tripfag catalog filter for soyjak.party
}
// @namespace    datamining
// @version      0.1
// @description  Filters tripfags
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
// --- start: purgeTripsFromCatalog ---


if ($.isEmptyObject(filter[boardId][threadId])) {
(function purgeTripsFromCatalog() {
delete filter[boardId][threadId];
  // If on a catalog page
delete list.nextPurge[boardId][threadId];
  if (document.location.href.match(/catalog\.html$/)) {
 
    // Call the API for that page
if ($.isEmptyObject(filter[boardId])) {
    fetch(document.location.href.replace(".html", ".json"))
delete filter[boardId];
      .then((res) => res.json())
delete list.nextPurge[boardId];
      .then((json) =>
}
        json
}
          // Find the threads where OP is using a tripcode
setList(list);
          .reduce((acc, cur) => [...acc, ...cur.threads], [])
}
          .filter((op) => op.trip)
}
          // Hide them
};
          .forEach((filtered) => $(`div[data-id='${filtered.no}']`).hide())
      );
  }
})();


/*
// --- end: purgeTripsFromCatalog ---</pre>
*  hide/show the specified thread/post
|}
*/
function hide(ele) {
var $ele = $(ele);


if ($(ele).data('hidden'))
=== Disable gif autoplay ===
return;


$(ele).data('hidden', true);
<i>Expand to view the script</i>
if ($ele.hasClass('op')) {
{| class="mw-collapsible mw-collapsed"
$ele.parent().find('.body, .files, .video-container').not($ele.children('.reply').children()).hide();
|+
|<pre>// ==UserScript==
// @name    disable gif autoplay
// @version  1
// @grant    none
// @match https://soyjak.party/*
// ==/UserScript==


// hide thread replies on index view
window.addEventListener('load', function () {
if (active_page == 'index' || active_page == 'ukko') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').hide();
[].slice.apply(document.images).filter(is_gif_image).map(freeze_gif);
} else {
// normal posts
$ele.children('.body, .files, .video-container').hide();
}
}
function show(ele) {
var $ele = $(ele);


$(ele).data('hidden', false);
function is_gif_image(i) {
if ($ele.hasClass('op')) {
    return /^(?!data:).*\.gif/i.test(i.src);
$ele.parent().find('.body, .files, .video-container').show();
}
if (active_page == 'index') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').show();
} else {
// normal posts
$ele.children('.body, .files, .video-container').show();
}
}


/*
function freeze_gif(i) {
*  create filter menu when the button is clicked
    var c = document.createElement('canvas');
*/
    var w = c.width = i.width;
function initPostMenu(pageData) {
    var h = c.height = i.height;
var Menu = window.Menu;
    c.getContext('2d').drawImage(i, 0, 0, w, h);
var submenu;
    try {
Menu.add_item('filter-menu-hide', _('Hide post'));
        i.src = c.toDataURL("image/gif");
Menu.add_item('filter-menu-unhide', _('Unhide post'));
    } catch(e) {
        for (var j = 0, a; a = i.attributes[j]; j++)
            c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
    }
}
})</pre>
|}
=== Ratio script ===
adds a [ratio] button that starts posting automated replies from a selection of 4 types: "generic","[[Cobson|cob]]","[[Trannies|trans]]" and "[[chud]]". perfect for shitposting


submenu = Menu.add_submenu('filter-menu-add', _('Add filter'));
(feel free to add more quotes to the code, the "chud" one is very incomplete)
submenu.add_item('filter-add-post-plus', _('Post +'), _('Hide post and all replies'));
{| class="mw-collapsible mw-collapsed"
submenu.add_item('filter-add-id', _('ID'));
|+
submenu.add_item('filter-add-id-plus', _('ID +'), _('Hide ID and all replies'));
|
submenu.add_item('filter-add-name', _('Name'));
submenu.add_item('filter-add-trip', _('Tripcode'));


submenu = Menu.add_submenu('filter-menu-remove', _('Remove filter'));
<pre>
submenu.add_item('filter-remove-id', _('ID'));
// ==UserScript==
submenu.add_item('filter-remove-name', _('Name'));
// @name        Sharty Ratio
submenu.add_item('filter-remove-trip', _('Tripcode'));
// @namespace   soyjak.party
 
// @match       http*://soyjak.party/*
Menu.onclick(function (e, $buffer) {
// @version     1.0
var ele = e.target.parentElement.parentElement;
// @author      God Tier Wojack
var $ele = $(ele);
// @description Ratio that nigga
 
// ==/UserScript==
var threadId = $ele.parent().attr('id').replace('thread_', '');
const modifiers = ["==", "%%", "--", "'", ""];
var boardId = $ele.parent().data('board');
let done = new Array(20);
var postId = $ele.find('.post_no').not('[id]').text();
let stringSets = {
if (pageData.hasUID) {
  "Generic": ["holy shit", "holy shiiiit", "holy fuck", "holy fuck.", "fuckin hell", "holy fuckk", "holy fuckkk", "holy fuckkkk", "lfg", "lfggg", "lfgggg", "lfg!", "lfg!!", "lfgg!!!", "w", "dub", "massive w", "huge w", "gigantic w", "massive dub", "huge dub", "another dub", "another w", "gigantic w", "get his ass", "get that nigga", "lets fucking go", "lets fucking gooo", "lets fucking goooo", "lets fucking goooo", "lets fucking go!", "lets fucking go!!", "lets fucking go!!!", "lets fucking go!!!!!", "yo get his ass", "yo get em", "yooo", "yoooo", "yooooooo", "yoooooooooooo", "god damn", "got damn", "god damnnn", "damnnnnn", "own that fraud", "expose that fraud", "lets gooo", "lets gooooo", "let's goooooo", "keyed", "keyed af", "holy keyed", "gem", "massive gem", "gemerald", "wem", "huge gem", "gigantic gem", "sharty saving gem", "diamond", "sharty saving diamond", "up", "go up", "go the fuck up", "up up up", "go tf up", "'chup", "own that fraud", "get they ass", "beat his ass", "kill that nigga", "can't stop winning", "we cant stop winning bros", "diamonderald", "btfo", "zamn", "zamnnn", "holy based", "based af", "GYATT", "GYAT DAYUM", "DAMN ZIGGA", "GET THAT NIGGA", "NIGGA", "COOK THAT NIGGA", "let him cook", "HUUUUUUUUUGE FUCKING COCK", "GET OUT DA HOOD", "DAYUM NIGGA", "WHAT DA HEEEEEEEEEEEEEEEEEEELL", "COOK HIS ASS", "EAT THAT NIGGA", "HUGE GYATT", "RIZZ", "ENORMOUS W", "W CHAT", "EAT HIS ASS", "How will he ever recover?", "#PACKWATCH", "AYO", "MOG HIS ASS", "LOCK IN", "VICTORY", "GOTTEM", "How will bro ever recover?", "How will blud ever recover?", "BRO WILL NEVER RECOVER", "BLUD WILL NEVER RECOVER", "check'd and kek'd", "BUMP"],
var postUid = $ele.find('.poster_id').text();
  "Cob": ["another cob w", "#cobgang", "another gemson victory", "gemson win", "gemson victory", "gemson up", "god tier wojack", "gem tier godjack", "cobby up", "cobby go up", "godson up", "upson", "keyedson", "winson", "cob w", "cob dub", "cobby win", "#cobgang win", "#cobgang victory", "hwabag", "god tier winjack", "diamondson go up", "winson up", "gemson go up", "godson go up", "gemson dub", "gemson w", "godson dub", "godson w", "#cobgang dub", "#cobgang w", "cobwin", "he won", "he fucking won", "he cant stop winning"],
}
  "Trans": ["trans rights", "trans fucking rights", "trans rights won", "sisters...", "trans rights w", "trans rights dub", "trans folx won", "w trans rights", "trans rights go up", "transphobes btfo", "transphobes destroyed", "trans rights victory", "w for trans rights", "trans victory", "transerald", "trans diamond", "bump up the trans", "uptrans", "sisters go up", "upsis", "trans top", "estrogem", "estrogemerald", "bumpstrogen", "topstrogen", "winstrogen"],
 
   "chud":["1488","fuck niggers","kill all blacks","kanye 2024","dial eight","-ACK!","sieg heil!","jews","media is kiked","goyslop","hang yourself troon","the west has fallen","back to /leftypol/","amerimutt","women are made for rape"]
var postName;
}
var postTrip = '';
let targetPosts = [];
if (!pageData.forcedAnon) {
let sets = [stringSets["Generic"]];
postName = (typeof $ele.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($ele.find('.name')[0]);
setInterval(() => {
postTrip = $ele.find('.trip').text();
  document.querySelectorAll(".button.alert_button").forEach(e => e.click());
}
  if (targetPosts.length == 0 || sets.length == 0) {
 
    return;
/*  display logic and bind click handlers
  }
*/
  let post = "";
 
  targetPosts.forEach(p => post += `>>${p}\n`);
// unhide button
  let effect = "";
if ($ele.data('hidden')) {
  if (Math.random() > 0.5) {
$buffer.find('#filter-menu-unhide').click(function () {
    effect = modifiers[Math.floor(Math.random() * modifiers.length)];
//  if hidden due to post id, remove it from blacklist
  }
//  otherwise just show this post
  post += effect;
blacklist.remove.post(boardId, threadId, postId);
  let strings = sets.flat();
show(ele);
  stringsLength = strings.length;
});
  let found = false;
$buffer.find('#filter-menu-hide').addClass('hidden');
  while (!found) {
} else {
    text = strings[(Math.floor(Math.random() * stringsLength))];
$buffer.find('#filter-menu-unhide').addClass('hidden');
    if (!done.includes(text)) {
$buffer.find('#filter-menu-hide').click(function () {
      if (Math.random() > 0.5) {
blacklist.add.post(boardId, threadId, postId, false);
        text = text.toUpperCase();
});
      }
}
      post += text;
 
      found = true;
//  post id
      done.unshift(text);
if (!$ele.data('hiddenByPost')) {
      done.pop();
$buffer.find('#filter-add-post-plus').click(function () {
    }
blacklist.add.post(boardId, threadId, postId, true);
  }
});
  post += effect;
} else {
  document.querySelector("form[name=post] textarea#body").value = post;
$buffer.find('#filter-add-post-plus').addClass('hidden');
  document.querySelector("form[name=post] input[value*='Reply']").click();
}
}, 12000);
 
function addRatioButton(post) {
// UID
  post.querySelector(".intro").insertAdjacentHTML("beforeend", `<a href="javascript:void(0);" class="ratio" postNumber="${post.getElementsByClassName("post_no")[1].textContent}">[Ratio]</a>`);
if (pageData.hasUID && !$ele.data('hiddenByUid')) {
}
$buffer.find('#filter-add-id').click(function () {
let options = Options.add_tab("ratio", "gear", "Ratio").content[0];
blacklist.add.uid(boardId, threadId, postUid, false);
let optionsHTML = "";
});
for ([key, value] of Object.entries(stringSets)) {
$buffer.find('#filter-add-id-plus').click(function () {
  optionsHTML += `<input type="checkbox" id="ratio-${key}" name="${key}"><label for="ratio-${key}">${key}</label><br>`;
blacklist.add.uid(boardId, threadId, postUid, true);
}
});
options.insertAdjacentHTML("beforeend", optionsHTML);
 
options.querySelectorAll("input[type=checkbox]").forEach(e => {
$buffer.find('#filter-remove-id').addClass('hidden');
  e.addEventListener("change", e => {
} else if (pageData.hasUID) {
    sets = [];
$buffer.find('#filter-remove-id').click(function () {
    options.querySelectorAll("input[type=checkbox]:checked").forEach(c => sets.push(stringSets[c.getAttribute("name")]));
blacklist.remove.uid(boardId, threadId, postUid);
  });
});
  e.checked = e.getAttribute("name") == "Generic";
});
const updateObserver = new MutationObserver(list => {
  list.forEach(node => {
    if (node.addedNodes[0].nodeName == "DIV") {
      addRatioButton(node.addedNodes[0]);
    }
  });
});
updateObserver.observe(document.querySelector(".thread"), {
  childList: true
});
[...document.getElementsByClassName("post")].forEach(e => {
  addRatioButton(e);
});
document.addEventListener("click", e => {
  let t = e.target;
  if (t.classList.contains("ratio")) {
    if (t.textContent == "[Ratio]") {
      t.textContent = "[Unratio]";
      targetPosts.push(t.getAttribute("postNumber"));
    } else {
      targetPosts = targetPosts.filter(p => p != t.getAttribute("postNumber"));
      t.textContent = "[Ratio]";
    }
  }
});
</pre>
|}
 
=== Thremboify ===
Converts post numbers to Base 11 with Thrembo (Ϫ)


$buffer.find('#filter-add-id').addClass('hidden');
<i>Expand to view the script</i>
$buffer.find('#filter-add-id-plus').addClass('hidden');
{| class="mw-collapsible mw-collapsed"
} else {
|+
// board doesn't use UID
|<pre>
$buffer.find('#filter-add-id').addClass('hidden');
// ==UserScript==
$buffer.find('#filter-add-id-plus').addClass('hidden');
// @name        Soyjak.party Thremboify
$buffer.find('#filter-remove-id').addClass('hidden');
// @namespace    http://soyjak.party/
}
// @version      0.1
// @description  Thremboifies post numbers on Soyjak.party
// @author      Chud
// @match        https://soyjak.party/*
// @grant        none
// ==/UserScript==
const thr_lut = ['0', '1', '2', '3', '4', '5', '6', 'Ϫ', '7', '8', '9'];
function thr_cnv(num) {
  if (num === 0) {
    return '0';
  }
  let result = '';
  while (num !== 0) {
    const remainder = num % 11;
    result = thr_lut[remainder] + result;
    num = Math.floor(num / 11);
  }
  return result;
}
function thr_up() {
    console.log('updating');
    document.querySelectorAll('.post_no').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        if (el.innerText == '№') { return; }
        const res = thr_cnv(parseInt(el.innerText));
        el.innerText = res;
    });
    document.querySelectorAll('a[class^="mentioned-"]').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        const res = thr_cnv(parseInt(el.innerText.substring(2)));
        el.innerText = `>>${res}`;
    });
    document.querySelectorAll('a[onclick^="highlightReply"][href*="/thread"]').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        if (el.innerText == '№') { return; }
        const res = thr_cnv(parseInt(el.innerText.substring(2)));
        el.innerText = `>>${res}`;
    });
}
const observer = new MutationObserver((mutationsList, observer) => {
    for (let mutation of mutationsList) {
        if (mutation.type === 'childList') {
            thr_up();
            return;
        }
    }
});
const config = { childList: true, subtree: true };
observer.observe(document.body, config);
thr_up();
</pre>
|}


//  name
=== Hide Website Origin ===
if (!pageData.forcedAnon && !$ele.data('hiddenByName')) {
Useful for hiding the fact that you came from the ‘arty if you’ve clicked a link on the ‘ty for a site that you wish to raid (e.g. an altchan).
$buffer.find('#filter-add-name').click(function () {
addFilter('name', postName, false);
});


$buffer.find('#filter-remove-name').addClass('hidden');
<i>Expand to view the script</i>
} else if (!pageData.forcedAnon) {
{| class="mw-collapsible mw-collapsed"
$buffer.find('#filter-remove-name').click(function () {
|+
removeFilter('name', postName, false);
|<pre>
});
const referrerPolicy = document.createElement("meta")
referrerPolicy.setAttribute("name", "referrer")
referrerPolicy.setAttribute("content", "same-origin")
document.querySelector("head").appendChild(referrerPolicy)
</pre>
|}
 
=== Sharty GET Stealer ===
Self-explanatory.
 
Grab it from https://greasyfork.org/en/scripts/470562-get-stealer
 
=== 4cuck GET Stealer ===
It’s on the GET page, chud


$buffer.find('#filter-add-name').addClass('hidden');
=== Change Banner on Click ===
} else {
Makes the banner image change when clicked, useful for quickly cycling through them to find a certain one.
// board has forced anon
$buffer.find('#filter-remove-name').addClass('hidden');
$buffer.find('#filter-add-name').addClass('hidden');
}


//  tripcode
<code>
if (!pageData.forcedAnon && !$ele.data('hiddenByTrip') && postTrip !== '') {
document.querySelector(".board_image").setAttribute("onClick", `document.querySelector(".board_image").setAttribute("src", "/b.php#" + new Date().getTime());`);
$buffer.find('#filter-add-trip').click(function () {
</code>
addFilter('trip', postTrip, false);
});


$buffer.find('#filter-remove-trip').addClass('hidden');
=== Redirect Broken /res/ URLs to /thread/ URLs ===
} else if (!pageData.forcedAnon && postTrip !== '') {
Redirects thread URLs in the old soyjak.party/*/res/*.html format to the current soyjak.party/*/thread/*.html format.
$buffer.find('#filter-remove-trip').click(function () {
removeFilter('trip', postTrip, false);
});


$buffer.find('#filter-add-trip').addClass('hidden');
Very niche these days since the formatting change was made mid Kuz-era but it's useful when using 4chan-x on the sharty as it's thread watcher serves /res/ URLs.
} else {
// board has forced anon
$buffer.find('#filter-remove-trip').addClass('hidden');
$buffer.find('#filter-add-trip').addClass('hidden');
}


/*  hide sub menus if all items are hidden
<i>Expand to view the script</i>
*/
{| class="mw-collapsible mw-collapsed"
if (!$buffer.find('#filter-menu-remove > ul').children().not('.hidden').length) {
|+
$buffer.find('#filter-menu-remove').addClass('hidden');
|<pre>
}
// ==UserScript==
if (!$buffer.find('#filter-menu-add > ul').children().not('.hidden').length) {
// @name        soyjak.party - Fix /res/ links
$buffer.find('#filter-menu-add').addClass('hidden');
// @namespace  caca
}
// @match      https://soyjak.party/*/res/*.html
});
// @grant      none
}
// @version    0.1
// @author      newGOD
// @description Redirect old /res/ links to the new /thread/ link format
// ==/UserScript==
location = location.href.replace("res", "thread")
</pre>
|}
 
 
== CSS ==
In addition to user JS, soyjak.party also offers an option to customize user CSS.
 
 
Many CSS styles can be found on https://github.com/vichan-devel/vichan/tree/master/stylesheets, and https://github.com/lainchan/lainchan/tree/master/stylesheets.


/*
[[File:Rugby.css .png|thumb|Built into soyjak.party, a theme featuring a gay furry fox, Polish internet's enclave on all imageboards using [[Imageboard#Imageboard_Engines|vichan]].<ref>https://web.archive.org/web/20230624020350/https://soyjak.party/soy/thread/3614380.html</ref>]]
*  hide/unhide thread on index view
Soyjak.party also inherits from Vichan many built-in themes. The complete list of themes can be found in the [https://github.com/vichan-devel/vichan/tree/master/stylesheets vichan source code]. The themes are unlisted but can be added by name like this:
*/
@import "<nowiki>https://soyjak.party/stylesheets/</nowiki>'''rugby.css'''";
function quickToggle(ele, threadId, pageData) {
/*if ($(ele).find('.hide-thread-link').length)
$('.hide-thread-link').remove();*/


if ($(ele).hasClass('op') && !$(ele).find('.hide-thread-link').length) {
$('<a class="hide-thread-link" style="float:left;margin-right:5px" href="javascript:void(0)">[' + ($(ele).data('hidden') ? '+' : '&ndash;') + ']</a>')
.insertBefore($(ele).find(':not(h2,h2 *):first'))
.click(function() {
var postId = $(ele).find('.post_no').not('[id]').text();
var hidden = $(ele).data('hidden');
var boardId = $(ele).parents('.thread').data('board');
if (hidden) {
blacklist.remove.post(boardId, threadId, postId, false);
$(this).html('[&ndash;]');
} else {
blacklist.add.post(boardId, threadId, postId, false);
$(this).text('[+]');
}
});
}
}


/*
=== Custom underwater theme ===
*  determine whether the reply post should be hidden
[[File:Custom Theme.png|thumb|493x493px|The underwater theme in use]]
*  - applies to all posts on page load or filtering rule change
*  - apply to new posts on thread updates
*  - must explicitly set the state of each attributes because filter will reapply to all posts after filtering rule change
*/
function filter(post, threadId, pageData) {
var $post = $(post);


var list = getList();
Adds marine life to your browsing experience
var postId = $post.find('.post_no').not('[id]').text();
var name, trip, uid, subject, comment;
var i, length, array, rule, pattern;  // temp variables


var boardId       = $post.data('board');
firstly, add this to your User CSS
if (!boardId) boardId = $post.parents('.thread').data('board');


var localList  = pageData.localList;
<i>Expand to view the script</i>
var noReplyList = pageData.noReplyList;
{| class="mw-collapsible mw-collapsed"
var hasUID      = pageData.hasUID;
|
var forcedAnon = pageData.forcedAnon;
|-
|<pre>/**
* miku.css
* For AwsumChan by Circlepuller
  */
body {
background: #D2FFEE url('img/fade-miku.png') top repeat-x;
}


var hasTrip = ($post.find('.trip').length > 0);
a:link, a:visited {
var hasSub = ($post.find('.subject').length > 0);
text-decoration: none;
color: #00637B;
}


$post.data('hidden', false);
a:link:hover, a:visited:hover {
$post.data('hiddenByUid', false);
color: #DD0000;
$post.data('hiddenByPost', false);
}
$post.data('hiddenByName', false);
$post.data('hiddenByTrip', false);
$post.data('hiddenBySubject', false);
$post.data('hiddenByComment', false);


// add post with matched UID to localList
a.post_no {
if (hasUID &&
color: #000033;
typeof list.postFilter[boardId] != 'undefined' &&
}
typeof list.postFilter[boardId][threadId] != 'undefined') {
uid = $post.find('.poster_id').text();
array = list.postFilter[boardId][threadId];


for (i=0; i<array.length; i++) {
.intro a.email span.name {
if (array[i].uid == uid) {
color: #0093AB;
$post.data('hiddenByUid', true);
}
localList.push(postId);
if (array[i].hideReplies) noReplyList.push(postId);
break;
}
}
}


// match localList
.intro a.email:hover span.name {
if (localList.length) {
color: #DD0000;
if ($.inArray(postId, localList) != -1) {
}
if ($post.data('hiddenByUid') !== true) $post.data('hiddenByPost', true);
hide(post);
}
}


// matches generalFilter
h2, div.title, h1 {
if (!forcedAnon)
color: #800000;
name = (typeof $post.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($post.find('.name')[0]);
}
if (!forcedAnon && hasTrip)
trip = $post.find('.trip').text();
if (hasSub)
subject = $post.find('.subject').text();


array = $post.find('.body').contents().filter(function () {if ($(this).text() !== '') return true;}).toArray();
form table tr th {
array = $.map(array, function (ele) {
background: #95D2D3;
return $(ele).text().trim();
}
});
comment = array.join(' ');


div.banner {
background-color: #E04000;
}


for (i = 0, length = list.generalFilter.length; i < length; i++) {
div.post.op hr {
rule = list.generalFilter[i];
border-color: #B7C9D5;
}
 
.intro span.subject {
color: #117743;
font-weight: 800;
}


if (rule.regex) {
.intro span.name {
pattern = new RegExp(rule.value);
color: #117743;
switch (rule.type) {
font-weight: 800;
case 'name':
}
if (!forcedAnon && pattern.test(name)) {
 
$post.data('hiddenByName', true);
div.post.reply.highlighted {
hide(post);
background: #a9d8ff;
}
}
break;
 
case 'trip':
div.post.reply {
if (!forcedAnon && hasTrip && pattern.test(trip)) {
background: #B6DDDE;
$post.data('hiddenByTrip', true);
border-color: #8FCCCD;
hide(post);
}
}
 
break;
div.ban {
case 'sub':
border: 1px solid #0093AB;
if (hasSub && pattern.test(subject)) {
}
$post.data('hiddenBySubject', true);
 
hide(post);
div.ban h2 {
}
background: #B6DDDE;
break;
color: #0093AB;
case 'com':
}
if (pattern.test(comment)) {
 
$post.data('hiddenByComment', true);
div.pages {
hide(post);
color: #8899AA;
}
background: #B6DDDE;
break;
border-right: 1px solid #8FCCCD;
}
border-bottom: 1px solid #8FCCCD;
} else {
}
switch (rule.type) {
 
case 'name':
hr {
if (!forcedAnon && rule.value == name) {
border-color: #B7D9C5;
$post.data('hiddenByName', true);
}
hide(post);
 
}
div.boardlist {
break;
color: #0093AB;
case 'trip':
    background-color: rgba(65%, 85%, 95%, 0.2);
if (!forcedAnon && hasTrip && rule.value == trip) {
}
$post.data('hiddenByTrip', true);
hide(post);
}
break;
case 'sub':
pattern = new RegExp('\\b'+ rule.value+ '\\b');
if (hasSub && pattern.test(subject)) {
$post.data('hiddenBySubject', true);
hide(post);
}
break;
case 'com':
pattern = new RegExp('\\b'+ rule.value+ '\\b');
if (pattern.test(comment)) {
$post.data('hiddenByComment', true);
hide(post);
}
break;
}
}
}


// check for link to filtered posts
.desktop-style div.boardlist:nth-child(1) {
$post.find('.body a').not('[rel="nofollow"]').each(function () {
  text-shadow: #D2FFEE 1px 1px 1px, #D2FFEE -1px -1px 1px;
var replyId = $(this).text().match(/^>>(\d+)$/);
}
* {
  background-image: url('https://files.catbox.moe/hp03xs.png');
}


if (!replyId)
.soifish {
return;
  background-image: url('https://files.catbox.moe/rxmvyr.png');
  position: fixed;
    pointer-events: none;
  -webkit-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -moz-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -o-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
}


replyId = replyId[1];
@-webkit-keyframes moveX {
if ($.inArray(replyId, noReplyList) != -1) {
  from { left: 0; } to { left: 100%; }
hide(post);
}
}
@-moz-keyframes moveX {
});
  from { left: 0; } to { left: 100%; }
}
@-o-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@keyframes moveX {
  from { left: 0; } to { left: 100%; }
}


// post didn't match any filters
@-webkit-keyframes moveY {
if (!$post.data('hidden')) {
  from { top: 0; } to { top: 100%; }
show(post);
}
}
@-moz-keyframes moveY {
}
  from { top: 0; } to { top: 100%; }
}
@-o-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@keyframes moveY {
  from { top: 0; } to { top: 100%; }
}


/*  (re)runs the filter on the entire page
*/
function filterPage(pageData) {
var list = getList();


if (active_page != 'catalog') {


// empty the local and no-reply list
.post.reply .body a:hover:after {
pageData.localList = [];
    content: url(https://soyjak.download/f.php?h=0lnyi5TW&p=1);
pageData.noReplyList = [];
    display: block;
    position: absolute;
    left: 20px;
    top: -255px;
    pointer-events: none;
    z-index: 999;
}


$('.thread').each(function () {
.post.reply .body a:hover {
var $thread = $(this);
    position: relative;
// disregard the hidden threads constructed by post-hover.js
}
if ($thread.css('display') == 'none')
return;


var threadId = $thread.attr('id').replace('thread_', '');
body:after {
var boardId = $thread.data('board');
    content: url(https://soyjak.download/f.php?h=3EFSgyRY&p=1);
var op = $thread.children('.op')[0];
    display: block;
var i, array; // temp variables
    position: fixed;
    bottom: 0px;
    right: 0px;
    pointer-events: none;


// add posts to localList and noReplyList
.desktop-style div.boardlist:nth-child(1):hover, .desktop-style div.boardlist:nth-child(1).cb-menu {
if (typeof list.postFilter[boardId] != 'undefined' && typeof list.postFilter[boardId][threadId] != 'undefined') {
  background-color: rgba(70%, 95%, 100%, 0.45);
array = list.postFilter[boardId][threadId];
}</pre>
for (i=0; i<array.length; i++) {
|}
if ( typeof array[i].post == 'undefined')
Then add this to your User JS or Tampermonkey
continue;
{| class="mw-collapsible mw-collapsed"
 
|
pageData.localList.push(array[i].post);
|-
if (array[i].hideReplies) pageData.noReplyList.push(array[i].post);
|<pre>
}
// ==UserScript==
}
// @name        JS for Ocean Theme
// run filter on OP
// @namespace    datamining
filter(op, threadId, pageData);
// @version      0.1
quickToggle(op, threadId, pageData);
// @description  Glub Glub Glub Glub
// @author      Glub
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
var soislug = document.createElement("img");
soislug.setAttribute('src', 'https://files.catbox.moe/vpoeyt.png');
soislug.setAttribute('class', 'soislug');
document.getElementsByClassName("8chan")[0].appendChild(soislug);
var soifish = document.createElement("img");
soifish.setAttribute('src', 'https://files.catbox.moe/rxmvyr.png');
soifish.setAttribute('class', 'soifish');
document.getElementsByClassName("8chan")[0].appendChild(soifish);
</pre>
|}


// iterate filter over each post
=== Custom Soot theme ===
if (!$(op).data('hidden') || active_page == 'thread') {
Soot color scheme (grey and yellow) theme, this css should be used with dark style.
$thread.find('.reply').not('.hidden').each(function () {
filter(this, threadId, pageData);
});
}


});
<i>Expand to view the script</i>
} else {
{| class="mw-collapsible mw-collapsed"
var postFilter = list.postFilter[pageData.boardId];
|
var $collection = $('.mix');
|-
|<pre>
/*soot theme*/


if ($.isEmptyObject(postFilter))
.name {
return;
    color: #FDD73A !important;
}


// for each thread that has filtering rules
body {
// check if filter contains thread OP and remove the thread from catalog
    background: black url(https://i.imgur.com/FeQmhfL.png) right bottom no-repeat fixed;
$.each(postFilter, function (key, thread) {
}
var threadId = key;
$.each(thread, function () {
if (this.post == threadId) {
$collection.filter('[data-id='+ threadId +']').remove();
}
});
});
}
}


function initStyle() {
div.post.reply {
var $ele, cssStyle, cssString;
    background-color: #646464 !important;
    color: black;
    border-radius:0;
}


$ele = $('<div>').addClass('post reply').hide().appendTo('body');
div#post-moderation-fields , div#style-select {
cssStyle = $ele.css(['background-color', 'border-color']);
    padding:4px;
cssStyle.hoverBg = $('body').css('background-color');
    background-color:rgba(0,0,0,28);
$ele.remove();
}


cssString = '\n/*** Generated by post-filter ***/\n' +
span.heading {
'#filter-control input[type=text] {width: 130px;}' +
    color: #FF565C !important;
'#filter-control input[type=checkbox] {vertical-align: middle;}' +
}
'#filter-control #clear {float: right;}\n' +
'#filter-container {margin-top: 20px; border: 1px solid; height: 270px; overflow: auto;}\n' +
'#filter-list {width: 100%; border-collapse: collapse;}\n' +
'#filter-list th {text-align: center; height: 20px; font-size: 14px; border-bottom: 1px solid;}\n' +
'#filter-list th:nth-child(1) {text-align: center; width: 70px;}\n' +
'#filter-list th:nth-child(2) {text-align: left;}\n' +
'#filter-list th:nth-child(3) {text-align: center; width: 58px;}\n' +
'#filter-list tr:not(#header) {height: 22px;}\n' +
'#filter-list tr:nth-child(even) {background-color:rgba(255, 255, 255, 0.5);}\n' +
'#filter-list td:nth-child(1) {text-align: center; width: 70px;}\n' +
'#filter-list td:nth-child(3) {text-align: center; width: 58px;}\n' +
'#confirm {text-align: right; margin-bottom: -18px; padding-top: 2px; font-size: 14px; color: #FF0000;}';


if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
.remove-btn {
$('style.generated-css').html($('style.generated-css').html() + cssString);
    color: rgba(255,255,255,128) !important;
}
}


function drawFilterList() {
hr {
var list = getList().generalFilter;
    border-color:transparent;
var $ele = $('#filter-list');
}
var $row, i, length, obj, val;
</pre>
|}


var typeName = {
=== Feral Theme ===
name: 'name',
{| class="mw-collapsible mw-collapsed"
trip: 'tripcode',
|
sub: 'subject',
|-
com: 'comment'
|<pre>
};
body {  
  background: #ffdbd2;
  background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/feral.png);
    background-position: bottom right;
    background-repeat: no-repeat;
    background-attachment: fixed;}


$ele.empty();


$ele.append('<tr id="header"><th>Type</th><th>Content</th><th>Remove</th></tr>');
div.post.reply {
for (i = 0, length = list.length; i < length; i++) {
  color: #000;
obj = list[i];
  background: #eaa7a7;
  border-right: 2px solid #d9bfb7;
  border-bottom: 2px solid #d9bfb7;
}


// display formatting
div.post.reply.highlighted {
val = (obj.regex) ? '/'+ obj.value +'/' : obj.value;
    background: #ec6464;
}


$row = $('<tr>');
.desktop-style div.boardlist:nth-child(1) {
$row.append(
      background: #d85656
'<td>'+ typeName[obj.type] +'</td>',
}
'<td>'+ val +'</td>',
 
$('<td>').append(
div.boardlist a {
$('<a>').html('X')
    color: #fff;
.addClass('del-btn')
}
.attr('href', '#')
 
.data('type', obj.type)
div.pages {
.data('val', obj.value)
  background: #d85656
.data('useRegex', obj.regex)
}
)
</pre>
);
|}
$ele.append($row);
}
}


function initOptionsPanel() {
=== [[Calm]] Theme ===
if (window.Options && !Options.get_tab('filter')) {
{| class="mw-collapsible mw-collapsed"
Options.add_tab('filter', 'list', _('Filters'));
|
Options.extend_tab('filter',
|-
'<div id="filter-control">' +
|<pre>
'<select>' +
body {
'<option value="name">'+_('Name')+'</option>' +
    background: #fafcff;
'<option value="trip">'+_('Tripcode')+'</option>' +
    background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/sdjasd);
'<option value="sub">'+_('Subject')+'</option>' +
    background-position: bottom right;
'<option value="com">'+_('Comment')+'</option>' +
    background-repeat: no-repeat;
'</select>' +
    background-attachment: fixed;
'<input type="text">' +
    background-size: 200px;
'<input type="checkbox">' +
   
'regex ' +
}
'<button id="set-filter">'+_('Add')+'</button>' +
 
'<button id="clear">'+_('Clear all filters')+'</button>' +
div.post.reply {
'<div id="confirm" class="hidden">' +
    background:  #fafcff url('/stylesheets/img/fade-blue.png')     margin: 0.3em 6px;
_('This will clear all filtering rules including hidden posts.')+' <a id="confirm-y" href="#">'+_('yes')+'</a> | <a id="confirm-n" href="#">'+_('no')+'</a>' +
    padding: 0.2em 0.3em 0.5em 0.6em;
'</div>' +
    border-width: 1px;
'</div>' +
    border-style: none solid solid none;
'<div id="filter-container"><table id="filter-list"></table></div>'
    border-radius: 0.7em;
);
    box-shadow: 0.1rem 0.2rem 0.1rem 0.02rem rgba(1,2,3,.5)
drawFilterList();
margin-top 20px;
}


// control buttons
div.post.reply div.body {
$('#filter-control').on('click', '#set-filter', function () {
  overflow-y: auto;
var type = $('#filter-control select option:selected').val();
  max-height: 70vh;
var value = $('#filter-control input[type=text]').val();
var useRegex = $('#filter-control input[type=checkbox]').prop('checked');


//clear the input form
$('#filter-control input[type=text]').val('');


addFilter(type, value, useRegex);
}
drawFilterList();
});
$('#filter-control').on('click', '#clear', function () {
$('#filter-control #clear').addClass('hidden');
$('#filter-control #confirm').removeClass('hidden');
});
$('#filter-control').on('click', '#confirm-y', function (e) {
e.preventDefault();


$('#filter-control #clear').removeClass('hidden');
.intro span.name {
$('#filter-control #confirm').addClass('hidden');
  font-style: italic;
setList({
  color: rgb(129, 123, 204);
generalFilter: [],
}
postFilter: {},
nextPurge: {},
lastPurge: timestamp()
});
drawFilterList();
});
$('#filter-control').on('click', '#confirm-n', function (e) {
e.preventDefault();


$('#filter-control #clear').removeClass('hidden');
.post-image {
$('#filter-control #confirm').addClass('hidden');
    box-shadow: 0.1rem 0.2rem 0.1rem 0.03rem rgba(0,0,0,.2);
});
}


h1 {
    font-family: tahoma;
    letter-spacing: -2px;
    font-size: 20pt;
    margin: 0;
    text-shadow: 20px;


// remove button
}
$('#filter-list').on('click', '.del-btn', function (e) {
e.preventDefault();


var $ele = $(e.target);
header div.subtitle, h1 {
var type = $ele.data('type');
    color: #9cc3ff;
var val = $ele.data('val');
    text-align: center;
var useRegex = $ele.data('useRegex');
    text-shadow: 20px;
    font-family: Arial, Helvetica, sans-serif;


removeFilter(type, val, useRegex);
});
}
}


/*
}
*  clear out pruned threads
*/
function purge() {
var list = getList();
var board, thread, boardId, threadId;
var deferred;
var requestArray = [];


var successHandler = function (boardId, threadId) {
span.heading {
return function () {
    color: #9a2ea1;
// thread still alive, keep it in the list and increase the time between checks.
    font-size: 11pt;
var list = getList();
    font-weight: bold;
var thread = list.nextPurge[boardId][threadId];
}


thread.timestamp = timestamp();
div.blotter {
thread.interval = Math.floor(thread.interval * 1.5);
    color: #9cc3ff;
setList(list);
    text-align: center;
};
}
};
</pre>
var errorHandler = function (boardId, threadId) {
|}
return function (xhr) {
if (xhr.status == 404) {
var list = getList();


delete list.nextPurge[boardId][threadId];
===Doll Theme===
delete list.postFilter[boardId][threadId];
{| class="mw-collapsible mw-collapsed"
if ($.isEmptyObject(list.nextPurge[boardId])) delete list.nextPurge[boardId];
|
if ($.isEmptyObject(list.postFilter[boardId])) delete list.postFilter[boardId];
|-
setList(list);
|<pre>
}
.name {
};
    color:#FB4598 !important;
};
   
}  


if ((timestamp() - list.lastPurge) < 86400)  // less than 1 day
return;
for (boardId in list.nextPurge) {
board = list.nextPurge[boardId];
for (threadId in board) {
thread = board[threadId];
if (timestamp() > (thread.timestamp + thread.interval)) {
// check if thread is pruned
deferred = $.ajax({
cache: false,
url: '/'+ boardId +'/res/'+ threadId +'.json',
success: successHandler(boardId, threadId),
error: errorHandler(boardId, threadId)
});
requestArray.push(deferred);
}
}
}


// when all requests complete
div.post.reply.highlighted {a
$.when.apply($, requestArray).always(function () {
    background: #d17dcd;;
var list = getList();
}
list.lastPurge = timestamp();
setList(list);
});
}


function init() {
if (typeof localStorage.postFilter === 'undefined') {
localStorage.postFilter = JSON.stringify({
generalFilter: [],
postFilter: {},
nextPurge: {},
lastPurge: timestamp()
});
}


var pageData = {
.desktop-style div.boardlist:nth-child(1) {
boardId: board_name,  // get the id from the global variable
    position: fixed;
localList: [],  // all the blacklisted post IDs or UIDs that apply to the current page
    top: 0;
noReplyList: [],  // any posts that replies to the contents of this list shall be hidden
    left: 0;
hasUID: (document.getElementsByClassName('poster_id').length > 0),
    right: 0;
forcedAnon: ($('th:contains(Name)').length === 0) // tests by looking for the Name label on the reply form
    margin-top: 0;
};
    z-index: 30;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .15);
    border-bottom: 1px solid;
    background-color: #c774ff;
    color: red
}


initStyle();
initOptionsPanel();
initPostMenu(pageData);
filterPage(pageData);


// on new posts
$(document).on('new_post', function (e, post) {
var threadId;


if ($(post).hasClass('reply')) {
threadId = $(post).parents('.thread').attr('id').replace('thread_', '');
} else {
threadId = $(post).attr('id').replace('thread_', '');
post = $(post).children('.op')[0];
}


filter(post, threadId, pageData);
div.post.reply {
quickToggle(post, threadId, pageData);
  color: #000;
});
  background: #e5a9db;
    border-right: 2px solid #d1a5d9;
    border-bottom: 2px solid #d1a5d9;
}


$(document).on('filter_page', function () {
body {
filterPage(pageData);
    background: #fad7eb;
});
    background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/doll.png);
    background-position: bottom right;
    background-repeat: no-repeat;
    background-attachment: fixed;
}
div.banner {
    background-color: #ff0034;


// shift+click on catalog to hide thread
}
if (active_page == 'catalog') {
.name:before {
$(document).on('click', '.mix', function(e) {
  content: 'Little '; } 
if (e.shiftKey) {
}
var threadId = $(this).data('id').toString();
</pre>
var postId = threadId;
|}
blacklist.add.post(pageData.boardId, threadId, postId, false);
===Glow Theme===
}
{| class="mw-collapsible mw-collapsed"
});
|
}
|-
|<pre>
.post,
input,
textarea {
  border: 1px solid #040!important;
}
 
body {
  background-color: #000;
  color: #7f7!important;
  background-image: url("https://booru.soy/_images/125c6ba37329910a8f662c25f13b80e7/39652%20-%20SoyBooru.png");
  background-size: 200px;
  background-position: 100% 0;
  animation: 10s infinite anim;
}


// clear out the old threads
.post {
purge();
  background: #020!important;
}
  color: #fff!important;
init();
  box-shadow: 0 0 50px green;
});
if (typeof window.Menu !== "undefined") {
$(document).trigger('menu_ready');
}
}
}


</pre>
.name,
|}
a {
  color: #32cd32!important;
}


==== Mass reply ====
.post.highlighted {
<big><i>This is now included in  [[#Sharty fixes|Sharty Fixes]]</i></big>
  background: #030!important;
}


Reply to everyone in a thread.
.name {
  position: relative;
}


<i>Expand to view the script</i>
.name:after {
{| class="mw-collapsible mw-collapsed"
  content: '## Fed';
|+
  font-size: 14px;
|
  display: inline-block;
  color: #0f0;
  text-shadow: 0 0 8px #0f0;
  margin-left: .25em;
}


<pre>
.boardlist {
// ==UserScript==
  background: #040!important;
// @name        Mass Reply for soyjak.party
}
// @namespace    datamining
 
// @version      0.1
.quote,
// @description  Mass reply
h1,
// @author      Chud (You)
h2,
// @match        https://soyjak.party/*
h3,
// @icon        https://soyjak.party/static/favicon.png
h4,
// @grant        none
h5 {
// ==/UserScript==
  color: #0f0!important;
(function () {
}
   function insert_after(new_node, ref_node) {
 
     ref_node.parentNode.insertBefore(new_node, ref_node.nextSibling);
@keyframes anim {
   0%, 100% {
     background-position: 100% 0;
   }
   }
   function mass_reply() {
   50% {
     let form_textarea = document.getElementById('body');
     background-position: 100% -5%;
    let post_no_nodes = document.getElementsByClassName("post_no");
    for(const node of post_no_nodes) {
      let post_no_text = node.textContent;
      if(!post_no_text.includes("No")) {
        form_textarea.value += `>>${post_no_text}\n`;
      }
    }
    form_textarea.focus();
   }
   }
 
}
  function add_button() {
 
    let ref_node = document.querySelectorAll(".op .intro .post_no")[1];
body:after {
    let button = document.createElement("input");
  content: "";
    button.type = "button";
  position: fixed;
    button.value = "Mass Reply";
  top: 0;
    button.style.marginLeft = "5px";
  left: 0;
    button.addEventListener("click", function() {
  width: 100%;
      mass_reply();
  height: 100%;
    }, false);
  z-index: -1;
   
  background-image: url("https://booru.soy/_images/bfa5349f1fe25f685db1ed8973a3d864/2158%20-%20SoyBooru.png");
    insert_after(button, ref_node);
   background-repeat: no-repeat;
   }
   background-position: 100% 100%;
    
   background-size: 150px;
   add_button();
}
})();</pre>
|}


==== Wojakificator ====
input,
Wojakificator is a JS script made by a [[bunkerchan]] user that automatically quotes any post you want an attaches a soyjak image
textarea {
  background: #030;
  color: #0f0;
}


The script might work  using User JS option, but it is recommended to use a userscript manager like [https://violentmonkey.github.io/ Violentmonkey] instead
textarea {
  background: #020;
  color: #fff;
}


[https://github.com/Wojakposter/Wojakificator Source code]
.banner {
  background-color: transparent!important;
  color: #7f7!important;
}


{{Redtext|Warning: includes some lefty and NAS images}}
#options_div {
  background-color: #020;
}


<i>Expand to view the script</i>
.options_tab_icon.active {
{| class="mw-collapsible mw-collapsed"
  color: #7f7;
|+
}
|[https://soyjak.download/f.php?h=3KGYIYNd Download link]
|}


==== Anti 4channeler posts ====
.file-hint {
Hides posts made by 4channelers.
  color: #fff!important;
}


{{Redtext|Warning: Updates the page every 4 seconds to check for new posts, can be adjusted.}}
form table tr th {
  background: #020;
}
 
.dropzone {
  color: #7f7;
}
 
.dragover {
  background: #040!important;
}
 
</pre>
|}


<i>Expand to view the script</i>
=== Pear Theme ===
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|+
!
|
|-
|<pre>
/*Pear theme*/
 
body {
background: #f4f1d0 url(<nowiki>https://file.garden/ZCftkBQZY2RSmYgu/transpear</nowiki>) right bottom no-repeat fixed;
}
 
div.post.reply {
background-color: #dee88f !important;
padding: 0.2em 0.3em 0.5em 0.6em;
border-width: 2px;
border-style: none solid solid none;
border-radius: 0.7em;
}
 
div#post-moderation-fields , div#style-select {
padding:4px;
 
}


<pre>
span.heading {
// ==UserScript==
color: #52a521 !important;
// @name        Anti 4channeler posts on soyjak.party
}
// @namespace    datamining
 
// @version      0.1
.desktop-style div.boardlist:nth-child(1) {
// @description  Hides 4channeler posts
background: #f2eda6;
// @author      Chud (You)
}
// @match        https://soyjak.party/*
 
// @icon        https://soyjak.party/static/favicon.png
div.post.reply div.body a {
// @grant        none
color: #62b532;
// ==/UserScript==
}
let posts = document.querySelectorAll('.body');
 
let replies = document.querySelectorAll(".replies");
h1 {
keys= [
color: #4a9d1b;
  "newfag",
}
  "fag",
 
  "gem",
div.blotter {
  "faggot",
color: green }
  "new fag",
 
  "newfren",
div.pages.top {
  "newfrien",
display: none;
  "chud",
}
  "frogposter",
 
  "nas",
div.pages {
  "kys",
background: #c2efb9;
  "killyourself",
}
  "go back",
</pre>
  "goback",
|}
  "reddit",
 
  "kill yourself",
=== Soyjak Theme ===
  "hang",
{| class="mw-collapsible mw-collapsed"
  "coal",
|
  "reddit frog",
|-
    "frog",
|<pre>
    "what does the reddit",
 
    "frog has to do with",
.intro span.name {
    "redditfrog",
  color: #000000;
    "frogtranny",
  font-weight: bold;
"nigger",
}
    "tranny"
 
]
.desktop-style div.boardlist:nth-child(1) {
function containsNonLatinCodepoints(s) {
  box-shadow: 0 0px 0px;
    return /[^\u0000-\u00ff]/.test(s);
  border-bottom: 0px solid;
  background: 0;
}
}
function start_filtering()
 
{
h1 {
posts = document.querySelectorAll('.body');
color: #000000;
replies = document.querySelectorAll(".replies");
text-align: center;
for(let i =0 ; i<posts.length;i++)
}
{
 
for(let j=0;j<keys.length;j++)
div.blotter {
{
   color: #000000;
   if(posts[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()) || containsNonLatinCodepoints(posts[i].innerHTML.toLowerCase()) == true )
  font-weight: bold;
{
  text-align: center;
posts[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
form table tr th {
  background: #fafafa;
}
}
 
div.post.reply.highlighted {a
    background: #fffff;
}
}


for(let i =0 ; i<replies.length;i++)
div.post.reply div.body {
{
   overflow-y: auto;
for(let j=0;j<keys.length;j++)
  max-height: 50vh;
{
   if(replies[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()))
{
replies[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
div.post.reply {
  color: #000000;
  background: #fafafa;
    border-right: 2px solid #c9c9c9;
    border-bottom: 2px solid #c9c9c9;
}
}
   
   
body {
background-image: none;
background: #ffffff url('https://i.ibb.co/Xtb2fXF/fade.png') repeat-x 50% 0%;
}
}


div.banner {
  background: 0;
  color: #000000;
  font-size: 12pt;
  font-weight: bold;
  text-align: center;
  margin: 1em 0;
}
}


start_filtering();
div.banner  a {
setInterval(start_filtering,2000);
  color: #000000;
//Interval
}


div.post.reply.highlighted {
  background: #efefef;
}


//Gifs hider
hr {
document.querySelectorAll("img").forEach(i=>{if(i.src.includes(".gif")){i.src="";}});</pre>
    border: none;
        border-top-color: currentcolor;
        border-top-style: none;
        border-top-width: medium;
    border-top: 1px solid #000000;
    height: 0;
    clear: left;
}
 
div.pages {
  background: 0;
  border: 0px solid;
}
 
#options_div, #alert_div {
  background-color: #ffffff;
 
}
 
}
</pre>
|}
|}
 
===April Fool's 2023===
==== Preview for Youtube Videos ====
April Fool's 2023 theme. Makes the sharty look like Discord.
Show preview for youtube video links.  


<i>Expand to view the script</i>
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|+
|
|-
|<pre>
|<pre>
// ==UserScript==
/* Fonts */
// @name        YouTube preview for soyjak.party
@font-face{font-family:'Discord';src:url('https://web.archive.org/web/20230401012547/https://s.kncdn.org/fonts/discord.otf') format('opentype');font-weight:normal;font-style:normal}
// @namespace    datamining
// @version      0.1
// @description  Previews YouTube videos
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
(function youtubeInlinePreviews() {


const re = /(?:youtube\.com\/watch\?v=|youtu\.be\/)(.{11})/;
/* Body */
body{
background-color:#313338;
color:#fbfbfe;
font-family:'Discord', Arial, sans-serif !important;
font-size:11pt
}


const previewTemplate = (videoId) => `<img
/* Boardlist */
.boardlist{background-color:#313338 !important}
 
/* Posts */
div.post.reply{
background-color:#313338;
border:none
}
 
/* Post Numbers */
.name:before{content:"@"}
.name{
background-color:#3d4270;
color:#c8ccfa !important
}
 
/* File Info */
input[type=checkbox],p.fileinfo{display:none}


style="max-width:255px;max-height:255px"
/* Text */
a,a:visited{color:#7289da}
time:after{content:", in #soy "}
div.post_no{
background-color:#3d4270;
font-family:Arial;
font-size:10pt;
color:#b9bdeb !important;
font-weight:bold
}
div.banner{display:none}
input,textarea{
background-color:#383a40;
color:#ffffff;
border:none !important;
border-radius:5px
}


src="<nowiki>https://i.ytimg.com/vi/${videoId}/hqdefault.jpg</nowiki>"
/* Top Bar */
div.pages.top{background:#313338 !important}


/>`;
/* Headings */
.subject,h1,h2{color:#5563e9 !important}


Array.from(document.querySelectorAll(".body a"))
/* Highlighted Post */
div.post.reply.highlighted{background:#2e3035}
div.post.reply div.body a{color:#7289da}


.filter((link) => link.href.match(re))
/* Seperator */
hr{border-top:1px solid #3f4147 !important}


.forEach((link) => {
/* Pages */
div.pages,span.heading,span.heading2{color:#5563e9}


const videoId = link.href.match(re)[1];
/* Post Form */
form table tr th{background:#5563e9}


const inlinePreview = previewTemplate(videoId);
/* FileHint */
.dropzone .file-hint{
color:rgb(114, 137, 218);
cursor:pointer;
position:relative;
margin-bottom:5px;
padding:10px 0;
top:5px;
transition:0.2s;
border:2px dashed rgba(125, 125, 125, 0.4)
}


link.innerHTML = inlinePreview;
/* Post Images */
.post-image{border-radius:15px}


});
/* Post Numbers */
.post_no{font-family:Arial, Helvetica}


})();</pre>
/* Blotter */
div.blotter{
background-color: #2b2d31;
border-radius: 25px;
color: #b5bac1
}
</pre>
|}
|}


==== Filter tripchuds ====
=== Anti - mass reply ===
To use it, change "!!TRIP GOES HERE" to any trip you want to filter (ex: !incelchud1 or !!incelchud1), can also be used to filter names if you change <blockquote> (/class="trip">!!TRIP GOES HERE</) </blockquote> to <blockquote> (/class="name">name of the chudcel you want to filter</) </blockquote>
if you want to filter multiple tripchuds, you have to do this <blockquote> (/class="trip">!!FIRST TRIP CHUD|!SECOND TRIPCHUD|!THIRD TRIPCHUD</) </blockquote>
 
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|+
|
|-
|<pre>
|<pre>
// ==UserScript==
.post.reply > .body {
// @name        Tripfag filter for soyjak.party
     max-height: 20em;
// @namespace    datamining
     overflow-y: auto;
// @version      0.1
}
// @description  Filters tripfags
</pre>
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
$(".post")
  .filter(function (index) {
    return this.innerHTML.match(/class="trip">!!TRIP GOES HERE</);
  })
  .each(function (index) {
     let whatToHide = "#" + this.id;
     if (this.id.startsWith("op_")) {
      whatToHide = "#" + this.id.replace("op_", "thread_");
    }
    $(whatToHide).hide();
  });
 
if (!localStorage.favorites) {
localStorage.favorites = '[]';
}</pre>
|}
|}
=== Cobson in the corner ===
This code was briefly added to soyjak.party and is being left here for posterity.


==== Hide tripchud posts from catalog ====
<i>Expand to view the script</i>
Hides all tripchud posts from catalog, no exceptions.
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
body { background-image: url(https://soyjaks.party/cob3.png); background-position: bottom right; background-repeat: no-repeat; background-attachment: fixed;  background-size: 100px; }</pre>
|}


<i>Expand to view the script</i>
=== Classic UI ===
Remove the visible "SAGE!" message
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|+
|
|<pre>// ==UserScript==
|-
// @name        Tripfag catalog filter for soyjak.party
|<pre>
// @namespace    datamining
a[href^='mailto:sage']::after {
// @version      0.1
  content: ' SAGE!';
// @description  Filters tripfags
  text-decoration: none;
// @author      Chud (You)
  display: none;
// @match        https://soyjak.party/*
}
// @icon        https://soyjak.party/static/favicon.png
</pre>
// @grant        none
|}
// ==/UserScript==
 
// --- start: purgeTripsFromCatalog ---
Return grid to catalog.


(function purgeTripsFromCatalog() {
{| class="mw-collapsible mw-collapsed"
  // If on a catalog page
|
  if (document.location.href.match(/catalog\.html$/)) {
|-
    // Call the API for that page
|<pre>
    fetch(document.location.href.replace(".html", ".json"))
      .then((res) => res.json())
      .then((json) =>
        json
          // Find the threads where OP is using a tripcode
          .reduce((acc, cur) => [...acc, ...cur.threads], [])
          .filter((op) => op.trip)
          // Hide them
          .forEach((filtered) => $(`div[data-id='${filtered.no}']`).hide())
      );
  }
})();


// --- end: purgeTripsFromCatalog ---</pre>
.theme-catalog div.thread img {
|}
  float: none!important;
  margin: auto;
  max-height: 150px;
  max-width: 200px;
  box-shadow: 0 0 4px rgba(0,0,0,0.55);
  border: 2px solid rgba(153,153,153,0);
}


=== Disable gif autoplay ===
.theme-catalog div.thread {
  display: inline-block;
  vertical-align: top;
  text-align: center;
  font-weight: normal;
  margin-top: 2px;
  margin-bottom: 2px;
  padding: 2px;
  height: 300px;
  width: 205px;
  overflow: hidden;
  position: relative;
  font-size: 11px;
  max-height: 300px;
  background: rgba(182,182,182,0.12);
  border: 2px solid rgba(111,111,111,0.34);
}


<i>Expand to view the script</i>
.theme-catalog div.thread strong {
{| class="mw-collapsible mw-collapsed"
  display: block;
|+
}
|<pre>// ==UserScript==
// @name    disable gif autoplay
// @version  1
// @grant    none
// @match https://soyjak.party/*
// ==/UserScript==


window.addEventListener('load', function () {
.theme-catalog div.threads {
[].slice.apply(document.images).filter(is_gif_image).map(freeze_gif);
  text-align: center;
  margin-left: -20px;
}


function is_gif_image(i) {
.theme-catalog div.thread:hover {
    return /^(?!data:).*\.gif/i.test(i.src);
  background: #D6DAF0;
  border-color: #B7C5D9;
}
}


function freeze_gif(i) {
.theme-catalog div.grid-size-vsmall img {
    var c = document.createElement('canvas');
  max-height: 33%;
    var w = c.width = i.width;
  max-width: 95%
    var h = c.height = i.height;
    c.getContext('2d').drawImage(i, 0, 0, w, h);
    try {
        i.src = c.toDataURL("image/gif");
    } catch(e) {
        for (var j = 0, a; a = i.attributes[j]; j++)
            c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
    }
}
}
})</pre>
|}
=== Strip jump.kolyma.net Links ===
<b>NOTE</b>: KolymaNET's jump script automatically blocks harmful websites, such as IP grabbers. Use this script at your own risk.


>umm it doesn't work i can still see the link when i hover over it even doe it strips it on click so it does work actually
.theme-catalog div.grid-size-vsmall {
  min-width:90px; max-width: 90px;
  max-height: 148px;
}


<i>Expand to view the script.</i>
.theme-catalog div.grid-size-small img {
{| class="mw-collapsible mw-collapsed"
   max-height: 33%;
|+
   max-width: 95%
|<pre>
// ==UserScript==
// @name        Kolyma jump stripper
// @namespace    datamining
// @version      1.0
// @description  Strips Kolyma jump links from soyjak.party
// @author      Chud (You)
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
function strip(e) {
   if (!!e.target.href) {
    e.target.href = decodeURIComponent(e.target.href.replace("https://jump.kolyma.net/?", ""));
   }
}
}


document.addEventListener("click", e => strip(e));
.theme-catalog div.grid-size-small {
document.addEventListener("auxclick", e => strip(e));</pre>
  min-width:140px; max-width: 140px;
|}
  max-height: 192px;
}


=== Ratio script ===
.theme-catalog div.grid-size-large img {
adds a [ratio] button that starts posting automated replies from a selection of 4 types: "generic","[[Cobson|cob]]","[[Trannies|trans]]" and "[[chud]]". perfect for shitposting
  max-height: 40%;
  max-width: 95%
}
 
.theme-catalog div.grid-size-large {
  min-width: 256px; max-width: 256px;
  max-height: 384px;
}
 
.theme-catalog img.thread-image {
  height: auto;
  max-width: 100%;
}
 
@media (max-width: 420px) {
  .theme-catalog ul#Grid {
    padding-left: 18px;
  }
 
  .theme-catalog div.thread {
    width: auto;
    margin-left: 0;
    margin-right: 0;
  }
 
  .theme-catalog div.threads {
    overflow: hidden;
  }
}
</pre>
|}


(feel free to add more quotes to the code, the "chud" one is very incomplete)
=== Christmas Hats ===
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|+
|
|
 
|-
<pre>
|<pre>
// ==UserScript==
[data-board] > .files > :nth-child(1):not(.multifile) > a:before {
// @name        Sharty Ratio
content: url('https://s.kncdn.org/image/hat2.gif');
// @namespace   soyjak.party
float: left;
// @match       http*://soyjak.party/*
display: block;
// @version     1.0
margin-right: -160px;
// @author      God Tier Wojack
position: relative;
// @description Ratio that nigga
top: -120px;
// ==/UserScript==
left: -30px;
const modifiers = ["==", "%%", "--", "'", ""];
let done = new Array(20);
let stringSets = {
  "Generic": ["holy shit", "holy shiiiit", "holy fuck", "holy fuck.", "fuckin hell", "holy fuckk", "holy fuckkk", "holy fuckkkk", "lfg", "lfggg", "lfgggg", "lfg!", "lfg!!", "lfgg!!!", "w", "dub", "massive w", "huge w", "gigantic w", "massive dub", "huge dub", "another dub", "another w", "gigantic w", "get his ass", "get that nigga", "lets fucking go", "lets fucking gooo", "lets fucking goooo", "lets fucking goooo", "lets fucking go!", "lets fucking go!!", "lets fucking go!!!", "lets fucking go!!!!!", "yo get his ass", "yo get em", "yooo", "yoooo", "yooooooo", "yoooooooooooo", "god damn", "got damn", "god damnnn", "damnnnnn", "own that fraud", "expose that fraud", "lets gooo", "lets gooooo", "let's goooooo", "keyed", "keyed af", "holy keyed", "gem", "massive gem", "gemerald", "wem", "huge gem", "gigantic gem", "sharty saving gem", "diamond", "sharty saving diamond", "up", "go up", "go the fuck up", "up up up", "go tf up", "'chup", "own that fraud", "get they ass", "beat his ass", "kill that nigga", "can't stop winning", "we cant stop winning bros", "diamonderald", "btfo", "eternally btfo", "zamn", "zamnnn", "holy based", "based af"],
  "Cob": ["another cob w", "#cobgang", "another gemson victory", "gemson win", "gemson victory", "gemson up", "god tier wojack", "gem tier godjack", "cobby up", "cobby go up", "godson up", "upson", "keyedson", "winson", "cob w", "cob dub", "cobby win", "#cobgang win", "#cobgang victory", "hwabag", "god tier winjack", "diamondson go up", "winson up", "gemson go up", "godson go up", "gemson dub", "gemson w", "godson dub", "godson w", "#cobgang dub", "#cobgang w", "cobwin", "he won", "he fucking won", "he cant stop winning"],
  "Trans": ["trans rights", "trans fucking rights", "trans rights won", "sisters...", "trans rights w", "trans rights dub", "trans folx won", "w trans rights", "trans rights go up", "transphobes btfo", "transphobes destroyed", "trans rights victory", "w for trans rights", "trans victory", "transerald", "trans diamond", "bump up the trans", "uptrans", "sisters go up", "upsis", "trans top", "estrogem", "estrogemerald", "bumpstrogen", "topstrogen", "winstrogen"],
   "chud":["1488","fuck niggers","kill all blacks","kanye 2024","dial eight","-ACK!","sieg heil!","jews","media is kiked","goyslop","hang yourself troon","the west has fallen","back to /leftypol/","amerimutt","women are made for rape"]
}
}
let targetPosts = [];
[data-board] > .files > :nth-child(1).multifile > a:before {
let sets = [stringSets["Generic"]];
content: url('https://s.kncdn.org/image/hat2.gif');
setInterval(() => {
float: left;
  document.querySelectorAll(".button.alert_button").forEach(e => e.click());
display: block;
  if (targetPosts.length == 0 || sets.length == 0) {
margin-right: -160px;
    return;
position: relative;
  }
top: -120px;
  let post = "";
left: -50px;
  targetPosts.forEach(p => post += `>>${p}\n`);
  let effect = "";
  if (Math.random() > 0.5) {
    effect = modifiers[Math.floor(Math.random() * modifiers.length)];
  }
  post += effect;
  let strings = sets.flat();
  stringsLength = strings.length;
  let found = false;
  while (!found) {
    text = strings[(Math.floor(Math.random() * stringsLength))];
    if (!done.includes(text)) {
      if (Math.random() > 0.5) {
        text = text.toUpperCase();
      }
      post += text;
      found = true;
      done.unshift(text);
      done.pop();
    }
  }
  post += effect;
  document.querySelector("form[name=post] textarea#body").value = post;
  document.querySelector("form[name=post] input[value*='Reply']").click();
}, 12000);
function addRatioButton(post) {
  post.querySelector(".intro").insertAdjacentHTML("beforeend", `<a href="javascript:void(0);" class="ratio" postNumber="${post.getElementsByClassName("post_no")[1].textContent}">[Ratio]</a>`);
}
let options = Options.add_tab("ratio", "gear", "Ratio").content[0];
let optionsHTML = "";
for ([key, value] of Object.entries(stringSets)) {
  optionsHTML += `<input type="checkbox" id="ratio-${key}" name="${key}"><label for="ratio-${key}">${key}</label><br>`;
}
options.insertAdjacentHTML("beforeend", optionsHTML);
options.querySelectorAll("input[type=checkbox]").forEach(e => {
  e.addEventListener("change", e => {
    sets = [];
    options.querySelectorAll("input[type=checkbox]:checked").forEach(c => sets.push(stringSets[c.getAttribute("name")]));
  });
  e.checked = e.getAttribute("name") == "Generic";
});
const updateObserver = new MutationObserver(list => {
  list.forEach(node => {
    if (node.addedNodes[0].nodeName == "DIV") {
      addRatioButton(node.addedNodes[0]);
    }
  });
});
updateObserver.observe(document.querySelector(".thread"), {
  childList: true
});
[...document.getElementsByClassName("post")].forEach(e => {
  addRatioButton(e);
});
document.addEventListener("click", e => {
  let t = e.target;
  if (t.classList.contains("ratio")) {
    if (t.textContent == "[Ratio]") {
      t.textContent = "[Unratio]";
      targetPosts.push(t.getAttribute("postNumber"));
    } else {
      targetPosts = targetPosts.filter(p => p != t.getAttribute("postNumber"));
      t.textContent = "[Ratio]";
    }
  }
});
</pre>
|}
 
 
 
== CSS ==
In addition to user JS, soyjak.party also offers an option to customize user CSS.
 
Many CSS styles can be found on https://github.com/vichan-devel/vichan/tree/master/stylesheets , and https://github.com/lainchan/lainchan/tree/master/stylesheets .
=== Custom underwater theme ===
[[File:Custom Theme.png|thumb|493x493px|The underwater theme in use]]
 
Adds marine life to your browsing experience
 
firstly, add this to your User CSS
 
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>/**
* miku.css
* For AwsumChan by Circlepuller
*/
body {
background: #D2FFEE url('img/fade-miku.png') top repeat-x;
}
 
a:link, a:visited {
text-decoration: none;
color: #00637B;
}
 
a:link:hover, a:visited:hover {
color: #DD0000;
}
 
a.post_no {
color: #000033;
}
 
.intro a.email span.name {
color: #0093AB;
}
 
.intro a.email:hover span.name {
color: #DD0000;
}
 
h2, div.title, h1 {
color: #800000;
}
 
form table tr th {
background: #95D2D3;
}
 
div.banner {
background-color: #E04000;
}
 
div.post.op hr {
border-color: #B7C9D5;
}
 
.intro span.subject {
color: #117743;
font-weight: 800;
}
 
.intro span.name {
color: #117743;
font-weight: 800;
}
 
div.post.reply.highlighted {
background: #a9d8ff;
}
 
div.post.reply {
background: #B6DDDE;
border-color: #8FCCCD;
}
 
div.ban {
border: 1px solid #0093AB;
}
 
div.ban h2 {
background: #B6DDDE;
color: #0093AB;
}
 
div.pages {
color: #8899AA;
background: #B6DDDE;
border-right: 1px solid #8FCCCD;
border-bottom: 1px solid #8FCCCD;
}
 
hr {
border-color: #B7D9C5;
}
 
div.boardlist {
color: #0093AB;
    background-color: rgba(65%, 85%, 95%, 0.2);
}
 
.desktop-style div.boardlist:nth-child(1) {
  text-shadow: #D2FFEE 1px 1px 1px, #D2FFEE -1px -1px 1px;
}
* {
  background-image: url('https://files.catbox.moe/hp03xs.png');
}
 
.soifish {
  background-image: url('https://files.catbox.moe/rxmvyr.png');
  position: fixed;
    pointer-events: none;
  -webkit-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -moz-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -o-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
}
 
@-webkit-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-moz-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-o-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
 
@-webkit-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@-moz-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@-o-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
 
 
 
.post.reply .body a:hover:after {
    content: url(https://soyjak.download/f.php?h=0lnyi5TW&p=1);
    display: block;
    position: absolute;
    left: 20px;
    top: -255px;
    pointer-events: none;
    z-index: 999;
}
 
.post.reply .body a:hover {
    position: relative;
}
 
body:after {
    content: url(https://soyjak.download/f.php?h=3EFSgyRY&p=1);
    display: block;
    position: fixed;
    bottom: 0px;
    right: 0px;
    pointer-events: none;
 
.desktop-style div.boardlist:nth-child(1):hover, .desktop-style div.boardlist:nth-child(1).cb-menu {
  background-color: rgba(70%, 95%, 100%, 0.45);
}</pre>
|}
Then add this to your User JS or Tampermonkey
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
// ==UserScript==
// @name        JS for Ocean Theme
// @namespace    datamining
// @version      0.1
// @description  Glub Glub Glub Glub
// @author      Glub
// @match        https://soyjak.party/*
// @icon        https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
var soislug = document.createElement("img");
soislug.setAttribute('src', 'https://files.catbox.moe/vpoeyt.png');
soislug.setAttribute('class', 'soislug');
document.getElementsByClassName("8chan")[0].appendChild(soislug);
var soifish = document.createElement("img");
soifish.setAttribute('src', 'https://files.catbox.moe/rxmvyr.png');
soifish.setAttribute('class', 'soifish');
document.getElementsByClassName("8chan")[0].appendChild(soifish);
</pre>
|}
 
=== Custom Soot theme ===
Soot color scheme (grey and yellow) theme, this css should be used with dark style.
 
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
/*soot theme*/
 
.name {
    color: #FDD73A !important;
}
 
body {
    background: black url(https://i.imgur.com/FeQmhfL.png) right bottom no-repeat fixed;
}
 
div.post.reply {
    background-color: #646464 !important;
    color: black;
    border-radius:0;
}
 
div#post-moderation-fields , div#style-select {
    padding:4px;
    background-color:rgba(0,0,0,28);
}
 
span.heading {
    color: #FF565C !important;
}
 
.remove-btn {
    color: rgba(255,255,255,128) !important;
}
 
hr {
    border-color:transparent;
}
</pre>
|}
 
=== Anti - mass reply ===
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
.post.reply > .body {
    max-height: 20em;
    overflow-y: auto;
}
</pre>
|}
=== Cobson in the corner ===
This code was briefly added to soyjak.party and is being left here for posterity.
 
<i>Expand to view the script</i>
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
body { background-image: url(https://soyjak.party/cob3.png); background-position: bottom right; background-repeat: no-repeat; background-attachment: fixed;  background-size: 100px; }</pre>
|}
 
=== Classic UI ===
Change the name color back to green
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
.intro span.name {
  color: #117743;
  font-weight: bold;
}
.intro span.trip {
  color: #228854;
font-weight: normal;
}
</pre>
|}
You can also add this if you wish to remove the visible "SAGE!" message
{| class="mw-collapsible mw-collapsed"
|
|-
|<pre>
a[href^='mailto:sage']::after {
  content: ' SAGE!';
  text-decoration: none;
  display: none;
}
}
</pre>
</pre>
|}
|}


=== Christmas Hats===
=== Crazy ===
{| class="mw-collapsible mw-collapsed"
{| class="mw-collapsible mw-collapsed"
|
|
|-
|-
|<pre>
|<pre>
[data-board] > .files > :nth-child(1):not(.multifile) > a:before {
html,p{color:#fa412a}*{transition:7.13s;font-family:'Comic Sans MS','Times New Roman',Times,serif;border:1px solid #000;background-color:#f0f;animation:.5s infinite shake,10s infinite colorchange}html{background:linear-gradient(to right,#4a412a,#fa412a,#f0f);text-shadow:2px 2px 2px #000}a{color:#1a412a;font-size:30px;text-decoration:underline;animation:.5s infinite shake,10s infinite colorchange,2s infinite alternate grow}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}@keyframes colorchange{0%,100%{color:#fa412a}25%,75%{color:#f0f}50%{color:#1a412a}}@keyframes grow{0%{transform:scale(1)}100%{transform:scale(1.2)}}a:hover{color:#f0f;font-size:48px;filter:blur(3px)}p{text-transform:uppercase}p:hover{color:#f0f;font-size:72px;transform:scale(1.2)}
content: url('https://s.kncdn.org/image/hat2.gif');
float: left;
display: block;
margin-right: -160px;
position: relative;
top: -120px;
left: -30px;
}
[data-board] > .files > :nth-child(1).multifile > a:before {
content: url('https://s.kncdn.org/image/hat2.gif');
float: left;
display: block;
margin-right: -160px;
position: relative;
top: -120px;
left: -50px;
}
</pre>
</pre>
|}
|}


=== FUCK ONGEZELLIG SUITE (FOS) ===
removes the coal NAS ongezellig banner
img[src="<nowiki>https://soyjak.party/static/banner/45.png</nowiki>"] {
padding: 100px 300px 0px 0px;
background: url('<nowiki>https://soyjak.party/static/banner/1.png'</nowiki>);
background-size: 300px 100px;
width: 0px;
height: 0px;


}
{{Reflist}}

Revision as of 15:49, 8 March 2024

The theme and functionality of soyjak.party can be endlessly customized. This page catalogs working stylesheets and user scripts that soyjak.party users have created.

To add a CSS theme from here, on the soyjak.party website in the top right go to the Options->User CSS and paste it in the text box. To add javascript code snippets from here, copy and paste them into Options->User JS

Code Snippets

Sharty Fixes Gemerald

The original Sharty Fixes was deleted for an unknown reason. If you wish to use the original Sharty Fixes instead, it can be installed from here.

A small userscript that fixes the following bugs with the sharty:


  • Time inaccuracy Resolved
  • Google captcha not resetting Resolved
  • Quick reply Google captcha endless loading Resolved
  • Clicking post number sometimes refreshing the page
  • Multi-line automatic greentext
  • Reporting posts from the overboard
  • Automatically load and complete vichan text captcha (NOT KAPTCHA)
  • Reset text captcha when post fails
  • Submit post with Ctrl+Enter
  • Bypass wordfilter
  • Hide password
  • Hide threads from catalog (Shift+Click, triple tap on mobile)
  • Hide blotter
  • Search catalog
  • Image from URL (userscript manager only, User JS option breaks from CORS)
  • Remove kolyma jump datamining
  • (Optional) - Revert to classic UI
  • (Optional) - Quick quote, mass reply/quote
  • (Optional) - Anonymise name/trips
  • (Optional) - Truncate long posts
  • (Optional) - Hide images from saged posts


Install from Greasy Fork into a userscript manager.

Sharty Themes

Should be used with Sharty Fixes Gemerald

Install from Greasy Fork userscript manager.

SoyParty-X

Features:

  • Detects flood posts and hides them (you can set amount of lines and words to hide)
  • Forced anonymity (hides namefags, can be disabled)
  • Hides emailfags or sagefags (can be disabled for sagefags)
  • Highlights triple parentheses
  • Highlights datamining (makes posts glow)
  • Inline Youtube Previews (+invidious support)
  • Replaces "Gem" and "Coal" with minecraft icons
  • Replaces "Bump" and "Sage" with upvote and downvote icons

Expand to view the script

// ==UserScript==
// @name         SoyParty-X
// @namespace    datamining
// @version      0.2
// @description  Cure the cancer that is killing soyjak.party
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==

/* eslint-env jquery */

/*

Changelog:

0.2:

- hidePosts() now detects flood posts.

0.1:

- hidePosts()
- forcedAnonymity()
- highlightTripleParentheses()
- highlightDatamining()
- inlineYoutubePreviews()
- replaceCoalAndGemsWithIcon()
- replaceBumpAndSageWithIcons()

*/

(function SoyPartyX() {
  // true = hide posts where the e-mail is "sage".
  const _hideMailtoSage = true;

  // true = scrub email, trip, and force all names to be "Chud".
  // - Emailfags and tripfags are already hidden.
  // - Namefags aren't hidden, but turning this on will anonymize them.
  // false = don't change posts (default).
  const _enableForcedAnonymity = false;

  // Sets the limit for a post to be considered a flood post.
  // If one of the criteria is met, the post is hidden.
  const floodThresholdLines = 30;
  const floodThresholdCharacters = 3000;

  hidePosts();
  forcedAnonymity(); // Must come AFTER hidePosts()
  highlightTripleParentheses();
  highlightDatamining();
  inlineYoutubePreviews();
  replaceCoalAndGemsWithIcon();
  replaceBumpAndSageWithIcons();

  function hidePosts() {
    $(".post").each((i, el) => {
      const $el = $(el);
      const reasons = [];

      const isOp = $el.hasClass("op");

      if ($el.has(".trip").length) {
        reasons.push("tripfag");
      }
      if (_hideMailtoSage && $el.has('a.email[href^="mailto:sage"]').length) {
        reasons.push("sagefag");
      }
      if ($el.has('a.email:not([href^="mailto:sage"])').length) {
        reasons.push("emailfag");
      }

      const body = $el.has(".body");
      const bodyLines = body.html().split("<br>").length;
      const bodyLength = body.text().length;

      if (
        bodyLines > floodThresholdLines ||
        bodyLength > floodThresholdCharacters
      ) {
        reasons.push(
          `possible flooding: ${bodyLength} characters in ${bodyLines} lines`
        );
      }

      if (reasons.length) {
        const $notice = $("<div>")
          .addClass(`post ${isOp ? "op" : "reply"}`)
          .html(
            `<div class='body'><em>Post hidden (${reasons.join(
              ", "
            )}). Click to show.</em></div>`
          )
          .after($("<br>"));
        $notice.click(() => {
          $el.show();
          if (isOp) $el.prev(".files").show();
          $notice.hide();
        });
        $el.after($notice);
        $el.hide();
        if (isOp) $el.prev(".files").hide();
      }
    });
  }

  function forcedAnonymity() {
    if (!_enableForcedAnonymity) return;
    // Remove all emails.
    $("a.email").prop("outerHTML", "<span class='name'>Chud</span>");
    // Remove all tripcodes.
    $(".trip").prop("outerHTML", "");
    // Set all names to Chud.
    // Make sure not to overwrite (You)'s.
    $(".name")
      .filter((i, el) => !$(el).has(".own_post").length)
      .text("Chud");
  }

  function replaceWordWithIcon(re, icon) {
    const matchesRe = (index, post) => $(post).html().match(re);

    const template = (match) =>
      `<img src="${icon}" style="max-height:2em; vertical-align:middle">`;

    const applyTemplate = (index, post) => {
      const $post = $(post);
      const html = $post.html();
      $post.html(html.replace(re, template));
    };

    $("div.body").filter(matchesRe).each(applyTemplate);
  }

  function replaceCoalAndGemsWithIcon() {
    replaceWordWithIcon(/coal/gi, "https://i.imgur.com/O9iRcRv.png");
    replaceWordWithIcon(/gems?/gi, "https://i.imgur.com/BvjFdau.png");
  }

  function replaceBumpAndSageWithIcons() {
    // replaceWordWithIcon(/bump/gi, "https://i.imgur.com/zM2xOGh.png");
    // replaceWordWithIcon(/sage/gi, "https://i.imgur.com/2bsauzj.png");
    replaceWordWithIcon(/bump/gi, "https://i.imgur.com/Y7cpsW0.png");
    replaceWordWithIcon(/\bsage\b/gi, "https://i.imgur.com/ZarQtY3.png");
  }

  function highlightTripleParentheses() {
    const re = /\(\(\(.+?\)\)\)/g;
    const hasRe = (i, post) => post.innerHTML.match(re);

    const template = (match) =>
      `<span style='background-color:white;color:#0038B8;font-family:monospace;'>${match}</span>`;
    const applyTemplate = (i, post) => {
      post.innerHTML = post.innerHTML.replace(re, template);
    };

    $("div.body").filter(hasRe).each(applyTemplate);
  }

  function highlightDatamining() {
    const reGlowie =
      /data(\s*|-)min(ing|er|ed)|(sell|selling|sold)\s+(my|our)?\s+data|cuckflare|cloudflare|cloud fleur/i;
    const hasReGlowie = (i, post) => post.innerHTML.match(reGlowie);
    const applyTemplate = (i, post) =>
      $(post).css({
        backgroundColor: "#D7EFD7",
        boxShadow: "#66FF66 0 0 2rem 0",
      });
    $(".reply").filter(hasReGlowie).each(applyTemplate);
  }

  function inlineYoutubePreviews() {
    const re = /(?:youtu\.be\/|\/watch\?v=)(.{11})/;
    const previewTemplate = (videoId) =>
      `<a href="https://youtube.com/watch?v=${videoId}">https://youtube.com/watch?v=${videoId}</a><br><img style="max-width:255px;max-height:255px" src="https://i.ytimg.com/vi/${videoId}/hqdefault.jpg" /><br><em>Watch on <a href="https://yewtu.be/${videoId}">Invidious</a> (less datamining)</em><br>`;
    $(".body a")
      .filter(function (i) {
        return $(this).prop("href").match(re);
      })
      .each(function (i) {
        $(this).prop("outerHTML", previewTemplate(this.href.match(re)[1]));
      });
  }
})();

Post Filters

Allows you to filter posts based on comments, subject, name, and tripcode To access filters click on options button.

Expand to view the script

// @name         Post Filters for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Filter posts on soyjak.party
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
/*
 * post-menu.js - adds dropdown menu to posts
 *
 * Creates a global Menu object with four public methods:
 *
 *   Menu.onclick(fnc)
 *     registers a function to be executed after button click, before the menu is displayed
 *   Menu.add_item(id, text[, title])
 *     adds an item to the top level of menu
 *   Menu.add_submenu(id, text)
 *     creates and returns a List object through which to manipulate the content of the submenu
 *   Menu.get_submenu(id)
 *     returns the submenu with the specified id from the top level menu
 *
 *   The List object contains all the methods from Menu except onclick()
 *
 *   Example usage:
 *     Menu.add_item('filter-menu-hide', 'Hide post');
 *     Menu.add_item('filter-menu-unhide', 'Unhide post');
 *
 *     submenu = Menu.add_submenu('filter-menu-add', 'Add filter');
 *         submenu.add_item('filter-add-post-plus', 'Post +', 'Hide post and all replies');
 *         submenu.add_item('filter-add-id', 'ID');
 *  
 * Usage:
 *   $config['additional_javascript'][] = 'js/jquery.min.js';
 *   $config['additional_javascript'][] = 'js/post-menu.js';
 */
$(document).ready(function () {

var List = function (menuId, text) {
	this.id = menuId;
	this.text = text;
	this.items = [];

	this.add_item = function (itemId, text, title) {
		this.items.push(new Item(itemId, text, title));
	};
	this.list_items = function () {
		var array = [];
		var i, length, obj, $ele;

		if ($.isEmptyObject(this.items))
			return;

		length = this.items.length;
		for (i = 0; i < length; i++) {
			obj = this.items[i];

			$ele = $('<li>', {id: obj.id}).text(obj.text);
			if ('title' in obj) $ele.attr('title', obj.title);

			if (obj instanceof Item) {
				$ele.addClass('post-item');
			} else {
				$ele.addClass('post-submenu');

				$ele.prepend(obj.list_items());
				$ele.append($('<span>', {class: 'post-menu-arrow'}).text('»'));
			}

			array.push($ele);
		}

		return $('<ul>').append(array);
	};
	this.add_submenu = function (menuId, text) {
		var ele = new List(menuId, text);
		this.items.push(ele);
		return ele;
	};
	this.get_submenu = function (menuId) {
		for (var i = 0; i < this.items.length; i++) {
			if ((this.items[i] instanceof Item) || this.items[i].id != menuId) continue;
			return this.items[i];
		}
	};
};

var Item = function (itemId, text, title) {
	this.id = itemId;
	this.text = text;

	// optional
	if (typeof title != 'undefined') this.title = title;
};

function buildMenu(e) {
	var pos = $(e.target).offset();
	var i, length;

	var $menu = $('<div class="post-menu"></div>').append(mainMenu.list_items());

	//  execute registered click handlers
	length = onclick_callbacks.length;
	for (i = 0; i < length; i++) {
		onclick_callbacks[i](e, $menu);
	}

	//  set menu position and append to page
	 $menu.css({top: pos.top, left: pos.left + 20});
	 $('body').append($menu);
}

function addButton(post) {
	var $ele = $(post);
	$ele.find('input.delete').after(
		$('<a>', {href: '#', class: 'post-btn', title: 'Post menu'}).text('▶')
	);
}


/* * * * * * * * * *
    Public methods
 * * * * * * * * * */
var Menu = {};
var mainMenu = new List();
var onclick_callbacks = [];

Menu.onclick = function (fnc) {
	onclick_callbacks.push(fnc);
};

Menu.add_item = function (itemId, text, title) {
	mainMenu.add_item(itemId, text, title);
};

Menu.add_submenu = function (menuId, text) {
	return mainMenu.add_submenu(menuId, text);
};

Menu.get_submenu = function (id) {
	return mainMenu.get_submenu(id);
};

window.Menu = Menu;


/* * * * * * * *
    Initialize
 * * * * * * * */

/*  Styling
 */
var $ele, cssStyle, cssString;

$ele = $('<div>').addClass('post reply').hide().appendTo('body');
cssStyle = $ele.css(['border-top-color']);
cssStyle.hoverBg = $('body').css('background-color');
$ele.remove();

cssString =
	'\n/*** Generated by post-menu ***/\n' +
	'.post-menu {position: absolute; font-size: 12px; line-height: 1.3em;}\n' +
	'.post-menu ul {\n' +
	'    background-color: '+ cssStyle['border-top-color'] +'; border: 1px solid #666;\n' +
	'    list-style: none; padding: 0; margin: 0; white-space: nowrap;\n}\n' +
	'.post-menu .post-submenu{white-space: normal; width: 90px;}' +
	'.post-menu .post-submenu>ul{white-space: nowrap; width: auto;}' +
	'.post-menu li {cursor: pointer; position: relative; padding: 4px 4px; vertical-align: middle;}\n' +
	'.post-menu li:hover {background-color: '+ cssStyle.hoverBg +';}\n' +
	'.post-menu ul ul {display: none; position: absolute;}\n' +
	'.post-menu li:hover>ul {display: block; left: 100%; margin-top: -3px;}\n' +
	'.post-menu-arrow {float: right; margin-left: 10px;}\n' +
	'.post-menu.hidden, .post-menu .hidden {display: none;}\n' +
	'.post-btn {transition: transform 0.1s; width: 15px; text-align: center; font-size: 10pt; opacity: 0.8; text-decoration: none; margin: -6px 0px 0px -5px !important; display: inline-block;}\n' +
	'.post-btn:hover {opacity: 1;}\n' +
	'.post-btn-open {transform: rotate(90deg);}\n';

if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
$('style.generated-css').html($('style.generated-css').html() + cssString);

/*  Add buttons
 */
$('.reply:not(.hidden), .thread>.op').each(function () {
	addButton(this);
 });

 /*  event handlers
  */
$('form[name=postcontrols]').on('click', '.post-btn', function (e) {
	e.preventDefault();
	var post = e.target.parentElement.parentElement;
	$('.post-menu').remove();

	if ($(e.target).hasClass('post-btn-open')) {
		$('.post-btn-open').removeClass('post-btn-open');
	} else {
		//  close previous button
		$('.post-btn-open').removeClass('post-btn-open');
		$(post).find('.post-btn').addClass('post-btn-open');

		buildMenu(e);
	}
});

$(document).on('click', function (e){
	if ($(e.target).hasClass('post-btn') || $(e.target).hasClass('post-submenu'))
		return;

	$('.post-menu').remove();
	$('.post-btn-open').removeClass('post-btn-open');
});

// on new posts
$(document).on('new_post', function (e, post) {
	addButton(post);
});

$(document).trigger('menu_ready');
});


// Post Filters
if (active_page === 'thread' || active_page === 'index' || active_page === 'catalog' || active_page === 'ukko') {
	$(document).on('menu_ready', function () {
		'use strict';
		
		// returns blacklist object from storage
		function getList() {
			return JSON.parse(localStorage.postFilter);
		}

		// stores blacklist into storage and reruns the filter
		function setList(blacklist) {
			localStorage.postFilter = JSON.stringify(blacklist);
			$(document).trigger('filter_page');
		}

		// unit: seconds
		function timestamp() {
			return Math.floor((new Date()).getTime() / 1000);
		}

		function initList(list, boardId, threadId) {
			if (typeof list.postFilter[boardId] == 'undefined') {
				list.postFilter[boardId] = {};
				list.nextPurge[boardId] = {};
			}
			if (typeof list.postFilter[boardId][threadId] == 'undefined') {
				list.postFilter[boardId][threadId] = [];
			}
			list.nextPurge[boardId][threadId] = {timestamp: timestamp(), interval: 86400};  // 86400 seconds == 1 day
		}

		function addFilter(type, value, useRegex) {
			var list = getList();
			var filter = list.generalFilter;
			var obj = {
				type: type,
				value: value,
				regex: useRegex
			};

			for (var i=0; i<filter.length; i++) {
				if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex)
					return;
			}

			filter.push(obj);
			setList(list);
			drawFilterList();
		}

		function removeFilter(type, value, useRegex) {
			var list = getList();
			var filter = list.generalFilter;

			for (var i=0; i<filter.length; i++) {
				if (filter[i].type == type && filter[i].value == value && filter[i].regex == useRegex) {
					filter.splice(i, 1);
					break;
				}
			}

			setList(list);
			drawFilterList();
		}

		function nameSpanToString(el) {
			var s = ''; 

			$.each($(el).contents(), function(k,v) {
				if (v.nodeName === 'IMG')
					s=s+$(v).attr('alt')
				
				if (v.nodeName === '#text')
					s=s+v.nodeValue
			});
			return s.trim();
		}

		var blacklist = {
			add: {
				post: function (boardId, threadId, postId, hideReplies) {
					var list = getList();
					var filter = list.postFilter;

					initList(list, boardId, threadId);

					for (var i in filter[boardId][threadId]) {
						if (filter[boardId][threadId][i].post == postId) return;
					}
					filter[boardId][threadId].push({
						post: postId,
						hideReplies: hideReplies
					});
					setList(list);
				},
				uid: function (boardId, threadId, uniqueId, hideReplies) {
					var list = getList();
					var filter = list.postFilter;

					initList(list, boardId, threadId);

					for (var i in filter[boardId][threadId]) {
						if (filter[boardId][threadId][i].uid == uniqueId) return;
					}
					filter[boardId][threadId].push({
						uid: uniqueId,
						hideReplies: hideReplies
					});
					setList(list);
				}
			},
			remove: {
				post: function (boardId, threadId, postId) {
					var list = getList();
					var filter = list.postFilter;

					// thread already pruned
					if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
						return;

					for (var i=0; i<filter[boardId][threadId].length; i++) {
						if (filter[boardId][threadId][i].post == postId) {
							filter[boardId][threadId].splice(i, 1);
							break;
						}
					}

					if ($.isEmptyObject(filter[boardId][threadId])) {
						delete filter[boardId][threadId];
						delete list.nextPurge[boardId][threadId];

						if ($.isEmptyObject(filter[boardId])) {
							delete filter[boardId];
							delete list.nextPurge[boardId];
						}
					}
					setList(list);
				},
				uid: function (boardId, threadId, uniqueId) {
					var list = getList();
					var filter = list.postFilter;

					// thread already pruned
					if (typeof filter[boardId] == 'undefined' || typeof filter[boardId][threadId] == 'undefined')
						return;

					for (var i=0; i<filter[boardId][threadId].length; i++) {
						if (filter[boardId][threadId][i].uid == uniqueId) {
							filter[boardId][threadId].splice(i, 1);
							break;
						}
					}

					if ($.isEmptyObject(filter[boardId][threadId])) {
						delete filter[boardId][threadId];
						delete list.nextPurge[boardId][threadId];

						if ($.isEmptyObject(filter[boardId])) {
							delete filter[boardId];
							delete list.nextPurge[boardId];
						}
					}
					setList(list);
				}
			}
		};

		/* 
		 *  hide/show the specified thread/post
		 */
		function hide(ele) {
			var $ele = $(ele);

			if ($(ele).data('hidden'))
				return;

			$(ele).data('hidden', true);
			if ($ele.hasClass('op')) {
				$ele.parent().find('.body, .files, .video-container').not($ele.children('.reply').children()).hide();

				// hide thread replies on index view
				if (active_page == 'index' || active_page == 'ukko') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').hide();
			} else {
				// normal posts
				$ele.children('.body, .files, .video-container').hide();
			}
		}
		function show(ele) {
			var $ele = $(ele);

			$(ele).data('hidden', false);
			if ($ele.hasClass('op')) {
				$ele.parent().find('.body, .files, .video-container').show();
				if (active_page == 'index') $ele.parent().find('.omitted, .reply:not(.hidden), post_no, .mentioned, br').show();
			} else {
				// normal posts
				$ele.children('.body, .files, .video-container').show();
			}
		}

		/* 
		 *  create filter menu when the button is clicked
		 */
		function initPostMenu(pageData) {
			var Menu = window.Menu;
			var submenu;
			Menu.add_item('filter-menu-hide', _('Hide post'));
			Menu.add_item('filter-menu-unhide', _('Unhide post'));

			submenu = Menu.add_submenu('filter-menu-add', _('Add filter'));
				submenu.add_item('filter-add-post-plus', _('Post +'), _('Hide post and all replies'));
				submenu.add_item('filter-add-id', _('ID'));
				submenu.add_item('filter-add-id-plus', _('ID +'), _('Hide ID and all replies'));
				submenu.add_item('filter-add-name', _('Name'));
				submenu.add_item('filter-add-trip', _('Tripcode'));

			submenu = Menu.add_submenu('filter-menu-remove', _('Remove filter'));
				submenu.add_item('filter-remove-id', _('ID'));
				submenu.add_item('filter-remove-name', _('Name'));
				submenu.add_item('filter-remove-trip', _('Tripcode'));

			Menu.onclick(function (e, $buffer) {
				var ele = e.target.parentElement.parentElement;
				var $ele = $(ele);

				var threadId = $ele.parent().attr('id').replace('thread_', '');
				var boardId = $ele.parent().data('board');
				var postId = $ele.find('.post_no').not('[id]').text();
				if (pageData.hasUID) {
					var postUid = $ele.find('.poster_id').text();
				}

				var postName;
				var postTrip = '';
				if (!pageData.forcedAnon) {
					postName = (typeof $ele.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($ele.find('.name')[0]);
					postTrip = $ele.find('.trip').text();
				}

				/*  display logic and bind click handlers
				 */

				 // unhide button
				if ($ele.data('hidden')) {
					$buffer.find('#filter-menu-unhide').click(function () {
						//  if hidden due to post id, remove it from blacklist
						//  otherwise just show this post
						blacklist.remove.post(boardId, threadId, postId);
						show(ele);
					});
					$buffer.find('#filter-menu-hide').addClass('hidden');
				} else {
					$buffer.find('#filter-menu-unhide').addClass('hidden');
					$buffer.find('#filter-menu-hide').click(function () {
						blacklist.add.post(boardId, threadId, postId, false);
					});
				}

				//  post id
				if (!$ele.data('hiddenByPost')) {
					$buffer.find('#filter-add-post-plus').click(function () {
						blacklist.add.post(boardId, threadId, postId, true);
					});
				} else {
					$buffer.find('#filter-add-post-plus').addClass('hidden');
				}

				// UID
				if (pageData.hasUID && !$ele.data('hiddenByUid')) {
					$buffer.find('#filter-add-id').click(function () {
						blacklist.add.uid(boardId, threadId, postUid, false);
					});
					$buffer.find('#filter-add-id-plus').click(function () {
						blacklist.add.uid(boardId, threadId, postUid, true);
					});

					$buffer.find('#filter-remove-id').addClass('hidden');
				} else if (pageData.hasUID) {
					$buffer.find('#filter-remove-id').click(function () {
						blacklist.remove.uid(boardId, threadId, postUid);
					});

					$buffer.find('#filter-add-id').addClass('hidden');
					$buffer.find('#filter-add-id-plus').addClass('hidden');
				} else {
					// board doesn't use UID
					$buffer.find('#filter-add-id').addClass('hidden');
					$buffer.find('#filter-add-id-plus').addClass('hidden');
					$buffer.find('#filter-remove-id').addClass('hidden');
				}

				//  name
				if (!pageData.forcedAnon && !$ele.data('hiddenByName')) {
					$buffer.find('#filter-add-name').click(function () {
						addFilter('name', postName, false);
					});

					$buffer.find('#filter-remove-name').addClass('hidden');
				} else if (!pageData.forcedAnon) {
					$buffer.find('#filter-remove-name').click(function () {
						removeFilter('name', postName, false);
					});

					$buffer.find('#filter-add-name').addClass('hidden');
				} else {
					// board has forced anon
					$buffer.find('#filter-remove-name').addClass('hidden');
					$buffer.find('#filter-add-name').addClass('hidden');
				}

				//  tripcode
				if (!pageData.forcedAnon && !$ele.data('hiddenByTrip') && postTrip !== '') {
					$buffer.find('#filter-add-trip').click(function () {
						addFilter('trip', postTrip, false);
					});

					$buffer.find('#filter-remove-trip').addClass('hidden');
				} else if (!pageData.forcedAnon && postTrip !== '') {
					$buffer.find('#filter-remove-trip').click(function () {
						removeFilter('trip', postTrip, false);
					});

					$buffer.find('#filter-add-trip').addClass('hidden');
				} else {
					// board has forced anon
					$buffer.find('#filter-remove-trip').addClass('hidden');
					$buffer.find('#filter-add-trip').addClass('hidden');
				}

				/*  hide sub menus if all items are hidden
				 */
				if (!$buffer.find('#filter-menu-remove > ul').children().not('.hidden').length) {
					$buffer.find('#filter-menu-remove').addClass('hidden');
				}
				if (!$buffer.find('#filter-menu-add > ul').children().not('.hidden').length) {
					$buffer.find('#filter-menu-add').addClass('hidden');
				}
			});
		}

		/* 
		 *  hide/unhide thread on index view
		 */
		function quickToggle(ele, threadId, pageData) {
			/*if ($(ele).find('.hide-thread-link').length)
				$('.hide-thread-link').remove();*/

			if ($(ele).hasClass('op') && !$(ele).find('.hide-thread-link').length) {
				$('<a class="hide-thread-link" style="float:left;margin-right:5px" href="javascript:void(0)">[' + ($(ele).data('hidden') ? '+' : '–') + ']</a>')
					.insertBefore($(ele).find(':not(h2,h2 *):first'))
					.click(function() {
						var postId = $(ele).find('.post_no').not('[id]').text();
						var hidden = $(ele).data('hidden');
						var boardId = $(ele).parents('.thread').data('board');
					
						if (hidden) {
							blacklist.remove.post(boardId, threadId, postId, false);
							$(this).html('[–]');
						} else {
							blacklist.add.post(boardId, threadId, postId, false);
							$(this).text('[+]');
						}
					});
			}
		}

		/*
		 *  determine whether the reply post should be hidden
		 *   - applies to all posts on page load or filtering rule change
		 *   - apply to new posts on thread updates
		 *   - must explicitly set the state of each attributes because filter will reapply to all posts after filtering rule change
		 */
		function filter(post, threadId, pageData) {
			var $post = $(post);

			var list = getList();
			var postId = $post.find('.post_no').not('[id]').text();
			var name, trip, uid, subject, comment;
			var i, length, array, rule, pattern;  // temp variables

			var boardId	      = $post.data('board');
			if (!boardId) boardId = $post.parents('.thread').data('board');

			var localList   = pageData.localList;
			var noReplyList = pageData.noReplyList;
			var hasUID      = pageData.hasUID;
			var forcedAnon  = pageData.forcedAnon;

			var hasTrip = ($post.find('.trip').length > 0);
			var hasSub = ($post.find('.subject').length > 0);

			$post.data('hidden', false);
			$post.data('hiddenByUid', false);
			$post.data('hiddenByPost', false);
			$post.data('hiddenByName', false);
			$post.data('hiddenByTrip', false);
			$post.data('hiddenBySubject', false);
			$post.data('hiddenByComment', false);

			// add post with matched UID to localList
			if (hasUID &&
				typeof list.postFilter[boardId] != 'undefined' &&
				typeof list.postFilter[boardId][threadId] != 'undefined') {
				uid = $post.find('.poster_id').text();
				array = list.postFilter[boardId][threadId];

				for (i=0; i<array.length; i++) {
					if (array[i].uid == uid) {
						$post.data('hiddenByUid', true);
						localList.push(postId);
						if (array[i].hideReplies) noReplyList.push(postId);
						break;
					}
				}
			}

			// match localList
			if (localList.length) {
				if ($.inArray(postId, localList) != -1) {
					if ($post.data('hiddenByUid') !== true) $post.data('hiddenByPost', true);
					hide(post);
				}
			}

			// matches generalFilter
			if (!forcedAnon)
				name = (typeof $post.find('.name').contents()[0] == 'undefined') ? '' : nameSpanToString($post.find('.name')[0]);
			if (!forcedAnon && hasTrip)
				trip = $post.find('.trip').text();
			if (hasSub)
				subject = $post.find('.subject').text();

			array = $post.find('.body').contents().filter(function () {if ($(this).text() !== '') return true;}).toArray();
			array = $.map(array, function (ele) {
				return $(ele).text().trim();
			});
			comment = array.join(' ');


			for (i = 0, length = list.generalFilter.length; i < length; i++) {
				rule = list.generalFilter[i];

				if (rule.regex) {
					pattern = new RegExp(rule.value);
					switch (rule.type) {
						case 'name':
							if (!forcedAnon && pattern.test(name)) {
								$post.data('hiddenByName', true);
								hide(post);
							}
							break;
						case 'trip':
							if (!forcedAnon && hasTrip && pattern.test(trip)) {
								$post.data('hiddenByTrip', true);
								hide(post);
							}
							break;
						case 'sub':
							if (hasSub && pattern.test(subject)) {
								$post.data('hiddenBySubject', true);
								hide(post);
							}
							break;
						case 'com':
							if (pattern.test(comment)) {
								$post.data('hiddenByComment', true);
								hide(post);
							}
							break;
					}
				} else {
					switch (rule.type) {
						case 'name':
							if (!forcedAnon && rule.value == name) {
								$post.data('hiddenByName', true);
								hide(post);
							}
							break;
						case 'trip':
							if (!forcedAnon && hasTrip && rule.value == trip) {
								$post.data('hiddenByTrip', true);
								hide(post);
							}
							break;
						case 'sub':
							pattern = new RegExp('\\b'+ rule.value+ '\\b');
							if (hasSub && pattern.test(subject)) {
								$post.data('hiddenBySubject', true);
								hide(post);
							}
							break;
						case 'com':
							pattern = new RegExp('\\b'+ rule.value+ '\\b');
							if (pattern.test(comment)) {
								$post.data('hiddenByComment', true);
								hide(post);
							}
							break;
					}
				}
			}

			// check for link to filtered posts
			$post.find('.body a').not('[rel="nofollow"]').each(function () {
				var replyId = $(this).text().match(/^>>(\d+)$/);

				if (!replyId)
					return;

				replyId = replyId[1];
				if ($.inArray(replyId, noReplyList) != -1) {
					hide(post);
				}
			});

			// post didn't match any filters
			if (!$post.data('hidden')) {
				show(post);
			}
		}

		/*  (re)runs the filter on the entire page
		 */
		 function filterPage(pageData) {
			var list = getList();

			if (active_page != 'catalog') {

				// empty the local and no-reply list
				pageData.localList = [];
				pageData.noReplyList = [];

				$('.thread').each(function () {
					var $thread = $(this);
					// disregard the hidden threads constructed by post-hover.js
					if ($thread.css('display') == 'none')
						return;

					var threadId = $thread.attr('id').replace('thread_', '');
					var boardId = $thread.data('board');
					var op = $thread.children('.op')[0];
					var i, array;  // temp variables

					// add posts to localList and noReplyList
					if (typeof list.postFilter[boardId] != 'undefined' && typeof list.postFilter[boardId][threadId] != 'undefined') {
						array = list.postFilter[boardId][threadId];
						for (i=0; i<array.length; i++) {
							if ( typeof array[i].post == 'undefined')
								continue;

							pageData.localList.push(array[i].post);
							if (array[i].hideReplies) pageData.noReplyList.push(array[i].post);
						}
					}
					// run filter on OP
					filter(op, threadId, pageData);
					quickToggle(op, threadId, pageData);

					// iterate filter over each post
					if (!$(op).data('hidden') || active_page == 'thread') {
						$thread.find('.reply').not('.hidden').each(function () {
							filter(this, threadId, pageData);
						});
					}

				});
			} else {
				var postFilter = list.postFilter[pageData.boardId];
				var $collection = $('.mix');

				if ($.isEmptyObject(postFilter))
					return;

				// for each thread that has filtering rules
				// check if filter contains thread OP and remove the thread from catalog
				$.each(postFilter, function (key, thread) {
					var threadId = key;
					$.each(thread, function () {
						if (this.post == threadId) {
							$collection.filter('[data-id='+ threadId +']').remove();
						}
					});
				});
			}
		 }

		function initStyle() {
			var $ele, cssStyle, cssString;

			$ele = $('<div>').addClass('post reply').hide().appendTo('body');
			cssStyle = $ele.css(['background-color', 'border-color']);
			cssStyle.hoverBg = $('body').css('background-color');
			$ele.remove();

			cssString = '\n/*** Generated by post-filter ***/\n' +
				'#filter-control input[type=text] {width: 130px;}' +
				'#filter-control input[type=checkbox] {vertical-align: middle;}' +
				'#filter-control #clear {float: right;}\n' +
				'#filter-container {margin-top: 20px; border: 1px solid; height: 270px; overflow: auto;}\n' +
				'#filter-list {width: 100%; border-collapse: collapse;}\n' +
				'#filter-list th {text-align: center; height: 20px; font-size: 14px; border-bottom: 1px solid;}\n' +
				'#filter-list th:nth-child(1) {text-align: center; width: 70px;}\n' +
				'#filter-list th:nth-child(2) {text-align: left;}\n' +
				'#filter-list th:nth-child(3) {text-align: center; width: 58px;}\n' +
				'#filter-list tr:not(#header) {height: 22px;}\n' +
				'#filter-list tr:nth-child(even) {background-color:rgba(255, 255, 255, 0.5);}\n' +
				'#filter-list td:nth-child(1) {text-align: center; width: 70px;}\n' +
				'#filter-list td:nth-child(3) {text-align: center; width: 58px;}\n' +
				'#confirm {text-align: right; margin-bottom: -18px; padding-top: 2px; font-size: 14px; color: #FF0000;}';

			if (!$('style.generated-css').length) $('<style class="generated-css">').appendTo('head');
			$('style.generated-css').html($('style.generated-css').html() + cssString);
		}

		function drawFilterList() {
			var list = getList().generalFilter;
			var $ele = $('#filter-list');
			var $row, i, length, obj, val;

			var typeName = {
				name: 'name',
				trip: 'tripcode',
				sub: 'subject',
				com: 'comment'
			};

			$ele.empty();

			$ele.append('<tr id="header"><th>Type</th><th>Content</th><th>Remove</th></tr>');
			for (i = 0, length = list.length; i < length; i++) {
				obj = list[i];

				// display formatting
				val = (obj.regex) ? '/'+ obj.value +'/' : obj.value;

				$row = $('<tr>');
				$row.append(
					'<td>'+ typeName[obj.type] +'</td>',
					'<td>'+ val +'</td>',
					$('<td>').append(
						$('<a>').html('X')
							.addClass('del-btn')
							.attr('href', '#')
							.data('type', obj.type)
							.data('val', obj.value)
							.data('useRegex', obj.regex)
					)
				);
				$ele.append($row);
			}
		}

		function initOptionsPanel() {
			if (window.Options && !Options.get_tab('filter')) {
				Options.add_tab('filter', 'list', _('Filters'));
				Options.extend_tab('filter',
					'<div id="filter-control">' +
						'<select>' +
							'<option value="name">'+_('Name')+'</option>' +
							'<option value="trip">'+_('Tripcode')+'</option>' +
							'<option value="sub">'+_('Subject')+'</option>' +
							'<option value="com">'+_('Comment')+'</option>' +
						'</select>' +
						'<input type="text">' +
						'<input type="checkbox">' +
						'regex ' +
						'<button id="set-filter">'+_('Add')+'</button>' +
						'<button id="clear">'+_('Clear all filters')+'</button>' +
						'<div id="confirm" class="hidden">' +
							_('This will clear all filtering rules including hidden posts.')+' <a id="confirm-y" href="#">'+_('yes')+'</a> | <a id="confirm-n" href="#">'+_('no')+'</a>' +
						'</div>' +
					'</div>' +
					'<div id="filter-container"><table id="filter-list"></table></div>'
				);
				drawFilterList();

				// control buttons
				$('#filter-control').on('click', '#set-filter', function () {
					var type = $('#filter-control select option:selected').val();
					var value = $('#filter-control input[type=text]').val();
					var useRegex = $('#filter-control input[type=checkbox]').prop('checked');

					//clear the input form
					$('#filter-control input[type=text]').val('');

					addFilter(type, value, useRegex);
					drawFilterList();
				});
				$('#filter-control').on('click', '#clear', function () {
					$('#filter-control #clear').addClass('hidden');
					$('#filter-control #confirm').removeClass('hidden');
				});
				$('#filter-control').on('click', '#confirm-y', function (e) {
					e.preventDefault();

					$('#filter-control #clear').removeClass('hidden');
					$('#filter-control #confirm').addClass('hidden');
					setList({
						generalFilter: [],
						postFilter: {},
						nextPurge: {},
						lastPurge: timestamp()
					});
					drawFilterList();
				});
				$('#filter-control').on('click', '#confirm-n', function (e) {
					e.preventDefault();

					$('#filter-control #clear').removeClass('hidden');
					$('#filter-control #confirm').addClass('hidden');
				});


				// remove button
				$('#filter-list').on('click', '.del-btn', function (e) {
					e.preventDefault();

					var $ele = $(e.target);
					var type = $ele.data('type');
					var val = $ele.data('val');
					var useRegex = $ele.data('useRegex');

					removeFilter(type, val, useRegex);
				});
			}
		}

		/* 
		 *  clear out pruned threads
		 */
		function purge() {
			var list = getList();
			var board, thread, boardId, threadId;
			var deferred;
			var requestArray = [];

			var successHandler = function (boardId, threadId) {
				return function () {
					// thread still alive, keep it in the list and increase the time between checks.
					var list = getList();
					var thread = list.nextPurge[boardId][threadId];

					thread.timestamp = timestamp();
					thread.interval = Math.floor(thread.interval * 1.5);
					setList(list);
				};
			};
			var errorHandler = function (boardId, threadId) {
				return function (xhr) {
					if (xhr.status == 404) {
						var list = getList();

						delete list.nextPurge[boardId][threadId];
						delete list.postFilter[boardId][threadId];
						if ($.isEmptyObject(list.nextPurge[boardId])) delete list.nextPurge[boardId];
						if ($.isEmptyObject(list.postFilter[boardId])) delete list.postFilter[boardId];
						setList(list);
					}
				};
			};

			if ((timestamp() - list.lastPurge) < 86400)  // less than 1 day
				return;
			
			for (boardId in list.nextPurge) {
				board = list.nextPurge[boardId];
				for (threadId in board) {
					thread = board[threadId];
					if (timestamp() > (thread.timestamp + thread.interval)) {
						// check if thread is pruned
						deferred = $.ajax({
							cache: false,
							url: '/'+ boardId +'/res/'+ threadId +'.json',
							success: successHandler(boardId, threadId),
							error: errorHandler(boardId, threadId)
						});
						requestArray.push(deferred);
					}
				}
			}

			// when all requests complete
			$.when.apply($, requestArray).always(function () {
				var list = getList();
				list.lastPurge = timestamp();
				setList(list);
			});
		}

		function init() {
			if (typeof localStorage.postFilter === 'undefined') {
				localStorage.postFilter = JSON.stringify({
					generalFilter: [],
					postFilter: {},
					nextPurge: {},
					lastPurge: timestamp()
				});
			}

			var pageData = {
				boardId: board_name,  // get the id from the global variable
				localList: [],  // all the blacklisted post IDs or UIDs that apply to the current page
				noReplyList: [],  // any posts that replies to the contents of this list shall be hidden
				hasUID: (document.getElementsByClassName('poster_id').length > 0),
				forcedAnon: ($('th:contains(Name)').length === 0)  // tests by looking for the Name label on the reply form
			};

			initStyle();
			initOptionsPanel();
			initPostMenu(pageData);
			filterPage(pageData);

			// on new posts
			$(document).on('new_post', function (e, post) {
				var threadId;

				if ($(post).hasClass('reply')) {
					threadId = $(post).parents('.thread').attr('id').replace('thread_', '');
				} else {
					threadId = $(post).attr('id').replace('thread_', '');
					post = $(post).children('.op')[0];
				}

				filter(post, threadId, pageData);
				quickToggle(post, threadId, pageData);
			});

			$(document).on('filter_page', function () {
				filterPage(pageData);
			});

			// shift+click on catalog to hide thread
			if (active_page == 'catalog') {
				$(document).on('click', '.mix', function(e) {
					if (e.shiftKey) {
						var threadId = $(this).data('id').toString();
						var postId = threadId;
						blacklist.add.post(pageData.boardId, threadId, postId, false);
					}
				});
			}

			// clear out the old threads
			purge();
		}
		init();
	});
	
	if (typeof window.Menu !== "undefined") {
		$(document).trigger('menu_ready');
	}
}

Mass reply

This is now included in Sharty Fixes

Reply to everyone in a thread.

Expand to view the script

// ==UserScript==
// @name         Mass Reply for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Mass reply
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
(function () {
  function insert_after(new_node, ref_node) {
    ref_node.parentNode.insertBefore(new_node, ref_node.nextSibling);
  }
  function mass_reply() {
    let form_textarea = document.getElementById('body');
 
    let post_no_nodes = document.getElementsByClassName("post_no");
    for(const node of post_no_nodes) {
      let post_no_text = node.textContent;
      if(!post_no_text.includes("No")) {
        form_textarea.value += `>>${post_no_text}\n`;
      }
    }
    form_textarea.focus();
  }
  
  function add_button() {
    let ref_node = document.querySelectorAll(".op .intro .post_no")[1];
    let button = document.createElement("input");
    button.type = "button";
    button.value = "Mass Reply";
    button.style.marginLeft = "5px";
    button.addEventListener("click", function() {
      mass_reply();
    }, false);
    
    insert_after(button, ref_node);
  }
  
  add_button();
})();

Wojakificator

Wojakificator is a JS script made by a bunkerchan user that automatically quotes any post you want an attaches a soyjak image

The script might work using User JS option, but it is recommended to use a userscript manager like Violentmonkey instead

Source code

Warning: includes some lefty and NAS images

Expand to view the script

Download link

Anti 4channeler posts

Hides posts made by 4channelers.

Warning: Updates the page every 4 seconds to check for new posts, can be adjusted.

Expand to view the script

// ==UserScript==
// @name         Anti 4channeler posts on soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Hides 4channeler posts
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
let posts = document.querySelectorAll('.body');
let replies = document.querySelectorAll(".replies");
keys= [
   "newfag",
   "fag",
   "gem",
   "faggot",
   "new fag",
   "newfren",
   "newfrien",
   "chud",
   "frogposter",
   "nas",
   "kys",
   "killyourself",
   "go back",
   "goback",
   "reddit",
   "kill yourself",
   "hang",
   "coal",
   "reddit frog",
    "frog",
    "what does the reddit",
    "frog has to do with",
     "redditfrog",
     "frogtranny",
"nigger",
    "tranny"
]
function containsNonLatinCodepoints(s) {
    return /[^\u0000-\u00ff]/.test(s);
}
function start_filtering()
{
posts = document.querySelectorAll('.body');
replies = document.querySelectorAll(".replies");
for(let i =0 ; i<posts.length;i++)
{
for(let j=0;j<keys.length;j++)
{
  if(posts[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()) || containsNonLatinCodepoints(posts[i].innerHTML.toLowerCase()) == true )
{
posts[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
 
}

for(let i =0 ; i<replies.length;i++)
{
for(let j=0;j<keys.length;j++)
{
  if(replies[i].innerHTML.toLowerCase().includes(keys[j].toLowerCase()))
{
replies[i].innerHTML= "<span style='color:green;font-weight:bold;font-size:14px;'>[HIDDEN 4channeler post]</span>";
}
}
 
}

}

start_filtering();
setInterval(start_filtering,2000);
//Interval


//Gifs hider
document.querySelectorAll("img").forEach(i=>{if(i.src.includes(".gif")){i.src="";}});

Preview for Youtube Videos

Show preview for youtube video links.

Expand to view the script

// ==UserScript==
// @name         YouTube preview for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Previews YouTube videos
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
(function youtubeInlinePreviews() {

const re = /(?:youtube\.com\/watch\?v=|youtu\.be\/)(.{11})/;

const previewTemplate = (videoId) => `<img

style="max-width:255px;max-height:255px"

src="https://i.ytimg.com/vi/${videoId}/hqdefault.jpg"

/>`;

Array.from(document.querySelectorAll(".body a"))

.filter((link) => link.href.match(re))

.forEach((link) => {

const videoId = link.href.match(re)[1];

const inlinePreview = previewTemplate(videoId);

link.innerHTML = inlinePreview;

});

})();

Filter tripchuds

To use it, change "!!TRIP GOES HERE" to any trip you want to filter (ex: !incelchud1 or !!incelchud1), can also be used to filter names if you change

(/class="trip">!!TRIP GOES HERE</)

to

(/class="name">name of the chudcel you want to filter</)

if you want to filter multiple tripchuds, you have to do this

(/class="trip">!!FIRST TRIP CHUD|!SECOND TRIPCHUD|!THIRD TRIPCHUD</)

Expand to view the script

// ==UserScript==
// @name         Tripfag filter for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Filters tripfags
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
$(".post")
  .filter(function (index) {
    return this.innerHTML.match(/class="trip">!!TRIP GOES HERE</);
  })
  .each(function (index) {
    let whatToHide = "#" + this.id;
    if (this.id.startsWith("op_")) {
      whatToHide = "#" + this.id.replace("op_", "thread_");
    }
    $(whatToHide).hide();
  });

if (!localStorage.favorites) {
	localStorage.favorites = '[]';
}

Hide tripchud posts from catalog

Hides all tripchud posts from catalog, no exceptions.

Expand to view the script

// ==UserScript==
// @name         Tripfag catalog filter for soyjak.party
// @namespace    datamining
// @version      0.1
// @description  Filters tripfags
// @author       Chud (You)
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
// --- start: purgeTripsFromCatalog ---

(function purgeTripsFromCatalog() {
  // If on a catalog page
  if (document.location.href.match(/catalog\.html$/)) {
    // Call the API for that page
    fetch(document.location.href.replace(".html", ".json"))
      .then((res) => res.json())
      .then((json) =>
        json
          // Find the threads where OP is using a tripcode
          .reduce((acc, cur) => [...acc, ...cur.threads], [])
          .filter((op) => op.trip)
          // Hide them
          .forEach((filtered) => $(`div[data-id='${filtered.no}']`).hide())
      );
  }
})();

// --- end: purgeTripsFromCatalog ---

Disable gif autoplay

Expand to view the script

// ==UserScript==
// @name     disable gif autoplay
// @version  1
// @grant    none
// @match https://soyjak.party/*
// ==/UserScript==

window.addEventListener('load', function () {
[].slice.apply(document.images).filter(is_gif_image).map(freeze_gif);

function is_gif_image(i) {
    return /^(?!data:).*\.gif/i.test(i.src);
}

function freeze_gif(i) {
    var c = document.createElement('canvas');
    var w = c.width = i.width;
    var h = c.height = i.height;
    c.getContext('2d').drawImage(i, 0, 0, w, h);
    try {
        i.src = c.toDataURL("image/gif");
    } catch(e) {
        for (var j = 0, a; a = i.attributes[j]; j++)
            c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
    }
}
})

Ratio script

adds a [ratio] button that starts posting automated replies from a selection of 4 types: "generic","cob","trans" and "chud". perfect for shitposting

(feel free to add more quotes to the code, the "chud" one is very incomplete)

// ==UserScript==
// @name        Sharty Ratio
// @namespace   soyjak.party
// @match       http*://soyjak.party/*
// @version     1.0
// @author      God Tier Wojack
// @description Ratio that nigga
// ==/UserScript==
const modifiers = ["==", "%%", "--", "'", ""];
let done = new Array(20);
let stringSets = {
  "Generic": ["holy shit", "holy shiiiit", "holy fuck", "holy fuck.", "fuckin hell", "holy fuckk", "holy fuckkk", "holy fuckkkk", "lfg", "lfggg", "lfgggg", "lfg!", "lfg!!", "lfgg!!!", "w", "dub", "massive w", "huge w", "gigantic w", "massive dub", "huge dub", "another dub", "another w", "gigantic w", "get his ass", "get that nigga", "lets fucking go", "lets fucking gooo", "lets fucking goooo", "lets fucking goooo", "lets fucking go!", "lets fucking go!!", "lets fucking go!!!", "lets fucking go!!!!!", "yo get his ass", "yo get em", "yooo", "yoooo", "yooooooo", "yoooooooooooo", "god damn", "got damn", "god damnnn", "damnnnnn", "own that fraud", "expose that fraud", "lets gooo", "lets gooooo", "let's goooooo", "keyed", "keyed af", "holy keyed", "gem", "massive gem", "gemerald", "wem", "huge gem", "gigantic gem", "sharty saving gem", "diamond", "sharty saving diamond", "up", "go up", "go the fuck up", "up up up", "go tf up", "'chup", "own that fraud", "get they ass", "beat his ass", "kill that nigga", "can't stop winning", "we cant stop winning bros", "diamonderald", "btfo", "zamn", "zamnnn", "holy based", "based af", "GYATT", "GYAT DAYUM", "DAMN ZIGGA", "GET THAT NIGGA", "NIGGA", "COOK THAT NIGGA", "let him cook", "HUUUUUUUUUGE FUCKING COCK", "GET OUT DA HOOD", "DAYUM NIGGA", "WHAT DA HEEEEEEEEEEEEEEEEEEELL", "COOK HIS ASS", "EAT THAT NIGGA", "HUGE GYATT", "RIZZ", "ENORMOUS W", "W CHAT", "EAT HIS ASS", "How will he ever recover?", "#PACKWATCH", "AYO", "MOG HIS ASS", "LOCK IN", "VICTORY", "GOTTEM", "How will bro ever recover?", "How will blud ever recover?", "BRO WILL NEVER RECOVER", "BLUD WILL NEVER RECOVER", "check'd and kek'd", "BUMP"],
  "Cob": ["another cob w", "#cobgang", "another gemson victory", "gemson win", "gemson victory", "gemson up", "god tier wojack", "gem tier godjack", "cobby up", "cobby go up", "godson up", "upson", "keyedson", "winson", "cob w", "cob dub", "cobby win", "#cobgang win", "#cobgang victory", "hwabag", "god tier winjack", "diamondson go up", "winson up", "gemson go up", "godson go up", "gemson dub", "gemson w", "godson dub", "godson w", "#cobgang dub", "#cobgang w", "cobwin", "he won", "he fucking won", "he cant stop winning"],
  "Trans": ["trans rights", "trans fucking rights", "trans rights won", "sisters...", "trans rights w", "trans rights dub", "trans folx won", "w trans rights", "trans rights go up", "transphobes btfo", "transphobes destroyed", "trans rights victory", "w for trans rights", "trans victory", "transerald", "trans diamond", "bump up the trans", "uptrans", "sisters go up", "upsis", "trans top", "estrogem", "estrogemerald", "bumpstrogen", "topstrogen", "winstrogen"],
   "chud":["1488","fuck niggers","kill all blacks","kanye 2024","dial eight","-ACK!","sieg heil!","jews","media is kiked","goyslop","hang yourself troon","the west has fallen","back to /leftypol/","amerimutt","women are made for rape"]
}
let targetPosts = [];
let sets = [stringSets["Generic"]];
setInterval(() => {
  document.querySelectorAll(".button.alert_button").forEach(e => e.click());
  if (targetPosts.length == 0 || sets.length == 0) {
    return;
  }
  let post = "";
  targetPosts.forEach(p => post += `>>${p}\n`);
  let effect = "";
  if (Math.random() > 0.5) {
    effect = modifiers[Math.floor(Math.random() * modifiers.length)];
  }
  post += effect;
  let strings = sets.flat();
  stringsLength = strings.length;
  let found = false;
  while (!found) {
    text = strings[(Math.floor(Math.random() * stringsLength))];
    if (!done.includes(text)) {
      if (Math.random() > 0.5) {
        text = text.toUpperCase();
      }
      post += text;
      found = true;
      done.unshift(text);
      done.pop();
    }
  }
  post += effect;
  document.querySelector("form[name=post] textarea#body").value = post;
  document.querySelector("form[name=post] input[value*='Reply']").click();
}, 12000);
function addRatioButton(post) {
  post.querySelector(".intro").insertAdjacentHTML("beforeend", `<a href="javascript:void(0);" class="ratio" postNumber="${post.getElementsByClassName("post_no")[1].textContent}">[Ratio]</a>`);
}
let options = Options.add_tab("ratio", "gear", "Ratio").content[0];
let optionsHTML = "";
for ([key, value] of Object.entries(stringSets)) {
  optionsHTML += `<input type="checkbox" id="ratio-${key}" name="${key}"><label for="ratio-${key}">${key}</label><br>`;
}
options.insertAdjacentHTML("beforeend", optionsHTML);
options.querySelectorAll("input[type=checkbox]").forEach(e => {
  e.addEventListener("change", e => {
    sets = [];
    options.querySelectorAll("input[type=checkbox]:checked").forEach(c => sets.push(stringSets[c.getAttribute("name")]));
  });
  e.checked = e.getAttribute("name") == "Generic";
});
const updateObserver = new MutationObserver(list => {
  list.forEach(node => {
    if (node.addedNodes[0].nodeName == "DIV") {
      addRatioButton(node.addedNodes[0]);
    }
  });
});
updateObserver.observe(document.querySelector(".thread"), {
  childList: true
});
[...document.getElementsByClassName("post")].forEach(e => {
  addRatioButton(e);
});
document.addEventListener("click", e => {
  let t = e.target;
  if (t.classList.contains("ratio")) {
    if (t.textContent == "[Ratio]") {
      t.textContent = "[Unratio]";
      targetPosts.push(t.getAttribute("postNumber"));
    } else {
      targetPosts = targetPosts.filter(p => p != t.getAttribute("postNumber"));
      t.textContent = "[Ratio]";
    }
  }
});

Thremboify

Converts post numbers to Base 11 with Thrembo (Ϫ)

Expand to view the script

// ==UserScript==
// @name         Soyjak.party Thremboify
// @namespace    http://soyjak.party/
// @version      0.1
// @description  Thremboifies post numbers on Soyjak.party
// @author       Chud
// @match        https://soyjak.party/*
// @grant        none
// ==/UserScript==
const thr_lut = ['0', '1', '2', '3', '4', '5', '6', 'Ϫ', '7', '8', '9'];
function thr_cnv(num) {
  if (num === 0) {
    return '0';
  }
  let result = '';
  while (num !== 0) {
    const remainder = num % 11;
    result = thr_lut[remainder] + result;
    num = Math.floor(num / 11);
  }
  return result;
}
function thr_up() {
    console.log('updating');
    document.querySelectorAll('.post_no').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        if (el.innerText == '№') { return; }
        const res = thr_cnv(parseInt(el.innerText));
        el.innerText = res;
    });
    document.querySelectorAll('a[class^="mentioned-"]').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        const res = thr_cnv(parseInt(el.innerText.substring(2)));
        el.innerText = `>>${res}`;
    });
    document.querySelectorAll('a[onclick^="highlightReply"][href*="/thread"]').forEach((el) => {
        if (el.classList.contains('thr_ok')) { return; }
        el.classList.add('thr_ok');
        if (el.innerText == '№') { return; }
        const res = thr_cnv(parseInt(el.innerText.substring(2)));
        el.innerText = `>>${res}`;
    });
}
const observer = new MutationObserver((mutationsList, observer) => {
    for (let mutation of mutationsList) {
        if (mutation.type === 'childList') {
            thr_up();
            return;
        }
    }
});
const config = { childList: true, subtree: true };
observer.observe(document.body, config);
thr_up();

Hide Website Origin

Useful for hiding the fact that you came from the ‘arty if you’ve clicked a link on the ‘ty for a site that you wish to raid (e.g. an altchan).

Expand to view the script

const referrerPolicy = document.createElement("meta")
referrerPolicy.setAttribute("name", "referrer")
referrerPolicy.setAttribute("content", "same-origin")
document.querySelector("head").appendChild(referrerPolicy)

Sharty GET Stealer

Self-explanatory.

Grab it from https://greasyfork.org/en/scripts/470562-get-stealer

4cuck GET Stealer

It’s on the GET page, chud

Change Banner on Click

Makes the banner image change when clicked, useful for quickly cycling through them to find a certain one.

document.querySelector(".board_image").setAttribute("onClick", `document.querySelector(".board_image").setAttribute("src", "/b.php#" + new Date().getTime());`);

Redirect Broken /res/ URLs to /thread/ URLs

Redirects thread URLs in the old soyjak.party/*/res/*.html format to the current soyjak.party/*/thread/*.html format.

Very niche these days since the formatting change was made mid Kuz-era but it's useful when using 4chan-x on the sharty as it's thread watcher serves /res/ URLs.

Expand to view the script

// ==UserScript==
// @name        soyjak.party - Fix /res/ links
// @namespace   caca
// @match       https://soyjak.party/*/res/*.html
// @grant       none
// @version     0.1
// @author      newGOD
// @description Redirect old /res/ links to the new /thread/ link format
// ==/UserScript==
location = location.href.replace("res", "thread")


CSS

In addition to user JS, soyjak.party also offers an option to customize user CSS.


Many CSS styles can be found on https://github.com/vichan-devel/vichan/tree/master/stylesheets, and https://github.com/lainchan/lainchan/tree/master/stylesheets.

Built into soyjak.party, a theme featuring a gay furry fox, Polish internet's enclave on all imageboards using vichan.[1]

Soyjak.party also inherits from Vichan many built-in themes. The complete list of themes can be found in the vichan source code. The themes are unlisted but can be added by name like this:

@import "https://soyjak.party/stylesheets/rugby.css";


Custom underwater theme

The underwater theme in use

Adds marine life to your browsing experience

firstly, add this to your User CSS

Expand to view the script

/**
 * miku.css
 * For AwsumChan by Circlepuller
 */
body {
background: #D2FFEE url('img/fade-miku.png') top repeat-x;
}

a:link, a:visited {
text-decoration: none;
color: #00637B;
}

a:link:hover, a:visited:hover {
color: #DD0000;
}

a.post_no {
color: #000033;
}

.intro a.email span.name {
color: #0093AB;
}

.intro a.email:hover span.name {
color: #DD0000;
}

h2, div.title, h1 {
color: #800000;
}

form table tr th {
background: #95D2D3;
}

div.banner {
background-color: #E04000;
}

div.post.op hr {
border-color: #B7C9D5;
}

.intro span.subject {
color: #117743;
font-weight: 800;
}

.intro span.name {
color: #117743;
font-weight: 800;
}

div.post.reply.highlighted {
background: #a9d8ff;
}

div.post.reply {
background: #B6DDDE;
border-color: #8FCCCD;
}

div.ban {
border: 1px solid #0093AB;
}

div.ban h2 {
background: #B6DDDE;
color: #0093AB;
}

div.pages {
color: #8899AA;
background: #B6DDDE;
border-right: 1px solid #8FCCCD;
border-bottom: 1px solid #8FCCCD;
}

hr {
border-color: #B7D9C5;
}

div.boardlist {
color: #0093AB;
    background-color: rgba(65%, 85%, 95%, 0.2);
}

.desktop-style div.boardlist:nth-child(1) {
  text-shadow: #D2FFEE 1px 1px 1px, #D2FFEE -1px -1px 1px;
}
* {
   background-image: url('https://files.catbox.moe/hp03xs.png');
}

.soifish {
   background-image: url('https://files.catbox.moe/rxmvyr.png');
   position: fixed;
    pointer-events: none;
  -webkit-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -moz-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  -o-animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
  animation: moveX 30s linear 0s infinite alternate, moveY 30s linear 0s infinite alternate;
}

@-webkit-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-moz-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@-o-keyframes moveX {
  from { left: 0; } to { left: 100%; }
}
@keyframes moveX {
  from { left: 0; } to { left: 100%; }
}

@-webkit-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@-moz-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@-o-keyframes moveY {
  from { top: 0; } to { top: 100%; }
}
@keyframes moveY {
  from { top: 0; } to { top: 100%; }
}



.post.reply .body a:hover:after {
    content: url(https://soyjak.download/f.php?h=0lnyi5TW&p=1);
    display: block;
    position: absolute;
    left: 20px;
    top: -255px;
    pointer-events: none;
    z-index: 999;
}

.post.reply .body a:hover {
    position: relative;
}

body:after {
    content: url(https://soyjak.download/f.php?h=3EFSgyRY&p=1);
    display: block;
    position: fixed;
    bottom: 0px;
    right: 0px;
    pointer-events: none;

.desktop-style div.boardlist:nth-child(1):hover, .desktop-style div.boardlist:nth-child(1).cb-menu {
  background-color: rgba(70%, 95%, 100%, 0.45);
}

Then add this to your User JS or Tampermonkey

// ==UserScript==
// @name         JS for Ocean Theme
// @namespace    datamining
// @version      0.1
// @description  Glub Glub Glub Glub
// @author       Glub
// @match        https://soyjak.party/*
// @icon         https://soyjak.party/static/favicon.png
// @grant        none
// ==/UserScript==
var soislug = document.createElement("img");
soislug.setAttribute('src', 'https://files.catbox.moe/vpoeyt.png');
soislug.setAttribute('class', 'soislug');
document.getElementsByClassName("8chan")[0].appendChild(soislug);
var soifish = document.createElement("img");
soifish.setAttribute('src', 'https://files.catbox.moe/rxmvyr.png');
soifish.setAttribute('class', 'soifish');
document.getElementsByClassName("8chan")[0].appendChild(soifish);

Custom Soot theme

Soot color scheme (grey and yellow) theme, this css should be used with dark style.

Expand to view the script

/*soot theme*/

.name {
    color: #FDD73A !important;
}

body {
    background: black url(https://i.imgur.com/FeQmhfL.png) right bottom no-repeat fixed;
}

div.post.reply {
    background-color: #646464 !important;
    color: black;
    border-radius:0;
}

div#post-moderation-fields , div#style-select {
    padding:4px;
    background-color:rgba(0,0,0,28);
}

span.heading {
    color: #FF565C !important;
}

.remove-btn {
    color: rgba(255,255,255,128) !important;
}

hr {
    border-color:transparent;
}

Feral Theme

body { 
   background: #ffdbd2;
   background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/feral.png);
    background-position: bottom right;
    background-repeat: no-repeat;
    background-attachment: fixed;}


div.post.reply {
  color: #000;
  background: #eaa7a7;
  border-right: 2px solid #d9bfb7;
  border-bottom: 2px solid #d9bfb7;
}

div.post.reply.highlighted {
     background: #ec6464;
}

.desktop-style div.boardlist:nth-child(1) {
      background: #d85656 
}

div.boardlist a {
    color: #fff;
}

div.pages {
   background: #d85656 
}

Calm Theme

body {
    background: #fafcff;
    background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/sdjasd); 
    background-position: bottom right;
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-size: 200px;
    
}

div.post.reply {
    background:  #fafcff url('/stylesheets/img/fade-blue.png')     margin: 0.3em 6px;
    padding: 0.2em 0.3em 0.5em 0.6em;
    border-width: 1px;
    border-style: none solid solid none;
    border-radius: 0.7em;
    box-shadow: 0.1rem 0.2rem 0.1rem 0.02rem rgba(1,2,3,.5)
 margin-top 20px;
}

div.post.reply div.body {
  overflow-y: auto;
  max-height: 70vh;


}

.intro span.name {
  font-style: italic;
  color: rgb(129, 123, 204);
}

.post-image { 
    box-shadow: 0.1rem 0.2rem 0.1rem 0.03rem rgba(0,0,0,.2);
}

h1 {
    font-family: tahoma;
    letter-spacing: -2px;
    font-size: 20pt;
    margin: 0;
    text-shadow: 20px;

}

header div.subtitle, h1 {
    color: #9cc3ff;
    text-align: center;
    text-shadow: 20px;
    font-family: Arial, Helvetica, sans-serif;


}

span.heading {
    color: #9a2ea1;
    font-size: 11pt;
    font-weight: bold;
}

div.blotter {
    color: #9cc3ff;
    text-align: center;
}

Doll Theme

.name {
    color:#FB4598 !important;
    
} 


div.post.reply.highlighted {a
     background: #d17dcd;;
}


.desktop-style div.boardlist:nth-child(1) {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    margin-top: 0;
    z-index: 30;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .15);
    border-bottom: 1px solid;
    background-color: #c774ff;
    color: red
}




div.post.reply {
  color: #000;
   background: #e5a9db;
    border-right: 2px solid #d1a5d9;
    border-bottom: 2px solid #d1a5d9;
}
 

body {
    background: #fad7eb;
    background-image: url(https://file.garden/ZCftkBQZY2RSmYgu/doll.png);
    background-position: bottom right;
    background-repeat: no-repeat;
    background-attachment: fixed;
}
div.banner {
    background-color: #ff0034;

}
.name:before {
  content: 'Little '; }  
} 

Glow Theme

.post,
input,
textarea {
  border: 1px solid #040!important;
}

body {
  background-color: #000;
  color: #7f7!important;
  background-image: url("https://booru.soy/_images/125c6ba37329910a8f662c25f13b80e7/39652%20-%20SoyBooru.png");
  background-size: 200px;
  background-position: 100% 0;
  animation: 10s infinite anim;
}

.post {
  background: #020!important;
  color: #fff!important;
  box-shadow: 0 0 50px green;
}

.name,
a {
  color: #32cd32!important;
}

.post.highlighted {
  background: #030!important;
}

.name {
  position: relative;
}

.name:after {
  content: '## Fed';
  font-size: 14px;
  display: inline-block;
  color: #0f0;
  text-shadow: 0 0 8px #0f0;
  margin-left: .25em;
}

.boardlist {
  background: #040!important;
}

.quote,
h1,
h2,
h3,
h4,
h5 {
  color: #0f0!important;
}

@keyframes anim {
  0%, 100% {
    background-position: 100% 0;
  }
  50% {
    background-position: 100% -5%;
  }
}

body:after {
  content: "";
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  background-image: url("https://booru.soy/_images/bfa5349f1fe25f685db1ed8973a3d864/2158%20-%20SoyBooru.png");
  background-repeat: no-repeat;
  background-position: 100% 100%;
  background-size: 150px;
}

input,
textarea {
  background: #030;
  color: #0f0;
}

textarea {
  background: #020;
  color: #fff;
}

.banner {
  background-color: transparent!important;
  color: #7f7!important;
}

#options_div {
  background-color: #020;
}

.options_tab_icon.active {
  color: #7f7;
}

.file-hint {
  color: #fff!important;
}

form table tr th {
  background: #020;
}

.dropzone {
  color: #7f7;
}

.dragover {
  background: #040!important;
}

Pear Theme

/*Pear theme*/

body {
background: #f4f1d0 url(https://file.garden/ZCftkBQZY2RSmYgu/transpear) right bottom no-repeat fixed;
}

div.post.reply {
background-color: #dee88f !important;
padding: 0.2em 0.3em 0.5em 0.6em;
border-width: 2px;
border-style: none solid solid none;
border-radius: 0.7em;
}

div#post-moderation-fields , div#style-select {
padding:4px;

}

span.heading {
color: #52a521 !important;
}

.desktop-style div.boardlist:nth-child(1) {
background: #f2eda6;
}

div.post.reply div.body a {
color: #62b532;
}

h1 {
color: #4a9d1b;
}

div.blotter {
color: green }

div.pages.top {
display: none;
}

div.pages {
background: #c2efb9;
}

Soyjak Theme


.intro span.name {
  color: #000000;
  font-weight: bold;
}

.desktop-style div.boardlist:nth-child(1) {
  box-shadow: 0 0px 0px;
  border-bottom: 0px solid;
  background: 0;
}

h1 {
color: #000000;
text-align: center;
}

div.blotter {
  color: #000000;
  font-weight: bold;
  text-align: center;
}

form table tr th {
  background: #fafafa;
}

div.post.reply.highlighted {a
     background: #fffff;
}

div.post.reply div.body {
  overflow-y: auto;
  max-height: 50vh;
}

div.post.reply {
  color: #000000;
   background: #fafafa;
    border-right: 2px solid #c9c9c9;
    border-bottom: 2px solid #c9c9c9;
}
 

body {
background-image: none;
background: #ffffff url('https://i.ibb.co/Xtb2fXF/fade.png') repeat-x 50% 0%;
}

div.banner {
  background: 0;
  color: #000000;
  font-size: 12pt;
  font-weight: bold;
  text-align: center;
  margin: 1em 0;
}

div.banner  a {
  color: #000000;
}

div.post.reply.highlighted {
  background: #efefef;
}

hr {
    border: none;
        border-top-color: currentcolor;
        border-top-style: none;
        border-top-width: medium;
    border-top: 1px solid #000000;
    height: 0;
    clear: left;
}

div.pages {
  background: 0;
  border: 0px solid;
}

#options_div, #alert_div {
  background-color: #ffffff;

}

}

April Fool's 2023

April Fool's 2023 theme. Makes the sharty look like Discord.

Expand to view the script

/* Fonts */
@font-face{font-family:'Discord';src:url('https://web.archive.org/web/20230401012547/https://s.kncdn.org/fonts/discord.otf') format('opentype');font-weight:normal;font-style:normal}

/* Body */
body{
	background-color:#313338;
	color:#fbfbfe;
	font-family:'Discord', Arial, sans-serif !important;
	font-size:11pt
}

/* Boardlist */
.boardlist{background-color:#313338 !important}

/* Posts */
div.post.reply{
	background-color:#313338;
	border:none
}

/* Post Numbers */
.name:before{content:"@"}
.name{
	background-color:#3d4270;
	color:#c8ccfa !important
}

/* File Info */
input[type=checkbox],p.fileinfo{display:none}

/* Text */
a,a:visited{color:#7289da}
time:after{content:", in #soy "}
div.post_no{
	background-color:#3d4270;
	font-family:Arial;
	font-size:10pt;
	color:#b9bdeb !important;
	font-weight:bold
}
div.banner{display:none}
input,textarea{
	background-color:#383a40;
	color:#ffffff;
	border:none !important;
	border-radius:5px
}

/* Top Bar */
div.pages.top{background:#313338 !important}

/* Headings */
.subject,h1,h2{color:#5563e9 !important}

/* Highlighted Post */
div.post.reply.highlighted{background:#2e3035}
div.post.reply div.body a{color:#7289da}

/* Seperator */
hr{border-top:1px solid #3f4147 !important}

/* Pages */
div.pages,span.heading,span.heading2{color:#5563e9}

/* Post Form */
form table tr th{background:#5563e9}

/* FileHint */
.dropzone .file-hint{
	color:rgb(114, 137, 218);
	cursor:pointer;
	position:relative;
	margin-bottom:5px;
	padding:10px 0;
	top:5px;
	transition:0.2s;
	border:2px dashed rgba(125, 125, 125, 0.4)
}

/* Post Images */
.post-image{border-radius:15px}

/* Post Numbers */
.post_no{font-family:Arial, Helvetica}

/* Blotter */
div.blotter{
	background-color: #2b2d31;
	border-radius: 25px;
	color: #b5bac1
}

Anti - mass reply

.post.reply > .body {
    max-height: 20em;
    overflow-y: auto;
}

Cobson in the corner

This code was briefly added to soyjak.party and is being left here for posterity.

Expand to view the script

body { background-image: url(https://soyjaks.party/cob3.png); background-position: bottom right; background-repeat: no-repeat; background-attachment: fixed;   background-size: 100px; }

Classic UI

Remove the visible "SAGE!" message

a[href^='mailto:sage']::after {
  content: ' SAGE!';
  text-decoration: none;
  display: none;
}

Return grid to catalog.


.theme-catalog div.thread img {
  float: none!important;
  margin: auto;
  max-height: 150px;
  max-width: 200px;
  box-shadow: 0 0 4px rgba(0,0,0,0.55);
  border: 2px solid rgba(153,153,153,0);
}

.theme-catalog div.thread {
  display: inline-block;
  vertical-align: top;
  text-align: center;
  font-weight: normal;
  margin-top: 2px;
  margin-bottom: 2px;
  padding: 2px;
  height: 300px;
  width: 205px;
  overflow: hidden;
  position: relative;
  font-size: 11px;
  max-height: 300px;
  background: rgba(182,182,182,0.12);
  border: 2px solid rgba(111,111,111,0.34);
}

.theme-catalog div.thread strong {
  display: block;
}

.theme-catalog div.threads {
  text-align: center;
  margin-left: -20px;
}

.theme-catalog div.thread:hover {
  background: #D6DAF0;
  border-color: #B7C5D9;
}

.theme-catalog div.grid-size-vsmall img {
  max-height: 33%;
  max-width: 95%
}

.theme-catalog div.grid-size-vsmall {
  min-width:90px; max-width: 90px;
  max-height: 148px;
}

.theme-catalog div.grid-size-small img {
  max-height: 33%;
  max-width: 95%
}

.theme-catalog div.grid-size-small {
  min-width:140px; max-width: 140px;
  max-height: 192px;
}

.theme-catalog div.grid-size-large img {
  max-height: 40%;
  max-width: 95%
}

.theme-catalog div.grid-size-large {
  min-width: 256px; max-width: 256px;
  max-height: 384px;
}

.theme-catalog img.thread-image {
  height: auto;
  max-width: 100%;
}

@media (max-width: 420px) {
  .theme-catalog ul#Grid {
    padding-left: 18px;
  }

  .theme-catalog div.thread {
    width: auto;
    margin-left: 0;
    margin-right: 0;
  }

  .theme-catalog div.threads {
    overflow: hidden;
  }
}

Christmas Hats

[data-board] > .files > :nth-child(1):not(.multifile) > a:before {
	content: url('https://s.kncdn.org/image/hat2.gif');
	float: left;
	display: block;
	margin-right: -160px;
	position: relative;
	top: -120px;
	left: -30px;
	
}
[data-board] > .files > :nth-child(1).multifile > a:before {
	content: url('https://s.kncdn.org/image/hat2.gif');
	float: left;
	display: block;
	margin-right: -160px;
	position: relative;
	top: -120px;
	left: -50px;
	
}

Crazy

html,p{color:#fa412a}*{transition:7.13s;font-family:'Comic Sans MS','Times New Roman',Times,serif;border:1px solid #000;background-color:#f0f;animation:.5s infinite shake,10s infinite colorchange}html{background:linear-gradient(to right,#4a412a,#fa412a,#f0f);text-shadow:2px 2px 2px #000}a{color:#1a412a;font-size:30px;text-decoration:underline;animation:.5s infinite shake,10s infinite colorchange,2s infinite alternate grow}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}@keyframes colorchange{0%,100%{color:#fa412a}25%,75%{color:#f0f}50%{color:#1a412a}}@keyframes grow{0%{transform:scale(1)}100%{transform:scale(1.2)}}a:hover{color:#f0f;font-size:48px;filter:blur(3px)}p{text-transform:uppercase}p:hover{color:#f0f;font-size:72px;transform:scale(1.2)}


Citations