Compare commits
2
Commits
bf90f3d4c2
...
fa7ae5069a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa7ae5069a | ||
|
|
3be844ffb6 |
@@ -1,4 +1,4 @@
|
|||||||
# Бибилотека первоапрельских розыгрышей для форумов MyBB
|
# Библиотека первоапрельских розыгрышей для форумов MyBB
|
||||||
|
|
||||||
Базовое использование:
|
Базовое использование:
|
||||||
|
|
||||||
@@ -26,6 +26,8 @@
|
|||||||
- `letter_chaos` — **Буквенный хаос**. Все буквы в словах, кроме первой и последней, перемешены.
|
- `letter_chaos` — **Буквенный хаос**. Все буквы в словах, кроме первой и последней, перемешены.
|
||||||
- `cursor` — **Красивые курсоры**. Эффекты, следующие за курсором.
|
- `cursor` — **Красивые курсоры**. Эффекты, следующие за курсором.
|
||||||
- `stupid_title` — **Глупые статусы**. Каждому пользователю даётся новый глупый статус.
|
- `stupid_title` — **Глупые статусы**. Каждому пользователю даётся новый глупый статус.
|
||||||
|
- `inverted_scroll` — **Обратная гравитация**. Скролл в обратную сторону.
|
||||||
|
- `latinization` — **Латинизация**. Все символы на странице или только в постах или еще где-то местами - латиницей вместо кириллицы и наоборот
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -48,9 +50,9 @@ window.AprilJokes.settings = {
|
|||||||
## Настройка шуток
|
## Настройка шуток
|
||||||
|
|
||||||
Настройка шуток происходит при присвоении объекта `window.AprilJokes.settings`.
|
Настройка шуток происходит при присвоении объекта `window.AprilJokes.settings`.
|
||||||
Это присвоедние должно произойти **после** загрузки скрипта.
|
Это присвоение должно произойти **после** загрузки скрипта.
|
||||||
|
|
||||||
Для всех шуток определны 2 общих поля:
|
Для всех шуток определены 2 общих поля:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
window.AprilJokes.settings = {
|
window.AprilJokes.settings = {
|
||||||
@@ -75,7 +77,7 @@ window.AprilJokes.settings = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
Полный список настроек с объяснениями вы можете посмотреть в файле [`settings.example.js`](./settings.example.js). Также представлен файл [`settings.compact.js`](./settings.compact.js), который также содержит все настройки, но без коментариев.
|
Полный список настроек с объяснениями вы можете посмотреть в файле [`settings.example.js`](./settings.example.js). Также представлен файл [`settings.compact.js`](./settings.compact.js), который также содержит все настройки, но без комментариев.
|
||||||
|
|
||||||
При этом, объективно, вставлять весь этот код в HTML-начало может быть "немного" неудобно, поэтому вы можете скачать код (кнопка "Raw" над файлом), изменить его, и загрузить в файлы форума, подключив скрипт таким образом:
|
При этом, объективно, вставлять весь этот код в HTML-начало может быть "немного" неудобно, поэтому вы можете скачать код (кнопка "Raw" над файлом), изменить его, и загрузить в файлы форума, подключив скрипт таким образом:
|
||||||
|
|
||||||
@@ -88,7 +90,7 @@ window.AprilJokes.settings = {
|
|||||||
|
|
||||||
Заметьте, что во всех примерах приведены значения настроек по умолчанию. Вы _можете_ удалять строки, значения по умолчанию которых вас устраивают.
|
Заметьте, что во всех примерах приведены значения настроек по умолчанию. Вы _можете_ удалять строки, значения по умолчанию которых вас устраивают.
|
||||||
|
|
||||||
Если вас интерсует только несколько шуток, вы можете использовать метод `disableAll()`, что бы выключить выполнение всех шуток, а потом включать отдельные шутки через установку настройки `enabled`:
|
Если вас интересует только несколько шуток, вы можете использовать метод `disableAll()`, что бы выключить выполнение всех шуток, а потом включать отдельные шутки через установку настройки `enabled`:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
window.AprilJokes.disableAll();
|
window.AprilJokes.disableAll();
|
||||||
@@ -127,7 +129,7 @@ window.AprilJokes.settings = {
|
|||||||
window.AprilJokes.start("mirror", true);
|
window.AprilJokes.start("mirror", true);
|
||||||
```
|
```
|
||||||
|
|
||||||
Так же можете [посмотреть](./src/jokes/mirror.ts#L16) на метод `MirrorJoke.start`, что бы узнать как именно проиходит отражение.
|
Так же можете [посмотреть](./src/jokes/mirror.ts#L16) на метод `MirrorJoke.start`, что бы узнать как именно происходит отражение.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -147,9 +149,9 @@ window.AprilJokes.jokes.cursor.disableAll();
|
|||||||
|
|
||||||
### Настройка `stupid_title` (Глупые статусы)
|
### Настройка `stupid_title` (Глупые статусы)
|
||||||
|
|
||||||
> **Важно**: этот блок может быть чрезвычайно капризым из-за особенностей хранения данных, особенно блок `variants`. Изменяя его, строго следуйте этой инструкции, иначе скрипт может перестать работать ожидаемым образом.
|
> **Важно**: этот блок может быть чрезвычайно капризным из-за особенностей хранения данных, особенно блок `variants`. Изменяя его, строго следуйте этой инструкции, иначе скрипт может перестать работать ожидаемым образом.
|
||||||
|
|
||||||
Данная шутка генерирет статус из случайных слов. За счёт использования псевдослучайного генератора, хеширования и привязки к времени UTC, ожидается что все пользователи одновременно будут видеть один и тот же статус для каждого пользователя, при этом он меняется каждые `change_frequency` минут. Установите это значение равным `0`, что бы статус генерировался при каждом обновлении страницы.
|
Данная шутка генерирует статус из случайных слов. За счёт использования псевдослучайного генератора, хеширования и привязки к времени UTC, ожидается что все пользователи одновременно будут видеть один и тот же статус для каждого пользователя, при этом он меняется каждые `change_frequency` минут. Установите это значение равным `0`, что бы статус генерировался при каждом обновлении страницы.
|
||||||
|
|
||||||
Для настройки списка слов используется функция `BuildStupdiTitleVariant`, которая преобразует список слов во внутренний формат скрипта. Настоятельно рекомендуется использовать именно её, а не записывать параметры напрямую:
|
Для настройки списка слов используется функция `BuildStupdiTitleVariant`, которая преобразует список слов во внутренний формат скрипта. Настоятельно рекомендуется использовать именно её, а не записывать параметры напрямую:
|
||||||
|
|
||||||
@@ -178,12 +180,12 @@ window.AprilJokes.settings = {
|
|||||||
|
|
||||||
Обратите внимание на конструкции вида `{ ...something }` — эта конструкция позволяет перенести все поля нескольких старых объектов в один новый. При этом, если в двух объединяемых объектах есть совпадающие значения, то будет сохранено последнее.
|
Обратите внимание на конструкции вида `{ ...something }` — эта конструкция позволяет перенести все поля нескольких старых объектов в один новый. При этом, если в двух объединяемых объектах есть совпадающие значения, то будет сохранено последнее.
|
||||||
|
|
||||||
Говоря проще: добовляйте ваши настройки _после_ строки вида `...window.AprilJokes.settings.stupid_title.variants.adj`, что бы ваши настройки не были перезаписаны.
|
Говоря проще: добавляйте ваши настройки _после_ строки вида `...window.AprilJokes.settings.stupid_title.variants.adj`, что бы ваши настройки не были перезаписаны.
|
||||||
|
|
||||||
Метод `BuildStupdiTitleVariant` принимает 2 аргумента:
|
Метод `BuildStupdiTitleVariant` принимает 2 аргумента:
|
||||||
|
|
||||||
- `gender` — определённый род для генерации. Используйте `true` для мужского рода, `false` для женского и `null`, если добавляемые варианты могут использоваться в обоих случаях.
|
- `gender` — определённый род для генерации. Используйте `true` для мужского рода, `false` для женского и `null`, если добавляемые варианты могут использоваться в обоих случаях.
|
||||||
- `words` — строка, со списоком вариантов через запятую. В качестве вариантов могут быть слова из русских или английских букв, пробелов или дефисов, то есть можно использовать `"..., почему-то и зачем-то , ..."` и `почему-то и зачем-то` будет воспринят как один вариант. Также варианты можно модифицировать, добавив один или несколько модификаторов:
|
- `words` — строка, со списком вариантов через запятую. В качестве вариантов могут быть слова из русских или английских букв, пробелов или дефисов, то есть можно использовать `"..., почему-то и зачем-то , ..."` и `почему-то и зачем-то` будет воспринят как один вариант. Также варианты можно модифицировать, добавив один или несколько модификаторов:
|
||||||
- `!` отключает использование слова. Этим модификатором можно отключать слова из списка по умолчанию (см `!грубый` в примере выше).
|
- `!` отключает использование слова. Этим модификатором можно отключать слова из списка по умолчанию (см `!грубый` в примере выше).
|
||||||
- `%` помечает слово как редкое. Шанс его использования понижается в 2 раза.
|
- `%` помечает слово как редкое. Шанс его использования понижается в 2 раза.
|
||||||
- `^` помечает слово как частое. Шанс его использования повышается в 2 раза.
|
- `^` помечает слово как частое. Шанс его использования повышается в 2 раза.
|
||||||
|
|||||||
Vendored
+12
-1
@@ -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":
|
||||||
/*!***********************************!*\
|
/*!***********************************!*\
|
||||||
!*** ./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__) => {
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||||
|
|
||||||
"use strict";
|
"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?");
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"name": "mybb-april-fools",
|
"name": "mybb-april-fools",
|
||||||
"description": "Система первоапрельских розыгрышей для форумов MyBB",
|
"description": "Система первоапрельских розыгрышей для форумов MyBB",
|
||||||
"homepage": "https://forumd.ru/viewtopic.php?id=7372",
|
"homepage": "https://forumd.ru/viewtopic.php?id=7372",
|
||||||
|
|||||||
@@ -167,4 +167,27 @@ window.AprilJokes.settings = {
|
|||||||
enabled: true,
|
enabled: true,
|
||||||
chance: 10,
|
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': 'з',
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -463,4 +463,48 @@ window.AprilJokes.settings = {
|
|||||||
enabled: true,
|
enabled: true,
|
||||||
chance: 10,
|
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': 'з',
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
import {Joke, JokeSettings} from '../joke';
|
||||||
|
import {getTextNodes} from '../common';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* **Латинизация**
|
||||||
|
*
|
||||||
|
* Все символы на странице или только в постах или еще где-то местами -
|
||||||
|
* латиницей вместо кириллицы и наоборот
|
||||||
|
*
|
||||||
|
* @author Идея: Alex_63
|
||||||
|
* @author Kozhilya
|
||||||
|
*/
|
||||||
|
export class LatinizationJoke extends Joke<LatinizationJokeSettings> {
|
||||||
|
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': 'з',
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import {LetterChaosJoke} from './jokes/letter_chaos';
|
|||||||
import {CursorEffectsJoke} from './jokes/cursor';
|
import {CursorEffectsJoke} from './jokes/cursor';
|
||||||
import {StupidTitleJoke} from './jokes/stupid_title';
|
import {StupidTitleJoke} from './jokes/stupid_title';
|
||||||
import {InvertedScrollJoke} from './jokes/inverted_scroll';
|
import {InvertedScrollJoke} from './jokes/inverted_scroll';
|
||||||
|
import {LatinizationJoke} from './jokes/latinization';
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window { AprilJokes: JokerClass; }
|
interface Window { AprilJokes: JokerClass; }
|
||||||
@@ -34,6 +35,7 @@ window.AprilJokes = ((jokes: JokeList): JokerClass => {
|
|||||||
CursorEffectsJoke,
|
CursorEffectsJoke,
|
||||||
StupidTitleJoke,
|
StupidTitleJoke,
|
||||||
InvertedScrollJoke,
|
InvertedScrollJoke,
|
||||||
|
LatinizationJoke,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
interface JokeList extends Array<new () => Joke<JokeSettings>> {}
|
interface JokeList extends Array<new () => Joke<JokeSettings>> {}
|
||||||
|
|||||||
Reference in New Issue
Block a user