מדיה ויקי:סקריפטים/106.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
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);
});
});
});
}