Jump to content

فحص التحرير/مطابقة النص

From mediawiki.org
This page is a translated version of the page Edit check/TextMatch and the translation is 100% complete.

يمكن لمجتمع الويكي إنشاء اقتراحات محلية مخصصة باستخدام مطابقة النص TextMatch. تُعدّ مطابقة النص نوعًا من فحص التحرير يبحث عن استعلامات محددة مسبقًا، وعند العثور على تطابق، يعرض مربع رسائل فحص التحرير المعتاد مع الرسالة والعنوان والإجراءات المقترحة للمحرّر.

على سبيل المثال، قد تُتيح مطابقة النص خيار حذف المصطلح المطابق، أو استبداله بطريقة محددة، أو مجرد تشجيع المحرّر على التفكير في الأمر. يمكن أن تكون فحوصات مطابقة النص بسيطة جدًا، أو أكثر قوةً باستخدام خيارات الضبط المتاحة.

مثالان. يكتشف الأول عبارة محتملة عن الوقت النسبي وربطها بالرشادات ذات الصلة. ويكتشف الثاني بعض الأخطاء المحتملة في تنقيط النص و يقدم زر لإصلاحها.

مثال JSON ما سيراه المحررون
{
	"textMatch": {
		"matchRules": {
			"nonspecific-time": {
				"query": [
					"in the (past|future)",
					"recently",
					"to this day"
				],
				"title": "Indefinite time",
				"message": "This phrase might contain a [[MOS:RELTIME|relative time reference]]. Absolute specifications of time are usually preferred, otherwise they may go out of date. Help readers to understand by writing the specific time that is being referred to here.",
				"isRegExp": true,
				"config": {
					"ignoreQuotedContent": true
				}
			},
			"punctuation-typos-dash": {
				"query": {
					"--": "—",
					"\\s-\\s": " — ",
					"\\s-(\\d+)": " −$1",
					"([^\\d\\s]+)(\\s—|—\\s)([^\\d\\s]+)": "$1 — $3",
					"([А-ЯЁA-Z][^\\d\\s]*)(?\u003C![XVI]+)—(?![XVI]+)([А-ЯЁA-Z][^\\d\\s]*)": "$1 — $2"
				},
				"title": "Check Punctuation",
				"message": "There may be a punctuation error here that needs to be corrected. Check to see if the [[MOS:HYPHEN|hyphen]] needs to be replaced with a specific [[MOS:DASH|dash]], [[MOS:COMMONMATH|minus]], or vice versa, and whether it needs to be surrounded by spaces.",
				"isRegExp": true,
				"mode": "replace",
				"config": {
					"caseSensitive": true
				}
			}
		}
	}
}
(الجوّال)

or

(سطح المكتب)

القيود الحالية

اعتبارًا من يوليو 2026:

  • لن يكتشف مطابقة النص المحتوى الموجود داخل القوالب بعد
  • لا توجد طريقة لاستبعاد القوائم أو علامات الكود الأخرى من المطابقة، ولتقييد المحتوى فقط للقوائم وللجداول وللعناوين، إلخ. طالع inNode أدناه.
  • راجع استعلامات التعبيرات النمطية لمزيد من التفاصيل حول القيود الخاصة بالتعبيرات النمطية.
  • الأخطاء وطلبات الميزات المفتوحة: بحث فبريكاتور

الضبط

يتكون ضبط مطابقة النص من الضبط العام لفحص التحرير، وعدد من matchRules. كل matchRule يتكون من شيء للبحث عنه ووصف لما يجب القيام به عندما يجد ذلك الشيء.

تعريف matchRule مرن جدا، ويمكن أن يستوعب أي شيء من العثور على كلمة بسيطة وإظهار تحذير مسبق، إلى العثور علي مجموعة معقدة من العبارات العادية واستبدالها بشيء يختلف بناء على ما تم العثور عليه. راجع قسم #مثال على الضبط أدناه للاطلاع على عروض عملية.

الاسم مطلوب؟ النوع الوصف افتراضي
unique string id Required سلسلة الاسم المختصر للـ TextMatch المحدد
query Required Array أو Object ما يُبحث عنه. يمكن أن يكون بتنسيقات مختلفة:
  • قائمة من المصطلحات أو أنماط التعابير النمطية
  • خريطة من المصطلحات أو أنماط التعابير النمطية مع بدائلها

لاحظ أن أي تطابق يجب أن يبدأ وينتهي عند حدود الكلمة. على سبيل المثال، إذا كان الاستعلام "foo"، فلن يُكتشف التطابق في "foobar". ينطبق هذا على قواعد المطابقة سواء كانت regex أم لا. هذا ينطبق على كل من قواعد المطابقة المشتركة والغير المشتركة.

تستخدم TextMatch نفس تعبيرات جافاسكريبت منتظمة التي تستخدم في ميزة العثور / استبدال من النحرر المرئي.

