MediaWiki

Difference between revisions of "LanguagesGallery.js"

m
m (test)
Line 18: Line 18:
 
     { page: 'LanguageWikidataData.js'},*/
 
     { page: 'LanguageWikidataData.js'},*/
 
];
 
];
 +
var datas = {}; // final object containing consolidated result
 +
var pings = [];
  
 +
var storeData = function(data,item){
 +
console.log(`Data ${item}: ${JSON.stringify(data)}`);
 +
    datas[item]=data;
 +
};
 
/* *************************************************************** */
 
/* *************************************************************** */
 
// Clean data
 
// Clean data
Line 34: Line 40:
 
     return res;
 
     return res;
 
}
 
}
 
 
/* *************************************************************** */
 
/* *************************************************************** */
 
// Merge data by common property
 
// Merge data by common property
Line 48: Line 53:
 
// SORT ?
 
// SORT ?
 
   
 
   
 +
 +
 +
/* *************************************************************** */
 +
// Native Javascript
 +
// CREATES CLASS for API fetching
 +
class apiContentFetcher {
 +
constructor( prefix, suffix ) {
 +
this.prefix = prefix || 'https://lingualibre.org/index.php?title=';
 +
this.suffix = suffix || '&action=raw&ctype=text/json';
 +
}
 +
page( page ) {
 +
page = encodeURIComponent( page );
 +
        const fullUrl = 'https://lingualibre.org/api.php?action=query&list=users&ususers=yug&usprop=groups|editcount|registration&format=json&origin=*';
 +
//const fullUrl = this.prefix+page+this.suffix+'&origin=*';
 +
        const headers = { 'Accept': 'text/javascript,text/json,text/xml,text/csv,application/javascript,application/json,application/xml,application/csv' };
 +
return fetch( fullUrl, { headers } ).then( body => body.json() )
 +
            .catch(function(err){ console.error(`Error in API call on ${page}: ${err}`)});
 +
}
 +
}
 +
 +
 +
const rawPageFetcher = new apiContentFetcher();
 +
rawPageFetcher.page('MediaWiki:'+sources[0].page)
 +
.then(d=> storeData(d, sources[0].page));
 +
 +
/* *************************************************************** */
 +
// Native Javascript
 +
var url = 'https://lingualibre.org/api.php?action=query&list=users&ususers=yug&usprop=groups|editcount|registration&format=json&origin=*';
 +
fetch(url)
 +
.then(d=> d.json())
 +
.then(d=> storeData(d,'Fetchy 1') )
 +
  .catch(function(err){ console.error('Error in API call, fetch 1: '+err);
 +
  });
 +
 +
var intervalId = setInterval(function() {
 +
  console.log('ping');
 +
  pings.push('pong');
 +
  console.log(datas)
 +
  if(Object.keys(datas).length==sources.length){
 +
  console.log(pings);
 +
  console.log(JSON.stringify(datas));
 +
  console.log('run dataviz');
 +
  clearInterval(intervalId);
 +
  }
 +
}, 500);
 +
 +
 
/* *************************************************************** */
 
/* *************************************************************** */
 
/* HTML TEMPLATE ************************************************* */
 
/* HTML TEMPLATE ************************************************* */
Line 69: Line 121:
  
 
// Fetch data        -> NOTE : this is asynchroneous so the data is available too late. Need fix.
 
// Fetch data        -> NOTE : this is asynchroneous so the data is available too late. Need fix.
var result = {}; // final object containing consolidated result
 
$.when(
 
    $.getJSON('/index.php?title=MediaWiki:'+sources[0].page+'.js&action=raw&ctype=text/javascript',
 
    function (data) { console.log(sources[0].page); result[sources[0].page] = data; }),
 
    $.getJSON('https://lingualibre.org/index.php?title=MediaWiki:'+sources[0].page+'.js&action=raw&ctype=text/javascript',
 
        function (data) { console.log(sources[1].page); result[sources[0].page+'2'] = data; }),
 
).done(function() {
 
    console('Yug: ', result)
 
    // use `result`
 
});
 
  
 
//Temporary fake data, clean:
 
//Temporary fake data, clean:
Line 109: Line 151:
 
// Show more/less cards for this section
 
// Show more/less cards for this section
 
