mediawiki-skins-Citizen/resources/skins.citizen.search/gateway/smwAskApi.js
2023-07-07 18:00:14 -04:00

133 lines
3.7 KiB
JavaScript

const config = require( '../config.json' );
/**
* Build URL used for fetch request
*
* @param {string} input
* @return {string} url
*/
function getUrl( input ) {
const endpoint = config.wgScriptPath + '/api.php?format=json',
maxResults = config.wgCitizenMaxSearchResults,
askQueryTemplate = config.wgCitizenSearchSmwAskApiQueryTemplate;
let askQuery = '';
if ( input.includes( ':' ) ) {
let namespace = input.split( ':' )[ 0 ];
if ( namespace === 'Category' ) {
namespace = ':' + namespace;
}
input = input.split( ':' )[ 1 ];
askQuery += '[[' + namespace + ':+]]';
}
/* eslint-disable-next-line es-x/no-string-prototype-replaceall */
askQuery += askQueryTemplate.replaceAll( '${input}', input );
askQuery += '|limit=' + maxResults;
const query = {
action: 'ask',
query: encodeURIComponent( askQuery )
};
let queryString = '';
for ( const property in query ) {
queryString += '&' + property + '=' + query[ property ];
}
return endpoint + queryString;
}
/**
* Map raw response to Results object
*
* @param {Object} data
* @return {Object} Results
*/
function convertDataToResults( data ) {
const userLang = mw.config.get( 'wgUserLanguage' );
const getDisplayTitle = ( item ) => {
if ( item.printouts.displaytitle && item.printouts.displaytitle.length &&
item.printouts.displaytitle[ 0 ][ 'Language code' ] && item.printouts.displaytitle[ 0 ].Text.item.length ) {
// multi-lang string preference: user lang => English => first result
let textEN = '';
let textResult = '';
for ( const text of item.printouts.displaytitle ) {
if ( text[ 'Language code' ].item[ 0 ] === userLang ) {
textResult = text.Text.item[ 0 ];
}
if ( text[ 'Language code' ].item[ 0 ] === 'en' ) {
textEN = text.Text.item[ 0 ];
}
}
if ( textResult === '' ) {
textResult = textEN;
}
if ( textResult === '' ) {
textResult = item.printouts.displaytitle[ 0 ].Text.item[ 0 ];
}
return textResult;
} else if ( item.printouts.displaytitle && item.printouts.displaytitle.length ) {
return item.printouts.displaytitle[ 0 ];
} else if ( item.displaytitle && item.displaytitle !== '' ) {
return item.displaytitle;
} else { return item.fulltext; }
};
const getDescription = ( item ) => {
if ( item.printouts.desc && item.printouts.desc.length &&
item.printouts.desc[ 0 ][ 'Language code' ] && item.printouts.desc[ 0 ].Text.item.length ) {
// multi-lang string preference: user lang => English => first result
let textEN = '';
let textResult = '';
for ( const text of item.printouts.desc ) {
if ( text[ 'Language code' ].item[ 0 ] === userLang ) {
textResult = text.Text.item[ 0 ];
}
if ( text[ 'Language code' ].item[ 0 ] === 'en' ) {
textEN = text.Text.item[ 0 ];
}
}
if ( textResult === '' ) {
textResult = textEN;
}
if ( textResult === '' ) {
textResult = item.printouts.desc[ 0 ].Text.item[ 0 ];
}
return textResult;
} else if ( item.printouts.desc && item.printouts.desc.length ) {
return item.printouts.desc[ 0 ];
} else { return ''; }
};
const getThumbnail = ( item ) => {
if ( item.printouts.thumbnail && item.printouts.thumbnail.length ) {
const imgTitle = item.printouts.thumbnail[ 0 ].fulltext;
return config.wgScriptPath + '/index.php?title=Special:Redirect/file/' + imgTitle + '&width=200&height=200';
} else { return undefined; }
};
const results = [];
data = Object.values( data.query.results );
for ( let i = 0; i < data.length; i++ ) {
results[ i ] = {
id: i,
key: data[ i ].fulltext,
title: getDisplayTitle( data[ i ] ),
desc: getDescription( data[ i ] ),
thumbnail: getThumbnail( data[ i ] )
};
}
return results;
}
module.exports = {
getUrl: getUrl,
convertDataToResults: convertDataToResults
};