ويكاموس
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