mediawiki-extensions-Visual.../modules/jquery/jquery.visibleText.js
Timo Tijhof 18ab361a43 (bug 43013) Exclude edit notices with no visible text.
en.wikipedia.org has a template gala for edit notices with a whole
bunch of html framework outputted by default from
MediaWiki:Editnotice-0 (even if their underlying system has no
matches for the current page).

In the core editor from EditPage.php this isn't a problem as the
element is just idling hidden above the editor.

In the case of VisualEditor (where we have a custom delivery for
the edit notices) we don't want to say "1 notice available" on
every page, so we need to be smart and quickly walk the dom of the
notice, filter out invisible nodes, and if the resulting nodes
have no contents, ignore the notice all together.

Change-Id: I65447da8b88a9bae9c24ff155544ff66b3fe9100
2012-12-13 01:26:11 +01:00

47 lines
1.1 KiB
JavaScript

/**
* jQuery visibleText plugin 0.1.0
* https://github.com/Krinkle/jquery-visibleText
*
* @author Timo Tijhof, 2012
* @source This plugin is based on Sizzle.getText.
* Copyright 2012 jQuery Foundation and other contributors http://jquery.com/
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
*/
(function ($) {
/**
* @param {Array|jQuery|HTMLElement} elem
*/
var getVisibleText = $.getVisibleText = function (elem) {
var node,
i = 0,
ret = '',
nodeType = elem.nodeType;
if (nodeType) {
if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
// Traverse the children
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
ret += $.expr.filters.hidden(elem) ?
'' :
getVisibleText(elem);
}
} else if (nodeType === 3 || nodeType === 4) {
return elem.nodeValue;
}
} else {
// If no nodeType, this is expected to be an array (or jQuery object)
for (; (node = elem[i]); i++) {
ret += getVisibleText(node);
}
}
return ret;
};
$.fn.visibleText = function () {
return getVisibleText(this);
};
}(jQuery));