63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import { Joke, JokeSettings, StopableJoke } from "../joke";
|
||
import $ from "jquery";
|
||
import { AprilFoolsJokeClass } from "../handler";
|
||
|
||
/**
|
||
* **Буквенный хаос**
|
||
*
|
||
* Все буквы в словах, кроме первой и последней, перемешены.
|
||
*
|
||
* @author Kozhilya
|
||
*/
|
||
export class LetterChaosJoke extends Joke {
|
||
id = 'letter_chaos';
|
||
|
||
settings = new LetterChaosJokeSettings;
|
||
|
||
punctuationSymbols: string[] | null = null;
|
||
|
||
private shuffleLetters(word: string): string {
|
||
// Check if the word has two or more letters
|
||
if ((word.length < 3) || !AprilFoolsJokeClass.check(this.settings.shuffle_chance)) {
|
||
return word;
|
||
}
|
||
|
||
// Split the word into an array of characters
|
||
const characters = word.split("");
|
||
|
||
// Shuffle the characters between the first and last letters
|
||
const middleCharacters = characters.slice(1, -1);
|
||
for (let i = middleCharacters.length - 1; i > 0; i--) {
|
||
const j = Math.floor(Math.random() * (i + 1));
|
||
[middleCharacters[i], middleCharacters[j]] = [middleCharacters[j], middleCharacters[i]];
|
||
}
|
||
|
||
// Join the shuffled characters back into a word
|
||
return [characters[0], ...middleCharacters, characters[characters.length - 1]].join("");
|
||
}
|
||
|
||
private processNode(node: any) {
|
||
node.textContent = node.textContent?.replace(/([А-Яа-яA-Za-z]+)/gm, this.shuffleLetters);
|
||
}
|
||
|
||
start(): void {
|
||
const items = $(this.settings.selector).find('*').contents().filter((_, node) => node.nodeType === Node.TEXT_NODE);
|
||
|
||
items.each((_, node) => this.processNode(node))
|
||
}
|
||
}
|
||
|
||
export class LetterChaosJokeSettings implements JokeSettings {
|
||
chance: number = 20;
|
||
|
||
/**
|
||
* Селектор всех элементов, которые будут затронуты
|
||
*/
|
||
selector: string = '.post-content';
|
||
|
||
/**
|
||
* Вероятность того, что буквы будут перемешаны
|
||
*/
|
||
shuffle_chance: number = 50;
|
||
}
|