מדיה ויקי:סקריפטים/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); }); }); }); }