Advertisement
AHOHNMYC

0ch autotypographer

Apr 11th, 2017
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        0ch autotypographer
  3. // @name:ru     Автотипографика на Нульче
  4. // @namespace   0ch culture
  5. // @author      AHOHNMYC
  6. // @description Автоматическая замена минуса на тире, кавычек на ёлочки, etc
  7. // @homepage    https://pastebin.com/u/AHOHNMYC
  8. // @include     https://0chan.hk/*
  9. // @grant       none
  10. // @supportURL  https://0chan.hk/0x59f3c84d
  11. // @version     v0.1.9
  12. // ==/UserScript==
  13.  
  14. /* TODO
  15. 0. Выполнить этот TODO
  16. 1. Сделать какие-никакие настройки. Хотя бы кнопку отключения.
  17. 2. Попробовать внедрить MutationObserver; провести тесты. Выбрать лучшую кандидатуру. Захватить мир.
  18.    Не буду этого делать. Обработчик кликов логичнее с точки зрения основной функции скрипта, да и по производительности тоже должно быть получше.
  19.    Хотя, надо бы его запилить в самый начальный этап загрузки
  20. 3. Замена первой буквы на заглавную, буквы после точки на заглавную. Опционально
  21. 4. Коррекция самых уёбищных ошибок в постах:
  22.      мелкобуква
  23.      -то|-либо|-нибудь
  24.      неумение отделять знаки препинания пробелом справа
  25.      то же самое несчастное тире (точнее, дефис вместо него)
  26.      пустая строка после цитирования
  27.      отсутствие пробела после >
  28.      короткое тире не трогать. Из-за хуёвого парсера ссылок могут поехать остатки того, что отобразилось
  29.    Реализовать опционально.
  30.    Сделать исключение для блоков с кодом, а также кодача в целом (по уровню грамотности можно примерно оценить и качество кода. Amiright?)
  31. 5. Кнопка "Трифорснуть" с ползунком регулирования высоты. Для поехавших олдфагов
  32. 6. Лекарство от рака
  33. 7. Эликсир бессмертия
  34. */
  35.  
  36. /* TODONE
  37. Авторасстановка:
  38. * тире
  39. * тире короткое
  40. * кавычки-ёлочки
  41. * неразрывный пробел
  42. * плюс-минус
  43. * многоточие
  44. * ударение
  45.  
  46. Спецсимволы:
  47.  (C) — © (регистрозавсимо)
  48.  (R) — ® (регистрозавсимо)
  49. (tm) — ™ (регистроНЕзавсимо)
  50. */
  51.  
  52. // Сделано по рекомендациям Тёмочки
  53. // https://artlebedev.ru/kovodstvo/62
  54.  
  55. // Лэйн по-прежнему в памяти улья.
  56.  
  57. // Создаём Self-Invoking Function, чтобы не срать в глобальный объект
  58. (function () {
  59.  
  60.   // Собственно, горячее и материальное сердце скрипта
  61.   // Замена текста в активном элементе страницы
  62.   var replacer = function() {
  63.     var replacer = function(tmp) {
  64.       var replacer = function(regex, replacement, shift = 0) {
  65.         while ( regex.test(tmp) ) {
  66.           tmp = tmp.replace(regex, replacement);
  67.           selSt -= shift;
  68.           selEn -= shift;
  69.         }
  70.       };
  71.       // Тире (с неразрывным пробелом ( \xa0 ) )
  72.       replacer(/ +-(?= )/, '\xa0—');
  73.       // Короткое тире (между датами)
  74.       replacer(/(\d{4})-(?=\d{1,4}($| | ?г+))/, '$1–');
  75.       // Неразрывный дефис. Спорная замена
  76. //       replacer(/([A-яё]|\d)-(?=[A-яё])/, '$1\u2011');
  77.       // Кавычки
  78.       replacer(/(^|\s)"/, '$1«');
  79.       replacer(/"(?=\s|$)/, '»');
  80.       // Знак охраны авторского права
  81.       replacer(/\(C\)/, '©', 2);
  82.       // Символ зарегистрированного товарного знака
  83.       replacer(/\(R\)/, '®', 2);
  84.       // Символ товарного знака
  85.       replacer(/\(tm\)/i, '™', 3);
  86.       // Плюс-минус
  87.       replacer(/\+-/, '±', 1);
  88.       // Многоточие
  89.       replacer(/\.\.\./, '…', 2);
  90.       // Ударение
  91.       replacer(/([А-я])'/, '$1\u0301');
  92.       // Неразрывный пробел 1. Единицы измерения (в теории, на деле же просто прикрепление чисел к стоящим далее коротким словам)
  93.       replacer(/(\d+) (?=[A-я]{1,3}[^A-я])/, "$1\xa0");
  94.       // Неразрывный пробел 2. Предлоги
  95.       replacer(/(^|\s)(а-ля|безо?|вне|во?|для|до|за|из(-за|-под|о)?|ко?|меж|мимо|на(до?)?|не|об?|ото?|по(до?)?|пр(и|о)|ради|со?|у|as|at|but|by|for|in|off?|on|out|per|to|up|via) (?=[A-яё]+)/, "$1$2\xa0");
  96.  
  97.       return tmp;
  98.     };
  99.     const el = document.activeElement;
  100.     let selSt = el.selectionStart,
  101.         selEn = el.selectionEnd,
  102.         replaced = replacer(el.value);
  103.     if (el.value != replaced) {
  104.       el.value = replaced;
  105.       el.setSelectionRange(selSt, selEn);
  106.     }
  107.   };
  108.  
  109.   // Ждём появления #content и вешаем обработчик нажатий клавиш.
  110.   // Оказывается, что keyup на элементе срабатывает только при нажатии клавиш в элементе, допускающем ввод текста. Охуенно.
  111.   const retryTime = 1 *1000;
  112.   setTimeout(function(){
  113.     let el = document.getElementById('content');
  114.     if ( !el ) return setTimeout(arguments.callee, retryTime);
  115.     el.addEventListener('keyup', replacer);
  116.   }, retryTime);
  117.  
  118.   // Отсюда идёт обработка содержимого постов. Чтобы всякие неграмотные пидоры не так выделялись.
  119. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement