ويكاموس arwiktionary https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9 MediaWiki 1.46.0-wmf.24 case-sensitive ميديا خاص نقاش مستخدم نقاش المستخدم ويكاموس نقاش ويكاموس ملف نقاش الملف ميدياويكي نقاش ميدياويكي قالب نقاش القالب مساعدة نقاش المساعدة تصنيف نقاش التصنيف ملحق نقاش الملحق مكنز نقاش المكنز TimedText TimedText talk وحدة نقاش الوحدة فعالية نقاش فعالية ميدياويكي:Gadgets-definition 8 145139 1089646 1075850 2026-04-26T20:44:28Z حبيشان 31560 اختبار إضافة 1089646 wikitext text/x-wiki == مخفي == * Site [ResourceLoader |default |hidden |type=styles] |Site.css * VE-wditem-input[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|VE-wditem-input.js * auto-cite-shamela[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-shamela.js * auto-cite-wikidata[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-wikidata.js * countdown-timer[ResourceLoader|default|hidden|dependencies=mediawiki.language|categories=Gadget-Countdown]|countdown-timer.js == تحرير == * AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.Uri,mediawiki.user,mediawiki.api]|AjaxEdit.js * autocomplete[ResourceLoader|dependencies=mediawiki.util]|autocomplete.js * BiDiEditing[ResourceLoader]|BiDiEditing.js * Cat-a-lot[ResourceLoader|rights=patrol|dependencies=mediawiki.util]|Cat-a-lot.js|Cat-a-lot.css * HotCat[ResourceLoader]|HotCat.js * newsectionbottom[ResourceLoader|skins=vector]|newsectionbottom.js * searchlang[ResourceLoader|rights=minoredit|skins=vector|dependencies=mediawiki.util]|searchlang.js * speed-deletion[ResourceLoader|dependencies=mediawiki.util|rights=rollback]|speed-deletion.js * wikEd[ResourceLoader]|wikEd.js * VE-wditem-input-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|VE-wditem-input-loader.js * auto-cite-shamela-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|auto-cite-shamela-loader.js == تصفح == * GreenRedirect[ResourceLoader|default|rights=minoredit]|GreenRedirect.css * HideExLinkIcon[default|rights=minoredit]|HideExLinkIcon.css * JSL[ResourceLoader]|JSL.js * Linkscount[ResourceLoader]|Linkscount.js * MobileCategories[ResourceLoader|dependencies=mediawiki.api,mediawiki.util|skins=minerva]|MobileCategories.js * ShortLink[ResourceLoader]|ShortLink.js * userinfo-without-deletedcontribs[ResourceLoader|dependencies=mediawiki.util]|userinfo-without-deletedcontribs.js * UTCLiveClock[ResourceLoader|dependencies=mediawiki.util]|UTCLiveClock.js * mobile-sidebar[ResourceLoader|skins=vector, vector-2022]|mobile-sidebar.js|mobile-sidebar.css * PagePreviews[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js * XTools-ArticleInfo [ResourceLoader |skins=vector, vector-2022, monobook, timeless] |XTools-ArticleInfo.js * Numeral_converter [ResourceLoader |dependencies=mediawiki.cookie, mediawiki.util, mediawiki.user] |Numeral_converter.js * Numeral-converter-toggle [ResourceLoader] |Numeral-converter-toggle.js |Numeral-converter-toggle.css 2rtbuo41mot5tzmh73cg79uuyk4jqvr 1089649 1089646 2026-04-26T21:12:17Z حبيشان 31560 1089649 wikitext text/x-wiki == مخفي == * Site [ResourceLoader |default |hidden |type=styles] |Site.css * VE-wditem-input[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|VE-wditem-input.js * auto-cite-shamela[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-shamela.js * auto-cite-wikidata[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-wikidata.js * countdown-timer[ResourceLoader|default|hidden|dependencies=mediawiki.language|categories=Gadget-Countdown]|countdown-timer.js == تحرير == * AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.Uri,mediawiki.user,mediawiki.api]|AjaxEdit.js * autocomplete[ResourceLoader|dependencies=mediawiki.util]|autocomplete.js * BiDiEditing[ResourceLoader]|BiDiEditing.js * Cat-a-lot[ResourceLoader|rights=patrol|dependencies=mediawiki.util]|Cat-a-lot.js|Cat-a-lot.css * HotCat[ResourceLoader]|HotCat.js * newsectionbottom[ResourceLoader|skins=vector]|newsectionbottom.js * searchlang[ResourceLoader|rights=minoredit|skins=vector|dependencies=mediawiki.util]|searchlang.js * speed-deletion[ResourceLoader|dependencies=mediawiki.util|rights=rollback]|speed-deletion.js * wikEd[ResourceLoader]|wikEd.js * VE-wditem-input-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|VE-wditem-input-loader.js * auto-cite-shamela-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|auto-cite-shamela-loader.js == تصفح == * GreenRedirect[ResourceLoader|default|rights=minoredit]|GreenRedirect.css * HideExLinkIcon[default|rights=minoredit]|HideExLinkIcon.css * JSL[ResourceLoader]|JSL.js * Linkscount[ResourceLoader]|Linkscount.js * MobileCategories[ResourceLoader|dependencies=mediawiki.api,mediawiki.util|skins=minerva]|MobileCategories.js * ShortLink[ResourceLoader]|ShortLink.js * userinfo-without-deletedcontribs[ResourceLoader|dependencies=mediawiki.util]|userinfo-without-deletedcontribs.js * UTCLiveClock[ResourceLoader|dependencies=mediawiki.util]|UTCLiveClock.js * mobile-sidebar[ResourceLoader|skins=vector, vector-2022]|mobile-sidebar.js|mobile-sidebar.css * PagePreviews[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js * XTools-ArticleInfo [ResourceLoader |skins=vector, vector-2022, monobook, timeless] |XTools-ArticleInfo.js * Numeral_converter [ResourceLoader |dependencies=mediawiki.cookie, mediawiki.util, mediawiki.user] |Numeral_converter.js * Numeral-converter-toggle [ResourceLoader] |Numeral-converter-toggle.js |Numeral-converter-toggle.css == تحت الاختبار== * auto-cite-wikidata-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|auto-cite-wikidata-loader.js no3nh6sxn8nb2af3dzxxovxqqz3n9uu 1089652 1089649 2026-04-26T21:34:26Z حبيشان 31560 ju]dg hgjpld 1089652 wikitext text/x-wiki == مخفي == * Site [ResourceLoader |default |hidden |type=styles] |Site.css * VE-wditem-input[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|VE-wditem-input.js * auto-cite-shamela[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-shamela.js * auto-cite-wikidata[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-wikidata.js * countdown-timer[ResourceLoader|default|hidden|dependencies=mediawiki.language|categories=Gadget-Countdown]|countdown-timer.js == تحرير == * AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.Uri,mediawiki.user,mediawiki.api]|AjaxEdit.js * autocomplete[ResourceLoader|dependencies=mediawiki.util]|autocomplete.js * BiDiEditing[ResourceLoader]|BiDiEditing.js * Cat-a-lot[ResourceLoader|rights=patrol|dependencies=mediawiki.util]|Cat-a-lot.js|Cat-a-lot.css * HotCat[ResourceLoader]|HotCat.js * newsectionbottom[ResourceLoader|skins=vector]|newsectionbottom.js * searchlang[ResourceLoader|rights=minoredit|skins=vector|dependencies=mediawiki.util]|searchlang.js * speed-deletion[ResourceLoader|dependencies=mediawiki.util|rights=rollback]|speed-deletion.js * wikEd[ResourceLoader]|wikEd.js * VE-wditem-input-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|VE-wditem-input-loader.js * auto-cite-shamela-loader[ResourceLoader|dependencies=ext.visualEditor.desktopArticleTarget.init]|auto-cite-shamela-loader.js == تصفح == * GreenRedirect[ResourceLoader|default|rights=minoredit]|GreenRedirect.css * HideExLinkIcon[default|rights=minoredit]|HideExLinkIcon.css * JSL[ResourceLoader]|JSL.js * Linkscount[ResourceLoader]|Linkscount.js * MobileCategories[ResourceLoader|dependencies=mediawiki.api,mediawiki.util|skins=minerva]|MobileCategories.js * ShortLink[ResourceLoader]|ShortLink.js * userinfo-without-deletedcontribs[ResourceLoader|dependencies=mediawiki.util]|userinfo-without-deletedcontribs.js * UTCLiveClock[ResourceLoader|dependencies=mediawiki.util]|UTCLiveClock.js * mobile-sidebar[ResourceLoader|skins=vector, vector-2022]|mobile-sidebar.js|mobile-sidebar.css * PagePreviews[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js * XTools-ArticleInfo [ResourceLoader |skins=vector, vector-2022, monobook, timeless] |XTools-ArticleInfo.js * Numeral_converter [ResourceLoader |dependencies=mediawiki.cookie, mediawiki.util, mediawiki.user] |Numeral_converter.js * Numeral-converter-toggle [ResourceLoader] |Numeral-converter-toggle.js |Numeral-converter-toggle.css == تحت-الاختبار== * auto-cite-wikidata-loader[ResourceLoader|dependencies=ext.visualEditor.targetLoader]|auto-cite-wikidata-loader.js otnb1h2og9uq5nb9jql9cafl2yv18hf 1089656 1089652 2026-04-26T21:48:59Z حبيشان 31560 استهداف الجوال 1089656 wikitext text/x-wiki == مخفي == * Site [ResourceLoader |default |hidden |type=styles] |Site.css * VE-wditem-input[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|VE-wditem-input.js * auto-cite-shamela[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-shamela.js * auto-cite-wikidata[ResourceLoader|hidden|dependencies=ext.visualEditor.core]|auto-cite-wikidata.js * countdown-timer[ResourceLoader|default|hidden|dependencies=mediawiki.language|categories=Gadget-Countdown]|countdown-timer.js == تحرير == * AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.Uri,mediawiki.user,mediawiki.api]|AjaxEdit.js * autocomplete[ResourceLoader|dependencies=mediawiki.util]|autocomplete.js * BiDiEditing[ResourceLoader]|BiDiEditing.js * Cat-a-lot[ResourceLoader|rights=patrol|dependencies=mediawiki.util]|Cat-a-lot.js|Cat-a-lot.css * HotCat[ResourceLoader]|HotCat.js * newsectionbottom[ResourceLoader|skins=vector]|newsectionbottom.js * searchlang[ResourceLoader|rights=minoredit|skins=vector|dependencies=mediawiki.util]|searchlang.js * speed-deletion[ResourceLoader|dependencies=mediawiki.util|rights=rollback]|speed-deletion.js * wikEd[ResourceLoader]|wikEd.js * VE-wditem-input-loader[ResourceLoader|dependencies=ext.visualEditor.targetLoader]|VE-wditem-input-loader.js * auto-cite-shamela-loader[ResourceLoader|dependencies=ext.visualEditor.targetLoader]|auto-cite-shamela-loader.js == تصفح == * GreenRedirect[ResourceLoader|default|rights=minoredit]|GreenRedirect.css * HideExLinkIcon[default|rights=minoredit]|HideExLinkIcon.css * JSL[ResourceLoader]|JSL.js * Linkscount[ResourceLoader]|Linkscount.js * MobileCategories[ResourceLoader|dependencies=mediawiki.api,mediawiki.util|skins=minerva]|MobileCategories.js * ShortLink[ResourceLoader]|ShortLink.js * userinfo-without-deletedcontribs[ResourceLoader|dependencies=mediawiki.util]|userinfo-without-deletedcontribs.js * UTCLiveClock[ResourceLoader|dependencies=mediawiki.util]|UTCLiveClock.js * mobile-sidebar[ResourceLoader|skins=vector, vector-2022]|mobile-sidebar.js|mobile-sidebar.css * PagePreviews[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js * XTools-ArticleInfo [ResourceLoader |skins=vector, vector-2022, monobook, timeless] |XTools-ArticleInfo.js * Numeral_converter [ResourceLoader |dependencies=mediawiki.cookie, mediawiki.util, mediawiki.user] |Numeral_converter.js * Numeral-converter-toggle [ResourceLoader] |Numeral-converter-toggle.js |Numeral-converter-toggle.css == تحت-الاختبار== * auto-cite-wikidata-loader[ResourceLoader|dependencies=ext.visualEditor.targetLoader]|auto-cite-wikidata-loader.js gd26l04uusuzru31nsnzd5oz0tzyx6c مستخدم:حبيشان/common.js 2 230726 1089645 1059474 2026-04-26T20:31:58Z حبيشان 31560 1089645 javascript text/javascript mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/wiktionary2025.js&action=raw&ctype=text/javascript'); mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/auto-cite-shamela.js&action=raw&ctype=text/javascript'); mw.loader.getState('ext.gadget.summaryButtons') ? mw.loader.load('ext.gadget.summaryButtons') : mw.loader.load('https://ar.wikipedia.org/w/load.php?debug=false&modules=ext.gadget.summaryButtons'); mw.libs.ve.addPlugin( 'ext.gadget.auto-cite-wikidata' ); // إضافة أزرار ملخصات التعديل mw.hook('summaryButtons').add(function () { addSummaryButton('تهذيب', 'تهذيب'); addSummaryButton('قوالب صيانة', 'قوالب صيانة'); addSummaryButton('توثيق', 'توثيق'); addSummaryButton('داكن', 'توافق مع الوضع الداكن'); addSummaryButton('إصلاح', 'إصلاح قوالب'); addSummaryButton('تحديث', 'تحديث قوالب'); }); f644wcok7wdqlmd7zz88a08grylqq17 1089647 1089645 2026-04-26T20:49:41Z حبيشان 31560 1089647 javascript text/javascript mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/wiktionary2025.js&action=raw&ctype=text/javascript'); mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/auto-cite-shamela.js&action=raw&ctype=text/javascript'); mw.loader.getState('ext.gadget.summaryButtons') ? mw.loader.load('ext.gadget.summaryButtons') : mw.loader.load('https://ar.wikipedia.org/w/load.php?debug=false&modules=ext.gadget.summaryButtons'); mw.loader.using( 'ext.visualEditor.targetLoader', () => { // Register plugins to VE. Will be loaded once the user opens VE mw.libs.ve.targetLoader.addPlugin( 'ext.gadget.auto-cite-wikidata' ); } ); // إضافة أزرار ملخصات التعديل mw.hook('summaryButtons').add(function () { addSummaryButton('تهذيب', 'تهذيب'); addSummaryButton('قوالب صيانة', 'قوالب صيانة'); addSummaryButton('توثيق', 'توثيق'); addSummaryButton('داكن', 'توافق مع الوضع الداكن'); addSummaryButton('إصلاح', 'إصلاح قوالب'); addSummaryButton('تحديث', 'تحديث قوالب'); }); dokug9ws3kn2cuc8g97uhj1srk9u9kl 1089650 1089647 2026-04-26T21:13:02Z حبيشان 31560 1089650 javascript text/javascript mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/wiktionary2025.js&action=raw&ctype=text/javascript'); mw.loader.load('https://ar.wiktionary.org/w/index.php?title=%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86/auto-cite-shamela.js&action=raw&ctype=text/javascript'); mw.loader.getState('ext.gadget.summaryButtons') ? mw.loader.load('ext.gadget.summaryButtons') : mw.loader.load('https://ar.wikipedia.org/w/load.php?debug=false&modules=ext.gadget.summaryButtons'); // mw.loader.using( 'ext.visualEditor.targetLoader', () => { // // Register plugins to VE. Will be loaded once the user opens VE // mw.libs.ve.targetLoader.addPlugin( 'ext.gadget.auto-cite-wikidata' ); // } ); // إضافة أزرار ملخصات التعديل mw.hook('summaryButtons').add(function () { addSummaryButton('تهذيب', 'تهذيب'); addSummaryButton('قوالب صيانة', 'قوالب صيانة'); addSummaryButton('توثيق', 'توثيق'); addSummaryButton('داكن', 'توافق مع الوضع الداكن'); addSummaryButton('إصلاح', 'إصلاح قوالب'); addSummaryButton('تحديث', 'تحديث قوالب'); }); 2k5qi2hlip6fn8w3uczhnbq77cug4i7 ميدياويكي:Gadget-VE-wditem-input-loader.js 8 231295 1089654 1003855 2026-04-26T21:47:28Z حبيشان 31560 استهداف الجوال ايضا 1089654 javascript text/javascript mw.libs.ve.targetLoader.addPlugin( 'ext.gadget.VE-wditem-input' ); agzc2mayklb2cj9saa9cvte08wkprkh ميدياويكي:Gadget-auto-cite-shamela-loader.js 8 231297 1089655 1003859 2026-04-26T21:48:26Z حبيشان 31560 استهداف الجوال أيضا 1089655 javascript text/javascript mw.libs.ve.targetLoader.addPlugin( 'ext.gadget.auto-cite-shamela' ); l9m09thuuz3y476f8l44w5b5r2mgxta ميدياويكي:Gadget-auto-cite-wikidata.js 8 237533 1089644 2026-04-26T20:29:55Z حبيشان 31560 إضافة تحت الاختبار 1089644 javascript text/javascript /** * Auto Cite WikiData * * الاستشهاد الآلي بالويكي بيانات * version 2.0.0 * كتبها: حبيشان * by [[:ar:User:حبيشان]] * * تتطلب [[:ar:Module:Cite Shamela]] [[:ar:Module:Cite Shamela/data.json]] [[:ar:قالب:استشهاد بالشاملة]] * */ mw.hook('ve.activationComplete').add(function () { ve.ui.CitoidInspector.prototype._performLookup = ve.ui.CitoidInspector.prototype.performLookup; ve.ui.CitoidInspector.prototype.performLookup = function () { const inspector = this; const gadgetAgent = 'AutoCiteWikiData/2.0.0'; // Common case: pasting a URI into this field. Citoid expects // minimally encoded input, so do some speculative decoding here to // avoid 404 fetches. T146539 const realsearch = inspector.lookupInput.getValue(); const isURI = /^(https?):/.test(realsearch); const search = ve.safeDecodeURIComponent( realsearch ); let isShamelaTxt, KID, isCommonsFile,isArchive, isShamela, searchUrl; if (!isURI) { isShamelaTxt = /^«[^»]+» \((ص)?[0-9 \/]+([^0-9]+)?\)/.test(search); KID = detectIdentifier(realsearch); // preliminary check if (!isShamelaTxt && !KID) { return inspector._performLookup(); } } else { KID = detectIDFromURL(search); searchUrl = new URL(search); isCommonsFile = isWikimediaFile(searchUrl); isShamela = /shamela\.ws|app\.turath\.io/.test(searchUrl.hostname.toLowerCase()); isArchive = /archive\.org\/details/.test(search); } // TODO: Add caching for requested urls if (inspector.lookupPromise) { // Abort existing lookup inspector.lookupPromise.abort(); inspector.lookupPromise = null; inspector.lookupInput.popPending(); } // Set as pending inspector.lookupButton.setDisabled(true); inspector.lookupInput.setDisabled(true).pushPending(); function isWikimediaFile(url) { try { const wikimediaRegex = /^(.*\.)?(wikipedia|wiktionary|wikiquote|wikibooks|wikisource|wikinews|wikiversity|wikidata|wikivoyage|wikimedia|wikimediafoundation)\.org$/; const titleFileRegex = /^(file|ملف|fichier|archivo|پرونده|dosya):/i; const pathnameFileRegex = /^\/wiki\/(file|ملف|fichier|archivo|پرونده|dosya):/i; if (wikimediaRegex.test(url.hostname.toLowerCase())) { if ((url.searchParams('title') && titleFileRegex.test(url.searchParams.get('title').toLowerCase())) || pathnameFileRegex.test(url.pathname.toLowerCase())) { return true; } } return false; } catch (e) { return false; } } function detectIdentifier(input) { if (!input) return null; let str = input.trim(); // Normalize common URL forms str = str.replace(/^https?:\/\/(dx\.)?doi\.org\//i, ''); str = str.replace(/^https?:\/\/arxiv\.org\/(abs|pdf)\//i, ''); str = str.replace(/\.pdf$/i, ''); const clean = str.replace(/[\s-]/g, ''); // DOI (very flexible but must start with 10.) const doiRegex = /^10\.\d{4,9}\/\S+$/i; // arXiv (new and old formats) const arxivRegex = /^(\d{4}\.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7})(v\d+)?$/i; // const arxivOldRegex = /^[a-z\-]+(\/\d{7})(v\d+)?$/i; // PMID (digits only, typically 1–8+ digits) // const pmidRegex = /^\d{1,8}$/; // ISBN-10 or ISBN-13 const isbnRegex = /^97[89]\d{10}$/; const isbn10Regex = /^\d{9}[\dXx]$/; if (doiRegex.test(str)) { return { P: 'P356', type: 'DOI', id: [str] }; } if (arxivRegex.test(str) ) { return { P:'P818', type: 'arXiv', id: [str] }; } if (isbnRegex.test(clean)) { return { P:'P212', type: 'ISBN', id: [str] }; } if (isbn10Regex.test(clean)) { return { P:'P957', type: 'ISBN-10', id: [str] }; } // if (pmidRegex.test(clean)) { // return { type: 'PMID', value: clean }; // } return null; } function detectIDFromURL(url) { const ids = [ // { P: 'P356', type: 'DOI', }, { P: 'P818', type: 'arXiv', regex: /^https?:\/\/(?:([^.]+\.))?(?:arxiv\.org|xxx\.lanl\.gov)\/(?:pdf|abs)\/(?<id2>(?<id>(?:\d{4}\.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7}))(?:v\d+)?)(?:\.pdf)?/i }, { P: 'P819', type: 'bibcode', regex: /^https?:\/\/ui\.adsabs\.harvard\.edu\/abs\/(?<id>\d{4}[A-Za-z\.\&]{5}[\w\.]{4}[ELPQ-Z\.][\d\.]{4}[A-Z])(?:\/abstract)?/i }, { P: 'P3951', type: 'biorxiv', regex: /^https?:\/\/(?:www\.)?biorxiv\.org\/(?:content\/)?(?<dio>10\.1101\/(?<id>(?:\d{4}\.\d{2}\.\d{2}\.)?\d{6}))(?:v\d+)?(?:\.full)?(?:\.pdf)?/i }, { P: 'P894', type: 'zbMATH', regex: /^https?:\/\/zbmath\.org\/(?:\?(?:format=complete&)?(?:q=an:))?(?<id>[\d\.]+)/i }, { P: 'P888', type: 'jstor', regex: /^https?:\/\/(?:www\.)?jstor\.org\/(?:stable\/)?(?<id>[a-z0-9.\-_/]+)/i, doipre: '10.2307/' }, { P: 'P7896', type: 'Academia', regex: /^https?:\/\/(?:www\.)?academia\.edu\/(?:\w+\/)?(?<id>\d+)/i }, { P: 'P12914', type: 'mandumah', regex: /^https?:\/\/(?:search\.)?mandumah\.com\/(?:Record\/|Download\?file=[^#\?&]+&id=)(?<id>\d+)/i }, { P: 'P14250', type: 'eMarefa', regex: /^https?:\/\/(?:search\-emarefa\-net\.wikipedialibrary\.idm\.oclc\.org|search\.emarefa\.net)\/(?:ar|en)\/(?:detail|viewer)\/BIM\-(?<id>\d+)/i }, { P: 'P889', type: 'mathscinet', regex: /^https?:\/\/mathscinet\.ams\.org\/mathscinet(?:-getitem|\/relay-station)\?mr=(?<id>[1-9]\d{1,6})/i }, { P: 'P243', type: 'oclc', regex: /^https?:\/\/search\.worldcat\.org\/title\/(?<id>\d+)/i }, { P: 'P648', type: 'openlibrary', regex: /^https?:\/\/openlibrary\.org\/works\/(?<id>[^\/]+)/i }, { P: 'P3894', type: 'osti', regex: /^https?:\/\/www\.osti\.gov\/biblio\/(?<id>\d+)/i }, { P: 'P932', type: 'PMC', regex: /^https?:\/\/pmc\.ncbi\.nlm\.nih\.gov\/articles\/PMC(?<id>\d+)/i }, { P: 'P698', type: 'PubMed', regex: /^https?:\/\/pubmed\.ncbi\.nlm\.nih\.gov\/(?<id>\d+)/i }, { P: 'P892', type: 'rfc', regex: /^https?:\/\/datatracker\.ietf\.org\/doc\/html\/rfc(?<id>\d+)/i }, { P: 'P893', type: 'ssrn', regex: /^https?:\/\/(?:(?:papers\.)?ssrn\.com\/(?:sol3\/papers\.cfm\?abstract_id|abstract)|download\.ssrn\.com\/[^\s]+&abstractId)=(?<id>\d+)$/i }, { P: 'P4011', type: 's2pid', regex: /^https?:\/\/(?:www\.)?semanticscholar\.org\/paper(?:\/[^\s\/]+)?\/(?<id>[a-f0-9]{40})$/i }, { P: 'P675', type: 'Google Books', regex: /^https?:\/\/(?:books\.google\.com\/books\?id=|www.google.com\/books\/edition\/[^\s\/]+\/)(?<id>[0-9A-Za-z_\-]{12})(?:\?hl=[a-z]+&gbpv=(?<vol>\d+))?/i }, { P: 'P5875', type: 'ResearchGate', regex: /^https?:\/\/(?:www\.)?researchgate\.net\/publication\/([1-9]\d*)(?:_[\w\-\_']+)?/i }, // { type: 'PMID' } ]; for (const idType of ids) { if (idType.regex) { const match = url.match(idType.regex); if (match) { let ret = { P: idType.P, type: idType.type , url: url}; for (const [name, value] of Object.entries(match.groups || {})) { if (value!==undefined) ret[name] = value; } if (idType.doipre && ret.id) { ret.doi = idType.doipre + ret.id; } return ret; } } } return null; } // fetch shamela data function fetch_shamela(search, qid = null) { let txt = "" if (!qid) { txt += "{{استشهاد بالشاملة|" + search.replace("=", "{{=}}") + "|expand=json}}" } else { for (let i = 0; i < qid.length; i++) { txt += "{{استشهاد بالشاملة|" + search.replace("=", "{{=}}") + `|qid=${qid[i]}` + "|expand=json}}"; if (i < qid.length - 1) { txt += ","; } } } let params = { action: "expandtemplates", text: txt, prop: "wikitext", format: "json" } return new mw.Api({ userAgent: gadgetAgent }).get(params); } // fetch shamela data async function refetch_shamela(rData) { try { // Extract book_id from URL var book_id = search.match(/https:\/\/(shamela.ws|app.turath.io)\/book\/([0-9]+)/)[2]; // Get QIDs from wikidata var Qids = await getQID("P12239", book_id); if (Qids.length > 0) { // Refetch with the QID var retryResults = await fetch_shamela(search, Qids); return JSON.parse('[' + retryResults.expandtemplates.wikitext + ']'); } } catch (error) { console.error('Error in enhanced error handling:', error); } return rData; } // Get QID from wikidata async function getQID(Pid, val, doi) { const searchValue = Array.isArray(val) ? 'haswbstatement:' + val.map(v => `${Pid}=${v}`).join('|') : `haswbstatement:${Pid}=${val}`; if (doi) { searchValue += `|P356=${doi}`; } let data = await (new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent })).get({ action: 'query', list: 'search', srsearch: searchValue, format: "json" }); if (data.query && Array.isArray(data.query.search) && data.query.search.length > 0) { return data.query.search.map(item => item.title); } return []; } // get volume data from wikidata async function getVolumeData(Qid, volurl, Pid = 'P953') { const resp = await wdapi.get({ action: 'wbgetentities', ids: Qid, props: 'claims', format: 'json' }); const entity = resp && resp.entities && resp.entities[Qid]; const claims = (entity && entity.claims) || {}; volcount = claims['P2635'] && claims['P2635'][0].mainsnak && claims['P2635'][0].mainsnak.datavalue ? parseInt(claims['P2635'][0].mainsnak.datavalue.value.amount) : null; wdvols = (claims[Pid] || []).map(s => { let wdurl = s.mainsnak && s.mainsnak.datavalue && s.mainsnak.datavalue.value; if (wdurl.indexOf(volurl) === 0 && s.qualifiers) { let qvol = s.qualifiers['P478'] && s.qualifiers['P478'][0].datavalue && s.qualifiers['P478'][0].datavalue.value ? s.qualifiers['P478'][0].datavalue.value : null; let qpageoffest = s.qualifiers['P8330'] && s.qualifiers['P8330'][0].datavalue && s.qualifiers['P8330'][0].datavalue.value ? parseInt(s.qualifiers['P8330'][0].datavalue.value.amount) : 0; return { vol: qvol, pageoffset: qpageoffest, volcount: volcount }; } return null; }).filter(v => v !== null); return wdvols.length > 0 ? wdvols[0] : {}; } // create template object function createTemplate(args) { const paramsObj = {}; for (const k in args) { if (Object.prototype.hasOwnProperty.call(args, k)) { paramsObj[k] = { wt: String(args[k]) }; } } return { template: { target: { href: "Template:استشهاد بويكي بيانات", wt: "استشهاد بويكي بيانات" }, params: paramsObj } }; } // fetch archive data async function fetch_archive(search) { const regex = /^https?:\/\/archive.org\/details\/([^\/]+)(?:\/([^\/]+))?(?:\/page\/([^\/]+))?(?:\/mode\/([12])up)?$/ const m = search.match(regex) const wdapi = new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent }); if (!m) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } const identifier = m[1]; const vol = m[2] || null; const page = m[3] || null; const mode = parseInt(m[4]) || 1; const parseArabicNum = str => parseInt(str.replace(/[٠-٩۰-۹]/g, d => d.charCodeAt(0) & 15 )); return getQID("P724", identifier).then(async Qids => { if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { const qid = Qids[i]; let args = { 'qid': qid, 'المسار': realsearch }; let wdpageoffset = 0; if (vol || (page && page.startsWith('n'))) { let volurl = realsearch.replace(/(?:\/page\/[^\/ ]+)?(?:\/mode\/[12]up)/, ''); wdvoldata = await getVolumeData(Qid, volurl); let wdvol = wdvoldata.vol ?? null; wdpageoffset = wdvoldata.pageoffset ?? 0; const volcount = wdvoldata.volcount ?? null; if (vol && !wdvol && volcount && volcount > 1) { let intvol = parseInt(vol); if (!intvol) { let mvol = vol.match(/^\d+/); intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null if (!intvol) { mvol = vol.match(/\d+$/); intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null } } wdvol = intvol === 0 && vol.match(/p$/) ? 'المقدمة' : intvol ? intvol : vol; } if (wdvol) args['ج'] = wdvol; } if (page) { args['ص'] = (page.startsWith('n') && page.length > 1 ) ? (parseInt(page.substring(1)) + 1 - wdpageoffset) : parseArabicNum(page) || page; } ret.push(createTemplate(args)); if (mode === 2) { args['ص'] = args['ص'] ? (parseInt(args['ص']) + 1).toString() : '2'; ret.push(createTemplate(args)); } } return ret; }); } // fetch commons file data async function fetch_commons_file(search) { const url = new URL(search); const host = url.hostname.toLowerCase(); // const common_file= url. // const regex = /^https?:\/\/(*\.)?wiki\/([^\/]+)(?:\/([^\/]+))?(?:\/page\/([^\/]+))?(?:\/mode\/([12])up)?$/ // const m = search.match(regex) // console.log("AutoCiteWikidata: Detected archive.org URL with matches:", m); // const wdapi = new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent }); // if (!m) { // return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; // } // const identifier = m[1]; // const vol = m[2] || null; // const page = m[3] || null; // const mode = parseInt(m[4]) || 1; // const parseArabicNum = str => parseInt(str.replace(/[٠-٩۰-۹]/g, d => // d.charCodeAt(0) & 15 // )); // return getQID("P724", identifier).then(async Qids => { // if (Qids.length == 0) { // return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; // } // let ret = []; // for (let i = 0; i < Qids.length; i++) { // const qid = Qids[i]; // let args = { 'qid': qid, 'المسار': realsearch }; // let wdpageoffset = 0; // if (vol || (page && page.startsWith('n'))) { // let volurl = realsearch.replace(/(?:\/page\/[^\/ ]+)?(?:\/mode\/[12]up)/, ''); // wdvoldata = await getVolumeData(Qid, volurl); // let wdvol = wdvoldata.vol ?? null; // wdpageoffset = wdvoldata.pageoffset ?? 0; // const volcount = wdvoldata.volcount ?? null; // console.log("Selected Wikidata volume:", wdvol, "with page offset:", wdpageoffset," vol count:",volcount); // if (vol && !wdvol && volcount && volcount > 1) { // let intvol = parseInt(vol); // if (!intvol) { // let mvol = vol.match(/^\d+/); // intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null // if (!intvol) { // mvol = vol.match(/\d+$/); // intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null // } // } // wdvol = intvol === 0 && vol.match(/p$/) ? 'المقدمة' : intvol ? intvol : vol; // } // if (wdvol) args['ج'] = wdvol; // } // if (page) { // args['ص'] = (page.startsWith('n') && page.length > 1 ) ? (parseInt(page.substring(1)) + 1 - wdpageoffset) : parseArabicNum(page) || page; // } // ret.push(createTemplate(args)); // if (mode === 2) { // args['ص'] = args['ص'] ? (parseInt(args['ص']) + 1).toString() : '2'; // ret.push(createTemplate(args)); // } // } // return ret; // }); } // We have to first set up a get response so we can have // a proper xhr object with "abort" method, so we can // hand off this abort method to the jquery promise let citoidXhr, citoidRequest; if (KID) { let KIDids = KID.id2 ? [KID.id, KID.id2] : [KID.id]; citoidRequest = getQID(KID.P, KIDids, KID.doi).then(async Qids => { if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] }; if (KID.url !== undefined) args.url = KID.url; if (KID.vol !== undefined) args.vol = KID.vol; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } else if (isArchive) { citoidRequest = fetch_archive(search); citoidXhr = citoidRequest; } else if (isShamela || isShamelaTxt) { citoidRequest = fetch_shamela(search); citoidXhr = citoidRequest.then(function (data) { let rData = JSON.parse("[" + data.expandtemplates.wikitext + "]"); if (rData[0].error && rData[0].error == "لم يعثر على بيانات الكتاب في ويكي بيانات" && /https:\/\/(shamela.ws|app.turath.io)\/book\//.test(search)) { return refetch_shamela(rData); } return rData; }); } else if (isCommonsFile) { citoidRequest = getQID('P953', realsearch).then(async Qids => { console.log("AutoCiteWikidata: Retrieved QIDs from Wikidata:", Qids); if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] , 'المسار': realsearch }; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } else if (isURI) { citoidRequest = getQID('P953', realsearch).then(async Qids => { console.log("AutoCiteWikidata: Retrieved QIDs from Wikidata:", Qids); if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] , 'المسار': realsearch, }; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } // Ensure compatibility: if `citoidXhr` is a native Promise, wrap it // into a jQuery-compatible promise so callers can use `.always()` and // `.promise({ abort: ... })` like the original code expects. let jqCitoidXhr; if (citoidXhr && typeof citoidXhr.always === 'function' && typeof citoidXhr.promise === 'function') { jqCitoidXhr = citoidXhr; } else { const deferred = $.Deferred(); // Bridge native promise to jQuery Deferred if (citoidXhr && typeof citoidXhr.then === 'function') { citoidXhr.then(function (res) { deferred.resolve(res); }, function (err) { deferred.reject(err); }); } else { // If it's not thenable, resolve immediately with the value deferred.resolve(citoidXhr); } jqCitoidXhr = deferred.promise(); } inspector.lookupPromise = jqCitoidXhr .then( // Success function (rData) { // Normal template building logic (for both original success and retry success) if (Array.isArray(rData) && rData.length === 0) { console.log("AutoCiteWikidata: No data found"); return inspector._performLookup(); } else if (rData[0].error) { console.log("AutoCiteWikidata: Error - " + rData[0].error); mw.notify(rData[0].error, { title: 'استشهاد آلي', type: 'error' }); return inspector._performLookup(); } else { // buildTemplateResults const renderPromises = [], partPromises = []; rData.forEach((citation) => { const templateName = citation.template.target.wt; const transclusionModel = new ve.dm.MWTransclusionModel(); const result = { templateName: templateName, template: ve.dm.MWTemplateModel.newFromName(transclusionModel, templateName), // source: ['Wikidata'], transclusionModel: transclusionModel }; inspector.results.push(result); partPromises.push( result.transclusionModel.addPart(result.template) .then(function () { for (let param in citation.template.params) { result.template.addParameter( new ve.dm.MWParameterModel( result.template, param, citation.template.params[param].wt ) ); }; }) ); }); return ve.promiseAll(partPromises) .then(() => { const sources = [], optionWidgets = []; // Create option widgets inspector.results.forEach((result, i) => { const refWidget = new ve.ui.CitoidReferenceWidget( inspector.getFragment().getSurface().getDocument(), result.transclusionModel, { data: i, templateName: result.templateName, citeTools: ve.ui.mwCitationTools }); const template = result.template; // T92428: Ignore empty templates if (ve.isEmptyObject(template.getParameters())) { return; } // sources.push(result.source); // source may be undefined or Array of strings optionWidgets.push(refWidget); renderPromises.push(refWidget.getRenderPromise()); }); if (optionWidgets.length > 0) { // Add citations to the select widget inspector.previewSelectWidget.addItems(optionWidgets); return ve.promiseAll(renderPromises).then(() => { inspector.setModePanel('auto', 'result', false, {}); }, () => { inspector.lookupFailed(); return $.Deferred().resolve(); }); } // failed, so go back return $.Deferred().reject(); }); // End buildTemplateResults } }, // Fail (type, response) => { if (response && response.textStatus === 'abort') { return $.Deferred().reject(); } inspector.lookupFailed(); // Restore focus to the input field. // Definitely don't do this on success and focusing a hidden input causes jQuery // to prevent it from being focused the next time the inspector is opened (T285626) inspector.lookupInput .setDisabled(false).focus(); return $.Deferred().resolve(); }) .always(() => { inspector.lookupInput .setDisabled(false) .popPending(); inspector.lookupButton.setDisabled(false); }) .promise({ abort: () => { if (citoidRequest && citoidRequest.abort) { citoidRequest.abort(); } if (citoidXhr && citoidXhr.abort) { citoidXhr.abort(); } } }); return inspector.lookupPromise; }; }); hapjl3lq37w0rrkq0yvec7yf2sdbfjl 1089651 1089644 2026-04-26T21:16:39Z حبيشان 31560 تصحيحات 1089651 javascript text/javascript /** * Auto Cite WikiData * * الاستشهاد الآلي بالويكي بيانات * version 2.0.0 * كتبها: حبيشان * by [[:ar:User:حبيشان]] * * تتطلب [[:ar:Module:Cite Shamela]] [[:ar:Module:Cite Shamela/data.json]] [[:ar:قالب:استشهاد بالشاملة]] * */ mw.hook('ve.activationComplete').add(function () { ve.ui.CitoidInspector.prototype._performLookup = ve.ui.CitoidInspector.prototype.performLookup; ve.ui.CitoidInspector.prototype.performLookup = function () { const inspector = this; const gadgetAgent = 'AutoCiteWikiData/2.0.0'; // Common case: pasting a URI into this field. Citoid expects // minimally encoded input, so do some speculative decoding here to // avoid 404 fetches. T146539 const realsearch = inspector.lookupInput.getValue(); const isURI = /^(https?):/.test(realsearch); const search = ve.safeDecodeURIComponent( realsearch ); let isShamelaTxt, KID, isCommonsFile,isArchive, isShamela, searchUrl; if (!isURI) { isShamelaTxt = /^«[^»]+» \((ص)?[0-9 \/]+([^0-9]+)?\)/.test(search); KID = detectIdentifier(realsearch); // preliminary check if (!isShamelaTxt && !KID) { return inspector._performLookup(); } } else { KID = detectIDFromURL(search); searchUrl = new URL(search); isCommonsFile = isWikimediaFile(searchUrl); isShamela = /shamela\.ws|app\.turath\.io/.test(searchUrl.hostname.toLowerCase()); isArchive = /archive\.org\/details/.test(search); } // TODO: Add caching for requested urls if (inspector.lookupPromise) { // Abort existing lookup inspector.lookupPromise.abort(); inspector.lookupPromise = null; inspector.lookupInput.popPending(); } // Set as pending inspector.lookupButton.setDisabled(true); inspector.lookupInput.setDisabled(true).pushPending(); function isWikimediaFile(url) { try { const wikimediaRegex = /^(.*\.)?(wikipedia|wiktionary|wikiquote|wikibooks|wikisource|wikinews|wikiversity|wikidata|wikivoyage|wikimedia|wikimediafoundation)\.org$/; const titleFileRegex = /^(file|ملف|fichier|archivo|پرونده|dosya):/i; const pathnameFileRegex = /^\/wiki\/(file|ملف|fichier|archivo|پرونده|dosya):/i; if (wikimediaRegex.test(url.hostname.toLowerCase())) { if ((url.searchParams('title') && titleFileRegex.test(url.searchParams.get('title').toLowerCase())) || pathnameFileRegex.test(url.pathname.toLowerCase())) { return true; } } return false; } catch (e) { return false; } } function detectIdentifier(input) { if (!input) return null; let str = input.trim(); // Normalize common URL forms str = str.replace(/^https?:\/\/(dx\.)?doi\.org\//i, ''); str = str.replace(/^https?:\/\/arxiv\.org\/(abs|pdf)\//i, ''); str = str.replace(/\.pdf$/i, ''); const clean = str.replace(/[\s-]/g, ''); // DOI (very flexible but must start with 10.) const doiRegex = /^10\.\d{4,9}\/\S+$/i; // arXiv (new and old formats) const arxivRegex = /^(\d{4}\.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7})(v\d+)?$/i; // const arxivOldRegex = /^[a-z\-]+(\/\d{7})(v\d+)?$/i; // PMID (digits only, typically 1–8+ digits) // const pmidRegex = /^\d{1,8}$/; // ISBN-10 or ISBN-13 const isbnRegex = /^97[89]\d{10}$/; const isbn10Regex = /^\d{9}[\dXx]$/; if (doiRegex.test(str)) { return { P: 'P356', type: 'DOI', id: [str] }; } if (arxivRegex.test(str) ) { return { P:'P818', type: 'arXiv', id: [str] }; } if (isbnRegex.test(clean)) { return { P:'P212', type: 'ISBN', id: [str] }; } if (isbn10Regex.test(clean)) { return { P:'P957', type: 'ISBN-10', id: [str] }; } // if (pmidRegex.test(clean)) { // return { type: 'PMID', value: clean }; // } return null; } function detectIDFromURL(url) { const ids = [ // { P: 'P356', type: 'DOI', }, { P: 'P818', type: 'arXiv', regex: /^https?:\/\/(?:([^.]+\.))?(?:arxiv\.org|xxx\.lanl\.gov)\/(?:pdf|abs)\/(?<id2>(?<id>(?:\d{4}\.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7}))(?:v\d+)?)(?:\.pdf)?/i }, { P: 'P819', type: 'bibcode', regex: /^https?:\/\/ui\.adsabs\.harvard\.edu\/abs\/(?<id>\d{4}[A-Za-z\.\&]{5}[\w\.]{4}[ELPQ-Z\.][\d\.]{4}[A-Z])(?:\/abstract)?/i }, { P: 'P3951', type: 'biorxiv', regex: /^https?:\/\/(?:www\.)?biorxiv\.org\/(?:content\/)?(?<dio>10\.1101\/(?<id>(?:\d{4}\.\d{2}\.\d{2}\.)?\d{6}))(?:v\d+)?(?:\.full)?(?:\.pdf)?/i }, { P: 'P894', type: 'zbMATH', regex: /^https?:\/\/zbmath\.org\/(?:\?(?:format=complete&)?(?:q=an:))?(?<id>[\d\.]+)/i }, { P: 'P888', type: 'jstor', regex: /^https?:\/\/(?:www\.)?jstor\.org\/(?:stable\/)?(?<id>[a-z0-9.\-_/]+)/i, doipre: '10.2307/' }, { P: 'P7896', type: 'Academia', regex: /^https?:\/\/(?:www\.)?academia\.edu\/(?:\w+\/)?(?<id>\d+)/i }, { P: 'P12914', type: 'mandumah', regex: /^https?:\/\/(?:search\.)?mandumah\.com\/(?:Record\/|Download\?file=[^#\?&]+&id=)(?<id>\d+)/i }, { P: 'P14250', type: 'eMarefa', regex: /^https?:\/\/(?:search\-emarefa\-net\.wikipedialibrary\.idm\.oclc\.org|search\.emarefa\.net)\/(?:ar|en)\/(?:detail|viewer)\/BIM\-(?<id>\d+)/i }, { P: 'P889', type: 'mathscinet', regex: /^https?:\/\/mathscinet\.ams\.org\/mathscinet(?:-getitem|\/relay-station)\?mr=(?<id>[1-9]\d{1,6})/i }, { P: 'P243', type: 'oclc', regex: /^https?:\/\/search\.worldcat\.org\/title\/(?<id>\d+)/i }, { P: 'P648', type: 'openlibrary', regex: /^https?:\/\/openlibrary\.org\/works\/(?<id>[^\/]+)/i }, { P: 'P3894', type: 'osti', regex: /^https?:\/\/www\.osti\.gov\/biblio\/(?<id>\d+)/i }, { P: 'P932', type: 'PMC', regex: /^https?:\/\/pmc\.ncbi\.nlm\.nih\.gov\/articles\/PMC(?<id>\d+)/i }, { P: 'P698', type: 'PubMed', regex: /^https?:\/\/pubmed\.ncbi\.nlm\.nih\.gov\/(?<id>\d+)/i }, { P: 'P892', type: 'rfc', regex: /^https?:\/\/datatracker\.ietf\.org\/doc\/html\/rfc(?<id>\d+)/i }, { P: 'P893', type: 'ssrn', regex: /^https?:\/\/(?:(?:papers\.)?ssrn\.com\/(?:sol3\/papers\.cfm\?abstract_id|abstract)|download\.ssrn\.com\/[^\s]+&abstractId)=(?<id>\d+)$/i }, { P: 'P4011', type: 's2pid', regex: /^https?:\/\/(?:www\.)?semanticscholar\.org\/paper(?:\/[^\s\/]+)?\/(?<id>[a-f0-9]{40})$/i }, { P: 'P675', type: 'Google Books', regex: /^https?:\/\/(?:books\.google\.com\/books\?id=|www.google.com\/books\/edition\/[^\s\/]+\/)(?<id>[0-9A-Za-z_\-]{12})(?:\?hl=[a-z]+&gbpv=(?<vol>\d+))?/i }, { P: 'P5875', type: 'ResearchGate', regex: /^https?:\/\/(?:www\.)?researchgate\.net\/publication\/([1-9]\d*)(?:_[\w\-\_']+)?/i }, // { type: 'PMID' } ]; for (const idType of ids) { if (idType.regex) { const match = url.match(idType.regex); if (match) { let ret = { P: idType.P, type: idType.type , url: url}; for (const [name, value] of Object.entries(match.groups || {})) { if (value!==undefined) ret[name] = value; } if (idType.doipre && ret.id) { ret.doi = idType.doipre + ret.id; } return ret; } } } return null; } // fetch shamela data function fetch_shamela(search, qid = null) { let txt = "" if (!qid) { txt += "{{استشهاد بالشاملة|" + search.replace("=", "{{=}}") + "|expand=json}}" } else { for (let i = 0; i < qid.length; i++) { txt += "{{استشهاد بالشاملة|" + search.replace("=", "{{=}}") + `|qid=${qid[i]}` + "|expand=json}}"; if (i < qid.length - 1) { txt += ","; } } } let params = { action: "expandtemplates", text: txt, prop: "wikitext", format: "json" } return new mw.Api({ userAgent: gadgetAgent }).get(params); } // fetch shamela data async function refetch_shamela(rData) { try { // Extract book_id from URL var book_id = search.match(/https:\/\/(shamela.ws|app.turath.io)\/book\/([0-9]+)/)[2]; // Get QIDs from wikidata var Qids = await getQID("P12239", book_id); if (Qids.length > 0) { // Refetch with the QID var retryResults = await fetch_shamela(search, Qids); return JSON.parse('[' + retryResults.expandtemplates.wikitext + ']'); } } catch (error) { console.error('Error in enhanced error handling:', error); } return rData; } // Get QID from wikidata async function getQID(Pid, val, doi) { const searchValue = Array.isArray(val) ? 'haswbstatement:' + val.map(v => `${Pid}=${v}`).join('|') : `haswbstatement:${Pid}=${val}`; if (doi) { searchValue += `|P356=${doi}`; } let data = await (new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent })).get({ action: 'query', list: 'search', srsearch: searchValue, format: "json" }); if (data.query && Array.isArray(data.query.search) && data.query.search.length > 0) { return data.query.search.map(item => item.title); } return []; } // get volume data from wikidata async function getVolumeData(Qid, volurl, Pid = 'P953') { const resp = await wdapi.get({ action: 'wbgetentities', ids: Qid, props: 'claims', format: 'json' }); const entity = resp && resp.entities && resp.entities[Qid]; const claims = (entity && entity.claims) || {}; volcount = claims['P2635'] && claims['P2635'][0].mainsnak && claims['P2635'][0].mainsnak.datavalue ? parseInt(claims['P2635'][0].mainsnak.datavalue.value.amount) : null; wdvols = (claims[Pid] || []).map(s => { let wdurl = s.mainsnak && s.mainsnak.datavalue && s.mainsnak.datavalue.value; if (wdurl.indexOf(volurl) === 0 && s.qualifiers) { let qvol = s.qualifiers['P478'] && s.qualifiers['P478'][0].datavalue && s.qualifiers['P478'][0].datavalue.value ? s.qualifiers['P478'][0].datavalue.value : null; let qpageoffest = s.qualifiers['P8330'] && s.qualifiers['P8330'][0].datavalue && s.qualifiers['P8330'][0].datavalue.value ? parseInt(s.qualifiers['P8330'][0].datavalue.value.amount) : 0; return { vol: qvol, pageoffset: qpageoffest, volcount: volcount }; } return null; }).filter(v => v !== null); return wdvols.length > 0 ? wdvols[0] : {}; } // create template object function createTemplate(args) { const paramsObj = {}; for (const k in args) { if (Object.prototype.hasOwnProperty.call(args, k)) { paramsObj[k] = { wt: String(args[k]) }; } } return { template: { target: { href: "Template:استشهاد بويكي بيانات", wt: "استشهاد بويكي بيانات" }, params: paramsObj } }; } // fetch archive data async function fetch_archive(search) { const regex = /^https?:\/\/archive.org\/details\/([^\/]+)(?:\/([^\/]+))?(?:\/page\/([^\/]+))?(?:\/mode\/([12])up)?$/ const m = search.match(regex) const wdapi = new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent }); if (!m) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } const identifier = m[1]; const vol = m[2] || null; const page = m[3] || null; const mode = parseInt(m[4]) || 1; const parseArabicNum = str => parseInt(str.replace(/[٠-٩۰-۹]/g, d => d.charCodeAt(0) & 15 )); return getQID("P724", identifier).then(async Qids => { if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { const qid = Qids[i]; let args = { 'qid': qid, 'المسار': realsearch }; let wdpageoffset = 0; if (vol || (page && page.startsWith('n'))) { let volurl = realsearch.replace(/(?:\/page\/[^\/ ]+)?(?:\/mode\/[12]up)/, ''); wdvoldata = await getVolumeData(Qid, volurl); let wdvol = wdvoldata.vol ? wdvoldata.vol : null; wdpageoffset = (wdvoldata.pageoffset) ? wdvoldata.pageoffset : 0; const volcount = wdvoldata.volcount ? wdvoldata.volcount : null; if (vol && !wdvol && volcount && volcount > 1) { let intvol = parseInt(vol); if (!intvol) { let mvol = vol.match(/^\d+/); intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null if (!intvol) { mvol = vol.match(/\d+$/); intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null } } wdvol = intvol === 0 && vol.match(/p$/) ? 'المقدمة' : intvol ? intvol : vol; } if (wdvol) args['ج'] = wdvol; } if (page) { args['ص'] = (page.startsWith('n') && page.length > 1 ) ? (parseInt(page.substring(1)) + 1 - wdpageoffset) : parseArabicNum(page) || page; } ret.push(createTemplate(args)); if (mode === 2) { args['ص'] = args['ص'] ? (parseInt(args['ص']) + 1).toString() : '2'; ret.push(createTemplate(args)); } } return ret; }); } // fetch commons file data async function fetch_commons_file(search) { const url = new URL(search); const host = url.hostname.toLowerCase(); // const common_file= url. // const regex = /^https?:\/\/(*\.)?wiki\/([^\/]+)(?:\/([^\/]+))?(?:\/page\/([^\/]+))?(?:\/mode\/([12])up)?$/ // const m = search.match(regex) // console.log("AutoCiteWikidata: Detected archive.org URL with matches:", m); // const wdapi = new mw.ForeignApi('https://www.wikidata.org/w/api.php', { userAgent: gadgetAgent }); // if (!m) { // return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; // } // const identifier = m[1]; // const vol = m[2] || null; // const page = m[3] || null; // const mode = parseInt(m[4]) || 1; // const parseArabicNum = str => parseInt(str.replace(/[٠-٩۰-۹]/g, d => // d.charCodeAt(0) & 15 // )); // return getQID("P724", identifier).then(async Qids => { // if (Qids.length == 0) { // return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; // } // let ret = []; // for (let i = 0; i < Qids.length; i++) { // const qid = Qids[i]; // let args = { 'qid': qid, 'المسار': realsearch }; // let wdpageoffset = 0; // if (vol || (page && page.startsWith('n'))) { // let volurl = realsearch.replace(/(?:\/page\/[^\/ ]+)?(?:\/mode\/[12]up)/, ''); // wdvoldata = await getVolumeData(Qid, volurl); // let wdvol = wdvoldata.vol ?? null; // wdpageoffset = wdvoldata.pageoffset ?? 0; // const volcount = wdvoldata.volcount ?? null; // console.log("Selected Wikidata volume:", wdvol, "with page offset:", wdpageoffset," vol count:",volcount); // if (vol && !wdvol && volcount && volcount > 1) { // let intvol = parseInt(vol); // if (!intvol) { // let mvol = vol.match(/^\d+/); // intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null // if (!intvol) { // mvol = vol.match(/\d+$/); // intvol = mvol.length > 0 && mvol[0].length < 3 && parseInt(mvol[0]) || null // } // } // wdvol = intvol === 0 && vol.match(/p$/) ? 'المقدمة' : intvol ? intvol : vol; // } // if (wdvol) args['ج'] = wdvol; // } // if (page) { // args['ص'] = (page.startsWith('n') && page.length > 1 ) ? (parseInt(page.substring(1)) + 1 - wdpageoffset) : parseArabicNum(page) || page; // } // ret.push(createTemplate(args)); // if (mode === 2) { // args['ص'] = args['ص'] ? (parseInt(args['ص']) + 1).toString() : '2'; // ret.push(createTemplate(args)); // } // } // return ret; // }); } // We have to first set up a get response so we can have // a proper xhr object with "abort" method, so we can // hand off this abort method to the jquery promise let citoidXhr, citoidRequest; if (KID) { let KIDids = KID.id2 ? [KID.id, KID.id2] : [KID.id]; citoidRequest = getQID(KID.P, KIDids, KID.doi).then(async Qids => { if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] }; if (KID.url !== undefined) args.url = KID.url; if (KID.vol !== undefined) args.vol = KID.vol; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } else if (isArchive) { citoidRequest = fetch_archive(search); citoidXhr = citoidRequest; } else if (isShamela || isShamelaTxt) { citoidRequest = fetch_shamela(search); citoidXhr = citoidRequest.then(function (data) { let rData = JSON.parse("[" + data.expandtemplates.wikitext + "]"); if (rData[0].error && rData[0].error == "لم يعثر على بيانات الكتاب في ويكي بيانات" && /https:\/\/(shamela.ws|app.turath.io)\/book\//.test(search)) { return refetch_shamela(rData); } return rData; }); } else if (isCommonsFile) { citoidRequest = getQID('P953', realsearch).then(async Qids => { console.log("AutoCiteWikidata: Retrieved QIDs from Wikidata:", Qids); if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] , 'المسار': realsearch }; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } else if (isURI) { citoidRequest = getQID('P953', realsearch).then(async Qids => { console.log("AutoCiteWikidata: Retrieved QIDs from Wikidata:", Qids); if (Qids.length == 0) { return [{ error: "لم يعثر على بيانات الكتاب في ويكي بيانات" }]; } let ret = []; for (let i = 0; i < Qids.length; i++) { let args = { 'qid': Qids[i] , 'المسار': realsearch, }; ret.push(createTemplate(args)); } return ret; }); citoidXhr = citoidRequest; } // Ensure compatibility: if `citoidXhr` is a native Promise, wrap it // into a jQuery-compatible promise so callers can use `.always()` and // `.promise({ abort: ... })` like the original code expects. let jqCitoidXhr; if (citoidXhr && typeof citoidXhr.always === 'function' && typeof citoidXhr.promise === 'function') { jqCitoidXhr = citoidXhr; } else { const deferred = $.Deferred(); // Bridge native promise to jQuery Deferred if (citoidXhr && typeof citoidXhr.then === 'function') { citoidXhr.then(function (res) { deferred.resolve(res); }, function (err) { deferred.reject(err); }); } else { // If it's not thenable, resolve immediately with the value deferred.resolve(citoidXhr); } jqCitoidXhr = deferred.promise(); } inspector.lookupPromise = jqCitoidXhr .then( // Success function (rData) { // Normal template building logic (for both original success and retry success) if (Array.isArray(rData) && rData.length === 0) { console.log("AutoCiteWikidata: No data found"); return inspector._performLookup(); } else if (rData[0].error) { console.log("AutoCiteWikidata: Error - " + rData[0].error); mw.notify(rData[0].error, { title: 'استشهاد آلي', type: 'error' }); return inspector._performLookup(); } else { // buildTemplateResults const renderPromises = [], partPromises = []; rData.forEach((citation) => { const templateName = citation.template.target.wt; const transclusionModel = new ve.dm.MWTransclusionModel(); const result = { templateName: templateName, template: ve.dm.MWTemplateModel.newFromName(transclusionModel, templateName), // source: ['Wikidata'], transclusionModel: transclusionModel }; inspector.results.push(result); partPromises.push( result.transclusionModel.addPart(result.template) .then(function () { for (let param in citation.template.params) { result.template.addParameter( new ve.dm.MWParameterModel( result.template, param, citation.template.params[param].wt ) ); }; }) ); }); return ve.promiseAll(partPromises) .then(() => { const sources = [], optionWidgets = []; // Create option widgets inspector.results.forEach((result, i) => { const refWidget = new ve.ui.CitoidReferenceWidget( inspector.getFragment().getSurface().getDocument(), result.transclusionModel, { data: i, templateName: result.templateName, citeTools: ve.ui.mwCitationTools }); const template = result.template; // T92428: Ignore empty templates if (ve.isEmptyObject(template.getParameters())) { return; } // sources.push(result.source); // source may be undefined or Array of strings optionWidgets.push(refWidget); renderPromises.push(refWidget.getRenderPromise()); }); if (optionWidgets.length > 0) { // Add citations to the select widget inspector.previewSelectWidget.addItems(optionWidgets); return ve.promiseAll(renderPromises).then(() => { inspector.setModePanel('auto', 'result', false, {}); }, () => { inspector.lookupFailed(); return $.Deferred().resolve(); }); } // failed, so go back return $.Deferred().reject(); }); // End buildTemplateResults } }, // Fail (type, response) => { if (response && response.textStatus === 'abort') { return $.Deferred().reject(); } inspector.lookupFailed(); // Restore focus to the input field. // Definitely don't do this on success and focusing a hidden input causes jQuery // to prevent it from being focused the next time the inspector is opened (T285626) inspector.lookupInput .setDisabled(false).focus(); return $.Deferred().resolve(); }) .always(() => { inspector.lookupInput .setDisabled(false) .popPending(); inspector.lookupButton.setDisabled(false); }) .promise({ abort: () => { if (citoidRequest && citoidRequest.abort) { citoidRequest.abort(); } if (citoidXhr && citoidXhr.abort) { citoidXhr.abort(); } } }); return inspector.lookupPromise; }; }); hpx696zvgknor9z9uw0jt0tfgsd73d6 ميدياويكي:Gadget-auto-cite-wikidata-loader.js 8 237534 1089648 2026-04-26T21:09:43Z حبيشان 31560 تحت الاختبار 1089648 javascript text/javascript mw.libs.ve.addPlugin( 'ext.gadget.auto-cite-wikidata' ); pqif9nxomwyn1i1d1rybadxh5ucedub 1089653 1089648 2026-04-26T21:36:03Z حبيشان 31560 استهداف الجوال ايضا 1089653 javascript text/javascript mw.libs.ve.targetLoader.addPlugin( 'ext.gadget.auto-cite-wikidata' ); 9c6fuityuq90b3qjny5qobpb6cln0s1