<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-navboxNavigation.js</id>
	<title>MediaWiki:Gadget-navboxNavigation.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-navboxNavigation.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=MediaWiki:Gadget-navboxNavigation.js&amp;action=history"/>
	<updated>2026-06-22T08:42:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=MediaWiki:Gadget-navboxNavigation.js&amp;diff=12139&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «/**  * Navbox Navigation  *   * Author: Serhio Magpie  * Licenses: MIT, CC BY-SA  */  // &lt;nowiki&gt;  ( function () { 	var _config = { 			name: 'MediaWiki:Gadget-navboxNavigation.js', 			wikilink: 'MediaWiki:Gadget-navboxNavigation.js', 			allowNamespaces: [ 0 ], 			excludeTemplates: [], 			namespace: mw.config.get( 'wgNamespaceNumber' ), 			pageName: mw.config.get( 'wgPageName' ), 			userLanguage: mw.config.get( 'wgUserLanguage' ), 			temlateNamespace: 'Ш...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=MediaWiki:Gadget-navboxNavigation.js&amp;diff=12139&amp;oldid=prev"/>
		<updated>2023-05-03T14:28:28Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;*  * Navbox Navigation  *   * Author: Serhio Magpie  * Licenses: MIT, CC BY-SA: &lt;/span&gt;  // &amp;lt;nowiki&amp;gt;  ( function () { 	var _config = { 			name: &amp;#039;MediaWiki:Gadget-navboxNavigation.js&amp;#039;, 			wikilink: &amp;#039;&lt;a href=&quot;/index.php/MediaWiki:Gadget-navboxNavigation.js&quot; title=&quot;MediaWiki:Gadget-navboxNavigation.js&quot;&gt;MediaWiki:Gadget-navboxNavigation.js&lt;/a&gt;&amp;#039;, 			allowNamespaces: [ 0 ], 			excludeTemplates: [], 			namespace: mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ), 			pageName: mw.config.get( &amp;#039;wgPageName&amp;#039; ), 			userLanguage: mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ), 			temlateNamespace: &amp;#039;Ш...»&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * Navbox Navigation&lt;br /&gt;
 * &lt;br /&gt;
 * Author: Serhio Magpie&lt;br /&gt;
 * Licenses: MIT, CC BY-SA&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
	var _config = {&lt;br /&gt;
			name: 'MediaWiki:Gadget-navboxNavigation.js',&lt;br /&gt;
			wikilink: '[[MediaWiki:Gadget-navboxNavigation.js]]',&lt;br /&gt;
			allowNamespaces: [ 0 ],&lt;br /&gt;
			excludeTemplates: [],&lt;br /&gt;
			namespace: mw.config.get( 'wgNamespaceNumber' ),&lt;br /&gt;
			pageName: mw.config.get( 'wgPageName' ),&lt;br /&gt;
			userLanguage: mw.config.get( 'wgUserLanguage' ),&lt;br /&gt;
			temlateNamespace: 'Шаблон',&lt;br /&gt;
		},&lt;br /&gt;
		_strings = {&lt;br /&gt;
			ru : {&lt;br /&gt;
				'navboxNavigation-load-error' : '$1: Не удалось загрузить содержимое шаблона «$2».',&lt;br /&gt;
				'navboxNavigation-title-error' : '$1: Имя навигационного шаблона задано в неправильном формате: «$2».'&lt;br /&gt;
			},&lt;br /&gt;
			en: {&lt;br /&gt;
				'navboxNavigation-load-error' : '$1: Failed to load the content of the &amp;quot;$2&amp;quot; template.',&lt;br /&gt;
				'navboxNavigation-title-error' : '$1: Navbox template name is invalid: «$2».'&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		_pageName,&lt;br /&gt;
		_templateTitleRegExp,&lt;br /&gt;
		_navboxNodes = [],&lt;br /&gt;
		_navboxItems = [],&lt;br /&gt;
		_linkNodes = [],&lt;br /&gt;
		_linkItems = [];&lt;br /&gt;
&lt;br /&gt;
	/******* UTILS *******/&lt;br /&gt;
	&lt;br /&gt;
	function isEmpty( str ) {&lt;br /&gt;
		return typeof str === 'undefined' || str.length === 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function inDOM( $node ) {&lt;br /&gt;
		var node = $node.get( 0 );&lt;br /&gt;
		return $.contains( document.documentElement, node );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function isNavbox( $node ) {&lt;br /&gt;
		var data = $node.data( 'navboxnavigation' );&lt;br /&gt;
		return !isEmpty(data) || $node.hasClass( 'navbox' );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function setSelfLink( $node ) {&lt;br /&gt;
		return $node&lt;br /&gt;
			.removeAttr( 'href title' )&lt;br /&gt;
			.addClass( [ 'mw-selflink', 'selflink' ] );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function getNavboxByPageName( pageName ) {&lt;br /&gt;
		var navbox;&lt;br /&gt;
		$( _navboxItems ).each( function () {&lt;br /&gt;
			if ( this.pageName === pageName ) {&lt;br /&gt;
				navbox = this;&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		return navbox;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/******* NAVBOX *******/&lt;br /&gt;
&lt;br /&gt;
	function Navbox( $node, navbox, mode ) {&lt;br /&gt;
		this.$node = $node;&lt;br /&gt;
		this.navbox = navbox;&lt;br /&gt;
		this.mode = mode;&lt;br /&gt;
		this.name = $node.data( 'name' );&lt;br /&gt;
		this.navigation = $node.data( 'navboxnavigation' );&lt;br /&gt;
		this.behavior = $node.data( 'navboxnavigation-behavior' );&lt;br /&gt;
		this.childs = [];&lt;br /&gt;
		this.links = [];&lt;br /&gt;
&lt;br /&gt;
		if ( !isEmpty( this.name ) ) {&lt;br /&gt;
			try {&lt;br /&gt;
				this.pageName = new mw.Title( this.name, 10 ).getPrefixedText();&lt;br /&gt;
			} catch (e) {&lt;br /&gt;
				console.warn(&lt;br /&gt;
					mw.msg( 'navboxNavigation-title-error', _config.wikilink, this.name )&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( this.mode === 'strict' ) {&lt;br /&gt;
			this.hasNavigation = this.navigation !== 'undefined' &amp;amp;&amp;amp; this.navigation === 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			this.hasNavigation = !( typeof this.navigation !== 'undefined' &amp;amp;&amp;amp; this.navigation === 0 );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( [ 'replace', 'refill' ].indexOf( this.behavior ) === -1 ) {&lt;br /&gt;
			this.behavior = 'replace';&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( &lt;br /&gt;
			!this.hasNavigation ||&lt;br /&gt;
			( this.navbox &amp;amp;&amp;amp; this.navbox.isExcluded ) ||&lt;br /&gt;
			( this.pageName &amp;amp;&amp;amp; _config.excludeTemplates.indexOf( this.pageName ) !== -1 )&lt;br /&gt;
		) {&lt;br /&gt;
			this.isExcluded = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		this.getChilds();&lt;br /&gt;
		this.getLinks();&lt;br /&gt;
&lt;br /&gt;
		_navboxItems.push( this );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.setPageName = function ( pageName ) {&lt;br /&gt;
		if ( !isEmpty( pageName ) ) {&lt;br /&gt;
			this.pageName = pageName;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.getChilds = function () {&lt;br /&gt;
		var that = this,&lt;br /&gt;
			$nodes;&lt;br /&gt;
		if ( that.mode === 'strict') {&lt;br /&gt;
			$nodes = that.$node.find( '[data-navboxnavigation=&amp;quot;1&amp;quot;]' );&lt;br /&gt;
		} else {&lt;br /&gt;
			$nodes = that.$node.find( '[data-navboxnavigation], .navbox' );&lt;br /&gt;
		}&lt;br /&gt;
		$nodes.each( function ( ) {&lt;br /&gt;
			var $node = $( this );&lt;br /&gt;
			if ( _navboxNodes.indexOf( this ) === -1 ) {&lt;br /&gt;
				_navboxNodes.push(  this );&lt;br /&gt;
				that.childs.push( new Navbox( $node, that, that.mode ) );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.getLinks = function () {&lt;br /&gt;
		var that = this,&lt;br /&gt;
			$links = that.$node.find( 'a[title]' ),&lt;br /&gt;
			$include = that.$node.find( '[data-navboxnavigation-link=&amp;quot;1&amp;quot;] a' ),&lt;br /&gt;
			$exclude = that.$node.find( '[data-navboxnavigation-link=&amp;quot;0&amp;quot;] a' );&lt;br /&gt;
		$links.each( function () {&lt;br /&gt;
			var $node = $( this ),&lt;br /&gt;
				title = $node.attr( 'title' ),&lt;br /&gt;
				isIncluded = $.inArray( this, $include ) !== -1,&lt;br /&gt;
				isExcluded = $.inArray( this, $exclude ) !== -1;&lt;br /&gt;
				&lt;br /&gt;
			// Mark current page selflinks in the navbox&lt;br /&gt;
			if ( !isIncluded &amp;amp;&amp;amp; !isEmpty( title ) &amp;amp;&amp;amp; title === _pageName ) {&lt;br /&gt;
				setSelfLink( $node );&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if ( &lt;br /&gt;
				_linkNodes.indexOf( this ) === -1 &amp;amp;&amp;amp;&lt;br /&gt;
				( isIncluded || _templateTitleRegExp.test( title ) )&lt;br /&gt;
			) {&lt;br /&gt;
				_linkNodes.push( this );&lt;br /&gt;
				that.links.push(&lt;br /&gt;
					new Link( $node, that, that.mode, isIncluded, isExcluded )&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.expand = function () {&lt;br /&gt;
		if( typeof collapseTable === 'undefined' || typeof collapseCaption === 'undefined' ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		var $nodes = this.$node.find( '.collapseButton &amp;gt; a' );&lt;br /&gt;
		$nodes.each( function () {&lt;br /&gt;
			var $node = $( this ),&lt;br /&gt;
				id = $node.attr('id').replace( /[^\d]/g, '' ),&lt;br /&gt;
				isCollapsed = $node.text() === expandCaption;&lt;br /&gt;
			if ( isCollapsed ) {&lt;br /&gt;
				collapseTable( id );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.insertBefore = function ( navbox ) {&lt;br /&gt;
		this.$node.insertBefore( navbox.$node );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.detach = function () {&lt;br /&gt;
		this.$node.detach();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Navbox.prototype.isInDOM = function () {&lt;br /&gt;
		return inDOM( this.$node );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/******* LINK *******/&lt;br /&gt;
&lt;br /&gt;
	function Link( $node, navbox, mode, isIncluded, isExcluded ) {&lt;br /&gt;
		this.$node = $node;&lt;br /&gt;
		this.navbox = navbox;&lt;br /&gt;
		this.mode = mode;&lt;br /&gt;
		this.isLoading = false;&lt;br /&gt;
		this.isIncluded = isIncluded;&lt;br /&gt;
		this.isExcluded = isExcluded;&lt;br /&gt;
		this.pageName = $node.attr( 'title' );&lt;br /&gt;
&lt;br /&gt;
		if ( this.$node.hasClass( 'new' ) ) {&lt;br /&gt;
			this.isNew = true;&lt;br /&gt;
			this.isExcluded = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( &lt;br /&gt;
			this.$node.hasClass( 'mw-selflink selflink' ) ||&lt;br /&gt;
			this.pageName === this.navbox.pageName&lt;br /&gt;
		) {&lt;br /&gt;
			this.isSelf = true;&lt;br /&gt;
			this.navbox.setPageName( this.pageName );&lt;br /&gt;
			setSelfLink( this.$node );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( !this.isExcluded &amp;amp;&amp;amp; !this.navbox.isExcluded ) {&lt;br /&gt;
			this.$node&lt;br /&gt;
				.addClass( 'navboxNavigation-link' )&lt;br /&gt;
				.on( 'click', this.onClick.bind( this ) )&lt;br /&gt;
				.on( 'keypress', this.onClick.bind( this ) );&lt;br /&gt;
		}&lt;br /&gt;
		_linkItems.push( this );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Link.prototype.getPage = function () {&lt;br /&gt;
		// Use cached navbox if exists, but prevent populating navboxes that already in dom&lt;br /&gt;
		var navbox = getNavboxByPageName( this.pageName );&lt;br /&gt;
		if ( navbox &amp;amp;&amp;amp; !navbox.isInDOM() ) {&lt;br /&gt;
			this.replaceNavboxContent( navbox );&lt;br /&gt;
		} else if( !this.isLoading ) {&lt;br /&gt;
			this.request();&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Link.prototype.request = function () {&lt;br /&gt;
		this.isLoading = true;&lt;br /&gt;
		this.showLoader();&lt;br /&gt;
		&lt;br /&gt;
		var api = new mw.Api(),&lt;br /&gt;
			params = {&lt;br /&gt;
				action: 'parse',&lt;br /&gt;
				prop: 'text',&lt;br /&gt;
				title: this.pageName,&lt;br /&gt;
				text: '{{' + this.pageName + '}}',&lt;br /&gt;
				contentmodel: 'wikitext',&lt;br /&gt;
				redirects: true&lt;br /&gt;
			};&lt;br /&gt;
		return api&lt;br /&gt;
			.get( params )&lt;br /&gt;
			.then( this.onResponse.bind( this ) )&lt;br /&gt;
			.fail( this.onError.bind( this ) );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Link.prototype.replaceNavboxContent = function ( navbox ) {&lt;br /&gt;
		var $container,&lt;br /&gt;
			that = this;&lt;br /&gt;
&lt;br /&gt;
		if ( navbox ) {&lt;br /&gt;
			navbox.insertBefore( that.navbox );&lt;br /&gt;
			navbox.expand();&lt;br /&gt;
		} else {&lt;br /&gt;
			if ( that.navbox.behavior === 'refill' ) {&lt;br /&gt;
				$container = that.navbox.$node&lt;br /&gt;
					.clone()&lt;br /&gt;
					.empty()&lt;br /&gt;
					.append( that.$templateHTML )&lt;br /&gt;
					.insertBefore( that.navbox.$node );&lt;br /&gt;
				mw.hook( 'wikipage.content' ).fire( $container );&lt;br /&gt;
			} else {&lt;br /&gt;
				that.$templateHTML.each( function () {&lt;br /&gt;
					$container = $( this );&lt;br /&gt;
					$container.insertBefore( that.navbox.$node );&lt;br /&gt;
					mw.hook( 'wikipage.content' ).fire( $container );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		that.navbox.detach();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Link.prototype.onClick = function ( event ) {&lt;br /&gt;
		if ( event.type === 'keypress' &amp;amp;&amp;amp; [ 'Enter', 'Space' ].indexOf( event.code ) === -1 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		event.preventDefault();&lt;br /&gt;
		if ( !this.isSelf ) {&lt;br /&gt;
			this.getPage();&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Link.prototype.onResponse = function ( data ) {&lt;br /&gt;
		this.isLoading = false;&lt;br /&gt;
		this.hideLoader();&lt;br /&gt;
		if ( !data ) {&lt;br /&gt;
			this.notifyError();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		this.pageContent = data.parse.text['*'];&lt;br /&gt;
		this.$pageHTML = $.parseHTML( this.pageContent );&lt;br /&gt;
		this.$templateHTML = $( this.$pageHTML ).children();&lt;br /&gt;
&lt;br /&gt;
		this.replaceNavboxContent();&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	Link.prototype.onError = function ( data ) {&lt;br /&gt;
		this.isLoading = false;&lt;br /&gt;
		this.hideLoader();&lt;br /&gt;
		this.notifyError();&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	Link.prototype.notifyError = function () {&lt;br /&gt;
		mw.notify(&lt;br /&gt;
			mw.msg( 'navboxNavigation-load-error', _config.wikilink, this.pageName ),&lt;br /&gt;
			{ type: 'error' }&lt;br /&gt;
		);&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	Link.prototype.showLoader = function () {&lt;br /&gt;
		this.$node.addClass( 'navboxNavigation-link--pending' );&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	Link.prototype.hideLoader = function () {&lt;br /&gt;
		this.$node.removeClass( 'navboxNavigation-link--pending' );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/******* COLLECTOR *******/&lt;br /&gt;
&lt;br /&gt;
	function Collector( $node, parent, mode ) {&lt;br /&gt;
		this.$node = $node;&lt;br /&gt;
		this.parent = parent;&lt;br /&gt;
		this.mode = mode;&lt;br /&gt;
		this.childs = [];&lt;br /&gt;
		this.links = [];&lt;br /&gt;
&lt;br /&gt;
		Navbox.prototype.getChilds.call( this );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/******* MAIN *******/&lt;br /&gt;
	&lt;br /&gt;
	function prepare() {&lt;br /&gt;
		// Set interface strings&lt;br /&gt;
		if ( _config.userLanguage === 'ru' ) {&lt;br /&gt;
			mw.messages.set( _strings.ru );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.messages.set( _strings.en );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		_pageName = new mw.Title( _config.pageName ).getPrefixedText();&lt;br /&gt;
		_templateTitleRegExp = new RegExp( '^' + _config.temlateNamespace + ':' );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function init( $content ) {&lt;br /&gt;
		if ( !$content ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( _config.allowNamespaces.indexOf( _config.namespace ) !== -1 ) {&lt;br /&gt;
			collect( $content, 'all' );&lt;br /&gt;
		} else {&lt;br /&gt;
			collect( $content, 'strict' );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function collect( $content, mode ) {&lt;br /&gt;
		if ( isNavbox( $content ) ) {&lt;br /&gt;
			var navbox = new Navbox( $content, null, mode );&lt;br /&gt;
			navbox.expand();&lt;br /&gt;
		} else {&lt;br /&gt;
			new Collector( $content, null, mode );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/******* INIT *******/&lt;br /&gt;
	&lt;br /&gt;
	prepare();&lt;br /&gt;
	mw.hook( 'wikipage.content' ).add( init );&lt;br /&gt;
} )();&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>