Jump to content

Vérification de l'édition/TextMatch

From mediawiki.org
This page is a translated version of the page Edit check/TextMatch and the translation is 84% complete.
Outdated translations are marked like this.

Une communauté wiki peut créer des suggestions locales personnalisées à l'aide de la fonction TextMatch. TextMatch est un contrôle de modification qui recherche des requêtes prédéfinies et, lorsqu'une correspondance est trouvée, affiche la boîte de dialogue habituelle de contrôle de modification, accompagnée du message, du titre et des actions que l'éditeur peut effectuer.

Par exemple, un TextMatch pourrait proposer une option permettant de supprimer le terme trouvé, de le remplacer d'une manière précise, ou simplement d'inciter l'éditeur à y réfléchir. Les vérifications TextMatch peuvent être très simples, mais peuvent aussi être optimisées grâce aux options de configuration.

Voici deux exemples. La première détecte une expression pouvant faire référence au temps relatif et crée un lien vers les instructions correspondantes. La deuxième détecte certaines erreurs de ponctuation potentielles et propose un bouton permettant de les corriger.

Exemple JSON Ce que verront les éditeurs
{
	"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
				}
			}
		}
	}
}
(mobile)

or

(ordinateur)

Limites actuelles

À compter de juin 2026 :

  • TextMatch ne détecte pas encore le contenu à l'intérieur des modèles
  • Il n'est pas possible d'exclure les listes ou d'autres balises de code de la recherche, ni de limiter le contenu aux seules listes, tableaux, titres, etc. See inNode below.
  • See Regex queries for more details on regex-specific limitations.
  • Problèmes ouverts et demandes de fonctionnalités : Recherche sur Phabricator

Configuration

La configuration de TextMatch comprend la page habituelle Modifier la vérification/Configuration et plusieurs éléments matchRules. Chaque matchRule équivaut à un objet à rechercher et à une description de ce qu'il faut faire une fois cet objet trouvé.

La définition de matchRule est assez souple et peut s'adapter à toutes sortes de cas, qu'il s'agisse de rechercher un simple mot et d'afficher un message d'avertissement prédéfini, ou de rechercher un ensemble complexe d'expressions régulières et de les remplacer par un résultat qui varie en fonction de ce qui a été trouvé. Consultez la section #Exemple de configuration ci-dessous pour voir des exemples concrets de ces cas.

Nom Obligatoire ? Type Description Défaut
unique string id obligatoire Chaîne Le nom abrégé du TextMatch spécifique
query obligatoire Tableau ou Objet Ce qu'il faut rechercher. Cela peut prendre différents formats :
  • Une liste de termes ou de modèles regex
  • Une correspondance des termes ou modèles regex et de leurs substituts

Notez que toutes les correspondances doivent commencer et se terminer à la fin d'un mot. Par exemple, si la requête est "foo", aucune correspondance ne serait détectée dans "foobar". Cela s'applique aussi bien aux correspondances regex qu'aux correspondances non regex.

TextMatch utilise les mêmes [expressions régulières JavaScript https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions] que celles utilisées dans la fonctionnalité de recherche et de remplacement de VisualEditor.

title obligatoire Chaîne Ce qui s'affichera pour les utilisateurs dans la boîte de dialogue de vérification des modifications. Cela ne doit contenir que du texte brut.
message obligatoire Chaîne Ce qui s'affichera pour les utilisateurs dans la boîte de dialogue de vérification des modifications. Cela peut inclure des liens vers le wiki et doit renvoyer l'utilisateur vers toute documentation pertinente afin qu'il puisse en savoir plus.
mode optionnel Chaîne Quelles actions (boutons) doivent figurer dans la boîte de dialogue de vérification des modifications ? Les actions actuellement disponibles sont les suivantes : "info" (just "dismiss"), "replace" ("replace" and "dismiss"), "delete" ("delete" and "dismiss")

Si le mode n'est pas défini, seul le bouton par défaut s'affichera :

