User:Erutuon/scripts/semhide.js

Note – after saving, you may have to bypass your browser’s cache to see the changes.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

// based on [[User:Jberkel/semhide.js]] and [[User:Ungoliant_MMDCCLXIV/synshide.js]]

/* globals $ */

(function () {
'use strict';

function setupNyms(index, dlTag) {
	// [[Wiktionary:Semantic relations]]
	var relationClasses = [ 'synonym', 'antonym', 'hypernym', 'hyponym', 'meronym',
							'holonym', 'troponym', 'coordinate-term' ];
	
	var relations = $(dlTag).find('dd > .nyms').get().filter(
		function(element) {
			return Array.prototype.some.call(element.classList, function (className) {
				if (relationClasses.indexOf(className) !== -1) {
					$(element).data('relationClass', className);
					return true;
				}
			});
		});
	
	function setupToggle(elements, category, visibleByDefault) {
		if (elements.length === 0) return null;
		var toggler = $('<a>');
		var text = elements.map(function (e) {
			return $(e).data('relationClass').replace('-', ' ') +
				 (($(e).find('a').length > 1) ? 's' : '');
		}).join(', ');
		
		function show() {
			toggler.html(text + '&nbsp;▲');
			$(dlTag).show();
			$(elements).show();
		}
		function hide() {
			toggler.html(text + '&nbsp;▼');
			if ($(dlTag).children().length === elements.length) {
				$(dlTag).hide();
			} else {
				$(elements).hide();
			}
		}
	
		$(dlTag).before($('<span>')
		   .addClass('HQToggle')
		   .append(toggler)
		   .css('margin-left', '5px'));
		   
		toggler.click(window.VisibilityToggles.register(category, show, hide, visibleByDefault));
	}
	
	var synonyms = relations.filter(function (e) {
		return ['synonym', 'antonym'].indexOf($(e).data('relationClass')) !== -1;
	});
	var other = relations.filter(function (e) { return synonyms.indexOf(e) === -1; });
   
	setupToggle(synonyms, 'synonyms', true /* show by default */);
	setupToggle(other, 'semantic relations');
}

$(function() {
	// if (mw.config.get('wgNamespaceNumber') === 0) {
		$('dl:has(dd > .nyms)').each(setupNyms);
	// }
});

})();