← Скрипты · Счётчик символов

counter Счётчик символов в постах

бесплатно

Показывает под каждым постом, сколько в нём знаков — чтобы начислять монеты за пост и не лезть каждый раз в «Редактирование» ради уточнения объёма.

why Зачем он нужен

  • Число знаков видно прямо под постом — при сведении банка не нужно открывать каждое сообщение в «Редактировании».
  • Считается только текст поста: подпись, маска персонажа, скрытый текст и строка «Отредактировано» в счёт не идут — монеты честные, по чистому тексту.
  • Работает только в выбранных вами разделах (эпизодах), первый пост темы — шапку эпизода — пропускает (можно включить).
  • Пересчитывается само, когда на странице подгружаются новые посты.

setup Как поставить

  1. Вставьте код

    Админка → Формы → HTML верх (или «HTML низ» — без разницы). Вставьте код ниже. jQuery на Rusff и MyBB уже есть.

  2. Укажите разделы

    Вверху кода в allowedForums впишите номера своих разделов. Номер виден в адресе: viewforum.php?id=11 → это 11, несколько через запятую.

  3. Первый пост

    Шапку эпизода скрипт не считает. Нужно считать и её — поставьте countFirstPost = 1 вместо 0.

  4. Под свой дизайн

    Число выводится в блоке .send-sumb — подгоните его под оформление форума в «Своём стиле»: размер, цвет, можно добавить подпись «знаков:».

<script>
(function ($) {
  'use strict';
  if (typeof $ === 'undefined') return;

  /* ===== НАСТРОЙКИ ===== */
  // В каких разделах считать (номер из адреса viewforum.php?id=11 -> 11), через запятую:
  var allowedForums = [11, 12, 13];
  // Считать ли первый пост (шапку эпизода): 0 - пропускать, 1 - считать:
  var countFirstPost = 0;
  /* ===== дальше не трогать ===== */

  var firstPostClass = 'topicpost';
  var allowed = new Set(allowedForums.map(Number));
  function isForumAllowed() {
    if (typeof FORUM !== 'undefined' && FORUM.topic && typeof FORUM.topic.forum_id !== 'undefined') return allowed.has(+FORUM.topic.forum_id);
    var f = document.querySelector('#pun-viewtopic[data-forum-id]');
    return f ? allowed.has(+f.dataset.forumId) : false;
  }
  function countText(el) {
    var total = 0;
    (function walk(n){ if(n.nodeType===3){total+=n.nodeValue.length;return;} if(n.nodeType!==1)return; if(n.tagName==='BR'){total+=1;return;} for(var i=0;i<n.childNodes.length;i++)walk(n.childNodes[i]); })(el);
    return total;
  }
  function proc(pc) {
    var $pc = $(pc), $post = $pc.closest('.post');
    if (!countFirstPost && $post.hasClass(firstPostClass)) return;
    $pc.children('.send-sumb').remove();
    var $p = $pc.find('p:not(.lastedit)').filter(function(){ return !$(this).closest('.post-sig, .hvmask').length; });
    var total = 0;
    $p.each(function(i){ total += countText(this); if(i>0) total += 2; });
    var $c = $('<div class="send-sumb"></div>').text(total);
    var $s = $pc.find('.post-sig').first();
    if ($s.length) $c.insertBefore($s); else $pc.append($c);
  }
  function all(ctx){ (ctx?$(ctx):$(document)).find('.post-content').each(function(){ proc(this); }); }
  $(function () {
    if (!isForumAllowed()) return;
    var vt = document.getElementById('pun-viewtopic'); if (!vt) return;
    all(vt);
    $(document).ajaxComplete(function(){ all(vt); });
    if (!window.MutationObserver) return;
    new MutationObserver(function(mu){ for(var a=0;a<mu.length;a++){var ad=mu[a].addedNodes; for(var b=0;b<ad.length;b++){var nd=ad[b]; if(!(nd instanceof HTMLElement))continue; if(nd.matches('.post-content'))proc(nd); else if(nd.querySelectorAll)nd.querySelectorAll('.post-content').forEach(proc);}} }).observe(vt,{childList:true,subtree:true});
  });
})(window.jQuery);
</script>

more Нужен другой скрипт?

Это подарок — пользуйтесь. А если нужен скрипт под вашу задачу (кубики, автоподсчёты, оформление) — напишите, скажу, получится ли и сколько будет стоить.

Написать в Telegram