diff --git a/dist/april-fools.js b/dist/april-fools.js index a68ab11..cf13a98 100644 --- a/dist/april-fools.js +++ b/dist/april-fools.js @@ -168,6 +168,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/jokes/latinization.ts": +/*!***********************************!*\ + !*** ./src/jokes/latinization.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LatinizationJoke: () => (/* binding */ LatinizationJoke),\n/* harmony export */ LatinizationJokeSettings: () => (/* binding */ LatinizationJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Латинизация**\n *\n * Все символы на странице или только в постах или еще где-то местами -\n * латиницей вместо кириллицы и наоборот\n *\n * @author Идея: Alex_63\n * @author Kozhilya\n */\nclass LatinizationJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'latinization';\n this.title = 'Латинизация';\n this.description = 'Все символы на странице или только в постах ' +\n 'или еще где-то местами - латиницей вместо кириллицы и наоборот';\n this._settings = new LatinizationJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n /**\n * Латинизация или кириллизация слова\n * @param {string} word\n * @return {string}\n * @private\n */\n latinize(word) {\n if (/[а-яА-ЯёЁ0-9_-]+/.test(word)) {\n // Кириллица в латиницу\n for (const [ru, en] of Object.entries(this.settings.ruToEn)) {\n word = word.replace(new RegExp(ru, 'g'), en).\n replace(new RegExp(ru.toUpperCase(), 'gi'), en.toUpperCase());\n }\n }\n else if (/[a-zA-Z0-9_-]+/.test(word)) {\n // Латиница в кириллицу\n for (const [en, ru] of Object.entries(this.settings.enToRu)) {\n word = word.replace(new RegExp(en, 'g'), ru).\n replace(new RegExp(en.toUpperCase(), 'gi'), ru.toUpperCase());\n }\n }\n return word;\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.latinize(word));\n }\n}\n/**\n * Класс настроек для шутки \"Латинизация\"\n */\nclass LatinizationJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n /**\n * Селектор, в котором может изменяться текст\n */\n this.selector = '.post-content';\n /**\n * Правила преобразования из кириллицы в латиницу\n */\n this.ruToEn = {\n 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',\n 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',\n 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',\n 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',\n 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch',\n 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '',\n 'э': 'e', 'ю': 'u', 'я': 'ya',\n };\n /**\n * Правила преобразования из латиницы в кириллицу\n */\n this.enToRu = {\n 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е',\n 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и',\n 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н',\n 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с',\n 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс',\n 'y': 'ы', 'z': 'з',\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/latinization.ts?"); + +/***/ }), + /***/ "./src/jokes/letter_chaos.ts": /*!***********************************!*\ !*** ./src/jokes/letter_chaos.ts ***! @@ -219,7 +230,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _joker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./joker */ \"./src/joker.ts\");\n/* harmony import */ var _jokes_shake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jokes/shake */ \"./src/jokes/shake.ts\");\n/* harmony import */ var _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jokes/humanitarian_hell */ \"./src/jokes/humanitarian_hell.ts\");\n/* harmony import */ var _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jokes/mirror */ \"./src/jokes/mirror.ts\");\n/* harmony import */ var _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jokes/carnival */ \"./src/jokes/carnival.ts\");\n/* harmony import */ var _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jokes/crazy_letters */ \"./src/jokes/crazy_letters.ts\");\n/* harmony import */ var _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./jokes/letter_chaos */ \"./src/jokes/letter_chaos.ts\");\n/* harmony import */ var _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./jokes/cursor */ \"./src/jokes/cursor.ts\");\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n/* harmony import */ var _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./jokes/inverted_scroll */ \"./src/jokes/inverted_scroll.ts\");\n\n\n\n\n\n\n\n\n\n\nwindow.AprilJokes = ((jokes) => {\n const cl = new _joker__WEBPACK_IMPORTED_MODULE_0__.JokerClass();\n jokes.forEach((CustomJoke) => {\n cl.add(new CustomJoke());\n });\n $(() => cl.regularStart());\n return cl;\n})([\n _jokes_shake__WEBPACK_IMPORTED_MODULE_1__.ShakeJoke,\n _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__.HumanitarianHellJoke,\n _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__.MirrorJoke,\n _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__.CarnivalJoke,\n _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__.CrazyLettersJoke,\n _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__.LetterChaosJoke,\n _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__.CursorEffectsJoke,\n _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__.StupidTitleJoke,\n _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__.InvertedScrollJoke,\n]);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/main.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _joker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./joker */ \"./src/joker.ts\");\n/* harmony import */ var _jokes_shake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jokes/shake */ \"./src/jokes/shake.ts\");\n/* harmony import */ var _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jokes/humanitarian_hell */ \"./src/jokes/humanitarian_hell.ts\");\n/* harmony import */ var _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jokes/mirror */ \"./src/jokes/mirror.ts\");\n/* harmony import */ var _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jokes/carnival */ \"./src/jokes/carnival.ts\");\n/* harmony import */ var _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jokes/crazy_letters */ \"./src/jokes/crazy_letters.ts\");\n/* harmony import */ var _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./jokes/letter_chaos */ \"./src/jokes/letter_chaos.ts\");\n/* harmony import */ var _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./jokes/cursor */ \"./src/jokes/cursor.ts\");\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n/* harmony import */ var _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./jokes/inverted_scroll */ \"./src/jokes/inverted_scroll.ts\");\n/* harmony import */ var _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./jokes/latinization */ \"./src/jokes/latinization.ts\");\n\n\n\n\n\n\n\n\n\n\n\nwindow.AprilJokes = ((jokes) => {\n const cl = new _joker__WEBPACK_IMPORTED_MODULE_0__.JokerClass();\n jokes.forEach((CustomJoke) => {\n cl.add(new CustomJoke());\n });\n $(() => cl.regularStart());\n return cl;\n})([\n _jokes_shake__WEBPACK_IMPORTED_MODULE_1__.ShakeJoke,\n _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__.HumanitarianHellJoke,\n _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__.MirrorJoke,\n _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__.CarnivalJoke,\n _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__.CrazyLettersJoke,\n _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__.LetterChaosJoke,\n _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__.CursorEffectsJoke,\n _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__.StupidTitleJoke,\n _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__.InvertedScrollJoke,\n _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__.LatinizationJoke,\n]);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/main.ts?"); /***/ }), diff --git a/package.json b/package.json index 54eb52b..b464028 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.1.0", + "version": "1.1.1", "name": "mybb-april-fools", "description": "Система первоапрельских розыгрышей для форумов MyBB", "homepage": "https://forumd.ru/viewtopic.php?id=7372", diff --git a/settings.compact.js b/settings.compact.js index e64f17f..e5aee0b 100644 --- a/settings.compact.js +++ b/settings.compact.js @@ -167,4 +167,27 @@ window.AprilJokes.settings = { enabled: true, chance: 10, }, + + latinization: { + enabled: true, + chance: 10, + selector: '.post-content', + ruToEn: { + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', + 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', + 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', + 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', + 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', + 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '', + 'э': 'e', 'ю': 'u', 'я': 'ya', + }, + enToRu: { + 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е', + 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и', + 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н', + 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с', + 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс', + 'y': 'ы', 'z': 'з', + }, + }, }; diff --git a/settings.example.js b/settings.example.js index 3944528..299a922 100644 --- a/settings.example.js +++ b/settings.example.js @@ -463,4 +463,48 @@ window.AprilJokes.settings = { enabled: true, chance: 10, }, + + /** + * **Латинизация** + * + * Все символы на странице или только в постах или еще где-то местами - + * латиницей вместо кириллицы и наоборот + * + * @author Идея: Alex_63 + * @author Kozhilya + */ + latinization: { + enabled: true, + chance: 10, + + /** + * Селектор, в котором может изменяться текст + */ + selector: '.post-content', + + /** + * Правила преобразования из кириллицы в латиницу + */ + ruToEn: { + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', + 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', + 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', + 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', + 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', + 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '', + 'э': 'e', 'ю': 'u', 'я': 'ya', + }, + + /** + * Правила преобразования из латиницы в кириллицу + */ + enToRu: { + 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е', + 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и', + 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н', + 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с', + 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс', + 'y': 'ы', 'z': 'з', + }, + }, }; diff --git a/src/jokes/latinization.ts b/src/jokes/latinization.ts new file mode 100644 index 0000000..b6a4f8f --- /dev/null +++ b/src/jokes/latinization.ts @@ -0,0 +1,106 @@ +import {Joke, JokeSettings} from '../joke'; +import {getTextNodes} from '../common'; + +/** + * **Латинизация** + * + * Все символы на странице или только в постах или еще где-то местами - + * латиницей вместо кириллицы и наоборот + * + * @author Идея: Alex_63 + * @author Kozhilya + */ +export class LatinizationJoke extends Joke { + id = 'latinization'; + + title = 'Латинизация'; + + description = 'Все символы на странице или только в постах ' + + 'или еще где-то местами - латиницей вместо кириллицы и наоборот'; + + _settings = new LatinizationJokeSettings(); + + /** + * Запуск шутки + */ + start(): void { + const textNodes = getTextNodes(this.settings.selector); + + textNodes.each((_, node) => this.processNode(node as Text)); + } + + /** + * Латинизация или кириллизация слова + * @param {string} word + * @return {string} + * @private + */ + private latinize(word: string): string { + if (/[а-яА-ЯёЁ0-9_-]+/.test(word)) { + // Кириллица в латиницу + for (const [ru, en] of Object.entries(this.settings.ruToEn)) { + word = word.replace(new RegExp(ru, 'g'), en). + replace(new RegExp(ru.toUpperCase(), 'gi'), en.toUpperCase()); + } + } else if (/[a-zA-Z0-9_-]+/.test(word)) { + // Латиница в кириллицу + for (const [en, ru] of Object.entries(this.settings.enToRu)) { + word = word.replace(new RegExp(en, 'g'), ru). + replace(new RegExp(en.toUpperCase(), 'gi'), ru.toUpperCase()); + } + } + + return word; + } + + /** + * Обработка текстовой ноды + * @param {Text} node + * @private + */ + private processNode(node: Text) { + node.textContent = node.textContent?.replace( + /([А-Яа-яA-Za-z]+)/gm, + (_: string, word: string) => this.latinize(word), + ); + } +} + +/** + * Класс настроек для шутки "Латинизация" + */ +export class LatinizationJokeSettings implements JokeSettings { + enabled: boolean = true; + + chance: number = 10; + + /** + * Селектор, в котором может изменяться текст + */ + selector: string = '.post-content'; + + /** + * Правила преобразования из кириллицы в латиницу + */ + ruToEn: { [key in string]: string } = { + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', + 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', + 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', + 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', + 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', + 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '', + 'э': 'e', 'ю': 'u', 'я': 'ya', + }; + + /** + * Правила преобразования из латиницы в кириллицу + */ + enToRu: { [key in string]: string } = { + 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е', + 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и', + 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н', + 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с', + 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс', + 'y': 'ы', 'z': 'з', + }; +} diff --git a/src/main.ts b/src/main.ts index 017f56b..0e6a141 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,6 +9,7 @@ import {LetterChaosJoke} from './jokes/letter_chaos'; import {CursorEffectsJoke} from './jokes/cursor'; import {StupidTitleJoke} from './jokes/stupid_title'; import {InvertedScrollJoke} from './jokes/inverted_scroll'; +import {LatinizationJoke} from './jokes/latinization'; declare global { interface Window { AprilJokes: JokerClass; } @@ -34,6 +35,7 @@ window.AprilJokes = ((jokes: JokeList): JokerClass => { CursorEffectsJoke, StupidTitleJoke, InvertedScrollJoke, + LatinizationJoke, ]); interface JokeList extends Array Joke> {}