Benutzer:Siedler6/Common.js
Aus SchnuppTrupp
< Benutzer:Siedler6
Version vom 3. April 2018, 00:41 Uhr von Siedler6 (Diskussion | Beiträge) (Test Hervorhebbare Tabelle)
Hinweis: Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
- Opera: Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen
/** <pre> * highlightTable.js * * Description: * Adds row highlighting to tables * * Version 1.0: Row highlighting - Quarenon * Version 1.1: Update from pengLocations.js v1.0 - Quarenon * Version 2.0: pengLocations v2.1, Granular cookie - Saftzie * Version 2.1: Made compatible with jquery.tablesorter - Cqm */ ;(function ($, mw) { 'use strict'; function highlightTable() { // requires CSS classes named in lightOnClass and mouseOverClass var wgPageName = mw.config.get('wgPageName'), cookiePrefix = 'lightTable', tableClass = 'lighttable', lightOnClass = 'highlight-on', mouseOverClass = 'highlight-over', base64url = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', pageSeparator = '!', tableSeparator = '.', hashPageName, rows = [], columns, tables, cookie; // hash a string into a 32-bit hex string, msb first function crc32c(s) { var polynomial = 0x04C11DB7, // Castagnoli polynomial retVal, table = [], i, j, k; // guarantee 8-bit chars s = window.unescape(window.encodeURI(s)); // calculate the crc for all 8-bit data // bit-wise operations discard anything left of bit 31 for (i = 0; i < 256; i += 1) { k = (i << 24); for (j = 0; j < 8; j += 1) { k = (k << 1) ^ ((k >>> 31) * polynomial); } table[i] = k; } // the actual calculation retVal = 0; for (i = 0; i < s.length; i += 1) { retVal = (retVal << 8) ^ table[(retVal >>> 24) ^ s.charCodeAt(i)]; } // make negative numbers unsigned if (retVal < 0) { retVal += 4294967296; } // 32-bit hex string, padded on the left retVal = '0000000' + retVal.toString(16).toUpperCase(); retVal = retVal.substr(retVal.length - 8); return retVal; } // change the row bg color based on mouse events function setHighlight(el, val) { $(el).removeClass(mouseOverClass).removeClass(lightOnClass); switch (val) { case 1: // light on $(el).addClass(lightOnClass); break; case 2: // mouse-over $(el).addClass(mouseOverClass); break; default: // same as case 0, light off } } // load the cookie and parse it for the page // cookie info is saved in 1 of 16 browser cookies, based on page name hash // global cookie[][] supports multiple tables and multiple pages // uses global hashPageName function loadCookie(numTables) { var cookieName = cookiePrefix + '-' + hashPageName.charAt(0), pageCookies, tableCookies, iPage, iTable, i, j, k; cookie = []; if ($.cookie(cookieName) !== null) { pageCookies = $.cookie(cookieName).split(pageSeparator); for (iPage = 0; iPage < pageCookies.length; iPage += 1) { if (hashPageName === pageCookies[iPage].substr(0, 8)) { tableCookies = pageCookies[iPage].substr(8).split(tableSeparator); // trim the cookie array of arrays, if needed while (tableCookies.length > numTables) { tableCookies.pop(); } // extract the row info per table // use Base64url to compress 6 rows to 1 character for (iTable = 0; iTable < tableCookies.length; iTable += 1) { cookie[iTable] = []; for (i = 0; i < tableCookies[iTable].length; i += 1) { k = base64url.indexOf(tableCookies[iTable].charAt(i)); if (k < 0) { // input validation k = 0; } for (j = 5; j >= 0; j -= 1) { cookie[iTable][6 * i + j] = (k & 0x1); k >>= 1; } } } } } } // initialize the cookie array of arrays, if needed while (cookie.length < numTables) { cookie.push([]); } } // save/update the cookie for page reloads // cookie info is saved in 1 of 16 browser cookies, based on page name hash // global cookie[][] supports multiple tables and multiple pages // uses global hashPageName function saveCookie() { var cookieName = cookiePrefix + '-' + hashPageName.charAt(0), pageCookies, tableCookies, iPage, iTable, i, j, k, updated; // create the cookie for the tables on the current page // use Base64url to compress 6 rows to 1 character tableCookies = hashPageName; for (iTable = 0; iTable < cookie.length; iTable += 1) { if (iTable > 0) { tableCookies += tableSeparator; } for (i = 0; i < Math.ceil(cookie[iTable].length / 6); i += 1) { k = cookie[iTable][6 * i]; for (j = 1; j < 6; j += 1) { k = 2 * k + ((6 * i + j < cookie[iTable].length) ? cookie[iTable][6 * i + j] : 0); } tableCookies += base64url.charAt(k); } } updated = 0; pageCookies = []; if ($.cookie(cookieName) !== null) { // get all the page cookies // another page might have updated them since this page pageCookies = $.cookie(cookieName).split(pageSeparator); // update the page cookie if it already exists for (iPage = 0; iPage < pageCookies.length; iPage += 1) { if (hashPageName === pageCookies[iPage].substr(0, 8)) { updated = 1; pageCookies[iPage] = tableCookies; } } } // add the page cookie if it doesn't exist yet if (updated === 0) { pageCookies.push(tableCookies); } // set path to / so it works for /wiki/, /index.php, etc $.cookie(cookieName, pageCookies.join(pageSeparator), { expires: 7, path: '/' }); } tables = $('table.' + tableClass); // don't bother doing anything unless there's really something to do if (tables.length > 0) { // hash the page name to an 8-char hex string hashPageName = crc32c(wgPageName); loadCookie(tables.length); tables.each(function (iTable) { rows[iTable] = $(this).find('tr:has(td)'); // data rows // init or trim the cookie array of rows, if needed while (cookie[iTable].length < rows[iTable].length) { cookie[iTable].push(0); } while (cookie[iTable].length > rows[iTable].length) { cookie[iTable].pop(); } // don't rely on headers to find # of columns // count them dynamically columns = 1; rows[iTable].each(function (iRow) { // update column count as we go // a smarter approach would count colspans, but this is good for now columns = Math.max(columns, $(this).children('th,td').length); // initialize highlighting based on the cookie setHighlight(this, cookie[iTable][iRow]); // set mouse events $(this).mouseover(function () { setHighlight(this, 2); }).mouseout(function () { setHighlight(this, cookie[iTable][iRow]); }).click(function (e) { // don't toggle highlight when clicking links if ((e.target.tagName !== 'A') && (e.target.tagName !== 'IMG')) { cookie[iTable][iRow] = 1 - cookie[iTable][iRow]; setHighlight(this, cookie[iTable][iRow]); saveCookie(); } }); }); // add a button for reset $(this).append( $('<tfoot/>') .append( $('<tr/>') .append( $('<th/>') .attr('colspan', columns) .append( $('<input>') .attr({ 'type': 'button', 'value': 'Reset' }) .click(function () { rows[iTable].each(function (iRow) { cookie[iTable][iRow] = 0; setHighlight(this, 0); }); saveCookie(); }) ) ) ) ); }); } } $(highlightTable); }(this.jQuery, this.mediaWiki)); /* </pre> */