Widget:Autorenbox: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
KKeine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
KKeine Bearbeitungszusammenfassung
 
(26 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
<includeonly>
<noinclude>Die Autorenbox verwendet Javascript auf der Seite über die MW-API um eine List der Autoren anzuzeigen.
<div class="uk-panel uk-panel-box uk-panel-box-primary zum-hintergrund-links zum-farbe-xx-heller uk-hidden">
<strong>Autoren</strong>
<small class="uk-align-right" data-zum-hook="last-modified">aktualisiert am: </small>
<div class="uk-flex uk-flex-wrap uk-width-1-1" data-zum-hook="userlist">


</div>
Die Autorenbox kann parameterisiert werden um Autoren des Artikels oder einer Kategorie anzuzeigen und ob Unterseiten berücksichtigt werden sollen.
</div>
<script type="text/javascript">
(function(){
const paramArtikel = "<!--{$artikel|escape:'javascript'}-->"||null;
const paramKategorie = "<!--{$kategorie|escape:'javascript'}-->"||null;


const element = document.currentScript && document.currentScript.previousElementSibling;
;artikel
if(element){
: Zeige Autoren des Artikels.
window.RLQ.push(function(){
;kategorie
  mw.loader.enqueue(['mediawiki.api'], function(){
: Zeige Autoren von Artikeln dieser Kategorie.
    const getCurrentTitle = () => mw.Title.makeTitle(
;mit_unterseiten
                                    mw.config.get('wgNamespaceNumber'),
: Wenn es auf 'ja' gesetzt ist werden auch Autoren von Unterseiten mit angezeigt.
                                    mw.config.get('wgTitle')
                                  ).getPrefixedText()
                            ;
    const userlistEl = $(element).find('[data-zum-hook="userlist"]');
    const lastModifiedEl = $(element).find('[data-zum-hook="last-modified"]');
    const api = new mw.Api();
    const query = paramKategorie ? {
      action:'query',
      indexpageids: 1,
      prop:['revisions', 'contributors', 'info'],
      generator: 'categorymembers',
      gcmtitle: `Kategorie:${paramKategorie}`,
      gcmnamespace:0,
      gcmtype: 'page',
      gcmlimit: 500,
      rvlimit:1000
    } : {
      action:'query',
      indexpageids: 1,
      prop:['revisions', 'contributors', 'info'],
      titles: paramArtikel || getCurrentTitle(),
      rvlimit:1000
    };




    const response = api.get(query);
Aktuell ist die Autorenbox deaktiviert. Da sie im Moment nicht korrekt angezeigt wird und das Seitenlayout zerstört aber auf vielen Seiten eingebunden ist.
    response.then((data) => {
    //TODO continuation handling


      if (data.query.pageids[0] === "-1") {
</noinclude><includeonly>
        return;
<div class="autorenbox zum-hintergrund-links zum-farbe-xx-heller hidden">
      }
<h2>Autor*innen</h2>
<small class="autorenbox-updated" data-zum-hook="last-modified">aktualisiert am: </small>
<div class="autorenbox-autoren" data-zum-hook="userlist">


      const userCounts = data.query.pageids.reduce((acc, pageid) => {
</div>
        const pageData = data
</div>
              .query
<script type="text/javascript">
              .pages[pageid];
(function () {
 
    const paramArtikel = "<!--{$artikel|escape:'javascript'}-->" || null;
        acc.lastmodified = Math.max(acc.lastmodified, Date.parse(pageData.touched));
    const paramKategorie = "<!--{$kategorie|escape:'javascript'}-->" || null;
    const paramMitUnterseiten = "<!--{$mit_unterseiten|escape:'javascript'}-->" === "ja";
        acc = pageData
    const element = document.currentScript && document.currentScript.previousElementSibling;
          .contributors
    if (element) {
          .reduce((acc, c)=> {acc.userChanges[c.name] = acc.userChanges[c.name]||{count:0, last:0, id:c.id}; return acc;}, acc);
        window.RLQ.push(function () {
        acc = pageData.revisions.reduce((acc, r) => {
            mw.loader.enqueue(['mediawiki.api'], function () {
          acc.userChanges[r.user] = acc.userChanges[r.user] || {count:0, last:0};
                const getCurrentTitle = () => mw.Title.makeTitle(
          acc.userChanges[r.user].count += r.minor === '' ? 0.1 : 1;
                    mw.config.get('wgNamespaceNumber'),
          acc.userChanges[r.user].last = Math.max(acc.userChanges[r.user].last, r.revid);
                    mw.config.get('wgTitle')
          return acc;
                    ).getPrefixedText()
        }, acc);
                ;
        return acc;
                const userlistEl = $(element).find('[data-zum-hook="userlist"]');
      }, {lastmodified: -1, userChanges:{}});
                const lastModifiedEl = $(element).find('[data-zum-hook="last-modified"]');
      const usernames = Object.keys(userCounts.userChanges).sort((a,b) => {
                const api = new mw.Api();
        let diff = userCounts.userChanges[b].count - userCounts.userChanges[a].count;
                const queries = [];
        if(diff !== 0){
                if (paramKategorie) {
          return diff;
                  queries.push({
        }
                    action: 'query',
        return userCounts.userChanges[b].last - userCounts.userChanges[a].last;
                    prop: ['contributors', 'info'],
      })
                    generator: 'categorymembers',
 
                    gcmtitle: `Kategorie:${paramKategorie}`,
      $(lastModifiedEl).append(new Date(userCounts.lastmodified).toLocaleDateString());
                    gcmnamespace: 0,
      const userdatas = usernames.map((user) => api
                    gcmtype: 'page',
                          .parse(`{{#avatar:${user}|l}}`)
                    gcmlimit: 'max'
                          .then((imgTag) => $(imgTag))
                  });
                          .then((img$) => img$.find('img').andSelf().filter('img').attr('src'))
                } else {
                          .then((imgSrc) => {return {user, imgSrc};})
                  queries.push({
                          .fail((ignored)=> null)
                    action: 'query',
                    prop: ['revisions', 'info', 'contributors'],
                    titles: paramArtikel || getCurrentTitle(),
                    rvlimit: 150,
                    rvprop: ['userid', 'user', 'flags', 'timestamp'],
                  });
                }
                if (paramMitUnterseiten){
                  queries.push({
                    action: 'query',
                    prop: ['contributors', 'info'],
                    generator: 'allpages',
                    gapprefix: (paramArtikel || getCurrentTitle()) + '/',
                    gaplimit:'max'
                  });
                }
                const response = $.Deferred();
                function continueQueryOrResolve(result, query, pages, lastContinue) {
                  api.get({...query, ...lastContinue})
                    .then((response) => {
                      const newPages = Object.values(response.query.pages).reduce((pages, page) => {
                        pages[page.pageid] = {...pages[page.pageid], ...page};
                        return pages;
                      }, pages);
                      if (response.continue !== undefined) {
                        continueQueryOrResolve(result, query, newPages, response.continue);
                      } else if (response.batchcomplete !== undefined) {
                        result.resolve(Object.values(newPages));
                      }
                    });
                }
                const def = $.Deferred();
                def.resolve([]);
                queries.reduce((result, query) => {
                  const newResult = $.Deferred();
                  continueQueryOrResolve(newResult, query, {}, null);
                  return newResult.then((b) => {
                    return result.then((a) => ([...a, ...b]));
                  });
                }, def.promise())
                .then((data) => { response.resolve(data);});
               
                response
                    .then((pages) => {
                        const userCounts = pages.reduce((acc, pageData) => {
                            acc.touched = Math.max(acc.touched || -1, Date.parse(pageData.touched));
                            acc.userChanges = (pageData.contributors || [])
                                .reduce((userChanges, c) => {
                                    userChanges[c.userid] = userChanges[c.userid] || {
                                        count: 0,
                                        last: -1,
                                        userid: c.userid,
                                        username: c.name
                                    };
                                    userChanges[c.userid].count += 1;
                                    return userChanges;
                                }, acc.userChanges || {});
                            acc.userChanges = (pageData.revisions || [])
                                .reduce((userChanges, r) => {
                                    userChanges[r.userid] = userChanges[r.userid] || {
                                        count: 0,
                                        last: -1,
                                        userid: r.userid,
                                        username: r.user
                                    };
                                    userChanges[r.userid].count += r.minor !== undefined ? 0.1 : 1;
                                    userChanges[r.userid].last = Math.max(userChanges[r.userid].last, r.revid);
                                    return userChanges;
                                }, acc.userChanges || {});
                            return acc;
                        }, {});
                        const usernames = Object.values(userCounts.userChanges)
                          .filter((userChange) => userChange.username !== 'Christian')
                          .sort((a, b) => {
                            let diff = b.count - a.count;
                            if (diff !== 0) {
                                return diff;
                            }
                            return b.last - a.last;
                        }).map((user) => user.username);
                        $(lastModifiedEl).append(new Date(userCounts.touched).toLocaleDateString());
                        const userdatas = usernames.map((user) => api
                            .parse(`{{#avatar:${user}|l}}`)
                            .then((imgTag) => $(imgTag))
                            .then((img$) => img$.find('img').addBack('img').attr('src'))
                            .then((imgSrc) => ({user, imgSrc}))
                            .fail((ignored) => null)
                         );
                         );
      $.when(...userdatas)
                        $.when(...userdatas)
        .then((...userdatas) => userdatas.filter((ud) => ud !== null))
                            .then((...userdatas) => userdatas.filter((ud) => ud !== null))
        .then((userdatas) => {
                            .then((userdatas) => {
          userdatas.forEach(({user, imgSrc}) => {
                                userdatas.map(({user, imgSrc}) => {
            $('<img>')
                                    const userTitle = mw.Title.makeTitle(mw.config.get('wgNamespaceIds')['benutzer'], user);
              .attr('src', imgSrc)
                                    if(userTitle === null){
              .wrap('<a>')
                                      return null;
              .parent()
                                    }
              .attr('href', mw.Title.makeTitle(mw.config.get('wgNamespaceIds')['benutzer'], user).getUrl())
                                    return $('<img>')
              .wrap('<div class="uk-border-circle uk-text-center" style="overflow:hidden;width:60%;margin:auto;">')
                                        .attr('src', imgSrc)
              .parent()
                                        .wrap('<a>')
              .wrap('<div class="uk-panel uk-panel-border uk-text-small" style="max-width:12ch">')
                                        .parent()
 
                                        .attr('href', userTitle.getUrl())
              .parent()
                                        .wrap('<div class="autorenbox-avatar" style="overflow:hidden;width:60%;margin:auto;">')
.append($('<a>').append(user).attr('href', mw.Title.makeTitle(mw.config.get('wgNamespaceIds')['benutzer'], user).getUrl()).wrap('<div class="uk-text-center uk-text-truncate">').parent())             .appendTo($(userlistEl));
                                        .parent()
          });
                                        .wrap('<div class="autorenbox-container" style="max-width:12ch">')
        })
                                        .parent()
        .then((ignored) => $(element).removeClass('uk-hidden'));
                                        .append(
    });//end response.then
                                          $('<a>')
  });//end loader.enqueue
                                            .append(user)
});//end RLQ.push
                                            .attr('href', userTitle.getUrl())
}//end if
                                            .wrap('<div class="autorenbox-name">')
                                            .parent()
                                        );
                                })
                                .filter((elem) => elem !== null)
                                .forEach((elem) => elem.appendTo($(userlistEl)));
                            })
                            .then((ignored) => $(element).removeClass('hidden'));
                    });//end response.then
            });//end loader.enqueue
        });//end RLQ.push
    }//end if
})();
})();
</script>
</script>
</includeonly>
</includeonly>

Aktuelle Version vom 13. Februar 2024, 15:59 Uhr

Die Autorenbox verwendet Javascript auf der Seite über die MW-API um eine List der Autoren anzuzeigen.

Die Autorenbox kann parameterisiert werden um Autoren des Artikels oder einer Kategorie anzuzeigen und ob Unterseiten berücksichtigt werden sollen.

artikel
Zeige Autoren des Artikels.
kategorie
Zeige Autoren von Artikeln dieser Kategorie.
mit_unterseiten
Wenn es auf 'ja' gesetzt ist werden auch Autoren von Unterseiten mit angezeigt.


Aktuell ist die Autorenbox deaktiviert. Da sie im Moment nicht korrekt angezeigt wird und das Seitenlayout zerstört aber auf vielen Seiten eingebunden ist.