User:Nw520/QualiRef.js

From Wikidata
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
mw.loader.using( 'mediawiki.util' ).then( () => {
	function main() {
		setupCss();
		collect();
	}

	function collect() {
		for ( const statementView of document.querySelectorAll( '.wikibase-statementview' ) ) {
			const data = {};

			// Collect qualifiers
			for ( const qualifierSnakView of statementView.querySelectorAll( '.wikibase-statementview-qualifiers .wikibase-snakview:first-child' ) ) {
				const property = getPropertyFromSnakView( qualifierSnakView );
				prepareData( data, property );
				data[ property ].qualifiers.push( qualifierSnakView );
			}

			// Collect references
			for ( const refSnakListView of statementView.querySelectorAll( '.wikibase-statementview-references .wikibase-referenceview .wikibase-snaklistview' ) ) {
				const property = getPropertyFromSnakView( refSnakListView.querySelector( '.wikibase-snakview' ) ); // First snakview
				if ( property !== 'P10551' ) {
					continue;
				}

				for ( const refSnakView of refSnakListView.querySelectorAll( '.wikibase-snakview' ) ) {
					const refSnakValue = refSnakView.querySelector( '.wikibase-snakview-value a' );
					const referencedProperty = urlToProperty( refSnakValue?.attributes.href.value ?? null );
					if ( referencedProperty !== null ) {
						prepareData( data, referencedProperty );
						data[ referencedProperty ].references.push( refSnakView );
					}
				}
			}

			// Write data
			for ( const { qualifiers, references } of Object.values( data ) ) {
				for ( const qualifierSnakView of qualifiers ) {
					qualifierSnakView.dataset.nw520QualirefReferencecount = references.length;
					qualifierSnakView.querySelector( '.wikibase-snakview-property' ).dataset.nw520QualirefReferencecount = references.length;
				}

				for ( const refSnakView of references ) {
					refSnakView.dataset.nw520QualirefQualifiercount = qualifiers.length;
					refSnakView.querySelector( '.wikibase-snakview-value' ).dataset.nw520QualirefQualifiercount = qualifiers.length;
				}
			}
		}
	}

	function getPropertyFromSnakView( snakView ) {
		return urlToProperty( snakView.querySelector( '.wikibase-snakview-property a' )?.attributes.href.value ?? null );
	}

	function prepareData( data, property ) {
		if ( data[ property ] === undefined ) {
			data[ property ] = {
				qualifiers: [],
				references: []
			};
		}
	}

	function setupCss() {
		mw.util.addCSS( `.wikibase-statementview *[data-nw520-qualiref-referencecount]:not([data-nw520-qualiref-referencecount='0']) .wikibase-snakview-property::after {
			background: #ddd;
			border-radius: 3px;
			color: #333;
			content: attr(data-nw520-qualiref-referencecount);
			margin-left: .2em;
			padding: .05em .25em;
		}
		.wikibase-statementview:hover *[data-nw520-qualiref-referencecount]:not([data-nw520-qualiref-referencecount='0']) .wikibase-snakview-property::after {
			content: attr(data-nw520-qualiref-referencecount) ' refs';
		}
		.wikibase-statementview *[data-nw520-qualiref-qualifiercount] .wikibase-snakview-value::after {
			background: #ddd;
			border-radius: 3px;
			color: #333;
			content: attr(data-nw520-qualiref-qualifiercount);
			margin-left: .2em;
			padding: .05em .25em;
		}
		.wikibase-statementview *[data-nw520-qualiref-qualifiercount='0'] .wikibase-snakview-value::after {
			background: #990000;
			color: #fff;
		}
		.wikibase-statementview:hover *[data-nw520-qualiref-qualifiercount] .wikibase-snakview-value::after {
			content: attr(data-nw520-qualiref-qualifiercount) ' qualis';
		}` );
	}

	function urlToProperty( url ) {
		if ( url === null ) {
			return null;
		}

		return url.replace( '/wiki/Property:', '' );
	}

	main();
} );