// Show more/less infor overall
 
// Show more/less infor overall
 
 
var endpoint = 'https://lingualibre.org/sparql';
 
var query = '?query=';
 
var sparql = `SELECT ?item ?itemLabel WHERE { ?item prop:P2 entity:Q5. SERVICE wikibase:label {    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" . }} LIMIT 10`;
 
var format = '&format=json';
 
var headers = { 'Accept': 'application/sparql-results+json' }; // optional for vanilla js, to be clean
 
var url = endpoint+query+sparql+format;
 
alert(url)
 
$("#hook").append(`<a href="${endpoint+query+encodeURIComponent(sparql)+format}" target="_blank">${url}</a>`)
 
//$("#hook>a")[0].click();
 
/* *************************************************************** */
 
// Native Javascript
 
var jsonArrivedDoThat = function(data){ console.log('JS: ',data)};
 
fetch(url, { headers} )
 
.then(d=> d.json())
 
  .then( function(data){ console.log('JS: ',data)} /* when data arrives do something */ )
 
  .catch(function(err){ console.error('Error in API call: '+err);
 
  });
 
 
/* *************************************************************** */
 
// Native Javascript
 
// CREATES CLASS with parameter `endoint`
 
// Wikidata Query Service page > Click : "Code" > Click: "Javascript (Modern)"
 
// https://query.wikidata.org/#SELECT%20%3Fitem%20WHERE%20%7B%20%3Fitem%20wdt%3AP31%20wd%3AQ5%20%7D%20LIMIT%2010
 
class SPARQLQueryDispatcher {
 
constructor( endpoint ) {
 
this.endpoint = endpoint;
 
}
 
query( sparqlQuery ) {
 
const fullUrl = this.endpoint + '?query=' + encodeURIComponent( sparqlQuery );
 
const headers = { 'Accept': 'application/sparql-results+json' };
 
return fetch( fullUrl, { headers } ).then( body => body.json() );
 
}
 
}
 
const queryDispatcher = new SPARQLQueryDispatcher( endpoint );
 
queryDispatcher.query( sparql ).then(
 
function(data){ console.log('WDQS JS modern: ',data)}
 
  );
 
 
/* *************************************************************** */
 
// JQuery Javascript
 
$.getJSON(endpoint,
 
{ query: sparql, format: 'json' },
 
function(data){ console.log('JQuery: ',data)}
 
);
 

Revision as of 13:54, 20 January 2022

/* *************************************************************** */
/* LanguageGallery script **************************************** */
// Description: given json data provided in MediaWiki pages, merge those data, project language cards.
// Usage: [[Template:LanguagesGallery]]
// Usage: open [[Template:LanguagesGallery]] > Open, loads > Click for more.
// Hack pad:https://jsfiddle.net/hugolpz/vnz238xq/ 
// Documentations:  
// Author: Yug
 
/* *************************************************************** */
/* DATA ********************************************************** */
// Sources
var sources = [
    { page: 'LanguageGalleryData.js'},
    { page: 'LanguageGalleryData.js'},/*
    { page: 'LanguageSpeakersFemaleData.js'},
    { page: 'LanguageSpeakersMaleData.js'},
    { page: 'LanguageWikidataData.js'},*/
];
var datas = {}; // final object containing consolidated result
var pings = [];

var storeData = function(data,item){ 
	console.log(`Data ${item}: ${JSON.stringify(data)}`);
    datas[item]=data;
};
/* *************************************************************** */
// Clean data
var cleanResponseDataBindings = function(dataBindings){
    var res = dataBindings.map(item => {
       var keys = Object.keys(item);
       var obj = {};
       for(var i=0;i<keys.length;i++){
           var key = keys[i],
               val = item[key].value;
           obj[key]=val;
       }
       return obj 
    });
    return res;
}
/* *************************************************************** */
// Merge data by common property
var merge2ArraysBySameId = function(arr1,arr2,id1){
	return arr1.map( item1 => { 
  	var identical = arr2.find(obj => obj[id1] === item1[id1]); 
  	return Object.assign(identical, item1) 
  } );
}


/* *************************************************************** */
// SORT ?
 


