<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.walkscape.app/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-TableChecklist.js</id>
	<title>MediaWiki:Gadget-TableChecklist.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.walkscape.app/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-TableChecklist.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-TableChecklist.js&amp;action=history"/>
	<updated>2026-04-13T00:44:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-TableChecklist.js&amp;diff=25306&amp;oldid=prev</id>
		<title>Bonez565 at 02:58, 8 November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-TableChecklist.js&amp;diff=25306&amp;oldid=prev"/>
		<updated>2025-11-08T02:58:20Z</updated>

		<summary type="html">&lt;p&gt;&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 02:58, 8 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l4&quot;&gt;Line 4:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 4:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  * Persists by stable row IDs via localStorage (fallback to mw.storage).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  * Persists by stable row IDs via localStorage (fallback to mw.storage).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  */&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  */&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;mw.loader.using([&amp;#039;jquery&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;]).then(function () {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;mw.loader.using([&amp;#039;jquery&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;]).then(function () {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   var DEBUG = false; // flip to true for console logs&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   var DEBUG = false; // flip to true for console logs&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bonez565</name></author>
	</entry>
	<entry>
		<id>https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-TableChecklist.js&amp;diff=25305&amp;oldid=prev</id>
		<title>Bonez565: Created page with &quot;/* Gadget: Table Checklist  * Multi-select highlight for tables with class &quot;mw-lighttable&quot;.  * Optional footer (counter + Clear All) when table also has class &quot;mw-lighttablefooter&quot;.  * Persists by stable row IDs via localStorage (fallback to mw.storage).  */   mw.loader.using([&#039;jquery&#039;, &#039;mediawiki.storage&#039;]).then(function () {   var DEBUG = false; // flip to true for console logs    // ---------- Config ----------   var TABLE_CLASS_OPTIN = &#039;mw-lighttablefooter&#039;; // add t...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-TableChecklist.js&amp;diff=25305&amp;oldid=prev"/>
		<updated>2025-11-08T02:57:15Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;Gadget: Table Checklist  * Multi-select highlight for tables with class &amp;quot;mw-lighttable&amp;quot;.  * Optional footer (counter + Clear All) when table also has class &amp;quot;mw-lighttablefooter&amp;quot;.  * Persists by stable row IDs via localStorage (fallback to mw.storage).: &lt;/span&gt;   mw.loader.using([&amp;#039;jquery&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;]).then(function () {   var DEBUG = false; // flip to true for console logs    // ---------- Config ----------   var TABLE_CLASS_OPTIN = &amp;#039;mw-lighttablefooter&amp;#039;; // add t...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Gadget: Table Checklist&lt;br /&gt;
 * Multi-select highlight for tables with class &amp;quot;mw-lighttable&amp;quot;.&lt;br /&gt;
 * Optional footer (counter + Clear All) when table also has class &amp;quot;mw-lighttablefooter&amp;quot;.&lt;br /&gt;
 * Persists by stable row IDs via localStorage (fallback to mw.storage).&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
mw.loader.using([&amp;#039;jquery&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;]).then(function () {&lt;br /&gt;
  var DEBUG = false; // flip to true for console logs&lt;br /&gt;
&lt;br /&gt;
  // ---------- Config ----------&lt;br /&gt;
  var TABLE_CLASS_OPTIN = &amp;#039;mw-lighttablefooter&amp;#039;; // add this class to tables that should get a footer&lt;br /&gt;
  var TABLE_KEY_ATTR    = &amp;#039;data-storage-key&amp;#039;; // per-table storage key attribute&lt;br /&gt;
  var ROW_ID_ATTRS      = [&amp;#039;data-achievement-id&amp;#039;, &amp;#039;data-row-id&amp;#039;]; // attributes that carry a stable ID&lt;br /&gt;
&lt;br /&gt;
  // ---------- Storage (localStorage with MW fallback) ----------&lt;br /&gt;
  function canUseLocalStorage() {&lt;br /&gt;
    try {&lt;br /&gt;
      var k = &amp;#039;__lt_test__&amp;#039; + Math.random();&lt;br /&gt;
      localStorage.setItem(k, &amp;#039;1&amp;#039;);&lt;br /&gt;
      localStorage.removeItem(k);&lt;br /&gt;
      return true;&lt;br /&gt;
    } catch (e) { if (DEBUG) console.warn(&amp;#039;localStorage unavailable:&amp;#039;, e &amp;amp;&amp;amp; e.name); return false; }&lt;br /&gt;
  }&lt;br /&gt;
  var storageImpl = canUseLocalStorage()&lt;br /&gt;
    ? { get: k =&amp;gt; localStorage.getItem(k), set: (k,v) =&amp;gt; localStorage.setItem(k,v), remove: k =&amp;gt; localStorage.removeItem(k) }&lt;br /&gt;
    : { get: k =&amp;gt; mw.storage.get(k),      set: (k,v) =&amp;gt; mw.storage.set(k,v),      remove: k =&amp;gt; mw.storage.remove(k) };&lt;br /&gt;
&lt;br /&gt;
  function readMap(key){ try{ var raw=storageImpl.get(key); return raw ? JSON.parse(raw) : {}; }catch(e){ if(DEBUG)console.warn(&amp;#039;readMap&amp;#039;,key,e); return {}; } }&lt;br /&gt;
  function writeMap(key,map){ try{ storageImpl.set(key, JSON.stringify(map)); if(DEBUG)console.log(&amp;#039;writeMap&amp;#039;,key,map); }catch(e){ console.error(&amp;#039;writeMap failed&amp;#039;,key,e); } }&lt;br /&gt;
&lt;br /&gt;
  // ---------- Helpers ----------&lt;br /&gt;
  function defaultKeyForTable($table){&lt;br /&gt;
    var page = mw.config.get(&amp;#039;wgPageName&amp;#039;) || &amp;#039;UnknownPage&amp;#039;;&lt;br /&gt;
    var idx  = $(&amp;#039;table.mw-lighttable&amp;#039;).index($table);&lt;br /&gt;
    return &amp;#039;rs:lightTable:&amp;#039; + page + &amp;#039;:&amp;#039; + idx;&lt;br /&gt;
  }&lt;br /&gt;
  function getStorageKeyForTable($table){&lt;br /&gt;
    var key = $table.attr(TABLE_KEY_ATTR) || defaultKeyForTable($table);&lt;br /&gt;
    if (DEBUG) console.log(&amp;#039;[lt] key:&amp;#039;, key);&lt;br /&gt;
    return key;&lt;br /&gt;
  }&lt;br /&gt;
  function getRowId($tr){&lt;br /&gt;
    for (var i=0;i&amp;lt;ROW_ID_ATTRS.length;i++){ var v=$tr.attr(ROW_ID_ATTRS[i]); if(v) return v; }&lt;br /&gt;
    // fallback: if someone put the id on the first cell&lt;br /&gt;
    var $cell = $tr.children(&amp;#039;td[&amp;#039;+ROW_ID_ATTRS[0]+&amp;#039;],th[&amp;#039;+ROW_ID_ATTRS[0]+&amp;#039;],td[&amp;#039;+ROW_ID_ATTRS[1]+&amp;#039;],th[&amp;#039;+ROW_ID_ATTRS[1]+&amp;#039;]&amp;#039;).first();&lt;br /&gt;
    if ($cell.length) return $cell.attr(ROW_ID_ATTRS[0]) || $cell.attr(ROW_ID_ATTRS[1]) || &amp;#039;&amp;#039;;&lt;br /&gt;
    return &amp;#039;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
function tableColumnCount($table) {&lt;br /&gt;
  function sumCols($row) {&lt;br /&gt;
    var cols = 0;&lt;br /&gt;
    $row.children(&amp;#039;th,td&amp;#039;).each(function () {&lt;br /&gt;
      var span = parseInt($(this).attr(&amp;#039;colspan&amp;#039;) || &amp;#039;1&amp;#039;, 10);&lt;br /&gt;
      cols += (isNaN(span) ? 1 : span);&lt;br /&gt;
    });&lt;br /&gt;
    return cols;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var maxCols = 0;&lt;br /&gt;
&lt;br /&gt;
  // Prefer THEAD: handle multi-row headers and colspans correctly&lt;br /&gt;
  var $thead = $table.children(&amp;#039;thead&amp;#039;);&lt;br /&gt;
  if ($thead.length) {&lt;br /&gt;
    $thead.children(&amp;#039;tr&amp;#039;).each(function () {&lt;br /&gt;
      maxCols = Math.max(maxCols, sumCols($(this)));&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback / cross-check with TBODY (in case no THEAD or unusual markup)&lt;br /&gt;
  if (maxCols === 0) {&lt;br /&gt;
    $table.children(&amp;#039;tbody&amp;#039;).children(&amp;#039;tr&amp;#039;).each(function () {&lt;br /&gt;
      maxCols = Math.max(maxCols, sumCols($(this)));&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return Math.max(maxCols, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ---------- Footer (counter + clear-all-by-ID) ----------&lt;br /&gt;
  function countSelectable($table){&lt;br /&gt;
    var seen = Object.create(null), selectedById = Object.create(null);&lt;br /&gt;
    $table.find(&amp;#039;tbody tr&amp;#039;).each(function(){&lt;br /&gt;
      var id = getRowId($(this)); if (!id) return;&lt;br /&gt;
      seen[id] = true; if ($(this).hasClass(&amp;#039;highlight-on&amp;#039;)) selectedById[id] = true;&lt;br /&gt;
    });&lt;br /&gt;
    var total=0, selected=0; for (var k in seen) total++; for (var k2 in selectedById) selected++;&lt;br /&gt;
    return {selected, total};&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureFooter($table){&lt;br /&gt;
    if (!$table.hasClass(TABLE_CLASS_OPTIN)) return null; // opt-in only&lt;br /&gt;
&lt;br /&gt;
    var $tfoot = $table.children(&amp;#039;tfoot&amp;#039;); if (!$tfoot.length) $tfoot = $(&amp;#039;&amp;lt;tfoot&amp;gt;&amp;#039;).appendTo($table);&lt;br /&gt;
    var $row   = $tfoot.children(&amp;#039;tr.lt-footer-row&amp;#039;);&lt;br /&gt;
    if (!$row.length) {&lt;br /&gt;
      $row = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;).addClass(&amp;#039;lt-footer-row&amp;#039;).appendTo($tfoot);&lt;br /&gt;
      $(&amp;#039;&amp;lt;th&amp;gt;&amp;#039;).attr(&amp;#039;colspan&amp;#039;, tableColumnCount($table)).addClass(&amp;#039;lt-footer-cell&amp;#039;).appendTo($row);&lt;br /&gt;
    } else {&lt;br /&gt;
      $row.find(&amp;#039;th.lt-footer-cell&amp;#039;).attr(&amp;#039;colspan&amp;#039;, tableColumnCount($table));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var $cell = $row.find(&amp;#039;th.lt-footer-cell&amp;#039;);&lt;br /&gt;
    if (!$cell.find(&amp;#039;.lt-clear-btn&amp;#039;).length) {&lt;br /&gt;
      var $counter = $(&amp;#039;&amp;lt;span class=&amp;quot;lt-footer-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
      var $btn = $(&amp;#039;&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;lt-clear-btn&amp;quot;&amp;gt;Clear All&amp;lt;/button&amp;gt;&amp;#039;)&lt;br /&gt;
        .css({ marginLeft: &amp;#039;1em&amp;#039; })&lt;br /&gt;
        .on(&amp;#039;click&amp;#039;, function(){&lt;br /&gt;
          // collect unique IDs present&lt;br /&gt;
          var ids = Object.create(null);&lt;br /&gt;
          $table.find(&amp;#039;tbody tr&amp;#039;).each(function(){ var id=getRowId($(this)); if (id) ids[id]=true; });&lt;br /&gt;
&lt;br /&gt;
          // remove highlight from all rows with those IDs&lt;br /&gt;
          $table.find(&amp;#039;tbody tr&amp;#039;).each(function(){ var $tr=$(this), id=getRowId($tr); if (ids[id]) $tr.removeClass(&amp;#039;highlight-on&amp;#039;).attr(&amp;#039;aria-selected&amp;#039;,&amp;#039;false&amp;#039;); });&lt;br /&gt;
&lt;br /&gt;
          // clear in storage by ID&lt;br /&gt;
          var key = getStorageKeyForTable($table);&lt;br /&gt;
          var map = readMap(key);&lt;br /&gt;
          Object.keys(ids).forEach(function(id){ map[id]=0; });&lt;br /&gt;
          writeMap(key, map);&lt;br /&gt;
&lt;br /&gt;
          updateFooter($table);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
      $cell.empty().append($counter).append($btn);&lt;br /&gt;
    }&lt;br /&gt;
    return $cell.find(&amp;#039;.lt-footer-counter&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function updateFooter($table){&lt;br /&gt;
    var $counter = ensureFooter($table); if (!$counter) return;&lt;br /&gt;
    var c = countSelectable($table);&lt;br /&gt;
    $counter.text(&amp;#039;Entries Completed: (&amp;#039; + c.selected + &amp;#039; / &amp;#039; + c.total + &amp;#039;)&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // ---------- Apply &amp;amp; Bind ----------&lt;br /&gt;
  function applyFromStorage($root){&lt;br /&gt;
    $root.find(&amp;#039;table.mw-lighttable&amp;#039;).each(function(){&lt;br /&gt;
      var $table = $(this), key = getStorageKeyForTable($table), map = readMap(key);&lt;br /&gt;
      $table.find(&amp;#039;tbody tr&amp;#039;).each(function(){&lt;br /&gt;
        var $tr=$(this), id=getRowId($tr); if(!id){ if(DEBUG)console.warn(&amp;#039;[lt] row missing ID&amp;#039;,this); return; }&lt;br /&gt;
        var on = map[id] === 1 || map[id] === &amp;#039;1&amp;#039;;&lt;br /&gt;
        $tr.toggleClass(&amp;#039;highlight-on&amp;#039;, on).attr(&amp;#039;aria-selected&amp;#039;, on ? &amp;#039;true&amp;#039; : &amp;#039;false&amp;#039;);&lt;br /&gt;
        if (!$tr.attr(&amp;#039;tabindex&amp;#039;)) $tr.attr(&amp;#039;tabindex&amp;#039;,&amp;#039;0&amp;#039;);&lt;br /&gt;
      });&lt;br /&gt;
      updateFooter($table);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function bindHandlers($root){&lt;br /&gt;
    $root.find(&amp;#039;table.mw-lighttable&amp;#039;).each(function(){&lt;br /&gt;
      var $table = $(this), key = getStorageKeyForTable($table);&lt;br /&gt;
      $table.off(&amp;#039;.mwLighttable&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      // Don&amp;#039;t toggle on link clicks (and stop bubbling)&lt;br /&gt;
      $table.on(&amp;#039;click.mwLighttable&amp;#039;,&amp;#039;a&amp;#039;,function(e){ e.stopPropagation(); });&lt;br /&gt;
&lt;br /&gt;
      // Toggle on non-link clicks; group by ID&lt;br /&gt;
      $table.on(&amp;#039;click.mwLighttable&amp;#039;,&amp;#039;tbody tr&amp;#039;,function(e){&lt;br /&gt;
        if ($(e.target).closest(&amp;#039;a, button, input, label, select, textarea&amp;#039;).length) return;&lt;br /&gt;
        var $tr=$(this), id=getRowId($tr); if(!id) return;&lt;br /&gt;
&lt;br /&gt;
        var on = !$tr.hasClass(&amp;#039;highlight-on&amp;#039;);&lt;br /&gt;
        var $group = $table.find(&amp;#039;tbody tr&amp;#039;).filter(function(){ return getRowId($(this)) === id; });&lt;br /&gt;
        $group.toggleClass(&amp;#039;highlight-on&amp;#039;, on).attr(&amp;#039;aria-selected&amp;#039;, on ? &amp;#039;true&amp;#039; : &amp;#039;false&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        var map = readMap(key); map[id] = on ? 1 : 0; writeMap(key, map);&lt;br /&gt;
        updateFooter($table);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      // Keyboard support&lt;br /&gt;
      $table.on(&amp;#039;keydown.mwLighttable&amp;#039;,&amp;#039;tbody tr&amp;#039;,function(e){&lt;br /&gt;
        if (e.key === &amp;#039; &amp;#039; || e.key === &amp;#039;Enter&amp;#039;){ e.preventDefault(); $(this).trigger(&amp;#039;click&amp;#039;); }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // ---------- Init ----------&lt;br /&gt;
  $(function(){ applyFromStorage($(document)); bindHandlers($(document)); });&lt;br /&gt;
  mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function($c){ applyFromStorage($c); bindHandlers($c); });&lt;br /&gt;
&lt;br /&gt;
  // ---------- Optional debug helpers ----------&lt;br /&gt;
  window.ltDebug = {&lt;br /&gt;
    dump: function(){ $(&amp;#039;table.mw-lighttable&amp;#039;).each(function(){ var key=getStorageKeyForTable($(this)); console.log(&amp;#039;[lt] DUMP&amp;#039;, key, readMap(key)); }); },&lt;br /&gt;
    clearAll: function(){ $(&amp;#039;table.mw-lighttable&amp;#039;).each(function(){ var key=getStorageKeyForTable($(this)); storageImpl.remove(key); console.log(&amp;#039;[lt] CLEARED&amp;#039;, key); }); }&lt;br /&gt;
  };&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Bonez565</name></author>
	</entry>
</feed>