<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.endmyopia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-PrettyLog.js</id>
	<title>MediaWiki:Gadget-PrettyLog.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.endmyopia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-PrettyLog.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-PrettyLog.js&amp;action=history"/>
	<updated>2026-07-15T15:37:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-PrettyLog.js&amp;diff=13688&amp;oldid=prev</id>
		<title>NottNott: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-PrettyLog.js&amp;diff=13688&amp;oldid=prev"/>
		<updated>2020-06-20T16:19:21Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:19, 20 June 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key jakeendmy_mw1720-mwnr_:diff:1.41:old-13687:rev-13688 --&gt;
&lt;/table&gt;</summary>
		<author><name>NottNott</name></author>
	</entry>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-PrettyLog.js&amp;diff=13687&amp;oldid=prev</id>
		<title>en&gt;TheDJ: fix thumb selector</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-PrettyLog.js&amp;diff=13687&amp;oldid=prev"/>
		<updated>2014-01-05T13:20:05Z</updated>

		<summary type="html">&lt;p&gt;fix thumb selector&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*&lt;br /&gt;
   PrettyLog - reformat log pages. If the log contains file uploads, add small thumbnails of the&lt;br /&gt;
   files. If the GalleryDetails gadget is also activated, make sure that it adds its sidebar link.&lt;br /&gt;
&lt;br /&gt;
   Authors: [[User:Lupo]], January 2009; [[User:Ilmari Karonen]], April 2010&lt;br /&gt;
   License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)&lt;br /&gt;