title Required سلسلة ما سيُعرض للمستخدمين في مربع حوار فحص التحرير. يجب أن يحتوي على نص عادي فقط.
message Required سلسلة ما سيُعرض للمستخدمين في مربع حوار فحص التحرير. يمكن أن يتضمن روابط ويكي، ويجب أن يوجّه المستخدم إلى أي توثيق ذي صلة حتى يتمكن من الاطلاع على المزيد.
mode Optional سلسلة ما هي الإجراءات (الأزرار) التي ينبغي توفيرها في مربع حوار فحص التحرير. الخيارات المتاحة حاليًا: "info" (just "dismiss"), "replace" ("replace" and "dismiss"), "delete" ("delete" and "dismiss")
إذا لم يُحدَّد الوضع فلن يظهر إلا الزر الافتراضي:
""
isRegExp Optional Boolean إذا كانت القيمة true، سيعامل TextMatch هذا الاستعلام كنمط تعبير نمطي. راجع استعلامات التعبيرات النمطية لمزيد من التفاصيل. false
config Optional Object خيارات ضبط متعددة تعمل على مستوى matchRule (بدلًا من مستوى TextMatch كله).
  • إعدادات ظهور فحص التحرير العامة (Edit check/Configuration ) مثل ignoreQuotedContent، ignoreSections، ignoreDisambiguationPages، إلخ.
    • باستخدام showAsCheck:false و showAsSuggestion:false سوف تصنف القاعدة "تجريبية"، ولن تظهر للمحررين العاديين. يمكن تفعيل القواعد التجريبية مؤقتًا باستخدام #تعليمات الاختبار أدناه. (ملاحظة: لن يتم نقل الإدخال داخل صفحة Special:EditChecks.)
  • caseSensitive - هذا هو false افتراضيًا
  • minOccurrences - عدد صحيح يحدد كم مرة يجب أن يتطابق الاستعلام داخل فقرة قبل عرض فحص التحرير.

في المستقبل، نأمل دعم المزيد مثل: الفضاء الاسمي واسم الصفحة المحدد.

inNode Optional سلسلة اشتراط ظهور المطابقة داخل عقدة من هذا النوع. تُستمد أنواع العقد من نموذج بيانات المحرر المرئي، مثل 'mwHeading' للعناوين و'paragraph' للفقرات.
expand Optional سلسلة إذا تم العثور على تطابق، فإن هذا الخيار يحدد ما إذا كان سيتم توسيع "منطقة المشكلة" (المنطقة المظللة) لتشمل محتوى أكثر، بدلاً من النص المتطابق فقط.

الخيارات المتاحة هي:

  • "word"
  • "paragraph"
  • "siblings" (all sibling nodes)
  • "parent" (the entire containing node)
preserveCase Optional Boolean إذا كانت القيمة true وكانت matchRule تستخدم mode: "replace"، فسيكون مصطلح الاستبدال المقترح بنفس حالة المصطلح المطابق (يقتصر على Title Case وlowercase وuppercase).
تُمثّل حالة الأحرف (صغيرة أم كبيرة) المحددة في إعداد `matchRule` لعملية الاستبدال أدنى مستوى لحالة الأحرف سيُستخدم في الاستبدال؛ ويضمن ذلك عدم تحوّل كلمات مثل "French" أو "USA" إلى صيغ غير صحيحة، حتى عند استبدال نص مكتوب بالكامل بأحرف صغيرة. لذا، يُنصح بكتابة نصوص الاستبدال في `TextMatch` بأحرف صغيرة، ما لم تقتضِ طبيعة المصطلح استخدام حالة أحرف محددة.
false
import Optional سلسلة يمكنك تعريف قواعد المقابلة الأكثر تعقيداً في صفحات JSON منفصلة وإدخالها، للحفاظ على صفحة JSON الرئيسية أقصر. يجب أن تكون الصفحات تحمل اسم MediaWiki:Editcheck-config-<name>.json على سبيل المثال "import": "MediaWiki:Editcheck-config-LLM.json"

استعلامات التعبيرات النمطية

هناك بعض التعقيدات المحددة المتعلقة بـ matchRules التي تستخدم استعلامات التعبير النمطي (regex).

  • لا تُدعم المراجع الخلفية (backreferences) العادية، وذلك بسبب الطريقة التي يتم بها تجميع كافة أنماط التعبيرات النمطية (regex patterns) في الاستعلام معاً لأغراض تتعلق بالأداء. ويتمثل الحل البديل المقترح في استخدام المراجع الخلفية المُسمّاة.
  • عند استخدام نمط تعبير نمطي يتضمن خيارات بديلة (alternation)، رتّب هذه الخيارات من الأطول إلى الأقصر (على سبيل المثال، استخدم "enhanc(ed|es|e|ing)" بدلاً من "enhanc(e|ed|es|ing)"). وبهذه الطريقة، يطابق التعبير النمطي الكلمة الكاملة قبل أن يتمكن أي خيار أقصر من مطابقة جزء من الكلمة، مما قد يؤدي لاحقاً إلى فشل التحقق من حدود الكلمة (word-boundary check).[1]

