MediaWiki:Common.js: differenze tra le versioni

Da Wikiness.
Vai alla navigazione Vai alla ricerca
Corretto fallback gallery dinamica usando pageimage
Gallery dinamica con URL immagini reali da imageinfo
Riga 12: Riga 12:
   }
   }


   function imageUrlFromPage(page) {
   function normalizeFileName(name) {
     if (page.thumbnail && page.thumbnail.source) {
     return String(name || '')
       return page.thumbnail.source;
       .replace(/^File:/i, '')
    }
       .replace(/ /g, '_');
 
    if (page.pageimage) {
       return '/index.php?title=Special:Redirect/file/' + encodeURIComponent(page.pageimage);
    }
 
    return '';
   }
   }


   function buildGallery(targetId, categoryTitle, emptyText) {
   function getPagesFromCategory(categoryTitle) {
    var target = document.getElementById(targetId);
    if (!target) {
      return;
    }
 
    target.innerHTML = '<div class="wikiness-gallery-loading">Caricamento immagini...</div>';
 
     var apiUrl =
     var apiUrl =
       '/api.php?action=query' +
       '/api.php?action=query' +
Riga 40: Riga 27:
       '&gcmdir=ascending' +
       '&gcmdir=ascending' +
       '&prop=pageimages|info' +
       '&prop=pageimages|info' +
       '&piprop=thumbnail|name' +
       '&piprop=name' +
      '&pithumbsize=140' +
       '&inprop=url' +
       '&inprop=url' +
       '&format=json';
       '&format=json';


     fetch(apiUrl, { credentials: 'same-origin' })
     return fetch(apiUrl, { credentials: 'same-origin' })
       .then(function (response) {
       .then(function (response) {
         return response.json();
         return response.json();
Riga 51: Riga 37:
       .then(function (data) {
       .then(function (data) {
         var pagesObj = data && data.query && data.query.pages ? data.query.pages : {};
         var pagesObj = data && data.query && data.query.pages ? data.query.pages : {};
         var pages = Object.keys(pagesObj).map(function (key) {
         return Object.keys(pagesObj).map(function (key) {
           return pagesObj[key];
           return pagesObj[key];
         });
         });
      });
  }
  function getImageUrls(fileNames) {
    var cleanNames = fileNames
      .filter(Boolean)
      .map(function (name) {
        return 'File:' + normalizeFileName(name);
      });
    if (!cleanNames.length) {
      return Promise.resolve({});
    }


    var apiUrl =
      '/api.php?action=query' +
      '&prop=imageinfo' +
      '&iiprop=url' +
      '&iiurlwidth=140' +
      '&format=json' +
      '&titles=' + encodeURIComponent(cleanNames.join('|'));
    return fetch(apiUrl, { credentials: 'same-origin' })
      .then(function (response) {
        return response.json();
      })
      .then(function (data) {
        var map = {};
        var pagesObj = data && data.query && data.query.pages ? data.query.pages : {};
        Object.keys(pagesObj).forEach(function (key) {
          var filePage = pagesObj[key];
          var info = filePage.imageinfo && filePage.imageinfo[0] ? filePage.imageinfo[0] : null;
          if (!info) {
            return;
          }
          var cleanTitle = normalizeFileName(filePage.title);
          map[cleanTitle] = info.thumburl || info.url || '';
        });
        return map;
      });
  }
  function buildGallery(targetId, categoryTitle, emptyText) {
    var target = document.getElementById(targetId);
    if (!target) {
      return;
    }
    target.innerHTML = '<div class="wikiness-gallery-loading">Caricamento immagini...</div>';
    getPagesFromCategory(categoryTitle)
      .then(function (pages) {
         pages.sort(function (a, b) {
         pages.sort(function (a, b) {
           return String(a.title || '').localeCompare(String(b.title || ''), 'it');
           return String(a.title || '').localeCompare(String(b.title || ''), 'it');
         });
         });


         var withImages = pages.filter(function (page) {
         var pagesWithPageImage = pages.filter(function (page) {
           return imageUrlFromPage(page) && page.fullurl;
           return page.pageimage && page.fullurl;
         }).slice(0, 10);
         }).slice(0, 10);


         if (!withImages.length) {
        return getImageUrls(pagesWithPageImage.map(function (page) {
          return page.pageimage;
        })).then(function (imageMap) {
          return {
            pages: pagesWithPageImage,
            imageMap: imageMap
          };
        });
      })
      .then(function (result) {
        var pages = result.pages;
        var imageMap = result.imageMap;
 
        var finalPages = pages.filter(function (page) {
          return imageMap[normalizeFileName(page.pageimage)];
        });
 
         if (!finalPages.length) {
           target.innerHTML = '<div class="wikiness-gallery-empty">' + emptyText + '</div>';
           target.innerHTML = '<div class="wikiness-gallery-empty">' + emptyText + '</div>';
           return;
           return;
Riga 70: Riga 129:
         var html = '<div class="wikiness-dynamic-gallery-grid">';
         var html = '<div class="wikiness-dynamic-gallery-grid">';


         withImages.forEach(function (page) {
         finalPages.forEach(function (page) {
           var title = page.title || '';
           var title = page.title || '';
           var img = imageUrlFromPage(page);
           var img = imageMap[normalizeFileName(page.pageimage)];
           var url = page.fullurl;
           var url = page.fullurl;



Versione delle 11:52, 1 giu 2026




/* WIKINESS_DYNAMIC_GALLERY_START */
(function () {
  function escapeHtml(text) {
    return String(text || '')
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;');
  }

  function normalizeFileName(name) {
    return String(name || '')
      .replace(/^File:/i, '')
      .replace(/ /g, '_');
  }

  function getPagesFromCategory(categoryTitle) {
    var apiUrl =
      '/api.php?action=query' +
      '&generator=categorymembers' +
      '&gcmtitle=' + encodeURIComponent(categoryTitle) +
      '&gcmlimit=50' +
      '&gcmsort=sortkey' +
      '&gcmdir=ascending' +
      '&prop=pageimages|info' +
      '&piprop=name' +
      '&inprop=url' +
      '&format=json';

    return fetch(apiUrl, { credentials: 'same-origin' })
      .then(function (response) {
        return response.json();
      })
      .then(function (data) {
        var pagesObj = data && data.query && data.query.pages ? data.query.pages : {};
        return Object.keys(pagesObj).map(function (key) {
          return pagesObj[key];
        });
      });
  }

  function getImageUrls(fileNames) {
    var cleanNames = fileNames
      .filter(Boolean)
      .map(function (name) {
        return 'File:' + normalizeFileName(name);
      });

    if (!cleanNames.length) {
      return Promise.resolve({});
    }

    var apiUrl =
      '/api.php?action=query' +
      '&prop=imageinfo' +
      '&iiprop=url' +
      '&iiurlwidth=140' +
      '&format=json' +
      '&titles=' + encodeURIComponent(cleanNames.join('|'));

    return fetch(apiUrl, { credentials: 'same-origin' })
      .then(function (response) {
        return response.json();
      })
      .then(function (data) {
        var map = {};
        var pagesObj = data && data.query && data.query.pages ? data.query.pages : {};

        Object.keys(pagesObj).forEach(function (key) {
          var filePage = pagesObj[key];
          var info = filePage.imageinfo && filePage.imageinfo[0] ? filePage.imageinfo[0] : null;

          if (!info) {
            return;
          }

          var cleanTitle = normalizeFileName(filePage.title);
          map[cleanTitle] = info.thumburl || info.url || '';
        });

        return map;
      });
  }

  function buildGallery(targetId, categoryTitle, emptyText) {
    var target = document.getElementById(targetId);

    if (!target) {
      return;
    }

    target.innerHTML = '<div class="wikiness-gallery-loading">Caricamento immagini...</div>';

    getPagesFromCategory(categoryTitle)
      .then(function (pages) {
        pages.sort(function (a, b) {
          return String(a.title || '').localeCompare(String(b.title || ''), 'it');
        });

        var pagesWithPageImage = pages.filter(function (page) {
          return page.pageimage && page.fullurl;
        }).slice(0, 10);

        return getImageUrls(pagesWithPageImage.map(function (page) {
          return page.pageimage;
        })).then(function (imageMap) {
          return {
            pages: pagesWithPageImage,
            imageMap: imageMap
          };
        });
      })
      .then(function (result) {
        var pages = result.pages;
        var imageMap = result.imageMap;

        var finalPages = pages.filter(function (page) {
          return imageMap[normalizeFileName(page.pageimage)];
        });

        if (!finalPages.length) {
          target.innerHTML = '<div class="wikiness-gallery-empty">' + emptyText + '</div>';
          return;
        }

        var html = '<div class="wikiness-dynamic-gallery-grid">';

        finalPages.forEach(function (page) {
          var title = page.title || '';
          var img = imageMap[normalizeFileName(page.pageimage)];
          var url = page.fullurl;

          html += ''
            + '<a class="wikiness-dynamic-gallery-card" href="' + escapeHtml(url) + '">'
            + '<span class="wikiness-dynamic-gallery-thumb">'
            + '<img src="' + escapeHtml(img) + '" alt="' + escapeHtml(title) + '" loading="lazy">'
            + '</span>'
            + '<span class="wikiness-dynamic-gallery-title">' + escapeHtml(title) + '</span>'
            + '</a>';
        });

        html += '</div>';
        target.innerHTML = html;
      })
      .catch(function () {
        target.innerHTML = '<div class="wikiness-gallery-empty">' + emptyText + '</div>';
      });
  }

  document.addEventListener('DOMContentLoaded', function () {
    buildGallery(
      'wikiness-gallery-professionisti',
      'Categoria:- Pagine con immagini',
      'Nessuna immagine disponibile.'
    );

    buildGallery(
      'wikiness-gallery-loghi',
      'Categoria:- Pagine con loghi',
      'Nessun logo disponibile.'
    );
  });
}());
/* WIKINESS_DYNAMIC_GALLERY_END */