""
isRegExp optionnel Booléen Si c'est le cas, TextMatch traitera cette requête comme un motif regex. See Regex queries for more details. false
config optionnel Objet Diverses options de configuration qui s'appliquent au niveau de la règle de correspondance (et non à l'ensemble du contrôle d'édition TextMatch).
  • Les configurations génériques de visibilité du contrôle d'édition (Edit check/Configuration ), telles que ignoreQuotedContent, ignoreSections, ignoreDisambiguationPages, etc.
    • Si vous utilisez à la fois showAsCheck:false et showAsSuggestion:false, la règle sera classée comme "expérimentale" et ne s'affichera pas pour les éditeurs normaux. Les règles expérimentales peuvent être activées temporairement en suivant les #instructions de test ci-dessous. (Remarque : L'entrée ne sera pas déplacée au sein de la page à Special:EditChecks.)
  • caseSensitive - la valeur par défaut est de false
  • minOccurrences - une valeur entière indiquant le nombre d'occurrences d'une requête qui doivent être trouvées dans un paragraphe avant que la vérification de modification ne s'affiche.

À l'avenir, nous aimerions prendre en charge d'autres éléments, tels que : les espaces de noms et les noms de pages spécifiques.

inNode optionnel Chaîne Require the match to appear inside a node of this type. Node types are from the VisualEditor data model, e.g 'mwHeading' for headings, 'paragraph' for paragraphs.
expand optionnel Chaîne Si une correspondance est trouvée, cette option permet de déterminer s'il faut étendre la 'zone concernée' (la zone mise en surbrillance) à l'ensemble du paragraphe contenant la correspondance, plutôt qu'au seul texte correspondant.

Available options are:

  • "word"
  • "paragraph"
  • "siblings" (all sibling nodes)
  • "parent" (the entire containing node)
preserveCase optionnel Booléen Si cela est vrai et si la règle de correspondance utilise mode: "replace", le terme de remplacement proposé sera alors dans la même casse que le terme trouvé (limité à : majuscules et minuscules, ou tout en majuscules).
The case that the replacement has in the matchRule config is the lowest case that will ever be offered as a replacement. This is so that words like 'French' or 'USA' are never turned into invalid forms, even if replacing something fully lowercased. As such, consider writing TextMatch replacements in lowercase unless the term requires specific casing.
false
import optionnel Chaîne Vous pouvez définir des règles de correspondance plus complexes dans des fichiers JSON distincts et les importer, afin de réduire la taille du fichier JSON principal. Les pages doivent être nommées MediaWiki:Editcheck-config-<name>.json, par exemple "import": "MediaWiki:Editcheck-config-LLM.json"

Regex queries

There are some specific complexities for matchRules that use regex queries.

  • Plain backreferences are not supported, due to the way that all regex patterns in a query are bundled together for performance reasons. The suggested workaround is to use named backreferences.
  • When using a regex pattern with alternation, order the alternatives from longest to shortest (e.g., use "enhanc(ed|es|e|ing)" rather than "enhanc(e|ed|es|ing)") . This way the regex matches the full word before any shorter alternative can match a partial word that then fails the word-boundary check.[1]

Regex queries can always be tested using VisualEditor's "find and replace " tool (with the appropriate modifiers enabled). This is helpful to understand what it will and will not support.

  1. This is due to all TextMatch rules using a wholeWord flag that restricts matches to those surrounded by word boundaries. As of June 2026 we are considering making this property configurable.

Instructions de test

TextMatch fait partie de la fonctionnalité Beta Mode suggestion, actuellement disponible sur toutes les versions de Wikipédia (voir État du déploiement).

Pour afficher les types de vérifications et les suggestions expérimentaux, vous pouvez ajouter le paramètre d'URL &ecenable=experimental à une session d'édition en cours dans l'éditeur visuel.

Pour tester un nouveau type de TextMatch :

  1. Rendez-vous sur un wiki où TextMatchEditCheck est disponible et où vous disposez d'un droit d'administrateur. Connectez-vous.
  2. Sur ce wiki, rendez-vous sur MediaWiki:Editcheck-config.json
  3. Appuyez sur Modifier
  4. Insérez le code JSON provenant de la configuration d'exemple ou d'autres configurations personnalisées respectant le même format.
    1. S'il y a déjà du JSON, ne copiez que le contenu de textMatch ; ne copiez pas les accolades extérieures
  5. Consultez un article de ce même wiki susceptible de contenir l'une des correspondances répertoriées dans le fichier JSON
  6. Ouvrir une session d'édition dans l'éditeur visuel à l'aide du paramètre d'URL &ecenable=suggestions,experimental

Exemple de configuration

Consultez Aide:Mode suggestion pour découvrir d'autres exemples créés sur différents wikis.

Voici un exemple de ce qui pourrait être configuré :

{
	"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
				}
			}
		}
	}
}