MediaWiki:Common.js:修订间差异

来自帝鹰维基
跳转到导航 跳转到搜索
(v11)
(v13)
第1行: 第1行:
/* =====================================================================
/* =====================================================================
   帝鹰维基 · 顶部主导航(配合 MediaWiki:Common.css 的 #dy-topnav 深蓝横条)
   帝鹰维基 · 全站脚本 v13
   ★ 改导航入口就在下面 links 列表里:['显示文字','页面标题'],一行一个。
   模块:① 顶部主导航  ② 管理员上传按钮  ③ ♪ 帝鹰电台(侧边栏)
        ④ 💬 帝鹰聊天室(侧边栏入口 + 弹层 iframe /chat/)
   ===================================================================== */
   ===================================================================== */
(function () {
(function () {
  /* ---------- ① 顶部主导航:改入口就在 links 列表里,一行一个 ---------- */
   var links = [
   var links = [
     ['主站', 'Main_Page'],
     ['主站', 'Main_Page'],
第11行: 第13行:
     ['分类', 'Special:Categories']
     ['分类', 'Special:Categories']
   ];
   ];
   function build() {
   function buildNav() {
     if (document.getElementById('dy-topnav')) return;
     if (document.getElementById('dy-topnav')) return;
     var nav = document.createElement('nav');
     var nav = document.createElement('nav');
第27行: 第29行:
       document.body.insertBefore(nav, document.body.firstChild);
       document.body.insertBefore(nav, document.body.firstChild);
     }
     }
  }
  /* ---------- ② 管理员专属:右下角「⬆ 上传图片」浮动按钮 ---------- */
  function addUploadButton() {
    var groups = mw.config.get('wgUserGroups') || [];
    if (groups.indexOf('sysop') === -1) return;          // 仅管理员可见
    if (document.getElementById('dy-upbtn')) return;
    var a = document.createElement('a');
    a.id = 'dy-upbtn';
    a.href = mw.util.getUrl('Special:Upload');
    a.textContent = '⬆ 上传图片/头像';
    a.title = '管理员专用:从本地上传图片,传完把文件名填进卡片';
    document.body.appendChild(a);
  }
  /* ---------- ③ ♪ 帝鹰电台(侧边栏模块) ----------
    曲库来自 /music-list.js(服务器定时生成,window.DY_MUSIC 数组:
    [{id,title,src},...]),音频文件在本站 /music/ 目录,跨页不断播由
    浏览器自行决定;每个页面独立实例,点击播放即出声。          */
  function addRadio(panel, logo) {
    if (document.getElementById('dy-radio')) return;
    var box = document.createElement('div');
    box.id = 'dy-radio';
    box.innerHTML =
      '<div class="dy-mod-h">♪ 帝鹰电台</div>' +
      '<div id="dy-r-title">曲库加载中…</div>' +
      '<div id="dy-r-ctl">' +
      '<button data-act="prev" title="上一首">⏮</button>' +
      '<button data-act="play" title="播放/暂停">▶</button>' +
      '<button data-act="next" title="下一首">⏭</button>' +
      '</div>';
    if (logo && logo.nextSibling) panel.insertBefore(box, logo.nextSibling);
    else panel.appendChild(box);
    var list = [], idx = 0, audio = null, playing = false;
    var titleEl = box.querySelector('#dy-r-title');
    var playBtn = box.querySelector('[data-act="play"]');
    function ensureAudio() {
      if (audio) return;
      audio = new Audio();
      audio.addEventListener('ended', function () { next(1); });
      audio.addEventListener('playing', function () { playing = true; playBtn.textContent = '⏸'; });
      audio.addEventListener('pause', function () { playing = false; playBtn.textContent = '▶'; });
    }
    function show() {
      titleEl.textContent = list.length ? ('▶ ' + (idx + 1) + '. ' + list[idx].title) : '曲库为空';
    }
    function play() {
      if (!list.length) return;
      ensureAudio();
      var want = list[idx].src;
      if (audio.src !== location.origin + want && audio.getAttribute('src') !== want) {
        audio.src = want;                                  // 首次/切歌:设置源
      }
      if (playing) { audio.pause(); } else { audio.play(); }
    }
    function next(step) {
      if (!list.length) return;
      idx = (idx + step + list.length) % list.length;
      if (audio) { audio.src = list[idx].src; audio.play(); }
      show();
    }
    box.addEventListener('click', function (e) {
      var act = e.target.getAttribute && e.target.getAttribute('data-act');
      if (act === 'play') play();
      else if (act === 'next') next(1);
      else if (act === 'prev') next(-1);
    });
    // 曲库脚本:/music-list.js 内容为 window.DY_MUSIC=[...]
    var s = document.createElement('script');
    s.src = '/music-list.js';
    s.onload = function () {
      list = (window.DY_MUSIC || []).filter(function (m) { return m && m.src; });
      show();
    };
    s.onerror = function () { titleEl.textContent = '电台曲库暂不可用'; };
    document.head.appendChild(s);
  }
  /* ---------- ④ 💬 帝鹰聊天室(侧边栏入口 + 全屏弹层) ----------
    后端 = 同站 /chat/(api.php + index.html 自托管聊天室)。
    主内容区不放聊天室,只有侧边栏这一个入口。              */
  function addChat(panel, radio) {
    if (document.getElementById('dy-chat')) return;
    var box = document.createElement('div');
    box.id = 'dy-chat';
    box.innerHTML =
      '<div class="dy-mod-h">💬 帝鹰聊天室</div>' +
      '<button id="dy-chat-open">进入聊天室</button>';
    if (radio && radio.nextSibling) panel.insertBefore(box, radio.nextSibling);
    else panel.appendChild(box);
    box.querySelector('#dy-chat-open').addEventListener('click', function () {
      var ov = document.getElementById('dy-chat-ov');
      if (!ov) {
        ov = document.createElement('div');
        ov.id = 'dy-chat-ov';
        ov.innerHTML =
          '<div class="dy-chat-frame">' +
          '<div class="dy-chat-bar"><span>帝鹰聊天室</span>' +
          '<button id="dy-chat-close">✕ 关闭</button></div>' +
          '<iframe src="/chat/index.html" title="帝鹰聊天室"></iframe>' +
          '</div>';
        document.body.appendChild(ov);
        ov.querySelector('#dy-chat-close').addEventListener('click', function () { ov.hidden = true; });
        ov.addEventListener('click', function (e) { if (e.target === ov) ov.hidden = true; }); // 点空白处也可关
      }
      ov.hidden = false;
    });
  }
  /* ---------- 装配入口 ---------- */
  function buildSide(panel) {
    var logo = document.getElementById('p-logo');
    addRadio(panel, logo);
    addChat(panel, document.getElementById('dy-radio'));
  }
  function boot() {
    buildNav();
    addUploadButton();
    var panel = document.getElementById('mw-panel');
    if (panel) buildSide(panel);
   }
   }
   if (window.jQuery && mw && mw.util) {
   if (window.jQuery && mw && mw.util) {
     $(build);
     $(boot);
    $(addUploadButton);
   } else {
   } else {
     document.addEventListener('DOMContentLoaded', function(){ build(); addUploadButton(); });
     document.addEventListener('DOMContentLoaded', boot);
   }
   }
})();
})();
/* =====================================================================
  管理员专属:右下角「⬆ 上传图片」浮动按钮(访客/普通账号不显示)
  点击进入 MediaWiki 原生上传页,从本地相册选择图片上传,
  传完后把文件名填进主页卡片模板的 头像= 参数即可完成更换头像。
  ===================================================================== */
