信仰指数:修订间差异

来自SOKA CAFE
こばと
こばと留言 | 贡献 (修改)
第1行: 第1行:
<html>
<html>
<head>
<!-- Faith Index (MediaWiki inline, no inline event handlers) -->
<style>
<div class="fi-root">
.faith-index-body {
  <div class="faith-index-body">
  background: linear-gradient(135deg, #0052a5 0%, #f9e300 50%, #d40000 100%);
    <div class="faith-index-container">
  min-height: 90vh;
      <h1>信仰指数测试</h1>
  display: flex;
      <p class="subtitle">测测你的信仰有多虔诚</p>
  justify-content: center;
  align-items: center;
  padding: 20px;
  font-family: 'Segoe UI','Microsoft YaHei',sans-serif;
}
 
.faith-index-container {
  background: rgba(255,255,255,0.25);
  backdrop-filter: blur(12px);
  border-radius: 20px;
  padding: 40px;
  width: 100%;
  max-width: 500px;
  box-shadow: 0 8px 32px rgba(0,0,0,0.1);
  border: 1px solid rgba(255,255,255,0.4);
  text-align: center;
  margin: 0 auto;
}
 
.faith-index-container h1 {
  color: #2c3e50;
  margin-bottom: 10px;
  font-size: 2.2rem;
  font-weight: 600;
}
 
.faith-index-container .subtitle {
  color: #34495e;
  margin-bottom: 30px;
  font-size: 1rem;
}
 
.faith-index-container .input-group { margin-bottom: 25px; text-align: left; }
 
.faith-index-container label {
  display: block;
  color: #2c3e50;
  margin-bottom: 8px;
  font-weight: 500;
}
 
.faith-index-container input {
  width: 100%;
  padding: 15px;
  border-radius: 12px;
  border: none;
  background: rgba(255,255,255,0.5);
  color: #2c3e50;
  font-size: 1rem;
  transition: all 0.3s ease;
  border: 1px solid rgba(255,255,255,0.5);
  box-sizing: border-box;
}
 
.faith-index-container input:focus {
  outline: none;
  background: rgba(255,255,255,0.7);
  box-shadow: 0 0 0 3px rgba(44,62,80,0.2);
}
 
.faith-index-container button {
  background: linear-gradient(to right, #34495e, #2c3e50);
  color: #fff;
  border: none;
  padding: 15px 30px;
  border-radius: 12px;
  font-size: 1.1rem;
  font-weight: 600;
  cursor: pointer;
  transition: all 0.3s ease;
  width: 100%;
  margin-top: 10px;
  box-shadow: 0 5px 15px rgba(44,62,80,0.3);
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 10px;
}
 
.faith-index-container button:hover {
  transform: translateY(-3px);
  box-shadow: 0 8px 20px rgba(44,62,80,0.4);
}
 
.faith-index-container button:active { transform: translateY(0); }
 
.faith-index-container button:disabled {
  opacity: 0.7;
  cursor: not-allowed;
  transform: none;
}
 
.faith-index-container .loader {
  width: 20px;
  height: 20px;
  border: 2px solid rgba(255,255,255,0.3);
  border-radius: 50%;
  border-top: 2px solid #fff;
  animation: faith-index-spin 1s linear infinite;
}
 
@keyframes faith-index-spin {
  0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }
}
 
.faith-index-container .result {
  margin-top: 30px;
  padding: 25px;
  border-radius: 15px;
  background: rgba(255,255,255,0.3);
  display: none;
  animation: faith-index-fadeIn 0.5s ease;
}
 
@keyframes faith-index-fadeIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
 
.faith-index-container .score {
  font-size: 3.5rem;
  font-weight: 800;
  margin: 15px 0;
  color: #2c3e50;
}
 
.faith-index-container .comment {
  font-size: 1.2rem;
  color: #2c3e50;
  margin: 15px 0;
  padding: 15px;
  border-radius: 10px;
  background: rgba(255,255,255,0.4);
  text-align: left;
  line-height: 1.5;
}
 
.faith-index-container .meter {
  height: 20px;
  background: rgba(0,0,0,0.1);
  border-radius: 10px;
  margin: 20px 0;
  overflow: hidden;
}
 
.faith-index-container .meter-fill {
  height: 100%;
  border-radius: 10px;
  transition: width 1s ease;
  background: linear-gradient(to right, #0052a5, #f9e300, #d40000);
}
 
.faith-index-container .ranges {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
  color: #34495e;
  font-size: 0.85rem;
}
 
.faith-index-container .footer { margin-top: 30px; color: #34495e; font-size: 0.9rem; }
 
.faith-index-container .error {
  color: #d9534f;
  background: rgba(217,83,79,0.1);
  padding: 10px;
  border-radius: 8px;
  margin-top: 10px;
  display: none;
}
</style>
</head>
 
<body>
<div class="faith-index-body">
  <div class="faith-index-container">
    <h1>信仰指数测试</h1>
    <p class="subtitle">测测你的信仰有多虔诚</p>


    <div class="input-group">
      <div class="input-group">
      <label for="faith-index-username">请输入您的名字:</label>
        <label>请输入您的名字:</label>
      <input type="text" id="faith-index-username" placeholder="输入名字..." autocomplete="off">
        <input class="fi-input" type="text" placeholder="输入名字..." autocomplete="off">
    </div>
      </div>


    <button id="faith-index-analyzeBtn">
      <button type="button" class="fi-btn">
      <span id="faith-index-btnText">开始测试</span>
        <span class="fi-btn-text">开始测试</span>
      <div class="loader" id="faith-index-loader" style="display:none;"></div>
        <div class="loader fi-loader" style="display:none;"></div>
    </button>
      </button>


    <div class="error" id="faith-index-errorMsg"></div>
      <div class="error fi-error" style="display:none;"></div>


    <div class="result" id="faith-index-result">
      <div class="result fi-result" style="display:none;">
      <h2>测试结果</h2>
        <h2>测试结果</h2>
      <p>姓名: <span id="faith-index-resultUsername"></span></p>
        <p>姓名: <span class="fi-name"></span></p>
      <div class="score" id="faith-index-scoreDisplay">0%</div>
        <div class="score fi-score">0%</div>
      <div class="meter"><div class="meter-fill" id="faith-index-meterFill" style="width:0%;"></div></div>
        <div class="meter"><div class="meter-fill fi-meter" style="width:0%"></div></div>
      <div class="ranges"><span>0-20</span><span>21-40</span><span>41-60</span><span>61-80</span><span>81-100</span></div>
        <div class="ranges"><span>0-20</span><span>21-40</span><span>41-60</span><span>61-80</span><span>81-100</span></div>
      <div class="comment" id="faith-index-comment"></div>
        <div class="comment fi-comment"></div>
      <p class="footer">* 本结果为娱乐目的,基于名字的随机计算,每次查询结果相同</p>
        <p class="footer">* 本结果为娱乐目的,基于名字的随机计算,每次查询结果相同</p>
      </div>
     </div>
     </div>
   </div>
   </div>
</div>
</div>


<script>
<style>
document.addEventListener('DOMContentLoaded', () => {
/* ---- styles (scoped by .faith-index-*) ---- */
  const analyzeBtn = document.getElementById('faith-index-analyzeBtn');
.faith-index-body{background:linear-gradient(135deg,#0052a5 0%,#f9e300 50%,#d40000 100%);min-height:90vh;display:flex;justify-content:center;align-items:center;padding:20px;font-family:'Segoe UI','Microsoft YaHei',sans-serif}
  const usernameInput = document.getElementById('faith-index-username');
.faith-index-container{background:rgba(255,255,255,.25);backdrop-filter:blur(12px);border-radius:20px;padding:40px;width:100%;max-width:500px;box-shadow:0 8px 32px rgba(0,0,0,.1);border:1px solid rgba(255,255,255,.4);text-align:center;margin:0 auto}
  const resultDiv = document.getElementById('faith-index-result');
.faith-index-container h1{color:#2c3e50;margin-bottom:10px;font-size:2.2rem;font-weight:600}
  const loader = document.getElementById('faith-index-loader');
.faith-index-container .subtitle{color:#34495e;margin-bottom:30px;font-size:1rem}
  const btnText = document.getElementById('faith-index-btnText');
.faith-index-container .input-group{margin-bottom:25px;text-align:left}
  const errorMsg = document.getElementById('faith-index-errorMsg');
.faith-index-container label{display:block;color:#2c3e50;margin-bottom:8px;font-weight:500}
.faith-index-container input{width:100%;padding:15px;border-radius:12px;border:none;background:rgba(255,255,255,.5);color:#2c3e50;font-size:1rem;transition:all .3s ease;border:1px solid rgba(255,255,255,.5);box-sizing:border-box}
.faith-index-container input:focus{outline:none;background:rgba(255,255,255,.7);box-shadow:0 0 0 3px rgba(44,62,80,.2)}
.faith-index-container button{background:linear-gradient(to right,#34495e,#2c3e50);color:#fff;border:none;padding:15px 30px;border-radius:12px;font-size:1.1rem;font-weight:600;cursor:pointer;transition:all .3s ease;width:100%;margin-top:10px;box-shadow:0 5px 15px rgba(44,62,80,.3);display:flex;justify-content:center;align-items:center;gap:10px}
.faith-index-container button:hover{transform:translateY(-3px);box-shadow:0 8px 20px rgba(44,62,80,.4)}
.faith-index-container button:active{transform:translateY(0)}
.faith-index-container button[disabled]{opacity:.7;cursor:not-allowed;transform:none}
.faith-index-container .loader{width:20px;height:20px;border:2px solid rgba(255,255,255,.3);border-radius:50%;border-top:2px solid #fff;animation:faith-index-spin 1s linear infinite}
@keyframes faith-index-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
.faith-index-container .result{margin-top:30px;padding:25px;border-radius:15px;background:rgba(255,255,255,.3);display:none;animation:faith-index-fadeIn .5s ease}
@keyframes faith-index-fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.faith-index-container .score{font-size:3.5rem;font-weight:800;margin:15px 0;color:#2c3e50}
.faith-index-container .comment{font-size:1.2rem;color:#2c3e50;margin:15px 0;padding:15px;border-radius:10px;background:rgba(255,255,255,.4);text-align:left;line-height:1.5}
.faith-index-container .meter{height:20px;background:rgba(0,0,0,.1);border-radius:10px;margin:20px 0;overflow:hidden}
.faith-index-container .meter-fill{height:100%;border-radius:10px;transition:width 1s ease;background:linear-gradient(to right,#0052a5,#f9e300,#d40000)}
.faith-index-container .ranges{display:flex;justify-content:space-between;margin-top:10px;color:#34495e;font-size:.85rem}
.faith-index-container .footer{margin-top:30px;color:#34495e;font-size:.9rem}
.faith-index-container .error{color:#d9534f;background:rgba(217,83,79,.1);padding:10px;border-radius:8px;margin-top:10px;display:none}
</style>


   function calculateFaithIndex(username) {
<script type="text/javascript">
     let hash = 0;
(function(){
     if (username.length === 0) return 0;
  // —— 逻辑函数 —— //
     for (let i = 0; i < username.length; i++) {
   function calculateFaithIndex(name){
       const char = username.charCodeAt(i);
     var hash = 0, i, ch;
       hash = ((hash << 5) - hash) + char;
     if (!name) return 0;
       hash = hash & hash;
     for (i=0;i<name.length;i++){
       ch = name.charCodeAt(i);
       hash = ((hash<<5) - hash) + ch;
       hash = hash | 0;
     }
     }
     return Math.abs(hash) % 101;
     return Math.abs(hash) % 101;
   }
   }
 
   function getFaithComment(score){
   function getFaithComment(score) {
     if (score <= 20) return "信仰指数较低,信心还需磨练。请多参加活动,加强学习,在广布的道路上继续精进!";
     if (score <= 20) return "信仰指数较低,信心还需磨练。请多参加活动,加强学习,在广布的道路上继续精进!";
     if (score <= 40) return "作为一名初信者,你的信心正在萌芽。坚持每日的实践,你将见证不可思议的功德!";
     if (score <= 40) return "作为一名初信者,你的信心正在萌芽。坚持每日的实践,你将见证不可思议的功德!";
第237行: 第80行:
   }
   }


   function showError(msg) {
   function bindOne(root){
     errorMsg.textContent = msg;
    if (!root || root.__fiBound) return;
    errorMsg.style.display = 'block';
    root.__fiBound = true;
 
    var input  = root.querySelector('.fi-input');
    var btn    = root.querySelector('.fi-btn');
    var btnTxt = root.querySelector('.fi-btn-text');
    var loader = root.querySelector('.fi-loader');
    var result = root.querySelector('.fi-result');
    var error  = root.querySelector('.fi-error');
    var nameEl = root.querySelector('.fi-name');
    var scoreEl= root.querySelector('.fi-score');
    var cmtEl  = root.querySelector('.fi-comment');
    var meter  = root.querySelector('.fi-meter');
 
    function showError(msg){ if(!error) return; error.textContent=msg; error.style.display='block'; }
    function hideError(){ if(error) error.style.display='none'; }
 
     function run(){
      var username = (input && input.value || '').trim();
      if (!username){
        showError('请输入您的名字!');
        if (result) result.style.display = 'none';
        return;
      }
      hideError();
      if (loader) loader.style.display = 'inline-block';
      if (btnTxt) btnTxt.textContent = '计算中...';
      if (btn)    btn.disabled = true;
 
      setTimeout(function(){
        try{
          var score = calculateFaithIndex(username);
          if (nameEl)  nameEl.textContent  = username;
          if (scoreEl) scoreEl.textContent = score + '%';
          if (cmtEl)  cmtEl.textContent  = getFaithComment(score);
          if (result)  result.style.display = 'block';
          setTimeout(function(){ if (meter) meter.style.width = score + '%'; }, 60);
        } finally {
          if (loader) loader.style.display = 'none';
          if (btnTxt) btnTxt.textContent = '开始测试';
          if (btn)    btn.disabled = false;
        }
      }, 80);
    }
 
    // 事件绑定(不使用 inline handler)
    if (btn)  btn.addEventListener('click', run);
    if (input) input.addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
 
    // 兜底委托:DOM 若被替换,仍可触发
    root.addEventListener('click', function(e){
      var b = e.target.closest && e.target.closest('.fi-btn');
      if (b && root.contains(b)) run();
    });
  }
 
  function bindAll(ctx){
    var scope = ctx || document;
    var roots = scope.querySelectorAll ? scope.querySelectorAll('.fi-root') : [];
    for (var i=0; i<roots.length; i++) bindOne(roots[i]);
   }
   }
  function hideError() { errorMsg.style.display = 'none'; }


   function runTest() {
   // 1) 立刻尝试
    const username = usernameInput.value.trim();
  bindAll(document);
    if (!username) {
 
      showError('请输入您的名字!');
  // 2) 常见时机再尝试
      resultDiv.style.display = 'none';
  if (document.readyState === 'complete') {
      return;
    bindAll(document);
    }
  } else {
     hideError();
     // DOMContentLoaded / load
     loader.style.display = 'inline-block';
     document.addEventListener('DOMContentLoaded', function(){ bindAll(document); });
     btnText.textContent = '计算中...';
     window.addEventListener('load', function(){ bindAll(document); });
    analyzeBtn.disabled = true;
  }


    setTimeout(() => {
  // MediaWiki 的局部刷新
      const score = calculateFaithIndex(username);
  if (window.mw && mw.hook) {
      const comment = getFaithComment(score);
    mw.hook('wikipage.content').add(function($c){
      document.getElementById('faith-index-resultUsername').textContent = username;
      var node = $c && $c[0] ? $c[0] : document;
      document.getElementById('faith-index-scoreDisplay').textContent = score + '%';
       bindAll(node);
      document.getElementById('faith-index-comment').textContent = comment;
     });
      resultDiv.style.display = 'block';
      setTimeout(() => {
        document.getElementById('faith-index-meterFill').style.width = score + '%';
       }, 100);
      loader.style.display = 'none';
      btnText.textContent = '开始测试';
      analyzeBtn.disabled = false;
     }, 200);
   }
   }


   analyzeBtn.addEventListener('click', runTest);
   // 3) 监听 DOM 变化:新加/替换时自动绑定
  usernameInput.addEventListener('keypress', e => { if (e.key === 'Enter') runTest(); });
  try {
});
    var mo = new MutationObserver(function(muts){
      for (var i=0;i<muts.length;i++){
        var m = muts[i];
        if (m.type === 'childList') {
          // 直接子节点
          for (var j=0;j<m.addedNodes.length;j++){
            var n = m.addedNodes[j];
            if (!n || n.nodeType !== 1) continue;
            if (n.matches && n.matches('.fi-root')) bindOne(n);
            if (n.querySelectorAll) bindAll(n);
          }
        }
      }
    });
    mo.observe(document.documentElement || document.body, { childList:true, subtree:true });
  } catch(_) {}
})();
</script>
</script>
</body>
 
</html>
</html>

2025年10月12日 (日) 16:40的版本

信仰指数测试

测测你的信仰有多虔诚