يمكن دائمًا اختبار استعلامات التعبير النمطي باستخدام أداة (البحث والاستبدال ) في المحرر المرئي، مع تفعيل الخيارات أو المُعدِّلات المناسبة؛ إذ يساعد ذلك في فهم ما تدعمه الأداة وما لا تدعمه.

  1. يعود ذلك إلى أن جميع قواعد TextMatch تستخدم العلامة `wholeWord` التي تقصر المطابقات على تلك المحاطة بحدود الكلمات. واعتباراً من يونيو 2026، ندرس إمكانية جعل هذه الخاصية قابلة للتعديل.

تعليمات الاختبار

يُعدّ TextMatch جزءًا من الميزة التجريبية الحالية لوضع الاقنراح المتاحة على جميع ويكيبيديا (انظر حالة النشر).

لإظهار أنواع الفحوصات والاقتراحات التجريبية، يمكنك إضافة عنوان URL &ecenable=experimental لجلسة تحرير مرئي موجودة.

لاختبار نوع جديد من TextMatch:

  1. زر ويكي حيث TextMatchEditCheck متاح ولديك صلاحية الإدارة. قم بتسجيل الدخول.
  2. على نفس الويكي، قم بزيارة MediaWiki:Editcheck-config.json
  3. اضغط على عدل
  4. أدرج JSON من قسم مثال على الضبط أو إعدادات مخصصة تتبع نفس التنسيق.
    1. إذا كان JSON موجودًا بالفعل، انسخ من "textMatch" فقط دون الأقواس المتعرجة الخارجية
  5. قم بزيارة مقالة على نفس الويكي من المرجح أن تحتوي على أحد التطابقات المذكورة في الـ JSON
  6. افتح جلسة تحرير مرئي باستخدام &ecenable=suggestions,experimental في عنوان URL

مثال على الضبط

للاطلاع على مزيد من الأمثلة المنشأة في مختلف الويكيات، انظر الروابط في أمثلة الاقتراحات.

فيما يلي مثال على ما يمكن ضبطه:

{
	"textMatch": {
		"enabled": true,
		"matchRules": {
		    "british-english": {
				"query": {
					"chiseled": "chiselled",
					"favor(ed|ite|ing)": "favour$1",
					"somberly": "sombrely"
				},
				"title": "American English",
				"mode": "replace",
				"isRegExp": true,
				"preserveCase": true,
				"message": "This article requires British English. Fix?",
				"config": {
					"maximumEditCount": 500,
					"account": "loggedin",
					"hasTemplate": [
						"Use British English",
						"EngvarB"
					]
				}
			},
			"potential-LLM": {
				"query": [
					"(stands as|serves as|is) a (testament|reminder)",
					"indelible mark",
					"important to note",
					"observers have cited"
				],
				"title": "Potential LLM content",
				"message": "Is this LLM-generated content? Every edit that incorporates LLM output should be marked as LLM-assisted by identifying the name and, if possible, version of the AI in the edit summary.",
				"isRegExp": true,
				"config": {
					"caseSensitive": false,
					"minOccurrences": 3
				},
				"expand": "paragraph"
			},
			"cliches": {
				"query": [
					"tip of the iceberg",
					"white elephant",
					"gild the lily",
					"take the plunge",
					"took the plunge",
					"ace up the sleeve",
					"bird in the hand",
					"twist of fate",
					"at the end of the day"
				],
				"title": "Cliches and idioms",
				"message": "Clichés and idioms should generally be avoided in favor of direct, literal expressions.",
				"config": {
					"account": false
				}
			},
			"relative-time-ref": {
				"query": [
					"recently",
					"lately",
					"currently",
					"today",
					"presently",
					"to date",
					"years ago",
					"formerly",
					"in the past",
					"traditionally",
					"yesterday",
					"tomorrow",
					"in the future",
					"to this day"
				],
				"title": "Relative time references",
				"message": "Absolute specifications of time are preferred to relative constructions such as this, because the latter may go out of date.",
				"config": {
					"account": false
				}
			},
			"editorializing": {
				"query": [
					"notably",
					"it should be noted",
					"arguably",
					"interestingly",
					"essentially",
					"utterly",
					"actually",
					"clearly",
					"absolutely",
					"of course",
					"without a doubt",
					"indeed",
					"happily",
					"sadly",
					"tragically",
					"aptly",
					"unfortunately",
					"untimely"
				],
				"title": "Editorializing",
				"mode": "delete",
				"message": "Use of adverbs such as these, to highlight something as particularly significant or certain without attributing that opinion, should usually be avoided so as to maintain an impartial tone.",
				"config": {
					"account": false
				}
			},
			"puffery": {
				"query": [
					"legendary",
					"greatest",
					"acclaimed",
					"iconic",
					"visionary",
					"outstanding",
					"leading",
					"celebrated",
					"popular",
					"landmark",
					"cutting-edge",
					"innovative",
					"revolutionary",
					"extraordinary",
					"brilliant",
					"famous",
					"renowned",
					"remarkable",
					"prestigious",
					"world-class",
					"respected",
					"notable",
					"virtuoso",
					"honorable",
					"awesome",
					"unique",
					"pioneering",
					"phenomenal",
					"prominent"
				],
				"title": "Puffery",
				"mode": "delete",
				"message": "Words such as these are often used without attribution to promote the subject of an article and should usually be avoided.",
				"config": {
					"account": false
				}
			}
		}
	}
}