function addUploadButton() {
  var groups = mw.config.get('wgUserGroups') || [];
  if (groups.indexOf('sysop') === -1) return;          // 仅管理员可见
  if (document.getElementById('dy-upbtn')) return;
  var a = document.createElement('a');
  a.id = 'dy-upbtn';
  a.href = mw.util.getUrl('Special:Upload');
  a.textContent = '⬆ 上传图片/头像';
  a.title = '管理员专用:从本地上传图片,传完把文件名填进卡片';
  document.body.appendChild(a);
}

2026年10月22日 (四) 17:19的版本

/* =====================================================================
   帝鹰维基 · 全站脚本 v13
   模块:① 顶部主导航  ② 管理员上传按钮  ③ ♪ 帝鹰电台(侧边栏)
         ④ 💬 帝鹰聊天室(侧边栏入口 + 弹层 iframe /chat/)
   ===================================================================== */
(function () {
  /* ---------- ① 顶部主导航:改入口就在 links 列表里,一行一个 ---------- */
  var links = [
    ['主站', 'Main_Page'],
    ['成员专区', '帝鹰核心成员'],
    ['组织章程', '组织章程'],
    ['史料归档', '聊天室记录归档'],
    ['分类', 'Special:Categories']
  ];
  function buildNav() {
    if (document.getElementById('dy-topnav')) return;
    var nav = document.createElement('nav');
    nav.id = 'dy-topnav';
    links.forEach(function (it) {
      var a = document.createElement('a');
      a.href = mw.util.getUrl(it[1]);
      a.textContent = it[0];
      nav.appendChild(a);
    });
    var pageBase = document.getElementById('mw-page-base');
    if (pageBase && pageBase.parentNode) {
      pageBase.parentNode.insertBefore(nav, pageBase);
    } else {
      document.body.insertBefore(nav, document.body.firstChild);
    }
  }

  /* ---------- ② 管理员专属:右下角「⬆ 上传图片」浮动按钮 ---------- */
  function addUploadButton() {
    var groups = mw.config.get('wgUserGroups') || [];
    if (groups.indexOf('sysop') === -1) return;           // 仅管理员可见
    if (document.getElementById('dy-upbtn')) return;
    var a = document.createElement('a');
    a.id = 'dy-upbtn';
    a.href = mw.util.getUrl('Special:Upload');
    a.textContent = '⬆ 上传图片/头像';
    a.title = '管理员专用:从本地上传图片,传完把文件名填进卡片';
    document.body.appendChild(a);
  }

  /* ---------- ③ ♪ 帝鹰电台(侧边栏模块) ----------
     曲库来自 /music-list.js(服务器定时生成,window.DY_MUSIC 数组:
     [{id,title,src},...]),音频文件在本站 /music/ 目录,跨页不断播由
     浏览器自行决定;每个页面独立实例,点击播放即出声。          */
  function addRadio(panel, logo) {
    if (document.getElementById('dy-radio')) return;
    var box = document.createElement('div');
    box.id = 'dy-radio';
    box.innerHTML =
      '<div class="dy-mod-h">♪ 帝鹰电台</div>' +
      '<div id="dy-r-title">曲库加载中…</div>' +
      '<div id="dy-r-ctl">' +
      '<button data-act="prev" title="上一首">⏮</button>' +
      '<button data-act="play" title="播放/暂停">▶</button>' +
      '<button data-act="next" title="下一首">⏭</button>' +
      '</div>';
    if (logo && logo.nextSibling) panel.insertBefore(box, logo.nextSibling);
    else panel.appendChild(box);

    var list = [], idx = 0, audio = null, playing = false;
    var titleEl = box.querySelector('#dy-r-title');
    var playBtn = box.querySelector('[data-act="play"]');

    function ensureAudio() {
      if (audio) return;
      audio = new Audio();
      audio.addEventListener('ended', function () { next(1); });
      audio.addEventListener('playing', function () { playing = true; playBtn.textContent = '⏸'; });
      audio.addEventListener('pause', function () { playing = false; playBtn.textContent = '▶'; });
    }
    function show() {
      titleEl.textContent = list.length ? ('▶ ' + (idx + 1) + '. ' + list[idx].title) : '曲库为空';
    }
    function play() {
      if (!list.length) return;
      ensureAudio();
      var want = list[idx].src;
      if (audio.src !== location.origin + want && audio.getAttribute('src') !== want) {
        audio.src = want;                                   // 首次/切歌:设置源
      }
      if (playing) { audio.pause(); } else { audio.play(); }
    }
    function next(step) {
      if (!list.length) return;
      idx = (idx + step + list.length) % list.length;
      if (audio) { audio.src = list[idx].src; audio.play(); }
      show();
    }
    box.addEventListener('click', function (e) {
      var act = e.target.getAttribute && e.target.getAttribute('data-act');
      if (act === 'play') play();
      else if (act === 'next') next(1);
      else if (act === 'prev') next(-1);
    });
    // 曲库脚本:/music-list.js 内容为 window.DY_MUSIC=[...]
    var s = document.createElement('script');
    s.src = '/music-list.js';
    s.onload = function () {
      list = (window.DY_MUSIC || []).filter(function (m) { return m && m.src; });
      show();
    };
    s.onerror = function () { titleEl.textContent = '电台曲库暂不可用'; };
    document.head.appendChild(s);
  }

  /* ---------- ④ 💬 帝鹰聊天室(侧边栏入口 + 全屏弹层) ----------
     后端 = 同站 /chat/(api.php + index.html 自托管聊天室)。
     主内容区不放聊天室,只有侧边栏这一个入口。               */
  function addChat(panel, radio) {
    if (document.getElementById('dy-chat')) return;
    var box = document.createElement('div');
    box.id = 'dy-chat';
    box.innerHTML =
      '<div class="dy-mod-h">💬 帝鹰聊天室</div>' +
      '<button id="dy-chat-open">进入聊天室</button>';
    if (radio && radio.nextSibling) panel.insertBefore(box, radio.nextSibling);
    else panel.appendChild(box);

    box.querySelector('#dy-chat-open').addEventListener('click', function () {
      var ov = document.getElementById('dy-chat-ov');
      if (!ov) {
        ov = document.createElement('div');
        ov.id = 'dy-chat-ov';
        ov.innerHTML =
          '<div class="dy-chat-frame">' +
          '<div class="dy-chat-bar"><span>帝鹰聊天室</span>' +
          '<button id="dy-chat-close">✕ 关闭</button></div>' +
          '<iframe src="/chat/index.html" title="帝鹰聊天室"></iframe>' +
          '</div>';
        document.body.appendChild(ov);
        ov.querySelector('#dy-chat-close').addEventListener('click', function () { ov.hidden = true; });
        ov.addEventListener('click', function (e) { if (e.target === ov) ov.hidden = true; }); // 点空白处也可关
      }
      ov.hidden = false;
    });
  }

  /* ---------- 装配入口 ---------- */
  function buildSide(panel) {
    var logo = document.getElementById('p-logo');
    addRadio(panel, logo);
    addChat(panel, document.getElementById('dy-radio'));
  }
  function boot() {
    buildNav();
    addUploadButton();
    var panel = document.getElementById('mw-panel');
    if (panel) buildSide(panel);
  }
  if (window.jQuery && mw && mw.util) {
    $(boot);
  } else {
    document.addEventListener('DOMContentLoaded', boot);
  }
})();