Widget:Autorenbox: Unterschied zwischen den Versionen

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

Version vom 14. November 2021, 19:40 Uhr