Jump to content

Edit check/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.

Una comunidad wiki puede crear sugerencias locales personalizadas utilizando TextMatch. TextMatch es una edit check que busca consultas predeterminadas y, cuando encuentra una coincidencia, muestra el cuadro de mensaje habitual de la comprobación de edición, junto con el mensaje, el título y las posibles acciones que puede realizar el editor.

Por ejemplo, una función TextMatch podría ofrecer la opción de eliminar el término encontrado, sustituirlo de una forma determinada o, simplemente, animar al editor a reflexionar sobre él. Las comprobaciones de TextMatch pueden ser muy sencillas o pueden potenciarse mediante las opciones de configuración.

Aquí tienes dos ejemplos. El primero detecta una posible expresión de tiempo relativo y enlaza con la guía correspondiente. La segunda detecta algunos posibles errores de puntuación y ofrece un botón para corregirlos.

ejemplo JSON Lo que verás las personas editoras
{
	"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
				}
			}
		}
	}
}
(móvil)

or

(escritorio)

Limitaciones actuales

A partir de junio de 2026:

  • TextMatch todavía no detecta el contenido «dentro» de las plantillas
  • No hay forma de excluir las listas u otras etiquetas de código de la búsqueda, ni de limitar el contenido únicamente a listas, tablas, encabezados, etc. See inNode below.
  • See Regex queries for more details on regex-specific limitations.
  • Errores pendientes y solicitudes de nuevas funciones: Búsqueda en Phabricator

Configuración

La configuración de TextMatch consta de la opción habitual Editar comprobación/Configuración y una serie de matchRules. Cada matchRule corresponde a algo que hay que buscar y a una descripción de lo que hay que hacer cuando se encuentre.

La definición de matchRule es bastante flexible y puede abarcar desde la búsqueda de una palabra sencilla y la visualización de una advertencia predeterminada, hasta la búsqueda de un conjunto complejo de expresiones regulares y su sustitución por algo que varía en función de lo que se haya encontrado. Consulta la sección #Ejemplo de configuración que aparece a continuación para ver ejemplos prácticos de estos casos.

Nombre ¿Requerido? Tipo Descripción Predeterminado
unique string id Required Cadena de texto El nombre abreviado del TextMatch específico
query Required Matriz u objeto Qué buscar. Esto puede presentarse en diversos formatos:
  • Una lista de términos o patrones de expresiones regulares
  • Una correspondencia entre términos o patrones de expresiones regulares y sus sustituciones

Ten en cuenta que cualquier coincidencia debe comenzaar y terminar en los límites de las palabras. Por ejemplo, si la consulta es foo, no se detectaría ninguna coincidencia en «foobar». Esto se aplica tanto a las reglas de coincidencia de expresiones regulares como a las que no lo son.

TextMatch utiliza las mismas expresiones regulares de JavaScript que se emplean en la función de búsqueda y sustitución de VisualEditor.

title Required Cadena de texto Lo que se mostrará a los usuarios en el cuadro de diálogo de comprobación de edición. Esto solo debe incluir texto sin formato.
message Required Cadena de texto Lo que se mostrará a los usuarios en el cuadro de diálogo de comprobación de edición. Esto puede incluir enlaces a la wiki y debe dirigir al usuario a cualquier documentación relevante para que pueda obtener más información.
mode Optional Cadena de texto ¿Qué acciones (botones) deberían aparecer en el cuadro de diálogo de comprobación de la edición? Los modos disponibles actualmente son los siguientes: "info" (just "dismiss"), "replace" ("replace" and "dismiss"), "delete" ("delete" and "dismiss")

Si se desconoce el modo o no está definido, solo se mostrará el botón «Descartar».

""
isRegExp Optional Booleano Si es cierto, TextMatch tratará esta consulta como un patrón de expresión regular See Regex queries for more details. false
config Optional Objeto Diversas opciones de configuración que actúan a nivel de matchRule (en lugar de sobre todo el proceso de comprobación de edición TextMatch).
  • Las configuraciones genéricas de visibilidad de «editcheck» (Edit check/Configuration ), como ignoreQuotedContent, ignoreSections, ignoreDisambiguationPages, etc.
    • Si se utilizan tanto showAsCheck:false como showAsSuggestion:false, la regla se clasificará como «Experimental» y no se mostrará a las personas editoras habituales. Las reglas experimentales se pueden activar temporalmente siguiendo las #Instrucciones de prueba que figuran a continuación. (Nota: La entrada no se reubicará dentro de la página de Special:EditChecks)
  • caseSensitive - este es false predeterminado
  • minOccurrences - un valor entero que indica cuántas apariciones de una consulta deben encontrarse en un párrafo para que se muestre la alerta de edición.

En el futuro, nos gustaría ofrecer más opciones, como: espacios de nombres y nombres de páginas específicos.

inNode Optional Cadena de texto 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 Optional Cadena de texto Si se encuentra una coincidencia, esta opción permite configurar si se debe ampliar el «área problemática» (el área resaltada) para que abarque todo el párrafo que contiene la coincidencia, en lugar de limitarse únicamente al texto coincidente.

Available options are:

  • "word"
  • "paragraph"
  • "siblings" (all sibling nodes)
  • "parent" (the entire containing node)
preserveCase Optional Booleano Si es cierto, y si la regla de coincidencia utiliza mode: "replace", el término de sustitución sugerido tendrá el mismo tipo de letra que el término coincidente (limitado a: mayúsculas iniciales, minúsculas y mayúsculas).
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 Optional Cadena de texto Puedes definir reglas de coincidencia más complejas en páginas JSON independientes e importarlas, para que la página JSON principal sea más breve. Las páginas deben ser nombradas MediaWiki:Editcheck-config-<name>.json ej. "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.

Instrucciones para testar

TextMatch forma parte de la función beta «Modo de sugerencias», que está disponible en todas las Wikipedias (véase Estado de implementación).

Para ver los tipos de comprobaciones y sugerencias «Experimentales», puedes añadir el parámetro de URL &ecenable=experimental a una sesión de edición existente en el Editor visual.

Para probar un nuevo tipo de TextMatch:

  1. Visita una wiki en la que TextMatchEditCheck esté disponible y en la que tengas permisos de administrador/a. Inicia sesión.
  2. En dicha wiki, visita MediaWiki:Editcheck-config.json
  3. Clica en Editar
  4. Inserta el código JSON de la Configuración de ejemplo o alguna configuración personalizada que siga el mismo formato.
    1. Si ya hay un JSON, copia solo el contenido de «textMatch»; no las llaves más externas
  5. Visita un artículo de esa misma wiki que probablemente contenga una de las coincidencias que aparecen en el JSON
  6. Abre una sesión de edición en VisualEditor utilizando el parámetro de URL &ecenable=suggestions,experimental

Ejemplo de configuración

Consulta Ayuda:Modo de sugerencias para ver más ejemplos que se han creado en diversas wikis.

A continuación se muestra un ejemplo de lo que se podría configurar:

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