MediaWiki:Gadget-faith-index.js

来自SOKA CAFE

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
// MediaWiki:Gadget-faith-index.js
(function () {
  'use strict';

  // 避免多次初始化
  if (window.__faithIndexInit) return;
  window.__faithIndexInit = true;

  // 在页面就绪时运行(兼容可视化编辑后的局部刷新)
  function init($root) {
    var container = ($root || document).querySelector('.faith-index-container');
    if (!container) return;

    var analyzeBtn = container.querySelector('#faith-index-analyzeBtn');
    var usernameInput = container.querySelector('#faith-index-username');

    function showError(message) {
      var errorMsg = container.querySelector('#faith-index-errorMsg');
      if (errorMsg) {
        errorMsg.textContent = message;
        errorMsg.style.display = 'block';
      }
    }

    function hideError() {
      var errorMsg = container.querySelector('#faith-index-errorMsg');
      if (errorMsg) errorMsg.style.display = 'none';
    }

    function calculateFaithIndex(username) {
      var hash = 0;
      if (!username || !username.length) return 0;
      for (var i = 0; i < username.length; i++) {
        var char = username.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash = hash & hash; // 32位
      }
      return Math.abs(hash) % 101;
    }

    function getFaithComment(score) {
      if (score <= 20) {
        return "信仰指数较低,信心还需磨练。请多参加活动,加强学习,在广布的道路上继续精进!";
      } else if (score <= 40) {
        return "作为一名初信者,你的信心正在萌芽。坚持每日的实践,你将见证不可思议的功德!";
      } else if (score <= 60) {
        return "信心坚定,是广布的有力实践者。你的存在本身就是胜利的证明,请继续鼓励身边的同志!";
      } else if (score <= 80) {
        return "不愧是池田门生,信心强盛如狮子王!你的祈愿必将实现,继续作为常胜的先驱奋斗吧!";
      } else {
        return "了不起!你拥有佛的生命,是人间革命的先锋。你的生命正在闪耀着最尊贵的光芒!";
      }
    }

    function runOnce() {
      var resultDiv = container.querySelector('#faith-index-result');
      var loader = container.querySelector('#faith-index-loader');
      var btnText = container.querySelector('#faith-index-btnText');
      if (!analyzeBtn || !usernameInput) return;

      var username = usernameInput.value.trim();
      if (!username) {
        showError('请输入您的名字!');
        if (resultDiv) resultDiv.style.display = 'none';
        return;
      }

      hideError();

      // 交互小状态(可选)
      if (loader) loader.style.display = 'inline-block';
      if (btnText) btnText.textContent = '计算中...';
      analyzeBtn.disabled = true;

      // 计算 & 展示(加入少许延时以便过渡)
      setTimeout(function () {
        var score = calculateFaithIndex(username);
        var comment = getFaithComment(score);

        container.querySelector('#faith-index-resultUsername').textContent = username;
        container.querySelector('#faith-index-scoreDisplay').textContent = score + '%';
        container.querySelector('#faith-index-comment').textContent = comment;
        if (resultDiv) resultDiv.style.display = 'block';

        setTimeout(function () {
          var meterFill = container.querySelector('#faith-index-meterFill');
          if (meterFill) meterFill.style.width = score + '%';
        }, 100);

        if (loader) loader.style.display = 'none';
        if (btnText) btnText.textContent = '开始测试';
        analyzeBtn.disabled = false;
      }, 200);
    }

    analyzeBtn && analyzeBtn.addEventListener('click', runOnce);
    usernameInput && usernameInput.addEventListener('keypress', function (e) {
      if (e.key === 'Enter') runOnce();
    });
  }

  if (window.mw && mw.hook) {
    mw.hook('wikipage.content').add(function ($content) {
      // $content 可能是 jQuery 对象或原生节点
      var root = $content && $content[0] ? $content[0] : document;
      init(root);
    });
  } else {
    // 兜底(极简环境)
    document.addEventListener('DOMContentLoaded', function () { init(document); });
  }
})();