מדיה ויקי:סקריפטים/106.js

מתוך אקו-ויקי, מקום מפגש בנושאי אקולוגיה, חברה וכלכלה.
קפיצה לניווט קפיצה לחיפוש

הערה: לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload), או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר: להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh), או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: לפתוח תפריט ← הגדרות (במחשב מק: Opera ← העדפות) ואז ללחוץ על פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files.
var messages = {
	'addGameLink': 'טעינת משחק לוויקינתונים',
	'removeComment': 'ה-PGN מכיל הערות. האם ניתן להסירן?',
	'claimExists': 'הטענה קיימת כבר בוויקינתונים',
	'enterPgn': 'נא להזין PGN',
	'enterEntity': 'נא להזין יישות בוויקינתונים (צריך להתחיל בQ)',
	'confirmEntity': 'נא לאשר שברצונך להוסיף את המשחק ליישות: ',
	'saveSuccess': 'המשחק נוסף בהצלחה ליישות!'
};

var validCategories = ['משחקי שחמט', 'פתיחות שחמט', 'משחקי שחמט מפורסמים'];

/* loads a PGN to Wikidata entity.
@param pgn: pgn string (Example: 1. e4 e5 2. f4 exf4 3. Bc4 Qh4 4. Kf1 b5)
@param entityId: Qid of entity in Wikidata
*/
function addPgn(pgn, entityId)
{
	var repoConfig = mw.config.get( 'wbRepo' ),
		wikidataApi = new wikibase.api.RepoApi( wikibase.api.getLocationAgnosticMwApi(repoConfig.url + repoConfig.scriptPath + '/api.php') );
	wikidataApi.getEntities(entityId).done(function(d){
		// verify the entity exist. TODO: should we verify P31=Q2683596 (is a Chess game)?
		if (d.error) {
			mw.notify(d.error.messages[0].html['*']);
			return false;
		}
		// safety: verify user aware to the target entity
		var entityLabel = d.entities[entityId].labels[mw.config.get('wgContentLanguage')]? d.entities[entityId].labels[mw.config.get('wgContentLanguage')].value : null;

		if (!entityLabel) entityLabel = d.entities[entityId].labels['en']? d.entities[entityId].labels['en'].value : null;
		if (!entityLabel) entityLabel = entityId;
		if (!confirm(messages['confirmEntity']+entityLabel))
		{
			return false;
		}

		// safety: verify property doesn't already exist in that entity
		if (d.entities[entityId].claims['P5286']) {
			mw.notify(messages['claimExists']);
			return false;
		}

		var revid = d.entities[entityId].lastrevid;

		// TODO: do we want to verify the format of the PGN input? handle enters/spaces? remove comments? etc
		var moveRgx = /([0-9]+)\. +([-a-z]+[0-9]?\+?(?: +[-a-z]+[0-9]?\+?)?)/ig,
			moves = [],
			m;
		while (m = moveRgx.exec(pgn)) moves.push(m);

		// translate the moves to PGN property P1545. A claim for each move
		var claim = []
		for(var i = 0;i < moves.length; i++)
		{
			claim.push({"mainsnak": {"snaktype":"value","property":"P5286","datavalue":{"value":moves[i][2],"type":"string"}},
				"type":"statement",
				"rank":"normal",
				'qualifiers': {'P1545': [
						{ datatype: "string", datavalue: { value: moves[i][1], type: "string" }, property: "P1545", snaktype: "value" }
					]}
			});
		}
		
		// load the game into wikidata
		wikidataApi.editEntity(entityId, revid, {"claims":claim}, false).done(function(saveData){
			mw.notify(messages['saveSuccess']);
		});
	});

}

function pgnCleanCheck(pgn)
{
	var cleanPgn = pgn,
		commentFinder = /\{.+?\}/,
		m = commentFinder.exec(cleanPgn),
		comments = [],
		success = true;
		
	if (m) {
		while(m = commentFinder.exec(cleanPgn)) {
			comments.push(m[0]);
			cleanPgn = cleanPgn.replace(m[0], '');
		}

		success = confirm(messages['removeComment'] +'\n'  + comments.join('\n'));
	}
	return { 'success':  success, 'pgn': cleanPgn };
}

// add link to load PGN to wikidata only for articles on specific category
if (mw.config.get('wgCategories').filter(function(e) { return -1 !== validCategories.indexOf(e) }).length > 0)
{
	mw.loader.using( [ 'mediawiki.util' ] ).done(function(){
	$(mw.util.addPortletLink(
					'p-tb',
					'#',
					messages['addGameLink'],
					't-addPgnToWikidata',
					'',
					null,
					'#t-whatlinkshere'
	)).click(function(e){
		var pgn = prompt(messages['enterPgn']);
		if (!pgn) return;
		pgnSuccess = pgnCleanCheck(pgn);
		if (!pgnSuccess.success) return;
		pgn = pgnSuccess.pgn;
		var entityId = prompt(messages['enterEntity'],  mw.config.get('wgWikibaseItemId'));
		if(!pgn || pgn.length<4 || !entityId)
		{
			mw.notify('Invalid input');
			return false;
		}

		mw.loader.using( [ 'wikibase.api.RepoApi', 'mw.config.values.wbRepo' ] ).done(function(){
			addPgn(pgn, entityId);
		});
	});
	});
}