*/&lt;br /&gt;
/*global mediaWiki, jQuery, GalleryDetailsLoader, stylepath*/&lt;br /&gt;
/*jshint laxbreak:true, curly:false*/&lt;br /&gt;
if (mediaWiki.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;quot;Log&amp;quot;) &lt;br /&gt;
jQuery(document).ready(function () {&lt;br /&gt;
&amp;#039;use strict&amp;#039;;&lt;br /&gt;
    var mw = mediaWiki;&lt;br /&gt;
    var $ = jQuery;&lt;br /&gt;
    var wgServer = mw.config.get(&amp;#039;wgServer&amp;#039;);&lt;br /&gt;
	&lt;br /&gt;
    var maxThumbWidth = 70;&lt;br /&gt;
    var maxThumbHeight = 70;&lt;br /&gt;
&lt;br /&gt;
    var apiBatchSize = 50;&lt;br /&gt;
&lt;br /&gt;
    var content = mw.util.$content[0];&lt;br /&gt;
    if (!content) return;&lt;br /&gt;
&lt;br /&gt;
    var list = content.getElementsByTagName(&amp;quot;ul&amp;quot;)[0];&lt;br /&gt;
    if (!list) return;&lt;br /&gt;
    list.className = &amp;#039;mw-search-results&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    // That&amp;#039;s all that&amp;#039;s needed for the pretty layout!  All code below is for the image thumbnails.&lt;br /&gt;
&lt;br /&gt;
    // Get list of upload log entries, abort early if there are none.&lt;br /&gt;
    var uploads = $(list).children(&amp;#039;li.mw-logline-upload&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    if (!uploads || uploads.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
    // Find image links within each upload entry.  For simplicity, we assume that all links are in&lt;br /&gt;
    // canonical prefixed text form, and that all file links thus begin with ns6prefix.  Otherwise&lt;br /&gt;
    // we&amp;#039;d have to extract and normalize the namespace prefix and look for it in wgNamespaceIds.&lt;br /&gt;
    var ns6prefix = mw.config.get(&amp;#039;wgFormattedNamespaces&amp;#039;)[6] + &amp;quot;:&amp;quot;;&lt;br /&gt;
    var imageLocations = {};&lt;br /&gt;
	var links, title;&lt;br /&gt;
    for (var i = 0; i &amp;lt; uploads.length; i++) {&lt;br /&gt;
        links = uploads[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
        for (var j = 0; j &amp;lt; links.length; j++) {&lt;br /&gt;
            title = links[j].title;&lt;br /&gt;
            if (!title || title.substring(0, ns6prefix.length) !== ns6prefix) continue;&lt;br /&gt;
            // Skip any redlinks, links in log summaries and links to uploaders&amp;#039; user/talk/contribs/etc. pages&lt;br /&gt;
            for (var e = links[j]; title &amp;amp;&amp;amp; e &amp;amp;&amp;amp; e !== uploads[i]; e = e.parentNode) {&lt;br /&gt;
                if ( /(^|\s)(new|comment|mw-userlink|mw-usertoollinks|mw-revdelundel-link|searchResultImage)(\s|$)/.test(e.className) ) title = null;&lt;br /&gt;
            }&lt;br /&gt;
            if (title) {&lt;br /&gt;
                if (!imageLocations[title]) imageLocations[title] = [];&lt;br /&gt;
                imageLocations[title].push(uploads[i]);&lt;br /&gt;
            }                 &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    uploads = links = null;  // we don&amp;#039;t need these NodeLists anymore&lt;br /&gt;
&lt;br /&gt;
    // Callback function to show the thumbnails:&lt;br /&gt;
    var prettyLogAddThumbnails = function (result) {&lt;br /&gt;
        var i;&lt;br /&gt;
        if (result.error || !result.query || !result.query.pages)&lt;br /&gt;
            throw new Error(&amp;quot;PrettyLog: unexpected API result:\n&amp;quot; + result.toSource());&lt;br /&gt;
 &lt;br /&gt;
        // hopefully we don&amp;#039;t get any normalization, but just in case...&lt;br /&gt;
        if (result.query.normalized) {&lt;br /&gt;
            var norm = result.query.normalized;&lt;br /&gt;
            for (i = 0; i &amp;lt; norm.length; i++) {&lt;br /&gt;
                imageLocations[norm[i].to] = imageLocations[norm[i].from].concat( imageLocations[norm[i].to] || [] );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // now loop over the result and insert thumbs&lt;br /&gt;
        var pages = result.query.pages;&lt;br /&gt;
        for (var id in pages) {&lt;br /&gt;
        if (pages.hasOwnProperty(id)) {&lt;br /&gt;
            var title = pages[id].title;&lt;br /&gt;
            if (!title) continue;  // should not happen&lt;br /&gt;
&lt;br /&gt;
            if (pages[id].imagerepository &amp;amp;&amp;amp; pages[id].imagerepository === &amp;quot;shared&amp;quot;)&lt;br /&gt;
                continue;  // don&amp;#039;t show thumbnails for remote images (could happen if an image shadowing a Commons image is uploaded locally and deleted)&lt;br /&gt;
 &lt;br /&gt;
            var info = pages[id].imageinfo;&lt;br /&gt;
            if (!info || !info.length) continue;  // can happen if the image has been deleted, or if it wasn&amp;#039;t an image at all&lt;br /&gt;
            info = info[0];&lt;br /&gt;
			&lt;br /&gt;
            if (!info.thumburl) {&lt;br /&gt;
                // KLUGE: for some reason, audio files sometimes get no thumburl; fix it here&lt;br /&gt;
                // TODO(?): there are more file type icons we could match to MIME types if needed&lt;br /&gt;
                if (/^(audio\/|application\/ogg$)/.test(info.mime)) {&lt;br /&gt;
                    info.thumburl = stylepath + &amp;quot;/common/images/icons/fileicon-ogg.png&amp;quot;;&lt;br /&gt;
                } else {&lt;br /&gt;
                    info.thumburl = stylepath + &amp;quot;/common/images/icons/fileicon.png&amp;quot;;  // generic fallback icon&lt;br /&gt;
                }&lt;br /&gt;
                info.thumbwidth = info.thumbheight = 120;  // all icons are currently 120x120&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            if (!info.thumbwidth || !info.thumbheight) continue;  // can&amp;#039;t happen?&lt;br /&gt;
&lt;br /&gt;
            // if the returned thumb is too large for some reason, scale it proportionately so it fits&lt;br /&gt;
            if (info.thumbheight &amp;gt; maxThumbHeight) {&lt;br /&gt;
                info.thumbwidth *= maxThumbHeight / info.thumbheight;&lt;br /&gt;
                info.thumbheight = maxThumbHeight;&lt;br /&gt;
            }&lt;br /&gt;
            if (info.thumbwidth &amp;gt; maxThumbWidth) {&lt;br /&gt;
                info.thumbheight *= maxThumbWidth / info.thumbwidth;&lt;br /&gt;
                info.thumbwidth = maxThumbWidth;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // if the URL is local, strip the hostname prefix (avoids needless external link icons on some browsers)&lt;br /&gt;
            if (info.descriptionurl.indexOf(wgServer + &amp;quot;/&amp;quot;) === 0)&lt;br /&gt;
                info.descriptionurl = info.descriptionurl.substring(wgServer.length);&lt;br /&gt;
&lt;br /&gt;
            var loglines = imageLocations[title];&lt;br /&gt;
            if (!loglines) continue;  // should not happen&lt;br /&gt;
&lt;br /&gt;
            for (i = 0; i &amp;lt; loglines.length; i++) {&lt;br /&gt;
                // safety check: don&amp;#039;t process the same line twice&lt;br /&gt;
                if (/^table$/i.test(loglines[i].firstChild.tagName)) continue;&lt;br /&gt;
&lt;br /&gt;
                // create image and link elements for the thumbnail&lt;br /&gt;
                var img = document.createElement(&amp;quot;img&amp;quot;);&lt;br /&gt;
                img.src = info.thumburl;&lt;br /&gt;
                img.width = Math.round(info.thumbwidth);&lt;br /&gt;
                img.height = Math.round(info.thumbheight);&lt;br /&gt;
&lt;br /&gt;
                var link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
                link.href = info.descriptionurl;&lt;br /&gt;
                link.title = title;&lt;br /&gt;
                link.className = &amp;quot;image&amp;quot;;&lt;br /&gt;
                link.appendChild(img);&lt;br /&gt;
&lt;br /&gt;
                // transform the contents of this logline into a table&lt;br /&gt;
                var tbl = document.createElement(&amp;quot;table&amp;quot;);&lt;br /&gt;
                tbl.className = &amp;quot;searchResultImage&amp;quot;;&lt;br /&gt;
                var tr = tbl.insertRow(-1);&lt;br /&gt;
                tr.setAttribute(&amp;quot;valign&amp;quot;, &amp;quot;top&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                var td = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
                td.width = maxThumbWidth + 10;&lt;br /&gt;
                td.setAttribute(&amp;quot;align&amp;quot;, &amp;quot;center&amp;quot;);&lt;br /&gt;
                td.appendChild(link);&lt;br /&gt;
                tr.appendChild(td);&lt;br /&gt;
&lt;br /&gt;
                td = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
                while (loglines[i].firstChild) td.appendChild(loglines[i].firstChild);&lt;br /&gt;
                tr.appendChild(td);&lt;br /&gt;
&lt;br /&gt;
                loglines[i].appendChild (tbl);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // if [[MediaWiki:Gadget-GalleryDetails.js]] is enabled but inactive, rerun it now that we have some images&lt;br /&gt;
        if (typeof (GalleryDetailsLoader) !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; !document.getElementById(&amp;#039;t-gallerydetails&amp;#039;) &amp;amp;&amp;amp; GalleryDetailsLoader.initialized) {&lt;br /&gt;
            GalleryDetailsLoader.initialize();        &lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Build array of unique image titles and URL-encode them.&lt;br /&gt;
    var images = [];&lt;br /&gt;
    for (title in imageLocations) {&lt;br /&gt;
        if (imageLocations.hasOwnProperty(title) &amp;amp;&amp;amp; typeof title === &amp;#039;string&amp;#039;) images.push( title );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Make the queries in batches, to avoid tripping API and prevent freezing the browser or a 500 server error due to a overlong query.&lt;br /&gt;
	var n, imageslength = images.length;&lt;br /&gt;
    for (n = 0; n &amp;lt; imageslength; n+=50) {&lt;br /&gt;
		$.post(mw.util.wikiScript(&amp;#039;api&amp;#039;)&lt;br /&gt;
		, { format: &amp;#039;json&amp;#039;&lt;br /&gt;
			,action: &amp;#039;query&amp;#039;&lt;br /&gt;
			,maxage: 3600&lt;br /&gt;
			,smaxage: 3600&lt;br /&gt;
			,prop: &amp;#039;imageinfo&amp;#039;&lt;br /&gt;
			,iiprop: &amp;#039;url|mime&amp;#039;&lt;br /&gt;
			,iiurlwidth: maxThumbWidth&lt;br /&gt;
			,iiurlheight: maxThumbHeight&lt;br /&gt;
			,titles: images.slice(n, n+50).join(&amp;#039;|&amp;#039;)&lt;br /&gt;
		} ,prettyLogAddThumbnails);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>en&gt;TheDJ</name></author>
	</entry>
</feed>