Widget:Autorenbox: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
KKeine Bearbeitungszusammenfassung
K (Effektiv asugeschaltet durch ersetzen des includeonly blocks mit einem zweiten noinclude block)
Zeile 13: Zeile 13:
Aktuell ist die Autorenbox deaktiviert. Da sie im Moment nicht korrekt angezeigt wird und das Seitenlayout zerstört aber auf vielen Seiten eingebunden ist.
Aktuell ist die Autorenbox deaktiviert. Da sie im Moment nicht korrekt angezeigt wird und das Seitenlayout zerstört aber auf vielen Seiten eingebunden ist.


</noinclude><includeonly><!--
</noinclude><noinclude><code><pre><nowiki>
<div class="autorenbox zum-hintergrund-links zum-farbe-xx-heller uk-hidden">
<div class="autorenbox zum-hintergrund-links zum-farbe-xx-heller uk-hidden">
<h2>Autor*innen</h2>
<h2>Autor*innen</h2>
Zeile 174: Zeile 174:
})();
})();
</script>
</script>
--></includeonly>
</nowiki>
</pre>
</code>
</noinclude>

Version vom 10. Februar 2024, 09: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.

<div class="autorenbox zum-hintergrund-links zum-farbe-xx-heller uk-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">

</div>
</div>
<script type="text/javascript">
(function () {
    const paramArtikel = "<!--{$artikel|escape:'javascript'}-->" || null;
    const paramKategorie = "<!--{$kategorie|escape:'javascript'}-->" || null;
    const paramMitUnterseiten = "<!--{$mit_unterseiten|escape:'javascript'}-->" === "ja";
    const element = document.currentScript && document.currentScript.previousElementSibling;
    if (element) {
        window.RLQ.push(function () {
            mw.loader.enqueue(['mediawiki.api'], function () {
                const getCurrentTitle = () => mw.Title.makeTitle(
                    mw.config.get('wgNamespaceNumber'),
                    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 queries = [];
                if (paramKategorie) {
                  queries.push({
                    action: 'query',
                    prop: ['contributors', 'info'],
                    generator: 'categorymembers',
                    gcmtitle: `Kategorie:${paramKategorie}`,
                    gcmnamespace: 0,
                    gcmtype: 'page',
                    gcmlimit: 'max'
                  });
                } else {
                  queries.push({
                    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)
                            .then((...userdatas) => userdatas.filter((ud) => ud !== null))
                            .then((userdatas) => {
                                userdatas.map(({user, imgSrc}) => {
                                    const userTitle = mw.Title.makeTitle(mw.config.get('wgNamespaceIds')['benutzer'], user);
                                    if(userTitle === null){
                                       return null;
                                    }
                                    return $('<img>')
                                        .attr('src', imgSrc)
                                        .wrap('<a>')
                                        .parent()
                                        .attr('href', userTitle.getUrl())
                                        .wrap('<div class="autorenbox-avatar" style="overflow:hidden;width:60%;margin:auto;">')
                                        .parent()
                                        .wrap('<div class="autorenbox-container" style="max-width:12ch">')
                                        .parent()
                                        .append(
                                          $('<a>')
                                            .append(user)
                                            .attr('href', userTitle.getUrl())
                                            .wrap('<div class="autorenbox-name">')
                                            .parent()
                                        );
                                })
                                .filter((elem) => elem !== null)
                                .forEach((elem) => elem.appendTo($(userlistEl)));
                            })
                            .then((ignored) => $(element).removeClass('uk-hidden'));
                    });//end response.then
            });//end loader.enqueue
        });//end RLQ.push
    }//end if
})();
</script>