/* *************************************************************** */
// Native Javascript
// CREATES CLASS for API fetching
class apiContentFetcher {
	constructor( prefix, suffix ) {
		this.prefix = prefix || 'https://lingualibre.org/index.php?title=';
		this.suffix = suffix || '&action=raw&ctype=text/json';
	}
	page( page ) {
		page = encodeURIComponent( page );
         const fullUrl = 'https://lingualibre.org/api.php?action=query&list=users&ususers=yug&usprop=groups|editcount|registration&format=json&origin=*';
		//const fullUrl = this.prefix+page+this.suffix+'&origin=*';
        const headers = { 'Accept': 'text/javascript,text/json,text/xml,text/csv,application/javascript,application/json,application/xml,application/csv' };
		return fetch( fullUrl, { headers } ).then( body => body.json() )
            .catch(function(err){ console.error(`Error in API call on ${page}: ${err}`)});
	}
}


const rawPageFetcher = new apiContentFetcher();
rawPageFetcher.page('MediaWiki:'+sources[0].page)
	.then(d=> storeData(d, sources[0].page));

/* *************************************************************** */
// Native Javascript
var url = 'https://lingualibre.org/api.php?action=query&list=users&ususers=yug&usprop=groups|editcount|registration&format=json&origin=*';
fetch(url)
	.then(d=> d.json())
	.then(d=> storeData(d,'Fetchy 1') )
  .catch(function(err){ console.error('Error in API call, fetch 1: '+err);
  });

var intervalId = setInterval(function() {
  console.log('ping');
  pings.push('pong');
  console.log(datas)
  if(Object.keys(datas).length==sources.length){
   console.log(pings);
   console.log(JSON.stringify(datas));
   console.log('run dataviz');
   clearInterval(intervalId);
  }
}, 500);


/* *************************************************************** */
/* HTML TEMPLATE ************************************************* */
// Beautity numbers
//console.log(10000.toLocaleString());    // "10,000"

// Template
var tpl = function(lang){
    return     `<div>
        <h2>${lang.label} (${lang.iso||lang.qid})</h2>
        <span>Recordings: ${lang.recordsF+lang.recordsM} (${lang.recordsF}|${lang.recordsM})</span>
        <span>Speakers: ${lang.speakersF+lang.speakersM} (${lang.speakersF}|${lang.speakersM})</span>
        <span>Population: ${lang.population.toLocaleString()}</span>        
    <div>`
}
 
/* *************************************************************** */
/* INJECTIONS **************************************************** */



// Fetch data        -> NOTE : this is asynchroneous so the data is available too late. Need fix.

//Temporary fake data, clean:
const languages = [{ qid: 'Q209', label: 'Breton', iso:'bre' }, { qid: 'Q21', label: 'French', iso: 'fra' }],
    speakersFemales = [{ qid: 'Q209', speakersF: 3, recordsF: 60 }, { qid: 'Q21', speakersF: 21, recordsF:15046 }],
    speakersMales = [{ qid: 'Q209', speakersM: 7, recordsM: 112 }, { qid: 'Q21', speakersM: 85, recordsM:82964 }],
    natives = [{ qid: 'Q209', population: 300000 }, { qid: 'Q21', population:80000000 }];

// Mergings
var merge1 = merge2ArraysBySameId(languages,speakersFemales,'qid');
var merge2 = merge2ArraysBySameId(merge1,speakersMales,'qid');
var final = merge2ArraysBySameId(merge2,natives,'qid');
console.log(JSON.stringify(final))

var _10k = final.filter(item => item.recordsF+item.recordsM > 9999);
console.log('_10k: ', _10k)
_10k.forEach(item => $('#lg-10k').append(tpl(item)) )

var _1k = final.filter(item => item.recordsF+item.recordsM > 999 && item.recordsF+item.recordsM <10000);
console.log('_1k: ', _1k)
_1k.forEach(item => $('#lg-1k').append(tpl(item)) )

var _1 = final.filter(item => item.recordsF+item.recordsM > 0 && item.recordsF+item.recordsM <1000);
console.log('_1: ', _1)
_1.forEach(item => $('#lg-1').append(tpl(item)) )


/* *************************************************************** */
/* PAGE INTERACTIONS ********************************************* */
// Show more/less cards for this section
// Show more/less infor overall