打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

Widget:GF立绘切换:修订间差异

来自OGAS数据中枢
弃权者留言 | 贡献
创建页面,内容为“<!-- Widget:GF立绘切换 参数(由模板传入,Widget 扩展用 {{{param}}} 语法接收): 立绘1~5 图片文件名(含扩展名) 立绘1说明~5 标签文字 页面 SUBPAGENAME,用于隔离同页多个 infobox 的 id --> <style> .gf-sw{width:100%;display:flex;flex-direction:column;} .gf-sw-slides{width:100%;position:relative;} .gf-sw-slide{display:none;flex-direction:column;align-items:center;width:100%;} .gf-sw-…”
 
弃权者留言 | 贡献
无编辑摘要
 
(未显示同一用户的26个中间版本)
第1行: 第1行:
<!--
<script>
  Widget:GF立绘切换
(function () {
  参数(由模板传入,Widget 扩展用 {{{param}}} 语法接收):
    function initSwitcher() {
    立绘1~5      图片文件名(含扩展名)
         var api = (window.mw && mw.Api) ? new mw.Api() : null;
    立绘1说明~5  标签文字
        document.querySelectorAll('.gf-infobox-new').forEach(function (box) {
    页面         SUBPAGENAME,用于隔离同页多个 infobox 的 id
            if (box.dataset.ready) return;
-->
            box.dataset.ready = '1';
<style>
 
.gf-sw{width:100%;display:flex;flex-direction:column;}
            var container = box.querySelector('.gf-image-container');
.gf-sw-slides{width:100%;position:relative;}
            var btns = box.querySelectorAll('.gf-switch-btn');
.gf-sw-slide{display:none;flex-direction:column;align-items:center;width:100%;}
            var overlay = box.querySelector('.gf-switcher-overlay');
.gf-sw-slide.gf-active{display:flex;}
            var toggle = box.querySelector('.gf-switcher-toggle');
.gf-sw-slide img{width:100%;height:auto;display:block;}
            var viewBtn = box.querySelector('.gf-view-original');
.gf-sw-tabs{display:flex;flex-wrap:wrap;border-top:1px solid #c8ccd1;background:#f8f9fa;}
 
.gf-sw-tab{flex:1 1 0;min-width:0;padding:5px 3px;font-size:.82em;text-align:center;cursor:pointer;border:none;border-right:1px solid #c8ccd1;background:transparent;color:#202122;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background .12s;}
            if (toggle) toggle.onclick = function() { overlay.classList.toggle('collapsed'); };
.gf-sw-tab:last-child{border-right:none;}
 
.gf-sw-tab:hover{background:#eaecf0;}
            function getImgPath(filename, currentSrc, callback) {
.gf-sw-tab.gf-active{background:#fff;color:#3366cc;font-weight:bold;box-shadow:inset 0 -2px 0 #3366cc;}
                if (api) {
.gf-sw-missing{padding:24px 8px;text-align:center;color:#54595d;font-size:.9em;line-height:1.8;}
                    api.get({ action: 'query', prop: 'imageinfo', titles: 'File:' + filename, iiprop: 'url' })
</style>
                    .done(function (data) {
                        var pages = data.query.pages;
                        for (var id in pages) { if (pages[id].imageinfo) { callback(pages[id].imageinfo[0].url); return; } }
                        tryFallback();
                    }).fail(tryFallback);
                } else tryFallback();


<div class="gf-sw" id="gf-sw-{{{页面}}}">
                function tryFallback() {
  <div class="gf-sw-slides">
                    if (!currentSrc) { callback(null); return; }
    <!-- 有立绘才渲染对应 slide,文件名由 MediaWiki 解析后传入 -->
                    var curName = currentSrc.substring(currentSrc.lastIndexOf('/') + 1);
    {{{立绘1|__MISSING__}}}<!--SPLITHERE-->
                    callback(currentSrc.replace(curName, filename.replace(/ /g, '_')));
    {{{立绘2|}}}<!--SPLITHERE-->
                }
    {{{立绘3|}}}<!--SPLITHERE-->
            }
    {{{立绘4|}}}<!--SPLITHERE-->
    {{{立绘5|}}}<!--SPLITHERE-->
    {{{立绘1说明|常态}}}<!--SPLITHERE-->
    {{{立绘2说明|立绘2}}}<!--SPLITHERE-->
    {{{立绘3说明|立绘3}}}<!--SPLITHERE-->
    {{{立绘4说明|立绘4}}}<!--SPLITHERE-->
    {{{立绘5说明|立绘5}}}<!--SPLITHERE-->
  </div>
</div>


<script>
            if (viewBtn) {
(function(){
                viewBtn.onclick = function(e) {
  var wrap = document.currentScript.previousElementSibling;
                    e.stopPropagation();
  // Widget 扩展把参数直接渲染进 HTML,我们用注释分隔符拆出来
                    var activeBtn = box.querySelector('.gf-switch-btn.active');
  var raw = wrap.querySelector('.gf-sw-slides').innerHTML;
                    if (activeBtn) {
  var parts = raw.split('<!--SPLITHERE-->').map(function(s){ return s.trim(); });
                        var filename = activeBtn.dataset.filename;
  // parts[0..4] = 立绘1..5 文件名(MediaWiki 已将 [[Image:X]] 渲染成 <img>,
                        var isDmg = activeBtn.dataset.state === 'damage';
  //  但这里传的是纯文件名,需要我们自己构造 wiki 图片 URL)
                        var target = isDmg ? filename.substring(0, filename.lastIndexOf('.')) + '_D' + filename.substring(filename.lastIndexOf('.')) : filename;
  // ── 注意:Widget 里无法用 [[Image:]] 语法,文件名要拼 URL ──
                        window.open(mw.config.get('wgArticlePath').replace('$1', 'File:' + target), '_blank');
  // gf-ogas.wiki 的图片路径规则与标准 MediaWiki 相同:
                    }
  //  /wiki/Special:FilePath/文件名
                };
  var files  = parts.slice(0,5);
            }
  var labels = parts.slice(5,10);


  var slides = wrap.querySelector('.gf-sw-slides');
            container.onclick = function() {
  var validSlides = [];
                var img = container.querySelector('img');
  slides.innerHTML = '';
                var activeBtn = box.querySelector('.gf-switch-btn.active');
                if (!img || !activeBtn) return;
                var base = activeBtn.dataset.filename;
                var isDmg = activeBtn.dataset.state === 'damage';
                var target = isDmg ? base : base.substring(0, base.lastIndexOf('.')) + '_D' + base.substring(base.lastIndexOf('.'));
               
                container.classList.add('loading');
                getImgPath(target, img.src, function(url) {
                    if (url) {
                        var t = new Image();
                        t.onload = function() {
                            img.src = url;
                            activeBtn.dataset.state = isDmg ? 'normal' : 'damage';
                            container.classList.remove('loading');
                        };
                        t.onerror = function() { container.classList.remove('loading'); };
                        t.src = url;
                    } else container.classList.remove('loading');
                });
            };


  files.forEach(function(fname, i){
            btns.forEach(function (btn) {
    fname = fname.replace(/<!--.*?-->/g,'').trim();
                btn.onclick = function (e) {
    if(!fname || fname === '__MISSING__'){
                    e.stopPropagation();
      if(i === 0){
                    if (btn.classList.contains('active')) return;
        slides.innerHTML = '<div class="gf-sw-missing">啊嘞?!<br/>怎么回事<br/>这个妹子怎么没有头的样子……</div>';
                    var filename = btn.dataset.filename;
      }
                    btn.dataset.state = 'normal';
      return;
                    var oldImg = container.querySelector('img');
                    if (oldImg) oldImg.style.opacity = '0';
                    getImgPath(filename, (oldImg ? oldImg.src : null), function(url) {
                        if (url) {
                            setTimeout(function () {
                                container.innerHTML = '<div class="gf-main-img"><img src="' + url + '" style="opacity:0;"></div>';
                                container.appendChild(viewBtn);
                                var n = container.querySelector('img');
                                n.onload = function () { n.style.opacity = '1'; };
                                if (n.complete) n.style.opacity = '1';
                            }, 150);
                        }
                    });
                    btns.forEach(function (b) { b.classList.remove('active'); });
                    btn.classList.add('active');
                };
            });
        });
     }
     }
    var div = document.createElement('div');
    div.className = 'gf-sw-slide' + (validSlides.length === 0 ? ' gf-active' : '');
    var img = document.createElement('img');
    img.src = '/wiki/Special:FilePath/' + encodeURIComponent(fname);
    img.alt = labels[i] || fname;
    img.style.width = '100%';
    div.appendChild(img);
    slides.appendChild(div);
    validSlides.push({el: div, label: labels[i] || ('立绘' + (i+1))});
  });
  // 只有多张时才渲染标签栏
  if(validSlides.length <= 1) return;


  var tabBar = document.createElement('div');
    var r = 0;
  tabBar.className = 'gf-sw-tabs';
    var c = setInterval(function() {
  validSlides.forEach(function(item, i){
        r++;
    var btn = document.createElement('button');
        if (window.mw && mw.Api && mw.loader && mw.loader.using) {
    btn.className = 'gf-sw-tab' + (i === 0 ? ' gf-active' : '');
            clearInterval(c);
    btn.textContent = item.label;
            mw.loader.using(['mediawiki.api']).then(initSwitcher);
    btn.addEventListener('click', function(){
         } else if (r > 60) { clearInterval(c); if (window.jQuery) initSwitcher(); }
      validSlides.forEach(function(s, j){
    }, 100);
        s.el.classList.toggle('gf-active', j === i);
      });
      tabBar.querySelectorAll('.gf-sw-tab').forEach(function(b, j){
         b.classList.toggle('gf-active', j === i);
      });
    });
    tabBar.appendChild(btn);
  });
  wrap.appendChild(tabBar);
})();
})();
</script>
</script>

2026年5月16日 (六) 00:30的最新版本

<script> (function () {

   function initSwitcher() {
       var api = (window.mw && mw.Api) ? new mw.Api() : null;
       document.querySelectorAll('.gf-infobox-new').forEach(function (box) {
           if (box.dataset.ready) return;
           box.dataset.ready = '1';
           var container = box.querySelector('.gf-image-container');
           var btns = box.querySelectorAll('.gf-switch-btn');
           var overlay = box.querySelector('.gf-switcher-overlay');
           var toggle = box.querySelector('.gf-switcher-toggle');
           var viewBtn = box.querySelector('.gf-view-original');
           if (toggle) toggle.onclick = function() { overlay.classList.toggle('collapsed'); };
           function getImgPath(filename, currentSrc, callback) {
               if (api) {
                   api.get({ action: 'query', prop: 'imageinfo', titles: 'File:' + filename, iiprop: 'url' })
                   .done(function (data) {
                       var pages = data.query.pages;
                       for (var id in pages) { if (pages[id].imageinfo) { callback(pages[id].imageinfo[0].url); return; } }
                       tryFallback();
                   }).fail(tryFallback);
               } else tryFallback();
               function tryFallback() {
                   if (!currentSrc) { callback(null); return; }
                   var curName = currentSrc.substring(currentSrc.lastIndexOf('/') + 1);
                   callback(currentSrc.replace(curName, filename.replace(/ /g, '_')));
               }
           }
           if (viewBtn) {
               viewBtn.onclick = function(e) {
                   e.stopPropagation();
                   var activeBtn = box.querySelector('.gf-switch-btn.active');
                   if (activeBtn) {
                       var filename = activeBtn.dataset.filename;
                       var isDmg = activeBtn.dataset.state === 'damage';
                       var target = isDmg ? filename.substring(0, filename.lastIndexOf('.')) + '_D' + filename.substring(filename.lastIndexOf('.')) : filename;
                       window.open(mw.config.get('wgArticlePath').replace('$1', 'File:' + target), '_blank');
                   }
               };
           }
           container.onclick = function() {
               var img = container.querySelector('img');
               var activeBtn = box.querySelector('.gf-switch-btn.active');
               if (!img || !activeBtn) return;
               var base = activeBtn.dataset.filename;
               var isDmg = activeBtn.dataset.state === 'damage';
               var target = isDmg ? base : base.substring(0, base.lastIndexOf('.')) + '_D' + base.substring(base.lastIndexOf('.'));
               
               container.classList.add('loading');
               getImgPath(target, img.src, function(url) {
                   if (url) {
                       var t = new Image();
                       t.onload = function() { 
                           img.src = url; 
                           activeBtn.dataset.state = isDmg ? 'normal' : 'damage'; 
                           container.classList.remove('loading'); 
                       };
                       t.onerror = function() { container.classList.remove('loading'); };
                       t.src = url;
                   } else container.classList.remove('loading');
               });
           };
           btns.forEach(function (btn) {
               btn.onclick = function (e) {
                   e.stopPropagation();
                   if (btn.classList.contains('active')) return;
                   var filename = btn.dataset.filename;
                   btn.dataset.state = 'normal';
                   var oldImg = container.querySelector('img');
                   if (oldImg) oldImg.style.opacity = '0';
                   getImgPath(filename, (oldImg ? oldImg.src : null), function(url) {
                       if (url) {
                           setTimeout(function () {

container.innerHTML = '

<img src="' + url + '" style="opacity:0;">

';

                               container.appendChild(viewBtn);
                               var n = container.querySelector('img');
                               n.onload = function () { n.style.opacity = '1'; };
                               if (n.complete) n.style.opacity = '1';
                           }, 150);
                       }
                   });
                   btns.forEach(function (b) { b.classList.remove('active'); });
                   btn.classList.add('active');
               };
           });
       });
   }
   var r = 0;
   var c = setInterval(function() {
       r++;
       if (window.mw && mw.Api && mw.loader && mw.loader.using) {
           clearInterval(c);
           mw.loader.using(['mediawiki.api']).then(initSwitcher);
       } else if (r > 60) { clearInterval(c); if (window.jQuery) initSwitcher(); }
   }, 100);

})(); </script>