Wikcionario
eswiktionary
https://es.wiktionary.org/wiki/Wikcionario:Portada
MediaWiki 1.47.0-wmf.14
case-sensitive
Medio
Especial
Discusión
Usuario
Usuario discusión
Wikcionario
Wikcionario discusión
Archivo
Archivo discusión
MediaWiki
MediaWiki discusión
Plantilla
Plantilla discusión
Ayuda
Ayuda discusión
Categoría
Categoría discusión
Apéndice
Apéndice Discusión
Tesauro
Tesauro discusión
TimedText
TimedText talk
Módulo
Módulo discusión
Evento
Evento discusión
Wikcionario:Café
4
1313
6307312
6294849
2026-08-05T23:20:01Z
MABot
70592
Bot: archivo de 2 hilos (con una antigüedad de 30 días) en [[Wikcionario:Café/2026 06]], [[Wikcionario:Café/2026 07]]
6307312
wikitext
text/x-wiki
<!-- Inicio Encabezado del café, aviso, información histórica y información de archivado -->
<div style="text-align: center;">
{{/Aviso}}
{{/Histórico}}
</div>
{{atajo|WN:C}}
{{Archivo}}
<!-- Fin del Encabezado del café -->
<!-- Inicio configuración robot archivado; no tocar si no se sabe lo que se hace -->
{{Usuario:MABot/config
|archive = Wikcionario:Café/%(year)d %(month)02d
|algo = old(30d)
|counter = 1
|archiveheader = {{Archivo}}
}}
<h1>{{MONTHNAME|{{PREVIOUSMONTH}}}} de {{PREVIOUSMONTH.YEAR}}</h1>
<div class="mw-archivedtalk">
{{/{{PREVIOUSMONTH.YEAR}} {{PREVIOUSMONTH}}}}
</div>
<h1>Actual</h1>
== Noticias técnicas: 2026-29 ==
<section begin="technews-2026-W29"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/29|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* La [[mw:Special:MyLanguage/Growth/Revise_Tone|Revisión de Tono]] ayuda a personas recién llegadas a identificar pasajes de los artículos de Wikipedia que podrían contener lenguaje no enciclopédico y les anima a revisar el tono. La funcionalidad fue probada mediante [[w:en:A/B_testing|una prueba A/B]] en las Wikipedias en árabe, inglés, francés y portugués, donde la tasa de finalización de edición [[mw:Special:MyLanguage/Growth/Revise_Tone#Experiment_Results|aumentó en un 38,7 %]] en comparación con las tareas de Copyedit, sin que se detectara una disminución en la calidad de la edición. La prueba finalizó el 9 de julio y la funcionalidad estará disponible para todas las personas de esas wikis, configurable mediante la Configuración Comunitaria. [[phab:T426364|El plan]] es lanzar la Revisión de Tono en más wikis.
* La Configuración Comunitaria que permite la [[mw:Special:MyLanguage/Help:Growth/Mentorship#Automated mentor list cleanup|eliminación automática de mentores inactivos]] basada en criterios configurables se habilitará el jueves 16 en [[mw:Special:MyLanguage/Growth/Deployment|algunas wikis]] para mantener actualizadas las listas de mentores. Los mentores son editores experimentados que se autoincluyen en una lista para ayudar a usuarios nuevos en la wiki mediante las [[mw:Special:MyLanguage/Growth/Feature summary|características de Crecimiento]]. Los administradores pueden preparar la configuración en [[w:Special:CommunityConfiguration/Mentorship|Special:CommunityConfiguration/Mentorship]]; tendrá efecto a partir del jueves.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:38}} {{PLURAL:38|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se ha solucionado un problema en el que algunos usuarios de la aplicación de Wikipedia para Android se desconectaban inmediatamente después de iniciar sesión, lo que impedía que permanecieran conectados y editaran páginas. [https://phabricator.wikimedia.org/T316916]
'''Actualizaciones para los colaboradores técnicos'''
* Editar una página mediante scripts o gadgets de usuario hacía que las etiquetas de la lista de vigilancia que el usuario había asignado a esa página se restablecieran. Esto ya ha sido arreglado. [https://phabricator.wikimedia.org/T423778]
* Para evitar un fallo en Safari (revisa [[phab:T425211]]), en las wikis con Parsoid habilitado, los href de los wikienlaces usando urls absolutas en lugar de urls relativas de protocolo. La salida de la API REST se mantendrá sin cambios y continuará usando las urls relativas de protocolo. Los accesorios, scripts de usuarios, bots y CSS podrían necesitar adaptación si necesitan la presencia de urls relativas de protocolo en los href de los wikienlaces. [https://phabricator.wikimedia.org/T431358]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.11|MediaWiki]]
'''A fondo'''
* El equipo de Experimentos de Plataforma de la Fundación Wikimedia publicó un post que muestra su primer año de experimentación estructurada. Revisan los experimentos exitosos, como la Comprobación de Pegado, Comprobación de Referencias y Comprobación de Tono, los cuales han mejorado las ediciones y han sido desplegados a más usuarios, así como los experimentos que no han sido implementados. [[diffblog:2026/07/07/moving-the-needle-how-we-test-new-ideas-across-wikimedia-projects|Lee más]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/29|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W29"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:11 13 jul 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30804401 -->
== No funciona el buscador de anagramas ==
Desde este viernes el buscador de anagramas lanza, al hacer cualquier búsqueda, el siguiente error:
<code>Lo sentimos, hubo un error en el servidor :(</code>--[[Usuario:Jemily1|Jemily1]] ([[Usuario discusión:Jemily1|discusión]]) 11:53 18 jul 2026 (UTC)
:Solucionado, por ahora. La tarea se volverá a ejecutar en un mes, así que tendremos que estar atentos si vuelve a fallar. Saludos. [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 17:08 18 jul 2026 (UTC)
== Noticias técnicas: 2026-30 ==
<section begin="technews-2026-W30"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/30|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* El [[mw:Special:MyLanguage/Reader/Reader Experience|equipo de Experiencia de Lectores]] incorporó la retroalimentación de la comunidad acerca de la posición de la estrella y los botones de la lista de seguimiento para la [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|función beta de Listas de Lectura]], la que permite guardar artículos para leerlos más tarde — un elemento de la [[m:Special:MyLanguage/Community Wishlist/W102|lista de deseos]] que lleva la funcionalidad a la web. Los editores están invitados a habilitar esta funcionalidad beta para probarla y [[phab:T426453|compartir sus ideas]].
* El [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Modo de Sugerencia]] ofrece sugerencias de edición en el Editor Visual para mejorar los artículos de Wikipedia. [[Special:EditChecks|Todas las sugerencias]] son [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators – local customization|configurables por la comunidad]]. La función [[mw:Special:MyLanguage/Edit check/TextMatch|TextMatch]] es una forma para que los voluntarios puedan crear sugerencias locales. La funcionalidad busca en el artículo cadenas de texto y ahora incluye expresiones regulares. Esto da mayor flexibilidad a los voluntarios sobre los tipos de sugerencias locales que pueden crear. Nota: Las sugerencias [[mw:Special:MyLanguage/Edit check/Configuration#:~:text=maximumEditcount|pueden ser dirigidas]] a usuarios basados en el contador de ediciones, así como a aspectos de la página. Pueden [[mw:Special:MyLanguage/Help:Suggestion mode#Create custom local types of Suggestions|encontrar ejemplos de otras comunidades]] para inspirarse que incluyen el uso de TextMatch: errores de tipeo, errores gramaticales, potenciales anuncios, clichés, usos incorrectos de guiones, palabras poco específicas en ciertos contextos temporales, nombres desactualizados y más. Cualquier [[mw:Special:MyLanguage/Talk:VisualEditor/Suggestion Mode|retroalimentación]] es apreciada.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:27}} {{PLURAL:27|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un error por el cual la herramienta de traducción de SVG (SVG Translate) podía utilizar una versión desactualizada de un archivo, lo que provocaba que las traducciones existentes se sobrescribieran al subir nuevas versiones; esto ahora [[phab:T430577|ha sido corregido]]. En general, durante el último trimestre (de abril a junio de 2026), la Fundación Wikimedia resolvió cerca de 337 tareas comunitarias.
'''Actualizaciones para los colaboradores técnicos'''
* En las wikis con Parsoid habilitado, Parsoid ahora procesa un máximo de 1250 imágenes por página. Pronto estará disponible una nueva categoría de seguimiento, «media-limit-reached», para identificar las páginas donde se alcance este límite, lo que facilitará la localización de contenidos cuyo despliegue de archivos multimedia haya sido restringido durante el renderizado. Consulta [[phab:T430854]] para obtener más información y dejar sus comentarios.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.12|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/30|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W30"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 05:46 21 jul 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30836091 -->
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25 24 jul 2026 (UTC)
</bdi>
<!-- Mensaje enviado por Usuario:DreamRimmer@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Noticias técnicas: 2026-31 ==
<section begin="technews-2026-W31"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/31|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Wishlist item]] [[mw:Special:MyLanguage/ContentTranslation|Traducción de contenidos]] ahora cuenta con soporte para el modo oscuro, cumpliendo así con una solicitud de la [[m:Community Wishlist/W544|Lista de deseos de la comunidad]]. Esto alinea la herramienta con las funciones de accesibilidad disponibles en los temas Vector 2022 y Minerva, ayudando a reducir la fatiga visual de los usuarios que traducen contenidos. [https://phabricator.wikimedia.org/T367077]
* El modo de código fuente de Herramientas de Discusión (DiscussionTools) y el editor de wikitexto de 2017 ofrecerán ahora autocompletado para enlaces (<bdi lang="zxx" dir="ltr"><code><nowiki>[[</nowiki></code></bdi>), plantillas (<bdi lang="zxx" dir="ltr"><code><nowiki>{{</nowiki></code></bdi>), etiquetas HTML y de analizador sintáctico (<bdi lang="zxx" dir="ltr"><code><nowiki><</nowiki></code></bdi>), y palabras mágicas (<bdi lang="zxx" dir="ltr"><code><nowiki>__</nowiki></code></bdi>). Esto facilitará y agilizará la inserción de enlaces, plantillas y otros marcadores wiki durante la edición. [https://phabricator.wikimedia.org/T432400]
* El [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|equipo de Crecimiento de la Lectura]] ha concluido su experimento con las previsualizaciones de páginas en la web móvil y no desplegará esta función. Las previsualizaciones de páginas consistían en un panel inferior desplegable que aparecía cuando los lectores tocaban un enlace azul, mostrando una miniatura, el párrafo introductorio y la opción de abrir el artículo. El experimento reflejó una retención plana y métricas de indicadores negativas, lo que sugiere que los lectores de la web móvil prefieren navegar directamente a los artículos vinculados en lugar de utilizar las previsualizaciones.
* El equipo de Experiencia de Lectura ha obtenido resultados preliminares alentadores con la [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|función de listas de lectura]], en la que el 93 % de los usuarios participantes la calificaron como útil. Las listas de lectura ayudan a los lectores activos a guardar artículos para leer posteriormente y respaldan sus objetivos de aprendizaje en los proyectos Wikimedia. El equipo planea implementar mejoras adicionales antes de extender la herramienta a más usuarios.
* La iniciativa de [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh|renovación del feed Explorar]] fue probada con lectores nuevos y ocasionales de la aplicación de Wikipedia. El feed renovado ayuda a los lectores a descubrir contenidos nuevos y relevantes. Tras registrar un incremento del 10,5 % en la interacción con el feed, el equipo de Aplicaciones de Wikimedia ha decidido trasladar el rediseño del feed de Inicio a iOS, aplicando los aprendizajes obtenidos tras el lanzamiento en Android.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:23}} {{PLURAL:23|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un error por el cual los nombres de las materias en la función de guía de artículos se mostraban con una capitalización incorrecta en la Wikipedia en francés. Ahora, los nombres de las materias seguirán las reglas de mayúsculas y minúsculas correspondientes a cada idioma. [https://phabricator.wikimedia.org/T427201]
'''Actualizaciones para los colaboradores técnicos'''
* Tras llevar a cabo varios [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|experimentos en la creación de cuentas]] para mejorar las tasas de registro completado, se ha desplegado una nueva versión del campo de nombre de usuario en [[Special:CreateAccount|Crear una cuenta]]. Esta incluye [[:c:File:Create account - July 2026 updates.png|una ventana emergente que resume la política sobre nombres de usuario]] para ofrecer una orientación más clara durante el registro. Como parte de este cambio, los mensajes <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-helpusername</nowiki></code></bdi> y <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-help</nowiki></code></bdi> que varias comunidades habían configurado ya no se utilizarán. Si las comunidades desean personalizar la guía que se muestra en la nueva ventana emergente, pueden editar en su lugar los siguientes mensajes: <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet1</nowiki></code></bdi>, <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet2</nowiki></code></bdi> y <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet3</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T430604]
* A finales de esta semana, el [[mw:Special:MyLanguage/Help:Extension:CodeMirror|resaltador de sintaxis CodeMirror]] ofrecerá [[w:es:Tema (informática)|temas visuales]]. Los temas se podrán seleccionar desde un menú desplegable en el cuadro de diálogo completo de [[mw:Special:MyLanguage/Help:Extension:CodeMirror#CodeMirror preferences|preferencias de CodeMirror]]. Para el wikitexto, los temas disponibles son: predeterminado, apto para daltonismo (que anteriormente era la opción de preferencia para daltonismo en [[Special:Preferences#mw-prefsection-editing]]) y sin resaltado. Para lenguajes de programación (como CSS, JavaScript, JSON, Vue y Lua), hay varios temas disponibles. Con el tiempo, estos mismos temas también estarán disponibles para el wikitexto. [https://phabricator.wikimedia.org/T163533]
* A partir de ahora, las wikis pueden restringir el espacio de nombres "Usuario" solamente a los dueños de las páginas y a ciertos grupos de usuarios. [[mw:Special:MyLanguage/Manual:$wgRestrictUserPageEditing|Lee la documentación de la configuración]] para aprender más.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.14|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/31|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W31"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:49 27 jul 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30856308 -->
== Noticias técnicas: 2026-32 ==
<section begin="technews-2026-W32"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/32|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* El [[mw:Special:MyLanguage/Readers/Reader Experience|equipo de Experiencia de Lectura]] ha desarrollado una [https://82db7c8d4b.catalyst.wmcloud.org/w/index.php?title=Regent%27s_Park&uselang=de demostración] que colapsa la barra de herramientas de la página en dos líneas cuando no hay suficiente espacio horizontal para todos los botones. Esto busca reducir la aglomeración en la barra de Vector 2022, que puede ocurrir en algunas Wikipedias con ciertos anchos de pantalla. [https://phabricator.wikimedia.org/T429518]
* El equipo de Experiencia de Lectura planea lanzar [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Listas de Lecturas]], un [[m:Special:MyLanguage/Community Wishlist Survey 2021/Mobile and apps/Have Apps reading lists available on Destop/Mobile|elemento de la Lista de deseos de la comunidad]] que se encuentra en beta actualmente, como versión definitiva en septiembre. Antes de ello, se requiere la ayuda de traductores voluntarios que [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-readinglists&filter=&action=translate traduzcan cadenas] en cierto número de idiomas. La funcionalidad apoya la lectura y las metas de aprendizaje en Wikipedia.
* La próxima semana, la tabla de contenidos de las páginas de archivos de Wikimedia Commons se mejorará al consolidar la tabla de contenidos de la página de archivos con la tabla de contenidos de la página. Esto facilitará la comprensión de la estructura de una página de archivo, la navegación a secciones específicas y el compartir enlaces a secciones individuales. [https://phabricator.wikimedia.org/T332644]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:24}} {{PLURAL:24|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se resolvió un problema en el que ciertas imágenes [[:w:TIFF|TIFF]] fallaban al cargar después de hacer clic en la miniatura, provocando que se mostrara una imagen rota en lugar de la imagen de tamaño completo. [https://phabricator.wikimedia.org/T429326]
'''Actualizaciones para los colaboradores técnicos'''
* El selector de variables y funciones en AbuseFilter se ha actualizado para soportar la búsqueda y el autocompletado. Permitirá a los mantenedores de filtros encontrar la variable o función deseada más rápidamente. [https://phabricator.wikimedia.org/T323698]
* Los formatos MJPEG y VP8 se eliminan del reproductor de vídeo. En su lugar se agrega el formato MP4 (MPEG-4 Parte 2) que proporciona videos de mayor calidad a los dispositivos iPhone más antiguos. Puede tomar unas semanas actualizar retroactivamente todos los vídeos existentes. El formato predeterminado para los dispositivos modernos se mantiene igual (VP9/WebM). [https://phabricator.wikimedia.org/T358266]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.15|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/32|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W32"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:46 3 ago 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30872536 -->
446ag3e360oho1bgzn0wqf8rr6tncic
este
0
1665
6307365
6108529
2026-08-06T00:38:08Z
TMCbot
164594
.
6307365
wikitext
text/x-wiki
{{desambiguación|-este|Este|éste|ėste|êste|ešte|esté|-ește}}
== {{lengua|es}} ==
{{swadesh|es}}
{{pron-graf|audio1=Es-mx-este.ogg|g1=éste|g2=Este|gnota2=no recomendada|g3=E}}
=== Etimología 1 ===
{{etimología|osp|este|este}}, y este {{etim|la|iste}}<ref name=drae/>, {{etim|itc-pro|*esto-}}, {{etim|itc-pro|*is-}}, {{etim|ine-pro|*éy}}.<ref>{{DeVaan|309-10}}</ref> Compárese el arrumano {{l+|rup|aistu}}, el italiano {{l+|it|questo}}, el portugués {{l+|pt|este}} o el rumano {{l+|ro|ăst}}.
==== {{adjetivo|es|demostrativo|masculino}} ====
{{es.adj|irreg|estos|esta|estas}}
;1: {{impropia|Se emplea para indicar o señalar algo o a alguien próximo al hablante, o referirse a algo que se acaba de mencionar}}.
{{sinónimo|aqueste|nota1=literario, anticuado}}.
{{relacionado|ese|aquel}}.
{{ejemplo|''Este'' coche de aquí es mejor que ese de allá.}}
;2: Referido a un período de tiempo, que [[transcurrir|transcurre]] en el momento en que se habla.
{{sinónimo|actual|corriente|presente}}.
;3: {{impropia|Después de un sustantivo, indica desprecio o enojo}}.
{{uso|despectivo}}
{{ejemplo|No soporto al tonto ''este'' haciendo chistes malos.}}
==== {{pronombre demostrativo|es}} ====
{{es.adj|irreg|estos|esta|estas|neutro=esto}}
;4: {{impropia|Se emplea para indicar o señalar algo o a alguien próximo al hablante, o referirse a algo que se acaba de mencionar}}.
{{sinónimo|aqueste|nota1=literario, anticuado}}.
{{relacionado|ese|aquel}}.
{{ejemplo|Hay dos coches: uno aquí y otro allá. Prefiero ''este'' de aquí.}}
==== Locuciones ====
{{trad-arriba|Locuciones con «esta»}}
* {{l|es|esta y nunca más}} o [[esta y no más]] (coloquial): Indica decisión firme de no repetir un error: [[una y no más]].
* [[por estas]]: juramento amenazante, "estas" refiriéndose a sendas cruces hechas con los dedos índice y pulgar de ambas manos al mismo tiempo que se profería. También se usaba mientas el hablante se tomaba las barbas ("estas") mientras profería la amenaza.
* [[en estas]]: en esta situación o condición: [[en esas]].
* [[con que estas tenemos]]: expresión para indicar reprobación o reproche ante una acción o situación de la que el hablante acaba de enterarse.
{{trad-abajo}}
==== Véase también ====
{{w|Determinante (lingüística)|este}}
{{w|Demostrativo|este}}
==== Traducciones ====
{{trad-arriba}}
{{t|ain|t1=タㇴ|t2=タン}}
{{t|de|a1=2|t1=dies|g1=n|a2=2|t2=dieses|g2=n|a3=2|t3=diese|g3=f|a4=2|t4=dieser|g4=m}}
{{t|ar|t1=هذا}}
{{t|br|t1=-mañ|a1=1}}
{{t|bg|t1=този}}
{{t|bg|t1=тоя}}
{{t|bg|t1=тази}}
{{t|bg|t1=тая}}
{{t|bg|t1=това}}
{{t|bg|t1=туй}}
{{t|bg|t1=тези}}
{{t|bg|t1=тия}}
{{t|ca|t1=això|g1=n|t2=aquest|g2=m|t3=aquesta|g3=f}}
{{t|zh|t1=这}}
{{t|zh|t1=這}}
{{t|zh|t1=这个}}
{{t|zh|t1=這個}}
{{t|zh|t1=這箇}}
{{t|kw|t1=an}}
{{t|kw|t1=ma|a1=1}}
{{t|da|t1=dette}}
{{t|eo|t1=ĉi tiu}}
{{t|sk|a1=1|t1=tento|g1=m|a2=1|t2=táto|g2=f|a3=1|t3=toto|g3=n}}
{{t|sk|t1=toto|a1=2}}
{{t|sl|t1=ta|g1=f|t2=to|g2=n}}
{{t|fi|t1=tämä}}
{{t|fr|t1=ce|g1=m|t2=cet|g2=m|t3=cette|g3=f|t4=celui-ci|g4=m|t5=celle-ci}}
{{t|fy|t1=dit|g1=n|t2=dizze}}
{{t|gd|a1=1|t1=seo}}
{{t|cy|a1=1|t1=hwn|g1=m|a2=1|t2=hon|g2=f|a3=1|t3=hyn}}
{{t|cy|t1='ma|a1=1}}
{{t|el|t1=το}}
{{t|he|t1=זה}}
{{t|he|t1=זו}}
{{t|en|t1=this}}
{{t|ga|a1=1|t1=seo}}
{{t|is|t1=þessi}}
{{t|it|t1=questo|g1=m|t2=questa|g2=f}}
{{t|ja|a1=1|t1=この|t2=これ|a2=2}}
{{t|gv|a1=2|t1=shoh}}
{{t|yua|t1=lelaʼ}}
{{t|arn|a1=2|t1=tüfa}}
{{t|nl|t1=dit|g1=n|t2=deze|g2=m}}
{{t|nb|t1=dette}}
{{t|fa|t1=اين}}
{{t|pl|t1=ten|g1=m|t2=ta|g2=f|t3=to|g3=n}}
{{t|pt|t1=este|g1=m}}
{{t|ro|t1=acest|t2=ăsta|g2=m|t3=această|t4=asta|g4=f}}
{{t|ru|t1=это}}
{{t|sv|t1=den här|g1=c|t2=denna|g2=c}}
{{t|dv|t1=det här}}
{{t|sv|t1=detta}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|fro|est}}, {{etim|ang|east}}, {{etim|gem-pro|*austan}}, {{etim|ine-pro|*h₂eusro-}}, {{etim|ine-pro|*h₂eus-}}, la misma raíz {{etim|la|auster}} y {{l+|la|aurora}}. Desplazó al uso culto al patrimonial {{l+|es|oriente}}, fenómeno común a todas las lenguas romances. Compárese el catalán {{l+|ca|est}}, el italiano {{l+|it|est}}, el portugués {{l+|pt|este}} o el rumano {{l+|ro|est}}.<ref name=drae/>
[[Archivo:BrújulaE.svg|thumb|[1] Rosa de los vientos mostrando el ''Este'' a la derecha (símbolo: E)]]
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|geografía}}: [[w:Punto cardinal|Punto cardinal]] del [[horizonte]], por donde [[ascender|asciende]] el [[Sol]] en los días de [[equinoccio]], convencionalmente ubicado a la derecha de los mapas, a 90° del [[norte]].<ref name=drae>{{DRAE2001}}</ref>
{{ejemplo|La luz física procedente del Sol surge, cada día, por el ''Este'' u Oriente y desaparece al ponerse el astro por el Oeste u Occidente.|c=libro|t=La masonería|f=2001|p=308|a=Amando Hurtado|editorial=EDAF|isbn=9788441409873|u=http://books.google.es/books?id=J8U3HCrujXYC&pg=PA145|obs=uso incorrecto de la mayúscula en puntos cardinales}}
;2: {{plm|lugar}}, [[área]], [[dirección]] o [[territorio]] que, respecto de otro con el cual se compara, se sitúa hacia donde se levanta el Sol o en un ángulo de 90° (a la derecha) de quien mira hacia el norte.<ref name=drae/>
{{sinónimo|levante|naciente|oriente}}.
{{antónimo|ocaso|occidente|oeste|poniente}}.
{{cohipónimo|norte|septentrión|sur|mediodía|meridión|nordeste|noreste|noroeste|noroccidente|nororiente|sudeste|sureste|sudoeste|suroeste|suroccidente|sudoccidente|sudoriente|suroriente}}.
{{ejemplo|Me trasladé al asiento vacante, limitando al ''este'', y a mis alcances, con Adela, a la espalda con la pista de baile y al norte con el más barullero grupo, en el que reinaba esplendorosamente Mary.|c=libro|t=El gran momento de Mary Tribune|a=Juan García Hortelano|f=2007|editorial=LUMEN|p=581}}
;3: {{plm|viento}} que procede de un territorio al '''este'''{{-sub|2}}.<ref name=drae/>
{{sinónimo|euro|volturno}}.
{{ejemplo|El 21 de noviembre el desconfiado Almirante se dio cuenta de que el viento ''este'' se llevaba a la carabela más velera.|c=libro|t=Vida del muy magnífico señor don Cristóbal Colón|a=Salvador de Madariaga|f=1940|p=280}}
==== {{adjetivo|es|indeclinable}} ====
{{es.adj|inv}}
;4: {{impropia|Indica que lo designado por el [[sustantivo]] que lo precede [[orientar|se orienta]] al este en [[origen]], [[dirección]] o [[ubicación]]}}.
{{sinónimo|oriental}}
{{ejemplo|Una parte de ellas se desvía en la corriente subtropical del sur, bordeando la costa ''este'' de Australia.|c=libro|t=Geografia General|f=2004|p=288|a=Armando Aguilar Rodríguez|editorial=Pearson Educación|isbn=9789702605379|u=http://books.google.es/books?id=1Zc4NYGXhVkC&pg=PA122}}
==== Información adicional ====
* Se recomienda escribir los puntos cardinales con minúscula, a menos que formen parte de un nombre propio, por ejemplo el nombre de un lugar, un bloque o una institución.
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|af|t1=ooste}}
{{t|sq|t1=lindje|g1=f}}
{{t|de|t1=Osten|g1=m}}
{{t|hy|t1=արեւելք}}
{{t|ar|t1=شرق|g1=m}}
{{t|br|t1=reter|g1=m|t2=sav-heol|g2=m}}
{{t|bg|t1=изток}}
{{t|ca|t1=est|g1=m|t2=llevant|g2=m|t3=naixent|g3=m}}
{{t|cs|t1=východ|g1=m}}
{{t|da|t1=øst}}
{{t|sk|t1=východ|g1=m}}
{{t|sl|t1=vzhod|g1=m}}
{{t|eo|t1=oriento}}
{{t|eu|t1=sortalde|t2=eguzkialde|t3=ekialde}}
{{t|fi|t1=itä}}
{{t|fr|t1=est|g1=m|t2=orient|g2=m|t3=levant|g3=m}}
{{t|fy|t1=easten|g1=n}}
{{t|gl|t1=leste}}
{{t|el|t1=ανατολή|g1=f}}
{{t|he|t1=מזרח}}
{{t|hbo|t1=קֶדֶם|t2=קדם}}
{{t|hu|t1=kelet}}
{{t|id|t1=timur}}
{{t|ia|t1=est|t2=oriente}}
{{t|en|t1=east}}
{{t|ga|a1=1|t1=oirthear|a2=2|t2=anoir|a3=2|t3=soir|a4=2|t4=thoir}}
{{t|it|t1=est|g1=m|t2=oriente|g2=m|t3=levante|g3=m}}
{{t|ja|t1=東|t2=ひがし|tl2=higashi}}
{{t|mt|t1=Lvant}}
{{t|zh|t1=东}}
{{t|cmn|t1=東}}
{{t|arn|t1=pwel}}
{{t|yua|t1=lakʼin|t2=lakʼiin}}
{{t|nb|t1=øst}}
{{t|nl|t1=oosten|g1=n|t2=oost}}
{{t|pap|t1=oost|t2=pariba}}
{{t|pl|t1=wschód|g1=m}}
{{t|pt|t1=este|g1=m|t2=leste|g2=m|t3=levante|g3=m|t4=nascente|g4=m|t5=oriente|g5=m}}
{{t|ro|t1=est}}
{{t|ru|t1=восток|tl1=vostok|g1=m}}
{{t|srn|t1=sonopo}}
{{t|sv|t1=orient|t2=ost|t3=östan|t4=öster}}
{{t|sw|t1=mashariki}}
{{t|tl|t1=silángan}}
{{t|tr|t1=doğu}}
{{trad-abajo}}
== {{lengua|an}} ==
{{pron-graf|leng=an}}
=== Etimología 1 ===
{{etimología|leng=an|roa-oan|este|este}}.
==== {{adjetivo demostrativo|an}} ====
;1: {{variante|leng=an|iste}}
== {{lengua|ast}} ==
{{pron-graf|leng=ast}}
=== Etimología 1 ===
{{etimología|leng=ast}}.
==== {{sustantivo masculino|ast}} ====
{{ast.sust}}
;1: {{plm}} u {{l|es|oriente}}.
== {{lengua|osp}} ==
{{pron-graf|leng=osp}}
=== Etimología 1 ===
{{etimología|leng=osp|la|iste|alt=istum|este}}.
==== {{adjetivo demostrativo|osp}} ====
;1: {{plm}}.
{{sinónimo|leng=osp|aqueste}}.
==== {{pronombre demostrativo|osp}} ====
;2: {{plm}}.
{{sinónimo|leng=osp|aqueste}}
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología 1 ===
{{etimología|leng=ca|la|iste|alt=istum|este}}.
==== {{adjetivo demostrativo|ca}} ====
;1: {{plm}}.
{{sinónimo|leng=ca|aquest}}.
==== {{pronombre demostrativo|ca}} ====
;2: {{plm}}.
{{sinónimo|leng=ca|aquest}}
== {{lengua|fr}} ==
{{pron-graf|leng=fr|h1=est|h2=estes}}
=== Etimología 1 ===
{{etimología|leng=fr}}.
==== {{adjetivo|fr}} ====
{{fr.adj}}
;1: {{plm|estonio}}.
=== Forma flexiva ===
==== Forma verbal ====
;1: {{f.v|leng=fr|ester|1s|pres|ind|pron=j’}}.
;2: {{f.v|leng=fr|ester|3s|pres|ind|pron=elle, on, il}}.
;3: {{f.v|leng=fr|ester|1s|pres|sub|pron=j’}}.
;4: {{f.v|leng=fr|ester|3s|pres|sub|pron=elle, on, il}}.
;5: {{f.v|leng=fr|ester|2s||imp|pron=tu}}.
== {{lengua|fro}} ==
{{pron-graf|leng=fro}}
=== Forma flexiva ===
==== Forma verbal ====
;1: {{participio|leng=fro|estre|pas}}.
== {{lengua|roa-opt}} ==
{{pron-graf|leng=roa-opt|1fone1=ˈes.te}}
=== Etimología 1 ===
{{etimología|leng=roa-opt|la|iste|alt=istum|este}}.
==== {{adjetivo demostrativo|roa-opt}} ====
;1: {{plm|este}}.
{{sinónimo|leng=roa-opt|aqueste}}.
==== {{pronombre demostrativo|roa-opt}} ====
;2: {{plm|este}}.
{{sinónimo|leng=roa-opt|aqueste}}
== {{lengua|gl}} ==
{{pron-graf|leng=gl}}
=== Etimología 1 ===
{{etimología|leng=gl|roa-opt|este|este}}, y este {{etim|leng=gl|la|iste}}.
==== {{adjetivo demostrativo|gl}} ====
{{gl.adj|irreg|estes|esta|estas}}
;1: {{plm}}.<ref>{{DRAG}}</ref>
==== {{pronombre demostrativo|gl}} ====
;2: {{plm}}{{-sup|2}}.
{{ejemplo|'''Este''' vos digo eu que foi Pastor ben feito e dereito.|trad= '''Este''', os digo, era un pastor bien hecho y recto.}}
===Véase también===
* [[ese]]
* [[aquel]]
== {{lengua|hu}} ==
{{pron-graf|leng=hu|1fono1=ˈeʃ.te}}
=== Etimología 1 ===
{{etimología|leng=hu}}.
==== {{sustantivo|hu}} ====
;1: {{plm|noche}}; tiempo entre dos días en el que tanto el sol como su luz están ocultos bajo el horizonte.
{{ejemplo|[[Ma]] '''este''' felmegyek [[a]] szobádba|trad=Esta noche subiré a tu habitación.}}
== {{lengua|lad}} ==
{{pron-graf|leng=lad}}
=== Etimología 1 ===
{{etimología|leng=lad|osp|este|este}}, y este {{etim|leng=lad|la|iste}}.
==== {{adjetivo demostrativo|lad}} ====
;1: {{plm}}.
==== {{pronombre demostrativo|lad}} ====
;2: {{plm}}.
== {{lengua|la}} ==
{{pron-graf|leng=la|v1=edite}}
=== Forma flexiva ===
==== este ====
;1: {{imperativo latín|sum|2p|pra}}.
==== ēste ====
;2: {{imperativo latín|edo|alt=edō|num=1|2p|pra}}.
== {{lengua|lfn}} ==
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{sustantivo|lfn}} ===
;1: {{plm}}.
== {{lengua|mwl}} ==
{{pron-graf|leng=mwl}}
=== Etimología 1 ===
{{etimología|leng=mwl}}.
==== {{adjetivo demostrativo|mwl}} ====
;1: {{plm}}.
{{sinónimo|leng=mwl|aqueste}}.
==== {{pronombre demostrativo|mwl}} ====
;2: {{plm}}{{-sup|2}}.
{{sinónimo|leng=mwl|aqueste}}
== {{lengua|roa-oan}} ==
{{pron-graf|leng=roa-oan}}
=== Etimología 1 ===
{{etimología|leng=roa-oan|la|iste|alt=istum|este}}.
==== {{adjetivo demostrativo|roa-oan}} ====
;1: {{plm}}.
{{sinónimo|leng=roa-oan|aquesti}}
== {{lengua|pt}} ==
{{pron-graf|leng=pt|g1=êste|gnota1=obsoleta}}
=== Etimología 1 ===
{{etimología|leng=pt|roa-opt|este|este}}, y este {{etim|leng=pt|la|iste}}.
==== {{adjetivo demostrativo|pt}} ====
{{pt.adj|irreg|f=esta|fp=estas}}
;1: {{plm}}.
==== {{pronombre demostrativo|pt}} ====
;2: {{plm}}{{-sup|2}}.
=== Etimología 2 ===
{{etimología|leng=pt|fr|est|este}}, y este del inglés antiguo {{l+|an|east|ēast}}.
==== {{sustantivo masculino|pt}} ====
{{pt.sust}}
;1 {{csem|geografía|leng=pt}}: {{plm}} u {{l|es|oriente}}.
{{sinónimo|leng=pt|leste|nascente|oriente}}.
==== {{adjetivo|pt}} ====
{{pt.adj|ng}}
;2 {{csem|geografía|leng=pt}}: {{plm|oriental}}.
{{sinónimo|leng=pt|eoo|leste|oriental|nota=anticuado}}.
==== Información adicional ====
{{derivad|leng=pt|deste|neste}}
== {{lengua|ro}} ==
{{pron-graf|leng=ro|g1=есте|v1=e|vnota1=informal}}
=== Forma flexiva ===
==== Forma verbal ====
;1: {{f.v|leng=ro|fi|3s|pres|ind|pron=ea, el}}.
{{ejemplo|Ea '''este''' o femeie foarte frumoasă.|trad=Ella es una mujer hermosísima.}}
== Referencias y notas ==
<references />
tcgk3f7c8m0103mluk54j3yxvcrcw28
bello
0
7987
6307308
6032663
2026-08-05T21:26:49Z
26agcp
138617
/* {{lengua|it}} */ agrego formas irregulares e información adicional
6307308
wikitext
text/x-wiki
{{desambiguación|Bello|Belo}}
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-AdrianAbdulBaha-bello.wav|aunota=Colombia|h=Bello|h2=vello}}
=== Etimología ===
{{etimología2|Cultismo tomado del latín}} {{l+|la|bellus}}, diminutivo de {{l+|la|bonus}}, a su vez del preclásico {{l+|la|duonus}}, y este del protoindoeuropeo ''[[*dwene-]]'', en última instancia de la raíz ''[[*deu-]]'', "[[hacer]]".
=== {{adjetivo|es}} ===
{{es.adj|sup=bellísimo}}
;1: {{plm|agradable}} a los [[sentido]]s.
{{sinónimo|atractivo|bonito|guapo|hermoso|lindo|precioso}}.
{{antónimo|espantoso|feo|horrible|horroroso}}.
;2: Por extensión, de [[bueno|buena]] [[calidad]] o [[factura]].
=== Locuciones ===
* [[bellas artes]]
* [[bellas letras]]
* [[bello sexo]]: el femenino
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|ain|a1=1|t1=ピㇼカ|t2=ピㇽカ}}
{{t|de|a1=1|t1=schön}}
{{t|br|a1=1|t1=brav}}
{{t|bg|a1=1|t1=красив|t2=хубав|tl1=krasiv|tl2=hubav}}
{{t|eo|a1=1|t1=bela}}
{{t|fr|a1=1|t1=beau}}
{{t|el|a1=1|a2=1|t1=όμορφος|t2=ωραίος|tl1=ómorfos|tl2=oraíos}}
{{t|la|a1=1|t1=pulcher}}
{{t|en|a1=1|t1=beautiful|t2=fair}}
{{t|it|a1=1|t1=bello}}
{{t|yua|a1=1|t1=hats’uts}}
{{t|nl|a1=1|t1=mooi}}
{{t|mn|t1=сайхан}}
{{t|pt|a1=1|t1=belo}}
{{t|ru|a1=1|t1=красивый|tl1=krasivyj}}
{{t|sc|a1=1|t1=bellu}}
{{t|sa|i1=s|t1=सुन्दर|tl1=sundara}}
{{trad-abajo}}
== {{lengua|ia}} ==
{{pron-graf|leng=ia}}
=== Etimología ===
{{etimología|leng=ia|la|bellum}}
=== {{sustantivo|ia}} ===
;1: {{plm|guerra}}.
== {{lengua|it}} ==
{{pron-graf|leng=it|ayuda=bèllo|audio=It-bello.ogg|v=bel|v2=bell'}}
=== Etimología ===
{{etimología|leng=it|la|bellus}} y este diminutivo de {{l+|la|bonus}}, a su vez del preclásico {{l+|la|duonus}}, y este del protoindoeuropeo ''[[*dwene-]]'', en última instancia de la raíz ''[[*deu-]]'', "[[hacer]]"
==== {{adjetivo|it}} ====
{{it.adj|p=belli|p2=bei|p3=begli}}
;1: {{plm}}.
==== Información adicional ====
* Para el masculino singular, se usa ''bello'' antes de ''s'' impura, ''z'', ''ps'' y ''gn'', así como al final de la frase; se utiliza {{l+|it|bel}} antes de las demás consonantes y {{l+|it|bell'}} antes de vocales.
* Para el masculino plural, se usa {{l+|it|begli}} antes de ''s'' impura, ''z'', ''ps'', ''gn'' y vocales; se utiliza {{l+|it|belli}} al final de la frase y {{l+|it|bei}} en los demás casos.
* Para el femenino singular, se usa {{l+|it|bell'}} antes de vocal y {{l+|it|bella}} en todos los demás casos.
* Para el femenino plural, se usa siempre {{l+|it|belle}}.
== {{lengua|la}} ==
{{pron-graf|leng=la|v1=bellor|vnota1=deponente|ayuda=bellō}}
=== Etimología ===
{{etimología2|leng=la|de {{l+|la|bellum|glosa=guerra}}}}.
=== {{verbo intransitivo|la}} ===
;1: {{plm|guerrear}}.
{{sinónimo|leng=la|belligero|alt=belligerō}}
;2: {{plm|luchar}}, [[pelear]].
{{sinónimo|leng=la|belligero|dimico|pugno|alt=belligerō|alt2=dīmicō|alt3=pugnō}}
=== Conjugación ===
{{la.v|1+|nopasivo=v|bellō}}
== Referencias y notas ==
<references />
02lqlqjk6n4jnevd0gpfadepxolcykh
6307420
6307308
2026-08-06T04:25:02Z
26agcp
138617
/* Traducciones */
6307420
wikitext
text/x-wiki
{{desambiguación|Bello|Belo}}
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-AdrianAbdulBaha-bello.wav|aunota=Colombia|h=Bello|h2=vello}}
=== Etimología ===
{{etimología2|Cultismo tomado del latín}} {{l+|la|bellus}}, diminutivo de {{l+|la|bonus}}, a su vez del preclásico {{l+|la|duonus}}, y este del protoindoeuropeo ''[[*dwene-]]'', en última instancia de la raíz ''[[*deu-]]'', "[[hacer]]".
=== {{adjetivo|es}} ===
{{es.adj|sup=bellísimo}}
;1: {{plm|agradable}} a los [[sentido]]s.
{{sinónimo|atractivo|bonito|guapo|hermoso|lindo|precioso}}.
{{antónimo|espantoso|feo|horrible|horroroso}}.
;2: Por extensión, de [[bueno|buena]] [[calidad]] o [[factura]].
=== Locuciones ===
* [[bellas artes]]
* [[bellas letras]]
* [[bello sexo]]: el femenino
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|ain|a1=1|t1=ピㇼカ|tl1=pirka|t2=ピㇽカ|tl2=pirka}}
{{t|de|a1=1|t1=schön}}
{{t|br|a1=1|t1=brav}}
{{t|bg|a1=1|t1=красив|t2=хубав|tl1=krasiv|tl2=hubav}}
{{t|eo|a1=1|t1=bela}}
{{t|fr|a1=1|t1=beau}}
{{t|el|a1=1|a2=1|t1=όμορφος|t2=ωραίος|tl1=ómorfos|tl2=oraíos}}
{{t|en|a1=1|t1=beautiful|t2=fair}}
{{t|it|a1=1|t1=bello}}
{{t|la|a1=1|t1=pulcher}}
{{t|yua|a1=1|t1=jatsʼuts}}
{{t|mn|t1=сайхан|tl1=saihan}}
{{t|nl|a1=1|t1=mooi}}
{{t|pt|a1=1|t1=belo}}
{{t|ru|a1=1|t1=красивый|tl1=krasivyj}}
{{t|sa|i1=s|t1=सुन्दर|tl1=sundara}}
{{t|sc|a1=1|t1=bellu}}
{{trad-abajo}}
== {{lengua|ia}} ==
{{pron-graf|leng=ia}}
=== Etimología ===
{{etimología|leng=ia|la|bellum}}
=== {{sustantivo|ia}} ===
;1: {{plm|guerra}}.
== {{lengua|it}} ==
{{pron-graf|leng=it|ayuda=bèllo|audio=It-bello.ogg|v=bel|v2=bell'}}
=== Etimología ===
{{etimología|leng=it|la|bellus}} y este diminutivo de {{l+|la|bonus}}, a su vez del preclásico {{l+|la|duonus}}, y este del protoindoeuropeo ''[[*dwene-]]'', en última instancia de la raíz ''[[*deu-]]'', "[[hacer]]"
==== {{adjetivo|it}} ====
{{it.adj|p=belli|p2=bei|p3=begli}}
;1: {{plm}}.
==== Información adicional ====
* Para el masculino singular, se usa ''bello'' antes de ''s'' impura, ''z'', ''ps'' y ''gn'', así como al final de la frase; se utiliza {{l+|it|bel}} antes de las demás consonantes y {{l+|it|bell'}} antes de vocales.
* Para el masculino plural, se usa {{l+|it|begli}} antes de ''s'' impura, ''z'', ''ps'', ''gn'' y vocales; se utiliza {{l+|it|belli}} al final de la frase y {{l+|it|bei}} en los demás casos.
* Para el femenino singular, se usa {{l+|it|bell'}} antes de vocal y {{l+|it|bella}} en todos los demás casos.
* Para el femenino plural, se usa siempre {{l+|it|belle}}.
== {{lengua|la}} ==
{{pron-graf|leng=la|v1=bellor|vnota1=deponente|ayuda=bellō}}
=== Etimología ===
{{etimología2|leng=la|de {{l+|la|bellum|glosa=guerra}}}}.
=== {{verbo intransitivo|la}} ===
;1: {{plm|guerrear}}.
{{sinónimo|leng=la|belligero|alt=belligerō}}
;2: {{plm|luchar}}, [[pelear]].
{{sinónimo|leng=la|belligero|dimico|pugno|alt=belligerō|alt2=dīmicō|alt3=pugnō}}
=== Conjugación ===
{{la.v|1+|nopasivo=v|bellō}}
== Referencias y notas ==
<references />
qwrlp6h1i3q8qish8759bke59dsk76n
about
0
8386
6307284
5936052
2026-08-05T13:37:14Z
Intolerable situation
130039
/* {{lengua|en}} */
6307284
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|pron=EE. UU., Inglaterra|fono=əˈbaʊt|audio=LL-Q1860 (eng)-Back ache-about.wav|aunota=Londres|audio2=en-us-about.ogg|aunota2=California
|2pron=Canadá, Escocia|2fono=əˈbʌʊt|2fone2=əˈbɐʊt|2audio2=En-ca-about-real.ogg|2aunota2=Ontario|2audio3=En-ca-about.ogg|2aunota3=Columbia Británica|2fone4=əˈboʊt
|3pron=Canadá, Irlanda, Virginia|3fono=əˈbɛʊt
|ls=2
}}
=== Etimología ===
{{etimología|leng=en|ang|onbūtan}}.
=== {{preposición|en}} ===
;1: En círculo alrededor; en general; en todos los lados de; en el exterior de; alrededor.
{{ejemplo|The snake was coiled about his ankle.}}
;2:Sobre diferentes partes de; a través o por encima en varias direcciones; aquí y allá en; de un lado a otro; a lo largo.
{{ejemplo|Rubbish was strewn about the place.}}
{{ejemplo|The children were running about the room.}}
{{ejemplo|He was well known about town.}}
;3: {{plm|acerca}} de.
;4: {{plm|sobre}}.
;5: Con respecto a.
;6: {{plm|cerca}} de.
=== {{adverbio|en}} ===
{{en.adv|inc}}
;5: Más o menos.
;6: A punto de.
;7: {{plm|alrededor de}}.
=== Locuciones ===
* [[bring about]]
* [[come about]]
* [[go about]]
* [[round about]]
* [[set about]]
== Referencias y notas ==
<references />
nbwtvj5cu87ws0wxckkm96dv4sk7xid
mambí
0
13163
6307367
5712270
2026-08-06T00:38:17Z
TMCbot
164594
.
6307367
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|bnt-pro|-mbi|insurrecto}}
=== {{sustantivo masculino y femenino|es}} ===
{{es.sust|irreg|p=mambises|p2=mambíes|f=mambisa|fp=mambisas}}
;1: {{plm|insurrecto}} alzado contra [[España]] durante la [[lucha]] por la [[independencia]] de las [[isla]]s de [[Santo Domingo]] y de [[Cuba]].
{{uso|utca}}
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
{{trad-abajo}}
== Referencias y notas ==
<references />
91vixkijadq4xz194lvh3u6ras9cp5n
champú
0
14734
6307354
5974741
2026-08-06T00:37:47Z
TMCbot
164594
.
6307354
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|g1=shampoo|g2=shampú}}
[[Archivo:Shampoo.jpg|thumb|[1]]]
=== Etimología ===
{{etimología|en|shampoo}}, y este de origen anglo-indio, del hindi {{l+|hi|चाँपो}} (''champo''), forma imperativa de {{l+|hi|चाँपना}} (''champna'', "[[amasar]]", "[[presionar]]"), a su vez del sánscrito {{l+|sa|चपयति}}.
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1: {{plm|producto}} de [[higiene]] para el [[pelo]], conteniendo [[jabón]] u otro [[tensioactivo]], [[aroma]]s y otros ingredientes.
;2: {{plm|vino}} espumoso elaborado conforme al método "champenoise" en la [[región]] de [[Champaña]], [[Francia]]. Se trata generalmente de un [[vino blanco]], aunque también existe el champán rosado, que elabora a partir de varios tipos de [[uva]], la mayor parte [[tinta]]s.<ref>{{Lunfa2000|viñeta=no}}</ref>
{{ámbito|Rioplatense}}.
{{uso|Lunfardismo}}.
{{sinónimo|champagne|champán|champaña}}.
;3: {{plm|corrección}} [[verbal]] de marcada [[vehemencia]].{{cita requerida}}
{{ámbito|España}}.
{{uso|coloquial}}.
{{sinónimo|amonestación|bronca|reconvención|regañina|reprimenda}}.
=== Véase también ===
* [[champús]] (bebida)
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|a1=1|t1=Shampoo|a2=2|t2=Champagner}}
{{t|ar|a1=1|t1=شامبو|a2=2|t2=شامبانيا}}
{{t|ast|a1=1|t1=xampú|a2=2|t2=xampán}}
{{t|bn|a1=1|t1=শ্যাম্পু}}
{{t|ca|a1=1|t1=xampú|a2=2|t2=xampany}}
{{t|cs|a1=1|t1=šampon|a2=2|t2=šampaňské víno}}
{{t|zh|a1=1|t1=洗髮精|a2=2|t2=香檳酒}}
{{t|ko|a1=1|t1=샴푸}}
{{t|da|a1=1|t1=shampoo}}
{{t|eo|a1=1|t1=ŝampuo|a2=2|t2=ĉampano}}
{{t|eu|a1=1|t1=xanpu}}
{{t|fi|a1=1|t1=sampoo|a2=2|t2=samppanja}}
{{t|fr|a1=1|t1=shampoing|a2=2|t2=champagne}}
{{t|gl|a1=1|t1=xampú}}
{{t|el|a1=1|t1=σαμπουάν}}
{{t|he|a1=1|t1=שמפו|a2=2|t2=שמפניה}}
{{t|hi|a1=1|t1=शैंपू}}
{{t|hu|a1=1|t1=sampon|a2=2|t2=pezsgő}}
{{t|id|a1=1|t1=sampo|a2=2|t2=sampanye}}
{{t|en|a1=1|t1=shampoo|a2=2|t2=Champagne}}
{{t|ga|a1=1|t1=foltfholcadh}}
{{t|it|a1=1|t1=shampoo|a2=2|t2=champagne}}
{{t|ja|a1=1|t1=シャンプー}}
{{t|lb|a1=1|t1=shampoing}}
{{t|nl|a1=1|t1=shampoo|a2=2|t2=Champagne}}
{{t|nb|a1=1|a2=2|t1=sjampo|t2=Champagne}}
{{t|fa|a1=1|t1=شامپو}}
{{t|pl|a1=1|t1=szampon|a2=2|t2=szampan}}
{{t|pt|a1=1|t1=champô|t2=xampu|a3=2|t3=champanhe}}
{{t|ro|a1=1|t1=șampon}}
{{t|ru|a1=1|t1=шампунь}}
{{t|scn|a1=1|t1=sciampù}}
{{t|sv|a1=1|t1=schampo}}
{{t|th|a1=1|t1=แชมพู}}
{{t|tr|a1=1|t1=şampuan}}
{{t|uk|a1=1|t1=шампунь}}
{{trad-abajo}}
== Referencias y notas ==
<references />
by9vr801vkkv9qzdbttscbhl0vdh4x6
arco
0
15479
6307395
6118264
2026-08-06T01:39:33Z
Intolerable situation
130039
/* Traducciones */
6307395
wikitext
text/x-wiki
{{desambiguación|Arco}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|arcus}}
=== {{sustantivo masculino|es}} ===
{{es.sust}}
;1 {{csem|armas}}: Arma elaborada a partir de una barra material [[elástico]] amarrada por ambos extremos a una cuerda la cual se utiliza para impulsar [[flecha]]s.
;2 {{csem|geometría}}: Sección continua de una [[curva]].
{{sinónimo|segmento}}.
;3 {{csem|arquitectura}}: Elemento que permite sustentar el [[peso]] de una [[construcción]] sobre un hueco practicado en un muro o sobre columnas exentas.
;4 {{csem|física}}: {{plm|descarga}} [[eléctrico|eléctrica]] que se forma entre dos [[electrodo]]s colocados en una atmósfera [[gaseoso|gaseosa]].
;5 {{csem|música}}: Vara utilizada para frotar de los instrumentos musicales de cuerda.
;6 {{csem|fútbol}}: {{plm|portería}}.
;7 {{csem|fútbol}}: {{plm|saque de arco}}.
=== Locuciones ===
*[[arco de celosía]]
*[[arco lanceolado]]
*[[arco de descarga]]
*[[arco huno]]
*[[arco mayuelo]]
*[[arco peraltado]]
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|a1=1,2,3,4,5|t1=Bogen|g1=m}}
{{t|br|a1=1,5|t1=gwareg|g1=f}}
{{t|bg|t1=дъга|g1=f|t2=арка|g2=f|t3=свод|g3=m|t4=лък|g4=m}}
{{t|ko|a1=1|t1=활|tl1=hwal|a2=3|t2=아치|tl2=achi}}
{{t|fr|a1=1,3|t1=arc|g1=m|a2=2|t2=courbe|g2=f|a3=5|t3=archet|g3=m}}
{{t|en|a1=1,5|t1=bow|a2=2,4|t2=arc|a3=3|t3=arch}}
{{t|it|a1=1,2|t1=arco}}
{{t|nl|a1=1,2,3,4|t1=boog|g1=m|a2=5|t2=strijkstok|g2=m}}
{{t|pl|a1=1,2|t1=łuk}}
{{t|ru|a1=1|t1=лук|g1=m|a2=2,4|t2=дуга|g2=f|a3=3|t3=арка|g3=f|a4=5|t4=смычок|g4=m}}
{{trad-abajo}}
== Referencias y notas ==
<references />
nbrpebobdmhrj65gkr90d4y0nvgr19z
amateur
0
16221
6307313
5910089
2026-08-05T23:33:55Z
Tmagc
158167
6307313
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|fr}}
=== {{adjetivo|es}} ===
{{es.adj|s=s}}
;1: {{plm|diletante}}, [[aficionado]].
{{uso|utcsmf}}.
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
{{trad-abajo}}
== {{lengua|fr}} ==
{{pron-graf|leng=fr|fono=a.ma.tœʁ}}
=== Etimología ===
{{etimología|la|amator|leng=fr}}
=== {{adjetivo|fr}} ===
{{fr.adj}}
;1: {{plm}}.
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología ===
{{etimología|leng=nl}}
=== {{adjetivo|nl}} ===
{{nl.sust|-s|+}}
;1: {{plm}}.
== Referencias y notas ==
<references />
rrktcz8tnyzwyzavu9iq4ismoqnvofm
Sahara Occidental
0
18631
6307389
6036331
2026-08-06T01:14:23Z
Tmagc
158167
6307389
wikitext
text/x-wiki
{{desambiguación|Sáhara Occidental}}
== {{lengua|es}} ==
{{pron-graf|v1=Sáhara Occidental}}
=== {{sustantivo|es|propio|masculino}} ===
[[Archivo:Sahrawi Arab Democratic Republic in its region (claimed hatched).svg|miniaturadeimagen|[1] Ubicación resaltada en rojo, territorios en disputa sombreados]]
;1 {{csem|países}}: {{plm|país}} ubicado en el {{l|es|este}} del {{l|es|África}} {{l|es|sahariano|sahariana}}. {{l|es|limitar|Limita}} con el {{l|es|océano Atlántico}}, {{l|es|Marruecos}}, {{l|es|Argelia}} y {{l|es|Mauritania}}.<ref name="DPD">{{DPD|Sahara|2021-12-6}}</ref>
{{topónimo|capital1=El Aaiún|gentilicio1=saharaui|idioma1=árabe|idioma2=español|iso1=732|iso2=ESH|iso3=EH|moneda1=peseta|nombre1=República Árabe Saharaui Democrática|símbolo1=🇪🇭}}
=== Véase también ===
* {{l|es|Bukraa}}
* {{l|es|La Güera}}, {{l|es|La Agüera}}, {{l|es|Lagouira}} o {{l|es|Lagwira}}
* [[:Categoría:Sahara Occidental|Categoría:Sahara Occidental]]
{{Commons}}
{{Wikipedia}}
{{Wikinoticias}}
=== Traducciones ===
{{trad-arriba}}
{{t|ast|a1=1|t1=El Sáḥara Occidental}}
{{t|en|a1=1|t1=Western Sahara}}
{{t|mn|t1=Баруун Сахар}}
{{t|pl|t1=Sahara Zachodnia}}
{{trad-abajo}}
== Referencias y notas ==
<references />
quk0mmhfzx7poa7fwx882we09qb4ew6
pico
0
20338
6307301
6108684
2026-08-05T18:49:33Z
Tmagc
158167
6307301
wikitext
text/x-wiki
{{desambiguación|pico-|picó}}
== {{lengua|es}} ==
{{pron-graf|1audio1=LL-Q1321 (spa)-AdrianAbdulBaha-pico.wav|1aunota1=Colombia}}
=== Etimología 1 ===
{{etimología|osp|bico}}, {{etim|la|beccus}}, préstamo {{etim|cel-gau|*bekkos}}. El cambio a p- viene por influjo de {{l+|es|picar}}.
[[Image:Pelican.great.white.arp.750pix.jpg|thumb|[1]]]
[[Image:Pickaxe.jpg|thumb|[7]]]
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|Zootomía}}: {{ucf|estructura}} [[óseo]]-[[vascular]] que cubre la [[boca]] y [[nariz]] de las [[ave]]s, adaptada a sus [[hábito]]s [[alimentario]]s.
;2 {{csem|Entomología}}: Por extensión, [[órgano]] [[análogo]] en los [[insecto]]s.
;3 {{csem|Anatomía}}: Por extensión, [[espacio]] limitado por la boca y la [[faringe]], donde se realiza la [[masticación]] y parte de la [[deglución]], además del [[habla]] en el [[ser humano]].
{{uso|coloquial}}.
{{sinónimo|boca|cavidad bucal|cavidad oral}}
;4: Por metonimia, [[beso]] en el que sólo se juntan los [[labio|labios]] de una persona con los de otra para retirarlos inmediatamente.
{{uso|coloquial}}.
{{ámbito|Bolivia|Colombia}}.<ref name=drae>{{DRAE2001}}</ref>
{{sinónimo|pato}}
;5: {{ucf|canal}} junto a la [[boca]] de algunos [[recipiente]]s para facilitar el [[vertido]] de sus [[contenido]]s.
;6: Más generalmente, [[saliente]] [[puntiagudo]] de cualquier cosa.
;7 {{csem|herramientas}}: {{plm|herramienta}} formada por un [[mango]] largo con un hierro curvo en el extremo que sirve para [[cavar]].
{{sinónimo|picota}}
;8 {{csem|Geografía}}: {{ucf|cima}} [[agudo|aguda]] de una [[montaña]].
;9: Por extensión, la misma montaña que tiene un pico<sub>7</sub>.
;10: {{plm|cantidad}} pequeña e indeterminada que se suma a una dicha anteriormente.
{{uso|coloquial}}.
;11: {{ucf|dosis}} de [[heroína]].
{{ámbito|España}}
{{uso|jerga}}.
;12: {{plm|pene}}.
{{ámbito|Chile|Costa Rica}}.<ref name=drae/>
{{uso|malsonante}}.
{{wikisauro|pene}}
==== {{adverbio de negación|es}} ====
;13: Definitivamente no. {{impropia|Si le sigue la frase negada, es acompañado de la conjunción [[que]]}}.
{{ámbito|Chile}}
{{uso|malsonante|vulgar}}
{{sinónimo|las bolas|nota=malsonante, Chile|mis cojones|nota2=malsonante, España|ni cagando|nota3=malsonante, Chile}}
{{ejemplo|el marinero se tomó con una mano la entrepierna y la sacudió con furor. “¡'''''Pico''''', conchetumadre! ¡'''''Pico''''' que nos rendimos!”.|título=Prat|editorial=Santillana|páginas=112|c=libro|a=Patricio Jara|fecha=2014}}
==== Véase también ====
{{w}}
* [[picos]]
==== Locuciones ====
{{trad-arriba|Locuciones con «pico»}}
* [[pico a viento]]
* [[pico de cigüeña]]
* [[pico de frasco]]
* [[pico de gallo]]
* [[pico de lapa]]
* [[pico de oro]]: Persona que habla muy bien y tiene facilidad para [[convencer]]
* [[pico por sí]]
* [[azadón de pico]]
* [[de pico]]
* [[hora pico]]
* [[jarabe de pico]]
* [[sombrero de tres picos]]
* [[a pico de jarro]]
* [[abrir el pico]]: hablar usualmente en perjuicio de algo o de alguien.
* [[andar a picos pardos|andar a]] o [[andar de picos pardos|de picos pardos]]
* [[cerrar el pico]]: Callarse
* [[chupar el pico]]: Realizar una [[felación]] o, en sentido figurado, adular (Chile, malsonante)
* [[como el pico]]: muy mal (Chile, malsonante)
* [[cortado a pico]]
* [[el día del pico]]: en el futuro lejano o jamás (Chile, malsonante)
* [[echar mucho pico]]
* [[echar pico y pala]]: hacer trabajos manuales extenuantes al aire libre (Venezuela, coloquial)
* [[echarse al pico]]: aniquilar
* [[el pico no tiene ojos]] (Chile, malsonante)
* [[hacer el pico]]
* [[hacer pico]]: dañar o destruir (Chile, malsonante)
* [[hecho un pico]]: a gran velocidad (Chile, malsonante)
* [[hincar el pico]]
* [[hora pico]]: hora de mayor afluencia vehicular en las calles (Venezuela)
* [[irse de picos pardos]]
* [[limpiar el pico]]
* [[llevar en el pico]]
* [[meter el pico en el ojo]]: engañar a alguien o aprovecharse de su buena fe (Chile, malsonante)
* [[ni pico]]: nada (Chile, malsonante)
* [[pa'l pico]]: muy mal (Chile, malsonante)
* [[parar el pico]]:
**ponerse a dieta (Venezuela, coloquial)
**provocar una erección (Chile; malsonante, coloquial)
* [[perder por el pico]]
* [[poner en pico]]
* [[tener en el pico de la lengua]]
* [[tener mucho pico]]
* [[valer pico]]: no valer nada (Chile, vulgar)
* [[y pico]]: cantidad indeterminada (Venezuela, coloquial)
{{trad-abajo}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|a1=1,3|t1=Schnabel|g1=m|a2=7|t2=Spitzhacke|g2=f|a3=8|t3=Gipfel|g3=m|a4=12|t4=Schwanz}}
{{t|ar|a1=1|t1=منقار}}
{{t|nds-de|a1=1|t1=sneb}}
{{t|sh|a1=1|t1=kljun}}
{{t|br|a1=1|t1=pigos|g1=m}}
{{t|bg|a1=1|t1=човка|t2=клюн|a3=3|t3=уста|a4=4|t4=целувка|a5=7|t5=кирка|a6=8|t6=връх}}
{{t|ca|a1=1|t1=bec|a2=7|t2=aixada}}
{{t|cs|a1=1|t1=zobák|a2=7|t2=krumpáč}}
{{t|ko|a1=1|t1=부리|a2=7|t2=곡괭이}}
{{t|hr|a1=1|t1=kljun}}
{{t|da|a1=1|t1=næb}}
{{t|sk|a1=1|t1=zobák}}
{{t|sl|a1=1|t1=kljun}}
{{t|eo|a1=1|t1=beko}}
{{t|et|a1=1|t1=nokk}}
{{t|eu|a1=1|t1=moko|a2=7|t2=pikotx}}
{{t|fi|a1=1|t1=nokka}}
{{t|fr|a1=1|t1=bec|a2=7|t2=pioche}}
{{t|fy|a1=1|t1=snaffel}}
{{t|gl|a1=1|t1=peteiro}}
{{t|ka|a1=1|t1=ნისკარტი}}
{{t|he|a1=1|t1=מקור}}
{{t|hu|a1=1|t1=csőr}}
{{t|io|a1=1|t1=beko}}
{{t|id|a1=1|t1=paruh}}
{{t|en|a1=1|t1=beak|t2=bill|a3=4|t3=peck|a4=5|t4=spout|a5=7|t5=pickaxe|a6=13|t6=peak my ass}}
{{t|ga|a1=1|t1=gob|a2=7|t2=piocóid}}
{{t|it|a1=1|t1=becco|a2=7|t2=piccone}}
{{t|ja|a1=1|t1=くちばし|a2=7|t2=つるはし}}
{{t|la|a1=1|t1=rostrum}}
{{t|lt|a1=1|t1=snapas}}
{{t|ml|a1=1|t1=കൊക്ക്}}
{{t|ms|a1=1|t1=paruh}}
{{t|zh|a1=1|t1=喙}}
{{t|nhn|a1=1|t1=tehuitztli}}
{{t|nap|a1=1|t1=pizzo}}
{{t|nl|a1=1|t1=snavel|a2=7|t2=houweel}}
{{t|nb|a1=1|t1=nebb}}
{{t|nn|a1=1|t1=nebb}}
{{t|oc|a1=1|t1=bèc}}
{{t|pl|a1=1|t1=dziób|a2=7|t2=kilof}}
{{t|pt|a1=1|t1=bico|a2=7|t2=picareta}}
{{t|qu|a1=1|t1=chhukruna}}
{{t|ru|a1=1|t1=клюв|a2=7|t2=кайло}}
{{t|sc|a1=1|t1=biccu}}
{{t|sh|a1=1|t1=kljun}}
{{t|scn|a1=1|t1=pizzu}}
{{t|sv|a1=1|t1=näbb}}
{{t|tr|a1=1|t1=kuş gagası}}
{{t|uk|a1=1|t1=дзьоб}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|la|picus}}.
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|aves}}: (''[[wikispecies:Picinae|subfamilia Picinae]]'') Cualquiera de las especies de [[ave]] trepadora de pico largo y delgado, pero muy fuerte, que se alimenta de insectos que captura entre las cortezas y se caracteriza por el hábito de golpear y picar en los troncos de árboles.
{{sinónimo|carpintero (América)|pájaro carpintero|pito (España)|picamaderos (España)|picapinos (España)|pico barreno (España)|pico carpintero (España)}}
;2 {{csem|crustáceos}}: Tipo de [[crustáceo]] [[w:Cirripedia|cirrípedo]], cuya forma es similar a la cabeza del pico{{-sub|1}} (ave) y de carne comestible.{{definición imprecisa}}
==== Véase también ====
{{W|Picinae|Pico}}
* [[pájaro carpintero]]
==== Locuciones ====
* [[pico barreno]]
* [[pico cangrejo]]
* [[pico carpintero]]
* [[pico verde]]
==== Traducciones ====
{{trad-arriba}}
{{t|ast|a1=1|t1=picatueru|g1=m}}
{{t|cs|a1=1|t1=datel|g1=m}}
{{t|en|a1=1|t1=woodpecker}}
{{trad-abajo}}
=== Forma flexiva ===
==== Forma verbal ====
;1: {{forma verbo|picar|p=1s|t=presente|m=indicativo|pronominal=s}}.
== Referencias y notas ==
<references />
3l3208ox8v0e8ylv7myb3y29q13uqdl
6307303
6307301
2026-08-05T19:15:47Z
Tmagc
158167
/* Traducciones */
6307303
wikitext
text/x-wiki
{{desambiguación|pico-|picó}}
== {{lengua|es}} ==
{{pron-graf|1audio1=LL-Q1321 (spa)-AdrianAbdulBaha-pico.wav|1aunota1=Colombia}}
=== Etimología 1 ===
{{etimología|osp|bico}}, {{etim|la|beccus}}, préstamo {{etim|cel-gau|*bekkos}}. El cambio a p- viene por influjo de {{l+|es|picar}}.
[[Image:Pelican.great.white.arp.750pix.jpg|thumb|[1]]]
[[Image:Pickaxe.jpg|thumb|[7]]]
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|Zootomía}}: {{ucf|estructura}} [[óseo]]-[[vascular]] que cubre la [[boca]] y [[nariz]] de las [[ave]]s, adaptada a sus [[hábito]]s [[alimentario]]s.
;2 {{csem|Entomología}}: Por extensión, [[órgano]] [[análogo]] en los [[insecto]]s.
;3 {{csem|Anatomía}}: Por extensión, [[espacio]] limitado por la boca y la [[faringe]], donde se realiza la [[masticación]] y parte de la [[deglución]], además del [[habla]] en el [[ser humano]].
{{uso|coloquial}}.
{{sinónimo|boca|cavidad bucal|cavidad oral}}
;4: Por metonimia, [[beso]] en el que sólo se juntan los [[labio|labios]] de una persona con los de otra para retirarlos inmediatamente.
{{uso|coloquial}}.
{{ámbito|Bolivia|Colombia}}.<ref name=drae>{{DRAE2001}}</ref>
{{sinónimo|pato}}
;5: {{ucf|canal}} junto a la [[boca]] de algunos [[recipiente]]s para facilitar el [[vertido]] de sus [[contenido]]s.
;6: Más generalmente, [[saliente]] [[puntiagudo]] de cualquier cosa.
;7 {{csem|herramientas}}: {{plm|herramienta}} formada por un [[mango]] largo con un hierro curvo en el extremo que sirve para [[cavar]].
{{sinónimo|picota}}
;8 {{csem|Geografía}}: {{ucf|cima}} [[agudo|aguda]] de una [[montaña]].
;9: Por extensión, la misma montaña que tiene un pico<sub>7</sub>.
;10: {{plm|cantidad}} pequeña e indeterminada que se suma a una dicha anteriormente.
{{uso|coloquial}}.
;11: {{ucf|dosis}} de [[heroína]].
{{ámbito|España}}
{{uso|jerga}}.
;12: {{plm|pene}}.
{{ámbito|Chile|Costa Rica}}.<ref name=drae/>
{{uso|malsonante}}.
{{wikisauro|pene}}
==== {{adverbio de negación|es}} ====
;13: Definitivamente no. {{impropia|Si le sigue la frase negada, es acompañado de la conjunción [[que]]}}.
{{ámbito|Chile}}
{{uso|malsonante|vulgar}}
{{sinónimo|las bolas|nota=malsonante, Chile|mis cojones|nota2=malsonante, España|ni cagando|nota3=malsonante, Chile}}
{{ejemplo|el marinero se tomó con una mano la entrepierna y la sacudió con furor. “¡'''''Pico''''', conchetumadre! ¡'''''Pico''''' que nos rendimos!”.|título=Prat|editorial=Santillana|páginas=112|c=libro|a=Patricio Jara|fecha=2014}}
==== Véase también ====
{{w}}
* [[picos]]
==== Locuciones ====
{{trad-arriba|Locuciones con «pico»}}
* [[pico a viento]]
* [[pico de cigüeña]]
* [[pico de frasco]]
* [[pico de gallo]]
* [[pico de lapa]]
* [[pico de oro]]: Persona que habla muy bien y tiene facilidad para [[convencer]]
* [[pico por sí]]
* [[azadón de pico]]
* [[de pico]]
* [[hora pico]]
* [[jarabe de pico]]
* [[sombrero de tres picos]]
* [[a pico de jarro]]
* [[abrir el pico]]: hablar usualmente en perjuicio de algo o de alguien.
* [[andar a picos pardos|andar a]] o [[andar de picos pardos|de picos pardos]]
* [[cerrar el pico]]: Callarse
* [[chupar el pico]]: Realizar una [[felación]] o, en sentido figurado, adular (Chile, malsonante)
* [[como el pico]]: muy mal (Chile, malsonante)
* [[cortado a pico]]
* [[el día del pico]]: en el futuro lejano o jamás (Chile, malsonante)
* [[echar mucho pico]]
* [[echar pico y pala]]: hacer trabajos manuales extenuantes al aire libre (Venezuela, coloquial)
* [[echarse al pico]]: aniquilar
* [[el pico no tiene ojos]] (Chile, malsonante)
* [[hacer el pico]]
* [[hacer pico]]: dañar o destruir (Chile, malsonante)
* [[hecho un pico]]: a gran velocidad (Chile, malsonante)
* [[hincar el pico]]
* [[hora pico]]: hora de mayor afluencia vehicular en las calles (Venezuela)
* [[irse de picos pardos]]
* [[limpiar el pico]]
* [[llevar en el pico]]
* [[meter el pico en el ojo]]: engañar a alguien o aprovecharse de su buena fe (Chile, malsonante)
* [[ni pico]]: nada (Chile, malsonante)
* [[pa'l pico]]: muy mal (Chile, malsonante)
* [[parar el pico]]:
**ponerse a dieta (Venezuela, coloquial)
**provocar una erección (Chile; malsonante, coloquial)
* [[perder por el pico]]
* [[poner en pico]]
* [[tener en el pico de la lengua]]
* [[tener mucho pico]]
* [[valer pico]]: no valer nada (Chile, vulgar)
* [[y pico]]: cantidad indeterminada (Venezuela, coloquial)
{{trad-abajo}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|a1=1,3|t1=Schnabel|g1=m|a2=7|t2=Spitzhacke|g2=f|a3=8|t3=Gipfel|g3=m|a4=12|t4=Schwanz}}
{{t|ar|a1=1|t1=منقار}}
{{t|nds-de|a1=1|t1=sneb}}
{{t|sh|a1=1|t1=kljun}}
{{t|br|a1=1|t1=pigos|g1=m}}
{{t|bg|a1=1|t1=човка|t2=клюн|a3=3|t3=уста|a4=4|t4=целувка|a5=7|t5=кирка|a6=8|t6=връх}}
{{t|ca|a1=1|t1=bec|a2=7|t2=aixada}}
{{t|cs|a1=1|t1=zobák|a2=7|t2=krumpáč}}
{{t|ko|a1=1|t1=부리|a2=7|t2=곡괭이}}
{{t|da|a1=1|t1=næb}}
{{t|sk|a1=1|t1=zobák}}
{{t|sl|a1=1|t1=kljun}}
{{t|eo|a1=1|t1=beko}}
{{t|et|a1=1|t1=nokk}}
{{t|eu|a1=1|t1=moko|a2=7|t2=pikotx}}
{{t|fi|a1=1|t1=nokka}}
{{t|fr|a1=1|t1=bec|a2=7|t2=pioche}}
{{t|fy|a1=1|t1=snaffel}}
{{t|gl|a1=1|t1=peteiro}}
{{t|ka|a1=1|t1=ნისკარტი}}
{{t|he|a1=1|t1=מקור}}
{{t|hu|a1=1|t1=csőr}}
{{t|io|a1=1|t1=beko}}
{{t|id|a1=1|t1=paruh}}
{{t|en|a1=1|t1=beak|t2=bill|a3=4|t3=peck|a4=5|t4=spout|a5=7|t5=pickaxe|a6=13|t6=peak my ass}}
{{t|ga|a1=1|t1=gob|a2=7|t2=piocóid}}
{{t|it|a1=1|t1=becco|a2=7|t2=piccone}}
{{t|ja|a1=1|t1=くちばし|a2=7|t2=つるはし}}
{{t|la|a1=1|t1=rostrum}}
{{t|lt|a1=1|t1=snapas}}
{{t|ml|a1=1|t1=കൊക്ക്}}
{{t|ms|a1=1|t1=paruh}}
{{t|zh|a1=1|t1=喙}}
{{t|nhn|a1=1|t1=tehuitztli}}
{{t|nap|a1=1|t1=pizzo}}
{{t|nl|a1=1|t1=snavel|a2=7|t2=houweel}}
{{t|nb|a1=1|t1=nebb}}
{{t|nn|a1=1|t1=nebb}}
{{t|oc|a1=1|t1=bèc}}
{{t|pl|a1=1|t1=dziób|a2=7|t2=kilof}}
{{t|pt|a1=1|t1=bico|a2=7|t2=picareta}}
{{t|qu|a1=1|t1=chhukruna}}
{{t|ru|a1=1|t1=клюв|a2=7|t2=кайло}}
{{t|sc|a1=1|t1=biccu}}
{{t|sh|a1=1|t1=kljun}}
{{t|scn|a1=1|t1=pizzu}}
{{t|sv|a1=1|t1=näbb}}
{{t|tr|a1=1|t1=kuş gagası}}
{{t|uk|a1=1|t1=дзьоб}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|la|picus}}.
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|aves}}: (''[[wikispecies:Picinae|subfamilia Picinae]]'') Cualquiera de las especies de [[ave]] trepadora de pico largo y delgado, pero muy fuerte, que se alimenta de insectos que captura entre las cortezas y se caracteriza por el hábito de golpear y picar en los troncos de árboles.
{{sinónimo|carpintero (América)|pájaro carpintero|pito (España)|picamaderos (España)|picapinos (España)|pico barreno (España)|pico carpintero (España)}}
;2 {{csem|crustáceos}}: Tipo de [[crustáceo]] [[w:Cirripedia|cirrípedo]], cuya forma es similar a la cabeza del pico{{-sub|1}} (ave) y de carne comestible.{{definición imprecisa}}
==== Véase también ====
{{W|Picinae|Pico}}
* [[pájaro carpintero]]
==== Locuciones ====
* [[pico barreno]]
* [[pico cangrejo]]
* [[pico carpintero]]
* [[pico verde]]
==== Traducciones ====
{{trad-arriba}}
{{t|ast|a1=1|t1=picatueru|g1=m}}
{{t|cs|a1=1|t1=datel|g1=m}}
{{t|en|a1=1|t1=woodpecker}}
{{trad-abajo}}
=== Forma flexiva ===
==== Forma verbal ====
;1: {{forma verbo|picar|p=1s|t=presente|m=indicativo|pronominal=s}}.
== Referencias y notas ==
<references />
4ufdy740ibi26px1bvunpnf66fib9ta
nova
0
23454
6307370
6269349
2026-08-06T00:38:23Z
TMCbot
164594
.
6307370
wikitext
text/x-wiki
{{desambiguación|nová|Nova}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la|nova}}, de {{l+|la|novus|glosa=nuevo}}.
==== {{sustantivo femenino|es}} ====
{{es.sust}}
;1: {{plm|estrella}} que se vuelve extremadamente [[brillante]] para unos pocos días por una [[explosión]] [[termonuclear]] en la [[superficie]].
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|t1=Nova}}
{{t|en|t1=nova}}
{{t|fr|t1=nova}}
{{t|ko|t1=신성}}
{{t|ja|t1=新星}}
{{trad-abajo}}
=== Forma flexiva ===
==== Forma verbal ====
;1: {{f.v|novar|3s|pres|ind}}.
;2: {{f.v|novar|tú|imperativo}}.
== {{lengua|eo}} ==
{{pron-graf|leng=eo}}
=== Etimología 1 ===
{{etimología|leng=eo|la|novus}}.
==== {{adjetivo|eo}} ====
;1: {{plm|nuevo}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Forma flexiva ===
==== Forma adjetiva ====
;1: {{f.adj2|leng=ca|nou|f|s}}.
== {{lengua|fr}} ==
{{pron-graf|leng=fr}}
=== Etimología 1 ===
{{etimología|leng=fr|la|nova}}, de {{l+|la|novus|glosa=nuevo}}.
==== {{sustantivo femenino|fr}} ====
{{fr.sust|irreg|p=novas|p2=novæ[†]|p3=novae[†]}}
;1: {{plm|nova}}.
== {{lengua|en}} ==
{{pron-graf|leng=en}}
=== Etimología 1 ===
{{etimología|leng=en|la|nova}}, de {{l+|la|novus|glosa=nuevo}}.
==== {{sustantivo|en}} ====
{{en.sust|c|novas|novae}}
;1: {{plm|nova}}.
== {{lengua|lfn}} ==
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{adjetivo|lfn}} ===
;1: {{plm|nuevo}}.
== Referencias y notas ==
<references />
32fuoaobub7lyf9b2q0qd11p05gm6yx
el
0
26168
6307362
5923237
2026-08-06T00:38:01Z
TMCbot
164594
.
6307362
wikitext
text/x-wiki
{{desambiguación|-el|EL|e.l.|el-|el.|Él|æl|él|èl|êl|'el}}
== {{lengua|es}} ==
{{pron-graf|1audio1=LL-Q1321 (spa)-Rodelar-él.wav|h1=él}}
=== Etimología 1 ===
{{etimología|osp|el|el}}, y este {{etim|la|ille}}, {{etim|itc-ola|olle}}, de la raíz protoindoeuropea ''[[h₂ol-no-]],'' de ''[[h₂el-]]'' ("más allá")''.''.
==== {{artículo determinado|es}} ====
{{es.adj|irreg|los|la|las|neutro=lo}}
;1: {{impropia|{{plm|artículo determinado}} masculino singular}}.
==== Información adicional ====
* [[anteceder|antecede]] a [[sustantivo]]s masculinos o transforma en sustantivo a la palabra o frase que anteceda.
* denota que el sustantivo al que antecede debe tomarse como información general, [[definido|definida]] o [[consabido|consabida]].
* En la oración "recibí el mensaje", ''el'' denota un "mensaje" específico de cuya existencia ya sabía el hablante.
* En la oración "el ejercicio es saludable", ''el'' denota que el "ejercicio" se entiende en sentido general.
==== Véase también ====
{{w}}
* [[artículo]]
* [[artículo determinado]] o [[artículo definido]]
* [[Wikcionario:Categorías gramaticales]]
==== Traducciones ====
{{trad-arriba}}
{{t|de|t1=der}}
{{t|an|t1=o}}
{{t|br|t1=ar|t2=an|t3=al}}
{{t|ca|t1=el}}
{{t|kw|t1=an}}
{{t|eo|t1=la}}
{{t|eu|t1=-a}}
{{t|fr|t1=le}}
{{t|gl|t1=o}}
{{t|cy|t1=y|t2=yr|t3='r}}
{{t|el|t1=ο|t2=τον|tl1=o|tl2=ton}}
{{t|en|t1=the}}
{{t|ia|t1=le}}
{{t|ga|t1=an}}
{{t|it|t1=il|t2=lo|t3=l'}}
{{t|nci|t1=in}}
{{t|pt|t1=o}}
{{t|ro|t1=-ul|t2=-l|t3=-le}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|osp|ela}}, {{etim|la|illa}}.
==== {{artículo determinado|es}} ====
;1: {{variante|la}}. Por razones de [[eufonía]], antecede a ciertos nombres que normalmente llevarían el artículo "la", que son aquellos que comienzan con el [[fonema]] /'a/ tónico ("a-" o "ha-" tónicas). El sustantivo mismo continúa siendo femenino.
{{ejemplo|'''El''' '''a'''gua. '''El''' '''a'''rma blanc'''a'''. '''El''' '''ha'''lva azucarad'''a'''.}}
==== Información adicional ====
* No caen bajo esta regla: los nombres de letras (la hache, la a), los adjetivos (la alta), las palabras que comienzan por a no tónica (la amiga).
* Sin embargo, [[azúcar]] admite ambas variantes (el azúcar o la azúcar).
== {{lengua|rup}} ==
{{pron-graf|leng=rup|v1=elu}}
=== Etimología 1 ===
{{etimología|leng=rup|la-vul|*illus}}, y este {{etim|leng=rup|la|ille}}. Compárese el rumano {{l+|ro|el}}.
==== {{pronombre personal|rup}} ====
;1: {{plm|él}}.
{{sinónimo|leng=rup|nãs}}
== {{lengua|ast}} ==
{{pron-graf|leng=ast}}
=== Etimología 1 ===
{{etimología|leng=ast|roa-ole|el|el}}, y este {{etim|leng=ast|la|ille}}.
==== {{artículo determinado|ast}} ====
;1: {{plm}}.
== {{lengua|osp}} ==
{{pron-graf|leng=osp}}
=== Etimología 1 ===
{{etimología|leng=osp|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|osp}} ====
;1: {{plm}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca|v1=lo|vnota1=noroccidental}}
=== Etimología 1 ===
{{etimología|leng=ca|prefijo|e|lo}}.
==== {{artículo determinado|ca}} ====
;1: {{plm}}.
{{sinónimo|leng=ca|es|nota=balear}}.
==== {{pronombre personal|ca}} ====
;2: {{plm|lo}}.
==== Información adicional ====
{{derivad|leng=ca|al|cal|del|pel}}
== {{lengua|dlm}} ==
{{pron-graf|leng=dlm|v1=lo}}
=== Etimología 1 ===
{{etimología|leng=dlm|la|illum||la|illud|e=e}}.
==== {{artículo determinado|dlm}} ====
;1: {{plm}}.
== {{lengua|fr}} ==
{{pron-graf|leng=fr|v1=iel|v2=ille}}
=== Etimología 1 ===
{{etimología|leng=fr}}.
==== {{pronombre personal|fr}} ====
;1: {{plm|ella}}, {{l|es|ello}} o {{l|es|él}}.
{{hipónimo|leng=fr|elle|il}}
== {{lengua|fro}} ==
{{pron-graf|leng=fro|v1=enl|vnota1=poco usado}}
=== Forma flexiva ===
==== Contracción ====
;1: {{contracción|leng=fro|en|le|c1=preposición|c2=artículo}}.
{{ejemplo|m'est une anguisse '''el''' quer ferue, ki tut le cors me fet trembler.|a=Marie de France|c=libro|título=Equitan}}
== {{lengua|roa-opt}} ==
{{pron-graf|leng=roa-opt}}
=== Etimología 1 ===
{{etimología|leng=roa-opt|fonética|ele}}.
==== {{pronombre personal|roa-opt}} ====
;1: {{variante|leng=roa-opt|ele}}
{{ejemplo|fugiu con '''el''' a Egipto. terra de Reẏ Faraon.|a=Alfonso X|c=libro|título=Cantigas de Santa Maria|u=http://www.pbm.com/~lindahl/cantigas/facsimiles/E/080.html}}
== {{lengua|gl}} ==
{{pron-graf|leng=gl|ayuda=él}}
=== Etimología 1 ===
{{etimología|leng=gl|roa-opt|ele|él}}, y este {{etim|leng=gl|la|ille|aquél}}.
=== {{pronombre personal|gl}} ===
;1: {{plm|él}}.<ref>{{DRAG}}</ref>
{{ejemplo|'''El''' sofre unha enorme dependencia da aleatoriedade.|trad= '''Él''' sufre de una enorme dependencia de la aleatoriedad.}}
==== Declinación ====
{{gl.pron}}
==== Locuciones ====
{{trad-arriba|Locuciones con «el»}}
* [[el mesmo]] : él mismo
{{trad-abajo}}
== {{lengua|ia}} ==
{{pron-graf|leng=ia|1fone1=ˈɛl}}
=== Etimología 1 ===
{{etimología|leng=ia}}.
==== {{pronombre personal|ia}} ====
;1: {{plm|él}}.
== {{lengua|ist}} ==
{{pron-graf|leng=ist}}
=== Etimología 1 ===
{{etimología|leng=ist|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|ist}} ====
;1: {{plm}}.
=== Etimología 2 ===
{{etimología|leng=ist|la|ille|aquel}}.
==== {{pronombre personal|ist}} ====
;1: {{plm|él}}.
== {{lengua|it}} ==
{{pron-graf|leng=it}}
=== Etimología 1 ===
{{etimología}}.
==== {{pronombre personal|it}} ====
;1: {{variante obsoleta|leng=it|ello}} (antes de consonantes).
== {{lengua|lad}} ==
{{pron-graf|leng=lad|1fono1=el|g1=איל}}
=== Etimología 1 ===
{{etimología|leng=lad|osp|el|el}}, y este {{etim|leng=lad|la|ille}} e {{l+|la|ille|glosa=aquel}}.
==== {{artículo determinado|lad}} ====
;1: {{plm}}.
==== {{pronombre personal|lad}} ====
;2: {{plm|él}}.
== {{lengua|lld}} ==
{{pron-graf|leng=lld}}
=== Etimología 1 ===
{{etimología|leng=lld|la|ille|aquel|alt=illum}}.
==== {{pronombre personal|lld}} ====
;1: {{plm|lo}}.
=== Etimología 2 ===
{{etimología|leng=lld|la|ille|aquel}}.
==== {{pronombre personal|lld}} ====
;1: {{plm|él}}.
== {{lengua|la}} ==
{{pron-graf|leng=la}}
=== Etimología 1 ===
{{etimología|leng=la}}.
==== {{sustantivo|la}} ====
;1 {{csem|leng=la|tipografía}}: {{plm|ele}}.
== {{lengua|roa-ole}} ==
{{pron-graf|leng=roa-ole}}
=== Etimología 1 ===
{{etimología|leng=roa-ole|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|roa-ole}} ====
;1: {{plm}}.
== {{lengua|lfn}} ==
{{swadesh|lfn}}
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{pronombre personal|lfn}} ===
;1: {{plm|él}}.
;2: {{plm|ella}}.
;3: {{plm|ello}}.
== {{lengua|lmo}} ==
{{pron-graf|leng=lmo|1fone1='ɛlː|2fone1=ˈe.el}}
=== Etimología 1 ===
{{etimología|leng=lmo|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|lmo}} ====
;1: {{plm}}.
=== Etimología 2 ===
{{etimología|leng=lmo|la|ille|aquel}}.
==== {{pronombre personal|lmo}} ====
;1: {{plm|él}}.
=== Forma flexiva ===
==== Forma verbal ====
;1: {{f.v|leng=lmo|vess|3s|pres|ind|nopron=sí}}.
== {{lengua|mwl}} ==
{{pron-graf|leng=mwl}}
=== Etimología 1 ===
{{etimología|leng=mwl|la|ille|aquel}}.
==== {{pronombre personal|mwl}} ====
;1: {{plm|él}}.
== {{lengua|oc}} ==
{{pron-graf|leng=oc|1fone1=ˈel|v1=eth}}
=== Etimología 1 ===
{{etimología|leng=oc|pro|el|él}}.
==== {{pronombre personal|oc}} ====
;1: {{plm|él}}.
;2: {{plm|ello}}.
== {{lengua|pro}} ==
{{pron-graf|leng=pro|v1=ed|v2=elh|v3=ell}}
=== Etimología 1 ===
{{etimología|leng=pro|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|pro}} ====
;1: {{plm}}.
=== Etimología 2 ===
{{etimología|leng=pro|la|ille|aquel}}.
==== {{pronombre personal|pro}} ====
;1: {{plm|él}}.
== {{lengua|rm}} ==
{{pron-graf|leng=rm}}
=== Etimología 1 ===
{{etimología|leng=rm|la|ille|aquel}}.
==== {{pronombre personal|rm}} ====
;1: {{plm|él}}.
== {{lengua|ro}} ==
{{pron-graf|leng=ro|g1=ел|g2=elŭ|gnota1=Moldavia|gnota2=obsoleta}}
=== Etimología 1 ===
{{etimología|leng=ro|la-vul|*illus}}, y este {{etim|leng=ro|la|ille}}.
==== {{pronombre personal|ro}} ====
;1: {{plm|él}}. ({{impropia|Tónico.}}).
{{sinónimo|leng=ro|dumnealui|nota=formal}}.
==== Declinación ====
{{ro.pron}}
== {{lengua|sv}} ==
{{pron-graf|leng=sv|1fone1=ˈeːl}}
=== Etimología 1 ===
{{etimología2|leng=sv|Forma corta de ''[[elektricitet]]'', con el mismo significado.}}.
==== {{sustantivo|sv}} ====
;1: {{plm|electricidad}}.
==== Declinación ====
{{sv.sust|num=sg|c-irreg|2=elen}}
== {{lengua|wa}} ==
{{pron-graf|leng=wa|1fone1=ɛl|1fone2=il}}
=== Etimología 1 ===
{{etimología|leng=wa|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|wa}} ====
;1: {{plm|la}}.
;2: {{plm}}.
==== {{pronombre personal|wa}} ====
;3: {{plm|la}}.
;4: {{plm|lo}}.
=== Forma flexiva ===
==== Contracción ====
;1: {{contracción|leng=wa|e|li|c1=preposición|c2=pronombre}}: en el.
== {{lengua|vec}} ==
{{pron-graf|leng=vec|1fone1=el|v1=al}}
=== Etimología 1 ===
{{etimología|leng=vec|la|ille|aquel|alt=illum}}.
==== {{artículo determinado|vec}} ====
;1: {{plm}}.
=== Etimología 2 ===
{{etimología|leng=vec|la|ille|aquel}}.
==== {{pronombre personal|pro}} ====
;1: {{plm|él}}.
{{ejemplo|El can '''el''' magna i òsi.}}
== Referencias y notas ==
<references />
p0a1f5x1b6aabca9473ne7tezvabr4o
ese
0
26172
6307364
5929233
2026-08-06T00:38:06Z
TMCbot
164594
.
6307364
wikitext
text/x-wiki
{{desambiguación|ẹsẹ̀|esse}}
== {{lengua|es}} ==
{{swadesh|es}}
{{pron-graf|1audio1=Letter s es es.flac|g=ése}}
=== Etimología 1 ===
{{etimología}}.
==== {{sustantivo femenino|es}} ====
{{es.sust}}
;1: {{impropia|Nombre de la letra ''[[s]]''}}.
;2: {{plm|rastro}}, [[huella]] o [[rumbo]] que por sus [[revuelta]]s semeja la figura de una ''s''.
;3: Pieza de maquinaria en forma de ''s''.
;4: {{plm|eslabón}} de una [[cadena]] que tiene forma de ese.
==== Locuciones ====
* [[echar una ese]], [[poner una ese]] o [[echar una ese y un clavo]] (a alguien): Ganarse la plena confianza, [[granjearse]] la amistad de alguien.
* [[caminar haciendo eses]], [[ir haciendo eses]] o [[andar haciendo eses]]: {{plm|caminar}} o [[andar]] como un [[ebrio]].
==== Traducciones ====
{{trad-arriba}}
{{t|ast|a1=1|t1=ese}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|la|ipse}}.
==== {{pronombre|es|demostrativo|masculino}} ====
{{es.adj|irreg|esos|esa|esas|neutro=eso}}
;1: {{impropia|Se emplea para indicar o señalar algo o a alguien próximo al [[interlocutor]], o referirse a algo que este acaba de mencionar. Designa también algo menos cercano en el tiempo o en el espacio que lo indicado por el pronombre}} "[[este]]".
{{relacionado|este|aquel|esotro}}.
{{ejemplo|Hay dos coches: uno junto a ti y otro más allá. Prefiero ''ese'' junto a ti.}}
==== {{adjetivo demostrativo|es}} ====
{{es.adj|irreg|p=esos|f=esa|fp=esas}}
;2: {{impropia|Se emplea para indicar o señalar algo o a alguien próximo al [[interlocutor]], o referirse a algo que este acaba de mencionar. Designa también algo menos cercano en el tiempo o en el espacio que lo indicado por el adjetivo "[[este]]".}}
{{ejemplo|Prefiero ''ese'' coche que está junto a ti.}}
{{ejemplo|(algo mencionado por el interlocutor) Entiendo ''ese'' problema que mencionas, pero no me parece un obstáculo para que realices lo que quieres.}}
;3: {{impropia|Después de un sustantivo, indica desprecio o enojo}}.
{{uso|despectivo}}
{{ejemplo|No soporto al tonto ''ese'' haciendo chistes malos. ¡Qué tipo ''ese''!}}
==== Véase también ====
{{w|Pronombre demostrativo|ese}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|t1=dieser}}
{{t|br|t1=-se}}
{{t|ca|t1=aquest}}
{{t|kw|t1=an}}
{{t|kw|t1=na}}
{{t|eo|t1=tiu}}
{{t|fr|t1=ça}}
{{t|gd|t1=sin}}
{{t|cy|g1=m|g2=f|n3=p|t1=hwnnw|t2=honno|t3=hynny}}
{{t|cy|t1='na}}
{{t|en|t1=that}}
{{t|ga|t1=sin}}
{{t|it|t1=quello}}
{{t|gv|t1=shen}}
{{t|yua|t1=leloʼ}}
{{t|nl|t1=dat}}
{{t|pt|t1=esse}}
{{trad-abajo}}
== {{lengua|gl}} ==
{{swadesh|gl}}
{{pron-graf|leng=gl}}
=== Etimología 1 ===
{{etimología|leng=gl|roa-opt|esse|ese}}, del anterior {{l+|roa-opt|isse}}, y esta {{etim|leng=gl|la|ipse}}.
==== {{adjetivo demostrativo|gl}} ====
;1: {{plm}}.<ref>{{DRAG}}</ref>
{{ejemplo|Pois '''ese''' ruído facían os cepos, esas xerigonzas facía o neno.}}
==== {{pronombre demostrativo|gl}} ====
;1: {{plm}}{{-sup|2}}.
===Véase también===
* [[este]]
* [[aquel]]
== Referencias y notas ==
<references />
refxu0zmryvtyc0p1ys0ien9w2pek5h
todo
0
26178
6307375
6301177
2026-08-06T00:38:35Z
TMCbot
164594
.
6307375
wikitext
text/x-wiki
{{definición}}
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-Rodelar-todo.wav}}
=== Etimología ===
{{etimología|la|totus}}.
=== {{adjetivo indefinido|es}} ===
{{es.adj}}
;1: Que se considera completo tanto en sus atributos como en número.
{{uso|antepuesto al sustantivo|generalmente con artículo}}.
{{antónimo|ningún|nada de}}.
{{ejemplo|Jefe, tenemos ''todo'' el trabajo listo. Solo necesitamos presentárselo a los inversionistas.}}
=== {{pronombre indefinido|es}} ===
{{es.adj|neutro=todo}}
;2: {{impropia|Se refiere a lo que se considera completo tanto en sus atributos como en número}}.
{{antónimo|nada}}
;3: Todas las cosas.
{{uso|neutro}}
=== {{sustantivo masculino|es}} ===
{{es.sust|s}}
;4: El conjunto al completo de algo.
{{antónimo|nada}}.
{{ejemplo|Más es la mitad que el todo, porque una mitad en alarde y otra en empeño más es que un todo declarado.|a1=Baltasar Gracián|c=libro|editor=Biblioteca Virtual Miguel de Cervantes|f=2005|fo=1669|l=Alicante|p=535|t=El Héroe|t3=Primor I|u=http://www.cervantesvirtual.com/obra-visor/el-heroe--1/html/fee4044e-82b1-11df-acc7-002185ce6064_2.html}}
=== {{adverbio de cantidad|es}} ===
;5: {{plm|muy}}, [[totalmente]].
{{ámbito|España}}.
{{uso|mantiene la flexión del adjetivo}}.
{{ejemplo|Llegó con la cara ''toda'' blanca de espanto.}}
=== Locuciones ===
* [[con todo]]: con mucha fuerza o empleando la totalidad de la energía.
* [[con todo y…]]: incluyendo (Venezuela)
* [[de todo]]
* [[del todo]]: en su totalidad.
* [[todo el mundo]]: el común de personas de un grupo determinado o indeterminado.
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|a1=1|t1=all}}
{{t|ast|a1=1|t1=tou}}
{{t|br|a1=1|t1=holl}}
{{t|sl|a1=1|t1=vse}}
{{t|eo|a1=1|t1=ĉiuj|t2=ĉiaj|t3=ĉia}}
{{t|fr|a1=1|g1=m|g2=f|n3=p|t1=tout|t2=toute|t3=tous}}
{{t|el|a1=1|t1=πάν}}
{{t|en|a1=1|a2=1-2|t1=all|t2=everything}}
{{t|it|a1=1|t1=tutto}}
{{t|kuz|a1=1|t1=baini}}
{{t|arn|a1=1|t1=kom}}
{{t|yua|a1=1-3|t1=tuláakal}}
{{t|mit|a1=1|t1=ta̠ká}}
{{t|pt|a1=1|t1=tudo}}
{{t|sc|a1=1|t1=tottu}}
{{t|eu|a1=1|t1=guzti}}
{{trad-abajo}}
== {{lengua|gl}} ==
{{pron-graf|leng=gl}}
=== Etimología ===
{{etimología|leng=gl|la|totus}}.
=== {{adjetivo indefinido|gl}} ===
{{gl.adj}}
;1: {{plm}}.<ref>{{DRAG}}</ref>
{{ejemplo|Mais '''todos''' os homes queren, xa sabemos, falar por alferxas atricar por cestos.|trad= Pero '''todos''' los hombres quieren, lo sabemos, hablar por Alferjas, sentirse atraídos por las cestas.}}
=== {{sustantivo masculino|gl}} ===
{{gl.sust}}
;2: {{plm}}.
=== {{pronombre|gl|indefinido|neutro}} ===
{{gl.adj|neutro=todo}}
;3: {{plm}}.
== {{lengua|ja|escritura=romaji}} ==
{{pron-graf|leng=ja|e=胡獱|e2=とど|e3=トド|enota=[[kanji]]|enota2=[[hiragana]]|enota3=[[katakana]]|fone=to̞do̞}}
=== Etimología ===
{{etimología|leng=ja}}
=== {{sustantivo|ja}} ===
;1 {{csem|leng=ja|mamíferos}}: (''[[species:Eumetopias jubatus|Eumetopias jubatus]]'') {{plm|león marino}}, [[león marino de Steller]].
=== Véase también ===
{{W|トド|Todo|leng=ja}}
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología ===
{{etimología|leng=pt|la|totus}}
=== {{adjetivo indefinido|pt}} ===
{{pt.adj}}
;1: {{plm}}.
{{uso|leng=pt|utcsm}}.
=== {{adverbio de cantidad|pt}} ===
;2: {{plm}}.
=== {{sustantivo masculino|pt}} ===
{{pt.sust}}
;3: {{plm}}.
== Referencias y notas ==
<references />
[[Categoría:ES:Lista Swadesh]]
[[Categoría:GL:Lista Swadesh]]
[[Categoría:PT:Lista Swadesh]]
67qdr55dpu9rb8327ypkdi2ns8gw71z
aqueste
0
27048
6307350
6096255
2026-08-06T00:37:38Z
TMCbot
164594
.
6307350
wikitext
text/x-wiki
{{desambiguación|aquéste}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|osp|aqueste|este}}, y este {{etim|la-vul|*accu|glosa=he aquí}} e {{l+|la|*istu|glosa=este}}, {{etim|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}. Compárense el catalán {{l+|ca|aquest}} o el italiano {{l+|it|questo}}.
==== {{adjetivo demostrativo|es}} ====
{{es.adj|f=aquesta|fp=aquestas}}
;1: {{variante|este|texto-variante=Variante anticuada o literaria de}} (que está cercano al hablante, espacial o temporalmente).<ref name="dle">{{DLE}}</ref><ref name=drae2001>{{DRAE2001}}</ref>
{{uso|anticuado|poético}}.
{{ejemplo|''Aqueste'' mar turbado, ¿quién le pondrá ya freno?|c=libro|t=Obras poéticas propias de Fray Luis Ponce de Leen ... recogidas y traducidas en aleman por C. B. Schlüter y W. Storck. Span. & Ger|a=Luis de León|f=1853}}
==== {{pronombre demostrativo|es}} ====
{{es.adj|f=aquesta|fp=aquestas|neutro=aquesto}}
;2: {{variante|este|texto-variante=Variante anticuada o literaria de}} (indica lo que está cercano al hablante, espacial o temporalmente).
{{uso|anticuado|poético}}.
{{ejemplo|Pues ambos atormentan mi sentido: ''aqueste'', con pedir lo que no tengo; y ''aqueste'', con no tener lo que le pido.|c=libro|t=Antología|a=Sor Juana Inés de la Cruz|f=2016-06-01|editorial=EUDEBA|isbn=9789502319377}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|osp}} ==
{{pron-graf|leng=osp}}
=== Etimología ===
{{etimología|leng=osp|la-vul|*accu||la-vul|*istu|glosa=he aquí|glosa2=este|e=e}}, y estos {{etim|leng=osp|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{pronombre demostrativo|osp}} ====
;1: {{plm|aqueste}} o {{l|es|este}}.
==== {{adjetivo demostrativo|osp}} ====
;2: {{plm|aqueste}}, [[este]].
== {{lengua|roa-opt}} ==
{{pron-graf|leng=roa-opt}}
=== Etimología 1 ===
{{etimología|leng=roa-opt|la-vul|*accu||la-vul|*istu|glosa=he aquí|glosa2=este|e=e}}, y estos {{etim|leng=roa-opt|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{pronombre demostrativo|roa-opt}} ====
;1: {{plm|aqueste}} o {{l|es|este}}.
== {{lengua|mwl}} ==
{{pron-graf|leng=mwl}}
=== Etimología 1 ===
{{etimología|leng=mwl|la-vul|*accu||la-vul|*istu|glosa=he aquí|glosa2=este|e=e}}, {{etim|leng=mwl|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{adjetivo indefinido|mwl}} ====
;1: {{plm|aqueste}} o {{l|es|este}}.
{{uso|leng=mwl|anticuado}}.
{{sinónimo|leng=mwl|este}}.
==== {{pronombre demostrativo|mwl}} ====
;2: {{plm|aqueste}} o {{l|es|este}}.
{{uso|leng=mwl|anticuado}}.
{{sinónimo|leng=mwl|este}}
== {{lengua|roa-oan}} ==
{{pron-graf|leng=roa-oan}}
=== Etimología 1 ===
{{etimología|leng=roa-oan|la-vul|*accu||la-vul|*istu|glosa=he aquí|glosa2=este|e=e}}, y estos {{etim|leng=roa-oan|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{adjetivo indefinido|roa-oan}} ====
;1: {{variante|leng=roa-oan|aquesti}}
== {{lengua|oc}} ==
{{pron-graf|leng=oc|1fone1=a'keste|v1=aquest}}
=== Etimología 1 ===
{{etimología|leng=oc|pro|aquest|este}}, y este {{etim|leng=oc|la-vul|*accu|glosa=he aquí}} e {{l+|la|*istu|glosa=este}}, {{etim|leng=oc|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{adjetivo indefinido|oc}} ====
{{oc.adj|fp=aquestas}}
;1: {{plm|este}}.
==== {{pronombre demostrativo|oc}} ====
{{oc.adj|fp=aquestas|neutro=aquò}}
;2: {{plm|este}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt|roa-opt|aqueste|este}}, y este {{etim|leng=pt|la-vul|*accu|glosa=he aquí}} e {{l+|la|*istu|glosa=este}}, {{etim|leng=pt|la|eccum|glosa=he aquí}} e {{l+|la|iste|istum|glosa=este}}.
==== {{adjetivo indefinido|pt}} ====
{{pt.adj|irreg|f=aquesta|fp=aquestas}}
;1: {{plm|aqueste}} o {{l|es|este}}.<ref name=au />
{{uso|leng=pt|anticuado}}.
==== {{pronombre demostrativo|pt}} ====
{{pt.adj|irreg|f=aquesta|fp=aquestas|neutro=aquesto}}
;2: {{plm|aqueste}} o {{l|es|este}}.<ref name=au>{{Aulete}}</ref>
{{uso|anticuado|leng=pt}}.
{{sinónimo|leng=pt|este}}.
{{relacionado|leng=pt|aquesse}}.
==== Información adicional ====
{{derivad|leng=pt|naqueste}}
== Referencias y notas ==
<references />
3wo586l7o0z9z9b7khfc7in593k5wti
burn
0
27452
6307394
5853059
2026-08-06T01:34:58Z
Intolerable situation
130039
/* {{lengua|en}} */
6307394
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono=bɜːn|1pron=Received Pronunciation
|2fono=bɝn|2pron=General American|2audio=En-us-burn.ogg
|ls=1}}
=== Etimología ===
{{etimología|leng=en}}
=== {{verbo transitivo|en}} ===
;1: {{plm|quemar}}, [[prender fuego]].
{{antónimo|leng=en|freeze}}.
=== {{verbo intransitivo|en}} ===
;2: {{plm|quemarse}}, [[arder]], [[consumirse]].
;3: {{plm|quemarse}}, [[achicharrarse]], [[tostarse]].
=== Información adicional ===
{{derivad|leng=en|sunburn|burnout}}.
=== Conjugación ===
{{en.v|burned[US];burnt[UK]}}
== Referencias y notas ==
<references />
jw2cbs6uqny4904rseeezc0gnu5xslw
pad
0
27895
6307314
6295680
2026-08-05T23:34:10Z
Tmagc
158167
6307314
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|en|pad}}.
[[File:PCB copper pour thermal pads.png|thumb|(2) Pads (círculos negros en la foto)]]
==== {{sustantivo masculino|es}} ====
{{es.sust|s=s}}
;1 {{csem|informática}}: Periférico táctil presente en las notebooks y otros dispositivos portátiles que permite el movimiento de un cursor sobre una interfaz gráfica; funciona como alternativa al mouse.
{{sinónimo|panel táctil}}
;2 {{csem|electrónica}}: En una [[placa de circuito impreso]], terminación que se le da a la pista en forma de círculo, rectángulo, óvalo, gota o anillo y que sirve para soldar los terminales y pines de los componentes que se montan encima.
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|af}} ==
{{pron-graf|leng=af}}
=== Etimología ===
{{etimología|leng=af}}.
=== {{sustantivo|af}} ===
;1: {{plm|camino}}
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=pæd}}
=== Etimología ===
{{etimología|leng=en}}
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|almohadilla}}
;2: {{plm|resma}} (de papel)
;3: {{plm|relleno}}
=== {{verbo|en}} ===
;4: {{plm|rellenar}}
;5: {{plm|acolchar}}
=== Véase también ===
{{w|leng=en}}
=== Conjugación ===
{{en.v}}
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología ===
{{etimología|leng=nl}}
=== {{sustantivo|nl}} ===
;1 {{csem|leng=nl|anfibios}}: {{plm|sapo}}.
== {{lengua|vo}} ==
{{pron-graf|leng=vo}}
=== Etimología ===
{{etimología|leng=vo}}.
=== {{sustantivo|vo}} ===
;1: {{plm|página}}
== Referencias y notas ==
<references />
8nig6zxtlyvjgdzn375sscqa6cuchj3
alga
0
38704
6307269
5949708
2026-08-05T13:13:23Z
Intolerable situation
130039
/* Traducciones */
6307269
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|alga}}
=== {{sustantivo femenino|es}} ===
[[Archivo:Durvillea antarctica.JPG|thumb|[1]]]
{{es.sust}}
;1 {{csem|plantas}}: {{plm|organismo}} [[acuático]] [[autótrofo]] —es decir, capaz de [[fotosíntesis]]—, sea [[procarionte]] o [[eucarionte]]. No forman un grupo [[taxonómico]] homogéneo, comprendiendo desde organismos unicelulares muy sencillos hasta enormes [[colonia]]s de decenas de metros de longitud. Se clasifican en al menos nueve [[filo]]s, de uno de los cuales proceden evolutivamente las [[planta]]s propiamente dichas.
=== Información adicional ===
{{derivad|algar|algoso|alguero}}
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|af|a1=1|t1=alg}}
{{t|sq|a1=1|t1=algë}}
{{t|de|a1=1|g1=f|t1=Alge}}
{{t|ar|a1=1|t1=أشنيات}}
{{t|bg|a1=1|t1=водорасло}}
{{t|ca|a1=1|t1=alga}}
{{t|cs|a1=1|t1=řasa}}
{{t|zh|a1=1|t1=藻類}}
{{t|ko|a1=1|t1=조류}}
{{t|kw|a1=1|t1=goumman}}
{{t|da|a1=1|t1=alge}}
{{t|sl|a1=1|t1=alga}}
{{t|eo|a1=1|t1=algo}}
{{t|et|a1=1|t1=vetikad}}
{{t|fo|a1=1|t1=alga}}
{{t|fi|a1=1|t1=levä}}
{{t|fr|a1=1|t1=algue}}
{{t|fy|a1=1|t1=seewier}}
{{t|gd|a1=1|t1=feamainn}}
{{t|cy|a1=1|t1=gwymon}}
{{t|gl|a1=1|t1=alga}}
{{t|el|a1=1|t1=φύκι|tl1=fyki}}
{{t|he|a1=1|g1=f|t1=אצה|tl1=atsa}}
{{t|hu|a1=1|t1=alga|t2=moszat}}
{{t|io|a1=1|t1=algo}}
{{t|id|a1=1|t1=ganggang}}
{{t|en|a1=1|t1=alga|t2=seeweed}}
{{t|iu|a1=1|t1=qiqquaq}}
{{t|it|a1=1|t1=alga}}
{{t|ja|a1=1|t1=藻類|t2=海苔|tl1=そうるい, sōrui|tl2=のり, nori}}
{{t|la|a1=1|t1=alga}}
{{t|lv|a1=1|t1=aļģes}}
{{t|lt|a1=1|t1=dumbliai}}
{{t|mk|a1=1|t1=алги|tl1=algy}}
{{t|gv|a1=1|t1=famlagh}}
{{t|nl|a1=1|t1=alge|t2=zeewier}}
{{t|nb|a1=1|t1=alge}}
{{t|nn|a1=1|t1=alge}}
{{t|oc|a1=1|t1=alga}}
{{t|pl|a1=1|t1=glon|t2=wodorost}}
{{t|pt|a1=1|t1=alga}}
{{t|ru|a1=1|t1=водоросль}}
{{t|sh|a1=1|t1=alga}}
{{t|sh|a1=1|t1=алга}}
{{t|so|a1=1|t1=kuukiyaan}}
{{t|sv|a1=1|t1=alg}}
{{t|th|a1=1|t1=สาหราย}}
{{t|ta|a1=1|t1=பசகள}}
{{t|tr|a1=1|t1=alg|t2=yosun}}
{{t|uk|a1=1|t1=водоросль}}
{{t|ur|a1=1|t1=طحالب}}
{{t|eu|a1=1|t1=alga}}
{{t|vi|a1=1|t1=tảo biển}}
{{trad-abajo}}
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología ===
{{etimología|leng=ca|la|alga}}
=== {{sustantivo femenino|ca}} ===
{{ca.sust|f}}
;1 {{csem|leng=ca|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=ca}}
== {{lengua|sl}} ==
{{pron-graf|leng=sl}}
=== Etimología ===
{{etimología|leng=sl|la|alga}}
=== {{sustantivo|sl}} ===
;1 {{csem|leng=sl|plantas}}: {{plm}}.
== {{lengua|eu}} ==
{{pron-graf|leng=eu}}
=== Etimología ===
{{etimología|leng=eu|la|alga}}
=== {{sustantivo|eu}} ===
;1 {{csem|leng=eu|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=eu}}
== {{lengua|fo}} ==
{{pron-graf|leng=fo}}
=== Etimología ===
{{etimología|leng=fo|la|alga}}
=== {{sustantivo|fo}} ===
;1 {{csem|leng=fo|plantas}}: {{plm}}.
== {{lengua|gl}} ==
{{pron-graf|leng=gl}}
=== Etimología ===
{{etimología|leng=gl|la|alga}}
=== {{sustantivo femenino|gl}} ===
{{gl.sust}}
;1 {{csem|leng=gl|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=gl}}
== {{lengua|hu}} ==
{{pron-graf|leng=hu}}
=== Etimología ===
{{etimología|leng=hu|la|alga}}
=== {{sustantivo|hu}} ===
;1 {{csem|leng=hu|plantas}}: {{plm}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|fone=ˈæl.ɡə}}
=== Etimología ===
{{etimología|leng=en|la|alga}}
=== {{sustantivo|en}} ===
{{en.sust|c|algae}}
;1 {{csem|leng=en|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=en|algae}}
== {{lengua|it}} ==
{{pron-graf|leng=it|fono=ˈal.ga}}
=== Etimología ===
{{etimología|leng=it|la|alga}}
=== {{sustantivo|it|femenino}} ===
{{it.sust|f}}
;1 {{csem|leng=it|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=it}}
== {{lengua|la}} ==
{{pron-graf|leng=la|fono=ˈal.ga}}
=== Etimología ===
{{etimología|leng=la|ine-pro|*alg-}} ("[[fangoso]]")
=== {{sustantivo femenino|la}} ===
;1 {{csem|leng=la|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=la}}
=== Declinación ===
{{la.sust|alga.1}}
== {{lengua|lfn}} ==
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{adjetivo indefinido|lfn}} ===
;1: {{plm|algún}}.
;2: {{plm|alguna}}.
;3: {{plm|algunos}}.
;4: {{plm|algunas}}.
== {{lengua|oc}} ==
{{pron-graf|leng=oc}}
=== Etimología ===
{{etimología|leng=oc|la|alga}}
=== {{sustantivo femenino|oc}} ===
;1 {{csem|leng=oc|plantas}}: {{plm}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt|fone=ˈaɫǥɐ}}
=== Etimología ===
{{etimología|leng=pt|la|alga}}
=== {{sustantivo femenino|pt}} ===
{{pt.sust}}
;1 {{csem|leng=pt|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=pt}}
== {{lengua|sh|escritura=latino}} ==
{{pron-graf|leng=sh|e=алга|enota=cirílico}}
=== Etimología ===
{{etimología|leng=sh|la|alga}}
=== {{sustantivo|sh}} ===
;1 {{csem|leng=sh|plantas}}: {{plm}}.
== Referencias y notas ==
<references />
iy5zkaqy7asq14ftm6vnjdo4bpm4mx2
6307272
6307269
2026-08-05T13:27:23Z
Intolerable situation
130039
/* {{lengua|en}} */
6307272
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|alga}}
=== {{sustantivo femenino|es}} ===
[[Archivo:Durvillea antarctica.JPG|thumb|[1]]]
{{es.sust}}
;1 {{csem|plantas}}: {{plm|organismo}} [[acuático]] [[autótrofo]] —es decir, capaz de [[fotosíntesis]]—, sea [[procarionte]] o [[eucarionte]]. No forman un grupo [[taxonómico]] homogéneo, comprendiendo desde organismos unicelulares muy sencillos hasta enormes [[colonia]]s de decenas de metros de longitud. Se clasifican en al menos nueve [[filo]]s, de uno de los cuales proceden evolutivamente las [[planta]]s propiamente dichas.
=== Información adicional ===
{{derivad|algar|algoso|alguero}}
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|af|a1=1|t1=alg}}
{{t|sq|a1=1|t1=algë}}
{{t|de|a1=1|g1=f|t1=Alge}}
{{t|ar|a1=1|t1=أشنيات}}
{{t|bg|a1=1|t1=водорасло}}
{{t|ca|a1=1|t1=alga}}
{{t|cs|a1=1|t1=řasa}}
{{t|zh|a1=1|t1=藻類}}
{{t|ko|a1=1|t1=조류}}
{{t|kw|a1=1|t1=goumman}}
{{t|da|a1=1|t1=alge}}
{{t|sl|a1=1|t1=alga}}
{{t|eo|a1=1|t1=algo}}
{{t|et|a1=1|t1=vetikad}}
{{t|fo|a1=1|t1=alga}}
{{t|fi|a1=1|t1=levä}}
{{t|fr|a1=1|t1=algue}}
{{t|fy|a1=1|t1=seewier}}
{{t|gd|a1=1|t1=feamainn}}
{{t|cy|a1=1|t1=gwymon}}
{{t|gl|a1=1|t1=alga}}
{{t|el|a1=1|t1=φύκι|tl1=fyki}}
{{t|he|a1=1|g1=f|t1=אצה|tl1=atsa}}
{{t|hu|a1=1|t1=alga|t2=moszat}}
{{t|io|a1=1|t1=algo}}
{{t|id|a1=1|t1=ganggang}}
{{t|en|a1=1|t1=alga|t2=seeweed}}
{{t|iu|a1=1|t1=qiqquaq}}
{{t|it|a1=1|t1=alga}}
{{t|ja|a1=1|t1=藻類|t2=海苔|tl1=そうるい, sōrui|tl2=のり, nori}}
{{t|la|a1=1|t1=alga}}
{{t|lv|a1=1|t1=aļģes}}
{{t|lt|a1=1|t1=dumbliai}}
{{t|mk|a1=1|t1=алги|tl1=algy}}
{{t|gv|a1=1|t1=famlagh}}
{{t|nl|a1=1|t1=alge|t2=zeewier}}
{{t|nb|a1=1|t1=alge}}
{{t|nn|a1=1|t1=alge}}
{{t|oc|a1=1|t1=alga}}
{{t|pl|a1=1|t1=glon|t2=wodorost}}
{{t|pt|a1=1|t1=alga}}
{{t|ru|a1=1|t1=водоросль}}
{{t|sh|a1=1|t1=alga}}
{{t|sh|a1=1|t1=алга}}
{{t|so|a1=1|t1=kuukiyaan}}
{{t|sv|a1=1|t1=alg}}
{{t|th|a1=1|t1=สาหราย}}
{{t|ta|a1=1|t1=பசகள}}
{{t|tr|a1=1|t1=alg|t2=yosun}}
{{t|uk|a1=1|t1=водоросль}}
{{t|ur|a1=1|t1=طحالب}}
{{t|eu|a1=1|t1=alga}}
{{t|vi|a1=1|t1=tảo biển}}
{{trad-abajo}}
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología ===
{{etimología|leng=ca|la|alga}}
=== {{sustantivo femenino|ca}} ===
{{ca.sust|f}}
;1 {{csem|leng=ca|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=ca}}
== {{lengua|sl}} ==
{{pron-graf|leng=sl}}
=== Etimología ===
{{etimología|leng=sl|la|alga}}
=== {{sustantivo|sl}} ===
;1 {{csem|leng=sl|plantas}}: {{plm}}.
== {{lengua|eu}} ==
{{pron-graf|leng=eu}}
=== Etimología ===
{{etimología|leng=eu|la|alga}}
=== {{sustantivo|eu}} ===
;1 {{csem|leng=eu|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=eu}}
== {{lengua|fo}} ==
{{pron-graf|leng=fo}}
=== Etimología ===
{{etimología|leng=fo|la|alga}}
=== {{sustantivo|fo}} ===
;1 {{csem|leng=fo|plantas}}: {{plm}}.
== {{lengua|gl}} ==
{{pron-graf|leng=gl}}
=== Etimología ===
{{etimología|leng=gl|la|alga}}
=== {{sustantivo femenino|gl}} ===
{{gl.sust}}
;1 {{csem|leng=gl|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=gl}}
== {{lengua|hu}} ==
{{pron-graf|leng=hu}}
=== Etimología ===
{{etimología|leng=hu|la|alga}}
=== {{sustantivo|hu}} ===
;1 {{csem|leng=hu|plantas}}: {{plm}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|fone=ˈæl.ɡə|ls=2}}
=== Etimología ===
{{etimología|leng=en|la|alga}}
=== {{sustantivo|en}} ===
{{en.sust|c|algae}}
;1 {{csem|leng=en|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=en|algae}}
== {{lengua|it}} ==
{{pron-graf|leng=it|fono=ˈal.ga}}
=== Etimología ===
{{etimología|leng=it|la|alga}}
=== {{sustantivo|it|femenino}} ===
{{it.sust|f}}
;1 {{csem|leng=it|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=it}}
== {{lengua|la}} ==
{{pron-graf|leng=la|fono=ˈal.ga}}
=== Etimología ===
{{etimología|leng=la|ine-pro|*alg-}} ("[[fangoso]]")
=== {{sustantivo femenino|la}} ===
;1 {{csem|leng=la|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=la}}
=== Declinación ===
{{la.sust|alga.1}}
== {{lengua|lfn}} ==
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{adjetivo indefinido|lfn}} ===
;1: {{plm|algún}}.
;2: {{plm|alguna}}.
;3: {{plm|algunos}}.
;4: {{plm|algunas}}.
== {{lengua|oc}} ==
{{pron-graf|leng=oc}}
=== Etimología ===
{{etimología|leng=oc|la|alga}}
=== {{sustantivo femenino|oc}} ===
;1 {{csem|leng=oc|plantas}}: {{plm}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt|fone=ˈaɫǥɐ}}
=== Etimología ===
{{etimología|leng=pt|la|alga}}
=== {{sustantivo femenino|pt}} ===
{{pt.sust}}
;1 {{csem|leng=pt|plantas}}: {{plm}}.
=== Véase también ===
{{w|leng=pt}}
== {{lengua|sh|escritura=latino}} ==
{{pron-graf|leng=sh|e=алга|enota=cirílico}}
=== Etimología ===
{{etimología|leng=sh|la|alga}}
=== {{sustantivo|sh}} ===
;1 {{csem|leng=sh|plantas}}: {{plm}}.
== Referencias y notas ==
<references />
mebr2hn7xtd5zgnbuchdyf34hvk3nox
mucho
0
41297
6307369
6116489
2026-08-06T00:38:20Z
TMCbot
164594
.
6307369
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la|multus}}.
==== {{adjetivo indefinido|es}} ====
{{es.adj}}
;1: Que abunda o es mayor o excede lo corriente.
{{antónimo|poco}}
{{ejemplo|Tener ''mucho'' dinero.}}
==== {{adverbio de cantidad|es|indefinido}} ====
;2: Indica que la acción excede lo corriente o abunda o es más intensa de lo habitual.
{{ejemplo|He leído mucho.}}
;3: Antepuesto a adverbios de comparación, aumenta su significado.
{{ejemplo|Sabía ''mucho'' menos.}}
==== {{adverbio de tiempo|es}} ====
;4: Indica que un tiempo es largo.
{{ejemplo|Hace ''mucho'' que no la veo.}}
==== {{adverbio de afirmación|es}} ====
;5: Indica afirmación.
{{sinónimo|sí}}.
{{uso|coloquial|poco usado}}
==== {{adverbio de modo|es}} ====
;6: Con el verbo {{l+|es|ser}}, indica extrañeza o dificultad.
{{ejemplo|Con un cielo tan encapotado, ''mucho'' será que hoy no llueva.}}
==== {{pronombre indefinido|es}} ====
{{es.sust|neutro=mucho}}
;7: La gran cantidad, [[demasiado]].
;8: Muchas cosas.
{{uso|neutro}}
==== Locuciones ====
{{trad-arriba|Locuciones con «mucho»}}
* [[como mucho]]: '''1:''' A lo sumo. '''2:''' Demasiado (coloquial) '''3:''' Como máximo
* [[con mucho]]: En comparaciones, indica que es una diferencia importante.
* [[cuando mucho]]
* [[en mucho]]: Tener en gran consideración.<ref name="novísimo">{{Labernia1866}} Pág. 426</ref>
* [[hacer mucho]]: En frases impersonales, indica un tiempo alejado.
* [[mucho que...]]: Denota que una situación ocurrida en el momento pudo haber sido potencialmente peor.
* [[mucho que sí]]
* [[muy mucho]]: Muchísimo. (Coloquial en España)
* [[ni con mucho]]: Indica que está lejos de ocurrir o de ser cierto.
* [[ni mucho menos]]: Indica una negación absoluta.
* [[por mucho que]]: Indica que a pesar todo no ocurre lo que hubiera sido de esperar o previsible.
* [[por lo mucho]]: A lo sumo, como máximo.
* [[ser mucho]]: subestimar una cantidad específica.
* [[tener muchas horas de vuelo]]
* [[tener muchas ñañas]]
* [[tocar muchos registros]]
{{trad-abajo}}
==== Refranes ====
* [[el que mucho abarca poco aprieta]] o [[quien mucho abarca poco aprieta]]
* [[mal de muchos, consuelo de tontos]]
==== Información adicional ====
*Delante de los adjetivos y la mayoría de los adverbios, se usa la forma [[muy]].
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|ain|a1=1|t1=ポロ|a2=2|t2=ポロンノ}}
{{t|de|i1=s|t1=viel}}
{{t|br|a1=1|t1=meur a|a2=2|t2=kalz}}
{{t|eo|i1=s|t1=multa}}
{{t|fr|i1=s|t1=beaucoup}}
{{t|en|i1=s|t1=much}}
{{t|it|i1=s|t1=molto}}
{{t|ja|a1=2|t1=たくさん}}
{{t|kzg|a1=2|t1=どぅんばい}}
{{t|mit|i1=s|t1=kua'a̠}}
{{t|nci|a1=1|t1=miec|i2=s|t2=ixachi}}
{{t|pt|i1=s|t1=muito}}
{{t|sc|a1=1|t1=meda}}
{{trad-abajo}}
== {{lengua|pl}} ==
{{pron-graf|leng=pl}}
=== Forma flexiva ===
==== Forma sustantiva ====
;1: {{forma sustantivo|leng=pl|caso=vocativo|número=singular|mucha}}, "mosca".
== Referencias y notas ==
<references />
hsed5lhypir0pv6zht6124qbz633wy8
nadie
0
42666
6307307
6058464
2026-08-05T20:14:47Z
Tmagc
158167
6307307
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|fonética|nadi}}. Proviene con influencia por {{l+|es|quien}} {{etim|es|nadi}}, influido por {{l+|es|qui}}, y este del español antiguo {{l+|es|nado}}, [[elipsis]] de la expresión ''omne nado'', nadie en todos, literalmente «hombre nacido», y ''nado'' proviene a su vez del latín {{l+|la|natus|nātu}}, nacido.<ref>{{referencia|p=147|f=2002|c=libro|a=Ralph Penny|t=A History of the Spanish Language}}</ref> Por lo tanto, decía «(ningún) hombre nacido» para significar «absolutamente nadie».
==== {{pronombre|es|indefinido|masculino}} ====
;1: Ninguna persona.
{{antónimo|alguien}}
{{ejemplo|No quiero que '''nadie''' vaya a mi fiesta; prefiero estar con ustedes.}}
==== {{sustantivo|es|masculino|femenino}} ====
{{es.sust|irreg|p1=nadies|p2=nadie}}
;2: {{plm|persona}} [[insignificante]] o ignorada por la [[sociedad]].
{{relacionado|don nadie}}
{{ejemplo|Sueñan las pulgas con comprarse un perro<br>y sueñan los '''nadies''' con salir de pobres,<br>que algún mágico día<br>llueva de pronto la buena suerte|c=poema|autor=Eduardo Galeano|f=1989|t=Los nadies}}
==== Véase también ====
{{w|objeto=varios artículos}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|t1=niemand}}
{{t|sh|t1=nitko}}
{{t|eo|t1=neniu}}
{{t|eu|t1=inor}}
{{t|fr|t1=personne}}
{{t|he|t1=אף אחד}}
{{t|en|t1=nobody|t2=no one}}
{{t|it|t1=nessuno}}
{{t|nl|t1=geen|t2=geen enkel|t3=niemand}}
{{t|pt|t1=ninguém}}
{{trad-abajo}}
== Referencias y notas ==
<references />
bt02y0sa0m0cf233htdjywaix0rf7j8
aquel
0
44106
6307349
5929181
2026-08-06T00:37:37Z
TMCbot
164594
.
6307349
wikitext
text/x-wiki
== {{lengua|es}} ==
{{swadesh|es}}
{{pron-graf|1audio1=Es-am-lat-aquel.ogg}}
=== Etimología 1 ===
{{etimología|la-vul|*eccu ille}},{{cita requerida}} compuesto {{etim|la|eccum}} ("he [[aquí]]") e {{l+|la|ille|ille, illa, illud}} ("aquel").<ref name="dle">{{DLE}}</ref>
==== {{pronombre demostrativo|es}} ====
{{es.adj|irreg|aquellos|aquella|aquellas|nota=neutro [[aquello]]}}
;1: {{impropia|Se refiere a algo que está lejos, en el espacio o en el tiempo, de la persona que habla y de la persona con quien se habla}}.
{{uso|utca}} [[demostrativo]] y (menos) como [[sustantivo]].
{{relacionado|aquello|ese|eso|este|esto}}.
{{ejemplo|No quiero este libro que está aquí, sino ''aquel'' que está allá.}}
==== {{adjetivo demostrativo|es}} ====
{{es.adj|irreg|aquellos|aquella|aquellas}}
;2: {{impropia|Se refiere a algo que está lejos, en el espacio o en el tiempo, de la persona que habla y de la persona con quien se habla}}.
{{uso|utcs}}
{{ejemplo|¿Recuerdas a ''aquella'' joven que vimos el mes pasado cantando en el bus?}}
{{ejemplo|(como sustantivo): "Ambos libros son muy bonitos, y traen un ''aquel'' de amores y besos, que me daba mucho gusto ouando a escondidas los leía yo".|c=libro|t=Bailén|f=2006|a=Benito Pérez Galdós|editorial=Echo Library|isbn=9781406833072|u=http://books.google.es/books?id}}
;3: {{impropia|Designa una persona u objeto cuyo nombre no quiere mencionarse, denotando complicidad con quien se habla}}.
{{uso|coloquial|utcs}}.
{{ejemplo|Ayer me vi con ''aquel'' (una persona especial o particular).}}
==== {{sustantivo masculino|es}} ====
{{es.sust|irreg|p=aquellos}}
;4: {{plm|característica}}, [[atractivo]] o [[encanto]] que no se puede [[definir]] ([[indefinible]]) o [[complejidad]] que no es [[evidente]].
{{sinónimo|algo}}.
{{ejemplo|(característica): "no es guapo, pero ese chico tiene un ''aquel'' que me enamora".|c=libro|t=Gran dicionario século vinte i uno|f=2006|a=Xosé Avelino Hermida Borrajo|editorial=Editorial Galaxia|isbn=9788482893549|u=http://books.google.es/books?id}}
{{ejemplo|(complejidad): los códices tenían sus ''aquellos'' y no era tan fácil descifrarlos.}}
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba|[1] Pronombre para designar algo que está lejos}}
{{t|de|a1=1-2|t1=jener}}
{{t|sai-chn|a1=1|t1=huatí|t2=huat|t3=hua}}
{{t|eo|t1=tiu}}
{{t|gd|t1=siud}}
{{t|gl|t1=aquel}}
{{t|gn|t1=amo}}
{{t|en|a1=1-2|t1=that}}
{{t|ga|t1=siúd}}
{{t|it|t1=quello}}
{{t|gv|t1=shid}}
{{t|pt|t1=aquele}}
{{trad-abajo}}
== {{lengua|gl}} ==
{{pron-graf|leng=gl|ayuda= aquél}}
=== Etimología 1 ===
{{etimología|leng=gl}}
==== {{adjetivo demostrativo|gl}} ====
{{gl.adj|irreg|aqueles|aquela|aquelas|neutro=aquilo}}
;1: {{plm}}.<ref>{{DRAG}}</ref>
==== {{pronombre demostrativo|gl}} ====
;2: {{plm}}{{-sup|2}}.
===Véase también===
* [[este]]
* [[ese]]
== {{lengua|oc}} ==
{{pron-graf|leng=oc}}
=== Etimología 1 ===
{{etimología|leng=oc}}
==== {{adjetivo demostrativo|oc}} ====
{{oc.adj|irreg|aqueles|aquela|aquelas}}
;1: {{plm}}.
==== {{pronombre demostrativo|oc}} ====
;2: {{plm}}{{-sup|2}}.
== Referencias y notas ==
<references />
i7gpixqshlf8i2dzdlqxccronkywh5l
6307388
6307349
2026-08-06T01:09:12Z
Tmagc
158167
6307388
wikitext
text/x-wiki
== {{lengua|es}} ==
{{swadesh|es}}
{{pron-graf|1audio1=Es-am-lat-aquel.ogg}}
=== Etimología 1 ===
{{etimología|la-vul|*eccu ille}},{{cita requerida}} compuesto {{etim|la|eccum}} ("he [[aquí]]") e {{l+|la|ille|ille, illa, illud}} ("aquel").<ref name="dle">{{DLE}}</ref>
==== {{pronombre demostrativo|es}} ====
{{es.adj|irreg|aquellos|aquella|aquellas|neutro=aquello}}
;1: {{impropia|Se refiere a algo que está lejos, en el espacio o en el tiempo, de la persona que habla y de la persona con quien se habla}}.
{{uso|utca}} [[demostrativo]] y (menos) como [[sustantivo]].
{{relacionado|aquello|ese|eso|este|esto}}.
{{ejemplo|No quiero este libro que está aquí, sino ''aquel'' que está allá.}}
==== {{adjetivo demostrativo|es}} ====
{{es.adj|irreg|aquellos|aquella|aquellas}}
;2: {{impropia|Se refiere a algo que está lejos, en el espacio o en el tiempo, de la persona que habla y de la persona con quien se habla}}.
{{uso|utcs}}
{{ejemplo|¿Recuerdas a ''aquella'' joven que vimos el mes pasado cantando en el bus?}}
{{ejemplo|(como sustantivo): "Ambos libros son muy bonitos, y traen un ''aquel'' de amores y besos, que me daba mucho gusto ouando a escondidas los leía yo".|c=libro|t=Bailén|f=2006|a=Benito Pérez Galdós|editorial=Echo Library|isbn=9781406833072|u=http://books.google.es/books?id}}
;3: {{impropia|Designa una persona u objeto cuyo nombre no quiere mencionarse, denotando complicidad con quien se habla}}.
{{uso|coloquial|utcs}}.
{{ejemplo|Ayer me vi con ''aquel'' (una persona especial o particular).}}
==== {{sustantivo masculino|es}} ====
{{es.sust|irreg|p=aquellos}}
;4: {{plm|característica}}, [[atractivo]] o [[encanto]] que no se puede [[definir]] ([[indefinible]]) o [[complejidad]] que no es [[evidente]].
{{sinónimo|algo}}.
{{ejemplo|(característica): "no es guapo, pero ese chico tiene un ''aquel'' que me enamora".|c=libro|t=Gran dicionario século vinte i uno|f=2006|a=Xosé Avelino Hermida Borrajo|editorial=Editorial Galaxia|isbn=9788482893549|u=http://books.google.es/books?id}}
{{ejemplo|(complejidad): los códices tenían sus ''aquellos'' y no era tan fácil descifrarlos.}}
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba|[1] Pronombre para designar algo que está lejos}}
{{t|de|a1=1-2|t1=jener}}
{{t|sai-chn|a1=1|t1=huatí|t2=huat|t3=hua}}
{{t|eo|t1=tiu}}
{{t|gd|t1=siud}}
{{t|gl|t1=aquel}}
{{t|gn|t1=amo}}
{{t|en|a1=1-2|t1=that}}
{{t|ga|t1=siúd}}
{{t|it|t1=quello}}
{{t|gv|t1=shid}}
{{t|pt|t1=aquele}}
{{trad-abajo}}
== {{lengua|gl}} ==
{{pron-graf|leng=gl|ayuda= aquél}}
=== Etimología 1 ===
{{etimología|leng=gl}}
==== {{adjetivo demostrativo|gl}} ====
{{gl.adj|irreg|aqueles|aquela|aquelas|neutro=aquilo}}
;1: {{plm}}.<ref>{{DRAG}}</ref>
==== {{pronombre demostrativo|gl}} ====
;2: {{plm}}{{-sup|2}}.
===Véase también===
* [[este]]
* [[ese]]
== {{lengua|oc}} ==
{{pron-graf|leng=oc}}
=== Etimología 1 ===
{{etimología|leng=oc}}
==== {{adjetivo demostrativo|oc}} ====
{{oc.adj|irreg|aqueles|aquela|aquelas}}
;1: {{plm}}.
==== {{pronombre demostrativo|oc}} ====
;2: {{plm}}{{-sup|2}}.
== Referencias y notas ==
<references />
2a02dqlqexay82g1gxg1tt5wzri353j
picar
0
45220
6307302
6120237
2026-08-05T19:13:19Z
Tmagc
158167
6307302
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la-vul|*piccāre}} y este {{etim|frk|*pikkōn}}, o bien de origen onomatopéyico. Falso cognado de {{l+|es|pico}}.
==== {{verbo transitivo|es}} ====
;1: {{plm|golpear}} algo con una punta, agujereándolo o no.
;2: {{plm|cortar}} en pedazos muy pequeños.
;3: {{plm|irritar}} o [[provocar]] a alguien.
{{wikisauro|enojar}}
;4: {{plm|herir}} levemente con instrumento punzante.<ref name="novísimo">{{Labernia1866}} pág.577</ref>
{{sinónimo|pinchar|puyar|nota2=Venezuela}}
;5: Recibir el [[picador]] al [[toro]] con la [[garrocha]].<ref name="novísimo" />
;6: {{plm|morder}}, hablando de aves, insectos y reptiles.<ref name="novísimo" />
;7: {{plm|pinchar}}.<ref name="novísimo" />
;8: {{plm|espolear}} al caballo.<ref name="novísimo" />
;9: {{plm|aguijonear}} al ganado.<ref name="novísimo" />
;10: {{plm|adiestrar}} el [[picador]] al [[caballo]].<ref name="novísimo" />
;11: {{plm|hacer}} mal a un caballo.<ref name="novísimo" />
;12: {{plm|exasperar}} a alguno, provocarlo, herir su susceptibilidad.<ref name="novísimo" />
;13: {{plm|moler}} o [[desmenuzar]].<ref name="novísimo" />
;14: {{plm|perseguir}} al enemigo que se retira, acosando su [[retaguardia]].<ref name="novísimo" />
;15 {{csem|náutica}}: {{plm|cortar}} una cosa a golpe de [[hacha]].<ref name="novísimo" />
;16 {{csem|fútbol}}: Disparar la pelota en forma de [[vaselina]] contra un arquero que quedó adelantado.
==== {{verbo intransitivo|es}} ====
;17: Producir una sustancia comestible [[ardor]] en la boca, principalmente el [[ají]], la [[pimienta]], el [[jengibre]], etc.
;18: Tener en alguna parte del cuerpo una sensación de [[escozor]] que a menudo provoca la gana de rascarse.
;19: Sentirse molesto o enfadado por una situación desfavorable.
{{wikisauro|enojar}}
;20: {{plm|morder}} el [[pez]] el [[anzuelo]].<ref name="novísimo" />
;21: Tomar muy ligera parte de un manjar.<ref name="novísimo" />
;22: {{plm|comer}} [[uva]]s tomando de grano en grano.<ref name="novísimo" />
;23: {{plm|estimular}} el cuerpo o el espíritu.<ref name="novísimo" />
;24: {{plm|mover}}, [[excitar]].<ref name="novísimo" />
;25: {{plm|señalar}} con un [[puntero]] al acaso la parte por donde debe abrirse un libro para algún ejercicio o examen.<ref name="novísimo" />
;26: {{plm|tocar}} ligeramente los puntos o las materias de que se trata.<ref name="novísimo" />
;27: {{plm|maldecir}} o [[murmurar]].<ref name="novísimo" />
;28: {{plm|concluir}} con algunos [[toque]]s graciosos una obra de [[pintura]].<ref name="novísimo" />
;29 {{csem|música}}: {{plm|tocar}} en los instrumentos de cuerda los puntos de un modo seco, sin ligarlos unos a otros.<ref name="novísimo" />
;30: ''Seguido de "en", significa rayar en , adolecer de''.<ref name="novísimo" />
{{ejemplo|''Picar en'' temerario.}}
;31: Contar el que es mano en el juego de los cientos hasta sesenta puntos en lugar de treinta cuando el contrario no tiene ninguno.<ref name="novísimo" />
;32 {{csem|náutica}}: Dar juego a la [[bomba]] con el [[cigüeñal]].<ref name="novísimo" />
;33 {{csem|náutica}}: Empezar el [[viento]] a levantar las [[ola]]s.
;34 {{csem|náutica}}: Llegar la nave al sitio donde hay [[sonda]].<ref name="novísimo" />
;35 {{csem|náutica}}: Empezar el viento a [[soplar]].<ref name="novísimo" />
;36: {{plm|jactarse}} de algo con demasiada [[presunción]].<ref name="novísimo" />
;37: {{plm|correr}} a toda prisa.
{{uso|coloquial}}
{{ámbito|Argentina}}
{{sinónimo|echarse un pique}}
==== Locuciones ====
* [[picar más alto]] o [[picar muy alto]]: Sobresalir, descollar.<ref name="novísimo" />
* [[picar las espaldas]] o [[picar en las espaldas]]: Picar en la retaguardia.<ref name="drae">{{DLC1842}} pág. 669</ref>
==== Conjugación ====
{{es.v}}
==== Véase también ====
* [[picarse]]
==== Traducciones ====
{{trad-arriba}}
{{t|de|a1=21|t1=schnabulieren|t2=schnausen}}
{{t|fr|a1=1|t1=piquer|a2=18|t2=démanger}}
{{t|en|a1=1|t1=puncture|t2=prick|a3=2|t3=mince|a4=3|t4=tease|a5=4|t5=burn|a6=18|t6=itch}}
{{trad-abajo}}
== Referencias y notas ==
<references />
4nbtp4phw9ugltlg18bkba6dvgsvcds
baron
0
48200
6307271
5854583
2026-08-05T13:25:43Z
Intolerable situation
130039
/* {{lengua|en}} */
6307271
wikitext
text/x-wiki
{{desambiguación|Baron}}
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=ˈbæɹən|1pron1=Received Pronunciation
|2fono1=ˈbæɹən|2pron1=General American, sin la fusión ''Mary-marry-merry''
|3fono1=ˈbɛɹən|3pron1=General American, con la fusión ''Mary-marry-merry''
|ls=2}}
=== Etimología ===
{{etimología|leng=en}}
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|barón}}
== Referencias y notas ==
<references />
glwfm0oa3yj1au230q8id83bgku706i
arm
0
49602
6307288
5945431
2026-08-05T13:40:56Z
Intolerable situation
130039
/* {{lengua|en}} */
6307288
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1pron=Received Pronunciation|1fono=ɑːm
|2pron=General American, Canadá|2fono=ɑɹm|2audio=en-us-arm.ogg|2aunota=California|2audio2=LL-Q1860 (eng)-Naomi Persephone Amethyst (NaomiAmethyst)-arm.wav|2aunota2=Carolina del Norte
|3pron=Australia, Nueva Zelanda|3fono=ɐːm
|ls=1
}}
=== Etimología 1 ===
{{etimología|leng=en|ang|earm}}.
==== {{sustantivo|en}} ====
{{en.sust|c}}
;1 {{csem|leng=en|anatomía}}: {{plm|brazo}}.
{{ejemplo|Who has believed our report? And to whom has the '''arm''' of the Lord been revealed?|c=libro|pasaje=Isaiah 53:1|t=Bible|trad=¿Quién ha creído a nuestro anuncio y sobre quién se ha manifestado el '''brazo''' de Jehová?|tradc=libro|tradpasaje=Isaías 53:1|tradt=Biblia|tradu=https://www.biblegateway.com/passage/?search=isaias%2053&version=RVR1995|tradv=Reina-Valera 1995|u=https://www.biblegateway.com/passage/?search=isaias%2053&version=NKJV
|v=New King James Version}}
;2 {{csem|leng=en|vestimenta}}: {{plm|manga}}.
=== Etimología 2 ===
{{etimología|leng=en|fro|arme}}, {etim|leng=en|la|armo|armō}}, de {{l+|la|arma}}.
==== {{sustantivo|en}} ====
{{en.sust|c}}
;1: {{plm|arma}}.
{{sinónimos|leng=en|weapon}}.
==== {{verbo transitivo|en}} ====
;2: {{plm|armar}}, [[equipar]].
==== Conjugación ====
{{en.v}}
== {{lengua|ga}} ==
{{pron-graf|leng=ga}}
=== Etimología ===
{{etimología|leng=ga|sga|arm|arma}}, del latín {{l+|la|arma}}
=== {{sustantivo masculino|ga}} ===
;1: {{plm|arma}}
;2: {{plm|ejército}}
=== Véase también ===
{{w|leng=ga}}
* {{l|ga|armas|glosa=blasón}} (heráldica)
=== Declinación ===
{{ga.sust|m1|arm|airm}}
== {{lengua|sv}} ==
{{pron-graf|leng=sv|fone=ˈarm}}
=== Etimología ===
{{etimología|leng=sv|non|armr}}
=== {{sustantivo neutro|sv}} ===
;1 {{csem|leng=sv|anatomía}}: {{plm|brazo}}.
;2: {{plm|brazo}} (de un objeto).
=== Compuestos ===
* {{l|sv|armband}}: ''pulsera''
* {{l|sv|armbandsur}}: ''reloj de pulsera''
* {{l|sv| armbåge}}: ''codo''
=== Locuciones ===
* {{l|sv|gå arm i arm}}
* {{l|sv|lägga armarna i kors}}
* {{l|sv|med öppna armar}}
=== Véase también ===
{{w|leng=sv}}
=== Declinación ===
{{sv.sust|c-ar}}
== Referencias y notas ==
<references />
scy2d59ikdmtj9dtyh6houutgooaf6d
ítem
0
54908
6307381
6294784
2026-08-06T00:38:43Z
TMCbot
164594
.
6307381
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la|item|también}}, "del [[mismo]] [[modo]]".<ref>{{DRAE2001}}</ref>
==== {{adverbio de cantidad|es}} ====
;1: ''Úsase para introducir cada uno de los acápites de un texto o los elementos de una lista''.
{{uso|anticuado|nota=salvo en Derecho}}
{{sinónimo|ítem más}}.
==== {{sustantivo masculino|es}} ====
{{es.sust|p=ítems|p2=ítemes[†]}}
;2: Por extensión, cada una de las [[unidad]]es en que se divide un [[texto]], [[formulario]], [[lista]] o similar.<ref>{{referencia|c=pagina|url=https://www.fundeu.es/consulta/item-1530/|autor=Fundéu|título=ítem}}</ref>
{{ejemplo|Finalmente, el magistrado resolvió entregar fotocopia de la petición de la fiscalía a cada uno de los defensores, a fin de que estudien cada ''ítem'' y manifiesten hoy su postura respecto a la aceptación o no de la exclusión de los mismos, en la audiencia de hoy, cuyo inicio está fijado para las 08:00.|c=pagina|t=Incidentado inicio tuvo audiencia preliminar de acusados por plagio. Juez debe decidir si habra o no juicio oral en el caso lindstron - Edicion Impresa - ABC Digital|f=2011-03-12|u=https://web.archive.org/web/20110312150358/http://www.abc.com.py/nota/nincidentado-inicio-tuvo-audiencia-preliminar-de-acusados-por-plagio}}
;3: En particular, cada una de las unidades que conforma una [[prueba]] o [[cuestionario]].
{{ejemplo|Al analizar la dimensión de la conducta pro social encontramos en la primera subescala (consideración por los demás) 25% de los ''ítemes'' que se asociaban significativamente con el consumo de drogas y alcohol; en la segunda subescala (respeto), el 75% de los ''ítemes'' se asociaban con ese consumo.|c=sublibro|a=Ramón Florenzano|f=2001|t2=Estudio comparativo del rol de la socialización familiar y factores de personalidad en las farmacodependencias juveniles|t=Revista chilena de pediatría}}
;4: Más generalmente, cada uno de los [[elemento]]s de un [[conjunto]].
{{ejemplo|Y se espera para hoy que redoble su ofensiva en los temas que obsesionan a la administración kirchnerista: crecimiento económico, creación de empleo en blanco, y también alguna propuesta para los temas más complicados para el actual período: seguridad pública e inflación, los ''ítem'' sobre los que buscarán hacer pie desde la oposición en el año político electoral ya prácticamente lanzado.|c=pagina|t=.LA - The Official .LA Registry|f=2015-10-16|u=https://web.archive.org/web/20151019052656/http://www.la}}
==== Locuciones ====
* [[ítem más]]: ítem{{-sub|1}}
==== Información adicional ====
* Véase el diccionario de María Moliner (1970) para el plural arcaico ''ítemes''.
==== Véase también ====
*[[ídem]]
==== Traducciones ====
{{trad-arriba}}
{{t|en|a1=1-4|t1=item}}
{{trad-abajo}}
== Referencias y notas ==
<references />
365kjog87zjdvwlsl4of06xr54gemwz
transgénero
0
64998
6307376
6076849
2026-08-06T00:38:36Z
TMCbot
164594
.
6307376
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|prefijo|trans|género}}.
=== {{adjetivo|es}} ===
{{es.adj|inv}}
;1 {{csem|lgbt}}: Dícese de la persona que [[aparentar|aparenta]], [[pretender|pretende]], o [[querer|quiere]] ser [[considerar|considerada]] miembro de otro [[género]] diferente al [[sexo]] que le fue asignado al nacer.
{{uso|utcs}}
{{hipónimo|transexual}}
{{antónimo|cisgénero}}
;2 {{csem|lgbt}}: Propio o relacionado con las personas transgénero.
=== Véase también ===
* [[identidad de género]]
* [[travesti]]
{{W}}
=== Traducciones ===
{{trad-arriba}}
{{t|fr|t1=transgenre}}
{{t|en|t1=transgender}}
{{trad-abajo}}
== Referencias y notas ==
<references />
4c8awtruwec86zcbw73dmvy1df9sp4r
tutú
0
65744
6307378
6027386
2026-08-06T00:38:38Z
TMCbot
164594
.
6307378
wikitext
text/x-wiki
{{desambiguación|Tutu|tutu|tuttu}}
== {{lengua|es}} ==
{{pron-graf}}
[[Archivo:Degas- La classe de danse 1874.jpg|thumb|right|en la obra de Degas]]
=== Etimología ===
{{etimología|fr|tutu}}.
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1: {{plm|faldellín}} de [[bailarina]] de [[ballet]].
=== Véase también ===
{{W}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|t1=Tutu}}
{{t|fr|t1=tutu}}
{{t|en|t1=tutu}}
{{trad-abajo}}
== Referencias y notas ==
<references />
ap0f9tftldyr13azak4jl3iayyjzyke
acne
0
74549
6307264
5469875
2026-08-05T13:05:08Z
Intolerable situation
130039
/* {{lengua|en}} */
6307264
wikitext
text/x-wiki
== {{lengua|af}} ==
{{pron-graf|leng=af}}
=== Etimología 1 ===
{{etimología|leng=af}}.
==== {{sustantivo|af}} ====
;1: {{plm|acné}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología 1 ===
{{etimología|leng=ca}}.
==== {{sustantivo|ca}} ====
;1: {{plm|acné}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|1pron1=/ˈækni/|1audio1=en-us-acne.ogg}}
=== Etimología 1 ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
;1: {{plm|acné}}.
== {{lengua|ga}} ==
{{pron-graf|leng=ga}}
=== Etimología 1 ===
{{etimología|leng=ga}}.
==== {{sustantivo|ga}} ====
;1: {{plm|acné}}.
== {{lengua|it}} ==
{{pron-graf|leng=it}}
=== Etimología 1 ===
{{etimología|leng=it}}.
==== {{sustantivo|it}} ====
;1: {{plm|acné}}.
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología 1 ===
{{etimología|leng=nl}}.
==== {{sustantivo|nl}} ====
;1: {{plm|acné}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt}}.
==== {{sustantivo femenino|pt}} ====
;1: {{plm|acné}}.
== Referencias y notas ==
<references />
or7vwna24dmpn0maex5qwkiepck5gr7
6307265
6307264
2026-08-05T13:05:47Z
Intolerable situation
130039
/* {{lengua|en}} */
6307265
wikitext
text/x-wiki
== {{lengua|af}} ==
{{pron-graf|leng=af}}
=== Etimología 1 ===
{{etimología|leng=af}}.
==== {{sustantivo|af}} ====
;1: {{plm|acné}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología 1 ===
{{etimología|leng=ca}}.
==== {{sustantivo|ca}} ====
;1: {{plm|acné}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=/ˈækni/|audio=en-us-acne.ogg}}
=== Etimología 1 ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
;1: {{plm|acné}}.
== {{lengua|ga}} ==
{{pron-graf|leng=ga}}
=== Etimología 1 ===
{{etimología|leng=ga}}.
==== {{sustantivo|ga}} ====
;1: {{plm|acné}}.
== {{lengua|it}} ==
{{pron-graf|leng=it}}
=== Etimología 1 ===
{{etimología|leng=it}}.
==== {{sustantivo|it}} ====
;1: {{plm|acné}}.
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología 1 ===
{{etimología|leng=nl}}.
==== {{sustantivo|nl}} ====
;1: {{plm|acné}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt}}.
==== {{sustantivo femenino|pt}} ====
;1: {{plm|acné}}.
== Referencias y notas ==
<references />
9tnhymnmpjon3xmhkyph93redv1545f
6307266
6307265
2026-08-05T13:06:05Z
Intolerable situation
130039
6307266
wikitext
text/x-wiki
== {{lengua|af}} ==
{{pron-graf|leng=af}}
=== Etimología 1 ===
{{etimología|leng=af}}.
==== {{sustantivo|af}} ====
;1: {{plm|acné}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología 1 ===
{{etimología|leng=ca}}.
==== {{sustantivo|ca}} ====
;1: {{plm|acné}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈækni|audio=en-us-acne.ogg}}
=== Etimología 1 ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
;1: {{plm|acné}}.
== {{lengua|ga}} ==
{{pron-graf|leng=ga}}
=== Etimología 1 ===
{{etimología|leng=ga}}.
==== {{sustantivo|ga}} ====
;1: {{plm|acné}}.
== {{lengua|it}} ==
{{pron-graf|leng=it}}
=== Etimología 1 ===
{{etimología|leng=it}}.
==== {{sustantivo|it}} ====
;1: {{plm|acné}}.
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología 1 ===
{{etimología|leng=nl}}.
==== {{sustantivo|nl}} ====
;1: {{plm|acné}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt}}.
==== {{sustantivo femenino|pt}} ====
;1: {{plm|acné}}.
== Referencias y notas ==
<references />
g0avwtjy1bmy1b4brp9jju9nnquxl2p
6307275
6307266
2026-08-05T13:29:42Z
Intolerable situation
130039
/* {{lengua|en}} */
6307275
wikitext
text/x-wiki
== {{lengua|af}} ==
{{pron-graf|leng=af}}
=== Etimología 1 ===
{{etimología|leng=af}}.
==== {{sustantivo|af}} ====
;1: {{plm|acné}}.
== {{lengua|ca}} ==
{{pron-graf|leng=ca}}
=== Etimología 1 ===
{{etimología|leng=ca}}.
==== {{sustantivo|ca}} ====
;1: {{plm|acné}}.
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈækni|audio=en-us-acne.ogg|ls=2}}
=== Etimología 1 ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
;1: {{plm|acné}}.
== {{lengua|ga}} ==
{{pron-graf|leng=ga}}
=== Etimología 1 ===
{{etimología|leng=ga}}.
==== {{sustantivo|ga}} ====
;1: {{plm|acné}}.
== {{lengua|it}} ==
{{pron-graf|leng=it}}
=== Etimología 1 ===
{{etimología|leng=it}}.
==== {{sustantivo|it}} ====
;1: {{plm|acné}}.
== {{lengua|nl}} ==
{{pron-graf|leng=nl}}
=== Etimología 1 ===
{{etimología|leng=nl}}.
==== {{sustantivo|nl}} ====
;1: {{plm|acné}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt}}.
==== {{sustantivo femenino|pt}} ====
;1: {{plm|acné}}.
== Referencias y notas ==
<references />
hq1ek1vfy2wfz74w8oqwaoomqteto0h
swine
0
74728
6307263
4649269
2026-08-05T13:02:03Z
Intolerable situation
130039
/* {{lengua|en}} */
6307263
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=swaɪn}}
=== Etimología ===
{{etimología|leng=en}}
=== {{sustantivo|en}} ===
;1 {{csem|leng=en|Mamíferos}}: [[cerdo|Cerdo]]s, ganado [[porcino]]
== Referencias y notas ==
<references />
06mx62p2bcsk51a2l0quzhws9higvnb
6307276
6307263
2026-08-05T13:30:05Z
Intolerable situation
130039
/* {{lengua|en}} */
6307276
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=swaɪn|ls=1}}
=== Etimología ===
{{etimología|leng=en}}
=== {{sustantivo|en}} ===
;1 {{csem|leng=en|Mamíferos}}: [[cerdo|Cerdo]]s, ganado [[porcino]]
== Referencias y notas ==
<references />
tuf3gsk450b35vskbz0jor3cmhc2jsb
achieve
0
79819
6307287
6043660
2026-08-05T13:39:27Z
Intolerable situation
130039
/* {{lengua|en}} */
6307287
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|2audio1=en-us-achieve.ogg|2audio2=LL-Q1860 (eng)-Simplificationalizer-achieve.wav|2aunota1=California|2aunota2=Nueva Jersey
|2fono1=əˈt͡ʃiv|2pron1=General American, Standard Canadian|3fnota2=culto
|3fone2=əˈt͡ʃɪiv|3fono1=əˈt͡ʃiːv|3pron1=Australia|4fono1=əˈt͡ʃiːv
|4pron1=Nueva Zelanda|1fono1=əˈt͡ʃiːv
|ls=2|1pron1=Received Pronunciation}}
=== Etimología ===
{{etimología|leng=en|fro|achever}}.
=== {{verbo transitivo|en}} ===
;1: {{plm|lograr}}, [[conseguir]], [[alcanzar]].
=== Conjugación ===
{{en.v}}
== Referencias y notas ==
<references />
hw40sxl9ry5lqtbue503yke208j5jtj
pirulí
0
80312
6307371
5687147
2026-08-06T00:38:25Z
TMCbot
164594
.
6307371
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología}}
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1 {{csem|alimentos}}: {{plm|caramelo}} [[duro]] y [[colorido]], de hasta 10 a 15 [[centímetro|cm]] de alto, de forma [[cónico|cónica]] o [[piramidal]] con [[punta]] muy [[agudo|aguda]], con un palito en la base que sirve para sostenerlo, y que viene envuelto en papel plástico [[transparente]] (similar al papel [[celofán]]).
{{sinónimos|pirulín|chupirul|pico dulce}}
=== Véase también ===
*[[piruleta]]
{{W}}
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
{{trad-abajo}}
== Referencias y notas ==
<references />
p7yjyt51r3fxl5eum52nj6wtsy8s371
cork
0
81071
6307289
5851841
2026-08-05T13:43:02Z
Intolerable situation
130039
/* {{lengua|en}} */
6307289
wikitext
text/x-wiki
{{desambiguación|Cork}}
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=kɔːk|1pron1=Received Pronunciation
|2fono1=kɔɹk|2pron1=General American|2audio1=en-us-cork.ogg
|ls=1
}}
=== Etimología 1 ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
{{en.sust|ci}}
;1: {{plm|corcho}}.
== Referencias y notas ==
<references />
rm718zdc7lal1czlrv6swztgbh4q7ru
labor
0
82199
6307415
6060083
2026-08-06T02:54:32Z
TMCbot
164594
.
6307415
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|labor}}.
=== {{sustantivo femenino|es}} ===
;1: {{sustantivo de verbo|trabajar}}.<ref name="drae1914">{{DLC1914|600}}</ref>
{{sinónimo|trabajo}}.
;2: Cualquiera producción del entendimiento en ciencias, letras o artes, y con particularidad la que es de alguna importancia.<ref name="drae1914" />
{{sinónimo|obra}}.
;3: Adorno tejido en la tela, o ejecutado de algún modo en otras cosas.<ref name="drae1914" />
=== Locuciones ===
* [[estar por la labor]]
* [[hacer labor]]
* [[hacer labores]]
* [[meter en labor]]
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|fr|a1=1|a2=2|t1=travail|t2=labour}}
{{t|en|a1=2|a2=2|a3=2|t1=labor|t2=ploughing|t3=plowing}}
{{trad-abajo}}
== {{lengua|en}} ==
{{pron-graf|leng=en|1audio1=LL-Q1860 (eng)-Berrely-labour.wav|1audio2=En-uk-labour.ogg|1aunota1=Londres|1aunota2=Gloucestershire|1fone1=ˈleɪ̯.bə|1pron1=Received Pronunciation|2audio1=en-us-labor.ogg|2aunota1=California|2fone1=ˈleɪ̯.bɚ|2pron1=General American, Standard Canadian|3fone1=ˈlæɪ̯.bə|3pron1=Australia, Nueva Zelanda|g1=labour|gnota1=excepto EE. UU.|ls=2}}
=== Etimología ===
{{etimología|leng=en|enm|labouren}}, {{etim|leng=en|fro|laborer}}, {{etim|leng=en|la|laboro|alt=labōrāre}}, y este de {{l+|la|labor}}.
=== {{sustantivo|en}} ===
{{en.sust|ci}}
;1: {{plm|tarea}}, [[trabajo]], [[labor]].
;2: El conjunto de personas que son trabajadores asalariados en una organización.
;3: La clase trabajadora.
;4: Trabajo o labor de parto.
=== {{verbo transitivo|en}} ===
;5: Insistir [[excesivamente]].
=== {{verbo intransitivo|en}} ===
;6: {{plm|trabajar}}.
{{ejemplo|The desire of the lazy man kills him, For his hands refuse to labor|c=libro|pasaje=Proverbs 21:25|t=Bible|trad=El deseo del perezoso lo mata, porque sus manos no quieren trabajar|tradc=libro|tradpasaje=Proverbios 21:25|tradt=Biblia|tradu=https://www.biblegateway.com/passage/?search=Proverbios+21&version=RVR1995|tradv=Reina-Valera 1995|u=https://www.biblegateway.com/passage/?search=Proverbs+21&version=NKJV|v=New King James}}
=== {{adjetivo|en}} ===
;7: Propio o relacionado con el trabajo o los trabajadores.
=== Conjugación ===
{{en.v}}
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda1=lābor|v1=labos}}
=== Etimología 1 ===
{{etimología|leng=la|endo|labo|alt=labō, -āre|glosa=tambalearse}}.<ref name="vaan">{{DeVaan|319-20}}</ref>
==== {{verbo intransitivo|la}} ====
;1: {{plm|deslizarse}} (por el agua).<ref name="ol">{{Oxf-lat}}</ref>
;2: ''Por el aire'': [[planear]], [[flotar]] o [[levitar]] lentamente en alguna dirección.<ref name="ol" />
;3: ''Dicho de cuerpos celestes'': [[mover]]se [[suave]] o [[imperceptible]]mente (por el cielo o hacia el horizonte).<ref name="ol" />
;4: ''Dicho del sol'': [[acercarse]] al horizonte, [[caer]].<ref name="ol" />
;5: ''Dicho del día'': [[acercarse]] a su fin, [[caer]], [[ocasear]].<ref name="ol" />
;6: ''Dicho de líquidos, especialmente de ríos'': [[fluir]], [[correr]].<ref name="ol" />
;7: {{plm|caer}} o [[resbalar]] de una posición elevada, [[caerse]].<ref name="ol" />
;8: {{plm|resbalarse}}, [[perder]] el [[equilibrio]].<ref name="ol" />
;9: ''Dicho de edificaciones'': [[colapsar]], [[derrumbarse]].<ref name="ol" />
;10: ''Dicho de armadas'': [[retirarse]].<ref name="ol" />
;11: {{plm|colapsar}}, [[caer]] (de fatiga, a punto de morir, etc.).<ref name="ol" />
;12: ''Dicho de extremidades, etc.'': [[caerse]].<ref name="ol" />
;13: ''Dicho de los ojos'': [[cerrarse]].<ref name="ol" />
;14: {{plm|morir}}, [[perecer]].<ref name="ol" />
;15: ''Dicho de cosas materiales, riquezas, fuerzas físicas, etc.'': [[disipar]], [[desaparecer]].<ref name="ol" />
;16: {{plm|decaer}}, [[declinar]], [[menguar]] (hacia un estado o condición inferior).<ref name="ol" />
;17: {{plm|errar}}, [[equivocarse]].<ref name="ol" />
==== Conjugación ====
{{la.v|3|lābor|lāps|lāps}}
=== Etimología 2 ===
{{etimología|leng=la|incierta}}; muchas veces se la relaciona con {{l+|la|labo|labō, -āre|glosa=tambalearse}}.<ref name="vaan" />
==== {{sustantivo masculino|la}} ====
;1: {{plm|trabajo}}, [[labor]], [[esfuerzo]] (físico o mental).<ref name="ol" />
;2: {{plm|laboriosidad}}, [[aplicación]].<ref name="ol" />
;3: Un [[trabajo]] en particular, [[tarea]].<ref name="ol" />
;4: Un resultado o producto de trabajo, [[producción]], [[producto]].<ref name="ol" />
;5 {{csem|leng=la|astrología}}: Cualquiera de las doce divisiones del círculo del zodiaco.<ref name="ol" />
;6: {{plm|trabajos}}, [[desgracia]], [[miseria]], [[estrechez]].<ref name="ol" />
;7: {{plm|dolor}}, [[malestar]].<ref name="ol" />
;8: {{plm|fatiga}}.<ref name="ol" />
==== Declinación ====
{{la.sust|labor.3}}
== Referencias y notas ==
<references />
l3ijm5sy280xem7wgzo68y7k4ms261f
córner
0
83150
6307360
5926798
2026-08-06T00:37:56Z
TMCbot
164594
.
6307360
wikitext
text/x-wiki
{{desambiguación|corner}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|en|corner}}, y este del anglonormando {{l+|fro|cornere}}, a su vez del francés antiguo {{l+|fro|corne}}, ("[[cuerno]]"), del latín vulgar {{l+|la|cornu}}, en última instancia del protoindoeuropeo {{l+|ine-pro|*ḱr̥-no-}}, de la raíz {{l+|ine-pro|*ḱer-}}.
[[Archivo:Cornerkick.jpg|thumb|[2]]]
=== {{sustantivo masculino|es}} ===
{{es.sust|p1=córneres|p2=córners}}
;1 {{csem|fútbol}}: Zona de las esquinas del campo de juego.
;2 {{csem|fútbol|hockey sobre césped}}: {{plm|tiro}} con [[pelota]] [[detenido|detenida]] que se concede a un [[equipo]] de [[fútbol]] cuando el equipo [[rival]] hace salir la pelota de la [[cancha]] por su propia [[línea]] de [[fondo]].
{{sinónimo|saque de esquina|tiro de esquina}}.
{{ejemplo|Goles, amarillas, rojas y hasta '''córners'''. Todo vale a la hora de arriesgar un pronóstico a cambio de plata.|c=artículo|t=El peligro de las apuestas deportivas online|a=Mauro Fulco|p=81|edición=21|revista=Newsweek|l=Argentina|f=2024-1|obs=EAN: 9990000039005, Adendum: 00021}}
=== Véase también ===
{{w}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|a1=2|t1=Eckstoß}}
{{t|be|a1=2|t1=кутні ўдар}}
{{t|bg|a1=2|t1=корнер}}
{{t|ca|a1=2|t1=córner}}
{{t|zh|a1=2|t1=角球}}
{{t|da|a1=2|t1=hjørnespark}}
{{t|eu|a1=2|t1=korner}}
{{t|vls|a1=2|t1=corner}}
{{t|fr|a1=2|t1=coup de pied de coin}}
{{t|el|a1=2|t1=κόρνερ}} (kórner)
{{t|he|a1=2|t1=בעיטת קרן}}
{{t|en|a1=2|t1=corner kick}}
{{t|it|a1=2|t1=calcio d'angolo}}
{{t|ja|a1=2|t1=コーナーキック}}
{{t|lv|a1=2|t1=stūra sitiens}}
{{t|nl|a1=2|t1=hoekschop}}
{{t|nb|a1=2|t1=hjørnespark}}
{{t|fa|a1=2|t1=ضربه کرنر}}
{{t|pl|a1=2|t1=rzut rożny}}
{{t|pt|a1=2|t1=escanteio}}
{{t|ru|a1=2|t1=угловой удар}}
{{t|sv|a1=2|t1=hörna}}
{{trad-abajo}}
== {{lengua|ca}} ==
{{pron-graf|leng=ca|fone=ˈkoɾ.nə}}
=== Etimología ===
{{etimología|en|corner|leng=ca}}, y este del anglonormando {{l+|fro|cornere}}, a su vez del francés antiguo {{l+|fro|corne}}, "[[cuerno]]", del latín vulgar {{l+|la|cornu}}, en última instancia del protoindoeuropeo {{l+|ine-pro|*ḱr̥-no-}}, de la raíz {{l+|ine-pro|*ḱer-}}
=== {{sustantivo|ca|masculino}} ===
{{ca.sust|m}}
;1 {{csem|fútbol|hockey sobre césped|leng=ca}}: {{plm}}.
== Referencias y notas ==
<references />
33dews4qi181y8602mxsl28qtm20a0u
abide
0
89670
6307285
6116630
2026-08-05T13:38:15Z
Intolerable situation
130039
/* {{lengua|en}} */
6307285
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|audio=en-us-abide.ogg|aunota=EE. UU.|fono=əˈbaɪd|ls=2}}
=== Etimología ===
{{etimología|leng=en}}
=== {{verbo transitivo|en}} ===
;1: {{plm|soportar}}, [[aguantar]].
;2: {{plm|permanecer}}, [[continuar]].
{{ejemplo|If you '''abide''' in Me, and My words '''abide''' in you, you will ask what you desire, and it shall be done for you.|c=libro|pasaje=John 15:7|t=Bible|trad=Si '''permanecéis''' en mí y mis palabras '''permanecen''' en vosotros, pedid todo lo que queráis y os será hecho.|tradc=libro|tradpasaje=Juan 15:7|tradt=Biblia|tradu=https://www.biblegateway.com/passage/?search=juan+15&version=RVR1995|tradv=Reina-Valera 1995|u=https://www.biblegateway.com/passage/?search=juan+15&version=NKJV|v=NKJV}}
;3: {{plm|vivir}}, [[morar]].
{{ejemplo|He who dwells in the secret place of the Most High, Shall '''abide''' under the shadow of the Almighty|c=libro|pasaje=Psalm 91:1|t=Bible|trad=El que habita al abrigo del Altísimo, '''morará''' bajo la sombra del Omnipotente|tradc=libro|tradpasaje=Salmos 91:1|tradt=Biblia|tradu=https://www.biblegateway.com/passage/?search=salmo+91&version=RVR1995|tradv=Reina-Valera 1995|u=https://www.biblegateway.com/passage/?search=Salm+91&version=NKJV|v=New King James}}
=== {{verbo intransitivo|en}} ===
;1: abide by: [[cumplir]], [[respetar]], [[acatar]]
=== Conjugación ===
{{en.v}}
== Referencias y notas ==
<references />
69zf103j2qjr0weepw0zjo7jss7up7f
gachí
0
96205
6307366
5687145
2026-08-06T00:38:11Z
TMCbot
164594
.
6307366
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|rmq|gachí}}, "mujer no [[gitano|gitana]]", {{etim|rom|gaʒi}}.<ref>Ropero Núñez, Miguel (2007) "Tratamiento lexicográfico y sociolingüístico de los gitanismos". En: ''Estudios dedicados al profesor Miguel Ropero''. Pedro Carbonero Cano (ed.). Sevilla: Universidad de Sevilla, p. 44</ref>
=== {{sustantivo femenino|es}} ===
{{es.sust|s=s}}
;1: {{plm|ser humano}} de [[sexo]] [[femenino]]
{{ámbito|España}}
{{uso|jerga|vulgar}}
{{sinónimos|fémina|mina|nota2=Rioplatense, jergal|mujer}}
{{hiperónimo|hembra}}.
=== Véase también ===
* [[gaché]]
* [[gachó]]
=== Traducciones ===
{{trad-arriba}}
<!--{{t+|de|}}-->
<!--{{t+|ar|}}-->
<!--{{t+|bg|}}-->
<!--{{t+|ca|}}-->
<!--{{t+|eo|}}-->
<!--{{t+|fr|}}-->
<!--{{t+|en|}}-->
<!--{{t+|it|}}-->
<!--{{t+|ja|}}-->
<!--{{t+|nl|}}-->
<!--{{t+|pl|}}-->
<!--{{t+|pt|}}-->
{{trad-abajo}}
== Referencias y notas ==
<references />
1axm3x2pntt3qe50t69q2hl24cmimx0
abbey
0
100941
6307283
6301877
2026-08-05T13:35:34Z
Intolerable situation
130039
/* {{lengua|en}} */
6307283
wikitext
text/x-wiki
{{desambiguación|abey}}
== {{lengua|en}} ==
{{pron-graf|leng=en|1audio1=en-us-abbey.ogg|1fono1=ˈæbɪ|ls=2}}
=== Etimología 1 ===
{{etimología|leng=en|enm|abbey}}.
==== {{sustantivo|en}} ====
{{en.sust|c}}
;1 {{csem|leng=en|religión}}: {{plm|abadía}}.
==== Véase también ====
{{w|leng=en}}
== {{lengua|enm}} ==
{{pron-graf|leng=enm|v1=abbeye|v2=abbeie|v3=abbay|v4=abbegh}}
=== Etimología 1 ===
{{etimología|leng=enm|fro|abaie}}.
==== {{sustantivo|enm}} ====
;1: {{plm|abadía}}.
== Referencias y notas ==
<references />
lrq9n73h9k693nkgwra09cabwkyat7d
occurrence
0
108277
6307317
6297351
2026-08-05T23:47:03Z
Adelpine
34679
Mejora algunas transcripciones AFI
6307317
wikitext
text/x-wiki
== {{lengua|fr}} ==
{{pron-graf|leng=fr|1fone1=ɔ.ky.ˈʁɑ̃s}}
=== Etimología ===
{{etimología|leng=fr}}
=== {{sustantivo femenino|fr}} ===
{{fr.sust}}
;1: {{plm|ocurrencia}}
=== Véase también ===
{{W|leng=fr}}
== {{lengua|en}} ==
{{pron-graf|leng=en
|pron=Received Pronunciation, Standard Southern British|fono=əˈkʌɹ.ən(t)s|fono2=əˈkɜːɹ.ən(t)s|fnota2=En acentos sin la fusión hurry-furry, /ɜː/ es, no obstante, escuchado ocasionalmente mediante la influencia de {{l+|en|occur}}.|audio2=LL-Q1860 (eng)-Vealhurl-occurrence.wav|aunota2=Berkshire, Standard Southern British
|2pron=General American, Canadá|2fono=əˈkɝ.ən(t)s
|3pron=Australia|3fono=əˈkɐɹ.ən(t)s
|4pron=Nueva Zelanda|4fono=əˈkɐɹ.ən(t)s|4fono2=əˈkɵːɹ.ən(t)s
|ls=3
}}
=== Etimología ===
{{etimología|leng=en|frm|occurrence}}, {{etim|leng=en|la-med|occurrentia}}.
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|ocurrencia}}.
=== Véase también ===
{{W|leng=en}}
== Referencias y notas ==
<references />
c8zcf5du4a68029485uqy1wdvuzp0qt
cual
0
109970
6307357
5929184
2026-08-06T00:37:53Z
TMCbot
164594
.
6307357
wikitext
text/x-wiki
{{desambiguación|cuál}}
== {{lengua|es}} ==
{{pron-graf|g1=qual|gnota1=obsoleta}}
=== Etimología 1 ===
{{etimología|la|qualis}}.
==== {{pronombre relativo|es}} ====
{{es.adj|neutro=cual}}
;1: {{impropia|Sustituye o señala [[sustantivo]]s e [[idea]]s que se han mencionado o se van a mencionar}}.
{{relacionado|cualquiera}}.
{{ejemplo|no me canso nunca, adelante, siempre, sea cual sea el destino de esta página errante que no sabe cuál será su epílogo.|c=libro|t=Estaciones del Alma|f=2008|editorial=Bubok Publishing|isbn=9788492500758|u=http://books.google.es/books?id}}
{{ejemplo|Sean cuales quieran las variedades que presenten las bolsas, la parte superior conserva siempre sus limites.|c=libro|t=Tratado de anatomia descriptiva|f=1858|a=Philibert-Constant Sappey|editorial=Carlos Bailly-Bailliere|u=http://books.google.es/books?id}}
{{ejemplo|Juan y María son [[tal para cual]] o el uno para el otro; se complementan (cual se refiere a Juan o a María).}}
;2: {{impropia|Conecta dos elementos de la [[oración]], señalando el sustantivo o idea que se ha mencionado}}.
{{uso|siempre va precedido del artículo determinado ([[el cual]])|aplicado en especial a objetos|para personas es preferible usar '[[quien]]' o '[[que]]'}}
{{sinónimo|que|nota1=relativo|quien|nota2=relativo, para personas}}.
{{ejemplo|Es una herramienta con la cual trabajo. (Similar: es una herramienta con la que trabajo)}}
{{ejemplo|Hay problemas para los cuales no estamos preparados. (Similar: hay problemas para los que no estamos preparados)}}
;3: {{impropia|Repetido de un modo disyuntivo equivale la primera vez a uno, y cada una de las restantes a otro.}}.<ref name="drae">{{DLC1842}}</ref>
{{uso|distributivo|en correlación con {{l+|es|cual}} ([[cual… cual]])}}
{{ejemplo|Tengo muchos libros, cuales de latín, cuales de romance.}}
==== {{adverbio|es|relativo|comparativo}} ====
;4: Del mismo modo o semejante.<ref name="drae" />
{{uso|literario|utca|como conjunción comparativa.}}
{{sinónimo|como|así como}}
{{ejemplo|Cual es Pedro, tal es Juan (así como es Pedro, así es Juan).}}
{{ejemplo|Llegaron cansados cual lo imaginábamos (como lo imaginábamos).}}
{{ejemplo|(conjunción) Sus ojos, negros cual ónix, se fijaron en ti (negros como el ónix).}}
==== Locuciones ====
* [[cual más cual menos]]: expresión con que se explica la poca diferencia o casi igualdad que hay entre las cosas de que se habla.
* [[cual o cual]]: [[tal cual]]; [[tal o cual]]
* [[cada cual]]: cada uno
==== Véase también ====
* [[cuál]] (interrogativo y exclamativo)
* [http://www.bowdoin.edu/~eyepes/newgr/ats/23.htm pronombres relativos del español] (explicación en inglés)
{{w|pronombre relativo}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|lfn}} ==
{{swadesh|lfn}}
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{pronombre interrogativo|lfn}} ===
;1: {{plm|cuál}}.
;2: {{plm|cuales}}.
;3: {{plm|qué}}.
== Referencias y notas ==
<references />
k4tc0ybzmx1wwajn5si0i3nij0e5be7
cuanto
0
109971
6307358
5929185
2026-08-06T00:37:54Z
TMCbot
164594
.
6307358
wikitext
text/x-wiki
{{desambiguación|cuánto}}
== {{lengua|es}} ==
{{pron-graf|h=cuánto}}
=== Etimología 1 ===
{{etimología|la|quantus}}.
==== {{adjetivo relativo|es}} ====
{{es.adj}}
;1: ''Lo que tiene cantidad o pertenece a ella.''<ref name="drae">{{DLC1842}}</ref>
;2: ''Numeral que significa cantidad indeterminada, correlativo de [[tanto]].''<ref name="drae" />
;3: Grande y excesivo en cualquier línea.<ref name="drae" />
==== {{pronombre relativo|es}} ====
{{es.adj|neutro=cuanto}}
;4: {{plm|todo}}, todo lo que.<ref name="drae" />
==== {{adverbio relativo|es}} ====
;5: En cuanto.<ref name="drae" />
;6: ''De calidad indeterminada''.<ref name="drae" />
{{ejemplo|''Cuanto'' uno es más pobre, se le debe socorrer más.}}
;7: ''Indica cantidad, regularmente acompañado de la preposición «[[en]]»''<ref name="drae" />
;8: ''Para tiempo, regularmente acompañado de la preposición «[[en]]»''<ref name="drae" />
;9: ''Determina calidad, regularmente acompañado de la preposición «[[en]]»''<ref name="drae" />
==== {{conjunción|es|copulativo}} ====
;10: Encabeza el segundo término de la correlación copulativa.
{{uso|menos común|en correlación con {{l+|es|tanto}} ([[tanto… cuanto]]) o {{l+|es|tan}} ([[tan… cuanto]])}}
==== Locuciones ====
{{trad-arriba|Locuciones con «cuanto»}}
* [[cuanto antes]]: mod. adv. Luego, inmediatamente.<ref name="drae" />
* [[cuanto más]]: expresión que sirve para explicar que hay otras razones además de las que se expresan, y equivale a «fuera de qué», o «además».<ref name="drae" />
* [[cuanto quier]]: (poco usado) aun cuando, aun que.<ref name="drae" />
* [[cuanto quiera que]]: (anticuado) como quiera que.<ref name="drae" />
* ¿[[cuánto va]]?: expresión con que se significa la sospecha o recelo de que suceda o se ejecute alguna cosa, y la fórmula de apostar a que se verifica.<ref name="drae" />
* [[en cuanto a]]: Por lo que toca o corresponde.<ref name="drae" />
* [[en cuanto]]: [[mientras]]. Por ejemplo: en cuanto viene Pedro hagamos esto.<ref name="drae" />
* [[por cuanto]]: mod. adv. que se usa como causal para notar la razón que se va a dar de alguna <ref name="drae" />
* [[por cuanto]]: se usa también como expresión con que se da a entender que lo que alguno ejecuta o dice es consiguiente a su genio o modo de obrar. Por ejemplo: por cuanto dejaría fulano de ir a la comedia.<ref name="drae" />
* [[tanto cuanto]]: Un poco, una cantidad insignificante. <ref name="novísimo">{{Labernia1866}}</ref>
{{trad-abajo}}
==== Véase también ====
* [[cuánto]]
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|gl|t1=canto}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|la|quantum}}.
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1 {{csem|física|matemática}}: Cantidad mínima e indivisible para un observable dado, de la cual todos los valores posibles del observable en cuestión deberán ser múltiplos de dicha cantidad.
{{ejemplo|El '''cuanto''' de la carga eléctrica, llamado carga elemental, es 1.602176634 · 10<sup>-19</sup> C.}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|lfn}} ==
{{pron-graf|leng=lfn}}
=== Etimología ===
{{etimología|leng=lfn}}.
=== {{pronombre interrogativo|lfn}} ===
;1: {{plm|cuánto}}.
== Referencias y notas ==
<references />
rqgzq7uucvj1cc8metkztewj2s3fn3a
tanto
0
109978
6307374
6099458
2026-08-06T00:38:33Z
TMCbot
164594
.
6307374
wikitext
text/x-wiki
{{desambiguación|tantō}}
== {{lengua|es}} ==
{{pron-graf|v=tan}}
=== Etimología 1 ===
{{etimología|osp|tanto|tanto}}, y este {{etim|la|tantus}}.
==== {{adjetivo|es|comparativo|indefinido}} ====
{{es.adj}}
;1: ''Se aplica a la cantidad, número o porción de una cosa indeterminada o indefinida. Úsase como correlativo de [[cuanto]] ([[tanto… cuanto]]).''<ref name="drae">{{DLC1842}}</ref>
;2: Tan grande, muy grande.<ref name="drae" />
{{uso|en correlación con la conjunción {{l+|es|que}} ([[tanto… que]])}}
==== {{sustantivo masculino|es}} ====
;3: {{plm|cantidad}} cierta o número determinado de una cosa.<ref name="drae" />
;4: {{plm|copia}} o ejemplar que se da de algún escrito trasladado de su original.<ref name="drae" />
;5: {{plm|golpe}}.<ref name="drae" />
;6: Piedrezuela, moneda u otra pieza con que se señalan los puntos o piedras que se ganan en algún juego, o los que se reparten en moneda menuda para el curso de él, y después de haber acabado de jugar se redimen a dinero.<ref name="drae" />
;7: En algunos [[juego]]s, [[punto]], [[piedra]].<ref name="drae" />
;8: Por extensión, punto o gol (en cualquier contexto).
{{uso|figurado|por extensión}}
{{ejemplo|—Ya se lo dije: pase lo que pase, el '''''tanto''''' se lo apuntarán Gregson y Lestrade.|título=Estudio en Escarlata|editorial=Edimat|capítulo=1.6. Tobías Gregson demuestra de lo que es capaz|páginas=89|c=libro|a=Arthur Conan Doyle|fecha=1887|obs=trad. de editorial}}
==== {{adverbio|es|comparativo|cantidad}} ====
;9: De tal modo o en tal grado.<ref name="drae" />
;10: {{plm|mucho}}, especialmente hablando del tiempo.<ref name="drae" />
{{ejemplo|''Tanto'' ha que estudias, y no sabes.}}
;11: ''Se toma también comparativamente a otra cosa, y vale "de la misma suerte", "semejante" o "igualmente".''<ref name="drae" />
;12: ''Junto con las voces "más" o "menos", "mejor" o "peor" se usa adverbialmente para explicar la especial razón que ocurre para hacer o dejar de hacer alguna cosa en comparación de otra''.<ref name="drae" />
==== {{conjunción|es|copulativo}} ====
;13: {{plm|y}}.
{{uso|en correlación con {{l+|es|como}} ([[tanto… como]])}}
==== {{pronombre indefinido|es}} ====
{{es.adj|neutro=tanto}}
;14: Tantas cosas.
==== Locuciones ====
{{trad-arriba|Locuciones con «tanto»}}
* [[tanto de ello]]: mod. adv. mucho, abundante y sin limitación o tasa de alguna cosa que hay o se da.<ref name="drae" />
* [[tanto es lo de más como lo de menos]]: expresión que da a entender que se debe huir de los extremos.<ref name="drae" />
* [[tanto más cuanto]]: mod. adv. que se usa en las compras y ventas para ajustar o convenir en el precio o estimación de alguna cosa.<ref name="drae" /> Locución para indicar que se está exagerando en alguna descripción, por ejemplo en las exigencias respecto de algo.
* [[tanto monta]]: se significa que una cosa es equivalente a otra.<ref name="drae" /> Proviene del lema del pacto entre los Reyes Católicos, "tanto monta / monta tanto", por el que ambos se otorgaban mutuamente la delegación para ejercer su potestad regia en todos los territorios de cada uno, a pesar de que la legislación castellana y todos sus territorios conquistados y anexionados establecía que las mujeres podían reinar, excluyendo tal derecho a su consorte, y la aragonesa y sus territorios conquistados y anexionados (condados catalanes y reinos de Valencia y Baleares) negaban tal derecho a las mujeres, excluyéndolas del Gobierno de tales territorios.
* [[tanto por tanto]]: mod. adv. que se usa comparativamente, y vale por el mismo precio o coste.<ref name="drae" /> Dar una cosa a cambio de otra. También en sentido vengativo o justiciero, para exigir compensación por los daños causados.
* [[tanto cuanto]]: algún tanto.<ref name="drae" /> Así como.
* [[tanto que]]: luego que.<ref name="drae" /> Tan grande o tantas veces que, para indicar la causa de alguna consecuencia, generalmente negativa.
* [[tantos a tantos]]: expr. con que se demuestra la igualdad de número dentro de una especie.<ref name="drae" /> Generalmente es una comparación cuantitativa, aunque inespecífica, especialmente para dar a entender un gran número. Por ejemplo: mucha gente a muchas otras.
* [[algún tanto]]: que vale algo o un poco.<ref name="drae" /> Generalmente para indicar que se ha conseguido alguna puntuación, algo positivo.
* [[al tanto]]: mod. adv. por el mismo precio, coste o trabajo; y se usa cuando se explica la voluntad de uno de tomar o lograr alguna cosa al precio que a otro le ha costado.<ref name="drae" /> También puede utilizarse para expresar la venta al contado, a granel, por pequeñas partidas, diferenciando precios. Estar sobre aviso respecto de algo que pudiese ocurrir. Esperar a que ocurra algo previsto. Remuneración proporcional a la puntuación obtenida.
* [[con tanto que]]: con tal de que.<ref name="drae" /> En tal cantidad, tantas veces, que.
* [[en su tanto]]: mod. adv. guardada proporción, proporctonalmente.<ref name="drae" /> A su favor.
* [[en tanto]] o [[entre tanto]]: mod. adv. mientras, ínterín o durante algún tiempo intermedio.<ref name="drae" />
* [[ni tanto ni tan poco]]: expresión con que se contiene en una ponderación al que excede en ella por ambos extremos.<ref name="drae" /> Equivalente a "ni tanto ni tan calvo".
* [[no me hagas tanto]]: expresión con que se amenaza al que persiste en hacer alguna cosa que molesta.<ref name="drae" />
* [[por el tanto]]: mod. adv. al tanto; se usa en lo material de las compras, ventas u otras semejantes enajenaciones.<ref name="drae" />
* [[por el tanto]]: mod. adv. por la misma razón, causa o motivo.<ref name="drae" />
* [[por tanto]]: expresión con que se concluyen los escritos o pedimentos, y significa, atento a lo referido, por las razones expresadas, y por todo lo demás que se funda y representa.<ref name="drae" /> En consecuencia.
* [[por tantos y cuantos]]: (expresión familiar) especie de juramento con que se asegura y pondera alguna cosa.<ref name="drae" /> Más utilizada en singular: "por tanto y cuanto". Es una especie de moga del leguaje leguleyo.
{{trad-abajo}}
==== Véase también ====
* [[tantos]]
==== Traducciones ====
{{trad-arriba}}
{{t|ast|t1=tanto}}
{{t|de|t1=ebenso|t2=ebenso sehr}}
{{t|osp|t1=tanto}}
{{t|ca|t1=tant}}
{{t|fr|t1=autant|t2=tant}}
{{t|fro|t1=tant}}
{{t|frm|t1=tant}}
{{t|fur|t1=tant}}
{{t|roa-opt|t1=tanto}}
{{t|en|t1=so much}}
{{t|it|t1=tanto}}
{{t|roa-oit|t1=tanto}}
{{t|nrf|t1=tant}}
{{t|pt|t1=tanto}}
{{t|ro|t1=atât|t2=atâta|t3=atît|t4=atîta}}
{{trad-abajo}}
== {{lengua|ast}} ==
{{pron-graf|leng=ast}}
=== Etimología 1 ===
{{etimología|leng=ast|la|tantus|alt=tantum|tanto}}.
==== {{adverbio de cantidad|ast}} ====
;1: {{plm}}.<ref name=dala>{{DALLA}}</ref>
== {{lengua|osp}} ==
{{pron-graf|leng=osp}}
=== Etimología 1 ===
{{etimología|leng=osp|la|tantus|alt=tantum|tanto}}.
==== {{adjetivo|osp}} ====
;1: {{plm}}.
==== {{adverbio de cantidad|osp}} ====
;2: {{plm}}.
== {{lengua|fr}} ==
{{pron-graf|leng=fr|h1=tantos}}
=== Etimología 1 ===
{{etimología|leng=fr|ja|短刀|tr=tantō}}.
==== {{sustantivo masculino|fr}} ====
{{fr.sust}}
;1: {{grafía|leng=fr|tantō}}.
== {{lengua|roa-opt}} ==
{{pron-graf|leng=roa-opt}}
=== Etimología 1 ===
{{etimología|leng=roa-opt|la|tantus|alt=tantum|tanto}}.
==== {{adjetivo|roa-opt}} ====
;1: {{plm}}.
==== {{adverbio de cantidad|roa-opt}} ====
;2: {{plm}}.
== {{lengua|ia}} ==
{{pron-graf|leng=ia}}
=== Etimología 1 ===
{{etimología|leng=ia}}.
==== {{adverbio de cantidad|ia}} ====
;1: {{plm|tal}}.
== {{lengua|it}} ==
{{pron-graf|leng=it|1audio1=It-tanto.ogg}}
=== Etimología 1 ===
{{etimología|leng=it|roa-oit|tanto|tanto}}, y este {{etim|leng=it|la|tantus}}.
==== {{adjetivo|it}} ====
{{it.adj}}
;1: {{plm}}.<ref name=trec>{{Treccani}}</ref>
==== {{adverbio de cantidad|it}} ====
;2: {{plm}}.<ref name=trec />
==== {{conjunción|it}} ====
;3: {{plm|al final}} o {{l|es|después de todo}}.<ref name=trec />
==== Locuciones ====
{{trad-arriba|locuciones}}
* {{l|it|di tanto in tanto}}
* {{l|it|ogni tanto}}
{{trad-abajo}}
== {{lengua|roa-oit}} ==
{{pron-graf|leng=roa-oit}}
=== Etimología 1 ===
{{etimología|leng=roa-oit|la|tantus|alt=tantum|tanto}}.
==== {{adjetivo|roa-oit}} ====
;1: {{plm}}.
==== {{adverbio de cantidad|roa-oit}} ====
;2: {{plm}}.
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda1=tantō}}
=== Forma flexiva ===
==== Forma adjetiva ====
;1: {{forma adjetivo|leng=la|tantus|dativo|singular|masculino}}.
;2: {{forma adjetivo|leng=la|tantus|dativo|singular|neutro}}.
;3: {{forma adjetivo|leng=la|tantus|ablativo|singular|masculino}}.
;4: {{forma adjetivo|leng=la|tantus|ablativo|singular|neutro}}.
== {{lengua|pt}} ==
{{pron-graf|leng=pt}}
=== Etimología 1 ===
{{etimología|leng=pt|roa-opt|tanto|tanto}}, y este {{etim|leng=pt|la|tantus}}.
==== {{adjetivo|pt}} ====
{{pt.adj}}
;1: {{plm|tanto}}.<ref name=au>{{Aulete}}</ref>
{{ejemplo|Ele perdeu '''tanto''' sangue que morreu.}}
{{ejemplo|Eu leio '''tantos''' livros.}}
==== {{adverbio de cantidad|pt}} ====
;2: {{plm|tanto}}.
{{relacionado|leng=pt|tão}}.
{{ejemplo|Corri '''tanto'''.}}
==== {{sustantivo masculino|pt}} ====
{{pt.sust}}
;3: {{plm|tanto}}.
{{ejemplo|Comi um '''tanto''' de torta enquanto a mercadoria foi entregue em dois '''tantos'''.}}
==== Descendientes ====
{{trad-arriba|descendientes}}
{{d|kea|d1=tántu}}
{{d|idb|d1=tanto}}
{{d|mzs|d1=tanto}}
{{d|mcm|d1=tantu}}
{{trad-abajo}}
==== Locuciones ====
{{trad-arriba|locuciones}}
* {{l|pt|e tanto}}
* {{l|pt|tanto assim que}}
* {{l|pt|tanto mais quanto}}
* {{l|pt|tanto melhor}}
* {{l|pt|tanto quanto}}
* {{l|pt|tanto que}}
* {{l|pt|um tanto}}
* {{l|pt|um tanto ou quanto}}
{{trad-abajo}}
==== Información adicional ====
{{derivad|leng=pt|portanto}}
== Referencias y notas ==
<references />
58xi0aqqdjuu6tkdb9o4q0q56m4hxhr
cuánto
0
111407
6307359
5933172
2026-08-06T00:37:55Z
TMCbot
164594
.
6307359
wikitext
text/x-wiki
{{desambiguación|cuanto}}
== {{lengua|es}} ==
{{pron-graf|v=cuán|h1=cuanto}}
=== Etimología 1 ===
{{etimología|la|quantus}}.
==== {{adjetivo interrogativo|es}} ====
{{es.adj}}
;1: Qué número de o qué cantidad de.
{{ejemplo|¿A cuántas revistas estás suscrito?}}
{{ejemplo|Me pregunto cuánto tiempo se tardará en llegar.}}
==== {{adjetivo|es|exclamativo}} ====
{{es.adj}}
;2: Qué cantidad de o qué número de.
{{ejemplo|¡Cuánto tiempo sin verte!}}
{{ejemplo|¡No te imaginas cuántos libros tiene!}}
==== {{pronombre interrogativo|es}} ====
{{es.adj|neutro=cuánto}}
;3: Qué número o qué cantidad.; referido a un sintagma nominal mencionado o sobrentendido, o bien para aludir a uno pospuesto e introducido por la preposición {{l+|es|de}}
{{ejemplo|Yo me encargo de la bebida, pero no sé cuánta comprar.}}
{{ejemplo|¿Cuántas de las novelas te has leído ya?}}
{{uso|.}}
;4: (en el masculino plural [[cuántos]]) Qué número o cantidad de personas; sin referencia a un sintagma nominal mencionado o sobrentendido.
{{ejemplo|¿Cuántos le votarán?}}
;5: (en el neutro) Qué número o cantidad de cosas.
{{ejemplo|¿Cuánto quieres?}}
{{ejemplo|No sabemos a cuánto ascenderá la suma.}}
==== {{pronombre|es|exclamativo}} ====
;6: Qué cantidad o qué número.
{{ejemplo|¡A cuántos he oído antes esas palabras!}}
{{ejemplo|No sabes cuánto gasta.}}
==== {{adverbio interrogativo|es}} ====
;7: En qué grado, cantidad o intensidad.
{{ejemplo|¿Cuánto te gusta?}}
{{ejemplo|Me pregunto [[cuán]] grande sería.}}
;8: Cuánto tiempo.
{{ejemplo|¿Cuánto duerme ahora el niño?}}
;9: Usado para preguntar por la diferencia entre dos magnitudes que se comparan.
{{uso|antepuesto a grupos adjetivales o adverbiales comparativos.}}
{{ejemplo|No ha dicho cuánto más tarde piensa venir.}}
==== {{adverbio|es|exclamativo}} ====
;10: En qué cantidad, grado o medida.
{{ejemplo|¡Cuánto le gustaba aquella novela!}}
;11: Cuánto tiempo.
{{ejemplo|¡Cuánto hace que no nos vemos!}}
;12: Pondera el grado o la intensidad en la que se da una propiedad o cualidad. U. antepuesto a adjetivos y adverbios.
{{ejemplo|¡Cuán rápidamente caminan las malas nuevas!}}
==== Traducciones ====
{{trad-arriba}}
{{t|sl|a1=1|t1=koliko}}
{{t|fr|a1=1|t1=combien}}
{{t|en|a1=1|t1=how much|nota1=para incontables|t2=how many|nota2=para contables}}
{{t|it|a1=1|t1=quanto|g1=m}}
{{t|mn|t1=хэд}}
{{trad-abajo}}
== Referencias y notas ==
<references />
f82n2jgr1qijpqpdpntmzlxuv5iafi9
valgo
0
116134
6307393
5952724
2026-08-06T01:32:18Z
Tmagc
158167
6307393
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|valgus}}.
==== {{adjetivo|es}} ====
{{es.adj}}
;1 {{csem|medicina}}: Dicho especialmente del pie: deformado anormalmente hacia afuera por una malformación congénita.<ref>{{DLE}}</ref>
=== Forma flexiva ===
==== Forma verbal ====
;1: {{forma verbo|valer|1s|pres|ind}}.
== Referencias y notas ==
<references />
9apv7xpfncrcerynsmmjn88jgxdjpww
amén
0
117887
6307422
6291355
2026-08-06T04:49:49Z
Tmagc
158167
/* Véase también */
6307422
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la-lat|amen}}, y este {{etim|grc|ἀμήν|tr=amén}}, {{etim|he|אמן|אָמֵן|tr=āmēn|glosa=verdaderamente}}.<ref>{{DRAE2001}}</ref> Compárese el francés {{l+|fr|amen}} o el portugués {{l+|pt|amém}}.
==== {{interjección|es}} ====
;1: {{impropia|Úsase para manifestar deseo de que algo suceda}}.<ref name="dlc1914">{{DLC1914|62}}</ref>
{{uso|utcs}}
{{sinónimo|así sea}}
{{ejemplo|Mas Tú nos libra de mal,<br>''amén''.|c=libro|t=Cancionero general de Hernando del Castillo|a=Cancionero|f=1882|p=219}}
{{ejemplo|Esto dirá Simón, y yo en la misa de mañana diré lo mismo a Dios y a la Virgen para que se enteren de lo que aquí está pasando... Isabel, ponte en guardia, que si tus ''amenes'' llegan al Cielo, los míos también.|c=libro|t=La de los tristes destinos|a=Benito Pérez Galdós|f=1907|p=18}}
;2: {{impropia|Úsase para manifestar aprobación o conformidad con lo dicho por otro}}<ref name="dlc1914" />.
{{uso|utcs}}
{{sinónimo|de acuerdo|punto en boca|punto final}}
{{ejemplo|el conyugal recato<br>Es meritorio; mas segun en quiénes.<br>Lo aplaudo en las hermosas que al conato<br>De ninfo audaz responden con desdenes;<br>No en la fea sin sal ni garabato,<br>Que tal vez fuera pródiga de ''amenes''<br>Si valiese la pena de que un cuco<br>Se atreviese á decirle: ‘Envido y truco’.|c=libro|t=Obras de don Manuel Breton de los Herreros|a=Manuel Bretón de los Herreros|a2=Juan Eugenio Hartzenbusch|f=1883|p=483}}
{{ejemplo|En conjunto, mi juicio se resume en una palabra: ''amén''. Me siento absolutamente compenetrado con tus puntos de vista.|c=libro|t=Correspondencia (1923-1951)|a=Pedro Salinas|a2=Jorge Guillén|f=1992|p=227}}
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;3: {{plm|extremo}} [[posterior]] de algo, en sentido [[temporal]] o [[espacial]].
{{sinónimo|fin|final|remate|término}}
{{ejemplo|Los héroes marciales de la revolución española no mudaron de grito hasta los últimos ''amenes''.|c=libro|t=La corte de los milagros|a=Ramón del Valle-Inclán|f=1930|oclc=432758873|p=51}}
==== Locuciones ====
{{trad-arriba|Locuciones con «amén»}}
* {{l|es|sacristán de amén}}
* {{l|es|voto de amén}}
* {{l|es|decir amén}}: aceptar, consentir algo, asentir.
* {{l|es|decir amén a todo}}
* {{l|es|en un decir amén}}
* {{l|es|en un amén}}
* {{l|es|llegar a los amenes}}
* {{l|es|llevar el amén}}
{{trad-abajo}}
==== Refranes ====
* {{l|es|muchos amenes al cielo llegan}}
==== Véase también ====
* [[amén de]]
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|a1=1|t1=Amen}}
{{t|ar|a1=1|t1=آمين}}
{{t|tmr|a1=1|t1=אמין}}
{{t|hy|a1=1|t1=ամեն}}
{{t|bg|a1=1|t1=амин}}
{{t|cs|a1=1|t1=amen}}
{{t|ko|a1=1|t1=아멘}}
{{t|sl|a1=1|t1=amen}}
{{t|et|a1=1|t1=aamen}}
{{t|fi|a1=1|t1=aamen}}
{{t|fr|a1=1|t1=amen}}
{{t|gd|a1=1|t1=amen}}
{{t|el|a1=1|t1=αμήν}}
{{t|grc|a1=1|t1=ἀμήν}}
{{t|he|a1=1|t1=אמן}}
{{t|hu|a1=1|t1=ámen}}
{{t|en|a1=1|t1=amen}}
{{t|it|a1=1|t1=amen}}
{{t|ja|a1=1|t1=アーメン}}
{{t|cmn|a1=1|t1=阿門|t2=阿门}}
{{t|nv|a1=1|t1=tʼáá ákótʼée doo}}
{{t|nl|a1=1|t1=amen}}
{{t|nb|a1=1|t1=amen}}
{{t|fa|a1=1|t1=آمین}}
{{t|pl|a1=1|t1=amen}}
{{t|pt|a1=1|t1=amém}}
{{t|ru|a1=1|t1=аминь}}
{{t|syc|a1=1|t1=ܐܡܝܢ}}
{{t|tr|a1=1|t1=amin}}
{{t|vep|a1=1|t1=amin'}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología|endo|a menos}}, {{etim|compuesta|a|menos}}.
==== {{preposición|es}} ====
;1: [[añadir|Añadido]] a lo precedente.
{{uso|se usa solamente en {{l+|es|amén de}}}}
{{sinónimo|además|así como}}
{{ejemplo|Esquivé, otro sí, el pleonasmo del no aprobado, por no reincidir en el ridículo paso del célebre academista Bárgas-Ponce; el cual, imprimiendo una memoria que escribió para la concurrencia a los premios académicos de 1791, la anunció con la nota de presentada y nó premiada: con que manifestó, ''amén'' de su poquedad, su pueril resentimento.|a=Bartolomé José Gallardo|f=1928|fo=1841|t=Alocución a los electores de diputados por la provincia de Madrid|l=Madrid|editorial=Blass|c=libro}}
{{ejemplo|La habitación alta está dividida en sendos compartimentos, adornados cada uno con su tablado de cama verde, jergón de paja, sábanas choriceras y manta segoviana; su mesilla de pino, con un jarro candil y una estampa del Dos de Mayo o del Juicio final, pegada con miga de pan en el comedio de la pared; ''amén'' de los diversos adornos que alternativamente aparecen y desaparecen.|c=libro|t=Escenas y tipos matritenses|a=Ramón de Mesonero Romanos|f=2020-08-20|editorial=Editorial Verbum|isbn=9788413373065|p=420}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
sk1tc3640ubfme9zigxukn4hyaegamq
6307423
6307422
2026-08-06T04:50:00Z
Tmagc
158167
/* Etimología 2 */ locuión
6307423
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la-lat|amen}}, y este {{etim|grc|ἀμήν|tr=amén}}, {{etim|he|אמן|אָמֵן|tr=āmēn|glosa=verdaderamente}}.<ref>{{DRAE2001}}</ref> Compárese el francés {{l+|fr|amen}} o el portugués {{l+|pt|amém}}.
==== {{interjección|es}} ====
;1: {{impropia|Úsase para manifestar deseo de que algo suceda}}.<ref name="dlc1914">{{DLC1914|62}}</ref>
{{uso|utcs}}
{{sinónimo|así sea}}
{{ejemplo|Mas Tú nos libra de mal,<br>''amén''.|c=libro|t=Cancionero general de Hernando del Castillo|a=Cancionero|f=1882|p=219}}
{{ejemplo|Esto dirá Simón, y yo en la misa de mañana diré lo mismo a Dios y a la Virgen para que se enteren de lo que aquí está pasando... Isabel, ponte en guardia, que si tus ''amenes'' llegan al Cielo, los míos también.|c=libro|t=La de los tristes destinos|a=Benito Pérez Galdós|f=1907|p=18}}
;2: {{impropia|Úsase para manifestar aprobación o conformidad con lo dicho por otro}}<ref name="dlc1914" />.
{{uso|utcs}}
{{sinónimo|de acuerdo|punto en boca|punto final}}
{{ejemplo|el conyugal recato<br>Es meritorio; mas segun en quiénes.<br>Lo aplaudo en las hermosas que al conato<br>De ninfo audaz responden con desdenes;<br>No en la fea sin sal ni garabato,<br>Que tal vez fuera pródiga de ''amenes''<br>Si valiese la pena de que un cuco<br>Se atreviese á decirle: ‘Envido y truco’.|c=libro|t=Obras de don Manuel Breton de los Herreros|a=Manuel Bretón de los Herreros|a2=Juan Eugenio Hartzenbusch|f=1883|p=483}}
{{ejemplo|En conjunto, mi juicio se resume en una palabra: ''amén''. Me siento absolutamente compenetrado con tus puntos de vista.|c=libro|t=Correspondencia (1923-1951)|a=Pedro Salinas|a2=Jorge Guillén|f=1992|p=227}}
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;3: {{plm|extremo}} [[posterior]] de algo, en sentido [[temporal]] o [[espacial]].
{{sinónimo|fin|final|remate|término}}
{{ejemplo|Los héroes marciales de la revolución española no mudaron de grito hasta los últimos ''amenes''.|c=libro|t=La corte de los milagros|a=Ramón del Valle-Inclán|f=1930|oclc=432758873|p=51}}
==== Locuciones ====
{{trad-arriba|Locuciones con «amén»}}
* {{l|es|sacristán de amén}}
* {{l|es|voto de amén}}
* {{l|es|decir amén}}: aceptar, consentir algo, asentir.
* {{l|es|decir amén a todo}}
* {{l|es|en un decir amén}}
* {{l|es|en un amén}}
* {{l|es|llegar a los amenes}}
* {{l|es|llevar el amén}}
{{trad-abajo}}
==== Refranes ====
* {{l|es|muchos amenes al cielo llegan}}
==== Véase también ====
* [[amén de]]
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{t|de|a1=1|t1=Amen}}
{{t|ar|a1=1|t1=آمين}}
{{t|tmr|a1=1|t1=אמין}}
{{t|hy|a1=1|t1=ամեն}}
{{t|bg|a1=1|t1=амин}}
{{t|cs|a1=1|t1=amen}}
{{t|ko|a1=1|t1=아멘}}
{{t|sl|a1=1|t1=amen}}
{{t|et|a1=1|t1=aamen}}
{{t|fi|a1=1|t1=aamen}}
{{t|fr|a1=1|t1=amen}}
{{t|gd|a1=1|t1=amen}}
{{t|el|a1=1|t1=αμήν}}
{{t|grc|a1=1|t1=ἀμήν}}
{{t|he|a1=1|t1=אמן}}
{{t|hu|a1=1|t1=ámen}}
{{t|en|a1=1|t1=amen}}
{{t|it|a1=1|t1=amen}}
{{t|ja|a1=1|t1=アーメン}}
{{t|cmn|a1=1|t1=阿門|t2=阿门}}
{{t|nv|a1=1|t1=tʼáá ákótʼée doo}}
{{t|nl|a1=1|t1=amen}}
{{t|nb|a1=1|t1=amen}}
{{t|fa|a1=1|t1=آمین}}
{{t|pl|a1=1|t1=amen}}
{{t|pt|a1=1|t1=amém}}
{{t|ru|a1=1|t1=аминь}}
{{t|syc|a1=1|t1=ܐܡܝܢ}}
{{t|tr|a1=1|t1=amin}}
{{t|vep|a1=1|t1=amin'}}
{{trad-abajo}}
== Referencias y notas ==
<references />
kua8r9mrxeaa1xpk35z4ixlypufobv8
emperador
0
117917
6307363
6291770
2026-08-06T00:38:04Z
TMCbot
164594
.
6307363
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|imperator}}. Para el femenino irregular, {{etim|la|imperatrix}}.
==== {{sustantivo masculino y femenino|es}} ====
{{es.sust|irreg|p=emperadores|f=emperatriz|f2=emperadora[†]|fp=emperatrices|fp2=emperadoras[†]}}
;1: Soberano de un [[imperio]].
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;2: Título de dignidad dado al jefe supremo del antiguo [[imperio]] [[romano]], y que no era sino el que se confería por aclamación del ejército o decreto del Senado al que conseguía importante victoria.<ref name="dlc1914">{{DLC1914|401}}</ref>
;3: Título de dignidad de ciertos [[soberano]]s.<ref name="dlc1914" />
;4 {{csem|peces}}: {{plm|pez espada}}.
{{sinónimo|pez emperador}}
==== Locuciones ====
* {{l|es|síndrome del emperador}}: comportamiento de un niño que domina a los padres a su antojo.
==== Información adicional ====
{{derivad|imperio|imperar|antiimperialismo|antiimperialista|emperador|emperatriz|emprar|imperador|imperante|imperativo|imperativamente|imperatorio|imperial|imperialismo|imperialista|imperioso|imperiosamente}}
==== Véase también ====
{{w}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|nci}} ==
{{pron-graf|leng=nci}}
=== Etimología ===
{{etimología|leng=nci}}
=== {{adjetivo|nci}} ===
;1 {{csem|política|leng=nci}}: {{plm|emprador}}.
== Referencias y notas ==
<references />
00vlvmpvwdq8smyhqmqyd0nylno1h3r
auxiliarse
0
122659
6307352
6288793
2026-08-06T00:37:42Z
TMCbot
164594
.
6307352
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|auxiliare}}
=== {{verbo pronominal|es}} ===
;1: Darse [[auxilio]], [[proteger]]se, [[amparar]]se.<ref name="novísimo">{{Labernia1866}} Pág. 359</ref>
{{uso|utct}}
;2: {{plm|colaborar}} mutuamente, [[trabajar]] en ayuda mutua.<ref name="novísimo" />
{{uso|utct}}
;3: {{plm|ayudar}} a bien [[morir]].<ref name="novísimo" />
{{uso|utct}}
=== Conjugación ===
{{es.v|paradigma1=anunciar|paradigma2=enviar|nota=Según [https://www.rae.es/dpd/auxiliar el DPD] la conjugación bajo el modelo de ''enviar'' es un arcaísmo y solamente son aceptables las formas con diptongo para este verbo.}}
=== Véase también ===
* [[auxiliar]]
=== Traducciones ===
{{trad-arriba}}
{{t|ca|a1=1,3|t1=auxiliarse|a2=3|t2=ajudar á bé morir}}
{{trad-abajo}}
== Referencias y notas ==
<references />
opqs6nmsrruqh592xd0j0f7sxrn036o
competer
0
124424
6307356
5947337
2026-08-06T00:37:51Z
TMCbot
164594
.
6307356
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la-lat|competere|alt=competĕre|glosa=concordar, corresponder}},<ref name="d25">{{DLE1925}}</ref> y más antiguamente '[[aspirar]]', de ''[[cum#Latín|cum]]'' y ''[[petere]]'', '[[intentar]]'.
==== {{verbo intransitivo|es}} ====
;1: {{plm|pertenecer}}, [[tocar]] o [[incumbir]] a uno alguna cosa.<ref name="d25"/>
{{sinónimos|concernir|atañer|pertenecer|tocar|incumbir}}
;2: {{variante obsoleta|competir}}.<ref name="d25"/>
==== Conjugación ====
{{es.v|nota=NOTA: usado como terciopersonal en la primera acepción}}
==== Véase también ====
* [[competencia]]
* [[competente]]
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
gv9e5yb59a0hr53g0zd5fn0uacjcuto
bloquear
0
137927
6307427
5808117
2026-08-06T05:16:09Z
~2026-43135-80
183854
6307427
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-Marreromarco-bloquear.wav|aunota=Venezuela}}
=== {{verbo transitivo|es}} ===
;1: Impedir el tránsito, cerrar el paso.
{{sinónimo|cerrar|detener|interceptar|obstruir|tapar}}
;2: Impedir que algo funcione correctamente.
{{sinónimo|entorpecer|estorbar|impedir}}
;3 {{csem|informática}}: Impedir o negar el acceso a un portal web o a algún perfil en redes sociales.
=== Conjugación ===
{{es.v}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|t1=blockieren}}
{{t|en|a1=1-2|nl1=s|t1=to|t2=block}}
{{t|it|a1=1-2|t1=bloccare}}
{{trad-abajo}}
== Referencias y notas ==
<references />
68ygm5e64g8mmvm83g6pasdo2coctze
6307428
6307427
2026-08-06T05:16:34Z
~2026-43135-80
183854
6307428
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-Marreromarco-bloquear.wav|aunota=Venezuela}}
=== {{verbo transitivo|es}} ===
;1: Impedir el tránsito, cerrar el paso.
{{sinónimo|cerrar|detener|interceptar|obstruir|tapar}}
;2: Impedir que algo funcione correctamente.
{{sinónimo|entorpecer|estorbar|impedir}}
;3 {{csem|informática}}: Impedir o negar el acceso a un portal web o a algún perfil en redes sociales.
=== Conjugación ===
{{es.v}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|t1=blockieren}}
{{t|en|a1=1-2|nl1=s|t1=to|t2=block}}
{{t|it|a1=1-2|t1=bloccare}}
{{trad-abajo}}
3girbwvny18gpdndpjz7gu77aaotalu
6307429
6307428
2026-08-06T05:16:53Z
~2026-43135-80
183854
Página blanqueada
6307429
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
6307430
6307429
2026-08-06T05:39:02Z
Tmagc
158167
Revertidos los cambios de [[Special:Contributions/~2026-43135-80|~2026-43135-80]] ([[User talk:~2026-43135-80|disc.]]) a la última edición de [[User:TMCbot|TMCbot]]
5808117
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|audio=LL-Q1321 (spa)-Marreromarco-bloquear.wav|aunota=Venezuela}}
=== Etimología ===
{{etimología|fr|bloquer}}
=== {{verbo transitivo|es}} ===
;1: Impedir el tránsito, cerrar el paso.
{{sinónimo|cerrar|detener|interceptar|obstruir|tapar}}
;2: Impedir que algo funcione correctamente.
{{sinónimo|entorpecer|estorbar|impedir}}
;3 {{csem|informática}}: Impedir o negar el acceso a un portal web o a algún perfil en redes sociales.
=== Conjugación ===
{{es.v}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|t1=blockieren}}
{{t|en|a1=1-2|nl1=s|t1=to|t2=block}}
{{t|it|a1=1-2|t1=bloccare}}
{{trad-abajo}}
== Referencias y notas ==
<references />
6m40vz0l45sc14esoguza19lfkkysms
menú
0
155694
6307368
6021458
2026-08-06T00:38:19Z
TMCbot
164594
.
6307368
wikitext
text/x-wiki
{{desambiguación|menu|Menu}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|fr|menu|menudo}}, a su vez {{etim|la|minutus}} ("[[pequeño]]", "[[menudo]]").
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1: {{plm|colección}} de [[alimento]]s que se incluyen en una [[comida]].
;2: {{plm|lista}} de los [[plato]]s y [[bebida]]s que se ofrecen en un restaurante.
{{sinónimo|carta}}
;3: Comida o [[conjunto]] de platos del día disponibles en un restaurante, por un precio fijo, dentro de una [[oferta]] y [[horario]] limitados.
;4: Por extensión, lista de [[opción|opciones]] disponibles en cualquier campo o circunstancia.
;5 {{csem|informática}}: Lista de [[opción|opciones]] o [[comando]]s dentro de un [[programa]] o una página de [[Internet]], generalmente con una [[interfaz]] gráfica específica.
=== Véase también ===
{{w|objeto=varios artículos}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|a1=1,5|t1=Menü|g1=n|a2=2|t2=Speisekarte|g2=f}}
{{t|ast|a1=1|t1=menú}}
{{t|ca|a1=1,2,5|t1=menú}}
{{t|da|a1=1,2,5|t1=menu}}
{{t|eo|a1=1,2,5|t1=menuo}}
{{t|fr|a1=1,2,5|t1=menu|g1=m|a2=2|t2=carte|g2=f|a3=3|t3=table d’hôte|g3=f}}
{{t|en|a1=1,2,4,5|t1=menu|a2=3|t2=prix fixe}}
{{t|pt|a1=1,2,4,5|t1=menu|g1=m|a2=2|t2=cardápio|g2=m}}
{{t|ru|a1=1,2,4|t1=меню|g1=n}}
{{trad-abajo}}
== Referencias y notas ==
<references />
os3vx4q5v7am5u98xnmajj8gh2vpni7
censurar
0
157795
6307306
5808025
2026-08-05T19:57:04Z
Genoskill
87116
acepción modificada.
6307306
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología}}.
=== {{verbo transitivo|es}} ===
;1: Formar juicio de una obra u otra cosa.<ref name="drae1925">{{DLE1925}}</ref>
;2: {{plm|reprobar}} o notar por mala alguna cosa, casi siempre con base en la [[moral]], con la intención de [[evitar]] que una acción [[continuar|continúe]].<ref name="drae1925" />
{{relacionado|criticar|objetar}}
;3: {{plm|murmurar}}, [[vituperar]].<ref name="drae1925" />
;4: Remover, y a veces alterar, partes de una [[obra]] o material de comunicación –comúnmente público o intelectual–, por motivos morales o debido a principios determinados por una autoridad o gobierno.
{{uso}} con frecuencia se aplica a películas, libros y medios masivos de comunicación
{{relacionado|expurgar|objetar|prohibir}}
=== Conjugación ===
{{es.v}}
=== Véase también ===
* [[censor]]
* [[censura]]
=== Traducciones ===
{{trad-arriba}}
{{t|fr|a1=1,2|t1=censurer}}
{{t|en|a1=1,2|t1=censor}}
{{trad-abajo}}
== Referencias y notas ==
<references />
kfhndzgv786ee7oemhblwt9mfnw4nfa
skinhead
0
159057
6307315
5861396
2026-08-05T23:34:23Z
Tmagc
158167
6307315
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|ayuda=eskínjed}}
[[Archivo:Skinheads and tattoo.jpg|thumb|[1] un grupo de ''skinheads'']]
=== Etimología ===
{{etimología|en|skinhead}} (literalmente "[[cabeza]] [[rapado|rapada]]"). {{préstamo}}
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1 {{csem|sociología}}: {{plm|miembro}} de una [[subcultura]] nacida en el [[Reino Unido]] en los [[año]]s [[sesenta]] caracterizado principalmente por llevar la [[cabeza]] rapada y por su [[culto]] al [[coraje]] y a la [[violencia]].
{{uso|utca}}
{{sinónimo|cabeza rapada|rapado|skin|nota3=coloquial}}
=== Véase también ===
{{w}}
* [[skingirl]]
* [[SHARP]]
* [[RASH]]
=== Traducciones ===
{{trad-arriba}}
{{trad-abajo}}
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈskɪnhɛd}}
=== Etimología ===
{{etimología|leng=en|compuesto|skin|head}}
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: Persona con la cabeza [[afeitar|afeitada]] o [[rapado|rapada]].
;2: Miembro de la [[subcultura]] {{l*|es|skinhead}}.
=== Véase también ===
{{W|leng=en}}
== Referencias y notas ==
<references />
8mh3oadiai11e5gfebfg22ulty60yv6
utor
0
164601
6307419
6290824
2026-08-06T02:55:48Z
TMCbot
164594
.
6307419
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=ūtor}}
=== Etimología ===
{{etimología|leng=la|itc-pro|*oit-}}e/o-, y este del protoindoeuropeo {{l+|ine-pro|*h₃eit-|glosa=llevar}}.<ref name=vaan>{{DeVaan|647-648}}</ref> Compárese el luvita cuneiforme {{l+|xlu|hizza(i)-}} ("[[ir]] a [[buscar]]") y el griego antiguo {{l+|grc|οἵσω|tr=ohísō}} ("[[traer]]").<ref name=vaan/>
=== {{verbo intransitivo|la}} ===
;1: {{plm|servirse}} de, [[usar]], [[utilizar]], [[emplear]].
{{uso|leng=la|con ablativo}}
;2: {{plm|tener}}, [[gozar]] de.
;3: {{plm|tratar}}, [[tener]] [[relación]] con.
=== Conjugación ===
{{la.v|3|ūtor|ūs|ūs}}
== Referencias y notas ==
<references />
h2tidjzphon2wb4zwjbdvo7gzc3xnsb
vermú
0
168007
6307379
6074043
2026-08-06T00:38:40Z
TMCbot
164594
.
6307379
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|fr|vermouth}} y este a su vez del alemán ''[[Wermut]]'' ("[[ajenjo]]")
[[Archivo:Martini 1.JPG|thumb|(1)]]
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1 {{csem|gastronomía}}: {{plm|licor}} compuesto de [[vino blanco]], [[ajenjo]] y otras [[sustancia]]s amargas y tónicas que se toma como [[aperitivo]].
{{sinónimo|aperitivo}}
;2 {{csem|teatro}}: {{plm|función}} de [[cine]] o [[teatro]] que se celebra por la tarde en un horario diferente al que siempre se desarrolla.
=== Véase también ===
{{W}}
=== Traducciones ===
{{trad-arriba}}
{{t|pl|a1=1|t1=wermut|g1=m|a2=2|t2=przedstawienie o wczesnej porze}}
{{trad-abajo}}
== Referencias y notas ==
<references />
rkztgerbsrcnpslf6zls3imxfz2lu6l
paciscor
0
171874
6307417
6033306
2026-08-06T02:55:03Z
TMCbot
164594
.
6307417
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|v1=pacisco|valt1=paciscō|vnota1=se usa solo transitivamente}}
=== Etimología ===
{{etimología|leng=la|sufijo|paco|alt=pacō, -ere|tr="[[llegar]] a un [[acuerdo]]"|sco|alt2=scō, -scere}}.
=== {{verbo|la|transitivo|intransitivo}} ===
;1: {{plm|pactar}}
;2: {{plm|llegar}} a un [[acuerdo]] [[negociar|negociando]].
;3: {{plm|aceptar}} una [[condición]], un [[compromiso]].
;4: {{plm|prometer}}.
;5: {{plm|comprometer}}se.
=== Conjugación ===
{{la.v|3|pacīscor|pact|pact}}
== Referencias y notas ==
<references />
kwyg0qptxomj4tgxre2g049jnccr0w7
patior
0
172343
6307418
6074456
2026-08-06T02:55:06Z
TMCbot
164594
.
6307418
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|v1=patio|valt1=patiō|vnota1=arcaica}}
=== Etimología ===
{{etimología|leng=la|incierta}}, más allá del protoitálico {{l+|itc-pro|*pat-i-}}.<ref name="vaan">{{DeVaan|450}}</ref> La comparación con el griego antiguo {{l+|grc|πῆμα|tr=pêma|glosa=sufrimiento}} es semánticamente tentadora, pero los cambios morfológicos no tendrían explicaciones claras. Otra alternativa sería una derivación de la raíz {{l+|ine-pro|*pet}} ("[[volar]]", "[[caer]]"), se reconstruiría ''*p(e)t-i-'' ("[[ocurrir]]", "[[pasar]] a" > "[[experimentar]]").<ref name="vaan" /> → {{l+|la|peto|petō}}
=== {{verbo transitivo|la}} ===
;1: {{plm|sufrir}}, [[ser]] [[víctima]] de.
{{uso|leng=la|dícese de emociones, castigos, operaciones, procesos, etc.}}.<ref name="ol">{{Oxf-lat}}</ref>
;2: {{plm|experimentar}}, [[vivir]].
{{uso|leng=la|dícese de emociones}}.<ref name="ol" />
;3: {{plm|someter}}se a, [[vivir]].
{{uso|leng=la|dícese de causas legales}}.<ref name="ol" />
;4: {{plm|tolerar}}, [[aguantar]] con [[indiferencia]].
{{uso|leng=la|dícese de gobiernos, soberanos, reglas, etc.}}<ref name="ol" />
;5: {{plm|soportar}}, [[llevar]] con [[paciencia]].
{{uso|leng=la|dícese de condiciones físicas, sometimientos, esclavitud, etc.}}<ref name="ol" />
;6: {{plm|consentir}}, [[aceptar]], [[estar]] [[contento]] con.<ref name="ol" />
;7: [[arreglar|Arreglárselas]].<ref name="ol" />
;8: {{plm|permitir}}, [[dejar]] [[ocurrir]] [[algo]] sin [[interferir]].<ref name="ol" />
;9: {{plm|permitir}}, [[admitir]].
{{uso|leng=la|dícese de cosas: una cosa permite otra, un texto admite una interpretación, etc.}}<ref name="ol" />
=== Información adicional ===
{{derivad|passio|passionalis|passivus|perpetior|perpessicius|perpessio|perpessor|patibilis|patiens|impatiens|impatienter|impatientia|patienter|patientia}}
=== Conjugación ===
{{la.v|3|patior|pass|pass}}
== Referencias y notas ==
<references />
93jar8y44rgkhgp5l3svgw5sq60z08o
fido
0
173242
6307411
6290564
2026-08-06T02:54:11Z
TMCbot
164594
.
6307411
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=fīdō}}
=== Etimología ===
{{etimología|leng=la|itc-pro|*feiþe-}} [verbo], {{l+|itc-pro|*feiþo-}} [adj.], y este del protoindoeuropeo {{l+|ine-pro|*bʰeidʰ-}}''e/o-'' ("[[confiar]]").<ref name="vaan">{{DeVaan|218-219}}</ref> Compárese el griego antiguo {{l+|grc|πείθομαι}} (peítʰomai "[[ser]] [[convencer|convencido]]", "[[obedecer]]"), el albanés {{l+|sq|bindem}} ("[[ser]] [[convencer|convencido]]", "[[creer]]"), el eslavo eclesiástico antiguo {{l+|cu|běda}} ("[[apuro]]", "[[necesidad]]"); tal vez también el germánico: el gótico {{l+|got|𐌱𐌴𐌹𐌳𐌰𐌽|tr=beidan|glosa=esperar}} y {{l+|got|𐌱𐌰𐌹𐌳𐌾𐌰𐌽|tr=baidjan|glosa=forzar}}, el inglés antiguo {{l+|ang|bœdan|glosa=demandar}} y el alemán antiguo {{l+|goh|beitten|glosa=demandar}}.<ref name="vaan" />
=== {{verbo intransitivo|la}} ===
;1: {{plm|confiar}} (en), [[tener]] [[confianza]] (en), [[contar]] con.
{{uso|leng=la|con ablativo o dativo}}.<ref name="ol">{{Oxf-lat}}</ref>
{{ejemplo|leng=la|sibi fidere|trad=tenerse confianza, ser seguro de sí mismo.}}
;2: {{plm|tener}} [[confianza]] (para).
{{uso|leng=la|con infinitivo}}.<ref name="ol" />
;3: {{plm|tener}} [[confianza]] (que).
{{uso|leng=la|con acusativo e infinitivo}}.<ref name="ol" />
=== Conjugación ===
{{la.v|3|semidepon=v|old_impf_futr=v|fīdō|fīs|fīs}}
=== Información adicional ===
{{derivad|confido|confidens|confidenter|confidentia|confidentiloquus|diffido|diffidens|diffidenter|diffidentia|subdiffido|fiducia|fiduciarius|fiducio|fidus|infidus|foedus|foederatus|confoedusti|fidusta|fidens|fidenter|fidentia|fides|fidelis|fidelitas|fideliter|infidelis|perfidelis|fidepromitto|fidepromissor|Fidius|perfidus|perfide|perfidia|perfidiosus|perfidiose}}
== Referencias y notas ==
<references />
eiypqciuflkl7wh0lnzkzh0um6dv69s
diffido
0
176894
6307408
6059936
2026-08-06T02:53:29Z
TMCbot
164594
.
6307408
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=diffīdō}}
=== Etimología ===
{{etimología|leng=la|prefijo|dis|fido|alt2=fīdō, -ere|glosa2=confiar}}.
=== {{verbo intransitivo|la}} ===
;1: No [[tener]] [[confianza]] (en que las cosas puedan salir bien), [[desesperar]].<ref name="ol">{{Oxf-lat}}</ref>
;2: {{plm|desconfiar}}, no [[tener]] [[confianza]] (en).
{{uso|leng=la|con dativo}}.<ref name="ol" />
;3: No [[tener]] [[confianza]] (que).
{{uso|leng=la|con infinitivo y acusativo}}.<ref name="ol" />
;4: No [[esperar]]se (que), no [[contar]] con (que).
{{uso|leng=la|con infinitivo}}.<ref name="ol" />
=== Conjugación ===
{{la.v|3|semidepon=v|diffīdō|diffīs|diffīs}}
== Referencias y notas ==
<references />
bfzf0zhqe4yf20wwi65e0c2lpleec79
ése
0
181292
6307380
6056635
2026-08-06T00:38:42Z
TMCbot
164594
.
6307380
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== {{pronombre|es|demostrativo|masculino}} ===
{{es.adj|irreg|ésos|ésa|ésas|neutro=éso}}
;1: {{grafía|ese}}
{{uso|Se emplea en modo facultativo y solamente cuando haya riesgo de confusión con el adjetivo homónimo. En tal caso, se indica explícitamente que se trata del pronombre.}}<ref>[https://www.rae.es/sites/default/files/2023-03/NdP_RAE_Nota%20informativa%20sobre%20la%20tilde%20en%20%C2%ABsolo%C2%BB.pdf], RAE - Nota informativa sobre la tilde en solo</ref>
=== Traducciones ===
{{trad-véase|1|ese|num=2}}
== Referencias y notas ==
<references />
cdltwrxxg5jj2011993tonhy50t4xe5
irascor
0
187178
6307414
6034168
2026-08-06T02:54:30Z
TMCbot
164594
.
6307414
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=īrāscor}}
=== Etimología ===
{{etimología|leng=la|regresiva|iratus|alt=īrātus|glosa=furioso}}, y este de {{l+|la|ira|īra|glosa=ira}}.<ref>{{DeVaan|308-309}}</ref>{{catafijo|sufijo|-sco|sin|la|fs=x}}
=== {{verbo intransitivo|la}} ===
;1: {{plm|sentir}} [[resentimiento]], [[estar]] [[enojado]].
{{uso|leng=la|seguido de dativo de persona}}.<ref name=ol>{{Oxf-lat}}</ref>
;2: {{plm|enojar}}se, [[dejar]]se [[llevar]] por la [[ira]].<ref name=ol/>
=== Conjugación ===
{{la.v|3|īrāscor|īrāt|īrāt}}
== Referencias y notas ==
<references />
laean4c7p8jeu6wtle4taz1glk4ceui
gradior
0
373877
6307413
6290591
2026-08-06T02:54:21Z
TMCbot
164594
.
6307413
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la}}
=== Etimología ===
{{etimología|leng=la|itc-pro|*grad-i-|alt=*grad-(e)i-}}, y este del protoindoeuropeo {{l+|ine-pro|*grd-i|*g⁽ʰ⁾rd⁽ʰ⁾-(e)i-}}.<ref name="vaan">{{DeVaan|268-269}}</ref> Compárese el irlandés antiguo {{l+|sga|ingreinn|glosa=perseguir}} y {{l+|sga|dogreinn|tr="[[perseguir]]", "[[conducir]]"}} y el galés medio {{l+|wlm|grynnyaw|tr="[[apretar]]", "[[empujar]]"}}.<ref name="vaan" />
=== {{verbo intransitivo|la}} ===
;1: {{plm|avanzar}}, [[caminar]], [[marchar]], [[andar]].
{{uso|leng=la|especialmente a pie y en contraste a otras maneras de trasladarse}}.<ref name="ol">{{Oxf-lat}}</ref>
=== Conjugación ===
{{la.v|3|gradior|gress|gress}}
=== Información adicional ===
{{derivad|aggredior|aggressio|aggressor|aggressura|aggressus|aggretus|congredior|congressio|congressus|degredior|digredior|digressio|digressus|egredior|egressio|egressus|egretus|gradibilis|gradilis|gradus|gradarius|gradatim|gradatio|gradatus|praegrado|grallae|grallator|grassor|grassatio|grassator|grassatura|gressio|gressus|ingredior|ingressio|ingressus|indugredior|praegredior|praegressio|praegressus|progredior|progressio|progressus|regredior|regressio|regressus|transgredior|transgressio|transgressus}}
== Referencias y notas ==
<references />
orr1l1ck2o3w4309o1zd9r1t5qcwsoh
abaldonareis
0
383922
6307297
6145028
2026-08-05T14:58:08Z
Jemily1
121719
desambiguación corregida
6307297
wikitext
text/x-wiki
{{desambiguación|abaldonaréis}}
== {{lengua|es}} ==
{{pron-graf}}
=== Forma verbal ===
;1: {{forma verbo|abaldonar|p=2p|t=futuro|m=subjuntivo}}.
== Referencias y notas ==
<references />
g9hl19jgkiukyxmj1a7sbbfl0lpwjsy
abaldonare
0
383925
6307294
6145027
2026-08-05T14:45:00Z
Jemily1
121719
desambiguación corregida
6307294
wikitext
text/x-wiki
{{desambiguación|abaldonaré}}
== {{lengua|es}} ==
{{pron-graf}}
=== Forma verbal ===
;1: {{forma verbo|abaldonar|p=1s|t=futuro|m=subjuntivo}}.
;2: {{forma verbo|abaldonar|p=3s|t=futuro|m=subjuntivo}}.
== Referencias y notas ==
<references />
kc7ycuoofi2z6tipugzlkb2bpd9axk2
abaldonáremos
0
383936
6307296
6145032
2026-08-05T14:55:20Z
Jemily1
121719
desambiguación corregida
6307296
wikitext
text/x-wiki
{{desambiguación|abaldonaremos}}
== {{lengua|es}} ==
{{pron-graf}}
=== Forma verbal ===
;1: {{forma verbo|abaldonar|p=1p|t=futuro|m=subjuntivo}}.
== Referencias y notas ==
<references />
molkqj3u94q6vpzpqozk1w0wpwxhqxs
abaldonares
0
383944
6307299
6145030
2026-08-05T16:16:18Z
Jemily1
121719
quito desambiguación
6307299
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Forma verbal ===
;1: {{forma verbo|abaldonar|p=2stv|t=futuro|m=subjuntivo}}.
== Referencias y notas ==
<references />
8tza6l9nar62fagzezs0204p8ynyvuo
abaldonaren
0
383951
6307300
6145029
2026-08-05T16:16:48Z
Jemily1
121719
quito desambiguación
6307300
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Forma verbal ===
;1: {{forma verbo|abaldonar|p=3p|t=futuro|m=subjuntivo}}.
== Referencias y notas ==
<references />
5osalokpaelvzuczizbyqdifunnmkzf
fricar
0
477422
6307399
5947240
2026-08-06T01:51:04Z
Tmagc
158167
6307399
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|v=fregar|v2=friccionar}}
=== Etimología ===
{{etimología|la|fricare|alt=fricāre}}.<ref name="drae" />
=== {{verbo transitivo|es}} ===
;1: {{variante rara|fregar}}.
{{sinónimo|confricar|coludir|estregar|frotar|ludir|refregar|restregar}}.<ref name="drae">{{DRAE2001}}</ref>
=== Conjugación ===
{{es.v}}
== Referencias y notas ==
<references />
s92bpfyl9f594tujv8x7urf1x064iku
6307400
6307399
2026-08-06T01:51:31Z
Tmagc
158167
6307400
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf|v1=friccionar}}
=== Etimología ===
{{etimología|la|fricare|alt=fricāre}}.<ref name="drae" />
=== {{verbo transitivo|es}} ===
;1: {{variante rara|friccionar}}.
{{sinónimo|confricar|coludir|estregar|frotar|ludir|refregar|restregar}}.<ref name="drae">{{DRAE2001}}</ref>
=== Conjugación ===
{{es.v}}
== Referencias y notas ==
<references />
as9ih4g7it1k0wq69vtz8xkf4u8athw
acclaim
0
572695
6307282
6294366
2026-08-05T13:35:01Z
Intolerable situation
130039
/* {{lengua|en}} */
6307282
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=əˈkleɪm|ls=2}}
=== Etimología ===
{{etimología|leng=en|la|acclamo|alt=acclāmō, acclāmāre}}, compuesto de {{l+|la|ad|glosa=hacia}} y {{l+|la|clamo|clāmō, clāmāre}} ("[[gritar]], [[clamar]]").
=== {{verbo transitivo|en}} ===
;1: {{plm|aclamar}}{{-sub|1-2}}.
=== Conjugación ===
{{en.v}}
== Referencias y notas ==
<references />
gq4rnre7wr9mkivb512vai5rs7yykup
promiscuar
0
873182
6307401
5812268
2026-08-06T01:54:30Z
Tmagc
158167
6307401
wikitext
text/x-wiki
{{desambiguación}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|sufijo|promiscuo|ar}}
=== {{verbo intransitivo|es}} ===
;1: Comer en días de cuaresma y otros en que la Iglesia lo prohibe, carne y pescado en una misma comida.<ref name="drae">{{DLE1925}}</ref>
;2: Participar indistintamente en cosas heterogéneas u opuestas, físicas o inmateriales.<ref name="drae" />
=== Conjugación ===
{{es.v}}
=== Traducciones ===
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
ssf28jf534j2uho0tvizvhopek9gq02
peñasquear
0
876813
6307291
5806819
2026-08-05T14:08:42Z
~2026-34597-22
183061
6307291
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|sufijo|peñasco|ar}}
=== {{verbo transitivo|es}} ===
;1: {{ucf|arrojar}} [[piedra]]s.<ref name="drae">{{DRAE2001}}</ref>
{{sinónimo|apedrear}}
{{ámbito|Chile}}
=== Conjugación ===
{{es.v}}
=== Traducciones ===
{{trad-arriba}}
<!--{{t+|de|?|}}-->
<!--{{t+|ar|?|}}-->
<!--{{t+|bg|?|}}-->
<!--{{t+|ca|?|}}-->
<!--{{t+|eo|?|}}-->
<!--{{t+|fr|?|}}-->
<!--{{t+|en|?|}}-->
<!--{{t+|it|?|}}-->
<!--{{t+|ja|?|}}-->
<!--{{t+|nl|?|}}-->
<!--{{t+|pl|?|}}-->
<!--{{t+|pt|?|}}-->
{{trad-abajo}}
== Referencias y notas ==
<references />
nh54s02ybamcy079nj6070k6t00n275
disfrazar
0
879663
6307402
5799701
2026-08-06T02:06:28Z
Tmagc
158167
6307402
wikitext
text/x-wiki
{{desambiguación}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|osp|desfrezar}}, {{etim|confijo|dis|freza|glosa2=rastro de un animal|ar}}, que propiamente significaría "quitar todos los rastros remanentes".
=== {{verbo transitivo|es}} ===
;1: Desfigurar la apariencia natural de algo o alguien para que no pueda ser reconocido.<ref name="drae">{{DRAE2001}}</ref>
{{uso|utcp}}
{{sinónimo|encubrir|enmascarar|transfigurar|camuflar|ocultar|disimular}}
{{antónimo|mostrar|exhibir}}
;2: Disimular o desfigurar con palabras y expresiones lo que uno siente.<ref name="drae" />
{{sinónimo|fingir|simular|aparentar|disimular}}
{{antónimo|desvelar}}
=== Conjugación ===
{{es.v}}
=== Véase también ===
{{w}}
* [[disfrazarse]]
=== Traducciones ===
{{trad-arriba}}
{{t|nl|i1=s|t1=parodiëren|t2=travesteren|t3=verkleden als|t4=vermommen}}
{{trad-abajo}}
== Referencias y notas ==
<references />
jy7kht09zamyp9hv66hxehlcd2ai8pk
6307403
6307402
2026-08-06T02:07:18Z
Tmagc
158167
/* Traducciones */
6307403
wikitext
text/x-wiki
{{desambiguación}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|osp|desfrezar}}, {{etim|confijo|dis|freza|glosa2=rastro de un animal|ar}}, que propiamente significaría "quitar todos los rastros remanentes".
=== {{verbo transitivo|es}} ===
;1: Desfigurar la apariencia natural de algo o alguien para que no pueda ser reconocido.<ref name="drae">{{DRAE2001}}</ref>
{{uso|utcp}}
{{sinónimo|encubrir|enmascarar|transfigurar|camuflar|ocultar|disimular}}
{{antónimo|mostrar|exhibir}}
;2: Disimular o desfigurar con palabras y expresiones lo que uno siente.<ref name="drae" />
{{sinónimo|fingir|simular|aparentar|disimular}}
{{antónimo|desvelar}}
=== Conjugación ===
{{es.v}}
=== Véase también ===
{{w}}
* [[disfrazarse]]
=== Traducciones ===
{{trad-arriba}}
{{t|nl|t1=travesteren|t2=verkleden|t3=vermommen}}
{{trad-abajo}}
== Referencias y notas ==
<references />
0ubs2nqq5abgmcbxblx53xfraxvhw61
frezar
0
879776
6307398
5802895
2026-08-06T01:49:58Z
Tmagc
158167
6307398
wikitext
text/x-wiki
{{desambiguación}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la-vul|*frictiāre}}, {{etim|la|fritcum}}, supino de {{l+|la|fricare|alt=fricāre}}. Doblete de {{l+|es|fricar}}, {{l+|es|fregar}}.
==== {{verbo transitivo|es}} ====
;1: Limpiar la porquería que queda como residuo en las colmenas.
==== {{verbo intransitivo|es}} ====
;2: Dicho de una colmena: ser limpiada por el colmenero.<ref name="drae" />
;3: Estregarse el pez contra el fondo del agua para [[desovar]].<ref name="drae" />
;4 {{csem|cinegética}}: Dicho de un animal: escarbar u hozar haciendo frezas u hoyos.<ref name="drae" />
;5: Dicho de un animal: arrojar o despedir el estiércol.
==== Conjugación ====
{{es.v}}
==== Información adicional ====
{{cognados|fricar|fregar}}
{{derivad|disfrazar}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
=== Etimología 2 ===
{{etimología}}.
==== {{verbo intransitivo|es}} ====
;1: Dicho de un gusano de seda: tronchar y comer las hojas tras haber despertado.<ref name="drae">{{DLE1925}}</ref>
==== Conjugación ====
{{es.v}}
=== Etimología 3 ===
{{etimología|fone|frisar}}.
==== {{verbo intransitivo|es}} ====
;1: {{variante obsoleta|frisar}} (acercarse).
==== Conjugación ====
{{es.v}}
== Referencias y notas ==
<references />
q42kitmhnrziwbvch08zbdj769l6pt8
disfrazarse
0
880026
6307404
5811493
2026-08-06T02:08:33Z
Tmagc
158167
6307404
wikitext
text/x-wiki
{{desambiguación}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|pronominal|disfrazar}}.
=== {{verbo pronominal|es}} ===
;1: Vestir un [[disfraz]].<ref name="drae">{{DRAE2001|disfrazar}}</ref>
=== Conjugación ===
{{es.v}}
=== Véase también ===
* [[disfrazar]]
=== Traducciones ===
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
puptmwyqm69w5nj09zvpy3mhphxaz2i
loquor
0
900723
6307416
6290624
2026-08-06T02:54:39Z
TMCbot
164594
.
6307416
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|pron=clásico|fone=ˈlɔ.kʷɔr}}
=== Etimología ===
{{etimología|leng=la|itc-pro|*(t)lokʷ-e/o-}}, y este del protoindoeuropeo {{l+|ine-pro|*tlokʷ-|glosa=hablar}}.<ref name="vaan">{{DeVaan|348-49}}</ref> Compárese el irlandés antiguo {{l+|sga|ad-tluchedar}} ("[[dar]] [[gracias]]") y {{l+|sga|do-tluchedar}} ("[[exigir]]"), el eslavo eclesiástico antiguo {{l+|cu|тълкъ|tr=tŭlkŭ, "[[interpretación]]", "[[explicación]]"}}, y el ruso {{l+|ru|толк|tr=tolk, "[[sentido]]"}}.<ref name="vaan" />
=== {{verbo intransitivo|la}} ===
;1: {{plm|hablar}}.<ref name="ol">{{Oxf-lat}}</ref>
;2: ''Generalmente con {{l+|la|cum}} o {{l+|la|inter}} {{l+|la|se}}'': [[conversar]], [[charlar]].<ref name="ol" />
;3: Usar un lenguaje de [[conversación]] [[informal]].<ref name="ol" />
=== {{verbo transitivo|la}} ===
;4: ''Con acusativo'': [[decir]] (el uno al otro).<ref name="ol" />
;5: ''Con acusativo'': [[decir]], [[hablar]], [[pronunciar]].<ref name="ol" />
;6: ''Con acusativo'': [[hablar]] de, [[mencionar]].<ref name="ol" />
=== Conjugación ===
{{la.v|3|p3inf=v|loquor|locūt|locūt}}
== Referencias y notas ==
<references />
198sks3m26m1c8a1vsiuctnvvbqwux9
fruor
0
901900
6307412
6290578
2026-08-06T02:54:17Z
TMCbot
164594
.
6307412
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la}}
=== Etimología ===
{{etimología|leng=la|itc-pro|*frūg-|alt=*frūg-je/o-}}, y este del protoindoeuropeo {{l+|ine-pro|*bʰrewHg-|*bʰruHg-ie/o-}} ("[[usar]]").<ref name="vaan">{{DeVaan|244-45}}</ref> Compárese del germánico {{l+|gem-pro|*brūkanan}} ("[[usar]]"): el gótico {{l+|got|𐌱𐍂𐌿𐌺𐌾𐌰𐌽|tr=brukjan}}, el inglés antiguo {{l+|ang|brūcan}}, el alemán antiguo {{l+|goh|brūhhan}} y el sajón antiguo {{l+|osx|brūkan}}.<ref name="vaan" />
=== {{verbo|la|intransitivo|transitivo}} ===
;1: {{plm|gozar}} de los [[productos]] (de), [[disfrutar]] (de).<ref name="ol">{{Oxf-lat}}</ref>
;2: {{plm|sacar}} [[provecho]] (a), [[aprovecharse]] (de), [[beneficiarse]] (de).<ref name="ol" />
;3: ''En sentido más amplio'': [[gozar]] (de), [[disfrutar]] (de).<ref name="ol" />
;4: {{plm|encontrar}} [[placer]] (en), [[deleitarse]] (con), [[gozar]] (de).<ref name="ol" />
;5: {{plm|disfrutar}} de la [[compañía]] (de).<ref name="ol" />
;6: {{plm|gozar}} [[sexualmente]].<ref name="ol" />
=== Conjugación 1 ===
{{la.v|3|fruor|frūct|nucleoperf2=fruit|frūct|nucleosup2=fruit}}
== Referencias y notas ==
<references />
mrt6bqwx1zfiym9sxxc5qfdeg5bz3ku
popurrí
0
912171
6307372
6059168
2026-08-06T00:38:27Z
TMCbot
164594
.
6307372
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|fr|pot-pourri}} ("''[[olla]] [[podrida]]"''), en referencia al [[puchero]].
=== {{sustantivo masculino|es}} ===
{{es.sust|s=s}}
;1: {{plm|mezcolanza}} de cosas variadas.
{{sinónimos|miscelánea}}.
;2 {{csem|música}}: {{plm|composición}} formada por [[fragmento]]s de diferentes temas musicales.
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
<!--{{t+|de|}}-->
<!--{{t+|ar|}}-->
<!--{{t+|bg|}}-->
<!--{{t+|ca|}}-->
<!--{{t+|eo|}}-->
<!--{{t+|fr|}}-->
<!--{{t+|en|}}-->
<!--{{t+|it|}}-->
<!--{{t+|ja|}}-->
<!--{{t+|nl|}}-->
<!--{{t+|pl|}}-->
<!--{{t+|pt|}}-->
{{trad-abajo}}
== Referencias y notas ==
<references />
f0bpikom6mtv3xa4cz9k1s0v6adj3v3
bûcheron
0
912318
6307353
6071349
2026-08-06T00:37:45Z
TMCbot
164594
.
6307353
wikitext
text/x-wiki
{{desambiguación|bucheron}}
== {{lengua|fr}} ==
{{pron-graf|1fone1=by.ʃ(ə.)ʁɔ̃|leng=fr
|h1=bûcherons
|g1=bucheron|g2=buscheron|gnota2=obsoleta}}
=== Etimología ===
{{etimología|leng=fr|frm|buscheron||frm|bucheron|glosa2=leñador}}, y estos del francés antiguo {{l+|fro|boscheron}}.<ref name="DAF8">{{DAF8}}</ref>
=== {{sustantivo masculino y femenino|fr}} ===
{{fr.sust|irreg|f=bûcheronne|f2=bûcheresse[†]|fp=bûcheronnes|fp2=bûcheresses[†]}}
;1 {{csem|ocupaciones|leng=fr}}: {{plm|leñador}} ({{l|es|cortador}} o {{l|es|talador}}).
{{sinónimo|leng=fr|abatteur|boquillon}}.
{{hiperónimo|leng=fr|coupeur|fendeur|tailleur}}.
=== Véase también ===
{{w|leng=fr}}
* {{l+|fr|bûche}}, {{l+|fr|bûcher}}, {{l+|fr|bûcheresse}}, {{l+|fr|bûcheronnage}}, {{l+|fr|bûchette}}, {{l+|fr|bûcheur}}, {{l+|fr|buchot}}, {{l+|fr|ébûcheter}}, {{l+|fr|embûche}}, {{l+|fr|embûchement}}, {{l+|fr|embûcher}}, {{l+|fr|rebûcher}}, {{l+|fr|trébucher}}
== Referencias y notas ==
<references />
kr2gjtkc486t4e84fichkn5q26lzp2x
disfraz
0
912877
6307405
5711646
2026-08-06T02:08:44Z
Tmagc
158167
/* Etimología */
6307405
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|regresiva|disfrazar}}.<ref name="d">{{DLC1914|377}}</ref>
=== {{sustantivo masculino|es}} ===
{{es.sust}}
;1: {{plm|artificio}} que se usa para [[desfigurar]] algo con el fin de que no sea [[conocido]].<ref name="d" />
{{hipónimo|camuflaje}}.
;2: {{plm|vestido}} de fiesta o carnaval que suele representar a algo o a alguien.<ref name="dl">{{DLE}}</ref>
{{hipónimo|cosplay}}.
;3: {{plm|simulación}} para dar a entender algo diferente de lo que se está diciendo.<ref name="d" /><ref name="dl" />
=== Véase también ===
{{w}}
{{Wikiquote}}
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
<!--{{t+|de|}}-->
<!--{{t+|ar|}}-->
<!--{{t+|bg|}}-->
<!--{{t+|ca|}}-->
<!--{{t+|eo|}}-->
<!--{{t+|fr|}}-->
<!--{{t+|en|}}-->
<!--{{t+|it|}}-->
<!--{{t+|ja|}}-->
<!--{{t+|nl|}}-->
<!--{{t+|pl|}}-->
<!--{{t+|pt|}}-->
{{trad-abajo}}
== Referencias y notas ==
<references />
nrg458qhnwd8tzsiko36sug3b3my3sw
digredior
0
913299
6307409
6059941
2026-08-06T02:53:33Z
TMCbot
164594
.
6307409
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=dīgredior}}
=== Etimología ===
{{etimología|leng=la|prefijo|dis|gradior|glosa2=andar}}.<ref name="ol">{{Oxf-lat}}</ref>
=== {{verbo intransitivo|la}} ===
;1: {{plm|irse}}, [[marcharse]], [[partir]], [[alejarse]], [[separarse]].<ref name="ol" />
;2: {{plm|separarse}}, [[divorciarse]].<ref name="ol" />
;3: {{plm|divagar}}.<ref name="ol" />
=== Conjugación ===
{{la.v|3|dīgredior|dīgress|dīgress}}
== Referencias y notas ==
<references />
q8gqif1thjyjgstgj627eqredk6p8ex
dilabor
0
913301
6307410
6059943
2026-08-06T02:53:34Z
TMCbot
164594
.
6307410
wikitext
text/x-wiki
== {{lengua|la}} ==
{{pron-graf|leng=la|ayuda=dīlābor}}
=== Etimología ===
{{etimología|leng=la|prefijo|dis|labor|alt2=lābor|num2=1|glosa=deslizarse}}.<ref name="ol">{{Oxf-lat}}</ref>
=== {{verbo intransitivo|la}} ===
;1: ''Dicho de líquidos o similar'': {{plm|irse}} o [[separarse]] [[fluir|fluyendo]] o [[deslizar|deslizándose]], [[escurrirse]], [[deslizarse]], [[correr]].<ref name="ol" />
;2: {{plm|extenderse}}.<ref name="ol" />
;3: {{plm|derretirse}}, [[disolverse]], [[fundirse]], [[disiparse]].<ref name="ol" />
;4: ''Dicho de las nubes'': [[dispersarse]].<ref name="ol" />
;5: ''Dicho de multitudes, etc.'': [[escabullirse]] en todas direcciones, [[escurrirse]], [[dispersarse]].<ref name="ol" />
;6: ''Dicho de fantasmas, visiones o similar'': [[desvanecerse]], [[esfumarse]].<ref name="ol" />
;7: ''Dicho del tiempo'': [[pasar]] (inevitablemente), [[transcurrir]], [[escaparse]].<ref name="ol" />
;8: {{plm|escaparse}}, [[escabullirse]], [[escurrirse]], [[huir]].<ref name="ol" />
;9: {{plm|caer}} a [[pedazo]]s, [[despedazarse]], [[desintegrarse]].<ref name="ol" />
;10: ''Dicho del cuerpo, del ánimo, etc.'': [[colapsar]].<ref name="ol" />
;11: ''Dicho de posesiones, instituciones, etc.'': [[decaer]], [[arruinarse]], [[estropearse]].<ref name="ol" />
=== Conjugación ===
{{la.v|3|dīlābor|dīlāps|dīlāps}}
== Referencias y notas ==
<references />
cmo0fgd873zkuyaalp1oxdryqjvr4cz
cisgénero
0
918911
6307355
6076851
2026-08-06T00:37:49Z
TMCbot
164594
.
6307355
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|prefijo|cis|género}}.
=== {{adjetivo|es}} ===
{{es.adj|inv}}
;1 {{csem|lgbt}}: Dícese de la persona cuya [[identidad de género]] es [[concordante]] con el [[sexo]] que le fue asignado al nacer.
{{uso|utcs}}
{{antónimo|transgénero}}
;2 {{csem|lgbt}}: Propio o relacionado con las personas cisgénero.
=== Véase también ===
* [[transexual]]
* [[intersexual]]
{{W}}
=== Traducciones ===
{{trad-arriba}}
{{t|de|t1=Cisgender}}
{{t|ca|t1=cisgènere}}
{{t|fr|t1=cisgenre}}
{{t|en|t1=cisgender}}
{{t|it|t1=cisgenere}}
{{t|pt|t1=cisgénero}}
{{trad-abajo}}
== Referencias y notas ==
<references />
nc3qjwkcl48dow2u60xcftq58fz3i66
Peñaranda
0
931941
6307293
5883278
2026-08-05T14:34:33Z
~2026-34597-22
183061
estar en Peñaranda
6307293
wikitext
text/x-wiki
{{ampliable}}
=== Etimología ===
{{etimología}}.
=== {{sustantivo propio|es}}===
;1: {{apellido}}.
==== Locuciones ====
* {{l|es|estar en Peñaranda}}
=== Véase también ===
{{w|Peñaranda (desambiguación)|Peñaranda}}
== Referencias y notas ==
<references />
i8hwfaqzn1j2a1v0216017tr3t5rru0
6307304
6307293
2026-08-05T19:42:55Z
26agcp
138617
corrijo formato
6307304
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
{{ampliable}}
=== Etimología ===
{{etimología}}.
==== {{sustantivo propio|es}}====
;1: {{apellido}}.
==== Locuciones ====
* {{l|es|estar en Peñaranda}}
==== Véase también ====
{{w|Peñaranda (desambiguación)|Peñaranda}}
== Referencias y notas ==
<references />
tb52stvy527n015l4gc8yd2yvcbgfu3
sow
0
974491
6307373
6294270
2026-08-06T00:38:31Z
TMCbot
164594
.
6307373
wikitext
text/x-wiki
{{desambiguación|sów}}
== {{lengua|huv}} ==
{{pron-graf|leng=huv}}
=== Etimología ===
{{etimología|leng=huv}}
=== {{sustantivo|huv}} ===
;1: {{plm|cerdo}}
== {{lengua|en}} ==
{{pron-graf|leng=en
|pron=Etimología 1: Received Pronunciation, General American, Standard Canadian|1fono1=saʊ|1audio1=en-us-sow-noun.ogg|1aunota1=California
|2pron=Etimología 1: Australia|2fono=sæɔ
|3pron=Etimología 1: Nueva Zelanda|3fono=sæʊ
|4pron=Etimología 2: Received Pronunciation|4fono=səʊ|4audio=
|5pron=Etimología 2: General American, Standard Canadian|5fono=soʊ|5audio=en-us-sow-verb.ogg|5aunota1=California
|6pron=Etimología 2: Australia|6fono=səʉ
|7pron=Etimología 2: Nueva Zelanda|7fono=sɐʉ
}}
=== Etimología 1 ===
{{etimología|leng=en|enm|sowe}}, y este {{etim|leng=en|ang|sugu}}, y este {{etim|leng=en|gem-pro|*sugō}}.
==== {{sustantivo|en}} ====
{{en.sust|c|sows|swine[†]}}
;1 {{csem|leng=en|mamíferos}}: {{plm|cerda}}, [[marrana]].
;2: {{plm|hembra}} de varios animales oso, tejón, conejillo de indias.
;3 {{csem|leng=en|metalurgia}}: {{plm|canal}} de colada, para transportar metales fundidos.
;4 {{csem|leng=en|metalurgia}}: {{plm|pieza}} de [[metal]] solidificada en el molde.
=== Etimología 2 ===
{{etimología|leng=en|enm|sowen}}, y este {{etim|leng=en|ang|sāwan}}, y este {{etim|leng=en|gem-pro|*sēaną}}.
==== {{verbo transitivo|en}} ====
;1: {{plm|sembrar}}.
{{ejemplo|Do not be deceived, God is not mocked; for whatever a man '''sows''', that he will also reap|c=libro|pasaje=Galatians 6:7|t=Bible|trad=No os engañéis; Dios no puede ser burlado, pues todo lo que el hombre '''siembre''', eso también segará,|tradc=libro|tradpasaje=Galatas 6:7|tradt=Biblia|tradu=https://www.biblegateway.com/passage/?search=Galatians%206&version=RVR1995|tradv=Reina-Valera 1995|u=https://www.biblegateway.com/passage/?search=Galatians%206&version=NKJV
|v=New King James Version}}
;2: {{plm|diseminar}}, [[propagar]].
==== Véase también ====
{{w|leng=en}}
==== Conjugación ====
{{en.v|sowed|sowed;sown}}
== Referencias y notas ==
<references />
6b0i8ixp7y02v6nwqnmalymm5xy5l2a
abort
0
993211
6307273
6100607
2026-08-05T13:28:04Z
Intolerable situation
130039
/* {{lengua|en}} */
6307273
wikitext
text/x-wiki
{{desambiguación|Abort}}
== {{lengua|az}} ==
{{pron-graf|leng=az}}
=== Etimología ===
{{etimología|leng=az}}.
=== {{sustantivo|az}} ===
;1: {{plm|aborto}}.
== {{lengua|ceb}} ==
{{pron-graf|leng=ceb}}
=== Etimología ===
{{etimología|leng=ceb|en|abort}}.
=== {{verbo|ceb}} ===
;1: {{plm|abortar}}.
== {{lengua|et}} ==
{{pron-graf|leng=et|}}
=== Etimología ===
{{etimología|leng=et|de|Abort}}.
=== {{sustantivo|et}} ===
;1: {{plm|aborto}}.
== {{lengua|en}} ==
{{pron-graf|leng=en
|pron=Received Pronunciation|fono=əˈbɔːt
|2pron=General American|2fono=əˈbɔɹt|2audio=En-us-abort.ogg
|3pron=Australia|3fono=əˈboːt
|ls=2
}}
=== Etimología ===
{{etimología|leng=en|la|abortus}}
=== {{sustantivo|en}} ===
;1: {{plm|aborto}}.
{{uso|leng=en|obsoleto}}
=== {{verbo|en}} ===
;2: {{plm|abortar}}.
== {{lengua|crh}} ==
{{pron-graf|leng=crh}}
=== Etimología ===
{{etimología|leng=crh|la|abortus}}.
=== {{sustantivo|crh}} ===
;1: {{plm|aborto}}.
== {{lengua|uz}} ==
{{pron-graf|leng=uz}}
=== Etimología ===
{{etimología|leng=uz|la|abortus}}.
=== {{sustantivo|uz}} ===
;1: {{plm|aborto}}.
== Referencias y notas ==
<references />
5bt5r87uc1pktjt4656l6678ygz8z4o
6307279
6307273
2026-08-05T13:32:59Z
Intolerable situation
130039
/* {{lengua|en}} */
6307279
wikitext
text/x-wiki
{{desambiguación|Abort}}
== {{lengua|az}} ==
{{pron-graf|leng=az}}
=== Etimología ===
{{etimología|leng=az}}.
=== {{sustantivo|az}} ===
;1: {{plm|aborto}}.
== {{lengua|ceb}} ==
{{pron-graf|leng=ceb}}
=== Etimología ===
{{etimología|leng=ceb|en|abort}}.
=== {{verbo|ceb}} ===
;1: {{plm|abortar}}.
== {{lengua|et}} ==
{{pron-graf|leng=et|}}
=== Etimología ===
{{etimología|leng=et|de|Abort}}.
=== {{sustantivo|et}} ===
;1: {{plm|aborto}}.
== {{lengua|en}} ==
{{pron-graf|leng=en
|pron=Received Pronunciation|fono=əˈbɔːt
|2pron=General American|2fono=əˈbɔɹt|2audio=En-us-abort.ogg
|3pron=Australia|3fono=əˈboːt
|ls=2
}}
=== Etimología ===
{{etimología|leng=en|la|abortus}}
=== {{sustantivo|en}} ===
;1: {{plm|aborto}}.
{{uso|leng=en|obsoleto}}
=== {{verbo|en}} ===
;2: {{plm|abortar}}.
=== Conjugación ===
{{en.v}}
== {{lengua|crh}} ==
{{pron-graf|leng=crh}}
=== Etimología ===
{{etimología|leng=crh|la|abortus}}.
=== {{sustantivo|crh}} ===
;1: {{plm|aborto}}.
== {{lengua|uz}} ==
{{pron-graf|leng=uz}}
=== Etimología ===
{{etimología|leng=uz|la|abortus}}.
=== {{sustantivo|uz}} ===
;1: {{plm|aborto}}.
== Referencias y notas ==
<references />
tcpv4taybohggh46aow4kiiaul501ld
stiletto
0
993728
6307385
5848770
2026-08-06T01:01:02Z
Tmagc
158167
/* Conjugación */
6307385
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=stəˈlɛtoʊ}}
=== Etimología ===
{{etimología|leng=en|it|stiletto}}.
=== {{sustantivo|en}} ===
{{en.sust|c|stilettos|stilettoes|stiletti}}
;1: {{plm|estilete}}
;2: {{plm|tacón}} de aguja.
=== {{verbo transitivo|en}} ===
;3: Herir con estilete.
=== Conjugación ===
{{en.v}}
== Referencias y notas ==
<references />
3o0pyyuif9cmdx9z47ilc4x4evttkjy
bust
0
999091
6307290
5883036
2026-08-05T13:45:22Z
Intolerable situation
130039
/* {{lengua|en}} */
6307290
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|en}} ==
{{pron-graf|leng=en|audio=en-us-bust.ogg|audio2=en-au-bust.ogg|aunota=Estados Unidos|aunota2=Australia|fono=bʌst|ls=1}}
=== Etimología 1 ===
{{etimología|leng=en|fr|buste}}.
==== {{sustantivo|en}} ====
{{en.sust|c}}
;1: {{plm|busto}}.
;2: {{plm|senos}}.
;3: {{plm|pecho}}.
=== Etimología 2 ===
{{etimología2|leng=en|Variación de [[burst]]}}
==== {{verbo transitivo|en}} ====
;1: {{plm|romper}}, [[arruinar]].
;2: {{plm|arrestar}}.
;3: {{plm|atrapar}}.
;4: {{plm|quebrar}}.
;5: {{plm|degradar}}.
{{ámbito|leng=en|Estados Unidos}}
;6: {{plm|deshacer}} una operación financiera.
;7: {{plm|eyacular}}.
{{uso|leng=en|slang}}
==== {{sustantivo|en}} ====
;8: {{plm|arresto}}.
;9: {{plm|empresa}} fallida.
{{uso|leng=en|slang}}
;10: {{plm|fiasco}}.
==== {{adjetivo|en}} ====
{{en.adj|inc}}
;11: {{plm|quebrado}}, [[arruinado]].
==== Véase también ====
{{w|leng=en}}
==== Conjugación ====
{{en.v|busted;bust}}
== Referencias y notas ==
<references />
ouu72h2binwdai9rd2zx4i9mq2l0ywo
insigne
0
999298
6307421
5717307
2026-08-06T04:31:56Z
Tmagc
158167
6307421
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|la|insignis|alt=īnsignis}}.
=== {{adjetivo|es}} ===
{{es.adj|ng}}
;1: {{plm|célebre}}, [[distinguido]].
{{ejemplo|Una mañana fría llegó Carlos tercero<br>Con aire '''insigne''' se quitó el sombrero<br>Muy lentamente bajó de su caballo<br>Con voz profunda le dijo a su lacayo<br>Ahí está la puerta de Alcalá|c=canción|t=La puerta de Alcalá|a=Ana Belén|a2=Víctor Manuel}}
=== Locuciones ===
* [[reliquia insigne]]
=== Traducciones ===
{{trad-arriba}}
{{t|fr|a1=1|t1=éminent}}
{{trad-abajo}}
== Referencias y notas ==
<references />
khofdi4jb9rnq9z7sfm21gxjgc9d63k
alley
0
1001186
6307286
6113197
2026-08-05T13:38:52Z
Intolerable situation
130039
/* {{lengua|en}} */
6307286
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|en}} ==
{{pron-graf|leng=en|2fono=ˈæli|2audio=|2pron=Reino Unido|audio=en-us-alley.ogg|fono=ˈæli|pron=Estados Unidos|ls=2}}
=== Etimología ===
{{etimología|leng=en|enm|aley}} y este {{etim|leng=en|fro|alee}}
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|callejón}}.
;2: {{plm|callejuela}}.
=== Véase también ===
{{w|leng=en}}
== Referencias y notas ==
<references />
4yxmawjr6bkudv2fmtyosyfw2y0p3p5
aquél
0
1016832
6307351
6059431
2026-08-06T00:37:40Z
TMCbot
164594
.
6307351
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== {{pronombre|es|demostrativo|masculino}} ===
{{es.adj|irreg|aquéllos|aquélla|aquéllas|neutro=aquéllo}}
;1: {{grafía|aquel}}
{{uso|Se emplea en modo facultativo y solamente cuando haya riesgo de confusión con el adjetivo homónimo. En tal caso, se indica explícitamente que se trata del pronombre personal}}
=== Traducciones ===
{{trad-véase|1|aquel|num=2}}
== Referencias y notas ==
<references />
knz6vlzep8cxkibug8p6knd2d9sh1i4
Módulo:etimología
828
1030792
6307424
6283765
2026-08-06T04:53:43Z
Tmagc
158167
6307424
Scribunto
text/plain
local export = {}
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local sub = m_str.sub
local len = m_str.len
local gsub = m_str.gsub
local find = m_str.find
local upper = m_str.upper
local lower = m_str.lower
local ucfirst = function(s) return upper(sub(s, 1, 1))..sub(s, 2) end
local lcfirst = function(s) return lower(sub(s, 1, 1))..sub(s, 2) end
local obtener_idioma = require("Módulo:lenguas").cod_a_idioma
local generar_error = require("Módulo:traza")
local sortkey = require("Módulo:sortkey").generarSortkey
-- Equivalente de l+
local function l_iteracion(p, Idioma, num, tr, alt, glosa, glosa_alt, nl, nlglosa)
if not p then
return ""
end
local t = {}
if p:find("[^a-zA-ZÀ-ž-]+$") then
generar_error("etimo")
end
if nl then
insert(t, alt and " "..alt or " ''"..p.."''")
else
insert(t, " [["..p.."#"..Idioma..(num and " "..num or "").."|''"..(alt and alt or p).."'']]")
end
if num then
insert(t, "<sub>"..num.."</sub>")
end
if glosa then
if nlglosa then
glosa = "[["..glosa.."#Español|\'"..(glosa_alt and glosa_alt or glosa).."\']]"
else
glosa = "\'"..(glosa_alt and glosa_alt or glosa).."\'"
end
end
if tr or glosa then
insert(t, " (")
if tr then
insert(t, "''"..tr.."''")
if glosa then
insert(t, ", "..glosa)
end
else
insert(t, glosa)
end
insert(t, ")")
end
return concat(t)
end
local function l_palabras(t, args, i_, l_, k_, sufijo)
local i = i_ or 2
local l = l_ or #args
local k = k_ or 1
local poner_coma = false
while i <= l do
if poner_coma then
if i == #args then
if (args["e"] and args["e"] ~= "") or find(args[i], "^%-?[ií]") then
insert(t, " e")
else
insert(t, " y")
end
else
insert(t, ",")
end
end
insert(t, l_iteracion(args[i], args["Idioma"], args["num"][k], args["tr"][k], args["alt"][k], args["glosa"][k], args["glosa-alt"][k], args["nl"][k], args["nlglosa"][k]))
if sufijo then
insert(t, sufijo) -- caso de las marcas registradas
end
i = i + 1
k = k + 1
poner_coma = true
end
end
local function compuesto(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Compuesto")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
insert(t, " de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por composición|"..sk.."]]")
if args["nota"] == "acronímico" then
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por composición acronímica|"..sk.."]]")
elseif args["nota"] == "cruce" then
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por cruce|"..sk.."]]")
end
end
return concat(t)
end
local function cruce(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Cruce")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
insert(t, " de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por cruce|"..sk.."]]")
end
return concat(t)
end
local function acronimo(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Acrónimo")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
insert(t, " de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por composición acronímica|"..sk.."]]")
end
return concat(t)
end
local function expresiva(args)
local t = {}
insert(t, "Voz [[expresión|expresiva]]")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen expresivo|"..sk.."]]")
end
return concat(t)
end
local function regresiva(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Derivación regresiva de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por derivación regresiva|"..sk.."]]")
end
return concat(t)
end
local function metatesis(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Metátesis"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por metátesis|"..sk.."]]")
end
return concat(t)
end
local function paronomasia(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Paronomasia"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por paronomasia|"..sk.."]]")
end
return concat(t)
end
local function fonetica(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Alteración fonética"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por alteración fonética|"..sk.."]]")
end
return concat(t)
end
local function acortamiento(args)
local t = {}
insert(t, "Acortamiento")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por acortamiento|"..sk.."]]")
end
return concat(t)
end
local function apocope(args)
local t = {}
insert(t, "Apócope")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por acortamiento|"..sk.."]]")
end
return concat(t)
end
local function sincopa(args)
local t = {}
insert(t, "Síncopa")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por acortamiento|"..sk.."]]")
end
return concat(t)
end
local function aferesis(args)
local t = {}
insert(t, "Aféresis")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por acortamiento|"..sk.."]]")
end
return concat(t)
end
local function contraccion(args)
local t = {}
insert(t, "Contracción")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por acortamiento|"..sk.."]]")
end
return concat(t)
end
local function abreviatura(args)
local t = {}
insert(t, "Abreviatura")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Abreviaturas|"..sk.."]]")
end
return concat(t)
end
local function sigla(args)
local t = {}
insert(t, "Sigla")
if args["nota"] and args["nota"] ~= "" then
insert(t, " ("..args["nota"]..")")
end
if args[2] and args[2] ~= "" then
insert(t, " de")
l_palabras(t, args)
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Siglas|"..sk.."]]")
end
return concat(t)
end
local function diminutivo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Diminutivo"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
-- insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo diminutivo|"..sk.."]]")
end
return concat(t)
end
local function aumentativo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Aumentativo"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
-- insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo aumentativo|"..sk.."]]")
end
return concat(t)
end
local function sufijo(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " y el sufijo")
l_palabras(t, args, 3, 3, 2)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el sufijo "..args[3].."|"..sk.."]]")
end
return concat(t)
end
local function prefijo(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local L = len(args[2])
if sub(args[2], L, L) ~= "-" then
args[2] = args[2].."-"
end
local t = {}
insert(t, "Del prefijo")
l_palabras(t, args, 2, 2, 1)
if find(args[3], "^%-?[ií]") then
insert(t, " e")
else
insert(t, " y")
end
l_palabras(t, args, 3, 3, 2)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por prefijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el prefijo "..args[2].."|"..sk.."]]")
end
return concat(t)
end
local function infijo(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
local L = len(args[3])
if sub(args[3], L, L) ~= "-" then
args[3] = args[3].."-"
end
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " y el infijo")
l_palabras(t, args, 3, 3, 2)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por infijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el infijo "..args[3].."|"..sk.."]]")
end
return concat(t)
end
local function confijo(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local L = len(args[2])
if sub(args[2], L, L) ~= "-" then
args[2] = args[2].."-"
end
local t = {}
insert(t, "Del prefijo")
l_palabras(t, args, 2, 2, 1)
if args[4] and args[4] ~= "" then
insert(t, ",")
l_palabras(t, args, 3, 3, 2)
if not find(args[4], "^%*?%-") then
args[4] = "-"..args[4]
end
insert(t, " y el sufijo")
l_palabras(t, args, 4, 4, 3)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por prefijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el prefijo "..args[2].."|"..sk.."]]")
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el sufijo "..args[4].."|"..sk.."]]")
end
else
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
insert(t, " y el sufijo")
l_palabras(t, args, 3, 3, 2)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por prefijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el prefijo "..args[2].."|"..sk.."]]")
--insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijación|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el sufijo "..args[3].."|"..sk.."]]")
end
end
return concat(t)
end
local function onomatopeya(args)
local t = {}
insert(t, "Onomatopéyica")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen onomatopéyico|"..sk.."]]")
end
return concat(t)
end
local function incierta(args)
local t = {}
insert(t, "De origen incierto")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen incierto|"..sk.."]]")
end
return concat(t)
end
local function eponimo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Epónimo: "..args[2])
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen epónimo|"..sk.."]]")
end
return concat(t)
end
local function pronominal(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " con el [[pronombre reflexivo]] [[átono]]")
return concat(t)
end
local function femenino(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " y el [[sufijo flexivo]]")
if args[3] then
if not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
l_palabras(t, args, 3, 3, 2)
else
insert(t, " -a")
end
insert(t, " para el femenino")
return concat(t)
end
local function masculino(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " y el [[sufijo flexivo]]")
if args[3] then
if not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
l_palabras(t, args, 3, 3, 2)
else
insert(t, " -o")
end
insert(t, " para el masculino")
return concat(t)
end
local function plural(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
if args[3] and not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
local t = {}
insert(t, "De")
l_palabras(t, args, 2, 2, 1)
insert(t, " y el [[sufijo flexivo]]")
if args[3] then
if not find(args[3], "^%*?%-") then
args[3] = "-"..args[3]
end
l_palabras(t, args, 3, 3, 2)
else
insert(t, " -s")
end
insert(t, " para el plural")
return concat(t)
end
local function participio(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Participio"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo participio|"..sk.."]]")
end
return concat(t)
end
local function participio_activo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Participio activo"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Participios activos lexicalizados|"..sk.."]]")
end
return concat(t)
end
local function participio_pasivo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Participio pasivo"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Participios pasivos lexicalizados|"..sk.."]]")
end
return concat(t)
end
local function lexicalizacion(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Lexicalización"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por lexicalización|"..sk.."]]")
end
return concat(t)
end
local function denominal(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Denominal"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo denominal|"..sk.."]]")
end
return concat(t)
end
local function deadjetival(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Deadjetival"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo deadjetival|"..sk.."]]")
end
return concat(t)
end
local function deverbal(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Deverbal"..(args["nota"] and " ("..args["nota"]..")" or "").." de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por sufijo deverbal|"..sk.."]]")
end
return concat(t)
end
local function calco(args)
assert(args[2] and args[3], "El número de argumentos recibidos es insuficiente")
local t = {}
local id = (obtener_idioma(args[2]))[1]
local Id = ucfirst(id)
insert(t, "Calco"..(args["nota"] and " ("..args["nota"]..")" or "").." del "..id)
if (not args["glosa"][1]) and args[4] then -- En la versión anterior hacía esto sólo para esta función, por qué?
args["glosa"][1] = args[4]
end
insert(t, l_iteracion(args[3], Id, args["num"][1], args["tr"][1], args["alt"][1], args["glosa"][1], args["glosa-alt"][1], args["nl"][1], args["nlglosa"][1]))
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras formadas por calco|"..sk.."]]")
insert(t, "[[Categoría:"..args["LENG"]..":Palabras provenientes del "..id.."|"..sk.."]]")
end
return concat(t)
end
local function marca(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
local L = #args
if L > 2 then
insert(t, "De las marcas registradas")
else
insert(t, "De la marca registrada")
end
args["nl"][1] = true
l_palabras(t, args, 2, L, 1, "<sup>®</sup>")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de marcas registradas|"..sk.."]]")
end
return concat(t)
end
local function dialecto_de_ojo(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Dialecto del ojo "..(args["nota"] and " ("..args["nota"]..")" or "").." para")
l_palabras(t, args)
return concat(t)
end
local function artificial(args)
generar_error("invento")
local t = {}
if args[2] then
insert(t, "Término artificial, inventado por "..args[2])
else
insert(t, "Palabra artificial")
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras artificales|"..sk.."]]")
end
return concat(t)
end
local function autor(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Acuñado por "..args[2])
return concat(t)
end
local function popularizado_por(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Populariazado por "..args[2])
return concat(t)
end
local function metaforica(args)
local t = {}
insert(t, "De origen metafórico")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen metafórico|"..sk.."]]")
end
return concat(t)
end
local function metonimica(args)
local t = {}
insert(t, "De origen metonímico")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen metonímico|"..sk.."]]")
end
return concat(t)
end
local function biblica(args)
local t = {}
insert(t, "De origen bíblico")
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de origen bíblico|"..sk.."]]")
end
return concat(t)
end
local function sumadepartes(args)
error("Parámetro obsoleto (utilice “no aplica” en su lugar)")
end
local function raiz(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
if args[3] then
insert(t, args[3].." de la raíz")
args[3] = nil
else
insert(t, "De la raíz")
end
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras de la raíz "..args[2].."|"..sk.."]]")
end
return concat(t)
end
local function grafia(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Grafía alternativa de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras endógenas".."|"..sk.."]]")
end
return concat(t)
end
local function variante(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Variante de")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras endógenas".."|"..sk.."]]")
end
return concat(t)
end
local function vease(args)
assert(args[2], "El número de argumentos recibidos es insuficiente")
local t = {}
insert(t, "Véase")
l_palabras(t, args)
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
insert(t, "[[Categoría:"..args["LENG"]..":Palabras endógenas".."|"..sk.."]]")
end
return concat(t)
end
local function noaplica(args)
local s = args["tit"]
s = gsub(s, "%S+", "[[%0]]")
s = gsub(s, "%]%s+%[", "] + [")
return s
end
local function origen(args, cat)
assert(args[1], "El número de argumentos recibidos es insuficiente")
local t = args[1] == "endo" and {"De "} or {"Del "}
local i = 1
local L = 1
for k,v in pairs(args) do -- no puedo hacer #args porque hay huecos entre medio
if type(k) == "number" and k > L then
L = k
end
end
local idioma = ""
local idioma_d = ""
local Idioma = ""
while true do
local nuevo_idioma = nil
if args[3*i-2] == "sufijo" then
nuevo_idioma = "sufijo"
if args[3*i-1] and not find(args[3*i-1], "^%*?%-") then
args[3*i-1] = "-"..args[3*i-1]
end
elseif args[3*i-2] == "prefijo" then
nuevo_idioma = "prefijo"
if args[3*i-1] then
local L_ = len(args[3*i-1])
if sub(args[3*i-1], L_, L_) ~= "-" then
args[3*i-1] = args[3*i-1].."-"
end
end
elseif args[3*i-2] == "endo" or args[3*i-2] == "ENDO" or args[3*i-2] == "endógeno" or args[3*i-2] == "endógena" then
nuevo_idioma = "endo"
assert(args[3*i-1], "el número de argumentos recibidos es insuficiente")
else
nuevo_idioma = obtener_idioma(args[3*i-2])[1]
end
local nuevo_idioma_d = nuevo_idioma..(args["d"][i] and " ("..args["d"][i]..")" or "")
if nuevo_idioma_d ~= idioma_d then
idioma = nuevo_idioma
idioma_d = nuevo_idioma_d
Idioma = ucfirst(idioma)
if i > 1 then
insert(t, idioma == "endo" and " de " or " del ")
end
if idioma ~= "endo" then
insert(t, idioma_d)
end
end
if idioma ~= "endo" then
insert(t, l_iteracion(args[3*i-1], Idioma, args["num"][i], args["tr"][i], args["alt"][i], args["glosa"][i] and args["glosa"][i] or args[3*i], args["glosa-alt"][i], args["nl"][i], args["nlglosa"][i]))
else
insert(t, l_iteracion(args[3*i-1], args["Idioma"], args["num"][i], args["tr"][i], args["alt"][i], args["glosa"][i] and args["glosa"][i] or args[3*i], args["glosa-alt"][i], args["nl"][i], args["nlglosa"][i]))
end
if args["ns"] == 0 then
local sk = sortkey(args["tit"], args["leng"], args["idioma_obj"])
if cat then
if idioma == "sufijo" then
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el sufijo "..args[3*i-1].."|"..sk.."]]")
elseif idioma == "prefijo" then
insert(t, "[[Categoría:"..args["LENG"]..":Palabras con el prefijo "..args[3*i-1].."|"..sk.."]]")
elseif idioma == "endo" then
insert(t, "[[Categoría:"..args["LENG"]..":Palabras endógenas".."|"..sk.."]]")
else
insert(t, "[[Categoría:"..args["LENG"]..":Palabras provenientes del "..idioma.."|"..sk.."]]")
end
end
end
i = i + 1
if 3*i-2 > L then
break
end
if 3*i-2 >= L-2 then
if (args["e"] and args["e"] ~= "") or (args[3*i-2] == args[3*i-5] and args[3*i-1] and find(args[3*i-1], "^%-?i")) then
insert(t, " e")
else
insert(t, " y")
end
else
insert(t, ",")
end
end
return concat(t)
end
local callbacks = {
["compuesto"] = compuesto,
["compuesta"] = compuesto,
["COMP"] = compuesto,
["cruce"] = cruce,
["acronimo"] = acronimo,
["acrónimo"] = acronimo,
["voz expresiva"] = expresiva,
["expresiva"] = expresiva,
["EXPR"] = expresiva,
["derivación regresiva"] = regresiva,
["regresiva"] = regresiva,
["REG"] = regresiva,
["metátesis"] = metatesis,
["trasposición"] = metatesis,
["vesre"] = metatesis,
["MET"] = metatesis,
["fone"] = fonetica,
["FONE"] = fonetica,
["fonética"] = fonetica,
["alteración fonética"] = fonetica,
["adición"] = fonetica,
["epéntesis"] = fonetica,
["prótesis"] = fonetica,
["metaplasmo"] = fonetica,
["FON"] = fonetica,
["acortamiento"] = acortamiento,
["apócope"] = apocope,
["apocope"] = apocope,
["síncopa"] = sincopa,
["sincopa"] = sincopa,
["síncope"] = sincopa,
["sincope"] = sincopa,
["aféresis"] = aferesis,
["aferesis"] = aferesis,
["contraccion"] = contraccion,
["contracción"] = contraccion,
["abreviación"] = abreviatura,
["abreviatura"] = abreviatura,
["sigla"] = sigla,
["siglas"] = sigla,
["supresión"] = acortamiento,
["acort"] = acortamiento,
["ACORT"] = acortamiento,
["diminutivo"] = diminutivo,
["dimi"] = diminutivo,
["DIMI"] = diminutivo,
["aumentativo"] = aumentativo,
["aume"] = aumentativo,
["AUME"] = aumentativo,
["sufijo"] = sufijo,
["SUF"] = sufijo,
["prefijo"] = prefijo,
["PREF"] = prefijo,
["infijo"] = infijo,
["INF"] = infijo,
["confijo"] = confijo,
["circunfijo"] = confijo,
["CIRCUNF"] = confijo,
["CONF"] = confijo,
["onomatopeya"] = onomatopeya,
["onomatopéyico"] = onomatopeya,
["onomatopéyica"] = onomatopeya,
["paronomasia"] = paronomasia,
["paranomasia"] = paronomasia,
["onom"] = onomatopeya,
["ONOM"] = onomatopeya,
["incierto"] = incierta,
["incierta"] = incierta,
["INC"] = incierta,
["epónimo"] = eponimo,
["epónima"] = eponimo,
["epon"] = eponimo,
["EPON"] = eponimo,
["pronominal"] = pronominal,
["PRON"] = pronominal,
["femenino"] = femenino,
["masculino"] = masculino,
["FEM"] = femenino,
["plural"] = plural,
["PLUR"] = plural,
["participio"] = participio,
["part"] = participio,
["PART"] = participio,
["participio activo"] = participio_activo,
["participio_activo"] = participio_activo,
["participio pasivo"] = participio_pasivo,
["participio_pasivo"] = participio_pasivo,
["lexicalización"] = lexicalizacion,
["lexi"] = lexicalizacion,
["LEXI"] = lexicalizacion,
["denominal"] = denominal,
["denom"] = denominal,
["DENOM"] = denominal,
["deadjetival"] = deadjetival,
["deadj"] = deadjetival,
["DEADJ"] = deadjetival,
["deverbal"] = deverbal,
["deverb"] = deverbal,
["DEVERB"] = deverbal,
["calco"] = calco,
["CALC"] = calco,
["marca"] = marca,
["dialecto de ojo"] = dialecto_de_ojo,
["dialecto del ojo"] = dialecto_de_ojo,
--["endógeno"] = endogena,
--["endógena"] = endogena,
--["endo"] = endogena,
--["ENDO"] = endogena,
["grafía"] = grafia,
["grafia"] = grafia,
["variante"] = variante,
["véase"] = vease,
["vease"] = vease,
["artificial"] = artificial,
["invento"] = artificial,
["autor"] = autor,
["acuñado"] = autor,
["pop"] = popularizado_por,
["popularizado"] = popularizado_por,
["metafórico"] = metaforica,
["metafórica"] = metaforica,
["meta"] = metaforica,
["META"] = metaforica,
["metonímico"] = metonimica,
["metonímica"] = metonimica,
["meto"] = metonimica,
["METO"] = metonimica,
["bíblico"] = biblica,
["bíblica"] = biblica,
["suma de partes"] = sumadepartes,
["suma"] = sumadepartes,
["raíz"] = raiz,
["raiz"] = raiz,
["no aplica"] = noaplica,
}
-- Entrada para {{etimología}}
function export.mostrar(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText -- no sirve parent_frame:getTitle()
if title == "Plantilla:etimología" then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {lista=true},
["e"] = {},
["leng"] = {},
["d"] = {lista=true},
["glosa"] = {lista=true},
["glosa-alt"] = {lista=true},
["nl"] = {lista = true},
["nolink"] = {alias_de="nl"},
["nlglosa"] = {lista = true},
["nolinkglosa"] = {alias_de="nl"},
["num"] = {lista=true},
["núm"] = {alias_de="num"},
["tr"] = {lista=true},
["transcripción"] = {alias_de="tr"},
["tl"] = {alias_de="tr"},
["transliteración"] = {alias_de="tr"},
["alt"] = {lista=true},
["diacrítico"] = {alias_de="alt"},
["nota"] = {},
["tilde"] = {},
["texto-prefijo"] = {},
["otro"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local e = false
for k,v in ipairs(args) do
if type(v) == "string" and find(v, "[%[%]%{%}%|%=]") then
e = true
break
end
end
for k,v in pairs(args) do
if type(v) == "string" and find(v, "[%[%]%{%}%|%=]") then
e = true
break
end
end
if (args[1] and (find(args[1], " para") or find(args[1], " y"))) or
(args[2] and (find(args[2], " para") or find(args[2], " y"))) then
generar_error("sufijopara")
end
if e then
generar_error("etimo")
end
if args["tilde"] and args["tilde"] ~= "" then
generar_error("tilde")
end
if args["texto-prefijo"] and args["texto-prefijo"] ~= "" then
generar_error("texto-prefijo")
end
if args["otro"] and args["otro"] ~= "" then
generar_error("otro")
end
if not args["leng"] then
args["leng"] = "es"
end
args["LENG"] = args["leng"]:upper()
args["idioma_obj"] = obtener_idioma(args["leng"])
args["idioma"] = args["idioma_obj"][1]
args["Idioma"] = ucfirst(args["idioma"])
args["ns"] = mw.title.getCurrentTitle().namespace
args["tit"] = mw.title.getCurrentTitle().fullText
if not args[1] then
if find(args["tit"], "%S%s+%S") then
return noaplica(args)
else
return frame:extensionTag('span', "''Si puedes, incorpórala: [[Plantilla:etimología|ver cómo]]''"..(args["ns"] == 0 and "[[Categoría:"..args["LENG"]..":Palabras de etimología sin precisar]]" or ""), {class ="notheme", style ="color: green; font-size: 90%;"})
end
end
local cb = callbacks[args[1]]
if not cb or (cb == prefijo and args[4] and args[4] ~= "") then
return origen(args, true)
end
return cb(args)
end
-- Entrada para {{etim}}
function export.mostrar_etim(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText -- no sirve parent_frame:getTitle()
if title == "Plantilla:etim" then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {lista=true},
["e"] = {},
["leng"] = {},
["d"] = {lista=true},
["glosa"] = {lista=true},
["glosa-alt"] = {lista=true},
["nl"] = {lista = true},
["nolink"] = {alias_de="nl"},
["nlglosa"] = {lista = true},
["nolinkglosa"] = {alias_de="nl"},
["num"] = {lista=true},
["núm"] = {alias_de="num"},
["tr"] = {lista=true},
["transcripción"] = {alias_de="tr"},
["tl"] = {alias_de="tr"},
["transliteración"] = {alias_de="tr"},
["alt"] = {lista=true},
["diacrítico"] = {alias_de="alt"},
["nota"] = {},
["tilde"] = {},
["texto-prefijo"] = {},
["otro"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local e = false
for k,v in ipairs(args) do
if type(v) == "string" and find(v, "[%[%]%{%}%|%=]") then
e = true
break
end
end
for k,v in pairs(args) do
if type(v) == "string" and find(v, "[%[%]%{%}%|%=]") then
e = true
break
end
end
if e then
generar_error("etimo")
end
if args["tilde"] and args["tilde"] ~= "" then
generar_error("tilde")
end
if args["texto-prefijo"] and args["texto-prefijo"] ~= "" then
generar_error("texto-prefijo")
end
if args["otro"] and args["otro"] ~= "" then
generar_error("otro")
end
if not args["leng"] then
args["leng"] = "es"
end
args["LENG"] = args["leng"]:upper()
if not args[1] then
error("El número de parámetros recibidos es insuficiente.")
end
args["idioma_obj"] = obtener_idioma(args["leng"])
args["idioma"] = args["idioma_obj"][1]
args["Idioma"] = ucfirst(args["idioma"])
args["ns"] = mw.title.getCurrentTitle().namespace
args["tit"] = mw.title.getCurrentTitle().fullText
local cb = callbacks[args[1]]
if not cb or (cb == prefijo and args[4] and args[4] ~= "") then
return lcfirst(origen(args, false))
end
return lcfirst(cb(args))
end
function export.etimologia2(frame)
local parent_frame = frame:getParent()
local args = parent_frame.args
local x = args[1]
local PALABRA = "['“”«»‘’\"%[%]%{%}%|a-zA-ZÀ-ž%*%-=]+"
local PREFIJO = "['“”«»‘’\"%[%]%{%}%|a-zA-ZÀ-ž%*%-=]+%-['%]]*"
local SUFIJO = "['%[]*%-['“”«»‘’\"%[%]%{%}%|a-zA-ZÀ-ž%*%-=]+"
if not x or x == "" then
generar_error("vacia")
return frame:extensionTag('span', "''Si puedes, incorpórala: [[Plantilla:etimología|ver cómo]]''"..(args["ns"] == 0 and "[[Categoría:"..args["LENG"]..":Palabras de etimología sin precisar]]" or ""), {class ="notheme", style ="color:green; font-size:90%"})
end
if find(x, "^ *[Dd]e *"..PALABRA.."[%.,:; ]*$") or find(x, "^ *[vV]er *"..PALABRA.."[%.,:; ]*$") or find(x, "^ *[vV].ase *"..PALABRA.."[%.,:; ]*$") then
generar_error("endo")
return x
end
if find(x, "^ *[Dd]el *"..PALABRA.." *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[Dd]el *"..PALABRA.." *"..PALABRA.." *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[Dd]el "..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[Dd]e *origen *"..PALABRA.."[%.,:; ]*$") then
generar_error("origen")
return x
end
if find(x, "^ *[dD]el *prefijo *"..PALABRA.." *y *el *sufijo *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[dD]e *"..PREFIJO.." *[%+y]* *"..SUFIJO.."[%.,:; ]*$") then
generar_error("confijo2")
return x
end
if find(x, "^ *[dD]el *prefijo *"..PALABRA.." *,? *"..PALABRA.." *y *el *sufijo *"..PALABRA.."[%.,:; ]*$") then
generar_error("confijo3")
return x
end
if find(x, "^ *[dD]el *prefijo *"..PALABRA.." *y *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[dD]e *"..PREFIJO.." *[%+y]* *"..PALABRA.."[%.,:; ]*$") then
generar_error("prefijo")
return x
end
if find(x, "^ *[dD]e *"..PALABRA.." *,? *y *el *sufijo *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[dD]e *"..PALABRA.." *%+* *"..SUFIJO.."[%.,:; ]*$") then
generar_error("sufijo")
return x
end
if find(x, "^ *[dD]?e?l? *[Dd]iminutivo *de *"..PALABRA.."[%.,:; ]*$") or find(x, "^ *[dD]e *"..PALABRA.." *,? *y *el *sufijo diminutivo *"..PALABRA.."[%.,:; ]*$") then
generar_error("diminutivo")
return x
end
if find(x, "^ *[dD]?e?l? *[Aa]umentativo *de *"..PALABRA.."[%.,:; ]*$") or find(x, "^ *[dD]e *"..PALABRA.." *,? *y *el *sufijo aumentativo *"..PALABRA.."[%.,:; ]*$") then
generar_error("aumentativo")
return x
end
if find(x, "^ *[cC]ompuesto *de *"..PALABRA.." *y *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[cC]omposici.n *de *"..PALABRA.." *y *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[dD]e *"..PALABRA.." *,? *y *"..PALABRA.."[%.,:; ]*$") then
generar_error("compuesto")
return x
end
if find(x, "^ *[pP]?o?r? *[cC]alco *[Dd]el *"..PALABRA.." *"..PALABRA.."[%.,:; ]*$") then
generar_error("calco")
return x
end
if find(x, "^ *[pP]?o?r? *[mM]et.tesis *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[tT]ran?sposici.n *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[vV]esre *[Dd]e *"..PALABRA.."[%.,:; ]*$") then
generar_error("meta")
return x
end
if find(x, "^ *[pP]?o?r? *[Aa]lteraci.n *[fF]on.tica *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Pp]r.tesis *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Pp]aragoge *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[eE]p.ntesis *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Mm]etaplasmo *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[aA]dici.n *[Dd]e *"..PALABRA.."[%.,:; ]*$") then
generar_error("fone")
return x
end
if find(x, "^ *[pP]?o?r? *[Aa]cortamiento *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Aa]p.cope *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Ss].ncopa *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[aA]f.resis *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Aa]breviaci.n *[Dd]e *"..PALABRA.."[%.,:; ]*$")
or find(x, "^ *[pP]?o?r? *[Aa]breviatura *[Dd]e *"..PALABRA.."[%.,:; ]*$") then
generar_error("abrev")
return x
end
if find(x, "^ *[Dd]?e? *o?r?i?g?e?n? *[Oo]nomatop?.?y?i?c?.? *$") then
generar_error("onom")
return x
end
if find(x, "^ *[Dd]?e? *o?r?i?g?e?n? *[Ee]xpresiv.? *$") then
generar_error("expr")
return x
end
if find(x, "^ *[Dd]?e? *o?r?i?g?e?n? *[Ii]nciert.? *$") then
generar_error("incerta")
return x
end
generar_error("otro")
return x
end
return export
7ahv6pi7c814n34va5w80zvpdnkw0hz
tumulus
0
1040163
6307377
6307019
2026-08-06T00:38:37Z
TMCbot
164594
.
6307377
wikitext
text/x-wiki
== {{lengua|fr}} ==
{{pron-graf|leng=fr}}
=== Etimología ===
{{etimología|leng=fr|la|tumulus}}. Cultismo.
=== {{sustantivo masculino|es}} ===
{{fr.sust|irreg|p=tumulus|p2=tumuli[†]}}
;1: {{plm|túmulo}}.
;2: {{plm|túmulo}}, [[catafalco]].
=== Véase también ===
{{w|leng=fr}}
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈtjuːmjələs}}
=== Etimología ===
{{etimología|leng=en|la|tumulus}}.
=== {{sustantivo|en}} ===
{{en.sust|c|tumuli}}
;1: {{plm|túmulo}}.
=== Véase también ===
{{w|leng=en}}
== {{lengua|la}} ==
{{pron-graf|leng=la}}
=== Etimología ===
{{etimología|leng=la|endo|tumeo|glosa=hincharse}}.
==== {{sustantivo masculino|la}} ====
;1: {{plm|montículo}}; [[túmulo]].
==== Descendientes ====
{{trad-arriba|Descendientes}}
{{d|ca|d1=túmul|niv=1}}
{{d|es|d1=túmulo|niv=1}}
{{d|fr|d1=tumulus|niv=1}}
{{d|en|d1=tumulus|niv=1}}
{{trad-abajo}}
==== Declinación ====
{{la.sust|tumulus.2}}
=== Véase también ===
{{w}}
== Referencias y notas ==
<references />
7s7srwol5406i8x7olbfwuzz37h87ji
Módulo:flex/es
828
1048487
6307327
6254039
2026-08-06T00:34:07Z
TMCbot
164594
.
6307327
Scribunto
text/plain
-- Módulo para flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local generar_traza = require("Módulo:traza")
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local len = m_str.len
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal_no_tilde = "aeiouüAEIOUÜ"
local vocal_tilde = "áéíóúÁÉÍÓÚ"
local vocal = vocal_no_tilde..vocal_tilde
local cons = "bcdfghjklmnñpqrstvwxyzBCDFGHJKLMNÑPQRSTVWXYZ"
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local CONS_SALVO_H = "[^"..vocal.."hH~#{}]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local function try(p, rx, pl, f, fpl, pl2, femenino)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if type(pl) == "string" and sub(pl, 1, 1) ~= "#" then
pl = "~"..pl.."~"
end
if type(f) == "string" and sub(f, 1, 1) ~= "#" then
f = "~"..f.."~"
end
if type(fpl) == "string" and sub(fpl, 1, 1) ~= "#" then
fpl = "~"..fpl.."~"
end
if type(pl2) == "string" and sub(pl2, 1, 1) ~= "#" then
pl2 = "~"..pl2.."~"
end
if not pl then
return {m={p2}, p={}, f={}, fp={}}
end
if not femenino or not f then
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={}, fp={}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={}, fp={}}
end
end
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
end
end
function export.flexionar_palabra(p, g, forzar_s)
local mf = g == "mf"
local no_s = not forzar_s
local es_monosilabo = find(p, "^"..CONS.."-[iuü]?[iu]?[aeiou][iu]?"..CONS.."-$")
local sin_tildes = not find(p, "[áéíóúÁÉÍÓÚ]")
local function rep_2_es(v, c) return "~"..quitar_tilde[v]..c.."es~" end
local function rep_2_a(v, c) return "~"..quitar_tilde[v]..c.."a~" end
local function rep_2_as(v, c) return "~"..quitar_tilde[v]..c.."as~" end
local function rep_2_es_yz_llana(v, r, c) return no_s and ("~"..v..r..(c == "z" and "c" or c).."es~") or ("#"..(c == "y" and quitar_tilde[v] or v)..r..(c == "y" and "i" or c).."s#") end
local function rep_2_es_yz_aguda(v, c) return no_s and ("~"..quitar_tilde[v]..(c == "z" and "c" or c).."es~") or ("#"..((c == "y" and not es_monosilabo) and agregar_tilde[v] or v)..(c == "y" and "i" or c).."s#") end
local function rep_2_es_yz_aguda_tilde(v, c) return no_s and ("~"..v..(c == "z" and "c" or c).."es~") or ("#"..v..(c == "y" and "i" or c).."s#") end
local function rep_2_es_n_tilde(v, c) return no_s and "~"..agregar_tilde[v]..c.."es~" or "#"..v..c.."s#" end
local changed = -- vocal
try(p, sin_tildes and "ote$" or "^%A$", "otes", "ota", "otas", nil, mf)
or try(p, sin_tildes and "ete$" or "^%A$", "etes", "eta", "etas", nil, mf)
or try(p, "o$", "os", "a", "as", nil, mf)
or try(p, "[íú]$", "%0s", nil, nil, no_s and "%0es" or nil)
or try(p, VOCAL.."$", "%0s")
-- doble consonante
or try(p, "ch$", no_s and "%0es" or "#%0s#")
or try(p, "("..CONS..")y$", "%1is")
or try(p, "[sz]"..CONS.."$", nil)
or try(p, CONS.."[sz]$", nil)
or try(p, CONS..CONS.."$", "%0s")
-- vocal + consonante
or try(p, es_monosilabo and "[ns]$" or "^%A$", no_s and "%0es" or "#%0s#", "%0a", "%0as", nil, mf) -- monosilabo en n o s
or try(p, sin_tildes and "x$" or "^%A$", no_s and "%0es" or "#%0s#") -- monosilabo o aguda en x
or try(p, "[aeo]h?[íú][nsx]$", no_s and "%0es" or "#%0s#", "%0a", "%0as", nil, mf) -- aguda en n o s (hiato final)
or try(p, "([áéó])([iuü][nsx])$", rep_2_es, rep_2_a, rep_2_as, nil, mf) -- aguda en n o s (diptongo final)
or try(p, "([áéíóú])([nsx])$", rep_2_es, rep_2_a, rep_2_as, nil, mf) -- aguda en n o s
or try(p, sin_tildes and "([aeo])(h?[iuü]?h?[iuü]?h?[aeo][iuü]?h?n)$" or "^%A$", rep_2_es_n_tilde) -- llana en n (hiato entre dos vocales abiertas)
or try(p, "([íú])(h?[iuü]?h?[aeiou]h?[iuü]?h?n)$" or "^%A$", rep_2_es_n_tilde) -- llana en n (hiato decreciente)
or try(p, sin_tildes and "([aeo])(h?[iuü]h?[iuü]?h?[aeiou][iuü]?h?n)" or "^%A$", rep_2_es_n_tilde) -- llana en n (diptongo con sílaba anterior, muy raro)
or try(p, sin_tildes and "([aeiou])(h?[iuü]?h?"..CONS_SALVO_H.."+h?u?[iuü]?h?[aeiou][iuü]?h?n)$" or "^%A$", rep_2_es_n_tilde) -- llana en n (con consonante de separacion)
or try(p, "(["..vocal_tilde.."])(h?[iuü]?h?"..CONS_SALVO_H.."+h?u?[iuü]?h?[aeiou][iuü]?h?n)$", rep_2_es_n_tilde) -- llana en n (con consonante de separacion)
or try(p, "[nsx]$", nil) -- esdrújulas en n, llanas/esdrújulas en x o s
or try(p, sin_tildes and "o[lr]$" or "^%A$", no_s and "%0es" or "#%0s#", "%0a", "%0as", nil, mf) -- -ol, -or (agudo)
or try(p, sin_tildes and "uz$" or "^%A$", "uces", "uza", "%uzas", nil, mf) -- -uz [[andaluz]], [[marfuz]] (REVISAR)
or try(p, "([aeo]h?)úz$", "%1úces", "%1úza", "%1úzas", nil, mf) -- -uz (REVISAR)
or try(p, "úz$", "uces", "uza", "uzas", nil, mf) -- -uz (REVISAR)
or try(p, "([aeo]h?[íú])([lrdjyzñ])$", rep_2_es_yz_aguda_tilde) -- agudas en [lrdjyzñ] (hiatos finales), [[cahíz]]
or try(p, sin_tildes and "("..VOCAL..")([lrdjyzñ])$" or "^%A$", rep_2_es_yz_aguda) -- agudas en [lrdjyzñ]
or try(p, "(["..vocal_tilde.."])([lrdjyzñ])$", rep_2_es_yz_aguda) -- agudas en [lrdjyzñ] (grafías anticuadas)
or try(p, "([áéó])(h?[iuü]?h?[aeiou][iuü]?)([lrdjyzñ])$", rep_2_es_yz_llana) -- llanas en [lrdjyzñ] (hiato entre vocales)
or try(p, "([íú])(h?[iuü]?h?[aeiou][iuü]?)([lrdjyzñ])$", rep_2_es_yz_llana) -- llanas en [lrdjyzñ] (hiato entre vocales 2)
or try(p, "([áéó])(h?[iuü]h?[iuü]?h?[aeiou][iuü]?h?)([lrdjyzñ])", rep_2_es_yz_llana) -- llanas en [lrdjyzñ] (diptongo con sílaba anterior, muy raro)
or try(p, "([áéó])(h?[iuü]?h?"..CONS_SALVO_H.."+h?u?[iuü]?h?[aeiou][iuü]?)([lrdjyzñ])$", rep_2_es_yz_llana) -- llanas en [lrdjyzñ] (con consonante de separación y diptongo)
or try(p, "([áéíóú])(h?"..CONS_SALVO_H.."+h?u?[iuü]?h?[aeiou][iuü]?)([lrdjyzñ])$", rep_2_es_yz_llana) -- llanas en [lrdjyzñ] (con consonante de separación)
or try(p, "[lrdjyzñ]$", nil) -- esdrújulas en [lrdjyzñ]
or try(p, CONS.."$", "%0s")
assert(changed, "No se pudo determinar la flexión de la palabra")
return changed
end
function export.flexion_sust_adj(palabras, g, forzar_s, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = export.flexionar_palabra(a, g, forzar_s)
local flex2 = copulativa and export.flexionar_palabra(b, g, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = export.flexionar_palabra(p, g, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = export.flexion_sust_adj(title, modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "ES:Locuciones sustantivas" or "ES:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "ES:Locuciones adjetivas" or "ES:Adjetivos")
end
local YO, TU, VOS, EL, NOSOTROS, VOSOTROS, ELLOS = 1, 2, 3, 4, 5, 6, 7
local tostr = {"1", "2", "3", "4", "5", "6", "7"}
local PRONOMBRES = {"yo", "tú", "vos", "él, ella, usted", "nosotros", "vosotros", "ustedes, ellos"}
local PRONOMBRES_SUBJ = {"que yo", "que tú", "que vos", "que él, que ella, que usted", "que nosotros", "que vosotros", "que ustedes, que ellos"}
local PRONOMBRES_IMP = {"―", "(tú)", "(vos)", "(usted)", "(nosotros)", "(vosotros)", "(ustedes)"}
local IMPERSONALES = {"", "", "", "(ello)", "", "", "(ellos)"}
local IMPERSONALES_SUBJ = {"", "", "", "(que ello)", "", "", "(que ellos)"}
local REFLEXIVOS = {"me", "te", "te", "se", "nos", "os", "se"}
local function obtener_pronombre(forma, impers, indirecto)
if indirecto then
return nil
end
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_pluperf"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
["subj_fut_comp"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local sufijos = {
{
["ger"] = {"ando"},
["part"] = {"ado"},
["ind_pres"] = {"o", "as", "ás", "a", "amos", "áis", "an"},
["ind_imp"] = {"aba", "abas", "abas", "aba", "ábamos", "abais", "aban"},
["ind_perf"] = {"é", "aste", "aste", "ó", "amos", "asteis", "aron"},
["ind_perf_alt"] = {"é", "aste", "aste", "ó", "amos", "asteis", "aron"},
["ind_fut"] = {"aré", "arás", "arás", "ará", "aremos", "aréis", "arán"},
["subj_pres"] = {"e", "es", "és", "e", "emos", "éis", "en"},
["subj_imp"] = {"ara", "aras", "aras", "ara", "áramos", "arais", "aran",
"ase", "ases", "ases", "ase", "ásemos", "aseis", "asen"},
["subj_fut"] = {"are", "ares", "ares", "are", "áremos", "areis", "aren"},
["cond"] = {"aría", "arías", "arías", "aría", "aríamos", "aríais", "arían"},
["imper"] = {"-", "a", "á", "e", "emos", "ad", "en"}
},
{
["ger"] = {"iendo"},
["part"] = {"ido"},
["ind_pres"] = {"o", "es", "és", "e", "emos", "éis", "en"},
["ind_imp"] = {"ía", "ías", "ías", "ía", "íamos", "íais", "ían"},
["ind_perf"] = {"í", "iste", "iste", "ió", "imos", "isteis", "ieron"},
["ind_perf_alt"] = {"e", "iste", "iste", "o", "imos", "isteis", "ieron"},
["ind_fut"] = {"eré", "erás", "erás", "erá", "eremos", "eréis", "erán"},
["subj_pres"] = {"a", "as", "ás", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "ieras", "iera", "iéramos", "ierais", "ieran",
"iese", "ieses", "ieses", "iese", "iésemos", "ieseis", "iesen"},
["subj_fut"] = {"iere", "ieres", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"ería", "erías", "erías", "ería", "eríamos", "eríais", "erían"},
["imper"] = {"-", "e", "é", "a", "amos", "ed", "an"}
},
{
["ger"] = {"iendo"},
["part"] = {"ido"},
["ind_pres"] = {"o", "es", "ís", "e", "imos", "ís", "en"},
["ind_imp"] = {"ía", "ías", "ías", "ía", "íamos", "íais", "ían"},
["ind_perf"] = {"í", "iste", "iste", "ió", "imos", "isteis", "ieron"},
["ind_perf_alt"] = {"e", "iste", "iste", "o", "imos", "isteis", "ieron"},
["ind_fut"] = {"iré", "irás", "irás", "irá", "iremos", "iréis", "irán"},
["subj_pres"] = {"a", "as", "ás", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "ieras", "iera", "iéramos", "ierais", "ieran",
"iese", "ieses", "ieses", "iese", "iésemos", "ieseis", "iesen"},
["subj_fut"] = {"iere", "ieres", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"iría", "irías", "irías", "iría", "iríamos", "iríais", "irían"},
["imper"] = {"-", "e", "í", "a", "amos", "id", "an"}
},
}
local auxiliar = {
["inf_comp"] = {"haber"},
["ger_comp"] = {"habiendo"},
["ind_perf_comp"] = {"he", "has", "has", "ha", "hemos", "habéis", "han"},
["ind_pluperf"] = {"había", "habías", "habías", "había", "habíamos", "habíais", "habían"},
["ind_anter"] = {"hube", "hubiste", "hubiste", "hubo", "hubimos", "hubisteis", "hubieron"},
["ind_fut_comp"] = {"habré", "habrás", "habrás", "habrá", "habremos", "habréis", "habrán"},
["cond_comp"] = {"habría", "habrías", "habrías", "habría", "habríamos", "habríais", "habrían"},
["subj_perf"] = {"haya", "hayas", "hayas", "haya", "hayamos", "hayáis", "hayan"},
["subj_pluperf"] = {"hubiera", "hubieras", "hubieras", "hubiera", "hubiéramos", "hubierais", "hubieran",
"hubiese", "hubieses", "hubieses", "hubiese", "hubiésemos", "hubieseis", "hubiesen"},
["subj_fut_comp"] = {"hubiere", "hubieres", "hubieres", "hubiere", "hubiéremos", "hubiereis", "hubieren"}
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "ar" then
return sufijos[1][forma]
elseif sufijo_inf == "er" then
return sufijos[2][forma]
else
return sufijos[3][forma]
end
end
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if find(sufijo, "^[eéií]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "z" then
return "~c~"..sufijo
end
if nexo == "gu" then
return "g~ü~"..sufijo
end
end
local _, cnt = gsub(sufijo, "[aeiou]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
if nexo == "cu" then
return sub(nexo, -2, -2).."~ú~"..sufijo, nexo..sufijo -- es llana y entonces lleva tilde
end
if nexo == "u" then
return "~ú~"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "U" then
return "#u#"..sufijo -- [[estatuar]]
end
if nexo == "i" then
return "#í#"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "I" then
return "#e#"..sufijo -- es llana y entonces la sinéresis de la i se pierde
end
end
if find(sufijo, "^ar") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
else -- ER/IR/ÍR
if find(sufijo, "^[aáoóuú]") then
if nexo == "c" then
return "~z~"..sufijo
end
if nexo == "S" then -- mecer
return "#z#"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
if nexo == "gu" then
return "g~"..sufijo.."~"
end
if nexo == "qu" then
return "~c~"..sufijo
end
if nexo == "C" then
return "~zc~"..sufijo
end
end
if find(sufijo, "^[aeoáéó]") then
if nexo == "gü" then
return "g~uy~"..sufijo
end
if nexo == "u" then
return "u~y~"..sufijo
end
end
if find(sufijo, "^i[aeoáéó]") then
if (nexo == "ñ" or nexo == "ll") then
return "~"..nexo..sub(sufijo, 2).."~"
end
if nexo == "gü" then
return "g~uy~"..sub(sufijo, 2)
end
if nexo == "u" then
return "u~y~"..sub(sufijo, 2)
end
if nexo == "e" then
return nexo.."~y~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[^aeiouáéíóú]") then
if nexo == "e" then
return nexo.."~í~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[eé]") then
if find(nexo, "u#$") then -- ir --> fuera (subj)
return nexo..sub(sufijo, 2)
end
if nexo == "#j#" or nexo == "~j~" then
return nexo..sub(sufijo, 2)
end
end
if find(sufijo, "^í$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~e~"
end
end
if find(sufijo, "^ió$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~o~"
end
end
if find(sufijo, "^[ie]r") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
end
if nexo == "I" then
return "i"..sufijo -- sinéresis normal
end
if nexo == "U" then -- estatuar
return "u"..sufijo
end
if nexo == "C" then
return "c"..sufijo -- sin epéntesis
end
if nexo == "S" then -- mecer
return "c"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, nucleo_inf)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "[yi]$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif find(nucleo_, "^[^áéíóú]-[aeiou]h?$") and find(nexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleo_, "[^gq][aeiou]$") and find(nexosufijo_, "^i[aeiouáéíóú]") then -- se junta [aeiou]i[aeiouáéíóú] -> cambio a y (creYO) PERO [[chinguiar]] -> chinguIando
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~y~")
elseif find(nucleo_, "[aeiou]$") and find(nexosufijo_, "^id$") then -- reír -> reÍd, embaír -> embaÍd
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~í~")
elseif find(nucleo_, "^[^aeiouáéíóú]+$")
and (find(nexosufijo_, "^"..CONS.."?"..CONS.."?".."[iuü]?[áéó][iuü]?[ns]?$") or find(nexosufijo_, "^[íú][ns]?$")) then -- caso de dar, vos *d+ás, debo quitar la tilde
return nucleo..gsub1(nexosufijo, "[áéíóú]", function(v) return "~"..quitar_tilde[v].."~" end)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
local prefijo_ = gsub(prefijo, "[~#]", "")
local nucleonexosufijo_ = gsub(nucleonexosufijo, "[~#]", "")
if prefijo_ and find(prefijo_, "[aeiou]") and not find(prefijo_, "[áéíóú]") then
if find(prefijo_, "^[^áéíóú]-[aeiou]h?$") and find(nucleonexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- nucleonexosufijo con i/u tónica (rehacer -> rehíce)
return prefijo..gsub1(nucleonexosufijo, "^([~#]?h?[~#]?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleonexosufijo_, "^("..CONS.."*[iuü]?)([aeiou])([iuü]?[ns]?)$") then -- monosílabo: prever --> prevén
return prefijo..gsub1(nucleonexosufijo, "^([~#]?"..CONS.."*[~#]?[iuü]?[~#]?)([aeiou])([~#]?[iuü]?[~#]?[ns]?[~#]?)$", function(a, b, c) return a..agregar_tilde[b]..c end) -- ven --> prevén
end
end
return prefijo..nucleonexosufijo
end
local paradigmas_regulares = {
["ar"] = {
{"anunciar", {"iar$"}, { --necesidad de explicitar el diptongo, aunque esta variante es la que consideramos como la regular
}},
{"evacuar", {"cuar$"}, {
nexo = "cu"
}},
{"averiguar", {"guar$"}, {
nexo = "gu"
}},
{"complicar", {"car$"}, {
nexo = "c"
}},
{"llegar", {"gar$"}, {
nexo = "g"
}},
{"actuar", {"uar$"}, {
nexo = "u"
}},
{"realizar", {"zar$"}, {
nexo = "z"
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"ller", {"ller$"}, { -- Existe esto??
nexo = "ll"
}},
{"guer", {"guer$"}, { -- Existe esto??
nexo = "gu"
}},
{"güer", {"güer$"}, { -- Existe esto??
nexo = "gü"
}},
{"quer", {"quer$"}, { -- Existe esto??
nexo = "qu"
}},
{"parecer", {"[aeiou]cer$"}, {
nexo = "C"
}},
{"vencer", {"[^aeious]cer$"}, { -- los verbos en -scer NO entran en este paradigma (ver fosforescer o evanescer)
nexo = "c"
}},
{"leer", {"eer$"}, {
nexo = "e"
}},
{"proteger", {"ger$"}, {
nexo = "g"
}},
{"atañer", {"ñer$"}, {
nexo = "ñ"
}},
{"uer", {"uer$"}, { -- Existe esto??
nexo = "u"
}},
{"temer", {"er$"}, {
}},
},
["ir"] = {
{"escabullir", {"llir$"}, {
nexo = "ll"
}},
{"distinguir", {"guir$"}, {
nexo = "gu"
}},
{"argüir", {"güir$"}, {
nexo = "gü"
}},
{"delinquir", {"quir$"}, {
nexo = "qu"
}},
{"lucir", {"[aeiou]cir$"}, {
nexo = "C"
}},
{"fruncir", {"[^aeious]cir$"}, {
nexo = "c"
}},
{"dirigir", {"gir$"}, {
nexo = "g"
}},
{"gruñir", {"ñir$"}, {
nexo = "ñ"
}},
{"construir", {"uir$"}, {
nexo = "u"
}},
{"partir", {"ir$"}, {
}},
},
["ír"] = {
{"reír", {"eír$"}, {
nucleo = "e",
alt = {"í-i"},
}},
{"embaír", {"ír$"}, {
}},
}
}
local paradigmas_irregulares = {
["ar"] = {
{"andar", {"^d?e?s?andar$"}, { -- cuidado con mandar
nucleo = "and",
ind_perf = {{"anduve", "andé{x}"}, {"anduviste", "andaste{x}"}, {"anduviste", "andaste{x}"}, {"anduvo", "andó{x}"}, {"anduvimos", "andamos{x}"}, {"anduvisteis", "andasteis{x}"}, {"anduvieron", "andaron{x}"}},
subj_imp = {nucleo = "anduv"},
subj_fut = {nucleo = "anduv"}
}},
{"dar", {"^d?e?s?dar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"doy"}},
ind_perf = {sufijo_inf = "er"},
subj_pres = {{"dé"}, nil, nil, {"dé"}},
subj_imp = {sufijo_inf = "er"},
subj_fut = {sufijo_inf = "er"},
imper = {nil, nil, nil, {"dé"}}
}},
{"errar", {"^errar$"}, {
nucleo = "err",
alt = {"ye", "REG"},
}},
{"estar", {"^estar$"}, {
ind_pres = {{"estoy"}, {"estás"}, nil, {"está"}, nil, nil, {"están"}},
ind_perf = {nucleo = "estuv"},
subj_pres = {{"esté"}, {"estés"}, {"estés"}, {"esté"}, nil, nil, {"estén"}},
subj_imp = {nucleo = "estuv"},
subj_fut = {nucleo = "estuv"},
imper = {nil, {"está"}, nil, {"esté"}, nil, nil, {"estén"}}
}},
{"estatuar", {"estatuar$"}, {
nexo = "U"
}},
{"inhestar", {"inhestar$"}, {
alt = {"ie"},
part = {"inhiesto"}
}},
{"tar", {"^tar$"}, {
ind_pres = {{"toy"}},
ind_perf = {nucleo = "tuv"},
subj_pres = {{"té"}, nil, nil, {"té"}},
subj_imp = {nucleo = "tuv"},
subj_fut = {nucleo = "tuv"},
imper = {nil, nil, nil, {"té"}, nil, nil, nil}
}},
{"enviar", {"enviar$"}, {
nexo = "i",
}},
{"culiar", {"culiar$"}, {
nexo = "I"
}},
{"aislar", {"aislar$"}, {
alt = {"í"}
}},
{"agorar", {"agorar$"}, {
alt = {"üe"}
}},
{"aunar", {"^aunar$"}, {
alt = {"ú"}
}},
{"contar", {"contar$"}, {
alt = {"ue"}
}},
{"pensar", {"^pensar$"}, { -- no puede ir compensar
alt = {"ie"}
}},
},
["er"] = {
{"caber", {"^caber$"}, {
ind_pres = {{"quepo"}},
ind_fut = {nucleo = "ca", nexo = "#br#"},
ind_perf = {nucleo = "cup"},
subj_pres = {nucleo = "quep"},
subj_imp = {nucleo = "cup"},
subj_fut = {nucleo = "cup"},
cond = {nucleo = "ca", nexo = "#br#"},
imper = {nil, nil, nil, {"quepa"}, {"quepamos"}, nil, {"quepan"}}
}},
{"caer", {"caer$"}, {
nucleo = "ca",
ind_pres = {{"caigo"}},
subj_pres = {nucleo = "caig"},
imper = {nil, nil, nil, {"caiga"}, {"caigamos"}, nil, {"caigan"}}
}},
{"cocer", {"cocer$"}, {
nucleo = "co",
nexo = "S", -- evitar C (epéntesis con zc)
alt = {"ue"},
part = {"cocido", "cocho{†}"}
}},
{"hacer", {"[hfj]acer$"}, {
nucleo = "a",
nexo = "S", -- evitar C (epéntesis con zc)
part = {"echo"},
ind_pres = {{"ago"}},
ind_perf = {nucleo = "i"},
ind_fut = {nucleo = "a", nexo = "#r#"},
subj_pres = {nucleo = "ag", nexo = ""},
subj_imp = {nucleo = "i"},
subj_fut = {nucleo = "i"},
cond = {nucleo = "a", nexo = "#r#"},
imper = {nil, {"az", "ace{x}"}, {"acé"}, {"aga"}, {"agamos"}, nil, {"agan"}},
}},
{"haber", {"^haber$"}, {
ind_pres = {{"he"}, {"has"}, {"has"}, {"ha", "hay{IMPERSONAL}"}, {"hemos", "habemos{x}"}, nil, {"han"}, {"hay"}},
ind_perf = {nucleo = "hub"},
ind_fut = {nucleo = "ha", nexo = "#br#"},
subj_pres = {nucleo = "hay"},
subj_imp = {nucleo = "hub"},
subj_fut = {nucleo = "hub"},
cond = {nucleo = "ha", nexo = "#br#"},
imper = {nil, {"he{†}", "habe{†}"}, {"he{†}", "habe{†}"}, {"haya{†}"}, {"hayamos{†}"}, nil, {"hayan{†}"}},
}},
{"mecer", {"^r?e?mecer$"}, {
nexo = "S", -- evitar C (epéntesis con zc)
}},
{"oler", {"^oler$"}, {
alt = {"hue"},
}},
{"volver", {"olver$"}, {
nucleo = "olv",
alt = {"ue"},
part = {"uelto"}
}},
{"placer", {"placer$"}, {
nucleo = "pla",
ind_perf = {nil, nil, nil, {"plació", "plugo"}, nil, nil, {"placieron", "pluguieron"}},
subj_imp = {nil, nil, nil, {"placiera", "placiese", "pluguiera", "pluguiese"}, nil, nil, nil},
subj_fut = {nil, nil, nil, {"placiere", "pluguiere"}, nil, nil, nil},
}},
{"poder", {"poder$"}, {
nucleo = "pod",
alt = {"ue"},
ger = {"pudiendo"},
ind_perf = {nucleo = "pud"},
ind_fut = {nucleo = "po", nexo = "#dr#"},
subj_imp = {nucleo = "pud"},
subj_fut = {nucleo = "pud"},
cond = {nucleo = "po", nexo = "#dr#"},
}},
{"poner", {"poner$"}, {
nucleo = "pon",
part = {"puesto"},
ind_pres = {{"pongo"}},
ind_perf = {nucleo = "pus"},
ind_fut = {nucleo = "pon", nexo = "#dr#"},
subj_pres = {nucleo = "pong"},
subj_imp = {nucleo = "pus"},
subj_fut = {nucleo = "pus"},
cond = {nucleo = "pon", nexo = "#dr#"},
imper = {nil, {"pon", "pone{x}"}, nil, {"ponga"}, {"pongamos"}, nil, {"pongan"}},
}},
{"proveer", {"proveer$"}, {
nucleo = "prov",
part = {"provisto", "proveído{†}"}
}},
{"querer", {"querer$"}, {
nucleo = "quer",
alt = {"ie"},
ind_perf = {nucleo = "quis"},
ind_fut = {nucleo = "que", nexo = "#rr#"},
subj_imp = {nucleo = "quis"},
subj_fut = {nucleo = "quis"},
cond = {nucleo = "que", nexo = "#rr#"},
}},
{"raer", {"^raer$"}, { -- no contraer, etc.
ind_pres = {{"raigo", "rayo"}},
subj_pres = {nucleo = {"raig", "ray"}},
imper = {nil, nil, nil, {"raiga", "raya"}, {"raigamos", "rayamos"}, nil, {"raigan", "rayan"}}
}},
{"roer", {"roer$"}, {
nucleo = "ro",
ind_pres = {{"roo", "roigo", "royo"}},
subj_pres = {nucleo = {"ro", "roig", "roy"}},
imper = {nil, nil, nil, {"roa", "roiga", "roya"}, {"roamos", "roigamos", "royamos"}, nil, {"roan", "roigan", "royan"}}
}},
{"romper", {"^romper$", "^arromper$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
part = {"roto", "rompido{†}"}
}},
{"saber", {"saber$"}, {
nucleo = "sab",
ind_pres = {{"sé", "sabo{x}"}},
ind_perf = {nucleo = "sup"},
ind_fut = {nucleo = "sa", nexo = "#br#"},
subj_pres = {nucleo = "sep"},
subj_imp = {nucleo = "sup"},
subj_fut = {nucleo = "sup"},
cond = {nucleo = "sa", nexo = "#br#"},
imper = {nil, nil, nil, {"sepa"}, {"sepamos"}, nil, {"sepan"}}
}},
{"ser", {"^ser$"}, {
ind_pres = {{"soy"}, {"eres"}, {"sos"}, {"es"}, {"somos"}, {"sois", "ereis{†}"}, {"son"}},
ind_imp = {{"era"}, {"eras"}, {"eras"}, {"era"}, {"éramos"}, {"erais"}, {"eran"}},
ind_perf = {{"fui"}, {"fuiste"}, {"fuiste"}, {"fue"}, {"fuimos"}, {"fuisteis"}, {"fueron"}},
subj_pres = {nucleo = "se"},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {nucleo = "", nexo = "#fu#"},
imper = {nil, {"sé"}, {"sé"}, {"sea"}, {"seamos"}, nil, {"sean"}}
}},
{"seer", {"^seer$", "^eser$"}, {
prefijo = "",
nucleo = "s",
ind_pres = {{"só", "seo"}, {"sees", "siedes"}, {"sos", "sodes"}, {"siede"}, {"sedemos"}, {"seedes", "sodes"}, {"seyen", "sieden"}},
ind_imp = {{"era"}, {"eras"}, {"eras"}, {"era"}, {"éramos"}, {"érades"}, {"eran"}},
ind_perf = {{"fu", "fué"}, {"fueste", "fuste"}, {"fuestes", "fuistes"}, {"fo", "foé", "suvo"}, {"fuemos"}, {"fuestes", "fuistes"}, {"foron"}},
ind_fut = {nil, nil, {"seredes"}, nil, nil, {"seredes"}, nil},
cond = {nil, nil, {"seríades"}, nil, nil, {"seríades"}, nil},
subj_pres = {nil, nil, {"seades"}, nil, nil, {"seades"}, nil},
subj_imp = {nucleo = "", nexo = "#fu#", nil, nil, {"fuérades"}, nil, nil, {"fuérades"}, nil}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {nucleo = "", nexo = "#fu#", nil, nil, {"fuéredes"}, nil, nil, {"fuéredes"}, nil},
imper = {nil, {"sé"}, {"seades"}, {"sea"}, {"seamos"}, {"seades"}, {"sean"}}
}},
{"tener", {"tener$"}, {
nucleo = "ten",
alt = {"ie"},
ind_pres = {{"tengo"}},
ind_perf = {nucleo = "tuv"},
ind_fut = {nucleo = "ten", nexo = "#dr#"},
subj_pres = {nucleo = "teng"},
subj_imp = {nucleo = "tuv"},
subj_fut = {nucleo = "tuv"},
cond = {nucleo = "ten", nexo = "#dr#"},
imper = {nil, {"ten", "tiene{x}"}, nil, {"tenga"}, {"tengamos"}, nil, {"tengan"}}
}},
{"traer", {"traer$"}, {
nucleo = "tra",
ind_pres = {{"traigo"}},
ind_perf = {nucleo = "tra", nexo = "#j#"},
subj_pres = {nucleo = "traig"},
subj_imp = {nucleo = "tra", nexo = "#j#"},
subj_fut = {nucleo = "tra", nexo = "#j#"},
imper = {nil, nil, nil, {"traiga"}, {"traigamos"}, nil, {"traigan"}}
}},
{"valer", {"valer$"}, {
nucleo = "val",
ind_pres = {{"valgo"}},
ind_fut = {nucleo = "val", nexo = "#dr#"},
subj_pres = {nucleo = "valg"},
cond = {nucleo = "val", nexo = "#dr#"},
imper = {nil, nil, nil, {"valga"}, {"valgamos"}, nil, {"valgan"}}
}},
{"ver", {"^ver$"}, {
nucleo = "v",
part = {"visto"},
ind_pres = {{"veo"}},
ind_imp = {nucleo = "ve"},
subj_pres = {nucleo = "ve"},
imper = {nil, nil, {"mirá"}, {"vea"}, {"veamos"}, nil, {"vean"}}
}},
{"prever", {"antever$", "entrever$", "prever$", "^rever$", "tran?sver$"}, {
nucleo = "v",
part = {"visto"},
ind_pres = {{"veo"}, {"vés"}, nil, {"vé"}, nil, nil, {"vén"}},
ind_imp = {nucleo = "ve"},
subj_pres = {nucleo = "ve"},
imper = {nil, nil, nil, {"vea"}, {"veamos"}, nil, {"vean"}}
}},
{"yacer", {"yacer$"}, {
nucleo = "yac",
nexo = "", -- evitar C (epéntesis con zc), lo voy a agregar manual
ind_pres = {{"yazco", "yazgo", "yago"}},
subj_pres = {nucleo = {"yazc", "yazg", "yag"}},
imper = {nil, {"yace", "yaz"}, {"yacé"}, {"yazca", "yazga", "yaga"}, {"yazcamos", "yazgamos", "yagamos"}, nil, {"yazcan", "yazgan", "yagan"}}
}},
{"mover", {"mover$"}, {
alt = {"ue"},
}},
{"entender", {"entender$"}, {
alt = {"ie"},
}},
},
["ir"] = {
{"asir", {"asir$"}, {
nucleo = "as",
ind_pres = {{"asgo"}},
subj_pres = {nucleo = "asg"},
imper = {nil, nil, nil, {"asga"}, {"asgamos"}, nil, {"asgan"}}
}},
{"abrir", {"[^js]abrir$", "^abrir$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"abierto"}
}},
{"abrir", {"ubrir$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "ubr",
part = {"ubierto"}
}},
-- para decir contemplo 4 casos:
-- 1. decir, redecir, entredecir, antedecir: lo normal, con el imperativo en "dí" (di)
-- 2. interdecir: similar a 1. pero el imperativo es interdice (no *interdí)
-- 3. bendecir, maldecir: agrego bendito, maldito al pp
-- 4. condecir, contradecir, desdecir, predecir: parto de 1 pero agrego el futuro regular que esta aceptado
{"decir", {"^decir$", "^redecir$", "^entredecir$", "^antedecir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dicho"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = "d", nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
subj_fut = {nexo = "#j#"},
cond = {nucleo = "d", nexo=""},
imper = {nil, {"di", "dice{x}"}, nil, {"diga"}, {"digamos"}, nil, {"digan"}}
}},
{"interdecir", {"interdecir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dicho"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = "d", nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
subj_fut = {nexo = "#j#"},
cond = {nucleo = "d", nexo=""},
imper = {nil, {"dice"}, nil, {"diga"}, {"digamos"}, nil, {"digan"}}
}},
{"bendecir", {"bendecir$", "maldecir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"decido{PART}", "dito{ADJ}"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
subj_fut = {nexo = "#j#"},
imper = {nil, {"dice"}, nil, {"diga"}, {"digamos"}, nil, {"digan"}}
}},
{"predecir", {"decir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dicho"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = {"dec", "d"}, nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
subj_fut = {nexo = "#j#"},
cond = {nucleo = {"dec", "d"}, nexo=""},
imper = {nil, {"dice", "dí{x}"}, nil, {"diga"}, {"digamos"}, nil, {"digan"}}
}},
{"erguir", {"^erguir$"}, {
nucleo = "er",
alt = {"ye-i", "i-i"},
}},
{"imprimir", {"imprimir$"}, {
nucleo = "imprim",
part = {"impreso{PART/ADJ}", "imprimido{PART}"}
}},
{"ir", {"^ir$"}, {
ger = {"yendo"},
ind_pres = {{"voy"}, {"vas"}, {"vas"}, {"va"}, {"vamos"}, {"vais"}, {"van"}},
ind_imp = {{"iba"}, {"ibas"}, {"ibas"}, {"iba"}, {"íbamos"}, {"ibais"}, {"iban"}},
ind_perf = {{"fui"}, {"fuiste"}, {"fuiste"}, {"fue"}, {"fuimos"}, {"fuisteis"}, {"fueron"}},
subj_pres = {nucleo = "vay"},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {nucleo = "", nexo = "#fu#"},
imper = {nil, {"ve", "ves{x}", "anda"}, {"andá", "i{x}"}, {"vaya"}, {"vayamos", "vamos"}, nil, {"vayan"}}
}},
{"morir", {"morir$"}, {
nucleo = "mor",
alt = {"ue-u"},
part = {"muerto"},
}},
{"pudrir", {"pudrir$"}, {
nucleo = "pudr",
part = {"podrido"}
}},
{"salir", {"salir$"}, {
nucleo = "sal",
ind_pres = {{"salgo"}},
ind_fut = {nucleo = "sal", nexo = "#dr#"},
subj_pres = {nucleo = "salg"},
cond = {nucleo = "sal", nexo = "#dr#"},
imper = {nil, {"sal", "sale{x}"}, nil, {"salga"}, {"salgamos"}, nil, {"salgan"}}
}},
{"escribir", {"^escribir$", "^reescribir$"}, {
nucleo = "escrib",
part = {"escrito"}
}},
{"inscribir", {"scribir$"}, {
nucleo = "scrib",
part = {"scrito", "scripto{ARG/URU}"}
}},
{"venir", {"venir$"}, {
nucleo = "ven",
alt = {"ie-i"},
ind_pres = {{"vengo"}},
ind_fut = {nexo = "#dr#"},
ind_perf = {nucleo = "vin"},
subj_pres = {nucleo = "veng"},
cond = {nexo = "#dr#"},
imper = {nil, {"ven", "viene{x}"}, nil, {"venga"}, {"vengamos"}, nil, {"vengan"}}
}},
{"discernir", {"discernir$"}, {
alt = {"ie"}
}},
{"sentir", {"sentir$"}, {
alt = {"ie-i"}
}},
{"podrir", {"podrir$"}, {
alt = {"u-u"},
}},
{"reunir", {"reunir$"}, {
alt = {"ú"}
}},
{"prohibir", {"prohibir$"}, {
alt = {"í"}
}},
{"rehenchir", {"rehenchir$"}, {
alt = {"í-i"}
}},
{"dormir", {"dormir$"}, {
alt = {"ue-u"}
}},
{"pedir", {"pedir$"}, { -- también ceñir (incluyo en este paradigma especificando el alt)
alt = {"i-i"}
}},
{"producir", {"ducir$"}, {
nucleo = "du",
ind_perf = {nexo = "#j#"},
subj_imp = {nexo = "#j#"},
subj_fut = {nexo = "#j#"}
}},
},
["ír"] = {
{"desvaír", {"desvaír$"}, { -- hay más verbos en -air? no podemos considerarlo como regla general
ind_pres = {{"desvayo"}},
subj_pres = {nucleo = "desvay"},
imper = {nil, nil, nil, {"desvaya"}, {"desvayamos"}, nil, {"desvayan"}}
}},
{"freír", {"freír$"}, {
nucleo = "fre",
part = {"frito{PART/ADJ}", "freído{PART}"},
}},
{"oír", {"oír$"}, {
nucleo = "o",
alt = {"oy"},
ger = {"oyendo"},
ind_pres = {{"oigo"}},
subj_pres = {nucleo = "oig"},
imper = {nil, nil, nil, {"oiga"}, {"oigamos"}, nil, {"oigan"}}
}},
},
}
local alt_info = {
["ar"] = {
["í"] = {"aislar", "i", "í"}, -- tb. descafeinar
["ú"] = {"aunar", "u", "ú"}, -- tb. rehusar
["ie"] = {"pensar", "e", "ie"},
["ue"] = {"contar", "ou", "ue"}, -- también jugar
["üe"] = {"agorar", "o", "üe"},
["hue"] = {"desosar", "ou", "hue"},
["ye"] = {"errar", "e", "ye"},
},
["er"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["ie"] = {"entender", "e", "ie"},
["ue"] = {"mover", "o", "ue"},
["hue"] = {"oler", "o", "hue"},
},
["ir"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["í"] = {"prohibir", "i", "í"},
["í-i"] = {"rehenchir", "e", "í", "i"},
["i-i"] = {"pedir", "e", "i", "i"},
["ie"] = {"discernir", "ei", "ie"}, -- por las dudas también la i, por inquirir
["ie-i"] = {"sentir", "ei", "ie", "i"}, -- inquirir
["u"] = {"???", "o", "u", "u"},
["ú"] = {"reunir", "u", "ú"},
["u-u"] = {"podrir", "o", "u", "u"}, -- REVISAR: existe esto??
["ue-u"] = {"dormir", "o", "ue", "u"},
["ye-i"] = {"erguir", "e", "ye", "i"},
},
["ír"] = {
["í-i"] = {"reír", "e", "í", "i"},
["oy"] = {"oír", "o", "oy", "oy"},
}
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
if sufijo_inf == "ar" and conjinfo[forma].nucleo then
sufijo_inf = "er" -- echo mano a los sufijos de la otra conjugación, más que nada aplica a verbos como andar -> ANDUViera
end
local sufijos_ = obtener_sufijos(sufijo_inf, (forma == "ind_perf" and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleos2
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos1}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleos1}
elseif forma == "subj_imp" or forma == "subj_fut" then
local n = conjinfo.nucleos2
nucleos = {n, n, n, n, n, n, n}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for j, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[1], sufijo_inf)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
end
return
end
for i = YO, ELLOS do
local p = tostr[i]
if conjinfo[forma][i] then
for j, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
if forma == "subj_pres" and i == VOS then
for _,fm in ipairs(conjugado[forma..tostr[TU]]) do
insert_if_not(conjugado[forma..p], fm)
end
end
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[i], sufijo_inf)
for _,nucleo in ipairs(nucleos[i]) do
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
if forma == "subj_imp" then
local nexosufijo3, _ = combinar_nexo_sufijo(nexo, sufijos_[i+7], sufijo_inf)
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo3, conjinfo.nucleo_inf[1])))
end
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest_ = i < NOSOTROS and resto or resto_pl
local rest_pl_ = resto_pl
if tiempo == "imper" and adv == "no " then
tiempo = "subj_pres"
arr = fmtinfo["subj_pres"..tostr[i]]
end
for _, v in ipairs(arr) do
local hs = auxiliar[tiempo]
local v2
local rest = rest_
local rest_pl = rest_pl_
if hs then
rest = " "..v..rest
rest_pl = " "..v..rest_pl
v = hs[i]
v2 = hs[i+7] -- subjuntivo imperfecto
end
if forma == "inf" or forma == "inf_comp" then
if pron ~= "" and art ~= "" then
v = gsub(v, "([aei])r$", function (x) return agregar_tilde[x].."r" end)
end
insert(t, adv..v..pron..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..v..pron..art..f_links(rest_pl))
end
elseif forma == "ger" or forma == "ger_comp" then
local vpron = v..pron
if pron ~= "" or art ~= "" then
vpron = gsub(vpron, "^(.*)([ae])(ndo)", function(x, y, z) return x..agregar_tilde[y]..z end)
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..f(vpron)..art..f_links(rest_pl))
end
elseif forma == "part" then
insert(t, adv..f_links(v)..f_links(resto))
if (resto_pl ~= resto) then
insert(t, adv..f_links(v)..f_links(resto_pl))
end
elseif tiempo == "imper" and (pron ~= "" or art ~= "") then
-- tengo que correr la acentuación una sílaba para atrás, lo bueno es que no hay formas terminadas en consonante dist. de n o s
local vpron = gsub(v, "[~#]", "") -- PARCHE: quito todas las marcas de colores, ya que cuesta mucho transformar los verbos con imperativos irregulares, quedan incrustadas en el medio
-- 1. Las llanas pasan a esdrújulas
vpron = gsub(vpron,
"^([^áéíóú]-)([aeo])(h?[iuü]?h?[aeo][ns]?)$", -- si no hay consonante de separación, hay un hiato de dos vocales abiertas. OJO, no es lo mismo comenzar con [^áéíóú]- que comenzar con [^áéíóú]*
function(x, y, z) return x..agregar_tilde[y]..z end
)
vpron = gsub(vpron,
"^([^áéíóú]-)([aeoiu])(h?[iuü]?"..CONS_SALVO_H.."+u?[iuü]?[aeiou]+[ns]?)$", -- normal, con consonante de separación. OJO, no es lo mismo comenzar con [^áéíóú]- que comenzar con [^áéíóú]*
function(x, y, z) return x..agregar_tilde[y]..z end
)
-- si es un hiato con tilde, lo dejo
-- 2. Las agudas pasan a llanas, los monosílabos con tilde la pierden, SALVO LOS HIATOS CON VOCAL CERRADA (ej: reí -> reíte. embaí -> embaíte, PERO pecheá -> pecheala)
vpron = gsub(vpron,
"^([^áéíóú]*"..CONS_SALVO_H.."u?[iuü]?)([áéíóú])([ns]?)$",
function(x, y, z) return x..quitar_tilde[y]..z end
)
vpron = gsub(vpron,
"^([^áéíóú]*[aeo])([áéó])([ns]?)$",
function(x, y, z) return x..quitar_tilde[y]..z end
)
if pron == "se" then -- ajustes finales https://www.rae.es/dpd/pronombres%20personales%20%C3%A1tonos
local enc = REFLEXIVOS[i]
if enc == "nos" then -- dejémoS nos -> dejémonos
vpron = gsub(vpron, "mos$", "mo")
end
if enc == "os" then -- amaD + os -> amaos, hacED + os -> haceos, salvo idos
vpron = gsub(vpron, "([ae])d$", "%1")
vpron = gsub(vpron, "("..LETRA..")[ií]d$", "%1í") -- aseguro q no sea "id" a secas
end
if art ~= "" then -- Si tengo pronombre y artículo, la palabra tiene que quedar esdrújula o sobreesdrújula (dársela -> dátela)
vpron = gsub(vpron,
"^([^áéíóú]*)([aeiou])([^áéíóú]-)$",
function(x, y, z) return x..agregar_tilde[y]..z end
)
end
vpron = vpron..enc
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
else -- si es imperativo y el pronombre y artículo están ambos vacíos, es lo mismo anteponerlos que posponerlos
local pronart = pron == "se" and REFLEXIVOS[i].." " or ""
pronart = art ~= "" and pronart..art.." " or pronart
insert(t, adv..pronart..f_links(v)..f_links(rest))
if v2 then
insert(t, adv..pronart..f_links(v2)..f_links(rest))
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["indirecto"] = {tipo = "bool"},
["alt"] = {lista = true},
["nucleopres1"] = {lista = true},
["nucleopret3"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["núcleopret3"] = {alias_de = "nucleopret3"},
["paradigma"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if args["indirecto"] then
generar_traza("indirecto")
end
local adv, r1 = match(tit, "^([sSnN][ío]"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiáéí]r)(s?e?)(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?"..ESPACIO.."?"..LETRA.."*[aeiáéí]rs?e?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
v = gsub(v, "^(%S*)ár$", "%1ar") -- pronominales
v = gsub(v, "^(%S*)ér$", "%1er") -- pronominales
v = gsub(v, "^(%S*[^aeo])ír$", "%1ir") -- grafías anticuadas
local sufijo_inf = match(v, "[aeií]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopret3"])) do
local conjinfo = {}
if find(v, "iar$") and (not args["paradigma"][N] or args["paradigma"][N] == "") then
error("Especifique el (los) paradigma(s) para los verbos en -iar (anunciar, enviar, culiar)")
end
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
local vacio = true
for k, v in pairs(p[3]) do
vacio = false
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
if vacio then
paradigmas_reconocidos[p[1]] = true -- caso de [[anunciar]]
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = {}
conjinfo.nucleos2 = {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert_if_not(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
n1, sust = gsubb(conjinfo.nucleo_inf, "^(.*)["..info[2].."](.-)$", "%1#"..info[3].."#%2")
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^(.*)["..info[2].."](.-)$", "%1#"..info[4].."#%2")
end
assert(sust, "Alternancia vocálica no reconocida")
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if args["nucleopres1"][N] then
for k, v in pairs(alt_info[sufijo_inf]) do
if args["nucleopret3"][N] then
if v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
and gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[4]) == gsub1(args["nucleopret3"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
insert_if_not(conjinfo.nucleos2, args["nucleopret3"][N])
break
end
end
else
if not v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
break
end
end
end
end
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for _,s in ipairs(tostr) do
fmtinfo["subj_pres"..s] = deepcopy(resultante["subj_pres"..s])
end
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local es_impersonal = args["impersonal"]
local es_indirecto = args["indirecto"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal, es_indirecto)
end)
local impers = args["impersonal"]
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
if args["indirecto"] then
fila_pronombres_ind = {"", "a mí me, a ti te, a vos te, a él le, a ella le, a usted le, a nosotros nos, a vosotros os, a ustedes les, a ellos les", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "a mí me, a ti te, a vos te, a él le, a ella le, a usted le, a nosotros nos, a vosotros os, a ustedes les, a ellos les", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que a mí me, que a ti te, que a vos te, que a él le, que a ella le, que a usted le, que a nosotros nos, que a vosotros os, que a ustedes les, que a ellos les", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", color=COLOR_IMPER, header=true, class="pc"}
else
fila_pronombres_ind = {"", "(ello)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", color=COLOR_IMPER, header=true, class="pc"}
end
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(ello)", "(ellos)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", "(ellos)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", "(que ellos)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", "(ellos)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "yo", "tú", "vos", "él, ella, usted", "nosotros", "vosotros", "ustedes, ellos", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "yo", "tú", "vos", "él, ella, usted", "nosotros", "vosotros", "ustedes, ellos", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que yo", "que tú", "que vos", "que él, que ella, que usted", "que nosotros", "que vosotros", "que ustedes, que ellos", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tú)", "(vos)", "(usted)", "(nosotros)", "(vosotros)", "(ustedes)", color=COLOR_IMPER, header=true, class="pc"}
cs = 8
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."4"]
elseif impers == "36" then
return resultante[tiempo.."4"], resultante[tiempo.."7"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"], resultante[tiempo.."7"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")}
t[12] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")}
t[13] = {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")}
t[14] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("ind_fut_comp")}
t[15] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")}
t[16] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[17] = fila_pronombres_cond
t[18] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[19] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[20] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[21] = fila_pronombres_subj
t[22] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[23] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")}
t[24] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")}
t[25] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")}
t[26] = {{f("Futuro{†}"), color=COLOR_SUBJ, header=true}, ic("subj_fut")}
t[27] = {{f("Futuro compuesto{†}"), color=COLOR_SUBJ, header=true}, ic("subj_fut_comp")}
t[28] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[29] = fila_pronombres_imper
if mostrar_imper then
t[30] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[30] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[31] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[32] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "ES:Verbos irregulares")
-- si es irregular, los paradigmas regulares que no aportan nada de información (los vacíos) no pueden estar
paradigmas_reconocidos["anunciar"] = nil
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["embaír"] = nil
else
insert(cats, "ES:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "ES:Verbos del paradigma "..p)
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "ES:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "ES:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "ES:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "ES:Verbos defectivos")
end
if sufijo_inf == "ar" then
insert(cats, "ES:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "ES:Verbos de la segunda conjugación")
else -- será ir o ír, ya fue chequeado antes
insert(cats, "ES:Verbos de la tercera conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
fyveay19epf8vkc2nhelh62rncsoi6s
Plantilla:es.sust/doc
10
1048527
6307382
6117330
2026-08-06T00:59:18Z
TMCbot
164594
.
6307382
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
== Uso ==
Esta es la nueva plantilla para flexionar '''sustantivos''' del español. Reemplaza a todas las anteriores que se usaron para el español.
TLDR: Generalmente, o bien no es necesario especificar nada, o bien es necesario invocarla con {{epc|es.sust|mf}} en el primer parámetro si el sustantivo es masculino y femenino. Para la plantilla {{ep|es.adj}}, este parámetro se activa por defecto para que genere ambas formas, mientras que el resto funciona igual a esta plantilla.
Los sustantivos se flexionan de acuerdo a la norma establecida por el Diccionario Panhispánico de Dudas.<ref>{{DPD|plural}}</ref>
=== Sustantivos y adjetivos irregulares ===
:* '''Sustantivos masculinos y femeninos''': Invóquese con el valor <code>mf</code> en el primer parámetro
:* '''Sustantivos y adjetivos invariantes, o solo en singular o plural''': En estos casos debe usarse el primer parámetro:
::* con {{epc|es.sust|n}} o {{epc|es.sust|ng}} (no género) se especifica "mf" pero se prohíbe explícitamente flexionar en género, muy útil en adjetivos excepcionales que terminan en -o o a veces en -e pero que no flexionan a -a.
::* con {{epc|es.sust|inv}}, la palabra es invariante tanto en género como en número.
::* con {{epc|es.sust|s}} o con {{epc|es.sust|p}}, la palabra existe solo en singular o solo en plural.
::* con {{epc|es.sust|irreg}}, la palabra flexiona de forma irregular (ver Sustantivos y adjetivos con femeninos o plurales irregulares).
:* '''Plural con -s''': Por defecto, el módulo intentará formar el plural con -es en caso de ambigüedad. Para prohibir el plural con -es, debe invocarse usando el parámetro no posicional {{parámetro|s}}, o {{parámetro|forzars}}, es decir <code><nowiki>{{es.sust|s=s}}</nowiki></code> o <code><nowiki>{{es.sust|forzars=s}}</nowiki></code>. Ejemplo en [[menú]], [[vermú]] o [[jersey]].
:* '''Comparativos y superlativos''': Se puede especificar cada uno de los comparativos y superlativos con los parámetros de lista {{parámetro|comparativo}} y {{parámetro|superlativo}}. Ver ejemplo en [[bueno]].
:* '''Sustantivos y adjetivos con femeninos o plurales irregulares''': Las palabras que no se ajustan a las reglas del DPD deberán especificarse manualmente con los parámetros de lista {{parámetro|p}} (plural), {{parámetro|f}} (femenino), {{parámetro|fp}} (femenino plural). Por defecto, el segundo, tercer y cuarto parámetro posicional de la plantilla están asociados con {{parámetro|p1}}, {{parámetro|f1}}, {{parámetro|fp1}}. Ver ejemplos en [[líder]] o [[actor]].
:* '''Notas al pie''': Se puede agregar una nota al pie con el parámetro {{parámetro|nota}}.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|1}}
|Tipo de flexión en el sustantivo o adjetivo.
|Lista de valores
|ninguno (por defecto), mf (masculino y femenino), ng (sin marca de género), inv (invariante), s (singularia tantum), p (pluralia tantum), irreg (sufijo completamente irregular)
|-
|{{parámetro|2}}
|Alias para {{parámetro|p1}}
|
|
|-
|{{parámetro|3}}
|Alias para {{parámetro|f1}}
|
|
|-
|{{parámetro|4}}
|Alias para {{parámetro|fp1}}
|
|
|-
|{{parámetro|s}} ({{parámetro|forzars}})
|Prohibir el plural con -es
|booleano
|n (no, por defecto), s (sí)
|-
|{{parámetro|p}} ({{parámetro|p2}}, {{parámetro|p3}}, etc.)
|Plurales (masculinos) irregulares
|Libre
|especificar el plural
|-
|{{parámetro|f}} ({{parámetro|f2}}, {{parámetro|f3}}, etc.)
|Femeninos irregulares
|Libre
|especificar el femenino
|-
|{{parámetro|fp}} ({{parámetro|fp2}}, {{parámetro|fp3}}, etc.)
|Femeninos plurales irregulares
|Libre
|especificar el femenino en plural
|-
|{{parámetro|comp}} ({{parámetro|comp2}}, {{parámetro|comp3}}, etc.)
|Comparativo
|Libre
|especificar el comparativo
|-
|{{parámetro|sup}} ({{parámetro|sup2}}, {{parámetro|sup3}}, etc.)
|Superlativo
|Libre
|especificar el superlativo
|-
|{{parámetro|cop}}
|Si la estructura es copulativa; '''obligatorio especificarlo en las locuciones que tienen plural, si no lo tiene o es invariante especificarlo con el primer parámetro'''. Ejemplo de estructura copulativa: [[peso molecular]]. Ejemplo de estructura no copulativa: [[año luz]].
|booleano
|n (no), s (sí)
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
=== Categorías relacionadas ===
* [[:Categoría:ES:Plantillas de flexión]]
=== Véase también ===
* {{ep|es.adj}}
* {{ep|es.v}}
== Referencias ==
<references />
<includeonly><!--
++++ POR FAVOR, AÑADE LAS CATEGORÍAS DEBAJO DE ESTA LÍNEA, DENTRO DE LAS ETIQUETAS INCLUDEONLY, GRACIAS. -->
[[Categoría:ES:Plantillas de flexión]]
</includeonly>
58frj5f81dgakeix8ovbd670lgv9yww
contraestay
0
1053507
6307316
5817266
2026-08-05T23:34:35Z
Tmagc
158167
6307316
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|prefijo|contra|estay}}.
==== {{sustantivo masculino|es}} ====
{{es.sust|s=s}}
;1 {{csem|náutica}}: Segundo estay, a veces menos grueso que el principal, encima del cual va colocado para su ayuda en los palos y masteleros mayores.<ref>{{DME1865}}</ref>
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
d8gxd2axkxo50zhdry5ynf5mozag1rb
Módulo:flex/it
828
1055180
6307335
6118176
2026-08-06T00:34:25Z
TMCbot
164594
.
6307335
Scribunto
text/plain
-- Módulo para flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local max = math.max
local m_bool = require("Módulo:sí-no")
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local match = m_str.match
local len = m_str.len
local sub = m_str.sub
local gsplit = m_str.gsplit
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal = "aeiouAEIOU"
local vocal_tildada = "áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙ"
local vocales = vocal .. vocal_tildada
local consonantes = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
local V = "[" .. vocales .. "]"
local C = "[" .. consonantes .. "]"
local espacios = "%-‐%s"
local guion = "%-"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local quitar_tilde =
{
["à"] = "a",
["è"] = "e",
["ì"] = "i",
["ò"] = "o",
["ù"] = "u",
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["À"] = "A",
["È"] = "E",
["Ì"] = "I",
["Ò"] = "O",
["Ù"] = "U",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local function try(p, nexo, m, pl, f, fpl, g, h)
if h == true and not find(pl, "^h") then
pl = "#h"..pl.."#"
elseif h == false and find(pl, "^h") then
pl = "#"..sub(pl, 2).."#"
end
if g == "m" or g == "mf" then
local r, n, mascu
r, n, mascu = match(p, "^(.-)("..nexo..")("..m..")$")
if n then
if type(n) ~= "string" then
n = ""
end
r = gsub(r, "["..vocal_tildada.."]", quitar_tilde) -- quito tildes para que genere los enlaces correctos
n = gsub(n, "["..vocal_tildada.."]", quitar_tilde)
if not pl then
return {m={r.."~"..n..mascu.."~"}, p={}, f={}, fp={}}
elseif g == "mf" and (f ~= m or fpl ~= pl) then
return {m={r.."~"..n..mascu.."~"}, p={r.."~"..n..pl.."~"}, f={r.."~"..n..f.."~"}, fp={r.."~"..n..fpl.."~"}}
else -- g == m
return {m={r.."~"..n..mascu.."~"}, p={r.."~"..n..pl.."~"}, f={}, fp={}}
end
end
else -- g == "f"
local r, n, feme
r, n, feme = match(p, "^(.-)("..nexo..")("..f..")$")
if n then
if type(n) ~= "string" then
n = ""
end
r = gsub(r, "["..vocal_tildada.."]", quitar_tilde) -- quito tildes para que genere los enlaces correctos
n = gsub(n, "["..vocal_tildada.."]", quitar_tilde)
if not fpl then
return {m={r.."~"..n..feme.."~"}, p={}, f={}, fp={}}
else
return {m={r.."~"..n..feme.."~"}, p={r.."~"..n..fpl.."~"}, f={}, fp={}}
end
end
end
return nil
end
-- https://www.treccani.it/enciclopedia/plurale-dei-nomi_(La-grammatica-italiana)/
-- https://www.lagrammaticaitaliana.it/it/corsi/1/grammatica/lezioni/59/formazione-del-plurale
local function flexionar_palabra(p, g, h)
local changed = try(p, "ist", "a", "i", "a", "e", g, nil) or
try(p, "ì", "o", "i", "a", "e", g, nil) or -- addio / addii, pendio / pendii, zio / zii, si la i está acentuada hace plural con i doble
try(p, "i", "o", "", "a", "e", g, nil) or
try(p, V.."fug", "o", "hi", "a", "he", g, h) or -- -fugo, es un caso particular de -co/-go, en este caso siempre es plural con ghi
try(p, V.."fag", "o", "i", "a", "he", g, h) or -- -fago, es un caso particular de -co/-go, el tipo de plural depende de si es persona u objeto
try(p, "olog", "o", "i", "a", "he", g, h) or -- -ologo, es un caso particular de -co/-go asumo que refiere a una persona
try(p, V.."log", "o", "hi", "a", "he", g, h) or -- -logo, para el resto de palabras en -logo asumo que son objetos
try(p, "iac", "o", "i", "a", "he", g, h) or -- -iaco, es un caso particular de -co/-go pero si está este sufijo asumo que es esdrújula
try(p, V..C.."+ic", "o", "i", "a", "he", g, h) or -- -ico (trisílaba), es un caso particular de -co/-go pero si está este sufijo asumo que es esdrújula
try(p, "["..vocal_tildada.."][iu]?"..C.."?[cg]", "o", "hi", "a", "he", g, h) or -- -co/-go (llana)
try(p, "["..vocal_tildada.."][^"..vocal_tildada.."]+[cg]", "o", "i", "a", "he", g, h) or -- -co/-go (esdrújula)
try(p, "[cg]", "o", "hi", "a", "he", g, h) or -- -co/-go (llana)
try(p, "[cg]", "a", "hi", "a", "he", g, h) or
try(p, "[cg]ì", "a", "e", "a", "e", g, nil) or
try(p, V.."[cg]", "ia", "i", "ia", "ie", g, nil) or
try(p, C.."[cg]", "ia", "i", "ia", "e", g, nil) or
try(p, "", "NO", "NO", "logia", "logie", g, nil) or
try(p, "", "tore", "tori", "trice", "trici", g, nil) or
try(p, "", "o", "i", "a", "e", g, nil) or
try(p, "", "o", "i", "o", "e", g, nil) or
try(p, "", "a", "i", "a", "e", g, nil) or
try(p, "", "one", "oni", "ona", "one", g, nil) or
try(p, "", "e", "i", "e", "i", g, nil) or
try(p, "", "["..vocal_tildada.."]", nil, "["..vocal_tildada.."]", nil, g, nil) or
try(p, C, "", nil, "", nil, g, nil)
if g == "m" or g == "f" or g == "mf" or g == "ng" then
assert(changed, "No se pudo determinar la flexión de la palabra")
else
changed = changed or {m={p}, p={}, f={}, fp={}}
end
return changed
end
local function flexion_sust_adj(palabras, g, h, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, h)
local flex2 = copulativa and flexionar_palabra(b, g, h) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = flexionar_palabra(p, g, h)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
if not args["ayuda"] then
args["ayuda"] = title
end
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(args["ayuda"], modo, args["h"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(args["ayuda"], LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["ayuda"] = {},
["alt"] = {alias_de = "ayuda"},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["h"] = {tipo = "bool"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local valido = {
["m"] = true,
["f"] = true,
["mf"] = true,
["n"] = true,
["ng"] = true,
["inv"] = true,
["s"] = true,
["p"] = true,
["irreg"] = true
}
assert(valido[args[1]], "Especifique el género del sustantivo en el primer parámetro: m, f, mf, ng, inv, s, p, irreg")
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IT:Locuciones sustantivas" or "IT:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["ayuda"] = {},
["alt"] = {alias_de = "ayuda"},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["h"] = {tipo = "bool"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IT:Locuciones adjetivas" or "IT:Adjetivos")
end
local IO, TU, LUI, NOI, VOI, LORO = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"io", "tu", "lui, lei", "noi", "voi", "loro, essi, esse"}
local PRONOMBRES_SUBJ = {"che io", "che tu", "che lui, che lei", "che noi", "che voi", "che loro, che essi"}
local PRONOMBRES_IMP = {"-", "(tu)", "(Lei)", "(noi)", "(voi)", "-"}
local IMPERSONALES = {"", "", "(esso)", "", "", "(essi)"}
local IMPERSONALES_SUBJ = {"", "", "(che esso)", "", "", "(che essi)"}
local REFLEXIVOS = {"mi", "ti", "si", "ci", "vi", "si"}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers and impers ~= "" then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["part_pres"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["perf"] = true,
["fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["perf_comp"] = true,
["ind_pluperf"] = true,
["anter"] = true,
["fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local sufijos = {
["are"] = {
["ger"] = {"ando"},
["part"] = {"ato"},
["part_alt"] = {"o"},
["part_pres"] = {"ante"},
["ind_pres"] = {"o", "i", "a", "iamo", "ate", "ano"},
["ind_imp"] = {"avo", "avi", "ava", "avamo", "avate", "avano"},
["perf"] = {"ai", "asti", "ò", "ammo", "aste", "arono"},
["perf_alt"] = {"i", "esti", "e", "emmo", "este", "ero"},
["fut"] = {"erò", "erai", "erà", "eremo", "erete", "eranno"},
["fut_dare"] = {"arò", "arai", "arà", "aremo", "arete", "aranno"},
["subj_pres"] = {"i", "i", "i", "iamo", "iate", "ino"},
["subj_imp"] = {"assi", "assi", "asse", "assimo", "aste", "assero"},
["subj_imp_alt"] = {"essi", "essi", "esse", "essimo", "este", "essero"},
["cond"] = {"erei", "eresti", "erebbe", "eremmo", "ereste", "erebbero"},
["cond_dare"] = {"arei", "aresti", "arebbe", "aremmo", "areste", "arebbero"},
["imper"] = {"-", "a", "i", "iamo", "ate", "ino"},
["imper_alt"] = {"-", "a", "i", "iamo", "iate", "ino"}
},
["ere"] = {
["ger"] = {"endo"},
["part"] = {"uto"},
["part_alt"] = {"o"},
["part_pres"] = {"ente"},
["ind_pres"] = {"o", "i", "e", "iamo", "ete", "ono"},
["ind_pres_mpiere"] = {"o", "", "e", "amo", "ite", "ono"},
["ind_imp"] = {"evo", "evi", "eva", "evamo", "evate", "evano"},
["perf"] = {"ei", "esti", "é", "emmo", "este", "erono",
"etti", nil, "ette", nil, nil, "ettero"},
["perf_alt"] = {"i", "esti", "e", "emmo", "este", "ero"},
["perf_plaudere"] = {"ii", "isti", "ì", "immo", "iste", "irono"},
["fut"] = {"erò", "erai", "erà", "eremo", "erete", "eranno"},
["subj_pres"] = {"a", "a", "a", "iamo", "iate", "ano"},
["subj_imp"] = {"essi", "essi", "esse", "essimo", "este", "essero"},
["cond"] = {"erei", "eresti", "erebbe", "eremmo", "ereste", "erebbero"},
["imper"] = {"-", "i", "a", "iamo", "ete", "ano"},
["imper_alt"] = {"-", "i", "a", "iamo", "iate", "ano"}
},
["ire"] = {
["ger"] = {"endo"},
["part"] = {"ito"},
["part_alt"] = {"o"},
["part_pres"] = {"ente"},
["ind_pres"] = {"o", "i", "e", "iamo", "ite", "ono"},
["ind_imp"] = {"ivo", "ivi", "iva", "ivamo", "ivate", "ivano"},
["perf"] = {"ii", "isti", "ì", "immo", "iste", "irono"},
["perf_alt"] = {"i", "isti", "i", "immo", "iste", "iro"},
["fut"] = {"irò", "irai", "irà", "iremo", "irete", "iranno"},
["subj_pres"] = {"a", "a", "a", "iamo", "iate", "ano"},
["subj_imp"] = {"issi", "issi", "isse", "issimo", "iste", "issero"},
["cond"] = {"irei", "iresti", "irebbe", "iremmo", "ireste", "irebbero"},
["imper"] = {"-", "i", "a", "iamo", "ite", "ano"},
["imper_alt"] = {"-", "i", "a", "iamo", "ite", "ano"}
},
["arre"] = {
["ger"] = {"aendo"},
["part"] = {"atto"},
["part_pres"] = {"aente"},
["ind_pres"] = {"aggo", "ai", "ae", "aiamo", "aete", "aggono"},
["ind_imp"] = {"aevo", "aevi", "aeva", "aevamo", "aevate", "aevano"},
["perf"] = {"assi", "aesti", "asse", "aemmo", "aeste", "assero"},
["fut"] = {"arrò", "arrai", "arrà", "arremo", "arrete", "arranno"},
["subj_pres"] = {"agga", "agga", "agga", "aiamo", "aiate", "aggano"},
["subj_imp"] = {"aessi", "aessi", "aesse", "aessimo", "aeste", "aessero"},
["cond"] = {"arrei", "arresti", "arrebbe", "arremmo", "arreste", "arrebbero"},
["imper"] = {"-", "ai", "agga", "aiamo", "aete", "aggano"}
},
["orre"] = {
["ger"] = {"onendo"},
["part"] = {"osto"},
["part_pres"] = {"onente"},
["ind_pres"] = {"ongo", "oni", "one", "oniamo", "onete", "ongono"},
["ind_imp"] = {"onevo", "onevi", "oneva", "onevamo", "onevate", "onevano"},
["perf"] = {"osi", "onesti", "ose", "onemmo", "oneste", "osero"},
["fut"] = {"orrò", "orrai", "orrà", "orremo", "orrete", "orranno"},
["subj_pres"] = {"onga", "onga", "onga", "oniamo", "oniate", "ongano"},
["subj_imp"] = {"onessi", "onessi", "onesse", "onessimo", "oneste", "onessero"},
["cond"] = {"orrei", "orresti", "orrebbe", "orremmo", "orreste", "orrebbero"},
["imper"] = {"-", "oni", "onga", "oniamo", "oniate", "ongano"}
},
["urre"] = {
["ger"] = {"ucendo"},
["part"] = {"otto"},
["part_pres"] = {"ucente"},
["ind_pres"] = {"uco", "uci", "uce", "uciamo", "ucete", "ucono"},
["ind_imp"] = {"ucevo", "ucevi", "uceva", "ucevamo", "ucevate", "ucevano"},
["perf"] = {"ussi", "ucesti", "usse", "ucemmo", "uceste", "ussero"},
["fut"] = {"urrò", "urrai", "urrà", "urremo", "urrete", "urranno"},
["subj_pres"] = {"uca", "uca", "uca", "uciamo", "uciate", "ucano"},
["subj_imp"] = {"ucessi", "ucessi", "ucesse", "ucessimo", "uceste", "ucessero"},
["cond"] = {"urrei", "urresti", "urrebbe", "urremmo", "urreste", "urrebbero"},
["imper"] = {"-", "uci", "uca", "uciamo", "ucete", "ucano"}
}
}
local auxiliar = {
["essere"] = {
["inf_comp"] = {"essere"},
["ger_comp"] = {"essendo"},
["perf_comp"] = {"sono", "sei", "è", "siamo", "siete", "sono"},
["ind_pluperf"] = {"ero", "eri", "era", "eravamo", "eravate", "erano"},
["anter"] = {"fui", "fosti", "fu", "fummo", "foste", "furono"},
["fut_comp"] = {"sarò", "sarai", "sarà", "saremo", "sarete", "saranno"},
["cond_comp"] = {"sarei", "saresti", "sarebbe", "saremmo", "sareste", "sarebbero"},
["subj_perf"] = {"sia", "sia", "sia", "siamo", "siate", "siano"},
["subj_pluperf"] = {"fossi", "fossi", "fosse", "fossimo", "foste", "fossero"},
},
["avere"] = {
["inf_comp"] = {"avere"},
["ger_comp"] = {"avendo"},
["perf_comp"] = {"ho", "hai", "ha", "abbiamo", "avete", "hanno"},
["ind_pluperf"] = {"avevo", "avevi", "aveva", "avevamo", "avevate", "avevano"},
["anter"] = {"ebbi", "avesti", "ebbe", "avemmo", "aveste", "ebbero"},
["fut_comp"] = {"avrò", "avrai", "avrà", "avremo", "avrete", "avranno"},
["cond_comp"] = {"avrei", "avresti", "avrebbe", "avremmo", "avreste", "avrebbero"},
["subj_perf"] = {"abbia", "abbia", "abbia", "abbiamo", "abbiate", "abbiano"},
["subj_pluperf"] = {"avessi", "avessi", "avesse", "avessimo", "aveste", "avessero"},
}
}
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo)
if find(nucleo, "[bdfgkprtv]r#$") and find(nexosufijo, "^"..V.."r") then
return nucleo..sub(nexosufijo, 3)
end
if (nucleo == "empi" or nucleo == "mpi" or nucleo == "gli") and find(nexosufijo, "^i") then
return nucleo..sub(nexosufijo, 2)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
return prefijo..nucleonexosufijo
end
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if find(sufijo, "^[ei]") then
if nexo == "c" then
return "~ch~"..sufijo
end
if nexo == "g" then
return "~gh~"..sufijo
end
if nexo == "ci" then
return "~c~"..sufijo
end
if nexo == "gi" then
return "~g~"..sufijo
end
end
if find(sufijo, "^i") then
if nexo == "i" then
return sufijo
end
end
return nexo .. sufijo
end
local paradigmas_regulares = {
["are"] = {
{"bruciare", {"ciare$"}, {
nexo = "ci"
}},
{"galleggiare", {"giare$"}, {
nexo = "gi"
}},
{"asciugare", {"gare$"}, {
nexo = "g"
}},
{"giocare", {"care$"}, {
nexo = "c"
}},
{"abbaiare", {"iare$"}, {
nexo = "i"
}},
{"avviare", {"iare$"}, {
}},
{"amare", {"are$"}, {
}},
},
["ere"] = {
{"prudere", {"prudere$"}, { -- impersonal
nucleoperf = {"REG{R}"},
part = {},
}},
{"stridere", {"stridere$", "concernere$", "discernere$", "serpere$", "splendere$", "lucere$", "combere$", "esimere$", "fervere$"}, {
part = {},
}},
{"controvertere", {"controvertere$"}, {
nucleoperf = {},
part = {},
}},
{"temere", {"ere$"}, {
}},
},
["ire"] = {
{"introvertire", {"introvertire$"}, { -- no va vertire
nucleopres = {"INCO"},
nucleoperf = {},
}},
{"compartire", {"compartire$", "putire$", "languire$", "eseguire$", "borrire$", "sbollire$", "inghiottire$"}, {
nucleopres = {"INCO", "REG"},
}},
{"compartire", {"sorbire$"}, {
nucleopres = {"INCO", "REG{R}"}
}},
{"compartire", {"applaudire$", "assalire$"}, {
nucleopres = {"REG", "INCO{R}"}
}},
{"compartire", {"^mentire$"}, {
nucleopres = {"REG", "INCO"},
}},
{"finire", {"finire$", "muggire$", "asservire$"}, { -- fuggire no es inco
nucleopres = {"INCO"},
}},
{"partire", {"ire$"}, {
}},
-- cuidado con sortire, tiene doble etimología y en una es inco y en la otra no
},
["arre"] = {
{"trarre", {"arre$"}, {
}},
},
["orre"] = {
{"porre", {"orre$"}, {
}},
},
["urre"] = {
{"condurre", {"urre$"}, {
}},
}
}
local paradigmas_irregulares = {
["are"] = {
{"andare", {"andare$"}, { -- andare, riandare, trasandare
nucleo = "and",
ind_pres = {{"vado"}, {"vai"}, {"va{G}"}, {"andiamo"}, {"andate"}, {"vanno"}},
nucleofut = {"andr"},
subj_pres = {{"vada", "vadi{x}"}, {"vada", "vadi{x}"}, {"vada", "vadi{x}"}, nil, nil, {"vadano", "vadino{x}"}},
imper = {nil, {"vai", "va'"}, {"vada", "vadi{x}"}, nil, nil, {"vadano", "vadino{x}"}}
}},
{"dare", {"^dare$", "addare$", "ridare$"}, { -- dare, addare, ridare, pero NO guidare, ni otros terminados en -dare
nucleo = "d",
ind_pres = {{"do{G}"}, {"dai"}, {"dà{G}"}, {"diamo"}, {"date"}, {"danno"}},
perf = {{"diedi", "detti"}, nil, {"diede", "dette", "diè{†}"}, nil, nil, {"diedero", "dettero", "diero{†}"}},
fut = {sufijos = "fut_dare"},
cond = {sufijos = "cond_dare"},
subj_pres = {{"dia"}, {"dia"}, {"dia"}, {"diamo"}, {"diate"}, {"diano"}},
subj_imp = {sufijos = "sub_imp_alt"},
imper = {nil, {"dai", "da'", "dà{†}"}}
}},
{"stare", {"stare$"}, {
ind_pres = {{"sto{G}"}, {"stai"}, {"sta{G}"}, {"stiamo"}, {"state"}, {"stanno"}},
perf = {{"stetti", "stiedi", "stei{†}", "stiei{†}"}, nil, {"stette", "stiede", "ste{†}", "stie{†}"}, nil, nil, {"stettero", "stiedero{x}", "sttetono{†}", "sterono{†}", "stierono{†}"}},
fut = {sufijos = "fut_dare"},
cond = {sufijos = "cond_dare"},
subj_pres = {{"stia", "stea{L}"}, {"stia", "stie{L}"}, {"stia", "stea{L}", "stie{L}"}, {"stiamo"}, {"stiate"}, {"stiano", "steano{L}"}},
imper = {nil, {"stai", "sta'", "sta{†}"}, {"stia", "stea{L}", "stie{L}"}, nil, nil, {"stiano", "steano{L}"}}
}},
-- NOTA: NO puede ir buffare, así que por las dudas ennumero todos los prefijos y compuestos
{"fare", {"^s?fare$"}, {
nucleo = "f",
nucleoperf = {"fec-fac"},
ger = {"facendo"},
part = {"fatto"},
part_pres = {"facente"},
ind_pres = {{"faccio"}, {"fai"}, nil, {"facciamo"}, nil, {"fanno"}},
ind_imp = {{"facevo"}, {"facevi"}, {"faceva"}, {"facevamo"}, {"facevate"}, {"facevano"}},
fut = {sufijos = "fut_dare"},
cond = {sufijos = "cond_dare"},
subj_pres = {{"faccia"}, {"faccia"}, {"faccia"}, {"facciamo"}, {"facciate"}, {"facciano"}},
subj_imp = {{"facessi"}, {"facessi"}, {"facesse"}, {"facessimo"}, {"faceste"}, {"facessero"}},
imper = {nil, {"fai", "fa'"}, {"faccia"}, {"facciamo"}, nil, {"facciano"}}
}},
-- estos van con tilde
{"fare", {"^rifare$", "^affare$", "assuefare$", "confare$", "contraffare$", "disfare$", "dis?a?ssuefare$", "liquefare$", "malfare$", "mansuefare$", "putrefare$", "rarefare$", "sopraffare$", "strafare$", "stupefare$", "torrefare$", "tumefare$"}, {
nucleo = "f",
nucleoperf = {"fec-fac"},
ger = {"facendo"},
part = {"fatto"},
part_pres = {"facente"},
ind_pres = {{"faccio"}, {"fai"}, {"fà"}, {"facciamo"}, nil, {"fanno"}},
ind_imp = {{"facevo"}, {"facevi"}, {"faceva"}, {"facevamo"}, {"facevate"}, {"facevano"}},
fut = {sufijos = "fut_dare"},
cond = {sufijos = "cond_dare"},
subj_pres = {{"faccia"}, {"faccia"}, {"faccia"}, {"facciamo"}, {"facciate"}, {"facciano"}},
subj_imp = {{"facessi"}, {"facessi"}, {"facesse"}, {"facessimo"}, {"faceste"}, {"facessero"}},
imper = {nil, {"fai", "fa'"}, {"faccia"}, {"facciamo"}, nil, {"facciano"}}
}},
},
["ere"] = {
{"essere", {"essere$", "riessere$", "trasessere$"}, {
nucleo = "ess",
part_pres = {"essente{R}"},
ind_pres = {{"sono"}, {"sei"}, {"è"}, {"siamo"}, {"siete"}, {"sono"}},
ind_imp = {{"ero"}, {"eri"}, {"era"}, {"eravamo"}, {"eravate"}, {"erano"}},
perf = {{"fui"}, {"fosti"}, {"fu{G}"}, {"fummo"}, {"foste"}, {"furono"}},
fut = {{"sarò"}, {"sarai"}, {"sarà"}, {"saremo"}, {"sarete"}, {"saranno"}},
cond = {{"sarei"}, {"saresti"}, {"sarebbe"}, {"saremmo"}, {"sareste"}, {"sarebbero"}},
subj_pres = {{"sia"}, {"sia"}, {"sia"}, {"siamo"}, {"siate"}, {"siano"}},
subj_imp = {{"fossi"}, {"fossi"}, {"fosse"}, {"fossimo"}, {"foste"}, {"fossero"}},
imper = {nil, {"sii"}, {"sia"}, {"siamo"}, {"siate"}, {"siano"}}
}},
{"avere", {"^avere$", "^riavere$", "^bene?avere$"}, {
nucleo = "av",
nucleopres = {"abbi-abb-abb-abb"},
nucleoperf = {"ebb-av"},
nucleofut = {"avr"},
part_pres = {"avente", "abbiente"},
ger_comp = {"avendo"},
ind_pres = {{"ho"}, {"hai"}, {"ha"}, nil, nil, {"hanno"}},
}},
{"sapere", {"sapere$"}, {
nucleo = "sap",
nucleopres = {"sappi-sapp-sapp-sapp"},
nucleoperf = {"sepp"},
nucleofut = {"sapr"},
part_pres = {},
ind_pres = {{"so{G}"}, {"sai"}, {"sa{G}"}, nil, nil, {"sanno"}},
}},
{"potere", {"potere$"}, {
nucleo = "pot",
nucleopres = {"poss-poss-poss"},
nucleofut = {"potr"},
ind_pres = {nil, {"puoi"}, {"può"}, nil, nil, nil},
imper = {nil, {}, {}, {}, {}, {}}
}},
{"dovere", {"dovere$"}, {
nucleo = "dov",
nucleopres = {"dev-dev-dobb", "debb-dev-dobb"},
nucleofut = {"dovr"},
ind_pres = {{"devo"}},
imper = {nil, {}, {}, {}, {}, {}}
}},
{"piacere", {"acere$"}, { -- REVISAR ESTO
nucleopres = {"acci-REG-acc"},
nucleoperf = {"acqu"},
nucleopart = {"aciut"},
}},
{"nuocere", {"nuocere$"}, { -- REVISAR
nucleopres = {"nocci", "nuocci-nuoc-noc"},
nucleoperf = {"nocqu"},
ger = {"nuocendo", "nocendo{R}"},
part = {"nociuto", "nuociuto{R}"},
part_pres = {"nocente"},
}},
{"nascere", {"nascere$"}, {
nucleoperf = {"nacqu"},
part = {"nato"},
}},
{"crescere", {"crescere$", "noscere$"}, { -- tb -noscere, pero no pascere, mescere
nucleo = "sc",
nucleoperf = {"bb"},
nucleopart = {"sciut"},
}},
{"cadere", {"cadere$"}, {
nucleoperf = {"cadd"},
nucleofut = {"cadr"},
}},
{"possedere", {"possedere$"}, {
nucleopres = {"possied-possied", "possegg-possied"},
nucleofut = {"possied", "possed"}
}},
{"sedere", {"sedere$"}, {
nucleopres = {"sied", "segg{†}", "siegg{†}"},
nucleofut = {"sied", "sed"},
}},
{"prevedere", {"prevedere$"}, {
nucleo = "ved",
nucleoperf = {"vid"},
part = {"visto", "veduto{R}"},
nucleofut = {"vedr", "veder"},
part_pres = {"vedente", "veggente"},
}},
{"provedere", {"provedere$", "provvedere$"}, {
nucleo = "ved",
nucleoperf = {"vid"},
part = {"veduto{PART}", "visto{ADJ}"},
nucleofut = {"vedr", "veder"},
part_pres = {"vedente", "veggente"},
}},
{"ravedere", {"^ravedere$"}, {
nucleo = "ved",
nucleoperf = {"vid"},
part = {"veduto"},
nucleofut = {"vedr", "veder"},
part_pres = {"vedente", "veggente"},
}},
{"travedere", {"^travedere$", "trasvedere$", "transvedere$", "stravedere$", "antivedere$"}, {
nucleo = "ved",
nucleoperf = {"vid"},
part = {"veduto"},
nucleofut = {"vedr"},
part_pres = {"vedente", "veggente"},
}},
{"vedere", {"vedere$"}, {
nucleo = "ved",
nucleoperf = {"vid"},
part = {"visto", "veduto{R}"},
nucleofut = {"vedr"},
part_pres = {"vedente", "veggente"},
}},
{"spandere", {"spandere$"}, { -- REVISAR: fusionar con el resto de paradigmas (ojo a la ns)?
nucleoperf = {"spans", "REG{R}"},
part = {"spanto", "spanso"},
}},
{"fendere", {"fendere$"}, { -- fendere, rifendere, sfendere, etc.
part = {"fenduto", "fesso"},
}},
{"propendere", {"propendere$"}, {
part = {"propeso{R}"},
}},
{"fondere", {"fondere$"}, {
nucleoperf = {"fus"},
part = {"fuso"},
}},
{"tondere", {"tondere$"}, {
part = {"tonduto", "tonso"},
}},
{"godere", {"godere$"}, {
nucleofut = {"godr"},
}},
{"plaudere", {"plaudere$"}, {
perf = {sufijos = "perf_plaudere"},
part = {"plaudito"},
}},
-- estos son ss-tt pero alteran una vocal
{"redigere", {"redigere$"}, {
nucleoperf = {"redass"},
part = {"redatto"},
}},
{"cuocere", {"cuocere$"}, {
nucleopres = {"cuoci-cuoc-cuoc", "cuoci-cuoc-coc{R}"},
nucleoimp = {"cuoci", "coci{R}"},
nucleofut = {"cuoc", "coc{R}"},
nucleoperf = {"ss"},
nucleopart = {"cott"},
}},
{"diligere", {"diligere$"}, {
nucleoperf = {"diless"},
part = {"diletto"},
}},
{"ducere", {"ducere$"}, {
nucleoperf = {"ss"},
nucleofut = {"durr"},
part = {"dotto"},
}},
{"rigere", {"rigere$"}, {
nucleoperf = {"ress"},
part = {"retto"},
}},
{"sigere", {"sigere$"}, { -- esigere, transigere
nucleoperf = {"REG{R}"},
part = {"satto"},
}},
{"stringere", {"stringere$"}, {
nucleoperf = {"strins"},
part = {"stretto"},
}},
{"fungere", {"fungere$"}, {
nucleoperf = {"funs"},
part = {"funto{R}"},
}},
{"ergere", {"^ergere$", "adergere$", "ridergere$"}, {
nucleo = "erg",
nucleoperf = {"s"},
part = {"t"},
}},
{"urgere", {"^urgere$"}, { -- no surgere
nucleoperf = {},
part = {},
}},
{"empiere", {"^empiere$", "riempiere$"}, { -- tb. riempiere
nucleo = "empi",
ind_pres = {sufijos = "ind_pres_mpiere"},
perf = {{"empii", "empiei{R}"}, {"empisti", "empiesti{R}"}, {"empì", "empié{R}"}, {"empimmo", "empiemmo{R}"}, {"empiste", "empieste{R}"}, {"empirono", "empierono{R}"}},
}},
{"adempiere", {"mpiere$"}, { -- adempiere, compiere, disimpeire
nucleo = "mpi",
ind_pres = {sufijos = "ind_pres_mpiere"},
perf = {ei = true},
}},
{"valere", {"valere$"}, {
nucleopres = {"valg"},
nucleoperf = {"vals"},
nucleofut = {"varr"},
part = {"valso"},
}},
{"pellere", {"pellere$", "avellere$"}, {
nucleo = "elle",
nucleoperf = {"uls"},
part = {"ulso"},
}},
{"svellere", {"svellere$", "divellere$"}, {
nucleo = "vell",
nucleopres = {"REG", "velg"},
nucleoperf = {"vels"},
part = {"velto"},
}},
{"dolere", {"dolere$"}, {
nucleopres = {"dolg-duol"},
nucleoperf = {"dols"},
nucleofut = {"dorr"},
}},
{"solere", {"solere$"}, {
nucleopres = {"sogli-suol-sogl"},
nucleoperf = {"REG{R}"},
part = {"solito"},
fut = {{},{},{},{},{},{}},
imper = {{},{},{},{},{},{}},
part_pres = {},
}},
{"volere", {"volere$"}, {
nucleopres = {"vogli-vogl-vogl-vogl"},
ind_pres = {nil, {"vuoi"}, {"vuole"}, nil, nil, nil},
nucleoperf = {"voll"},
nucleofut = {"vorr"},
}},
{"redimere", {"redimere$"}, {
nucleoperf = {"redens"},
part = {"redento"},
}},
{"perplimere", {"perplimere$"}, {
part = {"perplesso", "perplimuto{R}"},
}},
{"dirimere", {"dirimere"}, {
part = {"dirento{†}"},
}},
{"primere", {"primere$"}, {
nucleoperf = {"press"},
part = {"presso"},
}},
{"sumere", {"sumere$"}, {
nucleoperf = {"suns"},
part = {"sunto"},
}},
{"rimanere", {"rimanere$"}, {
nucleopres = {"rimang"},
nucleoperf = {"rimas"},
part = {"rimasto"},
nucleofut = {"rimarr"},
}},
{"permanere", {"permanere$"}, {
nucleopres = {"permang"},
nucleoperf = {"permas"},
part = {},
nucleofut = {"permarr"},
}},
{"tenere", {"tenere$"}, {
nucleopres = {"teng-tien"},
nucleoperf = {"tenn"},
nucleofut = {"terr"},
}},
{"spegnere", {"spegnere$"}, {
nucleopres = {"speng"},
nucleoperf = {"spens"},
part = {"spento"},
}},
{"cernere", {"^cernere$", "ricernere$"}, {
nucleoperf = {},
part = {"cernito"},
}},
{"secernere", {"secernere$"}, {
part = {"secreto"},
}},
{"rompere", {"rompere$"}, {
nucleoperf = {"rupp"},
part = {"rotto"},
}},
{"^parere", {"^parere$"}, {
nucleopres = {"pai-par-pai"},
nucleoperf = {"parv"},
nucleofut = {"parr"},
part = {"parso"},
ind_imp = {{},{},{},{},{},{}},
part_pres = {"parvente"},
}},
{"correre", {"correre$"}, {
nucleoperf = {"cors"},
part = {"corso"},
}},
{"cuotere", {"cuotere$"}, {
nucleoperf = {"coss"},
part = {"cosso"},
}},
-- vertere impersonal
{"estrovertere", {"estrovertere$"}, {
nucleoperf = {},
part = {"estroverso", "estrovertito{R}"},
}},
{"introvertere", {"introvertere$"}, {
nucleoperf = {},
part = {"introverso"},
}},
{"sistere", {"sistere$"}, {
nucleoperf = {"sistito"},
}},
{"flettere", {"flettere$"}, {
nucleoperf = {"REG", "ss"},
perf = {ei = true},
part = {"flesso"},
}},
{"mettere", {"mettere$"}, {
nucleoperf = {"misi"},
part = {"messo"},
}},
{"convivere", {"convivere$", "sopravivere$"}, {
nucleo = "viv",
nucleoperf = {"viss"},
nucleofut = {"vivr", "REG"},
part = {"vissuto"},
}},
{"vivere", {"vivere$"}, {
nucleo = "viv",
nucleoperf = {"viss"},
nucleofut = {"vivr"},
part = {"vissuto"},
}},
{"asciolvere", {"sciolvere$"}, {
nucleoperf = {"REG", "sciols"},
}},
{"volvere", {"volvere$"}, {
nucleoperf = {"vols", "REG"},
part = {"voluto"},
}},
{"bere", {"^bere$"}, {
nucleo = "bev",
nucleoperf = {"bevv", "REG"},
nucleofut = {"berr"},
}},
{"piovere", {"piovere$"}, {
nucleoperf = {"piovv"},
}},
{"muovere", {"muovere$"}, { -- muovere, commuovere
nucleoperf = {"moss"},
part = {"mosso"},
}},
{"ripetere", {"tere$", "tessere$"}, { -- competere, mietere, fotere, vertere, battere, nettere
perf = {ei = true},
}},
{"togliere", {"gliere$"}, { --scegliere
nucleo = "gli",
nucleopres = {"lg"},
nucleoperf = {"ls"},
part = {"lto"},
}},
{"scindere", {"scindere$", "affiggere$", "crocifiggere$", "infiggere$", "defiggere$", "prefiggere$", "sufiggere$", "cotere$", "cutere$"}, {
nucleoperf = {"ss"},
nucleopart = {"ss"},
}},
{"radere", {"[aeiou]dere$", "[eu]ndere$", "ergere$"}, { --radere, suadere, invadere, ledere, ridere, scendere, cendere, difendere, defendere, offendere, pendere (appendere, spendere, dipendere, rispendere, rispendere, rispendere, rispendere), prendere, arrendere, tendere, tundere, plodere, rodere, ardere, mordere, udere, spargere, mergere, spergere, tergere, convergere, eccellere (defectivo), divergere pero no cadere
nucleoperf = {"s"},
nucleopart = {"s"},
}},
{"vincere", {"vincere$", "torcere$", "[lnr]gu?ere$", "solvere$"}, { -- torcere, volgere, indulgere, fulgere, angere, spengere, mingere, ingere, ungere, fungere, scorgere, -porgere, -accorgersi, sorgere, surgere, stinguere, solvere
nucleoperf = {"s"},
nucleopart = {"t"},
}},
{"succedere", {"succedere$", "concedere$", "retrocedere$", "perdere$"}, {
nucleoperf = {"ss", "REG"},
nucleopart = {"ss", "REG"},
}},
{"leggere", {"ggere$", "scrivere$"}, { -- eggere, ^figgere, configgere, rifiggere, scalfiggere, trafiggere, affliggere, infliggere, rifliggere, friggere, struggere, scrivere
nucleoperf = {"ss"},
nucleopart = {"tt"},
}},
{"chiedere", {"chiedere$", "rimanere$", "s[cp]ondere$"}, { -- tb. rimanere, scondere, spondere, pero no cedere o siedere
nucleoperf = {"s"},
nucleopart = {"st"},
}},
--regulares: vendere, credere, gemere, fremere, premere, temere, ricevere
},
["ire"] = {
{"benedire", {"benedire$", "mal[ea]dire$"}, {
nucleo = "d",
ger = {"dicendo"},
part = {"detto"},
part_pres = {"dicente"},
nucleopres = {"dic-dic-dic"},
nucleoperf = {"diss-dic"},
ind_imp = {{"dicevo"}, {"dicevi"}, {"diceva"}, {"dicevamo"}, {"dicevate"}, {"dicevano"}},
subj_imp = {{"dicessi"}, {"dicessi"}, {"dicesse"}, {"dicessimo"}, {"diceste"}, {"dicessero"}},
}},
{"dire", {"^dire$", "^ridd?ire$"}, {
ger = {"dicendo"},
part = {"detto"},
part_pres = {"dicente"},
nucleopres = {"dic-dic-dic"},
nucleoperf = {"diss-dic"},
ind_imp = {{"dicevo"}, {"dicevi"}, {"diceva"}, {"dicevamo"}, {"dicevate"}, {"dicevano"}},
subj_imp = {{"dicessi"}, {"dicessi"}, {"dicesse"}, {"dicessimo"}, {"diceste"}, {"dicessero"}},
imper = {nil, {"dì", "di'"}},
}},
{"cucire", {"cucire$"}, {
nucleopres = {"cuci"},
}},
{"uscire", {"uscire$"}, {
nucleopres = {"esc-esc"},
}},
{"sdrucire", {"sdrucire$"}, {
nucleopres = {"INCO", "sdruci"},
}},
{"udire", {"^udire$", "riudire$", "traudire$"}, {
nucleo = "ud",
nucleopres = {"od-od"},
nucleofut = {"udr"},
}},
{"salire", {"salire$"}, {
nucleopres = {"salg"},
part_pres = {"saliente", "salente"},
}},
{"seppellire", {"seppellire$"}, {
nucleopres = {"INCO"},
part = {"sepolto", "seppellito"},
}},
{"dormire", {"dormire$"}, {
part_pres = {"dormiente", "dormente"},
}},
{"venire", {"venire$"}, {
nucleopres = {"veng"},
nucleoperf = {"venn"},
part = {"venuto"},
nucleofut = {"verr"},
part_pres = {"veniente"},
}},
{"empire", {"empire$"}, {
perf = {{"empii", "empiei{R}"}, {"empisti", "empiesti{R}"}, {"empì", "empié{R}"}, {"empimmo", "empiemmo{R}"}, {"empiste", "empieste{R}"}, {"empirono", "empierono{R}"}},
part = {"empito", "empiuto{R}"},
ger = {"empiendo"},
part_pres = {"empiente"},
}},
{"adempire", {"mpire$"}, {
nucleo = "mp",
nucleopres = {"INCO"},
ger = {"mpiendo"},
part_pres = {"mpiente"},
}},
{"^sparire", {"^sparire$"}, {
nucleopres = {"INCO"},
nucleoperf = {"sparv", "spari{R}", "spars{R}"},
part = {"sparso"},
}},
{"disparire", {"disparire$"}, {
nucleopres = {"dispai"},
nucleoperf = {"REG", "disparvi"},
}},
{"trasparire", {"trasparire$"}, {
nucleopres = {"traspai", "INCO"},
}},
{"parire", {"parire$"}, {
nucleopres = {"pai", "INCO"},
nucleoperf = {"parv", "REG{R}", "pars{R}"},
part = {"parso"},
}},
{"inferire", {"inferire$"}, {
nucleopres = {"INCO"},
nucleoperf = {"infers"},
part = {"inferto"},
}},
{"profferire", {"profferire$"}, {
nucleopres = {"INCO"},
nucleoperf = {"REG", "proffers"},
part = {"profferto"},
}},
{"offrire", {"offrire$"}, {
nucleoperf = {"REG", "offers{R}"},
part = {"offerto"},
part_pres = {"offerente"},
}},
{"morire", {"morire$"}, {
nucleopres = {"muoi-muor"},
nucleoperf = {"mort"},
nucleofut = {"REG", "morr"},
part_pres = {"morente", "moriente{†}"},
}},
{"aprire", {"aprire$"}, {
nucleoperf = {"REG", "apers"},
part = {"aperto"},
}},
{"coprire", {"coprire$"}, {
nucleoperf = {"REG", "copersi"},
part = {"coperto"},
}},
{"nutrire", {"nutrire$"}, {
nucleopres = {"REG", "INCO{R}"},
part_pres = {"nutriente"},
}},
{"presentire", {"presentire$"}, {
nucleopres = {"REG", "INCO"},
part_pres = {},
}},
{"concepire", {"concepire"}, {
nucleopres = {"INCO"},
part_pres = {"concipiente"},
}},
{"sentire", {"sentire$"}, {
part_pres = {"sentente{R}", "senziente{ADJ}"},
}},
},
["arre"] = {
},
["orre"] = {
},
["urre"] = {
},
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo.sufijo_inf
local sufijos_ = conjinfo[forma].sufijos and sufijos[sufijo_inf][conjinfo[forma].sufijos]
or ((forma == "part" and conjinfo.hay_nucleopart) and sufijos[sufijo_inf][forma.."_alt"]
or (forma == "perf" and conjinfo.hay_nucleoperf and sufijos[sufijo_inf][forma.."_alt"]
or (forma == "imper" and conjinfo.hay_nucleopres4 and sufijos[sufijo_inf][forma.."_alt"]
or sufijos[sufijo_inf][forma])))
local nucleos
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "part" then
nucleos = conjinfo.nucleopart
elseif forma == "ger" or forma == "part_pres" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleopres1, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres3, conjinfo.nucleo_inf, conjinfo.nucleopres1}
elseif forma == "ind_imp" or forma == "subj_imp" then
nucleos = {conjinfo.nucleoimp, conjinfo.nucleoimp, conjinfo.nucleoimp, conjinfo.nucleoimp, conjinfo.nucleoimp, conjinfo.nucleoimp}
elseif forma == "perf" then
nucleos = {conjinfo.nucleoperf1, conjinfo.nucleoperf2, conjinfo.nucleoperf1, conjinfo.nucleoperf2, conjinfo.nucleoperf2, conjinfo.nucleoperf1}
elseif forma == "fut" or forma == "cond" then
nucleos = {conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres3, conjinfo.nucleopres3, conjinfo.nucleopres1}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleopres2, conjinfo.nucleopres1, conjinfo.nucleopres3, conjinfo.nucleopres4, conjinfo.nucleopres1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for j, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
for j, n in ipairs(nucleos) do
local nucleo, marca = match(n, "^(.*)([{%[].-[}%]])$")
if not marca then
nucleo = n
marca = ""
end
local sufijos__ = sufijos_
if nucleo == "REG" then
nucleo = conjinfo.nucleo_inf[1]
sufijos__ = sufijos[sufijo_inf][forma]
end
local k = 1
while sufijos__[k] do
local nexosufijo = combinar_nexo_sufijo(nexo, sufijos__[k], sufijo_inf)
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo))..marca)
k = k + 1
end
end
end
return
end
for i = IO, LORO do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
for j,n in ipairs(nucleos[i]) do
local nucleo, marca = match(n, "^(.*)([{%[].-[}%]])$")
if not marca then
nucleo = n
marca = ""
end
local sufijos__ = sufijos_
if nucleo == "REG" then
nucleo = conjinfo.nucleo_inf[1]
sufijos__ = sufijos[sufijo_inf][forma]
end
local k = i
while sufijos__[k] do
local nexosufijo = combinar_nexo_sufijo(nexo, sufijos__[k], sufijo_inf)
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo))..marca)
k = k + 6
if conjinfo[forma].ei then -- [[ripetere]]
break
end
end
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local auxs = fmtinfo.auxs
local arr = res[forma]
local t = {}
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest_ = i < NOI and resto or resto_pl
local rest_pl_ = resto_pl
if auxiliar["essere"][tiempo] and not auxs[1] then -- si es un tiempo compuesto y no hay participio, no debo mostrarlo
res[forma] = t
return
end
for _, v in ipairs(arr) do
local hs = auxiliar[auxs[1]][tiempo]
local v2
local rest = rest_
local rest_pl = rest_pl_
-- necesidad de duplicar los restos puesto que con essere hay que concordarlo en número al verbo
local v_ = v
local rest2 = rest_
local rest_pl2 = rest_pl_
if hs then
if auxs[1] == "essere" and i >= NOI then
v = gsub(v, "o([~#]?)$", "i%1")
end
rest = " "..v..rest
rest_pl = " "..v..rest_pl
v = auxiliar[auxs[1]][tiempo][i]
if auxs[2] then
if auxs[2] == "essere" and i >= NOI then
v_ = gsub(v_, "o([~#]?)$", "i%1")
end
v2 = auxiliar[auxs[2]][tiempo][i]
rest2 = " "..v_..rest2
rest_pl2 = " "..v_..rest_pl2
end
end
if forma == "inf" or forma == "inf_comp" then
if find(v, "[aei]re$") and pron == "si" then
v = sub(v, 1, -2)
end
insert(t, adv..v..pron..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..v..pron..art..f_links(rest_pl))
end
if v2 then
if find(v2, "[aei]re$") and pron == "si" then
v2 = sub(v2, 1, -2)
end
insert(t, adv..v2..pron..art..f_links(rest2))
if rest_pl ~= rest then
insert(t, adv..v2..pron..art..f_links(rest_pl2))
end
end
elseif forma == "ger" or forma == "ger_comp" then
local vpron = v..pron
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..f(vpron)..art..f_links(rest_pl))
end
if v2 then
vpron = v2..pron
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest2))
if rest_pl ~= rest then
insert(t, adv..f(vpron)..art..f_links(rest_pl2))
end
end
elseif forma == "part" or forma == "part_pres" then
insert(t, adv..f_links(v)..f_links(resto))
if (resto_pl ~= resto) then
insert(t, adv..f_links(v)..f_links(resto_pl))
end
elseif tiempo == "imper" and i ~= LUI and i ~= LORO then
local vpron = v
if pron == "si" then
local enc = REFLEXIVOS[i]
vpron = vpron..enc
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
else
local pronart = pron == "si" and REFLEXIVOS[i].." " or ""
pronart = art ~= "" and pronart..art.." " or pronart
insert(t, adv..pronart..f_links(v)..f_links(rest))
if v2 then
insert(t, adv..pronart..f_links(v2)..f_links(rest2))
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {alias_de = "aux"},
["impersonal"] = {por_defecto = ""},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["indirecto"] = {tipo = "bool"},
["nucleopres"] = {lista = true},
["núcleopres"] = {alias_de = "nucleopres"},
["nucleoimp"] = {lista = true},
["núcleoimp"] = {alias_de = "nucleoimp"},
["nucleoperf"] = {lista = true},
["núcleoperf"] = {alias_de = "nucleoperf"},
["nucleopart"] = {lista = true},
["núcleopart"] = {alias_de = "nucleopart"},
["nucleofut"] = {lista = true},
["núcleofut"] = {alias_de = "nucleofut"},
["paradigma"] = {lista = true},
["nota"] = {},
["aux"] = {},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if args["part"][1] == "no" or args["part"][1] == "-" then
args["aux"] = "a" -- para simplificar código, no tendrá efecto en las conjugaciones
end
if (args["aux"] ~= "a" and args["aux"] ~= "e" and args["aux"] ~= "ae" and args["part"][1] ~= "no") then
error("Especifique el auxiliar: a (avere), e (essere), ae (avere o essere), o especifique \"no\" en el participio si es defectivo")
end
local adv, r1 = match(tit, "^([sSnN][ío]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiou]r?re)(s?i?)(l?[aeo]?s?)(.-)$")
if not v then
v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiou]r)(s?i?)(l?[aeo]?s?)(.-)$")
if v then
v = v.."e"
end
end
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?n?"..ESPACIO.."?"..LETRA.."*[aeiou]r?res?i?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
local sufijo_inf = match(v, "[aeiou]r?re$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
local es_inco
local es_puro
local auxiliares
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["nucleopres"]),
maxindex(args["nucleoimp"]),
maxindex(args["nucleoperf"]),
maxindex(args["nucleopart"]),
maxindex(args["nucleofut"])) do
local conjinfo = {}
if find(v, "[^cg]iare$") and (not args["paradigma"][N] or args["paradigma"][N] == "") then
error("Especifique el (los) paradigma(s) para los verbos en -iare (abbaiare o avviare)")
end
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
local rxx = match(v, rx)
if args["paradigma"][N] == p[1] or rxx then
assert(rxx)
conjinfo = deepcopy(p[3])
conjinfo.rxx = rxx
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
local rxx = match(v, rx)
if args["paradigma"][N] == p[1] or rxx then
assert(rxx)
local vacio = true
if not conjinfo.rxx then
conjinfo.rxx = rxx -- no puede sobreescribir la información del paradigma irregular
end
for k, v in pairs(p[3]) do
vacio = false
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
if vacio then
paradigmas_reconocidos[p[1]] = true -- caso de [[anunciar]]
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
if find(args["nucleopres"][N] or "", "^INCO") then
paradigmas_reconocidos["partire"] = nil
paradigmas_reconocidos["finire"] = true
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
if conjinfo.rxx == conjinfo.sufijo_inf then
conjinfo.nucleo_inf = sub(v, 1, max(len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf), 0)) -- no busco regex porque pueden haberse cambiado
else
conjinfo.nucleo_inf = sub(conjinfo.rxx, 1, max(len(conjinfo.rxx) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf), 0))
end
end
if not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, max(len(v) - len(conjinfo.nucleo_inf) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf), 0))
end
conjinfo.nucleopres = args["nucleopres"][N] and {args["nucleopres"][N]} or conjinfo.nucleopres
conjinfo.nucleoimp = args["nucleoimp"][N] and {args["nucleoimp"][N]} or conjinfo.nucleoimp
conjinfo.nucleoperf = args["nucleoperf"][N] and {args["nucleoperf"][N]} or conjinfo.nucleoperf
conjinfo.nucleopart = args["nucleopart"][N] and {args["nucleopart"][N]} or conjinfo.nucleopart
conjinfo.nucleofut = args["nucleofut"][N] and {args["nucleofut"][N]} or conjinfo.nucleofut
local function parsear_nucleo(nucl_)
if not nucl_ then
return conjinfo.nucleo_inf
end
local nucl, marca = match(nucl_, "^(.*)([{%[].-[}%]])$")
if not marca then
nucl = nucl_
marca = ""
end
if nucl == "s" or nucl == "ss" or nucl == "t" or nucl == "tt" or nucl == "st" or nucl == "bb" then
local w = conjinfo.nucleo_inf
w = gsub(w, "nd$", "#"..nucl.."#")
w = gsub(w, "gg$", "#"..nucl.."#")
w = gsub(w, "sc$", "#"..nucl.."#")
w = gsub(w, "gu?$", "#"..nucl.."#")
w = gsub(w, "ll?$", "l#"..nucl.."#")
w = gsub(w, "ci?$", "#"..nucl.."#")
w = gsub(w, C.."$", "#"..nucl.."#")
return w..marca
end
if nucl == "REG" then
return conjinfo.nucleo_inf..marca
end
if nucl == "INCO" then
return gsub1(conjinfo.nucleo_inf, "i?$", "~isc~")..marca
end
if nucl == conjinfo.nucleo_inf then
return nucl..marca
end
return "#"..nucl.."#"..marca
end
local function insertar_nucleo_por_defecto(arr)
if not arr[1] then
arr[1] = conjinfo.nucleo_inf
end
end
conjinfo.nucleopres1 = {}
conjinfo.nucleopres2 = {}
conjinfo.nucleopres3 = {}
conjinfo.nucleopres4 = {}
if conjinfo.nucleopres then
for i,ns in ipairs(conjinfo.nucleopres) do
local a, b, c, d
a, b, c, d = match(ns, "^(.-)%-(.-)%-(.-)%-(.-)$")
if not d then
a, b, c = match(ns, "^(.-)%-(.-)%-(.-)$")
end
if not c then
a, b = match(ns, "^(.-)%-(.-)$")
end
if not b then
a = ns
end
if d then
conjinfo.hay_nucleopres4 = true
end
if find(a, "^INCO") then
insert_if_not(conjinfo.nucleopres1, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres2, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres3, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres4, conjinfo.nucleo_inf)
es_inco = true
else
insert_if_not(conjinfo.nucleopres1, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres2, parsear_nucleo(b))
insert_if_not(conjinfo.nucleopres3, parsear_nucleo(c))
insert_if_not(conjinfo.nucleopres4, parsear_nucleo(d))
es_puro = true
end
end
else
insert_if_not(conjinfo.nucleopres1, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres2, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres3, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres4, conjinfo.nucleo_inf)
end
conjinfo.nucleoperf1 = {}
conjinfo.nucleoperf2 = {}
if conjinfo.nucleoperf then
local aux = conjinfo.nucleoperf
for _,ns in ipairs(aux) do
local a, b = match(ns, "^(.-)%-(.-)$")
if b then
insert_if_not(conjinfo.nucleoperf1, parsear_nucleo(a))
insert_if_not(conjinfo.nucleoperf2, parsear_nucleo(b))
else
insert_if_not(conjinfo.nucleoperf1, parsear_nucleo(ns))
insert_if_not(conjinfo.nucleoperf2, conjinfo.nucleo_inf)
end
conjinfo.hay_nucleoperf = true
end
else
insert_if_not(conjinfo.nucleoperf1, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleoperf2, conjinfo.nucleo_inf)
end
if conjinfo.nucleoimp then
local aux = conjinfo.nucleoimp
conjinfo.nucleoimp = {}
for _,ns in ipairs(aux) do
insert_if_not(conjinfo.nucleoimp, parsear_nucleo(ns))
end
else
conjinfo.nucleoimp = {conjinfo.nucleo_inf}
end
if conjinfo.nucleopart then
local aux = conjinfo.nucleopart
conjinfo.nucleopart = {}
for _,ns in ipairs(aux) do
insert_if_not(conjinfo.nucleopart, parsear_nucleo(ns))
conjinfo.hay_nucleopart = true
end
else
conjinfo.nucleopart = {conjinfo.nucleo_inf}
end
if conjinfo.nucleofut then
local aux = conjinfo.nucleofut
conjinfo.nucleofut = {}
for _,ns in ipairs(aux) do
insert_if_not(conjinfo.nucleofut, parsear_nucleo(ns))
end
else
conjinfo.nucleofut = {conjinfo.nucleo_inf}
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local part_no_adj_pl = {}
for _,e in ipairs(part_no_adj) do
local partpl = gsub(e, "o([#~]?)$", "i%1")
insert(part_no_adj_pl, partpl)
end
local auxs = {}
if args.aux == "a" then
insert(auxs, "avere")
auxiliares = "avere"
elseif args.aux == "e" then
insert(auxs, "essere")
auxiliares = "essere"
elseif args.aux == "ae" then
insert(auxs, "avere")
insert(auxs, "essere")
auxiliares = "avere/essere"
else
auxiliares = "sin participio"
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"], auxs=auxs}
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local es_impersonal = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local impers = args["impersonal"]
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
-- REVISAR: cómo funcionan los verbos con el objeto indirecto??? (a x le y)
fila_pronombres_ind = {"", "(esso)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(esso)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(che esso)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(esso)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(esso)", "(essi)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(esso)", "(essi)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(che esso)", "(che essi)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(esso)", "(essi)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "io", "tu", "lui, lei", "noi", "voi", "essi, esse, loro", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "io", "tu", "lui, lei", "noi", "voi", "essi, esse, loro", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "che io", "che tu", "che lui, che lei", "che noi", "che voi", "che essi, che loro", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "(lui, lei)", "(noi)", "(voi)", "(essi, loro)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor((cs-1) / 2)
cs2 = cs - 1 - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio pasado", header=true, color=COLOR_NP}, resultante.part}
t[5] = {{"Participio presente", header=true, color=COLOR_NP}, resultante.part_pres}
t[6] = {{"Auxiliar", header=true, color=COLOR_NP}, {concat(auxs, ", ")}}
else
resultante.inf.colspan = cs1
resultante.ger.colspan = cs1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
resultante.part.colspan = cs - 1
resultante.part_pres.colspan = cs - 1
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio pasado", header=true, color=COLOR_NP}, resultante.part}
t[5] = {{"Participio presente", header=true, color=COLOR_NP}, resultante.part_pres}
t[6] = {{"Auxiliar", header=true, color=COLOR_NP}, {concat(auxs, ", "), colspan=cs-1}}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
t[7] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[8] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[9] = fila_pronombres_ind
t[10] = {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")}
t[11] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")}
t[12] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("perf")}
t[13] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")}
t[14] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("perf_comp")}
t[15] = {{"Futuro", color=COLOR_IND, header=true}, ic("fut")}
t[16] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("fut_comp")}
t[17] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("anter")}
t[18] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[19] = fila_pronombres_cond
t[20] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[21] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[22] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[23] = fila_pronombres_subj
t[24] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[25] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")}
t[26] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")}
t[27] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")}
t[28] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[29] = fila_pronombres_imper
if mostrar_imper then
t[30] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[30] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[31] = {{f("Leyenda: † arcaico, x no normativo, R raro, L literario, G geminado, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[32] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "IT:Verbos irregulares")
paradigmas_reconocidos["avviare"] = nil
paradigmas_reconocidos["amare"] = nil
paradigmas_reconocidos["temere"] = nil
paradigmas_reconocidos["partire"] = nil
paradigmas_reconocidos["porre"] = nil
paradigmas_reconocidos["condurre"] = nil
else
insert(cats, "IT:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "IT:Verbos del paradigma "..p)
end
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "IT:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "IT:Verbos terciopersonales")
end
if defectivo then
insert(cats, "IT:Verbos defectivos")
end
local inc_enc
if sufijo_inf == "are" then
insert(cats, "IT:Verbos de la primera conjugación")
elseif sufijo_inf == "ere" then
insert(cats, "IT:Verbos de la segunda conjugación")
elseif sufijo_inf == "ire" then
insert(cats, "IT:Verbos de la tercera conjugación")
if not es_inco and not es_puro then
insert(cats, "IT:Verbos puros")
es_puro = true
inc_enc = "puro"
elseif es_inco and es_puro then
insert(cats, "IT:Verbos incoativos")
insert(cats, "IT:Verbos puros")
inc_enc = "incoativo/puro"
elseif es_inco then
insert(cats, "IT:Verbos incoativos")
inc_enc = "incoativo"
elseif es_puro then
insert(cats, "IT:Verbos puros")
inc_enc = "puro"
end
elseif sufijo_inf == "orre" then
insert(cats, "IT:Verbos de la cuarta conjugación")
elseif sufijo_inf == "urre" then
insert(cats, "IT:Verbos de la quinta conjugación")
end
local q_t = {es_irregular and "irregular" or "regular", auxiliares, inc_enc}
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..concat(q_t, ", ")..")",
t,
ns == 0 and cats or {})
end
return export
4wnh3dpqhtjtrwrcwt8wp3r93ufnvkx
Módulo:flex/pt
828
1055289
6307343
6118181
2026-08-06T00:34:36Z
TMCbot
164594
.
6307343
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_INF = m_flex.COLOR_INF
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local tilde = u(0x301)
local unaccented_vowel = "aeiouàAEIOUÀ"
local accented_vowel = "áéíóúýâêôÁÉÍÓÚÝÂÊÔ"
local maybe_accented_vowel = "ãõÃÕ"
local vowel = unaccented_vowel .. accented_vowel .. maybe_accented_vowel
local cons = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ"
local V = "[" .. vowel .. "]"
local AV = "[" .. accented_vowel .. "]"
local NAV = "[^" .. accented_vowel .. "]"
local C = "[" .. cons .. "]"
local espacios = "%s"
local espacios_o_guiones = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local ESPACIO_O_GUION = "["..espacios_o_guiones.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local remove_accent = {
["á"]="a", ["é"]="e", ["í"]="i", ["ó"]="o", ["ú"]="u", ["ý"]="y", ["â"]="a", ["ê"]="e", ["ô"]="o",
["Á"]="A", ["É"]="E", ["Í"]="I", ["Ó"]="O", ["Ú"]="U", ["Ý"]="Y", ["Â"]="A", ["Ê"]="E", ["Ô"]="O"
}
local function es_locucion(tit, cop)
return find(tit, LETRA..ESPACIO_O_GUION..LETRA) or (cop ~= nil and find(tit, LETRA..ESPACIO_O_GUION..LETRA))
end
local function try(p, nexo, m, pl, f, fpl, g, s)
if s == true then
if pl == "es" then
pl = "s"
end
end
local r, n, suf = match(p, "^(.-)("..nexo..")("..m..")$")
if suf then
if type(n) ~= "string" then
n = ""
end
if type(suf) ~= "string" then
suf = ""
end
if pl and find(pl, "#") then
if g == "mf" and f then
return {m={r.."~"..n..suf.."~"}, p={r..n..pl}, f={r..n..f}, fp={r..n..fpl}}
elseif pl then
return {m={r.."~"..n..suf.."~"}, p={r..n..pl}, f={}, fp={}}
else
return {m={r.."~"..n..suf.."~"}, p={}, f={}, fp={}}
end
else
if g == "mf" and f then
return {m={r.."~"..n..suf.."~"}, p={r.."~"..n..pl.."~"}, f={r.."~"..n..f.."~"}, fp={r.."~"..n..fpl.."~"}}
elseif pl then
return {m={r.."~"..n..suf.."~"}, p={r.."~"..n..pl.."~"}, f={}, fp={}}
else
return {m={r.."~"..n..suf.."~"}, p={}, f={}, fp={}}
end
end
end
return nil
end
local function flexionar_palabra(p, g, forzar_s)
local r, v, s = match(p, "^(.*)("..AV..")(.-n)$")
if s then
local w = remove_accent[v]
if g == "mf" then
if forzar_s then
return {m={r.."~"..v..s.."~"}, p={r.."#"..w..s.."s#"}, f={r.."~"..v..s.."a~"}, fp={r.."~"..v..s.."as~"}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..v..s.."es~", r.."~"..w..s.."s~"}, f={r.."~"..v..s.."a~"}, fp={r.."~"..v..s.."as~"}}
end
else
if forzar_s then
return {m={r.."~"..v..s.."~"}, p={r.."#"..w..s.."s#"}, f={}, fp={}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..v..s.."es~", r.."~"..w..s.."s~"}, f={}, fp={}}
end
end
end
r, v, s = match(p, "^(.*[aeiou])([íú])(s)$") -- [[país]]
if v then
if g == "mf" then
return {m={r.."~"..v..s.."~"}, p={r.."~"..v.."ses~"}, f={r.."~"..v.."sa~"}, fp={r.."~"..v.."sas~"}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..v.."ses~"}, f={}, fp={}}
end
end
r, v, s = match(p, "^(.*)(" .. AV .. ")(s)$") -- final -ês, -ós etc.
if v then
local w = remove_accent[v]
if g == "mf" then
return {m={r.."~"..v..s.."~"}, p={r.."~"..w.."ses~"}, f={r.."~"..w.."sa~"}, fp={r.."~"..w.."sas~"}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..w.."ses~"}, f={}, fp={}}
end
end
local changed = try(p, "", "ão", forzar_s and "#ãos#" or "ões", forzar_s and "#ã#" or "ona", forzar_s and "#ãs#" or "onas", g, s)
or try(p, AV .. ".*", "[ei]l", "eis", nil, nil, g, s) -- final unstressed -el or -il: inábil, imcerivel
or try(p, "", "el", "éis", nil, nil, g, s) -- final stressed -el: cartel
or try(p, "", "il", "is", nil, nil, g, s) -- final stressed -il: hostil
or try(p, AV .. ".*", "ol", "ois", nil, nil, g, s) -- final unstressed -ol
or try(p, "", "ol", "óis", "ola", "olas", g, s) -- final stressed -ol: espanhol (otras como mongol son comunes en género)
or try(p, V, "l", "is", nil, nil, g, s) -- any other vowel + -l: escencial, baul, etc. sin femenino
or try(p, "", "m", "ns", nil, nil, g, s) -- final -m: jovem, asumo que es invariante aunque para bom sería boa?
or try(p, "or", "", forzar_s and "#s#" or "es", "a", "as", g, s) -- -or con femenino (tutor)
or try(p, "[rz]", "", forzar_s and "#s#" or "es", nil, nil, g, s) -- final -r or -z
or try(p, "", "eu", "eus", "eia", "eias", g, s)
or try(p, "", "u", "us", "ua", "uas", g, s)
or try(p, "", "o", "os", "a", "as", g, s)
or try(p, V, "", "s", nil, nil, g, s) -- final vowel
or try(p, AV .. ".*", "[ui]s", nil, nil, nil, g, s) -- final unstressed -us or -is
or try(p, C, "[ui]s", "es", "a", "as", g, s) -- final stressed -us or -is after consonant
or try(p, "", "[ui]s", nil, nil, nil, g, s) -- final stressed -us or -is after vowel
or try(p, "[sx]", "", nil, nil, nil, g, s)
or try(p, "ch", "", forzar_s and "#s#" or "es", nil, nil, g, s) -- extranjerismos
or try(p, "n", "", forzar_s and "#s#" or "es", "a", "as", g, s)
or try(p, C, "", "s", nil, nil, g, s) -- extranjerismos
assert(changed, "No se pudo determinar la flexión de la palabra")
return changed
end
local function flexion_sust_adj(palabras, g, forzar_s, copulativa)
local a, separador, b
if copulativa == true or copulativa == false then
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO_O_GUION..")("..LETRA.."+)$")
else
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
end
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto
if copulativa == false then
p, resto = match(palabras, "^(%-?[^"..espacios_o_guiones.."]+)(.-)$")
else
p, resto = match(palabras, "^("..LETRA.."+)(.-)$")
end
local flex = flexionar_palabra(p, g, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif es_locucion(title, args["cop"]) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "PT:Locuciones sustantivas" or "PT:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "PT:Locuciones adjetivas" or "PT:Adjetivos")
end
local EU, TU, ELE, NOS, VOS, ELES = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"eu", "tu", "ele, ela, você", "nós", "vós", "vocês, eles, elas"}
local PRONOMBRES_INF = {"por eu", "por tu", "por ele, por ela, por você", "por nós", "por vós", "por vocês, por eles, por elas"}
local PRONOMBRES_SUBJ = {"que eu", "que tu", "que ele, que ela, que você", "que nós", "que vós", "que vocês, que eles, que elas"}
local PRONOMBRES_IMP = {"―", "(tu)", "(você)", "(nós)", "(vós)", "(vocês)"}
local IMPERSONALES_INF = {"", "", "(por isso)", "", "", "(por issos)"}
local IMPERSONALES = {"", "", "(isso)", "", "", "(issos)"}
local IMPERSONALES_SUBJ = {"", "", "(que isso)", "", "", "(que issos)"}
local REFLEXIVOS = {"me", "te", "se", "nos", "vos", "se"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
["inf_pers"] = true,
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_pluperf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["inf_pers_comp"] = true,
["ind_perf_comp"] = true,
["ind_pluperf_comp"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
["subj_fut_comp"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local antepuesto = {
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["subj_perf"] = true,
["subj_imp_comp"] = true,
["subj_fut_comp"] = true,
}
local interpuesto = {
["ind_fut"] = true,
["ind_fut_comp"] = true,
["cond"] = true,
["cond_comp"] = true
}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^inf_pers") then
return IMPERSONALES_INF[p]
end
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^inf_pers") then
return PRONOMBRES_INF[p]
elseif find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local sufijos = {
{ -- ar
["ger"] = {"ando"},
["part"] = {"ado"},
["inf_pers"] = {"ar", "ares", "ar", "armos", "ardes", "arem"},
["ind_pres"] = {"o", "as", "a", "amos", "ais", "am"},
["ind_imp"] = {"ava", "avas", "ava", "ávamos", "áveis", "avam"},
["ind_perf"] = {"ei", "aste", "ou", "amos{BR}", "astes", "aram",
nil, nil, nil, "ámos{PT}", nil, nil},
["ind_perf_alt"] = {"ei", "aste", "ou", "amos{BR}", "astes", "aram",
nil, nil, nil, "ámos{PT}", nil, nil},
["ind_pluperf"] = {"ara", "aras", "ara", "áramos", "áreis", "aram"},
["ind_fut"] = {"arei", "arás", "ará", "aremos", "areis", "arão"},
["subj_pres"] = {"e", "es", "e", "emos", "eis", "em"},
["subj_imp"] = {"asse", "asses", "asse", "ássemos", "ásseis", "assem"},
["subj_fut"] = {"ar", "ares", "ar", "armos", "ardes", "arem"},
["cond"] = {"aria", "arias", "aria", "aríamos", "aríeis", "ariam"},
["imper"] = {"-", "a", "e", "emos", "ai", "em"}
},
{ -- er
["ger"] = {"endo"},
["part"] = {"ido"},
["inf_pers"] = {"er", "eres", "er", "ermos", "erdes", "erem"},
["ind_pres"] = {"o", "es", "e", "emos", "eis", "em"},
["ind_imp"] = {"ia", "ias", "ia", "íamos", "íeis", "iam"},
["ind_perf"] = {"i", "este", "eu", "emos", "estes", "eram"},
["ind_perf_alt"] = {"e", "este", "e", "emos", "estes", "eram"},
["ind_pluperf"] = {"era", "eras", "era", "êramos", "êreis", "eram"},
["ind_fut"] = {"erei", "erás", "erá", "eremos", "ereis", "erão"},
["subj_pres"] = {"a", "as", "a", "amos", "ais", "am"},
["subj_imp"] = {"esse", "esses", "esse", "êssemos", "êsseis", "essem"},
["subj_fut"] = {"er", "eres", "er", "ermos", "erdes", "erem"},
["cond"] = {"eria", "erias", "eria", "eríamos", "eríeis", "eriam"},
["imper"] = {"-", "e", "a", "amos", "ei", "am"}
},
{ -- ir
["ger"] = {"indo"},
["part"] = {"ido"},
["inf_pers"] = {"ir", "ires", "ir", "irmos", "irdes", "irem"},
["ind_pres"] = {"o", "es", "e", "imos", "is", "em"},
["ind_imp"] = {"ia", "ias", "ia", "íamos", "íeis", "iam"},
["ind_perf"] = {"i", "iste", "iu", "imos", "istes", "iram"},
["ind_perf_alt"] = {"e", "este", "e", "emos", "estes", "eram"},
["ind_pluperf"] = {"ira", "iras", "ira", "íramos", "íreis", "iram"},
["ind_fut"] = {"irei", "irás", "irá", "iremos", "ireis", "irão"},
["subj_pres"] = {"a", "as", "a", "amos", "ais", "am"},
["subj_imp"] = {"isse", "isses", "isse", "íssemos", "ísseis", "issem"},
["subj_fut"] = {"ir", "ires", "ir", "irmos", "irdes", "irem"},
["cond"] = {"iria", "irias", "iria", "iríamos", "iríeis", "iriam"},
["imper"] = {"-", "e", "a", "amos", "i", "am"}
},
{ -- or
["ger"] = {"ondo"},
["part"] = {"osto"},
["inf_pers"] = {"or", "ores", "or", "ormos", "ordes", "orem"},
["ind_pres"] = {"onho", "ões", "õe", "omos", "ondes", "õem"},
["ind_imp"] = {"unha", "unhas", "unha", "únhamos", "únheis", "unham"},
["ind_perf"] = {"us", "useste", "ôs", "usemos", "usestes", "useram"},
["ind_perf_alt"] = {"e", "este", "e", "emos", "estes", "eram"},
["ind_pluperf"] = {"usera", "useras", "usera", "uséramos", "uséreis", "useram"},
["ind_fut"] = {"orei", "orás", "orá", "oremos", "oreis", "orão"},
["subj_pres"] = {"onha", "onhas", "onha", "onhamos", "onhais", "onham"},
["subj_imp"] = {"usesse", "usesses", "usesse", "uséssemos", "usésseis", "usessem"},
["subj_fut"] = {"user", "useres", "user", "usermos", "userdes", "userem"},
["cond"] = {"oria", "orias", "oria", "oríamos", "oríeis", "oriam"},
["imper"] = {"-", "õe", "onha", "onhamos", "onde", "onham"}
},
}
local auxiliar = {
["inf_comp"] = {"ter"},
["ger_comp"] = {"tendo"},
["inf_pers_comp"] = {"ter", "teres", "ter", "termos", "terdes", "terem"},
["ind_perf_comp"] = {"tenho", "tens", "tem", "temos", "tendes", "têm"},
["ind_pluperf_comp"] = {"tinha", "tinhas", "tinha", "tínhamos", "tínheis", "tinham"},
["ind_anter"] = {"tive", "tiveste", "teve", "tivemos", "tivestes", "tiveram"},
["ind_fut_comp"] = {"terei", "terás", "terá", "teremos", "tereis", "terão"},
["cond_comp"] = {"teria", "terias", "teria", "teríamos", "teríeis", "teriam"},
["subj_perf"] = {"tenha", "tenhas", "tenha", "tenhamos", "tenhais", "tenham"},
["subj_pluperf"] = {"tivesse", "tivesses", "tivesse", "tivéssemos", "tivésseis", "tivessem"},
["subj_fut_comp"] = {"tiver", "tiveres", "tiver", "tivermos", "tiverdes", "tiverem"}
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "ar" then
return sufijos[1][forma]
elseif sufijo_inf == "er" then
return sufijos[2][forma]
elseif sufijo_inf == "ir" then
return sufijos[3][forma]
else
return sufijos[4][forma]
end
end
local paradigmas_regulares = {
["ar"] = {
{"complicar", {"car$"}, {
nexo = "c"
}},
{"frear", {"ear$"}, {
nexo = "e"
}},
{"chegar", {"gar$"}, {
nexo = "g"
}},
{"começar", {"çar$"}, {
nexo = "ç"
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"erguer", {"guer$"}, {
nexo = "gu"
}},
{"parecer", {"cer$"}, {
nexo = "c"
}},
{"proteger", {"ger$"}, {
nexo = "g"
}},
{"roer", {"oer$"}, {
nexo = "o"
}},
{"temer", {"er$"}, {
}},
},
["ir"] = {
{"argüir", {"güir$"}, {
nexo = "gü",
}},
{"delinqüir", {"qüir$"}, {
nexo = "qü",
}},
{"extorquir", {"quir$"}, {
nexo = "qu"
}},
{"distinguir", {"guir$"}, {
nexo = "gu"
}},
{"produzir", {"uzir$"}, {
nexo = "z",
}},
{"ressarcir", {"cir$"}, {
nexo = "c"
}},
{"dirigir", {"gir$"}, {
nexo = "g"
}},
{"fluir", {"uir$"}, {
nexo = "u"
}},
{"partir", {"ir$"}, {
}},
},
["or"] = {
{"pôr", {"or$"}, {
}},
},
["ôr"] = {
{"pôr", {"ôr$"}, {
}}
}
}
local paradigmas_irregulares = {
["ar"] = {
{"dar", {"^dar$", "^redar$", "desdar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"dou"}, {"dás"}, {"dá"}, nil, nil, {"dão"}},
ind_perf = {sufijo_inf = "er", {"dei"}},
ind_pluperf = {sufijo_inf = "er"},
subj_pres = {{"dê"}, {"dês"}, {"dê"}, nil, nil, {"deem"}},
subj_imp = {sufijo_inf = "er"},
subj_fut = {sufijo_inf = "er"},
imper = {nil, {"dá"}, {"dê"}, nil, nil, {"deem"}}
}},
{"estar", {"^estar$", "^tar$"}, {
nucleo = "t",
ind_pres = {{"tou"}, {"tás"}, {"tá"}, nil, nil, {"tão"}},
ind_perf = {nucleo = "tiv", sufijo_inf = "er"},
ind_pluperf = {nucleo = "tiv", sufijo_inf = "er"},
subj_pres = {nucleo = "tej", sufijo_inf = "er"},
subj_imp = {nucleo = "tiv", sufijo_inf = "er"},
subj_fut = {nucleo = "tiv", sufijo_inf = "er"},
imper = {nil, {"tá"}, {"teja"}, {"tejamos"}, nil, {"tejam"}}
}},
{"ansiar", {"ansiar$"}, {
alt = {"ei-ei"},
}},
{"fraguar", {V.."guar$"}, {
nexo = "u", -- evitar que acentúe en la "u"
alt = {"´-´"},
}},
{"descafeinar", {"descafeinar$"}, {
alt = {"í-í"},
}},
{"saudar", {"saudar$"}, {
alt = {"ú-ú"},
}},
},
["er"] = {
{"caber", {"^caber$"}, {
nucleo = "cab",
nucleos1 = {"caib"},
ind_perf = {nucleo = "coub"},
ind_pluperf = {nucleo = "coub"},
subj_imp = {nucleo = "coub"},
subj_fut = {nucleo = "coub"},
}},
{"dizer", {"dizer$"}, {
nucleo = "diz",
nucleos1 = {"dig"},
part = {"dito"},
ind_pres = {nil, nil, {"diz"}},
ind_perf = {nucleo = "diss"},
ind_pluperf = {nucleo = "diss"},
subj_imp = {nucleo = "diss"},
subj_fut = {nucleo = "diss"},
ind_fut = {nucleo = "di", nexo="#r#"},
cond = {nucleo = "di", nexo="#r#"},
imper = {nil, {"diz", "dize"}}
}},
{"fazer", {"fazer$"}, {
nucleo = "faz",
nucleos1 = {"faç"},
part = {"feito"},
ind_pres = {nil, nil, {"faz"}},
ind_perf = {nucleo = "fiz", nil, nil, {"fez"}},
ind_pluperf = {nucleo = "fiz"},
subj_imp = {nucleo = "fiz"},
subj_fut = {nucleo = "fiz"},
ind_fut = {nucleo = "fa", nexo = "#r#"},
cond = {nucleo = "fa", nexo = "#r#"},
imper = {nil, {"faz", "faze"}},
}},
{"haver", {"^haver$", "^reaver$"}, {
nucleo = "av",
ind_pres = {{"ei"}, {"ás"}, {"á"}, nil, nil, {"ão"}},
ind_perf = {nucleo = "ouv"},
ind_pluperf = {nucleo = "ouv"},
subj_pres = {nucleo = "aj"},
subj_imp = {nucleo = "ouv"},
subj_fut = {nucleo = "ouv"},
imper = {nil, {"á{†}"}, {"aja{†}"}, {"ajamos{†}"}, {"avei{†}"}, {"ajam{†}"}},
}},
{"prazer", {"prazer$"}, {
nucleo = "praz",
ind_pres = {nil, nil, {"praz"}},
ind_perf = {nucleo = "prouv"},
ind_pluperf = {nucleo = "prouv"},
subj_imp = {nucleo = "prouv"},
subj_fut = {nucleo = "prouv"},
imper = {nil, {"praz", "praze"}}
}},
{"poder", {"poder$"}, {
nucleo = "pod",
nucleos1 = {"poss"},
ind_perf = {nucleo = "pud", nil, nil, {"pôde"}},
ind_pluperf = {nucleo = "pud"},
subj_imp = {nucleo = "pud"},
subj_fut = {nucleo = "pud"},
}},
{"querer", {"querer$"}, {
nucleo = "quer", -- no uso nucleos1 para que no sobreescriba ind_pres
ind_pres = {nil, nil, {"quer"}},
ind_perf = {nucleo = "quis", {"quis"}, nil, {"quis"}},
ind_pluperf = {nucleo = "quis"},
subj_pres = {nucleo = "queir"},
subj_imp = {nucleo = "quis"},
subj_fut = {nucleo = "quis"},
imper = {nil, {"quer"}, {"queira"}, {"queiramos"}, nil, {"queiram"}}
}},
{"rer", {"^rer$"}, { -- según infopédia
nucleos1 = {"rei"},
ind_pres = {nil, {"rês"}, {"rê"}, nil, {"redes"}, {"rêem"}},
imper = {nil, {"rê"}, nil, nil, {"rede"}}
}},
-- según infopédia, raer es regular y defectivo en las formas rizotónicas
{"romper", {"^romper$", "^arromper$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
part = {"roto", "rompido"}
}},
{"saber", {"saber$"}, {
nucleo = "sab",
nucleos1 = {"saib"},
ind_pres = {{"sei"}},
ind_perf = {nucleo = "soub"},
ind_pluperf = {nucleo = "soub"},
subj_imp = {nucleo = "soub"},
subj_fut = {nucleo = "soub"},
}},
{"ser", {"^ser$"}, {
nucleos1 = {"sej"},
ind_pres = {{"sou"}, {"és"}, {"é"}, {"somos"}, {"sois"}, {"são"}},
ind_imp = {{"era"}, {"eras"}, {"era"}, {"éramos"}, {"éreis"}, {"eram"}},
ind_perf = {{"fui"}, {"foste"}, {"foi"}, {"fomos"}, {"fostes"}, {"foram"}},
ind_pluperf = {{"fora"}, {"foras"}, {"fora"}, {"fôramos"}, {"fôreis"}, {"foram"}},
subj_imp = {{"fosse"}, {"fosses"}, {"fosse"}, {"fôssemos"}, {"fôsseis"}, {"fossem"}}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {{"for"}, {"fores"}, {"for"}, {"formos"}, {"fordes"}, {"forem"}},
imper = {nil, {"sê"}, nil, nil, {"sede"}}
}},
{"ter", {"^ter$", "suster$", "manter$", "^ater$", "abster$", "obter$", "^reter$", "deter$", "conter$"}, {
nucleo = "t",
nucleos1 = {"tenh"},
ind_pres = {nil, {"tens"}, {"tem"}, nil, {"tendes"}, {"têm"}},
ind_imp = {nucleo = "tinh"},
ind_perf = {nucleo = "tiv"},
ind_pluperf = {nucleo = "tiv"},
subj_imp = {nucleo = "tiv"},
subj_fut = {nucleo = "tiv"},
imper = {nil, {"tem"}, nil, nil, {"tende"}}
}},
{"trazer", {"trazer$"}, {
nucleo = "traz",
nucleos1 = {"trag"},
ind_pres = {nil, nil, {"traz"}},
ind_perf = {nucleo = "troux"},
ind_pluperf = {nucleo = "troux"},
subj_imp = {nucleo = "troux"},
subj_fut = {nucleo = "troux"},
ind_fut = {nucleo = "tra", nexo = "#r#"},
cond = {nucleo = "tra", nexo = "#r#"},
imper = {nil, {"traz"}}
}},
{"ver", {"^ver$", "antever$", "entrever$", "prever$", "^rever$", "prover$"}, {
nucleo = "v",
nucleos1 = {"vej"},
part = {"visto"},
ind_pres = {nil, {"vês"}, {"vê"}, nil, {"vedes"}, {"veem"}},
ind_perf = {sufijo_inf = "ir"},
ind_pluperf = {sufijo_inf = "ir"},
subj_imp = {sufijo_inf = "ir"},
subj_fut = {sufijo_inf = "ir"},
imper = {nil, {"vê"}, nil, nil, {"vede"}}
}},
{"jazer", {"jazer$"}, {
nucleo = "jaz",
ind_pres = {nil, nil, "jaz"}
}},
{"ler", {"^ler$", "^reler$", "crer$"}, {
nucleo = "",
nucleos1 = {"ei"},
ind_pres = {nil, nil, {"ê"}, nil, {"edes"}, {"eem"}},
imper = {nil, {"ê"}, nil, nil, {"ede"}, nil}
}},
{"escrever", {"screver$"}, {
nucleo = "screv",
part = {"scrito"}
}},
{"morrer", {"morrer$"}, {
nucleo = "morr",
part = {"morrido", "morto"},
}},
{"valer", {"valer$"}, {
alt = {"h"},
}},
},
["ir"] = {
{"abrir", {"[^js]abrir$", "^abrir$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"aberto"}
}},
{"cobrir", {"obrir$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "obr",
part = {"oberto"},
alt = {"u"},
}},
{"rir", {"^rir$", "sorrir$"}, {
nucleo = "r",
nucleos1 = {"ri"},
nucleos2 = {"ri"},
nucleos3 = {"ri"},
ind_pres = {nil, {"ris"}, {"ri"}, nil, {"rides"}},
imper = {nil, {"ri"}, nil, nil, {"ride"}, nil}
}},
{"imprimir", {"imprimir$"}, {
nucleo = "imprim",
part = {"imprimido", "impresso"}
}},
{"ir", {"^ir$"}, {
ind_pres = {{"vou"}, {"vais"}, {"vai"}, {"vamos"}, {"ides"}, {"vão"}},
ind_perf = {{"fui"}, {"foste"}, {"foi"}, {"fomos"}, {"fostes"}, {"foram"}},
ind_pluperf = {nexo = "#fo#", nil, nil, nil, {"fôramos"}, {"fôreis"}},
subj_pres = {{"vá"}, {"vás"}, {"vá"}, {"vamos"}, {"vades"}, {"vão"}},
subj_imp = {nexo = "#fo#", nil, nil, nil, {"fôssemos"}, {"fôsseis"}}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {nexo = "#fo#"},
imper = {nil, {"vai"}, {"vá"}, {"vamos"}, {"ide"}, {"vão"}}
}},
{"vir", {"^vir$", "^avir$", "advir$", "convir$", "contravir$", "devir$", "^desavir$", "entrevir$", "intervir$", "obvir$", "provir$", "^revir$", "sobrevir$"}, {
nucleo = "v",
nucleos1 = {"venh"},
ind_pres = {nil, {"vens"}, {"vem"}, nil, {"vindes"}, {"vêm"}},
ind_imp = {{"vinha"}, {"vinhas"}, {"vinha"}, {"vínhamos"}, {"vínheis"}, {"vinham"}},
ind_perf = {{"vim"}, {"vieste"}, {"veio"}, {"viemos"}, {"viestes"}, {"vieram"}},
ind_pluperf = {{"viera"}, {"vieras"}, {"viera"}, {"viéramos"}, {"viéreis"}, {"vieram"}},
subj_imp = {{"viesse"}, {"viesses"}, {"viesse"}, {"viéssemos"}, {"viésseis"}, {"viessem"}},
subj_fut = {{"vier"}, {"vieres"}, {"vier"}, {"viermos"}, {"vierdes"}, {"vierem"}},
imper = {nil, {"vem"}, nil, nil, {"vinde"}, nil}
}},
{"frigir", {"frigir$"}, {
nucleo = "fri",
part = {"frigido", "frito"},
alt = {"-e"},
}},
{"construir", {"construir$", "destruir$"}, {
nucleo = "tr",
ind_pres = {nil, {"tróis"}, {"trói"}, nil, nil, {"troem"}},
imper = {nil, {"trói"}},
}},
{"cair", {"air$"}, {
nucleo = "a",
alt = {"ai"},
ind_pres = {nil, {"ais"}, {"ai"}},
imper = {nil, {"ai"}},
}},
{"parir", {"parir$"}, {
alt = {"ai"},
}},
{"sentir", {"sentir$"}, {
alt = {"i"},
}},
{"agredir", {"gredir$"}, {
alt = {"i-i-i"}
}},
{"proibir", {"proibir$"}, {
alt = {"í-í"}
}},
{"reunir", {"reunir$"}, {
alt = {"ú-ú"}
}},
{"dormir", {"dormir$"}, {
alt = {"u"},
}},
{"polir", {"polir$"}, {
alt = {"u-u-u"},
}},
{"fugir", {"fugir$"}, { --fugir, bulir
alt = {"-o"},
}},
{"ouvir", {"ouvir$", "edir$"}, {
alt = {"ç"},
}},
{"arguir", {"arguir$"}, {
nexo = "GU",
}},
{"delinquir", {"delinquir$"}, {
nexo = "QU",
}},
},
["or"] = {
},
["ôr"] = {
}
}
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf, forma)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if find(sufijo, "^[aeo][ms]?$") then
if nexo == "e" then
return "~ei~"..sufijo
end
end
if find(sufijo, "^[eiéí]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "ç" then
return "~c~"..sufijo
end
end
else -- -er/-ir/-or
if sufijo == "e" and forma == "ind_pres" then
if nexo == "z" then
return "~z~"
end
end
if sufijo == "e" and forma == "imper" then
if nexo == "z" then
return "~z~", nexo..sufijo
end
end
if find(sufijo, "^er") then -- [[dizer]]
if nexo == "#r#" then
return nexo..sub(sufijo, 3)
end
end
if find(sufijo, "^[aouáóú]") then
if nexo == "c" then
return "~ç~"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
if nexo == "gu" then
return "~g~"..sufijo
end
if nexo == "gü" then
return "g~u~"..sufijo
end
if nexo == "qu" then
return "~c~"..sufijo
end
if nexo == "qü" then
return "q~u~"..sufijo
end
if nexo == "GU" then
return "#gu#"..sufijo
end
if nexo == "QU" then
return "#qu#"..sufijo
end
end
if find(sufijo, "^es?$") then
if nexo == "o" then
return "~ói~"..sub(sufijo, 2)
end
if nexo == "u" then
return nexo.."~i~"..sub(sufijo, 2)
end
if nexo == "gü" then -- arguir
return nexo.."~i~"..sub(sufijo, 2)
end
if nexo == "GU" then -- arguir
return "gu~i~"..sub(sufijo, 2)
end
end
if find(sufijo, "^is?$") then
if nexo == "gü" then -- arguir
return nexo.."~í~"..sub(sufijo, 2)
end
if nexo == "GU" then -- arguir
return "gu~í~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i") then
if nexo == "o" then
return "o~í~"..sub(sufijo, 2)
end
if nexo == "#fo#" then
return nexo..sub(sufijo, 2)
end
end
if (forma ~= "ind_fut" and forma ~= "cond") and find(sufijo, "^ir[ae]") or find(sufijo, "^i[^ru]") or find(sufijo, "^i$") then
if nexo == "u" then
return nexo.."~í~"..sub(sufijo, 2)
end
end
end
if nexo == "GU" then
return "gu"..sufijo
end
if nexo == "QU" then
return "qu"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "i$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif forma ~= "ind_fut" and forma ~= "cond" and find(nucleo_, "^[^áéíóú]-[aeiou]h?$") and (find(nexosufijo_, "^h?[iu]"..C.."?[st]?[aeo]i?[mns]?$") or find(nexosufijo_, "^h?[iu]s?$")) then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iu])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif ((find(nucleo, "[iu]"..C.."#$") or find(nucleo, "[iu]ss#$")) and find(nexosufijo, "^ê")) or nucleo == "d" then -- pretéritos fuertes, estar, caber
return nucleo..gsub1(nexosufijo, "^([~#]?)ê", "%1é")
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
return prefijo..nucleonexosufijo
end
local alt_info = {
["ar"] = {
["ei-ei"] = {"ansiar", "[i]", "ei", "ei"},
["´-´"] = {"fraguar", "[aeiou]", "%2"..tilde, "%2"..tilde},
["í-í"] = {"descafeinar", "[i]", "í", "í"},
["ú-ú"] = {"saudar", "[u]", "ú", "ú"},
},
["er"] = {
["h"] = {"valer", "", "h"},
},
["ir"] = {
["-e"] = {"frigir", "[i]", nil, "e"},
["-o"] = {"fugir", "[u]", nil, "o"},
["ai"] = {"parir", "[a]", "ai"},
["i"] = {"sentir", "[e]", "i"},
["u"] = {"dormir", "[o]", "u"},
["ç"] = {"ouvir", ".", "ç"},
["í-í"] = {"proibir", "[i]", "í", "í"},
["ú-ú"] = {"reunir", "[u]", "ú", "ú"},
["u-u-u"] = {"polir", "[o]", "u", "u", "u"},
--["i-i"] = {"agredir", "[e]", "i", "i"},
["i-i-i"] = {"agredir", "[e]", "i", "i", "i"},
}
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
local sufijos_ = obtener_sufijos(sufijo_inf, (forma == "ind_perf" and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleo_inf
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos3, conjinfo.nucleos3, conjinfo.nucleos1}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos2, conjinfo.nucleos1, conjinfo.nucleos3, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[1], sufijo_inf, forma)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma)))
end
end
return
end
for i = EU, ELES do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, (conjinfo.v == "pôr" and sufijos_[k] == "or") and "ôr" or sufijos_[k], sufijo_inf, forma)
for _, n in ipairs(nucleos[i]) do
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo, forma)))
if nexosufijo2 then
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo2, forma)))
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local art2 = fmtinfo.art2
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
local j
if not i then
tiempo = forma
i = 1
j = 3
else
j = tonumber(i)
end
i = tonumber(i)
local rest_ = i < NOS and resto or resto_pl
local rest_pl_ = resto_pl
for _, v in ipairs(arr) do
local rest = rest_
local rest_pl = rest_pl_
if auxiliar[tiempo] then
rest = " "..v..rest
v = auxiliar[tiempo][i]
end
if antepuesto[tiempo] then
local pronart = pron == "se" and REFLEXIVOS[j].." " or ""
pronart = (art and art ~= "") and pronart..art2.." " or pronart
insert(t, adv..pronart..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
elseif interpuesto[tiempo] then
local pronart = pron == "se" and "-"..REFLEXIVOS[j].."-" or ""
pronart = (art and art ~= "") and pronart..art.."-" or pronart
if pronart and pronart ~= "" then
v = gsub(v, "^(.*r)(.-)$", function(u, v) return u..pronart..v end)
end
insert(t, adv..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
else -- pospuesto
local pronart = pron == "se" and "-"..REFLEXIVOS[j] or ""
if pronart ~= "" or (art and art ~= "") then
local subs
if (art2 and art2 ~= "") and pron ~= "se" then -- artículo, sin pronombre
v, subs = gsubb(v, "^(.*)[srz]$", "%1")
else
v, subs = gsubb(v, "mos$", "mo")
end
if subs then
pronart = pronart..((art2 and art2 ~= "") and "-"..art2 or "")
else
pronart = pronart..((art and art ~= "") and "-"..art or "")
end
v = v..pronart
end
if forma == "inf" or forma == "inf_pers" then
insert(t, adv..v..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..v..f_links(rest_pl))
end
else
insert(t, adv..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["alt"] = {lista = true},
["nucleopres1"] = {lista = true},
["nucleopres3"] = {lista = true},
["nucleosubj4"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["núcleopres3"] = {alias_de = "nucleopres3"},
["núcleosubj4"] = {alias_de = "nucleosubj4"},
["paradigma"] = {lista = true},
["nota"] = {},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][iã]o?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeioô]r)%-?(s?e?)%-?(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[iã]?o?"..ESPACIO.."?"..LETRA.."*[aeioô]r%-?s?e?%-?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
local art2 = ""
if art ~= "" then
assert(find(art, "^l"), "el artículo debe comenzar por l")
art2 = gsub(art, "^l", "")
end
local sufijo_inf = match(v, "[aeioô]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopres3"]),
maxindex(args["nucleosubj4"])) do
local conjinfo = {}
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
for k, v in pairs(p[3]) do
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
end
end
paradigmas_reconocidos[p[1]] = true
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = conjinfo.nucleos1 or {}
conjinfo.nucleos2 = conjinfo.nucleos2 or {}
conjinfo.nucleos3 = conjinfo.nucleos3 or {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert_if_not(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2, n3
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
if info[3] then
n1, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[3].."#%3")
end
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[4].."#%3")
end
if info[5] then
n3, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[5].."#%3")
end
assert(sust, "Alternancia vocálica no reconocida")
if a == "´-´" then
insert_if_not(conjinfo.nucleos1, n1.."{BR}")
insert_if_not(conjinfo.nucleos2, n2.."{BR}")
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf.."{PT}")
insert_if_not(conjinfo.nucleos2, conjinfo.nucleo_inf.."{PT}")
else -- lo normal
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
insert_if_not(conjinfo.nucleos3, n3)
end
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if args["nucleopres1"][N] then
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
end
if args["nucleopres3"][N] then
insert_if_not(conjinfo.nucleos2, args["nucleopres3"][N])
end
if args["nucleosubj4"][N] then
insert_if_not(conjinfo.nucleos3, args["nucleosubj4"][N])
end
if not conjinfo.nucleos3[1] then -- tengo que escribir primero este núcleo
if conjinfo.nucleos1[1] and not conjinfo.nucleos2[1] then
conjinfo.nucleos3[1] = gsub(conjinfo.nucleos1[1], "^[^#~]+$", "#%0#")
else
conjinfo.nucleos3[1] = conjinfo.nucleo_inf
end
else
conjinfo.nucleos3[1] = gsub(conjinfo.nucleos3[1], "^[^#~]+$", "#%0#")
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
else
conjinfo.nucleos1[1] = gsub(conjinfo.nucleos1[1], "^[^#~]+$", "#%0#")
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
else
conjinfo.nucleos2[1] = gsub(conjinfo.nucleos2[1], "^[^#~]+$", "#%0#")
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, art2=art2, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for _,s in ipairs(tostr) do
fmtinfo["subj_pres"..s] = deepcopy(resultante["subj_pres"..s])
end
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local impers = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_inf, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_inf = {"", "(por isso)", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "(isso)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(isso)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que isso)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(isso)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_inf = {"", "(por isso)", "(por issos)", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "(isso)", "(issos)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(isso)", "(issos)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que isso)", "(que issos)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(isso)", "(issos)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_inf = {"", "por eu", "por tu", "por ele, por ela, por você", "por nós", "por vós", "por vocês, por eles, por elas", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "eu", "tu", "ele, ela, você", "nós", "vós", "vocês, eles, elas", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "eu", "tu", "ele, ela, você", "nós", "vós", "vocês, eles, elas", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que eu", "que tu", "que ele, que ela, que você", "que nós", "que vós", "que vocês, que eles, que elas", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "(você)", "(nós)", "(vós)", "(vocês)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
insert(t, {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true})
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
insert(t, {{"Formas personales", colspan=cs}, color=COLOR_H, header=true})
insert(t, {{"Modo infinitivo", colspan=cs}, color=COLOR_INF, header=true})
insert(t, fila_pronombres_inf)
if mostrar_imper then
insert(t, {{"Infinitivo simple", color=COLOR_INF, header=true}, ic("inf_pers")})
insert(t, {{"Infinitivo compuesto", color=COLOR_INF, header=true}, ic("inf_pers_comp")})
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de infinitivo personal", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true})
insert(t, fila_pronombres_ind)
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")})
insert(t, {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")})
insert(t, {{"Pretérito pluscuamperfecto compuesto", color=COLOR_IND, header=true}, ic("ind_pluperf_comp")})
insert(t, {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")})
insert(t, {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("ind_fut_comp")})
insert(t, {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")})
insert(t, {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true})
insert(t, fila_pronombres_cond)
insert(t, {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")})
insert(t, {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")})
insert(t, {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true})
insert(t, fila_pronombres_subj)
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")})
insert(t, {{f("Futuro"), color=COLOR_SUBJ, header=true}, ic("subj_fut")})
insert(t, {{f("Futuro compuesto"), color=COLOR_SUBJ, header=true}, ic("subj_fut_comp")})
insert(t, {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true})
insert(t, fila_pronombres_imper)
if mostrar_imper then
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")})
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}})
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
insert(t, {{args["nota"] and args["nota"] or "", colspan=cs}})
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "PT:Verbos irregulares")
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["pôr"] = nil
else
insert(cats, "PT:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "PT:Verbos del paradigma "..p)
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "PT:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "PT:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "PT:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "PT:Verbos defectivos")
end
if sufijo_inf == "ar" then
insert(cats, "PT:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "PT:Verbos de la segunda conjugación")
elseif sufijo_inf == "ir" then
insert(cats, "PT:Verbos de la tercera conjugación")
else
insert(cats, "PT:Verbos de la cuarta conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
pxv7d2asvdb0owe36nqv97j74kv4hd7
Módulo:flex/ca
828
1055674
6307322
6124288
2026-08-06T00:33:57Z
TMCbot
164594
.
6307322
Scribunto
text/plain
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local max = math.max
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local size = m_table.size
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local unaccented_vowel = "aeiouïüAEIOUÏÜ"
local accented_vowel = "àèéíòóúÀÈÉÍÒÓÚ"
local vowel = unaccented_vowel .. accented_vowel
local cons = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ·"
local V = "[" .. vowel .. "]"
local AV = "[" .. accented_vowel .. "]"
local NAV = "[^" .. accented_vowel .. "]"
local UAV = "[" .. unaccented_vowel .. "]"
local C = "[" .. cons .. "]"
-- local LETRA = "[" .. vowel .. cons .. "]"
local espacios = "%s"
local espacios_o_guiones = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local ESPACIO_O_GUION = "["..espacios_o_guiones.."]"
local LETRA = "[^"..espacios.."]"
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["à"] = "a",
["è"] = "e",
["ì"] = "i",
["ò"] = "o",
["ù"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["À"] = "A",
["È"] = "E",
["Ì"] = "I",
["Ò"] = "O",
["Ù"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local tildar = {
["a"] = "à",
["e"] = "è",
["i"] = "í",
["o"] = "ò",
["u"] = "ú",
["ï"] = "í",
["A"] = "À",
["E"] = "È",
["I"] = "Í",
["O"] = "Ò",
["U"] = "Ú",
["Ï"] = "Í",
}
local function es_locucion(tit, cop)
return find(tit, LETRA..ESPACIO_O_GUION..LETRA) or (cop ~= nil and find(tit, LETRA..ESPACIO_O_GUION..LETRA))
end
local function try(p, rx, repl1, repl2)
local p2, sust = gsubb(p, rx, "~%0~")
if sust then
if not repl1 then
return {m={p2}, p={}, f={}, fp={}}
end
local a, sust = gsubb(p, rx, repl1)
if not repl2 then
return {m={p2}, p={a}, f={}, fp={}}
end
local b, sust2 = gsubb(p, rx, repl2)
if sust2 then
return {m={p2}, p={a, b}, f={}, fp={}}
end
return {m={p2}, p={a}, f={}, fp={}}
end
return nil
end
-- https://salt.gva.es/auto/ajuda-salt/puntuacio/plural_dels_substantius.html
local function forma_plural(word, genere, forzar_s)
local no_forzar_s = not forzar_s
local plural = try(word, "s[cpt]$", "~%0s~", no_forzar_s and "~%0os~" or nil)
or try(word, "xt$", "~xts~", no_forzar_s and "~xtos~" or nil)
or try(word, "ig$", "~igs~", no_forzar_s and "~jos~" or nil)
or try(word, "[aio]ç$", (genere == "ng" and no_forzar_s) and "~%0os~" or ((genere == "f" or forzar_s) and "~%0s~" or "~%0os~"), (genere == "ng" and no_forzar_s) and "~%0ces~" or nil)
or try(word, "([^g][aeou])í$", "~%1ïns~")
or try(word, "("..AV..")n?$", function(a) return "~"..quitar_tilde[a].."ns~" end)
or try(word, "[aou]n$", "~%1s~") -- estas también son agudas
or try(word, "^("..C.."*"..V..")n?$", "~%1ns~") -- no considero diptongos
or try(word, "^"..NAV.."*([aeiou])([^aeio]+[ei]n)$", function(a, b) return "~"..tildar[a]..b.."s~" end)
or try(word, "[aàeèéiíïoòóuú].-[aeiou]s$", nil) -- llanas o esdrújulas en -s
or try(word, "([eèóú])s$", function(a) return "~"..quitar_tilde[a].."sos~" end)
or try(word, "([^gq][au])ís$", "~%1ïsos~")
or try(word, "oís$", "~oïssos~")
or try(word, "("..AV..")s$", function(a) return "~"..quitar_tilde[a].."ssos~" end)
or try(word, "^("..C.."*"..V..")s$", "~%1ssos~") -- por las dudas no considero diptongos
or try(word, "^("..C.."*"..V..C.."+)s$", "~%1sos~")
or try(word, "ca$", "~ques~")
or try(word, "ga$", "~gues~")
or try(word, "ça$", "~ces~")
or try(word, "ja$", "~ges~")
or try(word, "([gq])ua$", "~%1ües~")
or try(word, "a$", "~es~")
or try(word, "x$", ((not genere or genere == "m") and not find(word, AV) and no_forzar_s) and "~xos~" or "~xs~")
or try(word, "ç$", forzar_s and "~çs~" or (genere == "f" and "~ces~" or "~ços~"))
or try(word, "ch$", forzar_s and "~chs~" or "~ches~")
or try(word, C.."[^"..vowel.."s]".."$", "~%0s~")
or try(word, "z$", "~zos~") -- REVISAR
or try(word, "[^s]$", "~%0s~")
if not plural then
return {m={word}, p={}, f={}, fp={}}
end
return plural
end
local function forma_femenina(head)
if find(head, "aire$")
or find(head, "ç$") -- audaz, feliz, dulce, etc.
or (find(head, V..".+[ae]l$") and not find(head, AV)) -- -al, -el agudo (tiene qe tener más de una sílaba)
or (find(head, "[aeo][ae]l$") and not find(head, AV)) -- -al, -el agudo (tiene qe tener más de una sílaba)
or find(head, "[^f]il$") -- -il agudo o llano
or find(head, V..".+ar$") -- escolar (varias sílabas y aguda)
or find(head, "[aeo]ar$") -- escolar (varias sílabas y aguda)
or find(head, "rior$") -- anterior
or find(head, V..".+[ae]nt$") -- constant
or find(head, "ble$") -- constant
or find(head, "a$") -- constant
then
return head
end
local fem = head
fem = gsub(fem, "([aeo])í$", "%1ïna")
fem = gsub(fem, "([^gq]u)í$", "%1ïna")
fem = gsub(fem, "([aeio])u$", "%1va")
-- fem = gsub(fem, "([aeiou])l$", "%1l·la") muy dudoso (cf [[cérvol]]), no recuerdo qué quise hacer acá
fem = gsub(fem, "[àèìòùáéíóú]$", function(v) return quitar_tilde[v].."na" end)
fem = gsub(fem, "o$", "a")
fem = gsub(fem, "ce$", "ça")
fem = gsub(fem, "que$", "ca")
fem = gsub(fem, "qüe$", "qua")
fem = gsub(fem, "ge$", "ja")
fem = gsub(fem, "gue$", "ga")
fem = gsub(fem, "güe$", "gua")
fem = gsub(fem, "e$", "a")
fem = gsub(fem, "p$", "ba")
fem = gsub(fem, "f$", "va")
if find(fem, "g$") then
fem = gsub(fem, "leg$", "loga")
fem = gsub(fem, "oig$", "oja")
fem = gsub(fem, "ig$", "tja")
elseif find(fem, "[ei]n$") and not find(fem, "[àèéíòóú]") then
fem = gsub(fem, "a([^aeio]+[ei]n)$", "à%1a")
fem = gsub(fem, "e([^aeio]+[ei]n)$", "è%1a")
fem = gsub(fem, "i([^aeio]+[ei]n)$", "í%1a")
fem = gsub(fem, "o([^aeio]+[ei]n)$", "ò%1a")
fem = gsub(fem, "u([^aeio]+[ei]n)$", "ú%1a")
elseif find(fem, "s$") then
fem = gsub(fem, "[aà]s$", "assa")
fem = gsub(fem, "ès$", "esa")
fem = gsub(fem, "és$", "essa")
fem = gsub(fem, "ís$", "issa")
fem = gsub(fem, "[oò]s$", "ossa")
fem = gsub(fem, "ós$", "osa")
fem = gsub(fem, "ús$", "usa")
end
fem = gsub(fem, "([aiïu])t$", "%1da")
fem = gsub(fem, "a(%l)i$", "à%1ia")
fem = gsub(fem, "i(%l)i$", "í%1ia")
if fem == head and not find(head, "a$") then
fem = head .. "a"
end
return fem
end
local function flexionar_palabra(p, g, s)
if g ~= "mf" then
return forma_plural(p, g, s)
end
local flex = forma_plural(p, "m", s)
local fem = forma_femenina(p)
local flex_f = forma_plural(fem, "f", s)
if not deepequals(flex, flex_f) then
flex.f = flex_f.m
flex.fp = flex_f.p
end
return flex
end
local function flexion_sust_adj(palabras, g, forzar_s, copulativa)
local a, separador, b
if copulativa == true or copulativa == false then
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO_O_GUION..")("..LETRA.."+)$")
else
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
end
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto
if copulativa == false then
p, resto = match(palabras, "^(%-?[^"..espacios_o_guiones.."]+)(.-)$")
else
p, resto = match(palabras, "^("..LETRA.."+)(.-)$")
end
local flex = flexionar_palabra(p, g, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif es_locucion(title, args["cop"]) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local valido = {
["m"] = true,
["f"] = true,
["mf"] = true,
["n"] = true,
["ng"] = true,
["inv"] = true,
["s"] = true,
["p"] = true,
["irreg"] = true
}
assert(valido[args[1]], "Especifique el género del sustantivo en el primer parámetro: m, f, mf, ng, inv, s, p, irreg")
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "CA:Locuciones sustantivas" or "CA:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "CA:Locuciones adjetivas" or "CA:Adjetivos")
end
local sufijos = {
["ar"] = { -- ar
["ger"] = {"ant"},
["part"] = {"at"},
["ind_pres"] = {"o", "es", "a", "em", "eu", "en",
"e", nil, nil, "am", "au", nil,
"i", nil, nil, nil, nil, nil,
"", nil, nil, nil, nil, nil},
["ind_imp"] = {"ava", "aves", "ava", "àvem", "àveu", "aven"},
["ind_perf"] = {"í", "ares", "à", "àrem", "àreu", "aren"},
["ind_perf_alt"] = {"é", "aste", "aste", "ó", "amos", "asteis"},
["ind_fut"] = {"aré", "aràs", "arà", "arem", "areu", "aran"},
["subj_pres"] = {"i", "is", "i", "em", "eu", "in",
"e", "es", "e", nil, nil, "en"},
["subj_imp"] = {"és", "essis", "és", "éssim", "éssiu", "essin",
"às", "esses", "às", "éssem", "ésseu", "essen",
"ara", "assis", "ara", "àssim", "àssiu", "assin",
nil, "asses", nil, "àssem", "àsseu", "assen",
nil, "ares", nil, "àrem", "àreu", "aren"},
["cond"] = {"aria", "aries", "aria", "aríem", "aríeu", "arien"},
["imper"] = {nil, "a", "i", "em", "eu", "in",
nil, nil, "e", nil, "au", "en"}
},
["er"] = { -- er
["ger"] = {"ent"},
["part"] = {"ut"},
["ind_pres"] = {"o", "s", "", "em", "eu", "en",
"i", nil, nil, nil, nil, nil,
"", nil, nil, nil, nil, nil},
["ind_imp"] = {"ia", "ies", "ia", "íem", "íeu", "ien"},
["ind_perf"] = {"í", "eres", "é", "érem", "éreu", "eren"},
["ind_perf_alt"] = {"é", "aste", "aste", "ó", "amos", "asteis"},
["ind_fut"] = {"eré", "eràs", "erà", "erem", "ereu", "eran"},
["subj_pres"] = {"i", "is", "i", "em", "eu", "in",
"a", "es", "a", nil, nil, "en"},
["subj_imp"] = {"és", "essis", "és", "éssim", "éssiu", "essin",
"era", "esses", "era", "éssem", "ésseu", "essen",
nil, "eres", nil, "érem", "éreu", "eren",},
["cond"] = {"eria", "eries", "eria", "eríem", "eríeu", "erien"},
["imper"] = {nil, "", "i", "em", "eu", "in",
nil, nil, "a", nil, nil, "en"}
},
["ir"] = { -- ir
["ger"] = {"int"},
["part"] = {"it"},
["ind_pres"] = {"o", "s", "", "im", "iu", "en",
"i", nil, nil, nil, nil, nil,
"", nil, nil, nil, nil, nil,},
["ind_imp"] = {"ia", "ies", "ia", "íem", "íeu", "ien"},
["ind_perf"] = {"í", "ires", "í", "írem", "íreu", "iren"},
["ind_perf_alt"] = {"é", "aste", "aste", "ó", "amos", "asteis"},
["ind_fut"] = {"iré", "iràs", "irà", "irem", "ireu", "iran"},
["subj_pres"] = {"i", "is", "i", "im", "iu", "in",
"a", "es", "a", "iguem", "igueu", "en",},
["subj_imp"] = {"ís", "issis", "ís", "íssim", "íssiu", "issin",
"ira", "isses", "ira", "íssem", "ísseu", "issen",
nil, "ires", nil, "írem", "íreu", "iren",},
["cond"] = {"iria", "iries", "iria", "iríem", "iríeu", "irien"},
["imper"] = {nil, "", "i", "im", "iu", "in",
nil, nil, "a", "iguem", nil, "en",},
},
["re"] = { -- -re, -dre
["ger"] = {"ent"},
["part"] = {"ut"},
["ind_pres"] = {"o", "s", "", "em", "eu", "en",
"i", nil, nil, nil, nil, nil,
"", nil, nil, nil, nil, nil},
["ind_imp"] = {"ia", "ies", "ia", "íem", "íeu", "ien"},
["ind_perf"] = {"í", "eres", "é", "érem", "éreu", "eren"},
["ind_perf_alt"] = {"é", "aste", "aste", "ó", "amos", "asteis"},
["ind_fut"] = {"ré", "ràs", "rà", "rem", "reu", "ran"},
["subj_pres"] = {"i", "is", "i", "em", "eu", "in",
"a", "es", "a", nil, nil, "en"},
["subj_imp"] = {"és", "essis", "és", "éssim", "éssiu", "essin",
"era", "esses", "era", "éssem", "ésseu", "essen",
nil, "eres", nil, "érem", "éreu", "eren",},
["cond"] = {"ria", "ries", "ria", "ríem", "ríeu", "rien"},
["imper"] = {nil, "", "i", "em", "eu", "in",
nil, nil, "a", nil, nil, "en"}
},
}
local auxiliar = {
["inf_comp"] = {"haver"},
["ger_comp"] = {"havent"},
["ind_perf_comp"] = {"he", "has", "ha", "hem", "heu", "han",
nil, nil, nil, "havem", "haveu", nil,},
["ind_peri"] = {"vaig", "vas", "va", "vem", "vau", "van",
nil, "vares", nil, "vàrem", "vàreu", "varen",},
["ind_pluperf"] = {"havia", "havies", "havia", "havíem", "havíeu", "havien"},
["ind_anter"] = {"haguí", "hagueres", "hagué", "haguérem", "haguéreu", "hagueren",
"vaig haver", "vas haver", "va haver", "vem haver", "vau haver", "van haver",
nil, "vares haver", nil, "vàrem haver", "vàreu haver", "varen haver",},
["ind_fut_comp"] = {"hauré", "hauràs", "haurà", "haurem", "haureu", "hauran"},
["cond_comp"] = {"hauria", "hauries", "hauria", "hauríem", "hauríeu", "haurien",
"haguera", "hagueres", "haguera", "haguérem", "haguéreu", "hagueren",},
["subj_perf"] = {"hagi", "hagis", "hagi", "hàgim", "hàgiu", "hagin",
"haja", "hages", "haja", "hàgem", "hàgeu", "hagen",},
["subj_peri"] = {"vagi", "vagis", "vagi", "vàgim", "vàgiu", "vagin",
"vaja", "vages", "vaja", "vàgem", "vàgeu", "vagen",},
["subj_pluperf"] = {"hagués", "haguessis", "hagués", "haguéssim", "haguéssiu", "haguessin",
"haguera", "haguesses", "haguera", "haguéssem", "haguésseu", "haguessen",
nil, "hagueres", nil, "haguérem", "haguéreu", "hagueren",},
["subj_anter"] = {"vagi haver", "vagis haver", "vagi haver", "vàgim haver", "vàgiu haver", "vagin haver",
"vaja haver", "vages haver", "vaja haver", "vàgem haver", "vàgeu haver", "vagen haver",},
}
local JO, TU, ELL, NOSALTRES, VOSALTRES, ELLS = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"jo", "tu", "ell, ella, vostè", "nosaltres", "vosaltres, vós", "ells, elles, vostès"}
local PRONOMBRES_SUBJ = {"que jo", "que tu", "que ell, que ella, que vostè", "que nosaltres", "que vosaltres, que vós", "que ells, que elles, que vostès"}
local PRONOMBRES_IMP = {"―", "(tu)", "(vostè)", "(nosaltres)", "(vosaltres)", "(vostès)"}
local IMPERSONALES = {"", "", "", "(això)", "", "", "(ells)"}
local IMPERSONALES_SUBJ = {"", "", "", "(que això)", "", "", "(que ells)"}
local REFLEXIVOS_ANTEPUESTOS = {"em ", "et ", "es ", "ens ", "us ", "es "}
local REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS = {"m'", "t'", "s'", "ens ", "us ", "s'"}
local REFLEXIVOS_POSPUESTOS = {"-me", "-te", "-se", "-nos", "-vos", "-se"}
local REFLEXIVOS_POSPUESTOS_CONTRAIDOS = {"'m", "'t", "'s", "'ns", "-vos", "'s"}
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_pluperf"] = true,
["ind_peri"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
["subj_peri"] = true,
["subj_anter"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local paradigmas_regulares = {
["ar"] = {
{"adequar", {"quar$"}, {
nexo = "qu"
}},
{"averiguar", {"guar$"}, {
nexo = "gu"
}},
{"evacuar", {"[^aeiougq]uar$"}, {
nexo = "u",
}},
{"emproar", {"oar$"}, {
nexo = "o",
}},
{"desmaiar", {"[aeou]iar$"}, {
nexo = "I",
}},
{"acariciar", {"[^aeiou]iar$"}, {
nexo = "i",
}},
{"pujar", {"[aeiou]jar$"}, {
nexo = "J",
}},
{"viatjar", {"jar$"}, {
nexo = "j",
}},
{"alçar", {"çar$"}, {
nexo = "ç",
}},
{"educar", {"car$"}, {
nexo = "c",
}},
{"jugar", {"gar$"}, {
nexo = "g",
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"vèncer", {"cer$"}, {
nexo = "c",
}},
{"témer", {"er$"}, {
}},
},
["ir"] = {
{"fugir", {"fugir$"}, { -- NO es irregular, es un cambio ortográfico. Lo que pasa es que es el único que no es inco.
nexo = "g",
}},
{"trair", {"air$"}, {
nexo = "a"
}},
{"trair", {"eir$"}, {
nexo = "e"
}},
{"trair", {"oir$"}, {
nexo = "o"
}},
{"trair", {"uir$"}, {
nexo = "u"
}},
{"argüir", {"üir$"}, {
nexo = "ü"
}},
{"partir", {"ir$"}, {
}},
},
["re"] = {
{"concebre", {"bre$"}, {
nexo = "b"
}},
{"abatre", {"re$"}, {
}},
},
["ur"] = {
{"dur", {"dur$"}, { -- para que no tire error el módulo
}},
}
}
-- partir: paradigma modelo inco
-- dormir: paradigma modelo puro
local verbos_puros = {
"ajupir$", "buixir$", "bullir$", "cruixir$", "dormir$", "funyir$", "grunyir$", "munyir$", "pudir$", "punyir$",
"retrunyir$", "^sentir$", "pressentir$", "^ressentir$", "collir$", "cosir$", "^eixir$", "[^t]eixir$", "escopir$", "fugir$",
"morir$", "^obrir$", "reobrir$", "entreobrir$", "^omplir$", "[^c]omplir$", "pruir$", "^sortir$", "[^a][^s]sortir$", "tossir$"}
local verbos_mixtos = {
"acudir$", "arrupir$", "brumir$", "brunzir$", "consumir$", "^resumir$", "presumir$", "mentir$", "percudir$", "consentir$",
"lluir$"}
-- los que quedan son incoativos
local paradigmas_irregulares = {
["ar"] = {
{"aguar", {"^aguar$"}, {
nexo = "GU",
}},
{"anar", {"^anar$"}, { -- cuidado con mandar
nucleopres = {"vaj-vaj"},
ind_pres = {{"vaig"}, {"vas"}, {"va"}, nil, nil, {"van"}},
ind_fut = {{"aniré", "iré"}, {"aniràs", "iràs"}, {"anirà", "irà"}, {"anirem", "irem"}, {"anireu", "ireu"}, {"aniran", "iran"}},
cond = {{"aniria", "iria"}, {"aniries", "iries"}, {"aniria", "iria"}, {"aniríem", "iríem"}, {"aniríeu", "iríeu"}, {"anirien", "irien"}},
imper = {nil, {"vés"}},
}},
{"dar", {"^dar$", "^desdar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"do"}, {"das"}, {"da"}, nil, nil, {"dan"}},
subj_pres = {{"de"}, {"des"}, {"de"}, nil, nil, {"den"}},
imper = {nil, {"da"}, {"de"}, nil, {"deu"}, {"den"}}
}},
{"estar", {"^estar$"}, {
ind_pres = {{"estic"}, {"estàs"}, {"està"}, nil, nil, {"estan"}},
subj_pres = {{"estigui", "estiga"}, nil, {"estigui", "estiga"}},
ind_perf = {{"estiguí"}, {"estigueres"}, {"estigué"}, {"estiguérem"}, {"estiguéreu"}, {"estigueren"}},
nucleopres = {"estig"},
part = {"estat"}, -- necesario sobrescribir por la asignación de núcleos
imper = {nil, {"estigues"}, {"estigui", "estiga"}, nil, {"estigueu"}}
}},
},
["er"] = {
-- caler regular imeprs
{"soler", {"^soler$"}, {
nucleopres = {"g"},
}},
{"voler", {"voler$"}, {
nucleopres = {"vulg"},
nucleoperf = {"volg"},
ind_pres = {{"vull"}},
imper = {nil, {"vulgues"}, nil, nil, {"vulgueu"}},
nucleofut = {"voldr"},
}},
{"valer", {"ler$"}, {
nucleopres = {"g"},
nucleofut = {"ldr"},
}},
{"atènyer", {"^atènyer$", "^empènyer$", "^espènyer$"}, {
nucleo = "èny",
part = {"ès"},
}},
{"estrènyer", {"strènyer$"}, {
part = {"stret"},
nucleoperf = {"streng", "streny"},
}},
{"fènyer", {"fènyer$", "plànyer$", "pertànyer$"}, {
nucleo = "ny",
part = {"ngut", "nyut"},
nodial = true,
}},
-- júnyer es junyir
{"saber", {"saber$"}, {
ind_pres = {{"sé"}},
nucleofut = {"sabr"},
subj_pres = {{"sàpiga", "sàpia"}, {"sàpigues", "sàpies"}, {"sàpiga", "sàpia"}, {"sapiguem", "sapiem"}, {"sapigueu", "sapieu"}, {"sàpiguen", "sàpien"}},
imper = {nil, {"sàpigues", "sàpies"}, {"sàpiga", "sàpia"}, {"sapiguem", "sapiem"}, {"sapigueu", "sapieu"}, {"sàpiguen", "sàpien"}}
}},
{"conèixer", {"conèixer$"}, {
part = {"conegut"},
nucleopres = {"coneg"},
}},
{"créixer", {"créixer$"}, {
part = {"crescut"},
nucleoperf = {"cresqu", "REG"},
subj_pres = {{"creixi", "cresca"}, {"creixis", "cresques"}, {"creixi", "cresca"}, {"creixem", "cresquem"}, {"creixeu", "cresqueu"}, {"creixin", "cresquen"}},
imper = {nil, nil, {"creixi", "cresca"}, {"creixem", "cresquem"}, nil, {"creixin", "cresquen"}}
}},
{"merèixer", {"merèixer$", "^irèixer"}, {-- cambia la tilde
nucleo = "rèix",
part = {"rescut"},
nucleoperf = {"resqu", "REG"},
subj_pres = {{"reixi", "resca"}, {"reixis", "resques"}, {"reixi", "resca"}, {"reixem", "resquem"}, {"reixeu", "resqueu"}, {"reixin", "resquen"}},
imper = {nil, nil, {"reixi", "resca"}, {"reixem", "resquem"}, nil, {"reixin", "resquen"}}
}},
{"parèixer", {"parèixer$"}, {--REV, aparèixer
nucleopres = {"pareg"},
}},
{"néixer", {"néixer$", "péixer$"}, {
nucleo = "éix",
nucleopres = {"eix-eix-aix"},
nucleopresa = {"aix"},
part = {"ascut"},
ind_imp = {nucleo = "aix"},
nucleoperf = {"asqu", "aix"},
nucleofut = {"aix"},
nodial = true,
}},
{"néixer", {"nàixer$", "pàixer$"}, {
nucleo = "àix",
part = {"ascut"},
nucleoperf = {"asqu", "aix"},
subj_pres = {{"asca", "aixi"}, {"asques", "aixis"}, {"asca", "aixi"}, {"aixem", "asquem"}, {"aixeu", "asqueu"}, {"asquen", "aixin"}},
imper = {nil, nil, {"asca"}, {"aixem", "asquem"}, nil, {"asquen"}},
nodial = true,
}},
{"poder", {"poder$"}, {
nucleopres = {"pug"},
nucleoperf = {"pog"},
nucleofut = {"podr"},
imper = {nucleo = false}
}},
{"caber", {"caber$"}, { -- es cabre
nucleo = false,
}},
{"córrer", {"córrer$"}, {
part = {"corregut"},
ind_pres = {{"corro", "córrec", "corri", "corr"}},
subj_pres = {{"corri", "córrega"}, {"corris", "córregues"}, {"corri", "córrega"}, {"correm", "córregem"}, {"correu", "córregeu"}, {"corrin", "córreguen"}},
nucleoperf = {"correg"},
}},
{"haver", {"haver$"}, { -- aux
nucleopres = {"haj-haj-hàj"},
ind_pres = {{"he"}, {"has"}, {"ha"}, {"hem"}, {"heu"}, {"han"}},
part = {"hagut"},
nucleofut = {"haur"},
nucleoperf = {"hag"},
cond = {nucleo = {"haur", "hag"}},
imper = {nucleo = false}
}},
{"ser", {"^ser$"}, {
part = {"sigut"},
ind_pres = {{"soc"}, {"ets"}, {"és"}, {"som"}, {"sou"}, {"són"}},
ind_imp = {{"era"}, {"eres"}, {"era"}, {"érem"}, {"éreu"}, {"eren"}},
ind_perf = {{"fui"}, {"fores"}, {"fou"}, {"fórem"}, {"fóreu"}, {"foren"}},
subj_pres = {nucleo = "sig"},
subj_imp = {nucleo = "fo"},
imper = {nil, {"sigues"}, {"sigui", "siga"}, {"siguem", "sigam"}, {"sigeu", "sigau"}, {"siguin", "siguen"}}
}},
{"ésser", {"^ésser$", "^esser$"}, {
ger = {"essent"},
part = {"estat"},
nucleo = false,
}},
{"fer", {"^fer$"}, {
part = {"fet"},
ind_pres = {{"faig", "faç"}, {"fas"}, {"fa"}, nil, nil, {"fan"}},
ind_imp = {nucleo = "fe"},
ind_perf = {{"fiu"}, {"feres"}, {"feu"}, {"férem"}, {"féreu"}, {"feren"}},
imper = {nil, {"fes", "fe"}, nil, nil, {"feu", "feis"}},
nucleofut = {"far"},
nucleopres = {"faç-faç"}
}},
-- esprémer no forma paradigma
},
["ir"] = {
{"obrir", {"obrir$"}, {
part = {"obert"},
}},
{"cosir", {"collir$", "osir$", "tossir$", "escopir$", "sortir$"}, {
nucleopres = {"u-u"},
}},
{"complir", {"omplir$"}, {
part = {"omplert", "omplit"},
}},
{"eixir", {"^eixir$", "^deseixir$"}, {
nucleopres = {"i-i"}
}},
{"reeixir", {"reeixir$"}, {
nucleopres = {"ï-ï"},
nodial = true
}},
{"establir", {"establir$"}, {
part = {"establert", "establit"},
}},
-- pruir reg.
{"dir", {"^dir$", "^adir$", "contradir$", "desdir$", "entredir$", "interdir$", "maldir$", "predir$", "^redir$"}, {
nucleo = "d",
ger = {"dient"},
part = {"dit"}, -- necesario sobreescribirlo para que no genere *dig
nucleopres = {"dig-diu-dig"},
ind_imp = {nucleo = "de"},
ind_pres = {nil, nil, nil, {"diem"}, {"dieu"}},
subj_pres = {nil, nil, nil, {"diguem"}, {"digueu"}},
imper = {nil, {"digues"}, nil, {"diguem"}, {"digueu"}}
}},
{"venir", {"^venir$"}, {
ind_pres = {nil, nil, {"ve"}},
part = {"vingut"},
nucleopres = {"ving"},
nucleoperf = {"ving", "veng"},
nucleofut = {"vindr"},
imper = {nil, {"vine"}}
}},
{"prevenir", {"^advenir$", "^avenir$", "contravenir$", "convenir$", "desavenir$", "entrevenir$", "esdevenir$", "intervenir$", "obvenir$", "pervenir$", "prevenir$", "provenir$", "^revenir$", "sobrevenir$", "subvenir$"}, {
nucleo = "ven",
pres = {nil, nil, {"vé"}},
part = {"vingut"},
nucleopres = {"ving"},
nucleoperf = {"ving", "veng"},
nucleofut = {"vindr"},
imper = {nil, {"vine"}}
}},
-- vestir, llegir, servir
{"tenir", {"^tenir$"}, {
nucleopres = {"ting"},
nucleoperf = {"ting", "teng"},
nucleofut = {"tindr", "tendr"},
part = {"tingut", "tengut"},
ind_pres = {nil, nil, {"té"}},
imper = {nil, {"tingues", "ten"}, nil, nil, {"tingueu", "teniu"}}
}},
{"mantenir", {"tenir$"}, {
nucleopres = {"ting"},
nucleoperf = {"ting", "teng"},
nucleofut = {"tindr", "tendr"},
part = {"tingut", "tengut"},
ind_pres = {nil, nil, {"té"}},
imper = {nil, {"tingues", "tén"}, nil, nil, {"tingueu", "teniu"}}
}},
{"morir", {"morir$"}, {
part = {"mort"},
}},
{"imprimir", {"imprimir$"}, {
part = {"imprès"},
}},
-- oir
},
["re"] = {
{"caldre", {"caldre$", "doldre$", "^oldre$", "soldre$", "valdre$"}, {
nucleopres = {"g"}
}},
{"coldre", {"oldre$"}, { -- moldre, absoldre, dissoldre, toldre
part = {"olt"},
nucleopres = {"g"},
}},
{"romandre", {"^romandre$"}, {
part = {"romàs"},
nucleopres = {"g"},
}},
{"encendre", {"encendre$", "tendre$"}, {
nucleo = "end",
part = {"ès"},
nucleopres = {"g"},
ind_pres = {nil, nil, {"én"}},
imper = {nil, {"én"}},
}},
{"vendre", {"^vendre$"}, {
part = {"venut", "vengut"},
nucleopres = {"g"},
nucleoperf = {"veng", "ven"}
}},
{"advendre", {"vendre$"}, {
part = {"venut", "vengut"},
nucleopres = {"g"},
nucleoperf = {"veng", "ven"},
ind_pres = {nil, nil, {"vèn"}},
imper = {nil, {"vèn"}},
}},
{"fendre", {"^"..C.."*endre$"}, {
nucleo = "end",
part = {"es"},
nucleopres = {"g"},
}},
{"defendre", {"endre$"}, {
nucleo = "end",
part = {"ès"},
nucleopres = {"g"},
ind_pres = {nil, nil, {"èn"}},
imper = {nil, {"èn"}},
}},
{"enfondre", {"^enfondre$"}, {
part = {"enfús"},
nucleopres = {"g"}
}},
{"pondre", {"pondre$"}, {
part = {"post"},
nucleopres = {"g"}
}},
{"fondre", {"^"..C.."*ondre$"}, {
nucleo = "ond",
part = {"os", "us"},
nucleopres = {"g"}
}},
{"difondre", {"ondre$"}, {
part = {"ós"},
nucleopres = {"g"}
}},
{"caure", {"caure$"}, {
nucleopres = {"caig"},
nucleopresa = {"cai"},
ind_imp = {nucleo = "que"},
}},
{"plaure", {"plaure$"}, {
nucleopres = {"g"},
nucleopresa = {"pla"},
}},
{"raure", {"^raure$"}, {
nucleopres = {"g"},
nucleopresa = {"ra"},
part = {"ragut", "ras"}
}},
{"beure", {"beure$", "deure$", "lleure$"}, {
nucleo = "eu",
nucleopres = {"g"},
nucleopresa = {"ev"},
ind_imp = {nucleo = "ev"},
}},
{"creure", {"creure$", "seure$"}, {
nucleo = "eu",
nucleopresa = {"ei"},
nucleopres = {"g"},
}},
{"jeure", {"jeure$", "jaure$"}, {
v = "jeure",
part = {"jagut"},
nucleofut = {"jau"},
nucleopresa = {"jai"},
ind_pres = {{"jec", "jac"}},
nucleopres = {"g"},
ind_imp = {nucleo = "jeu"},
}},
{"treure", {"treure$", "traure$"}, {
part = {"tret"},
nucleofut = {"trau"},
nucleopresa = {"trai"},
nucleoperf = {"trag"},
ind_imp = {nucleo = "tre"},
ind_pres = {{"trec", "trac"}},
nucleopres = {"g"},
}},
{"veure", {"veure$"}, {
part = {"vist"},
nucleopres = {"vej"},
nucleopresa = {"vei"},
nucleoperf = {"vei"},
ind_perf = {{"viu"}},
ind_pres = {{"veig"}},
imper = {nil, {"veges", "ves", "ve"}},
}},
{"escriure", {"scriure$"}, {
part = {"scrit"},
nucleopres = {"g"},
nucleopresa = {"scrivi"},
nucleoperf = {"scrig", "scriv"},
ind_imp = {nucleo = "scriv"},
subj_imp = {nucleo = "scrig"},
}},
{"riure", {"riure$"}, {
part = {"rigut", "rist"},
nucleopresa = {"ri"},
nucleopres = {"g"},
ind_imp = {nucleo = "re"},
}},
{"viure", {"viure$"}, {
part = {"viscut"},
nucleopres = {"visc"},
nucleopresa = {"vivi"},
ind_pres = {{"visc"}},
ind_imp = {nucleo = "viv"},
}},
{"cloure", {"cloure$"}, { -- REVISAR: tiene dos participios según la etimología
part = {"clos"},
nucleopres = {"g"},
nucleopresa = {"clo"},
}},
{"moure", {"moure$", "ploure$"}, {
part = {"mogut"},
nucleopres = {"g"},
nucleopresa = {"mov"},
ind_imp = {nucleo = "mov"},
}},
{"noure", {"noure$"}, {
part = {"nogut"},
nucleopres = {"g"},
nucleopresa = {"no"},
}},
{"vindre", {"^vindre$"}, {
part = {"vingut", "vengut"},
nucleopres = {"ving-ven-ving"},
nucleopresa = {"veni"},
ind_imp = {nucleo = "veni"},
imper = {nil, {"vine"}},
}},
{"metre", {"^metre$"}, {
part = {"mes"},
}},
{"admetre", {"metre$"}, {
part = {"mès"},
}},
},
["ur"] = {
{"dur", {"dur$"}, {
nucleo = "du",
sufijo = "re",
nucleopres = {"g"},
part = {"dut"},
ind_pres = {nil, {"duus", "dus"}, {"duu", "du"}},
imper = {nil, {"duu", "du"}}
}},
}
}
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf, forma)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if sufijo == "" then
if nexo == "gu" then
return nil
end
if nexo == "qu" then
return nil
end
if nexo == "u" or nexo == "o" then
return nexo.."~u~" -- [[evacuar]], [[lloar]]
end
if nexo == "i" then
return nexo.."~i~" -- [[acariciar]]
end
if nexo == "J" then
return "~ig~" -- [[pujar]]
end
if nexo == "GU" then
return "#gúu#" -- [[aguar]]
end
end
if sufijo == "i" and forma == "ind_pres" then
if nexo == "gu" then
return nil
end
end
if find(sufijo, "^í") then
if nexo == "I" then
return "~"..sufijo.."~"
end
end
if find(sufijo, "^i[ns]?$") then
if nexo == "I" then
return "~ï~"..sub(sufijo, 2)
end
if nexo == "i" then
return nexo.."~ï~"..sub(sufijo, 2)
end
if nexo == "o" or nexo == "u" then
return nexo.."~ï~"..sub(sufijo, 2)
end
if nexo == "GU" then
return "gu#ï#"..sub(sufijo, 2)
end
end
if find(sufijo, "^"..UAV.."[ns]?$") then
if nexo == "GU" then
return "#gú#"..sufijo
end
end
if find(sufijo, "^[eiéí]") then
if nexo == "gu" or nexo == "GU" then
return "g~ü~"..sufijo
end
if nexo == "qu" then
return "q~ü~"..sufijo
end
if nexo == "ç" then
return "~c~"..sufijo
end
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "~gu~"..sufijo
end
if nexo == "j" or nexo == "J" then
return "~g~"..sufijo
end
end
else -- ER/RE/IR
if sufijo == "" then
if nexo == "b" then
return "~p~"..sufijo
end
if nexo == "c" then
return "~ç~"..sufijo
end
if nexo == "g" then
return "~ig~" -- [[fugir]]
end
if nexo == "u" or nexo == "o" then
return nexo.."~u~" -- [[lluir]]
end
end
if sufijo == "s" then
if nexo == "b" then
return "~p~"..sufijo
end
if nexo == "c" then
return "~ce~"..sufijo
end
if nexo == "g" then
return nexo.."~e~"..sufijo
end
if nexo == "u" then
return nexo.."~u~"..sufijo, nexo..sufijo -- [[lluir]]
end
end
if find(sufijo, "^i") and forma ~= "ind_fut" and forma ~= "cond" and forma ~= "ger" then
if nexo == "a" or nexo == "e" or nexo == "o" or nexo == "u" then
return nexo.."~ï~"..sub(sufijo, 2)
end
if nexo == "ü" then
return "~uï~"..sub(sufijo, 2)
end
end
if find(sufijo, "^[aouáóúàòù]") then
if nexo == "c" then
return "~ç~"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
end
end
if nexo == "I" then
return "i"..sufijo
end
if nexo == "J" then
return "j"..sufijo
end
if nexo == "GU" then
return "gu"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma, p, sufijo_inf)
if not nucleo or not nexosufijo then
return nil
end
if sufijo_inf == "ar" and forma == "ind_pres" and nexosufijo == "" and find(nucleo, "[aeiouï]ss?#?$") then -- passar, envasar, expressar, etc.
return (gsub(nucleo, "([aeiouï])s?(s#?)$", function(a, b) return "~"..tildar[a]..b.."~" end))
end
if sufijo_inf == "ar" and forma == "ind_pres" and nexosufijo == "" and find(nucleo, "[eiï]n#?$") then -- encadenar, eliminar
return (gsub(nucleo, "([eiï])(n#?)$", function(a, b) return "~"..tildar[a]..b.."~" end))
end
if find(nucleo, "d#?$") and sufijo_inf == "re" and forma ~= "ind_fut" and forma ~= "cond" then
nucleo = gsub(nucleo, "d(#?)$", "%1")
end
if find(nucleo, "[aeio]u#?$") and sufijo_inf == "re" and forma ~= "ind_pres" and forma ~= "imper" and forma ~= "ind_fut" and forma ~= "cond" then
nucleo = gsub(nucleo, "([aeio])u(#?)$", "%1%2")
end
if find(nucleo, "[ao]#?$") and forma == "ind_imp" and find(nexosufijo, "^i"..UAV.."*[mns]?$") then
return nucleo..(gsub(nexosufijo, "^i", "~ï~"))
end
if find(nucleo, "e#?$") and forma == "ind_imp" and find(nexosufijo, "^íe") then
return gsub(nucleo, "e(#?)$", "è%1")..(gsub(nexosufijo, "^íe", "~i~e"))
end
if find(nucleo, "o([~#]?)$") and forma == "subj_imp" and find(nexosufijo, "^([~#]?)[eé]") then -- [[ser]]
return nucleo..(gsub(nexosufijo, "^([~#]?)[eé]", "%1"))
end
if find(nucleo, "[nv]i#") and find(nexosufijo, "^e") and sufijo_inf == "re" then -- escriure, viure
return nucleo..sub(nexosufijo, 2)
end
if find(nucleo, "[bdg]#?$") and (nexosufijo == "o" or nexosufijo == "i") and forma == "ind_pres" then
return nil
end
if find(nucleo, "b#?$") and (nexosufijo == "" or nexosufijo == "s") then
return (gsub(nucleo, "b(#?)$", "~p~%1"))..nexosufijo
end
if find(nucleo, "d#?$") and (nexosufijo == "" or nexosufijo == "s") then
return (gsub(nucleo, "d(#?)$", "~t~%1"))..nexosufijo
end
if find(nucleo, "g#?$") and (nexosufijo == "" or nexosufijo == "s") then
return (gsub(nucleo, "g(#?)$", "~c~%1"))..nexosufijo
end
if find(nucleo, "g#$") and find(nexosufijo, "^igu") then
return (gsub(nucleo, "g#$", "gu#"))..sub(nexosufijo, 4)
end
if find(nucleo, "g#$") and find(nexosufijo, "^[eiéí]") then
return (gsub(nucleo, "g#$", "gu#"))..nexosufijo
end
if find(nucleo, "j#$") and find(nexosufijo, "^[eiéí]") then
return (gsub(nucleo, "j#$", "g#"))..nexosufijo
end
if find(nucleo, "gu#$") and find(nexosufijo, "^[eiéí]") then
return (gsub(nucleo, "gu#$", "gü#"))..nexosufijo
end
if find(nucleo, "ç#$") and find(nexosufijo, "^[eiéí]") then
return (gsub(nucleo, "ç#$", "c#"))..nexosufijo
end
if find(nucleo, "c#$") and find(nexosufijo, "^[eiéí]") then
return (gsub(nucleo, "c#$", "qu#"))..nexosufijo
end
if find(nucleo, "[ií]([~#]?)$") and find(nexosufijo, "^([~#]?)[ií]") then
return nucleo..(gsub(nexosufijo, "^([~#]?)[ií]", "%1"))
end
if find(nucleo, "[bdfgkprtvaeiou]r#$") and find(nexosufijo, "^"..V.."r") then
return nucleo..sub(nexosufijo, 3)
elseif (find(nucleo, "[bcdgptr][lr]([~#]?)$") or find(nucleo, "[çjsxz]([~#]?)$")) and nexosufijo == "s" and (p == TU or p == ELL) then
return nucleo.."~es~"
elseif find(nucleo, "[bcdgptr][lr]([~#]?)$") and nexosufijo == "" and (p == TU or p == ELL) then
return nucleo.."~e~"
elseif find(nucleo, "ss$") and nexosufijo == "" then
return sub(nucleo, 1, -3).."~s~"
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
if not prefijo or not nucleonexosufijo then
return nil
end
return prefijo..nucleonexosufijo
end
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo.sufijo_inf
local sufijos_ = conjinfo[forma].sufijos and sufijos[sufijo_inf][conjinfo[forma].sufijos] or sufijos[sufijo_inf][forma]
local nucleos
if conjinfo[forma].nucleo == nil then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleopresa
elseif forma == "part" then
nucleos = conjinfo.nucleoperf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleopres1, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopresa, conjinfo.nucleopresa, conjinfo.nucleopres2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres3, conjinfo.nucleopres3, conjinfo.nucleopres1}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleopres2, conjinfo.nucleopres1, conjinfo.nucleopres3, conjinfo.nucleopresa, conjinfo.nucleopres1}
elseif forma == "ind_fut" then
nucleos = {conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut}
elseif forma == "cond" then
nucleos = {conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf}
elseif forma == "subj_imp" then
nucleos = {conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
elseif conjinfo[forma].nucleo == false then
nucleos = {{}, {}, {}, {}, {}, {}}
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo_inf
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
for _,nucleo in ipairs(nucleos) do
local nexosufijo = combinar_nexo_sufijo(find(nucleo, "~eix~") and "" or nexo, sufijos_[1], sufijo_inf, forma)
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma, -1, sufijo_inf)))
end
end
return
end
for i = JO, ELLS do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
for _, n in ipairs(nucleos[i]) do
if (not find(n, "~eix~") and not conjinfo.nodial) or k <= 6 then -- de momento, desactivo las formas dialectales si el verbo es inco
local nexosufijo = combinar_nexo_sufijo(find(n, "~eix~") and "" or nexo, sufijos_[k], sufijo_inf, forma)
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo, forma, i, sufijo_inf)))
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
i = 1
tiempo = forma
end
i = tonumber(i)
local rest_ = i < NOSALTRES and resto or resto_pl
local rest_pl_ = resto_pl
for _, v in ipairs(arr) do
local hs = auxiliar[tiempo]
local v2, v3
local rest = rest_
local rest_pl = rest_pl_
if hs then
rest = " "..v..rest
rest_pl = " "..v..rest_pl
v = auxiliar[tiempo][i]
if auxiliar[tiempo][i+6] then
v2 = auxiliar[tiempo][i+6]
end
if auxiliar[tiempo][i+12] then
v3 = auxiliar[tiempo][i+12]
end
end
if forma == "inf" or forma == "inf_comp" then
insert(t, adv..v..pron..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..v..pron..art..f_links(rest_pl))
end
elseif forma == "ger" or forma == "ger_comp" then
local vpron = v
if pron == "-se" or pron == "'s" then
local enc = find(v, V.."$") and v..REFLEXIVOS_POSPUESTOS_CONTRAIDOS[ELL] or v..REFLEXIVOS_POSPUESTOS[ELL]
vpron = enc
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..f(vpron)..art..f_links(rest_pl))
end
elseif forma == "part" then
insert(t, adv..f_links(v)..f_links(rest))
if (rest_pl ~= rest) then
insert(t, adv..f_links(v)..f_links(rest_pl))
end
elseif tiempo == "imper" then
local vpron = v
if pron == "-se" or pron == "'s" then
local enc = find(v, V.."$") and v..REFLEXIVOS_POSPUESTOS_CONTRAIDOS[i] or v..REFLEXIVOS_POSPUESTOS[i]
vpron = enc
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
else
local vpron
if pron == "-se" or pron == "'s" then
vpron = find(v, "^h?"..V) and REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS[i]..v or REFLEXIVOS_ANTEPUESTOS[i]..v
else
vpron = v
end
local vpronart = vpron..art
insert(t, adv..(art == "" and f_links(vpronart) or f(vpronart))..f_links(rest))
if v2 then
if pron == "-se" or pron == "'s" then
vpron = find(v2, "^h?"..V) and REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS[i]..v2 or REFLEXIVOS_ANTEPUESTOS[i]..v2
else
vpron = v2
end
vpronart = vpron..art
insert(t, adv..(art == "" and f_links(vpronart) or f(vpronart))..f_links(rest))
end
if v3 then
if pron == "-se" or pron == "'s" then
vpron = find(v3, "^h?"..V) and REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS[i]..v3 or REFLEXIVOS_ANTEPUESTOS[i]..v3
else
vpron = v3
end
vpronart = vpron..art
insert(t, adv..(art == "" and f_links(vpronart) or f(vpronart))..f_links(rest))
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["paradigma"] = {lista = true},
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["nucleopres"] = {lista = true},
["núcleopres"] = {alias_de = "nucleopres"},
["nucleopresa"] = {lista = true},
["núcleopresa"] = {alias_de = "nucleopresa"},
["nucleoperf"] = {lista = true},
["núcleoperf"] = {alias_de = "nucleoperf"},
["nucleofut"] = {lista = true},
["núcleofut"] = {alias_de = "nucleofut"},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][ío]"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto
v, pron, art, resto = match(r1, "^("..LETRA.."*dur)([%-']?s?e?)%-?(l?[oai]?s?)( .-)$")
if not resto then
v, pron, art, resto = match(r1, "^("..LETRA.."*[aei]r)([%-']?s?e?)%-?(l?[oai]?s?)( .-)$")
end
if not resto then
v, pron, art, resto = match(r1, "^("..LETRA.."*re)([%-']?s?e?)%-?(l?[oai]?s?)( .-)$")
end
if not resto then
v, pron, art = match(r1, "^("..LETRA.."*dur)([%-']?s?e?)%-?(l?[oai]?s?)$")
end
if not art then
v, pron, art = match(r1, "^("..LETRA.."*[aei]r)([%-']?s?e?)%-?(l?[oai]?s?)$")
end
if not art then
v, pron, art = match(r1, "^("..LETRA.."*re)([%-']?s?e?)%-?(l?[oai]?s?)$")
end
if not resto then
resto = ""
end
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?"..ESPACIO.."?"..LETRA.."+( .-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
local sufijo_inf = match(v, "[aeiur][re]$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_inco
local es_puro
local es_irregular
for N = 1, max(1,
maxindex(args["paradigma"]),
maxindex(args["nucleopres"]),
maxindex(args["nucleopresa"]),
maxindex(args["nucleoperf"]),
maxindex(args["nucleofut"])) do
local conjinfo = {}
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
local rxx = match(v, rx)
if args["paradigma"][N] == p[1] or rxx then
conjinfo = deepcopy(p[3])
conjinfo.rxx = rxx
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
if size(p[3]) == 0 then
paradigmas_reconocidos[p[1]] = true
end
for k, z in pairs(p[3]) do
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = z
paradigmas_reconocidos[p[1]] = true
end
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
conjinfo.nucleo_inf = conjinfo.nucleo
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
local v_ = gsub(v, "dur$", "dure") -- excepción: en dur no coincide nucleo + sufijo con el verbo entero, necesito forzarlo a que coincida para buscar el prefijo correctamente
if conjinfo.nucleo_inf == nil then -- puede ser false
if conjinfo.rxx then
conjinfo.nucleo_inf = sub(conjinfo.rxx, 1, max(len(conjinfo.rxx) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf), 0)) -- no busco regex porque pueden haberse cambiado
else
conjinfo.nucleo_inf = sub(v_, 1, max(len(v_) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf), 0)) -- no busco regex porque pueden haberse cambiado
end
end
if type(conjinfo.nucleo_inf) == "string" then
if not conjinfo.prefijo then
conjinfo.prefijo = sub(v_, 1, max(len(v_) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf), 0)) -- no busco regex porque pueden haberse cambiado
end
conjinfo.prefijo = gsub(conjinfo.prefijo, AV, quitar_tilde)
conjinfo.nucleo_inf = gsub(conjinfo.nucleo_inf, AV, quitar_tilde)
else
conjinfo.prefijo = ""
end
conjinfo.nucleopres = args["nucleopres"][N] and {args["nucleopres"][N]} or (conjinfo.nucleopres and conjinfo.nucleopres or {})
conjinfo.nucleopresa = args["nucleopresa"][N] and {args["nucleopresa"][N]} or (conjinfo.nucleopresa and conjinfo.nucleopresa or {})
conjinfo.nucleoperf = args["nucleoperf"][N] and {args["nucleoperf"][N]} or (conjinfo.nucleoperf and conjinfo.nucleoperf or {})
conjinfo.nucleofut = args["nucleofut"][N] and {args["nucleofut"][N]} or (conjinfo.nucleofut and conjinfo.nucleofut or {})
conjinfo.nucleopres1 = {}
conjinfo.nucleopres2 = {}
conjinfo.nucleopres3 = {}
local function esta_en_clase(verbo, arr)
for _,a in ipairs(arr) do
if find(verbo, a) then
return true
end
end
return false
end
-- si conjinfo.nucleo_inf == false, no conjugo nada
if conjinfo.nucleo_inf then
if conjinfo.nucleopres[1] == nil and conjinfo.sufijo_inf == "ir" then
if esta_en_clase(v, verbos_mixtos) then
conjinfo.nucleopres[1] = "INCO"
conjinfo.nucleopres[2] = "PURO"
elseif esta_en_clase(v, verbos_puros) then
conjinfo.nucleopres[1] = "PURO"
else
conjinfo.nucleopres[1] = "INCO"
end
end
local function parsear_nucleo(nucl_)
if not nucl_ then
return conjinfo.nucleo_inf
end
local nucl, marca = match(nucl_, "^(.*)([{%[].-[}%]])$")
if not marca then
nucl = nucl_
marca = ""
end
if nucl == "g" then
local aux = conjinfo.nucleo_inf
local sust1, sust2
aux, sust1 = gsubb(aux, "d$", "#g#")
aux, sust2 = gsubb(aux, "([aeio])u$", "%1#g#")
if not sust1 and not sust2 then
aux = aux.."#g#"
end
return aux..marca
end
if nucl == "i" then
return gsub(conjinfo.nucleo_inf, "^(.*)ei?(.-)$", "%1#i#%2")..marca
end
if nucl == "ï" then
return gsub(conjinfo.nucleo_inf, "^(.*)ei?(.-)$", "%1#ï#%2")..marca
end
if nucl == "u" then
return gsub(conjinfo.nucleo_inf, "^(.*)ou?(.-)$", "%1#u#%2")..marca
end
if nucl == "PURO" or nucl == "REG" then
return conjinfo.nucleo_inf..marca
end
if nucl == "INCO" then
return conjinfo.nucleo_inf..conjinfo.nexo_inf.."~eix~"..marca
end
if nucl == conjinfo.nucleo_inf then
return nucl..marca
end
return "#"..nucl.."#"..marca
end
local a, b, c
if conjinfo.nucleopres[1] then
for i,n_ in ipairs(conjinfo.nucleopres) do
a, b, c = match(n_, "^(.-)%-(.-)%-(.-)$")
if not c then
a, b = match(n_, "^(.-)%-(.-)$")
end
if not b then
a = n_
end
if find(a, "^INCO") then
insert_if_not(conjinfo.nucleopres1, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres2, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres3, conjinfo.nucleo_inf)
es_inco = true
else
insert_if_not(conjinfo.nucleopres1, parsear_nucleo(a))
insert_if_not(conjinfo.nucleopres2, parsear_nucleo(b))
insert_if_not(conjinfo.nucleopres3, c and parsear_nucleo(c) or ((a and not b) and parsear_nucleo(a) or conjinfo.nucleo_inf))
es_puro = true
end
end
else
insert_if_not(conjinfo.nucleopres1, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres2, conjinfo.nucleo_inf)
insert_if_not(conjinfo.nucleopres3, conjinfo.nucleo_inf)
end
if not conjinfo.nucleoperf[1] and (a or c) and es_puro and not es_inco then
conjinfo.nucleoperf = deepcopy(conjinfo.nucleopres3)
elseif conjinfo.nucleoperf[1] then
for i,n_ in ipairs(conjinfo.nucleoperf) do
conjinfo.nucleoperf[i] = parsear_nucleo(n_)
conjinfo.hay_nucleoperf = true
end
else
insert_if_not(conjinfo.nucleoperf, conjinfo.nucleo_inf)
end
if conjinfo.nucleofut[1] then
for i,n_ in ipairs(conjinfo.nucleofut) do
conjinfo.nucleofut[i] = parsear_nucleo(n_)
end
else
insert_if_not(conjinfo.nucleofut, conjinfo.nucleo_inf)
end
if conjinfo.nucleopresa[1] then
for i,n_ in ipairs(conjinfo.nucleopresa) do
conjinfo.nucleopresa[i] = parsear_nucleo(n_)
end
else
insert_if_not(conjinfo.nucleopresa, conjinfo.nucleo_inf)
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
else
conjinfo.nucleo_inf = {}
end
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if find(e, 'PART') or not find(e, 'ADJ') then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local inf_ = deepcopy(resultante.inf)
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
if form:find("peri$") then
resultante[form..s] = inf_
else
resultante[form..s] = part_no_adj
end
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local impers = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
if args["indirecto"] then
error("no implementado aún")
else
fila_pronombres_ind = {"", "(això)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(això)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que això)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(això)", color=COLOR_IMPER, header=true, class="pc"}
end
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(això)", "(ells)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(això)", "(ells)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que això)", "(que ells)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(això)", "(ells)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "jo", "tu", "ell, ella, vostè", "nosaltres", "vosaltres, vós", "ells, elles, vostès", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "jo", "tu", "ell, ella, vostè", "nosaltres", "vosaltres, vós", "ells, elles, vostès", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que jo", "que tu", "que ell, que ella, que vostè", "que nosaltres", "que vosaltres, que vós", "que ells, que elles, que vostès", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "(vostè)", "(nosaltres)", "(vosaltres, vós)", "(vostès)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")}
t[11] = {{"Pretérito perifrástico", color=COLOR_IND, header=true}, ic("ind_peri")}
t[12] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")}
t[13] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")}
t[14] = {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")}
t[15] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("ind_fut_comp")}
t[16] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")}
t[17] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[18] = fila_pronombres_cond
t[19] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[20] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[21] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[22] = fila_pronombres_subj
t[23] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[24] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")}
t[25] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")}
t[26] = {{"Pretérito perifrástico", color=COLOR_SUBJ, header=true}, ic("subj_peri")}
t[27] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")}
t[28] = {{f("Pretérito anterior{†}"), color=COLOR_SUBJ, header=true}, ic("subj_anter")}
t[29] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[30] = fila_pronombres_imper
if mostrar_imper then
t[31] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[31] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[32] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[33] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_inco and es_puro then
paradigmas_reconocidos["acudir"] = true
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["dormir"] = nil
elseif es_inco then
paradigmas_reconocidos["acudir"] = nil
paradigmas_reconocidos["partir"] = true
paradigmas_reconocidos["dormir"] = nil
elseif es_puro then
paradigmas_reconocidos["acudir"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["dormir"] = true
end
if es_irregular then
insert(cats, "CA:Verbos irregulares")
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["acudir"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["dormir"] = nil
paradigmas_reconocidos["abatre"] = nil
else
insert(cats, "CA:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "CA:Verbos del paradigma "..p)
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "CA:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "CA:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "CA:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "CA:Verbos defectivos")
end
local inc_enc
if sufijo_inf == "ar" then
insert(cats, "CA:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "CA:Verbos de la segunda conjugación")
elseif sufijo_inf == "ir" then
insert(cats, "CA:Verbos de la tercera conjugación")
if not es_inco and not es_puro then
insert(cats, "CA:Verbos puros")
inc_enc = "puro"
elseif es_inco and es_puro then
insert(cats, "CA:Verbos incoativos")
insert(cats, "CA:Verbos puros")
inc_enc = "incoativo/puro"
elseif es_inco then
insert(cats, "CA:Verbos incoativos")
inc_enc = "incoativo"
elseif es_puro then
insert(cats, "CA:Verbos puros")
inc_enc = "puro"
end
else
insert(cats, "CA:Verbos de la cuarta conjugación")
end
local q_t = {es_irregular and "irregular" or "regular", inc_enc}
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit..(tit == "haver" and " (AUXILIAR, VER NOTA)" or "").."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..concat(q_t, ", ")..")",
t,
ns == 0 and cats or {})
end
return export
s9hd3bgg05acje3a8gx35na5901cmvf
Módulo:flex/ast
828
1055819
6307320
6120157
2026-08-06T00:33:54Z
TMCbot
164594
.
6307320
Scribunto
text/plain
-- Flexión del asturiano
-- Autor: Tmagc
local export = {}
local max = math.max
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal_no_tilde = "aeiouAEIOU"
local vocal_tilde = "áéíóúÁÉÍÓÚ"
local vocal = vocal_no_tilde..vocal_tilde
local cons = "bcdfghjklmnñpqrstvwxyzḥḷBCFGHJKLMNÑPQRSTVWXYZḤḶ"
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local CONS_SALVO_H = "[^"..vocal.."hH~#{}]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local function try(p, rx, pl, f, fpl, n, pl2, n2, femenino)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if not pl then
return {m={p2}, p={}, f={}, fp={}, n={}}
end
if not femenino or not f then
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={}, fp={}, n={}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={}, fp={}, n={}}
end
end
if not n then
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={}}
end
end
if pl2 and n2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={gsub1(p, rx, n), gsub1(p, rx, n2)}}
elseif pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={gsub1(p, rx, n)}}
elseif n2 then
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={gsub1(p, rx, n), gsub1(p, rx, n2)}}
end
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}, n={gsub1(p, rx, n)}}
end
-- https://www.alladixital.org/wp-content/uploads/2015/03/Normes-Ortogr%C3%A1fiques-7%C2%AA-edici%C3%B3n-2012.pdf
local function flexionar_palabra(p, g, forzar_s, on)
local adj = g == "mf"
local r, v, c
r, v, c = match(p, "^([^áéíóú]*)([aeiou])([iu]?"..CONS.."+[iu]?[aeiou][iu]?[n])$") -- llanas en n --> agrego tilde
if not c then
r, v, c = match(p, "^([^áéíóú]*[aeo])([aeo])("..CONS.."*[iu]?[aeiou][iu]?[n])$") -- llanas en n --> agrego tilde
end
if c then
local w = agregar_tilde[v]
return {m={r..v.."~"..c.."~"}, p={r..w..c.."~es~"}, f={}, fp={}, n={}}
end
r, v, c = match(p, "^([^áéíóú]*)([aeiou])("..CONS.."+e)u$") -- llanas en diptongo terminado en -eu --> agrego tilde + -os cf. [[gluteu]], [[aereu]]
if c then
local w = agregar_tilde[v]
if adj then
return {m={r..v..c.."~u~"}, p={r..w..c.."~os~"}, f={r..w..c.."~a~"}, fp={r..w..c.."~es~"}, n={r..w..c.."~o~"}}
end
return {m={r..v..c.."~u~"}, p={r..w..c.."~os~"}, f={}, fp={}, n={}}
end
local function rep_a(v, c) return "~"..quitar_tilde[v]..c.."a~" end
local function rep_o(v, c) return "~"..quitar_tilde[v]..c.."o~" end
local function rep_es(v, c) return "~"..quitar_tilde[v]..c.."es~" end
local function rep_os(v, c) return "~"..quitar_tilde[v]..c.."os~" end
local es_monosilabo = find(p, "^"..CONS.."-[iuü]?[iu]?[aeoiu][iu]?"..CONS.."-$")
local fl = try(p, es_monosilabo and "es$" or "és$", "~eses~", "~esa~", "~eses~", "~és~", nil, "~eso~", adj)
or try(p, "[aeiou]h?[íú]s$", "~%0es~", "~%0a~", "~%0es~", "~%0o~", nil, nil, adj) -- hiatos como en [[país]]
or try(p, es_monosilabo and "([aiou])(s)$" or "([áíóú])(s)$", rep_es, rep_a, rep_es, rep_o, nil, nil, adj)
or try(p, es_monosilabo and "on$" or "ón$", "~ones~", "~ona~", "~ones~", "~ón~", on and "~onos~" or nil, "~ono~", adj)
or try(p, es_monosilabo and "([ae])(n)$" or "([áé])(n)$", rep_es, rep_a, rep_es, rep_o, nil, nil, adj)
or try(p, "[aeiou]h?[íú]n$", "~%0os~", "~%0a~", "~%0es~", "~%0o~", nil, nil, adj) -- hiatos como en [[saín]]
or try(p, es_monosilabo and "([iu])(n)$" or "([íú])(n)$", rep_os, rep_a, rep_es, rep_o, nil, nil, adj)
or try(p, "[aá]u$", "~aos~", "~ada~", "~aes~", "~ao~", nil, nil, adj)
or try(p, "[oó]u$", "~oos~", "~oa~", "~oes~", "~oo~", nil, nil, adj)
or try(p, "éu$", "~eos~", "~eda~", "~ees~", "~eo~", nil, nil, adj)
or try(p, "íu$", "~íos~", "~ida~", "~íes~", "~ío~", nil, nil, adj)
or try(p, "ízu$", "~ízos~", "~íza~", "~íces~", "~ízo~", nil, nil, adj) -- rompe en hiato con la vocal anterior
or try(p, "izu$", "~izos~", "~iza~", "~ices~", "~izo~", nil, nil, adj)
or try(p, "nte$", "~ntes~")
or try(p, "c[ou]$", "~cos~", "~ca~", "~ques~", "~co~", nil, nil, adj)
or try(p, "gu[ou]$", "~guos~", "~gua~", "~gües~", "~guo~", nil, nil, adj)
or try(p, "g[ou]$", "~gos~", "~ga~", "~gues~", "~go~", nil, nil, adj)
or try(p, "z[ou]$", "~zos~", "~za~", "~ces~", "~zo~", nil, nil, adj)
or try(p, "[ou]$", "~os~", "~a~", "~es~", "~o~", nil, nil, adj)
or try(p, "az$", "~azos~", "~az~", "~aces~", "~az~", nil, nil, adj) -- debe ir antes que za?$
or try(p, "ca$", "~ques~")
or try(p, "gua$", "~gües~")
or try(p, "ga$", "~gues~")
or try(p, "(["..vocal_tilde.."].*[aei])da$", "~%1des~") -- las esdrújulas mantienen la d intervocálica
or try(p, "peda$", "~pedes~") -- las que terminan en -peda mantienen la d intervocálica
or try(p, "([ae])d?a$", "~%1es~")
or try(p, "ida$", "~íes~")
or try(p, "za?$", "~ces~")
or try(p, "([dt])á$", "~%1aes~") -- equivale a -dad (ciudad) creo que innecesario
or try(p, "tú$", "~túes~") -- equivale a -tud (virtud)
or try(p, "a$", "~es~")
or try(p, VOCAL.."$", "~%0s~")
or try(p, "ol$", "~%0es~", "~%0a~", "~%0es~", "~%0~", nil, nil, adj)
or try(p, "or$", "~%0es~", "~%0a~", "~%0es~", "~%0~", nil, "~%0o~", adj)
or try(p, VOCAL.."[lrxñ]$", "~%0es~") -- pex, limaz, animal
or try(p, "[ns]$", nil) -- esdrújulas en n, llanas/esdrújulas en s
or try(p, VOCAL..CONS.."$", "~%0s~")
or try(p, "ch$", forzar_s and "~%0s~" or "~%0es~")
or try(p, CONS.."[sz]$", nil)
or try(p, "[sz]"..CONS.."$", nil)
or try(p, CONS..CONS.."$", "s")
if fl then
return fl
end
error("No se pudo determinar la flexión de la palabra")
end
local function flexion_sust_adj(palabras, g, forzar_s, on, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s, on)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s, on) or {m={b}, p={}, f={}, fp={}, n={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex1.n = flex1.n[1] and flex1.n or flex1.m
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
flex2.n = flex2.n[1] and flex2.n or flex2.m
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.n, flex.m) then
flex.n = {}
end
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = flexionar_palabra(p, g, forzar_s, on)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], args["on"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["on"] = {tipo = "bool"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "AST:Locuciones sustantivas" or "AST:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["noes"] = {alias_de = "s"},
["on"] = {tipo = "bool"},
["es"] = {tipo = "bool"},
["forzares"] = {alias_de = "es"},
["nos"] = {alias_de = "es"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "AST:Locuciones adjetivas" or "AST:Adjetivos")
end
local YO, TU, EL, NOSOTROS, VOSOTROS, ELLOS = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"yo", "tu", "él, elli, (v)usté", "nosotros", "vosotros", "(v)ustedes, ellos"}
local PRONOMBRES_SUBJ = {"que yo", "que tu", "que él, que elli, (v)usté", "que nosotros", "que vosotros", "que (v)ustedes, ellos"}
local PRONOMBRES_IMP = {"―", "(tu)", "((v)usté)", "(nosotros)", "(vosotros)", "((v)ustedes)"}
local IMPERSONALES = {"", "", "(ello)", "", "", "(ellos)"}
local IMPERSONALES_SUBJ = {"", "", "(que ello)", "", "", "(que ellos)"}
local REFLEXIVOS = {"me", "te", "se", "nos", "vos", "se"}
local function obtener_pronombre(forma, impers, indirecto)
if indirecto then
return nil
end
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_pluperf"] = true,
["fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["cond"] = true,
["imper"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_anter"] = true,
["fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
}
local sufijos = {
{
["ger"] = {"ando"},
["part"] = {"ao"},
["ind_pres"] = {"o", "es", "a", "amos", "áis", "en"},
["ind_imp"] = {"aba", "abes", "aba", "ábamos", "abais", "aben",
nil, nil, nil, "ábemos", "abeis", nil},
["ind_perf"] = {"é", "asti", "ó", "emos", "astis", "aron",
nil, "esti", nil, nil, "estis", nil},
["ind_perf_alt"] = {"uvi", "uvisti", "uvo", "uvimos", "uvistis", "uvieron",
"evi", "uviesti", "evo", "uviemos", "uviestis"
},
["ind_pluperf"] = {"ara", "aras", "ara", "áramos", "arais", "aran",
"are", "ares", "are", "áremos", "areis", "aren"},
["ind_pluperf_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["fut"] = {"aré", "arás", "ará", "aremos", "aréis", "arán"},
["subj_pres"] = {"e", "as", "e", "emos", "éis", "an",
nil, "es", nil, nil, nil, "en"},
["subj_imp"] = {"ara", "aras", "ara", "áramos", "arais", "aran",
"are", "ares", "are", "áremos", "areis", "aren"},
["subj_imp_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"aría", "aríes", "aría", "aríamos", "aríais", "aríen",
nil, nil, nil, "aríemos", "aríeis", nil},
["imper"] = {"-", "a", "e", "emos", "ái", "an",
nil, nil, nil, nil, nil, "en"}
},
{
["ger"] = {"iendo"},
["part"] = {"ío"},
["ind_pres"] = {"o", "es", "e", "emos", "éis", "en"},
["ind_imp"] = {"ía", "íes", "ía", "íamos", "íais", "íen",
nil, nil, nil, "íemos", "íeis", nil},
["ind_perf"] = {"í", "iesti", "ió", "iemos", "iestis", "ieron",
nil, "isti", nil, "imos", "istis", nil},
["ind_perf_alt"] = {"i", "isti", "o", "imos", "istis", "ieron",
nil, "iesti", nil, "iemos", "iestis"
},
["ind_pluperf"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["ind_pluperf_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["fut"] = {"eré", "erás", "erá", "eremos", "eréis", "erán"},
["subj_pres"] = {"a", "as", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["subj_imp_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"ería", "eríes", "ería", "eríamos", "eríais", "eríen",
nil, nil, nil, "eríemos", "eríeis", nil},
["imper"] = {"-", "i", "a", "amos", "éi", "an"}
},
{
["ger"] = {"iendo"},
["part"] = {"ío"},
["ind_pres"] = {"o", "es", "e", "imos", "ís", "en"},
["ind_imp"] = {"ía", "íes", "ía", "íamos", "íais", "íen",
nil, nil, nil, "íemos", "íeis", nil},
["ind_perf"] = {"í", "iesti", "ió", "iemos", "iestis", "ieron",
nil, "isti", nil, "imos", "istis", nil},
["ind_perf_alt"] = {"i", "isti", "o", "imos", "istis", "ieron",
nil, "iesti", nil, "iemos", "iestis"
},
["ind_pluperf"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["ind_pluperf_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["fut"] = {"iré", "irás", "irá", "iremos", "iréis", "irán"},
["subj_pres"] = {"a", "as", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["subj_imp_alt"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"iría", "irías", "iría", "iríamos", "iríais", "iríen",
nil, nil, nil, "iríemos", "iríeis", nil},
["imper"] = {"-", "i", "a", "amos", "íi", "an"}
},
}
local pronombres = {"me", "te", "se", "nos", "os", "se"}
local auxiliar = {
["inf_comp"] = {"tener"},
["ger_comp"] = {"teniendo"},
["ind_perf_comp"] = {"tengo", "tienes", "tien", "tenemos", "tenéis", "tienen"},
-- ["ind_pluperf"] = {"tenía", "teníes", "tenía", "teníamos", "teníais", "teníen"},
["ind_anter"] = {"tuvi", "tuvisti", "tuvo", "tuvimos", "tuvistis", "tuvieron"},
["fut_comp"] = {"tendré", "tendrás", "tendrá", "tendremos", "tendréis", "tendrán"},
["cond_comp"] = {"tendría", "tendríes", "tendría", "tendríamos", "tendríais", "tendríen"},
["subj_perf"] = {"tenga", "tengas", "tenga", "tengamos", "tengáis", "tengan"},
["subj_pluperf"] = {"tuviera", "tuvieras", "tuviera", "tuviéramos", "tuvierais", "tuvieran",
"tuviese", "tuvieses", "tuviese", "tuviésemos", "tuvieseis", "tuviesen"},
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "ar" then
return sufijos[1][forma]
elseif sufijo_inf == "er" then
return sufijos[2][forma]
else
return sufijos[3][forma]
end
end
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if find(sufijo, "^[eéií]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "z" then
return "~c~"..sufijo
end
if nexo == "gu" then
return "g~ü~"..sufijo
end
end
local _, cnt = gsub(sufijo, "[aeiou]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
-- no existe adecúo
if nexo == "u" then
return "~ú~"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "i" then
return "#í#"..sufijo -- es llana y entonces lleva tilde
end
end
if find(sufijo, "^ar") then
if find(nexo, "^[~#]?[bdeir]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
else -- ER/IR/ÍR
if sufijo == "e" then -- 3ra del presente
if nexo == "C" then
return "~z~"
end
if nexo == "L" then -- l de goler
return "~l~"
end
if nexo == "l" then -- l de valir, salir
return "~l~"
end
if nexo == "R" then
return "~r~"
end
if nexo == "S" then
return "~s~"
end
if nexo == "X" then
return "~x~", "x"..sufijo
end
end
if sufijo == "i" then -- 1ra del imperativo
if nexo == "C" then
return "~z~"
end
if nexo == "L" then -- l de goler
return "~l~", "l"..sufijo
end
if nexo == "l" then -- l de valir, salir
return "~l~"
end
if nexo == "R" then
return "~r~"
end
if nexo == "S" then
return "~s~", "s"..sufijo
end
if nexo == "X" then
return "~x~", "x"..sufijo
end
end
if find(sufijo, "^[aáoóuú]") then
if nexo == "C" then
return "~z~"..sufijo
end
if nexo == "c" then
return "~z~"..sufijo
end
if nexo == "g" then
return "~x~"..sufijo
end
if nexo == "gu" then
return "g~"..sufijo.."~"
end
if nexo == "qu" then
return "~c~"..sufijo
end
end
if find(sufijo, "^[ei][ns]?$") then
if nexo == "gü" then
return "g~ú~"..(gsub(sufijo, "e", "i"))
end
if nexo == "u" then
return "~ú~"..(gsub(sufijo, "e", "i"))
end
end
if find(sufijo, "^ie") then
if find(nexo, "u#$") then -- ir --> fuera (subj)
return nexo..sub(sufijo, 2)
end
if find(nexo, "o#$") then -- ir --> fora (subj)
return nexo..sub(sufijo, 3)
end
end
if find(sufijo, "^ié") then
if find(nexo, "u#$") then -- ir --> fuera (subj)
return nexo..sub(sufijo, 2)
end
if find(nexo, "o#$") then -- ir --> fora (subj)
return sub(nexo, 1, -3).."ó#"..sub(sufijo, 3)
end
end
if find(sufijo, "^í$") then
if nexo == "#x#" or nexo == "~x~" then
return nexo.."~i~"
end
end
if find(sufijo, "^ió$") then
if nexo == "#x#" or nexo == "~x~" then
return nexo.."~o~"
end
end
if find(sufijo, "^[ie]r") then
if find(nexo, "^[~#]?[bdeir]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
if find(sufijo, "^[aeoáéó]") then
if nexo == "gü" then
return "g~uy~"..sufijo
end
if nexo == "u" then
return "u~y~"..sufijo
end
end
if find(sufijo, "^i[aeoáéó]") then
if nexo == "ñ" or nexo == "ll" or nexo == "#x#" or nexo == "~x~" or nexo == "x" then
return "~"..nexo..sub(sufijo, 2).."~"
end
if nexo == "X" then
return "~x"..sub(sufijo, 2).."~"
end
if nexo == "gü" then
return "g~uy~"..sub(sufijo, 2)
end
if nexo == "u" then
return "u~y~"..sub(sufijo, 2)
end
if nexo == "e" then
return nexo.."~y~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[^aeiouáéíóú]") then
if nexo == "e" then
return nexo.."~í~"..sub(sufijo, 2)
end
end
end
if nexo == "C" then
return "c"..sufijo
end
if nexo == "L" then
return "l"..sufijo
end
if nexo == "R" then
return "r"..sufijo
end
if nexo == "S" then
return "s"..sufijo
end
if nexo == "X" then
return "x"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, nucleo_inf)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "ca[yi]$") and nexosufijo_ == "i" then -- [[cayer]], pero no [[coyer]]
return gsub1(nucleo, "[yi]([~#]?)$", "%1")..nexosufijo
elseif find(nucleo_, "[xy]([~#]?)$") and find(nexosufijo_, "^i"..VOCAL) then -- yió -> yó, xió -> xó
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif find(nucleo_, "i$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif find(nucleo_, "í[~#]?$") and find(nexosufijo_, "^á") then -- cambiar síáis por síais
return nucleo..gsub1(nexosufijo, "^([~#]?)á", "%1a")
elseif find(nucleo_, "^[^áéíóú]-[aeiou]h?$") and find(nexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleo_, "[^gq][aeiou]$") and find(nexosufijo_, "^i[aeiouáéíóú]") then -- se junta [aeiou]i[aeiouáéíóú] -> cambio a y (creYO) PERO [[chinguiar]] -> chinguIando
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~y~")
elseif find(nucleo_, "[aeiou]$") and find(nexosufijo_, "^id$") then -- reír -> reÍd, embaír -> embaÍd
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~í~")
elseif find(nucleo_, "[bdeir]r[~#]?$") and find(nexosufijo_, "^er.") then -- moler, moldr
return nucleo..sub(nexosufijo, 3)
elseif find(nucleo_, "^[^aeiouáéíóú]+$")
and (find(nexosufijo_, "^"..CONS.."?"..CONS.."?".."[iuü]?[áéó][iuü]?[ns]?$") or find(nexosufijo_, "^[íú][ns]?$")) then -- caso de dar, vos *d+ás, debo quitar la tilde
return nucleo..gsub1(nexosufijo, "[áéíóú]", function(v) return "~"..quitar_tilde[v].."~" end)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
local prefijo_ = gsub(prefijo, "[~#]", "")
local nucleonexosufijo_ = gsub(nucleonexosufijo, "[~#]", "")
if prefijo_ and find(prefijo_, "[aeiou]") and not find(prefijo_, "[áéíóú]") then
if find(prefijo_, "^[^áéíóú]-[aeiou]h?$") and find(nucleonexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- nucleonexosufijo con i/u tónica (rehacer -> rehíce)
return prefijo..gsub1(nucleonexosufijo, "^([~#]?h?[~#]?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleonexosufijo_, "^("..CONS.."*[iuü]?)([aeiou])([iuü]?[ns]?)$") then -- monosílabo: prever --> prevén
return prefijo..gsub1(nucleonexosufijo, "^([~#]?"..CONS.."*[~#]?[iuü]?[~#]?)([aeiou])([~#]?[iuü]?[~#]?[ns]?[~#]?)$", function(a, b, c) return a..agregar_tilde[b]..c end) -- ven --> prevén
end
end
return prefijo..nucleonexosufijo
end
local paradigmas_regulares = {
["ar"] = {
{"añunciar", {"iar$"}, { --necesidad de explicitar el diptongo, aunque esta variante es la que consideramos como la regular
}},
{"evacuar", {"cuar$"}, {
nexo = "cu"
}},
{"averiguar", {"guar$"}, {
nexo = "gu"
}},
{"complicar", {"car$"}, {
nexo = "c"
}},
{"llegar", {"gar$"}, {
nexo = "g"
}},
{"actuar", {"uar$"}, {
nexo = "u"
}},
{"realizar", {"zar$"}, {
nexo = "z"
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"ller", {"ller$"}, { -- Existe esto??
nexo = "ll"
}},
{"guer", {"guer$"}, { -- Existe esto??
nexo = "gu"
}},
{"güer", {"güer$"}, { -- Existe esto??
nexo = "gü"
}},
{"quer", {"quer$"}, { -- Existe esto??
nexo = "qu"
}},
{"paecer", {"[aeious]cer$"}, {
nexo = "C"
}},
{"vencer", {"[^aeious]cer$"}, { -- los verbos en -scer NO entran en este paradigma (ver fosforescer o evanescer)
nexo = "c"
}},
{"caler", {"[ao]ler$"}, { -- caler, goler
nexo = "L"
}},
{"querer", {"erer$"}, {
nexo = "R"
}},
{"coser", {"[aeiou]ser$"}, {
nexo = "S"
}},
{"texer", {"[aeiou]xer$"}, {
nexo = "X"
}},
{"lleer", {"eer$"}, {
nexo = "e"
}},
{"proteger", {"ger$"}, {
nexo = "g"
}},
{"atañer", {"ñer$"}, {
nexo = "ñ"
}},
{"uer", {"uer$"}, { -- Existe esto??
nexo = "u"
}},
{"emerxer", {"xer$"}, {
nexo = "x"
}},
{"temer", {"er$"}, {
}},
},
["ir"] = {
{"escabullir", {"llir$"}, {
nexo = "ll"
}},
{"distinguir", {"guir$"}, {
nexo = "gu"
}},
{"argüir", {"güir$"}, {
nexo = "gü"
}},
{"delinquir", {"quir$"}, {
nexo = "qu"
}},
{"llucir", {"[aeious]cir$"}, {
nexo = "C"
}},
{"fruncir", {"[^aeious]cir$"}, {
nexo = "c"
}},
{"inxerir", {"erir$"}, {
nexo = "R"
}},
{"tusir", {"[aeiou]sir$"}, {
nexo = "S"
}},
{"elixir", {"[aeiou]xir$"}, {
nexo = "X"
}},
{"dirigir", {"gir$"}, {
nexo = "g"
}},
{"gruñir", {"ñir$"}, {
nexo = "ñ"
}},
{"construir", {"uir$"}, { -- var. construyir
nexo = "u"
}},
{"finxir", {"xir$"}, {
nexo = "x"
}},
{"partir", {"ir$"}, {
}},
},
["ír"] = {
{"reír", {"eír$"}, {
nucleo = "e",
alt = {"í-i"},
}},
{"ír", {"ír$"}, { -- para que oír no tire error
}},
}
}
local paradigmas_irregulares = {
["ar"] = {
{"andar", {"^d?e?s?andar$"}, { -- cuidado con mandar
nucleo = "and",
ind_perf = {nucleo = "and"},
ind_pluperf = {nucleo = "anduv"},
subj_imp = {nucleo = "anduv"},
}},
{"dar", {"^d?e?s?dar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"doi", "do"}, {"das"}, nil, nil, nil, {"dan"}},
ind_perf = {sufijo_inf = "er"},
ind_pluperf = {sufijo_inf = "er"},
subj_pres = {{"dea"}, {"deas"}, {"dea"}, {"deamos"}, {"deáis"}, {"dean"}},
subj_imp = {sufijo_inf = "er"},
imper = {nil, nil, {"dea"}, {"deamos"}, nil, {"dean"}},
}},
{"errar", {"^errar$"}, {
nucleo = "err",
alt = {"ye"},
}},
{"inhestar", {"inhestar$"}, {
alt = {"ie"},
part = {"inhiesto"}
}},
{"tar", {"^tar$"}, {
ind_pres = {{"toi", "to"}, {"tas"}, nil, nil, nil, {"tán"}},
ind_perf = {nucleo = "t"},
ind_pluperf = {nucleo = "tuv"},
subj_pres = {{"tea"}, {"teas"}, {"tea"}, {"teamos"}, {"teáis"}, {"tean"}},
subj_imp = {nucleo = "tuv"},
imper = {nil, nil, {"tea"}, nil, {"tai"}, {"tean"}}
}},
--{"ensugar", {"ensugar$"}, {
-- part = {"ensugao", "ensucho"},
--}},
{"triar", {"triar$"}, {
nexo = "i",
}},
{"aislar", {"aislar$"}, {
alt = {"í"}
}},
{"avergoñar", {"avergoñar$"}, {
alt = {"üe"}
}},
{"auñar", {"^auñar$"}, { -- REVISAR
alt = {"ú"}
}},
{"contar", {"contar$"}, {
alt = {"ue"}
}},
{"pensar", {"^pensar$"}, { -- no puede ir compensar
alt = {"ie"}
}},
},
["er"] = {
{"caber", {"^caber$"}, {
ind_pres = {{"quepo"}},
fut = {nucleo = "ca", nexo = "#br#"},
ind_perf = {nucleo = "cup"},
ind_pluperf = {nucleo = "cup"},
subj_pres = {nucleo = "quep"},
subj_imp = {nucleo = "cup"},
cond = {nucleo = "ca", nexo = "#br#"},
imper = {nil, nil, {"quepa"}, {"quepamos"}, nil, {"quepan"}}
}},
{"caer", {"caer$"}, {
nucleo = "ca",
ind_pres = {{"caigo"}, nil, {"cai"}},
subj_pres = {nucleo = "caig"},
imper = {nil, nil, {"caiga"}, {"caigamos"}, nil, {"caigan"}}
}},
{"cayer", {"cayer$"}, {
ind_pres = {nil, {"caes"}, {"cai"}},
}},
{"encender", {"encender$"}, {
alt = {"ie"},
-- part = {"encendío", "encenso"}, -- encenso adjetivo??
}},
{"facer", {"[hfj]acer$"}, { -- REVISAR
nucleo = "a",
nexo = "c", -- evitar "C", necesito forzarlo
part = {"echo"},
ind_pres = {{"ago"}, {"aes"}, {"ai"}, nil, nil, {"aen"}},
ind_perf = {nucleo = "i"},
ind_pluperf = {nucleo = "i"},
fut = {nucleo = "a", nexo = "#dr#"},
subj_pres = {nucleo = "ag", nexo = ""},
subj_imp = {nucleo = "i"},
cond = {nucleo = "a", nexo = "#dr#"},
imper = {nil, {"ai"}, {"aga"}, {"agamos"}, nil, {"agan"}}
}},
{"faer", {"[hfj]aer$"}, { -- REVISAR
nucleo = "a",
part = {"echo"},
ind_pres = {{"aigo"}, nil, {"ai"}},
ind_perf = {nucleo = "ix"},
ind_pluperf = {nucleo = "ix"},
fut = {nucleo = "a", nexo = "#ir#"},
subj_pres = {nucleo = "aig", nexo = ""},
subj_imp = {nucleo = "ix"},
cond = {nucleo = "a", nexo = "#ir#"},
imper = {nil, nil, {"aiga"}, {"aigamos"}, nil, {"aigan"}}
}},
{"haber", {"^haber$"}, {
ind_pres = {{"he"}, {"has"}, {"ha", "hai{IMPERSONAL}"}, {"hemos", "habemos"}, nil, {"han"}},
ind_perf = {nucleo = "hub", {"hubi", "hebi"}, nil, {"hubo", "hebo"}},
ind_pluperf = {nucleo = "hub"},
fut = {nucleo = "ha", nexo = "#br#"},
subj_pres = {nucleo = {"hay", "heb"}},
subj_imp = {nucleo = "hub"},
cond = {nucleo = "ha", nexo = "#br#"},
imper = {nil, {"he{†}", "habe{†}"}, {"he{†}", "habe{†}"}, {"haya{†}"}, {"hayamos{†}"}, nil, {"hayan{†}"}},
}},
{"moler", {"[^g]oler$"}, { -- no goler porque muta a üe
nucleo = "o",
nexo = "L",
alt = {"ue"},
ind_pres = {{"uelo", "uelgo"}},
subj_pres = {nucleo = {"uel", "uelg"}, nexo = "", nil, nil, nil, {"olamos", "olgamos"}, {"oláis", "olgáis"}},
fut = {nucleo = {"ol", "oldr"}, nexo = ""},
cond = {nucleo = {"ol", "oldr"}, nexo = ""},
imper = {nil, nil, {"uela", "uelga"}, {"olamos", "olgamos"}, nil, {"uelan", "uelgan"}}
}},
{"morrer", {"morrer$"}, {
nucleo = "morr",
alt = {"ue"},
part = {"muerto"},
}},
{"goler", {"^goler$"}, {
alt = {"üe"},
}},
{"volver", {"olver$"}, {
nucleo = "olv",
alt = {"ue"},
part = {"uelto"}
}},
{"oyer", {"^oyer$"}, { -- pero no coyer
ind_pres = {{"oigo"}},
subj_pres = {nucleo = "oig"},
imper = {nil, nil, nil, {"oiga"}, {"oigamos"}, nil, {"oigan"}}
}},
-- placer sale solo como sust.
{"poder", {"poder$"}, {
nucleo = "pod",
alt = {"ue"},
ger = {"pudiendo"},
ind_perf = {nucleo = "pud"},
ind_pluperf = {nucleo = "pud"},
fut = {nucleo = "po", nexo = "#dr#"},
subj_imp = {nucleo = "pud"},
cond = {nucleo = "po", nexo = "#dr#"},
}},
{"poner", {"poner$"}, {
nucleo = "pon",
part = {"puesto"},
ind_pres = {{"pongo"}},
ind_perf = {nucleo = "punx"},
ind_pluperf = {nucleo = "punx"},
fut = {nucleo = "pon", nexo = "#dr#"},
subj_pres = {nucleo = "pong"},
subj_imp = {nucleo = "punx"},
cond = {nucleo = "pon", nexo = "#dr#"},
imper = {nil, {"pon"}, {"ponga"}, nil, nil, {"pongan"}},
}},
{"proveer", {"proveer$"}, {
nucleo = "prov",
part = {"provisto"}
}},
{"querer", {"querer$"}, { -- REVISAR
nucleo = "quer",
alt = {"ie"},
ind_perf = {nucleo = "quix"},
ind_pluperf = {nucleo = "quix"},
fut = {nucleo = "que", nexo = "#dr#"},
subj_imp = {nucleo = "quix"},
cond = {nucleo = "que", nexo = "#dr#"},
}},
{"raer", {"^raer$"}, { -- no contraer, etc. REVISAR
ind_pres = {{"raigo"}},
subj_pres = {nucleo = "raig"},
imper = {nil, nil, {"raiga"}, nil, nil, {"raigan"}}
}},
-- rayer regular?
{"roer", {"roer$"}, { -- REVISAR
nucleo = "ro",
ind_pres = {{"roigo"}},
subj_pres = {nucleo = "roig"},
imper = {nil, nil, {"roiga"}, nil, nil, {"roigan"}}
}},
-- royer regular?
{"romper", {"^romper$", "^arromper$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
alt = {"ue"},
part = {"roto"}
}},
{"corromper", {"romper$"}, {
nucleo = "romp",
alt = {"ue"},
}},
{"saber", {"saber$"}, {
nucleo = "sab",
ind_pres = {{"sé"}},
ind_perf = {nucleo = "sup"},
ind_pluperf = {nucleo = "sup"},
fut = {nucleo = "sa", nexo = "#br#"},
subj_pres = {nucleo = "sep"},
subj_imp = {nucleo = "sup"},
cond = {nucleo = "sa", nexo = "#br#"},
imper = {nil, nil, {"sepa"}, nil, nil, {"sepan"}}
}},
{"ser", {"^ser$"}, {
ind_pres = {{"soi", "so"}, {"yes"}, {"ye"}, {"somos"}, {"sois"}, {"son"}},
ind_imp = {{"yera"}, {"yeres"}, {"yera"}, {"yéramos", "yéremos"}, {"yerais", "yereis"}, {"yeren"}},
ind_pluperf = {nucleo = "", nexo = {"#fu#", "#fo#"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fostis", "fuestis", "fuistis"}, {"foron", "fueron"}},
subj_pres = {nucleo = {"sey", "sí"}},
subj_imp = {nucleo = "", nexo = {"#fu#", "#fo#"}}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: hay que agregar la variante con fo
imper = {nil, {"sé"}, {"seya", "sía"}, {"seyamos", "síamos"}, nil, {"seyan", "sían"}}
}},
{"tener", {"tener$", "^ter$"}, {
nucleo = "ten",
alt = {"ie"},
ind_pres = {{"tengo", "teo{P}", "to{P}"}},
ind_perf = {nucleo = "tuv", {"tuvi", "tevi"}, nil, {"tuvo", "tevo"}},
ind_pluperf = {nucleo = "tuv"},
fut = {nucleo = "ten", nexo = "#dr#"},
subj_pres = {nucleo = "teng"},
subj_imp = {nucleo = "tuv"},
cond = {nucleo = "ten", nexo = "#dr#"},
imper = {nil, {"ten"}, {"tenga"}, {"tengamos"}, nil, {"tengan"}}
}},
{"traer", {"traer$"}, {
nucleo = "tra",
ind_pres = {{"traigo"}},
ind_perf = {nucleo = "tra", nexo = "#x#"},
ind_pluperf = {nucleo = "tra", nexo = "#x#"},
subj_pres = {nucleo = "traig"},
subj_imp = {nucleo = "tra", nexo = "#x#"},
imper = {nil, nil, nil, {"traiga"}, {"traigamos"}, nil, {"traigan"}}
}},
{"trayer", {"trayer$"}, {
nucleo = "tra",
ind_perf = {nucleo = "tra", nexo = "#x#"},
ind_pluperf = {nucleo = "tra", nexo = "#x#"},
subj_imp = {nucleo = "tra", nexo = "#x#"},
}},
{"ver", {"^ver$", "^antever$", "^entrever$", "^prever$", "^rever$"}, {
nucleo = "v",
part = {"visto"},
ind_pres = {{"veo"}},
subj_pres = {nucleo = "ve"},
imper = {nil, {"ve"}, {"vea"}, nil, nil, {"vean"}}
}},
{"yacer", {"^yacer$", "^subyacer$"}, { -- REVISAR: existe esto? xacer me sale como sustantivo
nucleo = "yac",
nexo = "", -- evitar C (epéntesis con zc), lo voy a agregar manual
ind_pres = {{"yazco", "yazgo", "yago"}},
subj_pres = {nucleo = {"yazc", "yazg", "yag"}},
imper = {nil, {"yace", "yaz"}, {"yazca", "yazga", "yaga"}, nil, nil, {"yazcan", "yazgan", "yagan"}}
}},
{"mover", {"mover$"}, {
alt = {"ue"},
}},
{"entender", {"entender$"}, {
alt = {"ie"},
}},
},
["ir"] = {
-- asir no existe
{"abrir", {"[^js]abrir$", "^abrir$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"abierto"}
}},
{"abrir", {"ubrir$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "ubr",
part = {"ubierto"}
}},
-- para decir contemplo 4 casos:
-- 1. decir, redecir, entredecir, antedecir: lo normal, con el imperativo en "dí" (di)
-- 2. interdecir: similar a 1. pero el imperativo es interdice (no *interdí) --> esto no existe en ast creo
-- 3. bendecir, maldecir: agrego bendito, maldito al pp
-- 4. condecir, contradecir, desdecir, predecir: parto de 1 pero agrego el futuro regular que esta aceptado
{"dicir", {"^dicir$", "^redicir$", "^entredicir$", "^antedicir$"}, {
nucleo = "di",
part = {"dicho"},
ind_pres = {{"digo"}},
ind_perf = {nexo = "#x#"},
ind_pluperf = {nexo = "#x#"},
fut = {nucleo = "d", nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#x#"},
cond = {nucleo = "d", nexo=""},
imper = {nil, {"di"}, {"diga"}, {"digamos"}, nil, {"digan"}}
}},
{"bendicir", {"bendicir$", "maldicir$"}, {
nucleo = "di",
part = {"dicío{PART}", "dito{ADJ}"},
ind_pres = {{"digo"}},
ind_perf = {nexo = "#x#"},
ind_pluperf = {nexo = "#x#"},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#x#"},
imper = {nil, {"diz"}, {"diga"}, nil, nil, {"digan"}}
}},
{"predicir", {"dicir$"}, {
nucleo = "di",
part = {"dichu"},
ind_pres = {{"digo"}},
ind_perf = {nexo = "#x#"},
ind_pluperf = {nexo = "#x#"},
fut = {nucleo = {"dec", "d"}, nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#x#"},
cond = {nucleo = {"dec", "d"}, nexo=""},
imper = {nil, {"dí"}, {"diga"}, nil, nil, {"digan"}}
}},
-- erguir (erguer) es regular
--{"imprimir", {"imprimir$"}, {
-- nucleo = "imprim",
-- part = {"imprimíu{PART}", "impresu{PART/ADJ}"}
--}},
{"dir", {"^dir$"}, {
ind_pres = {{"voi", "vo"}, {"vas"}, {"va"}, {"vamos"}, {"vais"}, {"van"}},
ind_imp = {{"diba"}, {"dibas"}, {"diba"}, {"díbamos", "díbemos"}, {"dibais", "dibeis"}, {"diben"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fuestis", "fuistis"}, {"foron", "fueron"}},
ind_pluperf = {nucleo = "", nexo = {"#fu#", "#fo#"}},
subj_pres = {{"vaiga", "vaya"}, {"vaigas", "vayas"}, {"vaiga", "vaya"}, {"vaigamos", "vayamos"}, {"vaigáis", "vayáis"}, {"vaigan", "vayan"}},
subj_imp = {nucleo = "", nexo = {"#fu#", "#fo#"}}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: faltan los otros nexos posibles
imper = {nil, {"ve"}, {"vaiga", "vaya"}, {"vaigamos", "vayamos"}, {"vaigáis", "vayáis"}, {"vaigan", "vayan"}}
}},
-- pudrir es podrecer (simil paecer)
{"salir", {"salir$"}, {
nucleo = "sa",
nexo = "l",
ind_pres = {{"salgo"}},
fut = {nucleo = "sal", nexo = "#dr#"},
subj_pres = {nucleo = "salg", nexo = ""},
cond = {nucleo = "sal", nexo = "#dr#"},
imper = {nil, {"sal"}, {"salga"}, {"salgamos"}, nil, {"salgan"}}
}},
{"escribir", {"scribir$"}, {
nucleo = "scrib",
part = {"scrito"}
}},
{"producir", {"ducir$"}, {
ind_perf = {nexo = {"c", "#x#"}},
ind_pluperf = {nexo = {"c", "#x#"}},
subj_imp = {nexo = {"c", "#x#"}},
}},
{"valir", {"valir$"}, {
nucleo = "va",
nexo = "l",
ind_pres = {{"valgo"}},
fut = {nucleo = "val", nexo = "#dr#"},
subj_pres = {nucleo = "valg", nexo = ""},
cond = {nucleo = "val", nexo = "#dr#"},
imper = {nil, nil, {"valga"}, {"valgamos"}, nil, {"valgan"}}
}},
{"venir", {"venir$"}, {
nucleo = "ven",
alt = {"ie-i"},
ind_pres = {{"vengo"}, nil, {"vien"}},
fut = {nexo = "#dr#"},
ind_perf = {nucleo = "vin", nil, nil, {"vieno"}}, -- REVISAR: la 3s es él vIEno, no *vino, hay más verbos así?
subj_pres = {nucleo = "veng"},
cond = {nexo = "#dr#"},
imper = {nil, {"ven"}, {"venga"}, {"vengamos"}, nil, {"vengan"}}
}},
{"rir", {"^rir$", "^frir$"}, {
nucleo = "r",
part = {"frío", "frito"},
ind_pres = {{"río"}},
subj_pres = {nucleo = "rí"},
imper = {nil, nil, {"ría"}, {"riamos"}, nil, {"rían"}}
}},
{"sentir", {"sentir$"}, { -- discernir entra en este paradigma tmb.
alt = {"ie-i"}
}},
{"podrir", {"podrir$"}, {
alt = {"u-u"},
}},
{"reunir", {"reunir$"}, {
alt = {"ú"}
}},
{"prohibir", {"prohibir$"}, {
alt = {"í"}
}},
{"rehenchir", {"rehenchir$"}, {
alt = {"í-i"}
}},
{"repetir", {"repetir$"}, {
alt = {"i-i"}
}},
{"dormir", {"dormir$"}, {
alt = {"ue-u"}
}},
},
["ír"] = {
{"desvaír", {"desvaír$"}, { -- hay más verbos en -air? no podemos considerarlo como regla general
ind_pres = {{"desvayo"}},
subj_pres = {nucleo = "desvay"},
imper = {nil, nil, nil, {"desvaya"}, {"desvayamos"}, nil, {"desvayan"}}
}},
--{"freír", {"freír$"}, {
-- nucleo = "fre",
-- part = {"frito{PART/ADJ}", "freído{PART}"},
--}},
},
}
local alt_info = {
["ar"] = {
["í"] = {"aislar", "i", "í"}, -- tb. descafeinar
["ú"] = {"aunar", "u", "ú"}, -- tb. rehusar
["ie"] = {"pensar", "e", "ie"},
["ue"] = {"contar", "ou", "ue"}, -- también jugar
["üe"] = {"agorar", "o", "üe"},
["hue"] = {"desosar", "ou", "hue"},
["ye"] = {"errar", "e", "ye"},
},
["er"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["ie"] = {"entender", "e", "ie"},
["ue"] = {"mover", "o", "ue"},
["üe"] = {"goler", "o", "üe"},
},
["ir"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["í"] = {"prohibir", "i", "í"},
["í-i"] = {"rehenchir", "e", "í", "i"},
["i-i"] = {"repetir", "e", "i", "i"},
--["ie"] = {"discernir", "ei", "ie"}, -- por las dudas también la i, por inquirir
["ie-i"] = {"sentir", "ei", "ie", "i"}, -- inquirir
["u"] = {"???", "o", "u", "u"},
["ú"] = {"reunir", "u", "ú"},
["u-u"] = {"podrir", "o", "u", "u"}, -- REVISAR: existe esto??
["ue-u"] = {"dormir", "o", "ue", "u"},
["ye-i"] = {"erguir", "e", "ye", "i"},
},
["ír"] = {
["í-i"] = {"reír", "e", "í", "i"},
["oy"] = {"oír", "o", "oy", "oy"},
}
}
local function doble_imperativo(alt, nexo, sufijo_inf)
if sufijo_inf == "ar" or nexo:find("[CLRSX]") then
return false
end
for _,a in ipairs(alt) do
if a == "ie" or a == "ue" or a == "üe" or a == "ie-i" or a == "ue-u" then
return true
end
end
return false
end
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
local sufijos_ = obtener_sufijos(sufijo_inf, ((forma == "ind_perf" or forma == "ind_pluperf" or forma == "subj_imp") and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleos2
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos1}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleos1}
elseif forma == "ind_pluperf" or forma == "subj_imp" then
local n = conjinfo.nucleos2
nucleos = {n, n, n, n, n, n}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
if not nexo then
nexo = ""
end
local prefijo = conjinfo.prefijo
if type(nexo) == "string" then
nexo = {nexo}
end
if forma == "imper" and doble_imperativo(conjinfo.alt, conjinfo.nexo or "", conjinfo.sufijo_inf) then
nucleos[TU] = deepcopy(nucleos[TU]) -- para no modificar los demás núcleos
insert_if_not(nucleos[TU], conjinfo.nucleo_inf[1])
end
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for j, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo[1], sufijos_[1], sufijo_inf)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
end
return
end
for i = YO, ELLOS do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
for _, nx in ipairs(nexo) do
for _, n in ipairs(nucleos[i]) do
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nx, sufijos_[k], sufijo_inf)
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo2, conjinfo.nucleo_inf[1])))
if forma == "imper" and i == TU and (conjinfo.v:find("goler$") or conjinfo.v:find("coser$")) then -- excepciones con triple imperativo harcodeadas
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(conjinfo.nucleo_inf[1], nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest_ = i < NOSOTROS and resto or resto_pl
local rest_pl_ = resto_pl
if tiempo == "imper" and adv == "no " then
tiempo = "subj_pres"
arr = fmtinfo["subj_pres"..tostr[i]]
end
for _, v in ipairs(arr) do
local hs = auxiliar[tiempo]
local v2
local rest = rest_
local rest_pl = rest_pl_
if hs then
rest = " "..v..rest
rest_pl = " "..v..rest_pl
v = hs[i]
v2 = hs[i+7] -- subjuntivo imperfecto
end
if forma == "inf" or forma == "inf_comp" then
if pron ~= "" and art ~= "" then
v = gsub(v, "([aei])r$", function (x) return agregar_tilde[x].."r" end)
end
insert(t, adv..v..pron..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..v..pron..art..f_links(rest_pl))
end
elseif forma == "ger" or forma == "ger_comp" then
local vpron = v..pron
if pron ~= "" or art ~= "" then
vpron = gsub(vpron, "^(.*)([ae])(ndo)", function(x, y, z) return x..agregar_tilde[y]..z end)
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
if rest_pl ~= rest then
insert(t, adv..f(vpron)..art..f_links(rest_pl))
end
elseif forma == "part" then
insert(t, adv..f_links(v)..f_links(resto))
if (resto_pl ~= resto) then
insert(t, adv..f_links(v)..f_links(resto_pl))
end
elseif tiempo == "imper" and (pron ~= "" or art ~= "") then
-- tengo que correr la acentuación una sílaba para atrás, lo bueno es que no hay formas terminadas en consonante dist. de n o s
local vpron = gsub(v, "[~#]", "") -- PARCHE: quito todas las marcas de colores, ya que cuesta mucho transformar los verbos con imperativos irregulares, quedan incrustadas en el medio
-- 1. Las llanas pasan a esdrújulas
vpron = gsub(vpron,
"^([^áéíóú]-)([aeo])(h?[iuü]?h?[aeo][ns]?)$", -- si no hay consonante de separación, hay un hiato de dos vocales abiertas. OJO, no es lo mismo comenzar con [^áéíóú]- que comenzar con [^áéíóú]*
function(x, y, z) return x..agregar_tilde[y]..z end
)
vpron = gsub(vpron,
"^([^áéíóú]-)([aeoiu])(h?[iuü]?"..CONS_SALVO_H.."+u?[iuü]?[aeiou]+[ns]?)$", -- normal, con consonante de separación. OJO, no es lo mismo comenzar con [^áéíóú]- que comenzar con [^áéíóú]*
function(x, y, z) return x..agregar_tilde[y]..z end
)
-- si es un hiato con tilde, lo dejo
-- 2. Las agudas pasan a llanas, los monosílabos con tilde la pierden, SALVO LOS HIATOS CON VOCAL CERRADA (ej: reí -> reíte. embaí -> embaíte, PERO pecheá -> pecheala)
vpron = gsub(vpron,
"^([^áéíóú]*"..CONS_SALVO_H.."u?[iuü]?)([áéíóú])([ns]?)$",
function(x, y, z) return x..quitar_tilde[y]..z end
)
vpron = gsub(vpron,
"^([^áéíóú]*[aeo])([áéó])([ns]?)$",
function(x, y, z) return x..quitar_tilde[y]..z end
)
if pron == "se" then -- ajustes finales https://www.rae.es/dpd/pronombres%20personales%20%C3%A1tonos
local enc = REFLEXIVOS[i]
if enc == "nos" then -- dejémoS nos -> dejémonos
vpron = gsub(vpron, "mos$", "mo")
end
if enc == "os" then -- amaD + os -> amaos, hacED + os -> haceos, salvo idos
vpron = gsub(vpron, "([ae])d$", "%1")
vpron = gsub(vpron, "("..LETRA..")[ií]d$", "%1í") -- aseguro q no sea "id" a secas
end
if art ~= "" then -- Si tengo pronombre y artículo, la palabra tiene que quedar esdrújula o sobreesdrújula (dársela -> dátela)
vpron = gsub(vpron,
"^([^áéíóú]*)([aeiou])([^áéíóú]-)$",
function(x, y, z) return x..agregar_tilde[y]..z end
)
end
vpron = vpron..enc
end
insert(t, adv..(art == "" and f_links(vpron) or f(vpron))..art..f_links(rest))
else -- si es imperativo y el pronombre y artículo están ambos vacíos, es lo mismo anteponerlos que posponerlos
local pronart = pron == "se" and REFLEXIVOS[i].." " or ""
pronart = art ~= "" and pronart..art.." " or pronart
insert(t, adv..pronart..f_links(v)..f_links(rest))
if v2 then
insert(t, adv..pronart..f_links(v2)..f_links(rest))
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["indirecto"] = {tipo = "bool"},
["alt"] = {lista = true},
["paradigma"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][íu]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiáéí]r)(s?e?)(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?"..ESPACIO.."?"..LETRA.."*[aeiáéí]rs?e?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
v = gsub(v, "^(%S*)ár$", "%1ar") -- pronominales
v = gsub(v, "^(%S*)ér$", "%1er") -- pronominales
v = gsub(v, "^(%S*[^aeo])ír$", "%1ir") -- grafías anticuadas
local sufijo_inf = match(v, "[aeií]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"])) do
local conjinfo = {}
if find(v, "iar$") and (not args["paradigma"][N] or args["paradigma"][N] == "") then
error("Especifique el (los) paradigma(s) para los verbos en -iar (añunciar, triar)")
end
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
local vacio = true
for k, v in pairs(p[3]) do
vacio = false
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
if vacio then
paradigmas_reconocidos[p[1]] = true -- caso de [[anunciar]]
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = {}
conjinfo.nucleos2 = {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert_if_not(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
n1, sust = gsubb(conjinfo.nucleo_inf, "^(.*)["..info[2].."](.-)$", "%1#"..info[3].."#%2")
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^(.*)["..info[2].."](.-)$", "%1#"..info[4].."#%2")
end
assert(sust, "Alternancia vocálica no reconocida")
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if find(e, 'PART') or not find(e, 'ADJ') and not find(e, "†") and not find(e, "{x}") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for _,s in ipairs(tostr) do
fmtinfo["subj_pres"..s] = deepcopy(resultante["subj_pres"..s])
end
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local impers = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(ello)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(ello)", "(ellos)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", "(ellos)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", "(que ellos)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", "(ellos)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "yo", "tu", "él, vusté", "nós", "vós", "ellos", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "yo", "tu", "él, vusté", "nos", "vos", "ellos", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que yo", "que tu", "qu'él, que vusté", "que nos", "que vos", "qu'ellos", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "(vusté)", "(nosotros)", "(vosotros)", "(vustedes)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
insert(t, {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true})
if impers == "3" then
-- resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
-- resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
else
resultante.inf.colspan = cs
resultante.ger.colspan = cs
resultante.part.colspan = cs
-- resultante.inf.colspan = cs1-1
-- resultante.ger.colspan = cs1-1
-- resultante.part.colspan = cs1-1
-- resultante.inf_comp.colspan = cs2
-- resultante.ger_comp.colspan = cs2
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
insert(t, {{"Formas personales", colspan=cs}, color=COLOR_H, header=true})
insert(t, {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true})
insert(t, fila_pronombres_ind)
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")})
-- insert(t, {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")})
-- insert(t, {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")})
insert(t, {{"Modo potencial", colspan=cs}, color=COLOR_COND, header=true})
insert(t, fila_pronombres_cond)
insert(t, {{"Futuro", color=COLOR_COND, header=true}, ic("fut")})
--insert(t, {{"Futuro compuesto", color=COLOR_COND, header=true}, ic("fut_comp")})
insert(t, {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")})
-- insert(t, {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")})
insert(t, {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true})
insert(t, fila_pronombres_subj)
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")})
insert(t, {{"Pretérito", color=COLOR_SUBJ, header=true}, ic("subj_imp")})
-- insert(t, {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")})
-- insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")})
insert(t, {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true})
insert(t, fila_pronombres_imper)
if mostrar_imper then
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")})
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}})
args["nota"] = args["nota"] or ""
impers = impers or ""
if impers == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if impers == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if impers == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if impers == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
insert(t, {{args["nota"] and args["nota"] or "", colspan=cs}})
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "AST:Verbos irregulares")
-- si es irregular, los paradigmas regulares que no aportan nada de información (los vacíos) no pueden estar
paradigmas_reconocidos["añunciar"] = nil
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["ír"] = nil
else
insert(cats, "AST:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "AST:Verbos del paradigma "..p)
end
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "AST:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "AST:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "AST:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "AST:Verbos defectivos")
end
if sufijo_inf == "ar" then
insert(cats, "AST:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "AST:Verbos de la segunda conjugación")
else -- será ir o ír, ya fue chequeado antes
insert(cats, "AST:Verbos de la tercera conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
oj6sfg6dut0lsfemmgt4dl63eu5m8gq
Módulo:flex/gl
828
1056411
6307331
6118173
2026-08-06T00:34:17Z
TMCbot
164594
.
6307331
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_INF = m_flex.COLOR_INF
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local unaccented_vowel = "aeiouàAEIOUÀ"
local accented_vowel = "áéíóúýâêôÁÉÍÓÚÝÂÊÔ"
local maybe_accented_vowel = "ãõÃÕ"
local vowel = unaccented_vowel .. accented_vowel .. maybe_accented_vowel
local cons = "bcdfghjklmnñpqrstvwxyzçBCDFGHJKLMNÑPQRSTVWXYZÇ" -- agrego la ñ y mantengo las consonantes del portugués por las dudas que haya extranjerismos o palabras "reintegracionistas"
local V = "[" .. vowel .. "]"
local AV = "[" .. accented_vowel .. "]"
local NAV = "[^" .. accented_vowel .. "]"
local C = "[" .. cons .. "]"
local espacios = "%s"
local espacios_o_guiones = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local ESPACIO_O_GUION = "["..espacios_o_guiones.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde = {
["á"]="a", ["é"]="e", ["í"]="i", ["ó"]="o", ["ú"]="u", ["ý"]="y", ["â"]="a", ["ê"]="e", ["ô"]="o",
["Á"]="A", ["É"]="E", ["Í"]="I", ["Ó"]="O", ["Ú"]="U", ["Ý"]="Y", ["Â"]="A", ["Ê"]="E", ["Ô"]="O"
}
local function es_locucion(tit, cop)
return find(tit, LETRA..ESPACIO_O_GUION..LETRA) or (cop ~= nil and find(tit, LETRA..ESPACIO_O_GUION..LETRA))
end
local function try(p, nexo, m, pl, f, fpl, g, s)
if s == true then
if pl == "es" then
pl = "s"
end
end
local r, n, suf
if nexo:sub(1, 1) == "^" then
r = ""
n, suf = match(p, "^("..nexo:sub(2, -1)..")("..m..")$")
else
r, n, suf = match(p, "^(.-)("..nexo..")("..m..")$")
end
if suf then
if type(n) ~= "string" then
n = ""
end
if type(suf) ~= "string" then
suf = ""
end
if pl and find(pl, "#") then
if g == "mf" and f then
return {m={r.."~"..n..suf.."~"}, p={r..n..pl}, f={r..n..f}, fp={r..n..fpl}}
elseif pl then
return {m={r.."~"..n..suf.."~"}, p={r..n..pl}, f={}, fp={}}
else
return {m={r.."~"..n..suf.."~"}, p={}, f={}, fp={}}
end
else
if g == "mf" and f then
return {m={r.."~"..n..suf.."~"}, p={r.."~"..n..pl.."~"}, f={r.."~"..n..f.."~"}, fp={r.."~"..n..fpl.."~"}}
elseif pl then
return {m={r.."~"..n..suf.."~"}, p={r.."~"..n..pl.."~"}, f={}, fp={}}
else
return {m={r.."~"..n..suf.."~"}, p={}, f={}, fp={}}
end
end
end
return nil
end
-- https://www.lingua.gal/c/document_library/get_file?file_path=/portal-lingua/celga/celga-1/material-alumno/Manual_Aula_de_Galego_1_resumo_gramatical.pdf
local function flexionar_palabra(p, g, forzar_s)
local r, v, s
r, v, s = match(p, "^(.*[aeiouü])([íú])(s)$") -- [[país]]
if v then
if g == "mf" then
return {m={r.."~"..v..s.."~"}, p={r.."~"..v.."ses~"}, f={r.."~"..v.."sa~"}, fp={r.."~"..v.."sas~"}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..v.."ses~"}, f={}, fp={}}
end
end
r, v, s = match(p, "^(.*)(" .. AV .. ")(s)$") -- final -ês, -ós etc.
if v then
local w = quitar_tilde[v]
if g == "mf" then
return {m={r.."~"..v..s.."~"}, p={r.."~"..w.."ses~"}, f={r.."~"..w.."sa~"}, fp={r.."~"..w.."sas~"}}
else
return {m={r.."~"..v..s.."~"}, p={r.."~"..w.."ses~"}, f={}, fp={}}
end
end
local changed = try(p, "", "ão", forzar_s and "#ãos#" or "ões", forzar_s and "#ã#" or "ona", forzar_s and "#ãs#" or "onas", g, s)
or try(p, V.."[iu]s", "", "es", nil, nil, g, s) -- diptongo final con -s ejemplo [[deus]]
or try(p, "^"..C.."-[iuü]?[aeiou]s", "", "es", nil, nil, g, s) -- monosilabos en -s, ejemplo [[gas]]
or try(p, V, "bel", "beis", nil, nil, g, s) -- -able, -ible
or try(p, "^"..C.."-[iuü]?[iu]?[aeoiu][iu]?l", "", "es", nil, nil, g, s) -- monosílabos en -l
or try(p, AV..".*l", "", "es", nil, nil, g, s) -- llanas/esdrújulas en -l
or try(p, "", "ol", "ois", "ola", "olas", g, s) -- agudas en -ol
or try(p, "", "il", "ís", nil, nil, g, s) -- agudas en -il
or try(p, "[aeou]", "l", "is", nil, nil, g, s) -- agudas en -l
or try(p, "or", "", forzar_s and "#ors#" or "es", "a", "as", g, s) -- -or con femenino (tutor)
or try(p, "r", "", forzar_s and "#s#" or "es", nil, nil, g, s) -- final -r
or try(p, "", "z", "ces", nil, nil, g, s) -- final -z, por las dudas no flexiono en -a excepciones son [[rapaz]] o [[andaluz]]
or try(p, "", "eu", "eus", "ía", "ías", g, s)
or try(p, "^"..C.."*", "u", "us", "úa", "úas", g, s) -- [[nu]] --> núa, [[cru]] --> [[crúa]]
or try(p, "", "o", "os", "a", "as", g, s)
or try(p, V, "", "s", nil, nil, g, s) -- final vowel
or try(p, "[sx]", "", nil, nil, nil, g, s)
or try(p, "", "án", "áns", "á", "ás", g, s) -- CUIDADO: remite a los adjetivos que vienen de -anus, -anum, pero no a palabras como "folgazán", "mentirán"
or try(p, "", "ín", "íns", "ina", "inas", g, s) -- única excepción [[ruín]]
or try(p, "", "ón", "óns", "ona", "onas", g, s) -- CUIDADO: hay un gran grupo de palabras que forma el sufijo con -oa https://es.wikibooks.org/wiki/Gallego/Gram%C3%A1tica/Sufijos_y_terminaciones
or try(p, "", "ún", "úns", "úa", "úas", g, s) -- CUIDADO: consultar referencia anterior
or try(p, "^"..C.."*[iuü]?", "an", "ans", "á", "ás", g, s)
or try(p, "^"..C.."*[iuü]?", "in", "ins", "ina", "inas", g, s)
or try(p, "^"..C.."*[iuü]?", "on", "ons", "ona", "onas", g, s)
or try(p, "^"..C.."*[iuü]?", "un", "uns", "úa", "úas", g, s)
or try(p, C, "", "s", nil, nil, g, s) -- extranjerismos
assert(changed, "No se pudo determinar la flexión de la palabra")
return changed
end
local function flexion_sust_adj(palabras, g, forzar_s, copulativa)
local a, separador, b
if copulativa == true or copulativa == false then
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO_O_GUION..")("..LETRA.."+)$")
else
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
end
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto
if copulativa == false then
p, resto = match(palabras, "^(%-?[^"..espacios_o_guiones.."]+)(.-)$")
else
p, resto = match(palabras, "^("..LETRA.."+)(.-)$")
end
local flex = flexionar_palabra(p, g, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif es_locucion(title, args["cop"]) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "GL:Locuciones sustantivas" or "GL:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "GL:Locuciones adjetivas" or "GL:Adjetivos")
end
local EU, TU, ELE, NOS, VOS, ELES = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"eu", "ti", "el, el, vostede", "nós", "vós", "vostedes, eles, elas"}
local PRONOMBRES_INF = {"por . eu", "por . ti", "por . ele, por . ela, por . vostede", "por . nós", "por . vós", "por . vostedes, por . eles, por . elas"}
local PRONOMBRES_SUBJ = {"que eu", "que ti", "que ele, que ela, que vostede", "que nós", "que vós", "que vostedes, que eles, que elas"}
local PRONOMBRES_IMP = {"―", "(ti)", "(vostede)", "(nós)", "(vós)", "(vostedes)"}
local IMPERSONALES_INF = {"", "", "(por . iso)", "", "", "(por . isos)"}
local IMPERSONALES = {"", "", "(iso)", "", "", "(isos)"}
local IMPERSONALES_SUBJ = {"", "", "(que iso)", "", "", "(que isos)"}
local REFLEXIVOS = {"me", "te", "se", "nos", "vos", "se"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
["inf_pers"] = true,
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_pluperf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["inf_pers_comp"] = true,
["ind_perf_comp"] = true,
["ind_pluperf_comp"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
["subj_fut_comp"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local antepuesto = {
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["subj_perf"] = true,
["subj_imp_comp"] = true,
["subj_fut_comp"] = true,
}
local interpuesto = {
["ind_fut"] = true,
["ind_fut_comp"] = true,
["cond"] = true,
["cond_comp"] = true
}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^inf_pers") then
return IMPERSONALES_INF[p]
end
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^inf_pers") then
return PRONOMBRES_INF[p]
elseif find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local sufijos = {
{ -- ar
["ger"] = {"ando"},
["part"] = {"ado"},
["inf_pers"] = {"ar", "ares", "ar", "armos", "ardes", "aren"},
["ind_pres"] = {"o", "as", "a", "amos", "ades", "an"},
["ind_imp"] = {"aba", "abas", "aba", "abamos", "abades", "aban"},
["ind_perf"] = {"ei", "aches", "ou", "amos", "astes", "aron"},
["ind_perf_alt"] = {"ei", "aches", "ou", "amos", "astes", "aron"},
["ind_pluperf"] = {"ara", "aras", "ara", "aramos", "arades", "aran"},
["ind_fut"] = {"arei", "arás", "ará", "aremos", "aredes", "arán"},
["subj_pres"] = {"e", "es", "e", "emos", "edes", "en"},
["subj_imp"] = {"ase", "ases", "ase", "ásemos", "ásedes", "asen"},
["subj_fut"] = {"ar", "ares", "ar", "armos", "ardes", "aren"},
["cond"] = {"aría", "arías", "aría", "ariamos", "ariades", "arían"},
["imper"] = {"-", "a", "e", "emos", "ade", "en"}
},
{ -- er
["ger"] = {"endo"},
["part"] = {"ido"},
["inf_pers"] = {"er", "eres", "er", "ermos", "erdes", "eren"},
["ind_pres"] = {"o", "es", "e", "emos", "edes", "en"},
["ind_imp"] = {"ía", "ías", "ía", "iamos", "iades", "ían"},
["ind_perf"] = {"ín", "iches", "eu", "emos", "estes", "eron"},
["ind_perf_alt"] = {"en", "eches", "o", "emos", "estes", "eron"},
["ind_pluperf"] = {"era", "eras", "era", "eramos", "erades", "eran"},
["ind_fut"] = {"erei", "erás", "erá", "eremos", "eredes", "erán"},
["subj_pres"] = {"a", "as", "a", "amos", "ades", "an"},
["subj_imp"] = {"ese", "eses", "ese", "ésemos", "ésedes", "esen"},
["subj_fut"] = {"er", "eres", "er", "ermos", "erdes", "eren"},
["cond"] = {"ería", "erías", "ería", "eriamos", "eriades", "erían"},
["imper"] = {"-", "e", "a", "amos", "ede", "an"}
},
{ -- ir
["ger"] = {"indo"},
["part"] = {"ido"},
["inf_pers"] = {"ir", "ires", "ir", "irmos", "irdes", "iren"},
["ind_pres"] = {"o", "es", "e", "imos", "ides", "en"},
["ind_imp"] = {"ía", "ías", "ía", "iamos", "iades", "ían"},
["ind_perf"] = {"ín", "iches", "iu", "imos", "istes", "iron"},
["ind_perf_alt"] = {"en", "eches", "o", "emos", "estes", "eron"},
["ind_pluperf"] = {"ira", "iras", "ira", "iramos", "irades", "iran"},
["ind_fut"] = {"irei", "irás", "irá", "iremos", "iredes", "irán"},
["subj_pres"] = {"a", "as", "a", "amos", "ades", "an"},
["subj_imp"] = {"ise", "ises", "ise", "ísemos", "ísedes", "isen"},
["subj_fut"] = {"ir", "ires", "ir", "irmos", "irdes", "iren"},
["cond"] = {"iría", "irías", "iría", "iriamos", "iriades", "irían"},
["imper"] = {"-", "e", "a", "amos", "ide", "an"}
},
{ -- or
["ger"] = {"ondo"},
["part"] = {"osto"},
["inf_pers"] = {"or", "ores", "or", "ormos", "ordes", "oren"},
["ind_pres"] = {"oño", "ós", "ón", "omos", "ondes", "ón"},
["ind_imp"] = {"uña", "uñas", "uña", "uñamos", "uñades", "uñan"},
["ind_perf"] = {"uxen", "uxeches", "uxo", "uxemos", "uxestes", "uxeron"},
["ind_perf_alt"] = {"en", "eches", "o", "emos", "estes", "eron"},
["ind_pluperf"] = {"uxera", "uxeras", "uxera", "uxeramos", "uxerades", "uxeran"},
["ind_fut"] = {"orei", "orás", "orá", "oremos", "oredes", "orán"},
["subj_pres"] = {"oña", "oñas", "oña", "oñamos", "oñades", "oñan"},
["subj_imp"] = {"uxese", "uxeses", "uxese", "uxésemos", "uxésedes", "uxesen"},
["subj_fut"] = {"uxer", "uxeres", "uxer", "uxermos", "uxerdes", "uxeren"},
["cond"] = {"oría", "orías", "oría", "oriamos", "oriades", "orían"},
["imper"] = {"-", "ón", "oña", "oñamos", "onde", "oñan"}
},
}
local auxiliar = {
["inf_comp"] = {"ter"},
["ger_comp"] = {"tendo"},
["inf_pers_comp"] = {"ter", "teres", "ter", "termos", "terdes", "teren"},
["ind_perf_comp"] = {"teño", "tes", "ten", "temos", "tendes", "teñen"},
["ind_pluperf_comp"] = {"tiña", "tiñas", "tiña", "tiñamos", "tiñades", "tiñan"},
["ind_anter"] = {"tiven", "tiveches", "tivo", "tivemos", "tivestes", "tiveron"},
["ind_fut_comp"] = {"terei", "terás", "terá", "teremos", "teredes", "terán"},
["cond_comp"] = {"tería", "terías", "tería", "teriamos", "teriades", "terían"},
["subj_perf"] = {"teña", "teñas", "teña", "teñamos", "teñades", "teñan"},
["subj_pluperf"] = {"tivese", "tiveses", "tivese", "tivésemos", "tivésedes", "tivesen"},
["subj_fut_comp"] = {"tiver", "tiveres", "tiver", "tivermos", "tiverdes", "tiveren"}
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "ar" then
return sufijos[1][forma]
elseif sufijo_inf == "er" then
return sufijos[2][forma]
elseif sufijo_inf == "ir" or sufijo_inf == "ír" then
return sufijos[3][forma]
else
return sufijos[4][forma]
end
end
local paradigmas_regulares = {
["ar"] = {
{"anunciar", {"iar$"}, { --necesidad de explicitar el diptongo, aunque esta variante es la que consideramos como la regular
}},
{"evacuar", {"cuar$"}, {
nexo = "cu"
}},
{"averiguar", {"guar$"}, {
nexo = "gu"
}},
{"complicar", {"car$"}, {
nexo = "c"
}},
{"chegar", {"gar$"}, {
nexo = "g"
}},
{"actuar", {"uar$"}, {
nexo = "u"
}},
{"comezar", {"zar$"}, {
nexo = "z"
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"ller", {"ller$"}, { -- Existe esto??
nexo = "ll"
}},
{"güer", {"güer$"}, { -- Existe esto??
nexo = "gü"
}},
{"quer", {"quer$"}, { -- Existe esto??
nexo = "qu"
}},
{"erguer", {"guer$"}, {
nexo = "gu"
}},
{"parecer", {"cer$"}, {
nexo = "c"
}},
{"proteger", {"ger$"}, {
nexo = "g"
}},
{"temer", {"er$"}, {
}},
},
["ir"] = {
{"argüir", {"güir$"}, {
nexo = "gü",
}},
{"delinquir", {"quir$"}, {
nexo = "qu"
}},
{"distinguir", {"guir$"}, {
nexo = "gu"
}},
{"resarcir", {"cir$"}, {
nexo = "c"
}},
{"dirigir", {"gir$"}, {
nexo = "g"
}},
{"partir", {"ir$"}, {
}},
},
["ír"] = {
{"argüír", {"güír$"}, {
nexo = "gü",
}},
{"fluír", {"uír$"}, {
nexo = "u"
}},
{"partir", {"ír$"}, {
}},
},
["or"] = {
{"pór", {"or$"}, {
}},
},
["ór"] = {
{"pór", {"ór$"}, {
}}
}
}
local paradigmas_irregulares = {
["ar"] = {
{"dar", {"^dar$", "^redar$", "desdar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"dou"}, {"dás"}, {"dá"}, nil, nil, {"dán"}},
ind_perf = {sufijo_inf = "er", {"dei"}, {"deches"}},
ind_pluperf = {sufijo_inf = "er"},
subj_pres = {sufijo_inf = "er", nucleo = "de"},
subj_imp = {sufijo_inf = "er"},
subj_fut = {sufijo_inf = "er"},
imper = {nil, {"dá"}, {"dea"}, {"deamos"}, nil, {"dean"}}
}},
{"estar", {"^estar$", "^tar$"}, {
nucleo = "t",
ind_pres = {{"tou"}, {"tás"}, {"tá"}, nil, nil, {"tán"}},
ind_perf = {nucleo = "tiv", sufijo_inf = "er"},
ind_pluperf = {nucleo = "tiv", sufijo_inf = "er"},
subj_pres = {nucleo = "te", sufijo_inf = "er"},
subj_imp = {nucleo = "tiv", sufijo_inf = "er"},
subj_fut = {nucleo = "tiv", sufijo_inf = "er"},
imper = {nil, {"tá"}, {"tea"}, {"teamos"}, nil, {"tean"}}
}},
{"enviar", {"enviar$"}, {
nexo = "i"
}},
{"descafeinar", {"descafeinar$"}, {
alt = {"í-í"},
}},
{"saudar", {"saudar$"}, {
alt = {"ú-ú"},
}},
},
["er"] = {
{"caber", {"^caber$"}, {
nucleo = "cab",
nucleos1 = {"caib"},
ind_perf = {nucleo = "coub"},
ind_pluperf = {nucleo = "coub"},
subj_imp = {nucleo = "coub"},
subj_fut = {nucleo = "coub"},
}},
{"facer", {"facer$"}, {
nucleo = "fac",
nexo = "",
nucleos1 = {"fag"},
part = {"feito"},
ind_pres = {nil, {"fás"}, {"fai"}, nil, nil, {"fán"}},
ind_perf = {nucleo = "fix"},
ind_pluperf = {nucleo = "fix"},
subj_imp = {nucleo = "fix"},
subj_fut = {nucleo = "fix"},
ind_fut = {nucleo = "fa", nexo = "#r#"},
cond = {nucleo = "fa", nexo = "#r#"},
imper = {nil, {"fai"}},
}},
{"haber", {"^haber$", "^rehaber$"}, {
nucleo = "ab",
ind_pres = {{"ei"}, {"ás"}, {"á", "ai"}, nil, nil, {"án"}},
ind_perf = {nucleo = "oub"},
ind_pluperf = {nucleo = "oub"},
subj_pres = {nucleo = "ax"},
subj_imp = {nucleo = "oub"},
subj_fut = {nucleo = "oub"},
imper = {nil, {"á{†}"}, {"axa{†}"}, {"axamos{†}"}, {"abei{†}"}, {"axan{†}"}},
}},
{"pracer", {"pracer$"}, {
nucleo = "pra",
ind_perf = {nucleo = "proug"},
ind_pluperf = {nucleo = "proug"},
subj_imp = {nucleo = "proug"},
subj_fut = {nucleo = "proug"},
}},
{"poder", {"poder$"}, {
nucleo = "pod",
ind_perf = {nucleo = "puid"},
ind_pluperf = {nucleo = "puid"},
subj_pres = {nucleo = "poid"},
subj_imp = {nucleo = "puid"},
subj_fut = {nucleo = "puid"},
}},
{"poñer", {"poñer$"}, {
nucleo = "poñ",
part = {"posto"},
ind_pres = {nil, {"pós"}, {"pón"}},
ind_perf = {nucleo = "pux"},
ind_pluperf = {nucleo = "pux"},
subj_imp = {nucleo = "pux"},
subj_fut = {nucleo = "pux"},
imper = {nil, {"pón"}}
}},
{"querer", {"querer$"}, {
nucleo = "quer", -- no uso nucleos1 para que no sobreescriba ind_pres
ind_perf = {nucleo = "quix"},
ind_pluperf = {nucleo = "quix"},
subj_pres = {nucleo = "queir"},
subj_imp = {nucleo = "quix"},
subj_fut = {nucleo = "quix"},
}},
{"romper", {"^romper$", "^arromper$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
part = {"roto", "rompido"}
}},
{"saber", {"saber$"}, {
nucleo = "sab",
ind_pres = {{"sei"}},
ind_perf = {nucleo = "soub"},
ind_pluperf = {nucleo = "soub"},
subj_pres = {nucleo = "saib"},
subj_imp = {nucleo = "soub"},
subj_fut = {nucleo = "soub"},
}},
{"ser", {"^ser$"}, {
nucleos1 = {"sex"},
ind_pres = {{"son"}, {"es"}, {"é"}, {"somos"}, {"sodes"}, {"son"}},
ind_imp = {{"era"}, {"eras"}, {"era"}, {"eramos"}, {"erades"}, {"eran"}},
ind_perf = {{"fun"}, {"fuches"}, {"foi"}, {"fomos"}, {"fostes"}, {"foron"}},
ind_pluperf = {{"fora"}, {"foras"}, {"fora"}, {"foramos"}, {"forades"}, {"foran"}},
subj_imp = {{"fose"}, {"foses"}, {"fose"}, {"fósemos"}, {"fósedes"}, {"fosen"}}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {{"for"}, {"fores"}, {"for"}, {"formos"}, {"fordes"}, {"foren"}},
imper = {nil, {"sé"}, nil, nil, {"sede"}}
}},
{"ter", {"^ter$", "suster$", "manter$", "^ater$", "abster$", "obter$", "^reter$", "deter$", "conter$"}, {
nucleo = "t",
nucleos1 = {"teñ"},
ind_pres = {nil, {"tés"}, {"tén"}, nil, {"tendes", "tedes"}, {"teñen"}},
ind_imp = {{"tiña"}, {"tiñas"}, {"tiña"}, {"tiñamos"}, {"tiñades"}, {"tiñan"}},
ind_perf = {nucleo = "tiv"},
ind_pluperf = {nucleo = "tiv"},
subj_imp = {nucleo = "tiv"},
subj_fut = {nucleo = "tiv"},
imper = {nil, {"tén"}, nil, nil, {"tende", "tede"}}
}},
{"traer", {"traer$"}, { -- REVISAR fut y cond
nucleos1 = {"trai"},
ind_perf = {nucleo = "troux"},
ind_pluperf = {nucleo = "troux"},
subj_imp = {nucleo = "troux"},
subj_fut = {nucleo = "troux"},
}},
{"ver", {"^ver$", "antever$", "entrever$", "prever$", "^rever$", "prover$"}, {
nucleo = "v",
nucleos1 = {"vex"},
part = {"visto"},
ind_pres = {nil, {"vés"}, {"vé"}, nil, nil, {"vén"}},
ind_perf = {sufijo_inf = "ir"},
ind_pluperf = {sufijo_inf = "ir"},
subj_imp = {sufijo_inf = "ir"},
subj_fut = {sufijo_inf = "ir"},
imper = {nil, {"vé"}},
}},
{"ler", {"^ler$", "^reler$", "crer$"}, {
nucleo = "",
nucleos1 = {"e"},
ind_pres = {nil, {"és"}, {"é"}, nil, nil, {"én"}},
imper = {nil, {"é"}},
}},
{"morrer", {"morrer$"}, {
nucleo = "morr",
part = {"morto"},
}},
{"valer", {"valer$"}, {
alt = {"ll"},
}},
{"moer", {"oer$"}, {
alt = {"oi"},
}},
},
["ir"] = {
{"abrir", {"[^js]abrir$", "^abrir$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"aberto"}
}},
{"cubrir", {"ubrir$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "ubr",
part = {"uberto"},
alt = {"o"},
}},
{"dicir", {"dicir$"}, {
nucleo = "di",
nucleos1 = {"dig"},
part = {"dito"},
ind_pres = {nil, nil, {"di"}, nil, nil, {"din"}},
ind_perf = {nucleo = "dix"},
ind_pluperf = {nucleo = "dix"},
subj_imp = {nucleo = "dix"},
subj_fut = {nucleo = "dix"},
ind_fut = {nucleo = "di", nexo="#r#"},
cond = {nucleo = "di", nexo="#r#"},
imper = {nil, {"di"}}
}},
{"escribir", {"scribir$"}, {
nucleo = "scrib",
part = {"scrito"}
}},
{"rir", {"^rir$", "sorrir$"}, {
nucleo = "r",
ind_pres = {nil, {"rís"}, {"rí"}, nil, nil, {"rín"}},
nucleos1 = {"rí"},
nucleos2 = {"ri"},
nucleos3 = {"ri"},
imper = {nil, {"rí"}},
}},
{"imprimir", {"imprimir$"}, {
nucleo = "imprim",
part = {"imprimido", "impreso"}
}},
{"ir", {"^ir$"}, {
ind_pres = {{"vou"}, {"vas"}, {"vai"}, nil, nil, {"ván"}},
ind_perf = {{"fun"}, {"fuches"}, {"foi"}, {"fomos"}, {"fostes"}, {"foron"}},
ind_pluperf = {nexo = "#fo#"},
subj_pres = {nucleo = "vai"},
subj_imp = {nexo = "#fo#", nil, nil, nil, {"fósemos"}, {"fósedes"}}, -- no puedo poner "u" porque obtendría "fuyera"
subj_fut = {nexo = "#fo#"},
imper = {nil, {"vai"}, {"vaia"}, {"vamos"}, nil, {"vaian"}}
}},
{"vir", {"^vir$", "^avir$", "advir$", "convir$", "contravir$", "devir$", "^desavir$", "entrevir$", "intervir$", "obvir$", "provir$", "^revir$", "sobrevir$"}, {
nucleo = "v",
nucleos1 = {"veñ"},
ind_pres = {nil, {"vés"}, {"vén"}, nil, {"vindes", "vides"}, {"veñen"}},
ind_imp = {{"viña"}, {"viñas"}, {"viña"}, {"viñamos"}, {"viñades"}, {"viñan"}},
ind_perf = {{"vin"}, {"viñeches"}, {"veu"}, {"viñemos"}, {"viñestes"}, {"viñeron"}},
ind_pluperf = {{"viñera"}, {"viñeras"}, {"viñera"}, {"viñeramos"}, {"viñerades"}, {"viñeran"}},
subj_imp = {{"viñese"}, {"viñeses"}, {"viñese"}, {"viñésemos"}, {"viñésedes"}, {"viñesen"}},
subj_fut = {{"viñer"}, {"viñeres"}, {"viñer"}, {"viñermos"}, {"viñerdes"}, {"viñeren"}},
imper = {nil, {"ven"}, nil, nil, {"vinde", "vide"}, nil}
}},
{"frixir", {"frixir$"}, {
part = {"frigido", "frito"},
-- alt = {"-e"},
}},
{"cair", {"air$"}, {
nucleo = "a",
alt = {"ai"},
imper = {nil, {"ae"}},
}},
{"parir", {"parir$"}, {
alt = {"ai"},
}},
{"sentir", {"sentir$"}, {
alt = {"i"},
}},
{"agredir", {"gredir$"}, {
alt = {"i-i-i"}
}},
{"proibir", {"proibir$"}, {
alt = {"í-í"}
}},
{"reunir", {"reunir$"}, {
alt = {"ú-ú"}
}},
{"fuxir", {"fuxir$"}, { --fuxir, bulir, durmir
alt = {"-o"},
}},
{"ouvir", {"ouvir$"}, {
alt = {"z"},
}},
},
["ír"] = {
{"saír", {"aír$"}, {
alt = {"ai"},
}},
{"oír", {"oír$"}, {
alt = {"oi"},
}},
},
["or"] = {
},
["ór"] = {
}
}
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf, forma)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if find(sufijo, "^[aeo][ns]?$") then
if nexo == "e" then
return "~ei~"..sufijo
end
end
if find(sufijo, "^[eiéí]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "z" then
return "~c~"..sufijo
end
end
local _, cnt = gsub(sufijo, "[aeiouü]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
if nexo == "cu" then
return sub(nexo, -2, -2).."~ú~"..sufijo, nexo..sufijo -- es llana y entonces lleva tilde
end
if nexo == "u" then
return "~ú~"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "i" then
return "#í#"..sufijo -- es llana y entonces lleva tilde
end
end
else -- -er/-ir/-or
if find(sufijo, "^er") then -- [[dicir]]
if nexo == "#r#" then
return nexo..sub(sufijo, 3)
end
end
local _, cnt = gsub(sufijo, "[aeiouü]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
if nexo == "gü" then
return "g~ú~"..sufijo
end
if nexo == "u" then
return "~ú~"..sufijo
end
end
if find(sufijo, "^[aouáóú]") then
if nexo == "c" then
return "~z~"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
if nexo == "gu" then
return "~g~"..sufijo
end
if nexo == "gü" then
return "g~u~"..sufijo
end
if nexo == "qu" then
return "~c~"..sufijo
end
if nexo == "qü" then
return "q~u~"..sufijo
end
end
if find(sufijo, "^es?$") then
if nexo == "u" then
return nexo.."~i~"..sub(sufijo, 2)
end
if nexo == "gü" then -- arguir
return nexo.."~i~"..sub(sufijo, 2)
end
end
if find(sufijo, "^is?$") then
if nexo == "gü" then -- arguir
return nexo.."~í~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i") then
if nexo == "#fo#" then
return nexo..sub(sufijo, 2)
end
end
if (forma ~= "ind_fut" and forma ~= "cond") then
if find(sufijo, "^ia[md][oe]s$") then
if nexo == "u" then
return nexo.."~ï~"..sub(sufijo, 2)
end
if nexo == "gü" then -- arguir
return nexo.."~ï~"..sub(sufijo, 2)
end
end
if find(sufijo, "^ir[aeo]"..C.."*$") or find(sufijo, "^i[^r]") or find(sufijo, "^ir[^aeiouü]") or find(sufijo, "^ir?$") then
if nexo == "u" then
return nexo.."~í~"..sub(sufijo, 2)
end
if nexo == "gü" then -- arguir
return nexo.."~í~"..sub(sufijo, 2)
end
end
end
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "i$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif forma == "ind_imp" and find (nucleo_, "^[^áéíóú]-[aeiouü]h?$") and (find(nexosufijo_, "[ií]a[md][eo]s$")) then -- sair
return nucleo..gsub1(nexosufijo, "^([~#]?)[ií]", "%1~ï~")
elseif forma == "ind_perf" and find (nucleo_, "^[^áéíóú]-[aeiouü]h?$") and (find(nexosufijo_, "^iu$")) then -- sair
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~í~")
elseif forma ~= "ind_fut" and forma ~= "cond" and find(nucleo_, "^[^áéíóú]-[aeiouü]h?$") and (find(nexosufijo_, "^h?[iu]"..C.."*[aeo]i?[mns]?$") or find(nexosufijo_, "^h?[iu][rs]?$")) then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iu])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
local prefijo_ = gsub(prefijo, "[~#]", "")
local nucleonexosufijo_ = gsub(nucleonexosufijo, "[~#]", "")
if find(prefijo_, "^[^aeiouáéíóú]*$")
and nucleonexosufijo_ ~= "é" and nucleonexosufijo_ ~= "sé" -- excepción: ser
and (find(nucleonexosufijo_, "^"..C.."?"..C.."?".."[iuü]?[áéó][iuü]?[ns]?$") or find(nucleonexosufijo_, "^"..C.."?"..C.."?".."[íú][ns]?$")) then -- caso de dar, vos *d+ás, debo quitar la tilde
return prefijo..gsub1(nucleonexosufijo, "[áéíóú]", function(v) return quitar_tilde[v] end)
end
return prefijo..nucleonexosufijo
end
local alt_info = {
["ar"] = {
["í-í"] = {"descafeinar", "[i]", "í", "í"},
["ú-ú"] = {"saudar", "[u]", "ú", "ú"},
},
["er"] = {
["oi"] = {"moer", "[o]", "oi"},
["ll"] = {"valer", "l", "ll"},
},
["ir"] = {
--["-e"] = {"frigir", "[i]", nil, "e"},
["-o"] = {"fuxir", "[u]", nil, "o"},
["ai"] = {"parir", "[a]", "ai"},
["i"] = {"sentir", "[e]", "i"},
--["u"] = {"dormir", "[o]", "u"},
["z"] = {"ouvir", ".", "z"},
["í-í"] = {"proibir", "[i]", "í", "í"},
["ú-ú"] = {"reunir", "[u]", "ú", "ú"},
--["u-u-u"] = {"polir", "[o]", "u", "u", "u"},
--["i-i"] = {"agredir", "[e]", "i", "i"},
["i-i-i"] = {"agredir", "[e]", "i", "i", "i"},
},
["ír"] = {
["ai"] = {"saír", "[a]", "ai"},
["oi"] = {"oír", "[o]", "oi"},
},
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
local sufijos_ = obtener_sufijos(sufijo_inf, (forma == "ind_perf" and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleo_inf
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos3, conjinfo.nucleos3, conjinfo.nucleos1}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos4, conjinfo.nucleos1, conjinfo.nucleos3, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[1], sufijo_inf, forma)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma)))
end
end
return
end
for i = EU, ELES do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, (conjinfo.v == "pór" and sufijos_[k] == "or") and "ór" or sufijos_[k], sufijo_inf, forma)
for _, n in ipairs(nucleos[i]) do
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo, forma)))
if nexosufijo2 then
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo2, forma)))
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local art2 = fmtinfo.art2
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
local j
if not i then
tiempo = forma
i = 1
j = 3
else
j = tonumber(i)
end
i = tonumber(i)
local rest_ = i < NOS and resto or resto_pl
local rest_pl_ = resto_pl
for _, v in ipairs(arr) do
local rest = rest_
local rest_pl = rest_pl_
if auxiliar[tiempo] then
rest = " "..v..rest
v = auxiliar[tiempo][i]
end
if antepuesto[tiempo] then
local pronart = pron == "se" and REFLEXIVOS[j].." " or ""
pronart = (art and art ~= "") and pronart..art2.." " or pronart
insert(t, adv..pronart..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
elseif interpuesto[tiempo] then
local pronart = pron == "se" and "-"..REFLEXIVOS[j].."-" or ""
pronart = (art and art ~= "") and pronart..art.."-" or pronart
if pronart and pronart ~= "" then
v = gsub(v, "^(.*r)(.-)$", function(u, v) return u..pronart..v end)
end
insert(t, adv..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
else -- pospuesto
local pronart = pron == "se" and "-"..REFLEXIVOS[j] or ""
if pronart ~= "" or (art and art ~= "") then
local subs
if (art2 and art2 ~= "") and pron ~= "se" then -- artículo, sin pronombre
v, subs = gsubb(v, "^(.*)[srz]$", "%1")
else
v, subs = gsubb(v, "mos$", "mo")
end
if subs then
pronart = pronart..((art2 and art2 ~= "") and "-"..art2 or "")
else
pronart = pronart..((art and art ~= "") and "-"..art or "")
end
v = v..pronart
end
if forma == "inf" or forma == "inf_pers" then
insert(t, adv..v..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..v..f_links(rest_pl))
end
else
insert(t, adv..f_links(v)..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..pronart..f_links(v)..f_links(rest_pl))
end
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["alt"] = {lista = true},
["nucleopres1"] = {lista = true},
["nucleopres3"] = {lista = true},
["nucleosubj4"] = {lista = true},
["nucleoimper"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["núcleopres3"] = {alias_de = "nucleopres3"},
["núcleosubj4"] = {alias_de = "nucleosubj4"},
["núcleoimper"] = {alias_de = "nucleoimper"},
["paradigma"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][io]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiíoó]r)%-?(s?e?)%-?(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[io]?n?"..ESPACIO.."?"..LETRA.."*[aeiíoó]r%-?s?e?%-?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
local art2 = ""
if art ~= "" then
assert(find(art, "^l"), "el artículo debe comenzar por l")
art2 = gsub(art, "^l", "")
end
local sufijo_inf = match(v, "[aeiíoó]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopres3"]),
maxindex(args["nucleosubj4"]),
maxindex(args["nucleoimper"])) do
local conjinfo = {}
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
for k, v in pairs(p[3]) do
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
end
end
paradigmas_reconocidos[p[1]] = true
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = conjinfo.nucleos1 or {}
conjinfo.nucleos2 = conjinfo.nucleos2 or {}
conjinfo.nucleos3 = conjinfo.nucleos3 or {}
conjinfo.nucleos4 = conjinfo.nucleos4 or {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert_if_not(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2, n3
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
if info[3] then
n1, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[3].."#%3")
end
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[4].."#%3")
end
if info[5] then
n3, sust = gsubb(conjinfo.nucleo_inf, "^(.*)("..info[2]..")(.-)$", "%1#"..info[5].."#%3")
end
assert(sust, "Alternancia vocálica no reconocida")
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
insert_if_not(conjinfo.nucleos3, n3)
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if args["nucleopres1"][N] then
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
end
if args["nucleopres3"][N] then
insert_if_not(conjinfo.nucleos2, args["nucleopres3"][N])
end
if args["nucleosubj4"][N] then
insert_if_not(conjinfo.nucleos3, args["nucleosubj4"][N])
end
if args["nucleoimper"][N] then
insert_if_not(conjinfo.nucleos4, args["nucleoimper"][N])
end
if not conjinfo.nucleos4[1] then -- tengo que escribir primero este núcleo
if (conjinfo.nucleos1[1] and conjinfo.nucleos2[1]) or conjinfo.alt[1] == "i" then
conjinfo.nucleos4[1] = gsub(conjinfo.nucleos1[1], "^[^#~]+$", "#%0#")
else
conjinfo.nucleos4[1] = conjinfo.nucleo_inf
end
end
if not conjinfo.nucleos3[1] then -- tengo que escribir primero este núcleo
if conjinfo.nucleos1[1] and not conjinfo.nucleos2[1] then
conjinfo.nucleos3[1] = gsub(conjinfo.nucleos1[1], "^[^#~]+$", "#%0#")
else
conjinfo.nucleos3[1] = conjinfo.nucleo_inf
end
else
conjinfo.nucleos3[1] = gsub(conjinfo.nucleos3[1], "^[^#~]+$", "#%0#")
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
else
conjinfo.nucleos1[1] = gsub(conjinfo.nucleos1[1], "^[^#~]+$", "#%0#")
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
else
conjinfo.nucleos2[1] = gsub(conjinfo.nucleos2[1], "^[^#~]+$", "#%0#")
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, art2=art2, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for _,s in ipairs(tostr) do
fmtinfo["subj_pres"..s] = deepcopy(resultante["subj_pres"..s])
end
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local impers = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_inf, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_inf = {"", "(por iso)", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "(iso)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(iso)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que iso)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(iso)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_inf = {"", "(por iso)", "(por isos)", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "(iso)", "(isos)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(iso)", "(isos)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que iso)", "(que isos)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(iso)", "(isos)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_inf = {"", "por . eu", "por . tu", "por . ele, por . ela, por . vostede", "por . nós", "por . vós", "por . vostedes, por . eles, por . elas", color=COLOR_INF, header=true, class="pc"}
fila_pronombres_ind = {"", "eu", "tu", "ele, ela, vostede", "nós", "vós", "vostedes, eles, elas", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "eu", "tu", "ele, ela, vostede", "nós", "vós", "vostedes, eles, elas", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que eu", "que tu", "que ele, que ela, que vostede", "que nós", "que vós", "que vostedes, que eles, que elas", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "(vostede)", "(nós)", "(vós)", "(vostedes)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
insert(t, {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true})
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part})
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
insert(t, {{"Formas personales", colspan=cs}, color=COLOR_H, header=true})
insert(t, {{"Modo infinitivo", colspan=cs}, color=COLOR_INF, header=true})
insert(t, fila_pronombres_inf)
if mostrar_imper then
insert(t, {{"Infinitivo simple", color=COLOR_INF, header=true}, ic("inf_pers")})
insert(t, {{"Infinitivo compuesto", color=COLOR_INF, header=true}, ic("inf_pers_comp")})
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de infinitivo personal", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true})
insert(t, fila_pronombres_ind)
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")})
insert(t, {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")})
insert(t, {{"Pretérito pluscuamperfecto compuesto", color=COLOR_IND, header=true}, ic("ind_pluperf_comp")})
insert(t, {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")})
insert(t, {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("ind_fut_comp")})
insert(t, {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")})
insert(t, {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true})
insert(t, fila_pronombres_cond)
insert(t, {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")})
insert(t, {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")})
insert(t, {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true})
insert(t, fila_pronombres_subj)
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")})
insert(t, {{f("Futuro{†}"), color=COLOR_SUBJ, header=true}, ic("subj_fut")})
insert(t, {{f("Futuro compuesto{†}"), color=COLOR_SUBJ, header=true}, ic("subj_fut_comp")})
insert(t, {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true})
insert(t, fila_pronombres_imper)
if mostrar_imper then
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")})
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}})
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
insert(t, {{args["nota"] and args["nota"] or "", colspan=cs}})
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "GL:Verbos irregulares")
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["pór"] = nil
else
insert(cats, "GL:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "GL:Verbos del paradigma "..p)
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "GL:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "GL:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "GL:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "GL:Verbos defectivos")
end
if sufijo_inf == "ar" then
insert(cats, "GL:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "GL:Verbos de la segunda conjugación")
elseif sufijo_inf == "ir" or sufijo_inf == "ír" then
insert(cats, "GL:Verbos de la tercera conjugación")
else
insert(cats, "GL:Verbos de la cuarta conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
srywbi67gi0i94cle9td34m4nu3qd0a
Módulo:flex/ext
828
1056427
6307329
6120161
2026-08-06T00:34:10Z
TMCbot
164594
.
6307329
Scribunto
text/plain
-- Flexión del extremeño
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local maxindex = m_table.maxIndex
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal_no_tilde = "aeiouüAEIOUÜ"
local vocal_tilde = "áéíóúÁÉÍÓÚ"
local vocal = vocal_no_tilde..vocal_tilde
local cons = "bcdfghjklmnñpqrstvwxyzçBCFGHJKLMNÑPQRSTVWXYZÇ"
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local CONS_SALVO_H = "[^"..vocal.."hH~#{}]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local function try(p, rx, pl, f, fpl, pl2, femenino)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if not pl then
return {m={p2}, p={}, f={}, fp={}}
end
if not femenino or not f then
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={}, fp={}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={}, fp={}}
end
end
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
end
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
end
-- https://elcanton.org/2016/02/17/sengulal-i-plural/
local function flexionar_palabra(p, g, forzar_s, on)
local adj = g == "mf"
local function rep_a(v) return "~"..quitar_tilde[v].."a~" end
local function rep_as(v) return "~"..quitar_tilde[v].."as~" end
local function rep_is(v) return "~"..quitar_tilde[v].."is~" end
local function rep_a_2(v, c) return "~"..quitar_tilde[v]..c.."a~" end
local function rep_as_2(v, c) return "~"..quitar_tilde[v]..c.."as~" end
local function rep_is_2(v, c) return "~"..quitar_tilde[v]..c.."is~" end
local function rep_n(v, c) return "~"..agregar_tilde[v]..c.."~" end
local es_monosilabo = find(p, "^"..CONS.."-[iuü]?[aeoiu][iu]?"..CONS.."-$")
local sin_tilde = not find(p, "["..vocal_tilde.."]")
local fl = try(p, "o$", "~os~", "~a~", "~as~", nil, adj)
or try(p, "u$", "~us~", "~a~", "~as~", nil, adj)
or try(p, "([td]i?)á$", "~%1ais~", nil, nil, nil, adj) -- -dad, -tad, -idad [[libertá]]
or try(p, "tú$", "~tuis~", nil, nil, nil, adj) -- tud, [[virtú]]
or try(p, VOCAL.."$", "~%0s~", nil, nil, nil, adj)
or try(p, "o[lr]$", "~oris~", "~ora~", "~oras~", nil, adj)
or try(p, "[aeiou]h?[íú][ns]$", "~%0is~", "~%0a~", "~%0as~", nil, adj)
or try(p, es_monosilabo and "([aeiou])([ns])$" or "([áéíóú])([ns])$", rep_is_2, rep_a_2, rep_as_2, nil, adj) -- agudas/monosílabos en n, s
or try(p, (es_monosilabo or sin_tilde) and "x$" or "^%A$", forzar_s and "~xs~" or "~xis~", nil, nil, nil, adj) -- agudas/monosílabos en x
or try(p, "x$", nil, nil, nil, nil, adj) -- llanas/esdrújulas en x
or try(p, sin_tilde and "([aeiou])([ui]?"..CONS.."+[iu]?[aeiou][iu]?n)$" or "^%A$", "~%0~", nil, nil, rep_n, adj) -- llanas en n
or try(p, "[ns]$", nil, nil, nil, nil, adj) -- llanas/esdrújulas en s, esdrújulas en n
or try(p, "["..vocal_tilde.."][lrdjzñ]$", "~%0is~", nil, nil, nil, adj) -- agudas en lrdjz, rompen en hiato con la vocal anterior
or try(p, sin_tilde and VOCAL.."[lrdjzñ]$" or "^%A$", "~%0is~", nil, nil, nil, adj)
or try(p, VOCAL.."[lrdjzñ]$", nil)
or try(p, "("..CONS..")y$", "~%1is~", nil, nil, nil, adj) -- ferry, REVISAR
or try(p, CONS.."[sz]$", nil)
or try(p, "[sz]"..CONS.."$", nil)
or try(p, "ch$", forzar_s and "~%0s~" or "~%0es~")
or try(p, CONS..CONS.."$", "~%0s~")
or try(p, CONS.."$", "~%0s~")
if fl then
return fl
end
error("No se pudo determinar la flexión de la palabra")
end
local function flexion_sust_adj(palabras, g, forzar_s, on, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s, on)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s, on) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = flexionar_palabra(p, g, forzar_s, on)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], args["on"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "EXT:Locuciones sustantivas" or "EXT:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "EXT:Locuciones adjetivas" or "EXT:Adjetivos")
end
-- FALTA TERMINAR LOS VERBOS
local YO, TU, EL, NOSOTROS, VOSOTROS, ELLOS = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"yo", "tu", "él, vusté", "nusotrus", "vusotrus", "ellus"}
local PRONOMBRES_SUBJ = {"que yo", "que tu", "que él, vusté", "que nusotrus", "que vusotrus", "que ellus"}
local PRONOMBRES_IMP = {"―", "(tú)", "(vusté)", "(nusotrus)", "(vusotrus)", "―"}
local IMPERSONALES = {"", "", "(ello)", "", "", "(ellus)"}
local IMPERSONALES_SUBJ = {"", "", "(que ello)", "", "", "(que ellus)"}
local REFLEXIVOS = {"me", "te", "se", "nos", "os", "se"}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["subj_fut"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_pluperf"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
["subj_fut_comp"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local sufijos = {
["al"] = {
["ger"] = {"andu"},
["part"] = {"au"},
["ind_pres"] = {"u", "as", "a", "amus", "ais", "an"},
["ind_imp"] = {"ava", "avas", "ava", "avamus", "avais", "avan",
nil, nil, nil, "ávamus", "ávais", nil,
nil, nil, nil, nil, "avis"},
["ind_perf"] = {"é", "asti", "ó", "émus", "aistis", "arun",
"ei", "esti", nil, nil, "estis", "orin"},
["ind_perf_alt"] = {"é", "asti", "ó", "emos", "astis", "arun"},
["ind_fut"] = {"aré", "arás", "ará", "aremus", "areis", "arán",
"arei"},
["subj_pres"] = {"i", "is", "i", "emus", "eis", "in"},
["subj_imp"] = {"ara", "aras", "ara", "áramus", "árais", "aran"},
["subj_fut"] = {"ari", "aris", "ari", "árimus", "áris", "arin"},
["cond"] = {"aría", "arías", "aría", "ariamus", "ariais", "arían",
"aríe", "aríes", "aríe", "ariemus", "arieis", "aríen"},
["imper"] = {nil, "a", "i", nil, "ai", "in"}
},
["el"] = {
["ger"] = {"iendu"},
["part"] = {"íu"},
["ind_pres"] = {"u", "is", "i", "emus", "eis", "in"},
["ind_imp"] = {"ía", "ías", "ía", "iamus", "iais", "ían",
nil, nil, nil, nil, "ivis", nil},
["ind_perf"] = {"í", "isti", "ió", "imus", "istis", "ierun",
nil, nil, nil, nil, nil, "iorin"},
["ind_perf_alt"] = {"e", "isti", "o", "imus", "istis", "ierun"},
["ind_fut"] = {"eré", "erás", "erá", "eremus", "ereis", "erán",
"erei"},
["subj_pres"] = {"a", "as", "a", "amus", "ais", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramus", "iérais", "ieran"},
["subj_fut"] = {"ieri", "ieris", "ieri", "iérimus", "iéris", "ierin"},
["cond"] = {"ería", "eríes", "ería", "eríamos", "eríais", "eríen",
"eríe", "eríes", "eríe", "eríemos", "eríeis", "eríen"},
["imper"] = {"-", "i", "a", nil, "ei", "an"}
},
["il"] = {
["ger"] = {"iendu"},
["part"] = {"íu"},
["ind_pres"] = {"u", "is", "i", "imus", "ís", "in"},
["ind_imp"] = {"ía", "ías", "ía", "iamus", "iais", "ían",
nil, nil, nil, nil, "ivis", nil},
["ind_perf"] = {"í", "isti", "ió", "imus", "istis", "ierun",
nil, nil, nil, nil, nil, "iorin"},
["ind_perf_alt"] = {"e", "isti", "o", "imus", "istis", "ierun"},
["ind_fut"] = {"iré", "irás", "irá", "iremus", "ireis", "irán",
"irei"},
["subj_pres"] = {"a", "as", "a", "amus", "ais", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramus", "iérais", "ieran"},
["subj_fut"] = {"ieri", "ieris", "ieri", "iérimus", "iéris", "ierin"},
["cond"] = {"iría", "iríes", "iría", "iríamos", "iríais", "iríen",
"iríe", "iríes", "iríe", "iríemos", "iríeis", "iríen"},
["imper"] = {"-", "i", "a", nil, "í", "an"}
},
}
local pronombres = {"me", "te", "se", "nos", "os", "se"}
local auxiliar = {
["inf_comp"] = {"tenel"},
["ger_comp"] = {"teniendu"},
["ind_perf_comp"] = {"é", "ás", "á", "avemus", "aveis", "ain",
"ei", nil, nil, "amus", "eis", "án"},
["ind_cont"] = {"tengu", "tienis", "tien", "tenemus", "teneis", "tienin",
nil, nil, "tieni"},
["ind_pluperf"] = {"avía", "avías", "avía", "aviamus", "aviais", "avían",
"vía", "vías", "vía", "viamus", "viais", "vían",
"diva", "divas", "diva", "divamus", "divais", "divan",
"iva", "ivas", "iva", "ivamus", "ivais", "ivan"},
["ind_anter"] = {"ubi", "abisti", "ubu", "abimus", "abistis", "ubun"},
["ind_fut_comp"] = {"abré", "abrás", "abrá", "abremus", "abreis", "abrán",
"bré", "brás", "brá", "bremus", "breis", "brán",
"averé", "averás", "averá", "averemus", "avereis", "averán"},
["cond_comp"] = {"uviera", "uvieras", "uviera", "uviéramus", "uviérais", "uvieran",
"aviera", "avieras", "aviera", "aviéramus", "aviérais", "avieran"},
["subj_perf"] = {"aiga", "aigas", "aiga", "aigamus", "aigais", "aigan"},
["subj_pluperf"] = {"huera", "hueras", "huera", "huéramus", "huérais", "hueran"},
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "al" then
return sufijos[1][forma]
elseif sufijo_inf == "el" then
return sufijos[2][forma]
else
return sufijos[3][forma]
end
end
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if sufijo_inf == "al" then
if find(sufijo, "^[eéií]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "z" then
return "~c~"..sufijo
end
if nexo == "gu" then
return "g~ü~"..sufijo
end
end
local _, cnt = gsub(sufijo, "[aeiou]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
if nexo == "cu" then
return sub(nexo, -2, -2).."~ú~"..sufijo, nexo..sufijo -- es llana y entonces lleva tilde
end
if nexo == "u" then
return "~ú~"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "i" then
return "#í#"..sufijo -- es llana y entonces lleva tilde
end
end
if find(sufijo, "^ar") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
else -- ER/IR/ÍR
if find(sufijo, "^[aáoóuú]") then
if nexo == "c" then
return "~z~"..sufijo
end
if nexo == "S" then -- mecer
return "#z#"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
if nexo == "gu" then
return "g~"..sufijo.."~"
end
if nexo == "qu" then
return "~c~"..sufijo
end
if nexo == "C" then
return "~zc~"..sufijo
end
end
if find(sufijo, "^[aeoáéó]") then
if nexo == "gü" then
return "g~uy~"..sufijo
end
if nexo == "u" then
return "u~y~"..sufijo
end
end
if find(sufijo, "^i[aeoáéó]") then
if (nexo == "ñ" or nexo == "ll") then
return "~"..nexo..sub(sufijo, 2).."~"
end
if nexo == "gü" then
return "g~uy~"..sub(sufijo, 2)
end
if nexo == "u" then
return "u~y~"..sub(sufijo, 2)
end
if nexo == "e" then
return nexo.."~y~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[^aeiouáéíóú]") then
if nexo == "e" then
return nexo.."~í~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[eé]") then
if find(nexo, "u#$") then -- ir --> fuera (subj)
return nexo..sub(sufijo, 2)
end
if nexo == "#j#" or nexo == "~j~" then
return nexo..sub(sufijo, 2)
end
end
if find(sufijo, "^í$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~e~"
end
end
if find(sufijo, "^ió$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~o~"
end
end
if find(sufijo, "^[ie]r") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
end
if nexo == "C" then
return "c"..sufijo -- sin epéntesis
end
if nexo == "S" then -- mecer
return "c"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, nucleo_inf)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "[yi]$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif find(nucleo_, "^[^áéíóú]-[aeiou]h?$") and find(nexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleo_, "[^gq][aeiou]$") and find(nexosufijo_, "^i[aeiouáéíóú]") then -- se junta [aeiou]i[aeiouáéíóú] -> cambio a y (creYO) PERO [[chinguiar]] -> chinguIando
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~y~")
elseif find(nucleo_, "[aeiou]$") and find(nexosufijo_, "^id$") then -- reír -> reÍd, embaír -> embaÍd
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~í~")
elseif find(nucleo_, "^[^aeiouáéíóú]+$")
and (find(nexosufijo_, "^"..CONS.."?"..CONS.."?".."[iuü]?[áéó][iuü]?[ns]?$") or find(nexosufijo_, "^[íú][ns]?$")) then -- caso de dar, vos *d+ás, debo quitar la tilde
return nucleo..gsub1(nexosufijo, "[áéíóú]", function(v) return "~"..quitar_tilde[v].."~" end)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
local prefijo_ = gsub(prefijo, "[~#]", "")
local nucleonexosufijo_ = gsub(nucleonexosufijo, "[~#]", "")
if prefijo_ and find(prefijo_, "[aeiou]") and not find(prefijo_, "[áéíóú]") then
if find(prefijo_, "^[^áéíóú]-[aeiou]h?$") and find(nucleonexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- nucleonexosufijo con i/u tónica (rehacer -> rehíce)
return prefijo..gsub1(nucleonexosufijo, "^([~#]?h?[~#]?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleonexosufijo_, "^("..CONS.."*[iuü]?)([aeiou])([iuü]?[ns]?)$") then -- monosílabo: prever --> prevén
return prefijo..gsub1(nucleonexosufijo, "^([~#]?"..CONS.."*[~#]?[iuü]?[~#]?)([aeiou])([~#]?[iuü]?[~#]?[ns]?[~#]?)$", function(a, b, c) return a..agregar_tilde[b]..c end) -- ven --> prevén
end
end
return prefijo..nucleonexosufijo
end
local paradigmas_regulares = {
["al"] = {
{"añuncial", {"ial$"}, { --necesidad de explicitar el diptongo, aunque esta variante es la que consideramos como la regular
}},
{"evacual", {"cual$"}, {
nexo = "cu"
}},
{"averigual", {"gual$"}, {
nexo = "gu"
}},
{"complical", {"cal$"}, {
nexo = "c"
}},
{"llegal", {"gal$"}, {
nexo = "g"
}},
{"actual", {"ual$"}, {
nexo = "u"
}},
{"realizal", {"zal$"}, {
nexo = "z"
}},
{"amal", {"al$"}, {
}},
},
["el"] = {
{"llel", {"llel$"}, { -- Existe esto??
nexo = "ll"
}},
{"guel", {"guel$"}, { -- Existe esto??
nexo = "gu"
}},
{"güel", {"güel$"}, { -- Existe esto??
nexo = "gü"
}},
{"quel", {"quel$"}, { -- Existe esto??
nexo = "qu"
}},
{"parecel", {"[aeiou]cel$"}, {
nexo = "C"
}},
{"vencel", {"[^aeious]cel$"}, { -- los verbos en -scer NO entran en este paradigma (ver fosforescer o evanescer)
nexo = "c"
}},
{"leel", {"eel$"}, {
nexo = "e"
}},
{"protegel", {"gel$"}, {
nexo = "g"
}},
{"atañel", {"ñel$"}, {
nexo = "ñ"
}},
{"uel", {"uel$"}, { -- Existe esto??
nexo = "u"
}},
{"temel", {"el$"}, {
}},
},
["il"] = {
{"producil", {"ducil$"}, { -- REVISAR
nucleo = "du",
nexo = "C",
ind_perf = {nexo = "~j~"},
subj_imp = {nexo = "~j~"},
}},
{"escabullil", {"llil$"}, {
nexo = "ll"
}},
{"distinguil", {"guil$"}, {
nexo = "gu"
}},
{"argüil", {"güil$"}, {
nexo = "gü"
}},
{"delinquil", {"quil$"}, {
nexo = "qu"
}},
{"lucil", {"[aeiou]cil$"}, {
nexo = "C"
}},
{"fruncil", {"[^aeious]cil$"}, {
nexo = "c"
}},
{"dirigil", {"gil$"}, {
nexo = "g"
}},
{"gruñil", {"ñil$"}, {
nexo = "ñ"
}},
{"construil", {"uil$"}, {
nexo = "u"
}},
{"partil", {"il$"}, {
}},
},
["íl"] = {
{"reíl", {"eíl$"}, {
nucleo = "e",
alt = {"í-i"},
}},
{"íl", {"íl$"}, { -- para que oír no tire error
}},
}
}
local paradigmas_irregulares = {
["al"] = {
{"andal", {"^d?e?s?andal$"}, { -- cuidado con mandar
nucleo = "and",
ind_perf = {nucleo = "anduv"},
subj_imp = {nucleo = "anduv"},
}},
{"dal", {"^d?e?s?dal$"}, { -- no pueden ir otros verbos como "andar o quedal"
nucleo = "d",
ind_pres = {{"doi", "do"}},
ind_perf = {sufijo_inf = "el"},
subj_pres = {nucleo = "de"},
subj_imp = {sufijo_inf = "el"},
}},
{"erral", {"^erral$"}, {
nucleo = "err",
alt = {"ye"},
}},
{"inhestal", {"inhestal$"}, {
alt = {"ie"},
part = {"inhiesto"}
}},
{"tal", {"^tal$"}, {
ind_pres = {{"toi", "to"}},
ind_perf = {nucleo = "tuv"},
subj_pres = {nucleo = "te"},
subj_imp = {nucleo = "tuv"},
imper = {nil, nil, {"tea"}, nil, {"tai"}, {"tean"}}
}},
{"enfrial", {"enfrial$"}, {
nexo = "i",
}},
--{"culial", {"culial$"}, { por precaución sacamos esto
-- nexo = "I"
--}},
{"aislal", {"aislal$"}, {
alt = {"í"}
}},
{"avergoñal", {"avergoñal$"}, {
alt = {"üe"}
}},
{"auñal", {"^auñal$"}, { -- REVISAR
alt = {"ú"}
}},
{"contal", {"contal$"}, {
alt = {"ue"}
}},
{"pensal", {"^pensal$"}, { -- no puede ir compensar
alt = {"ie"}
}},
},
["el"] = {
{"cabel", {"^cabel$"}, {
ind_pres = {{"quepo"}},
ind_fut = {nucleo = "ca", nexo = "#br#"},
ind_perf = {nucleo = "cup"},
subj_pres = {nucleo = "quep"},
subj_imp = {nucleo = "cup"},
cond = {nucleo = "ca", nexo = "#br#"},
}},
{"cael", {"cael$"}, { -- REVISAR http://ast.oslin.org/index.php?action=lemma&lemma=11064 hay alguna regla detrás de esto??
nucleo = "ca",
ind_pres = {{"caigo", "cayo"}, {"caes", "cayes"}, nil, {"caemos", "cayemos"}, {"caéis", "cayéis"}, {"caen", "cayen"}},
subj_pres = {nucleo = "caig"},
imper = {nil, nil, nil, {"caiga"}, {"caigamos"}, nil, {"caigan"}}
}},
{"cocel", {"cocel$"}, {
nucleo = "co",
nexo = "S", -- evitar C (epéntesis con zc)
alt = {"ue"},
}},
{"facel", {"[hfj]acel$"}, { -- REVISAR
nucleo = "a",
nexo = "S", -- evitar C (epéntesis con zc)
part = {"echu"},
ind_pres = {{"ago", "aigo"}},
ind_perf = {nucleo = "i"},
ind_fut = {nucleo = "a", nexo = "#dr#"},
subj_pres = {nucleo = "ag", nexo = ""},
subj_imp = {nucleo = "i"},
cond = {nucleo = "a", nexo = "#dr#"},
}},
{"habel", {"^habel$"}, {
ind_pres = {{"he"}, {"has"}, {"ha", "hai{IMPERSONAL}"}, {"hemos", "habemos"}, nil, {"han"}},
ind_perf = {nucleo = "hub"},
ind_fut = {nucleo = "ha", nexo = "#br#"},
subj_pres = {nucleo = "hay"},
subj_imp = {nucleo = "hub"},
cond = {nucleo = "ha", nexo = "#br#"},
imper = {nil, {"he{†}", "habe{†}"}, {"he{†}", "habe{†}"}, {"haya{†}"}, {"hayamos{†}"}, nil, {"hayan{†}"}},
}},
{"mecel", {"^r?e?mecel$"}, {
nexo = "S", -- evitar C (epéntesis con zc)
}},
{"morrel", {"morrel$"}, {
nucleo = "morr",
alt = {"ue"},
part = {"muertu"},
}},
{"golel", {"^golel$"}, {
alt = {"üe"},
}},
{"volvel", {"olvel$"}, {
nucleo = "olv",
alt = {"ue"},
part = {"ueltu"}
}},
{"placel", {"placel$"}, { -- REVISAR, existe esto??
nucleo = "pla",
ind_perf = {nil, nil, nil, {"plació", "plugo"}, nil, nil, {"placieron", "pluguieron"}},
subj_imp = {nil, nil, nil, {"placiera", "placiese", "pluguiera", "pluguiese"}, nil, nil, nil},
}},
{"podel", {"podel$"}, {
nucleo = "pod",
alt = {"ue"},
ger = {"pudiendo"},
ind_perf = {nucleo = "pud"},
ind_fut = {nucleo = "po", nexo = "#dr#"},
subj_imp = {nucleo = "pud"},
cond = {nucleo = "po", nexo = "#dr#"},
}},
{"ponel", {"ponel$"}, {
nucleo = "pon",
part = {"puesto"},
ind_pres = {{"pongo"}},
ind_perf = {nucleo = "pus"},
ind_fut = {nucleo = "pon", nexo = "#dr#"},
subj_pres = {nucleo = "pong"},
subj_imp = {nucleo = "pus"},
cond = {nucleo = "pon", nexo = "#dr#"},
imper = {nil, {"pon"}, {"ponga"}, nil, nil, {"pongan"}},
}},
{"proveel", {"proveel$"}, {
nucleo = "prov",
part = {"provisto", "proveído{†}"}
}},
{"querel", {"querel$"}, { -- REVISAR
nucleo = "quer",
alt = {"ie"},
ind_perf = {nucleo = "quis"},
ind_fut = {nucleo = "que", nexo = "#dr#"},
subj_imp = {nucleo = "quis"},
cond = {nucleo = "que", nexo = "#dr#"},
}},
{"rael", {"^rael$", "^rayel$"}, { -- no contraer, etc. REVISAR
ind_pres = {{"raigo", "rayo"}},
subj_pres = {nucleo = {"raig", "ray"}},
imper = {nil, nil, {"raiga", "raya"}, nil, {"raíi", "rayíi"}, {"raigan", "rayan"}}
}},
{"roel", {"roel$", "royel$"}, { -- REVISAR
nucleo = "ro",
ind_pres = {{"roigo", "royo"}},
subj_pres = {nucleo = {"roig", "roy"}},
imper = {nil, nil, {"roiga", "roya"}, nil, {"roíi", "royíi"}, {"roigan", "royan"}}
}},
{"rompel", {"^rompel$", "^arrompel$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
alt = {"ue"},
part = {"rotu"}
}},
{"sabel", {"sabel$"}, {
nucleo = "sab",
ind_pres = {{"sé"}},
ind_perf = {nucleo = "sup"},
ind_fut = {nucleo = "sa", nexo = "#br#"},
subj_pres = {nucleo = "sep"},
subj_imp = {nucleo = "sup"},
cond = {nucleo = "sa", nexo = "#br#"},
imper = {nil, nil, {"sepa"}, nil, nil, {"sepan"}}
}},
{"sel", {"^sel$"}, {
ind_pres = {{"soi", "so"}, {"yes"}, {"ye"}, {"somos"}, {"sois"}, {"son"}},
ind_imp = {{"yera"}, {"yeres"}, {"yera"}, {"yéramos", "yéremos"}, {"yerais", "yereis"}, {"yeren"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fostis", "fuestis", "fuistis"}, {"foron", "fueron"}},
subj_pres = {nucleo = {"sey", "sí"}},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: hay que agregar la variante con fo
imper = {nil, {"sé"}, {"sea"}, nil, nil, {"sean"}}
}},
{"tenel", {"tenel$", "^tel$"}, {
nucleo = "ten",
alt = {"ie"},
ind_pres = {{"tengo", "teo", "to"}},
ind_perf = {nucleo = {"tev", "tuv"}},
ind_fut = {nucleo = "ten", nexo = "#dr#"},
subj_pres = {nucleo = "teng"},
subj_imp = {nucleo = "tuv"},
cond = {nucleo = "ten", nexo = "#dr#"},
imper = {nil, {"ten"}, {"tenga"}, nil, nil, {"tengan"}}
}},
{"trael", {"trael$", "trayel$"}, {
nucleo = "tra",
ind_pres = {{"traigo"}},
ind_perf = {nucleo = "tra", nexo = "#j#"},
subj_pres = {nucleo = "traig"},
subj_imp = {nucleo = "tra", nexo = "#j#"},
imper = {nil, nil, nil, {"traiga"}, {"traigamos"}, nil, {"traigan"}}
}},
{"vel", {"^vel$", "^antevel$", "^entrevel$", "^prevel$", "^revel$"}, {
nucleo = "v",
part = {"visto"},
ind_pres = {{"veo"}},
subj_pres = {nucleo = "ve"},
imper = {nil, nil, {"vea"}, nil, nil, {"vean"}}
}},
{"yacel", {"^yacel$", "^subyacel$"}, { -- REVISAR: existe esto?
nucleo = "yac",
nexo = "", -- evitar C (epéntesis con zc), lo voy a agregar manual
ind_pres = {{"yazco", "yazgo", "yago"}},
subj_pres = {nucleo = {"yazc", "yazg", "yag"}},
imper = {nil, {"yace", "yaz"}, {"yazca", "yazga", "yaga"}, nil, nil, {"yazcan", "yazgan", "yagan"}}
}},
{"movel", {"movel$"}, {
alt = {"ue"},
}},
{"entendel", {"entendel$"}, {
alt = {"ie"},
}},
},
["il"] = {
{"asil", {"asil$"}, { -- REVISAR: existe esto
nucleo = "as",
ind_pres = {{"asgo"}},
subj_pres = {nucleo = "asg"},
imper = {nil, nil, {"asga"}, {"asgamos"}, nil, {"asgan"}}
}},
{"abril", {"[^js]abril$", "^abril$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"abiertu"}
}},
{"abril", {"ubril$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "ubr",
part = {"ubiertu"}
}},
-- para decir contemplo 4 casos:
-- 1. decir, redecir, entredecir, antedecir: lo normal, con el imperativo en "dí" (di)
-- 2. interdecir: similar a 1. pero el imperativo es interdice (no *interdí) --> esto no existe en ast creo
-- 3. bendecir, maldecir: agrego bendito, maldito al pp
-- 4. condecir, contradecir, desdecir, predecir: parto de 1 pero agrego el futuro regular que esta aceptado
{"dicil", {"^dicil$", "^redicil$", "^entredicil$", "^antedicil$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dichu"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = "d", nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
cond = {nucleo = "d", nexo=""},
imper = {nil, {"di"}, {"diga"}, nil, nil, {"digan"}}
}},
{"bendicil", {"bendicil$", "maldicil$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"decíu{PART}", "ditu{ADJ}"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
imper = {nil, {"diz"}, {"diga"}, nil, nil, {"digan"}}
}},
{"predicil", {"dicil$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dichu"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = {"dec", "d"}, nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
cond = {nucleo = {"dec", "d"}, nexo=""},
imper = {nil, {"dí"}, {"diga"}, nil, nil, {"digan"}}
}},
{"erguil", {"^erguil$"}, {
nucleo = "el",
alt = {"ye-i", "i-i"},
}},
{"imprimil", {"imprimil$"}, {
nucleo = "imprim",
part = {"imprimíu{PART}", "impresu{ADJ}"}
}},
{"dil", {"^dil$"}, {
ind_pres = {{"voi", "vo"}, {"vas"}, {"va"}, {"vamos"}, {"vais"}, {"van"}},
ind_imp = {{"diba"}, {"dibas"}, {"diba"}, {"díbamos", "díbemos"}, {"dibais", "dibeis"}, {"diben"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fuestis", "fuistis"}, {"foron", "fueron"}},
subj_pres = {{"fora", "vaiga", "vaya"}, {"vaigas", "vayas"}, {"fora", "vaiga", "vaya"}, {"vaigamos", "vayamos"}, {"vaigáis", "vayáis"}, {"vaigan", "vayan"}},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: faltan los otros nexos posibles
imper = {nil, {"ve"}, {"vaya"}, nil, nil, {"vayan"}}
}},
{"pudril", {"pudril$"}, { -- REVISAR: existe esto?
nucleo = "pudr",
part = {"podridu"}
}},
{"salil", {"salil$"}, {
nucleo = "sal",
ind_pres = {{"salgo"}},
ind_fut = {nucleo = "sal", nexo = "#dr#"},
subj_pres = {nucleo = "salg"},
cond = {nucleo = "sal", nexo = "#dr#"},
imper = {nil, {"sal"}, {"salga"}, nil, nil, {"salgan"}}
}},
{"escribil", {"scribil$"}, {
nucleo = "scrib",
part = {"scrito"}
}},
{"valil", {"valil$"}, {
nucleo = "val",
ind_pres = {{"valgo"}},
ind_fut = {nucleo = "val", nexo = "#dr#"},
subj_pres = {nucleo = "valg"},
cond = {nucleo = "val", nexo = "#dr#"},
imper = {nil, nil, {"valga"}, nil, nil, {"valgan"}}
}},
{"venil", {"venil$"}, {
nucleo = "ven",
alt = {"ie-i"},
ind_pres = {{"vengo"}},
ind_fut = {nexo = "#dr#"},
ind_perf = {nucleo = "vin"}, -- REVISAR: la 3s es él vIEno, no *vino, hay más verbos así?
subj_pres = {nucleo = "veng"},
cond = {nexo = "#dr#"},
imper = {nil, {"ven"}, {"venga"}, nil, nil, {"vengan"}}
}},
{"sentil", {"sentil$"}, { -- discernir entra en este paradigma tmb.
alt = {"ie-i"}
}},
{"podril", {"podril$"}, {
alt = {"u-u"},
}},
{"reunil", {"reunil$"}, {
alt = {"ú"}
}},
{"prohibil", {"prohibil$"}, {
alt = {"í"}
}},
{"rehenchil", {"rehenchil$"}, {
alt = {"í-i"}
}},
{"dormil", {"dormil$"}, {
alt = {"ue-u"}
}},
},
["íl"] = {
{"desvaíl", {"desvaíl$"}, { -- hay más verbos en -air? no podemos considerarlo como regla general
ind_pres = {{"desvayo"}},
subj_pres = {nucleo = "desvay"},
imper = {nil, nil, nil, {"desvaya"}, {"desvayamos"}, nil, {"desvayan"}}
}},
{"freíl", {"freíl$"}, {
nucleo = "fre",
part = {"frito{PART/ADJ}", "freído{PART}"},
}},
{"oíl", {"oíl$"}, {
nucleo = "o",
alt = {"oy"},
ger = {"oyendo"},
ind_pres = {{"oigo"}},
subj_pres = {nucleo = "oig"},
imper = {nil, nil, nil, {"oiga"}, {"oigamos"}, nil, {"oigan"}}
}},
},
}
local alt_info = {
["al"] = {
["í"] = {"aislal", "i", "í"}, -- tb. descafeinar
["ú"] = {"aunal", "u", "ú"}, -- tb. rehusar
["ie"] = {"pensal", "e", "ie"},
["ue"] = {"contal", "ou", "ue"}, -- también jugar
["üe"] = {"agoral", "o", "üe"},
["hue"] = {"desosal", "ou", "hue"},
["ye"] = {"erral", "e", "ye"},
},
["el"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["ie"] = {"entendel", "e", "ie"},
["ue"] = {"movel", "o", "ue"},
["üe"] = {"golel", "o", "üe"},
},
["il"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["í"] = {"prohibil", "i", "í"},
["í-i"] = {"rehenchil", "e", "í", "i"},
-- ["i-i"] = {"pedil", "e", "i", "i"},
--["ie"] = {"discernil", "ei", "ie"}, -- por las dudas también la i, por inquirir
["ie-i"] = {"sentil", "ei", "ie", "i"}, -- inquirir
["u"] = {"???", "o", "u", "u"},
["ú"] = {"reunil", "u", "ú"},
["u-u"] = {"podril", "o", "u", "u"}, -- REVISAR: existe esto??
["ue-u"] = {"dormil", "o", "ue", "u"},
["ye-i"] = {"erguil", "e", "ye", "i"},
},
["íl"] = {
["í-i"] = {"reíl", "e", "í", "i"},
["oy"] = {"oíl", "o", "oy", "oy"},
}
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
if sufijo_inf == "ar" and conjinfo[forma].nucleo then
sufijo_inf = "er" -- echo mano a los sufijos de la otra conjugación, más que nada aplica a verbos como andar -> ANDUViera
end
local sufijos_ = obtener_sufijos(sufijo_inf, (forma == "ind_perf" and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleos2
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos1}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleos1}
elseif forma == "subj_imp" or forma == "subj_fut" then
local n = conjinfo.nucleos2
nucleos = {n, n, n, n, n, n}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for j, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[1], sufijo_inf)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
end
return
end
for i = YO, ELLOS do
local p = tostr[i]
if conjinfo[forma][i] then
for j, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[k], sufijo_inf)
for _,nucleo in ipairs(nucleos[i]) do
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["alt"] = {lista = true},
["nucleopres1"] = {lista = true},
["nucleopret3"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["núcleopret3"] = {alias_de = "nucleopret3"},
["paradigma"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][íu]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiáéí]r)(s?e?)(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?"..ESPACIO.."?"..LETRA.."*[aeiáéí]rs?e?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
v = gsub(v, "^(%S*)ál$", "%1al") -- pronominales
v = gsub(v, "^(%S*)él$", "%1el") -- pronominales
v = gsub(v, "^(%S*[^aeo])íl$", "%1il") -- grafías anticuadas
local sufijo_inf = match(v, "[aeií]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopret3"])) do
local conjinfo = {}
if find(v, "ial$") and (not args["paradigma"][N] or args["paradigma"][N] == "") then
error("Especifique el (los) paradigma(s) para los verbos en -iar (añuncial, enfrial)")
end
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
local vacio = true
for k, v in pairs(p[3]) do
vacio = false
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
if vacio then
paradigmas_reconocidos[p[1]] = true -- caso de [[anunciar]]
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = {}
conjinfo.nucleos2 = {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert_if_not(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
n1, sust = gsubb(conjinfo.nucleo_inf, "^([^"..info[2].."]*)["..info[2].."]([^"..info[2].."]*)$", "%1#"..info[3].."#%2")
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^([^"..info[2].."]*)["..info[2].."]([^"..info[2].."]*)$", "%1#"..info[4].."#%2")
end
assert(sust, "Alternancia vocálica no reconocida")
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if args["nucleopres1"][N] then
for k, v in pairs(alt_info[sufijo_inf]) do
if args["nucleopret3"][N] then
if v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
and gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[4]) == gsub1(args["nucleopret3"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
insert_if_not(conjinfo.nucleos2, args["nucleopret3"][N])
break
end
end
else
if not v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
break
end
end
end
end
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for _,s in ipairs(tostr) do
fmtinfo["subj_pres"..s] = deepcopy(resultante["subj_pres"..s])
end
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local es_impersonal = args["impersonal"]
local es_indirecto = args["indirecto"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local impers = args["impersonal"]
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
if args["indirecto"] then
error("No implementado aún")
else
fila_pronombres_ind = {"", "(ello)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", color=COLOR_IMPER, header=true, class="pc"}
end
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(ello)", "(ellus)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", "(ellus)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", "(que ellus)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", "(ellus)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "yo", "tu", "él, vusté", "nusotrus", "vusotrus", "ellus", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "yo", "tu", "él, vusté", "nusotrus", "vusotrus", "ellus", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que yo", "que tu", "que él, vusté", "que nusotrus", "que vusotrus", "que ellus", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tú)", "(vusté)", "(nusotrus)", "(vusotrus)", "―", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")}
t[12] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")}
t[13] = {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")}
t[14] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("ind_fut_comp")}
t[15] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")}
t[16] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[17] = fila_pronombres_cond
t[18] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[19] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[20] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[21] = fila_pronombres_subj
t[22] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[23] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")}
t[24] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")}
t[25] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")}
t[26] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[27] = fila_pronombres_imper
if mostrar_imper then
t[28] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[29] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[30] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[31] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "EXT:Verbos irregulares")
paradigmas_reconocidos["añuncial"] = nil
paradigmas_reconocidos["amal"] = nil
paradigmas_reconocidos["temel"] = nil
paradigmas_reconocidos["partil"] = nil
paradigmas_reconocidos["íl"] = nil
else
insert(cats, "EXT:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "EXT:Verbos del paradigma "..p)
end
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "EXT:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "EXT:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "EXT:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "EXT:Verbos defectivos")
end
if sufijo_inf == "al" then
insert(cats, "EXT:Verbos de la primera conjugación")
elseif sufijo_inf == "el" then
insert(cats, "EXT:Verbos de la segunda conjugación")
else -- será ir o ír, ya fue chequeado antes
insert(cats, "EXT:Verbos de la tercera conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
b9no4antkvvdndz2ueu36zsgaaxl8h5
Módulo:flex/an
828
1056431
6307319
6118164
2026-08-06T00:33:53Z
TMCbot
164594
.
6307319
Scribunto
text/plain
-- Flexión del aragonés
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local len = m_str.len
local find = m_str.find
local gsub1 = m_str.gsub1
local gsub = m_str.gsub
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal_no_tilde = "aeiouüAEIOUÜ"
local vocal_tilde = "áéíóúÁÉÍÓÚ"
local vocal = vocal_no_tilde..vocal_tilde
local cons = "bcdfghjklmnñpqrstvwxyzçBCFGHJKLMNÑPQRSTVWXYZÇ"
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local CONS_SALVO_H = "[^"..vocal.."hH~#{}]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local agregar_tilde =
{
["a"] = "á",
["e"] = "é",
["i"] = "í",
["o"] = "ó",
["u"] = "ú",
["á"] = "á",
["é"] = "é",
["í"] = "í",
["ó"] = "ó",
["ú"] = "ú",
["A"] = "Á",
["E"] = "É",
["I"] = "Í",
["O"] = "Ó",
["U"] = "Ú",
["Á"] = "Á",
["É"] = "É",
["Í"] = "Í",
["Ó"] = "Ó",
["Ú"] = "Ú",
}
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local function try(p, rx, pl, f, fpl, pl2, femenino)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if not pl then
return {m={p2}, p={}, f={}, fp={}}
end
if not femenino or not f then
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={}, fp={}}
else
return {m={p2}, p={gsub1(p, rx, pl)}, f={}, fp={}}
end
end
if pl2 then
return {m={p2}, p={gsub1(p, rx, pl), gsub1(p, rx, pl2)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
end
return {m={p2}, p={gsub1(p, rx, pl)}, f={gsub1(p, rx, f)}, fp={gsub1(p, rx, fpl)}}
end
-- https://an.wikipedia.org/wiki/Numero_gramatical_en_aragon%C3%A9s
local function flexionar_palabra(p, g, forzar_s)
local adj = g == "mf"
local function rep_a_2(v, c) return "~"..quitar_tilde[v]..c.."a~" end
local function rep_as_2(v, c) return "~"..quitar_tilde[v]..c.."as~" end
local function rep_s_2(v, c) return "~"..quitar_tilde[v]..c.."s~" end
local function rep_es_2(v, c) return "~"..quitar_tilde[v]..c.."es~" end
local function rep_n_2(v, c) return "~"..agregar_tilde[v]..c.."s~" end
local es_monosilabo = find(p, "^"..CONS.."-[iuü]?[aeoiu][iu]?"..CONS.."-$")
local diptongo_final_ns = find(p, "[aeiouü][ui][ns]$") -- las palabras que terminen en diptongo con u/i final y n/s no llevan tilde
local sin_tilde = not find(p, "["..vocal_tilde.."]")
local fl = try(p, "o$", "~os~", "~a~", "~as~", nil, adj)
or try(p, "ce$", "~ces~", "~za~", "~zas~", nil, adj)
or try(p, "eu$", "~eus~", "~eua~", "~euas~", nil, adj)
or try(p, "au$", "~aus~", "~ada~", "~adas~", nil, adj)
or try(p, "íu$", "~íus~", "~ida~", "~idas~", nil, adj)
or try(p, VOCAL.."$", "~%0s~", nil, nil, nil, adj)
or try(p, "("..VOCAL..")[td]$", "~%1z~", nil, nil, nil, adj) -- -d, -t
or try(p, "rt$", "~rz~", nil, nil, nil, adj) -- -rt
or try(p, "([oe]r)$", "~%1s~", "~%1a~", "~%1as~", nil, adj) -- -er (-ero en castellano), -or
or try(p, "(ol)$", "~%1s~", "~%1a~", "~%1as~", nil, adj) -- -er (-ero en castellano), -or
or try(p, "[aeiou][íú]n$", "~%0s~", "~%0a~", "~%0as~", nil, adj) -- hiatos con n
or try(p, "[aeiou][íú]s$", "~%0es~", "~%0a~", "~%0as~", nil, adj) -- hiatos con s
or try(p, (es_monosilabo or diptongo_final_ns) and "([aeiou])(n)$" or "([áéíóú])(n)$", rep_s_2, rep_a_2, rep_as_2, nil, adj) -- agudas/monosílabos en n
or try(p, (es_monosilabo or diptongo_final_ns) and "([aeiou])(s)$" or "([áéíóú])(s)$", rep_es_2, rep_a_2, rep_as_2, nil, adj) -- agudas/monosílabos en s
or try(p, (es_monosilabo or sin_tilde) and "x$" or "^%A$", forzar_s and "~xs~" or "~xes~", nil, nil, nil, adj) -- agudas/monosílabos en x
or try(p, sin_tilde and "([aeiou])([ui]?"..CONS.."+[iu]?[aeiou][iu]?n)$" or "^%A$", rep_n_2, nil, nil, nil, adj) -- llanas en n
or try(p, "[nsx]$", nil, nil, nil, nil, adj) -- esdrújulas en n, llanas/esdrújulas s, x
or try(p, "("..VOCAL..")z$", "~%1ces~", nil, nil, nil, adj)
or try(p, "("..VOCAL..")c$", "~%1ques~", nil, nil, nil, adj)
or try(p, "("..CONS..")y$", "~%1is~", nil, nil, nil, adj) -- ferry, REVISAR
or try(p, CONS.."[sz]$", nil)
or try(p, "[sz]"..CONS.."$", nil)
or try(p, "ch$", forzar_s and "~%0s~" or "~%0es~")
or try(p, CONS..CONS.."$", "~%0s~")
or try(p, CONS.."$", "~%0s~")
if fl then
return fl
end
error("No se pudo determinar la flexión de la palabra")
end
local function flexion_sust_adj(palabras, g, forzar_s, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g, forzar_s)
local flex2 = copulativa and flexionar_palabra(b, g, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = flexionar_palabra(p, g, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "AN:Locuciones sustantivas" or "AN:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["noes"] = {alias_de = "s"},
["es"] = {tipo = "bool"},
["forzares"] = {alias_de = "es"},
["nos"] = {alias_de = "es"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "AN:Locuciones adjetivas" or "AN:Adjetivos")
end
-- FALTA TERMINAR LOS VERBOS
local YO, TU, EL, NOSOTROS, VOSOTROS, ELLOS = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"yo", "tu", "él, vusté", "nosotros", "vosotros", "vustedes, ellos"}
local PRONOMBRES_SUBJ = {"que yo", "que tu", "que él, vusté", "que nosotros", "que vosotros", "que vustedes, ellos"}
local PRONOMBRES_IMP = {"―", "(tú)", "(vusté)", "(nosotros)", "(vosotros)", "(vustedes)"}
local IMPERSONALES = {"", "", "(ello)", "", "", "(ellos)"}
local IMPERSONALES_SUBJ = {"", "", "(que ello)", "", "", "(que ellos)"}
local REFLEXIVOS = {"me", "te", "se", "nos", "os", "se"}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["ind_fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_pluperf"] = true,
["ind_anter"] = true,
["ind_fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local sufijos = {
["ar"] = {
["ger"] = {"ando"},
["part"] = {"áu"},
["ind_pres"] = {"o", "es", "a", "amos", "áis", "en"},
["ind_imp"] = {"aba", "abes", "aba", "ábamos", "abais", "aben",
nil, nil, nil, "ábemos", "abeis", nil},
["ind_perf"] = {"é", "asti", "ó", "emos", "astis", "aron",
nil, "esti", nil, nil, "estis", nil},
["ind_perf_alt"] = {"é", "asti", "ó", "emos", "astis", "aron"},
["ind_fut"] = {"aré", "arás", "ará", "aremos", "aréis", "arán"},
["subj_pres"] = {"e", "as", "e", "emos", "éis", "an",
nil, "es", nil, nil, nil, "en"},
["subj_imp"] = {"ara", "aras", "ara", "áramos", "arais", "aran",
"are", "ares", "are", "áremos", "areis", "aren"},
["cond"] = {"aría", "aríes", "aría", "aríamos", "aríais", "aríen",
nil, nil, nil, "aríemos", "aríeis", nil},
["imper"] = {"-", "a", "e", "emos", "ái", nil}
},
["er"] = {
["ger"] = {"iendo"},
["part"] = {"íu"},
["ind_pres"] = {"o", "es", "e", "emos", "éis", "en"},
["ind_imp"] = {"ía", "íes", "ía", "íamos", "íais", "íen",
nil, nil, nil, "íemos", "íeis", nil},
["ind_perf"] = {"í", "iesti", "iera", "iemos", "iestis", "ieron",
nil, "isti", "iere", "imos", "istis", nil},
["ind_perf_alt"] = {"e", "iste", "o", "imos", "istis", "ieron"},
["ind_fut"] = {"eré", "erás", "erá", "eremos", "eréis", "erán"},
["subj_pres"] = {"a", "as", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"ería", "eríes", "ería", "eríamos", "eríais", "eríen",
nil, nil, nil, "eríemos", "eríeis", nil},
["imper"] = {"-", "i", "a", "amos", "éi", nil}
},
["ir"] = {
["ger"] = {"iendo"},
["part"] = {"ido"},
["ind_pres"] = {"o", "es", "e", "imos", "ís", "en"},
["ind_imp"] = {"ía", "íes", "ía", "íamos", "íais", "íen",
nil, nil, nil, "íemos", "íeis", nil},
["ind_perf"] = {"í", "iesti", "ió", "iemos", "iesteis", "ieron",
nil, "isti", nil, "imos", "istis", nil},
["ind_perf_alt"] = {"e", "iste", "o", "imos", "isteis", "ieron"},
["ind_fut"] = {"iré", "irás", "irá", "iremos", "iréis", "irán"},
["subj_pres"] = {"a", "as", "a", "amos", "áis", "an"},
["subj_imp"] = {"iera", "ieras", "iera", "iéramos", "ierais", "ieran",
"iere", "ieres", "iere", "iéremos", "iereis", "ieren"},
["cond"] = {"iría", "irías", "iría", "iríamos", "iríais", "iríen",
nil, nil, nil, "iríemos", "iríeis", nil},
["imper"] = {"-", "i", "a", "amos", "íi", nil}
},
}
local pronombres = {"me", "te", "se", "nos", "os", "se"}
local auxiliar = {
["inf_comp"] = {"tener"},
["ger_comp"] = {"teniendo"},
["ind_perf_comp"] = {"tengo", "tienes", "tien", "tenemos", "tenéis", "tienen"},
["ind_pluperf"] = {"tenía", "teníes", "tenía", "teníamos", "teníais", "teníen"},
["ind_anter"] = {"tuvi", "tuvisti", "tuvo", "tuvimos", "tuvistis", "tuvieron"},
["ind_fut_comp"] = {"tendré", "tendrás", "tendrá", "tendremos", "tendréis", "tendrán"},
["cond_comp"] = {"tendría", "tendríes", "tendría", "tendríamos", "tendríais", "tendríen"},
["subj_perf"] = {"tenga", "tengas", "tenga", "tengamos", "tengáis", "tengan"},
["subj_pluperf"] = {"tuviera", "tuvieras", "tuviera", "tuviéramos", "tuvierais", "tuvieran",
"tuviese", "tuvieses", "tuviese", "tuviésemos", "tuvieseis", "tuviesen"},
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "ar" then
return sufijos[1][forma]
elseif sufijo_inf == "er" then
return sufijos[2][forma]
else
return sufijos[3][forma]
end
end
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if sufijo_inf == "ar" then
if find(sufijo, "^[eéií]") then
if nexo == "c" then
return "~qu~"..sufijo
end
if nexo == "g" then
return "g~u~"..sufijo
end
if nexo == "z" then
return "~c~"..sufijo
end
if nexo == "gu" then
return "g~ü~"..sufijo
end
end
local _, cnt = gsub(sufijo, "[aeiou]", "")
if cnt == 1
and not find(sufijo, "[áéíóú]")
and find(sub(sufijo, -1), "[aeiouns]") then
if nexo == "cu" then
return sub(nexo, -2, -2).."~ú~"..sufijo, nexo..sufijo -- es llana y entonces lleva tilde
end
if nexo == "u" then
return "~ú~"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "i" then
return "#í#"..sufijo -- es llana y entonces lleva tilde
end
if nexo == "I" then
return "#e#"..sufijo -- es llana y entonces la sinéresis de la i se pierde
end
end
if find(sufijo, "^ar") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
else -- ER/IR/ÍR
if find(sufijo, "^[aáoóuú]") then
if nexo == "c" then
return "~z~"..sufijo
end
if nexo == "S" then -- mecer
return "#z#"..sufijo
end
if nexo == "g" then
return "~j~"..sufijo
end
if nexo == "gu" then
return "g~"..sufijo.."~"
end
if nexo == "qu" then
return "~c~"..sufijo
end
if nexo == "C" then
return "~zc~"..sufijo
end
end
if find(sufijo, "^[aeoáéó]") then
if nexo == "gü" then
return "g~uy~"..sufijo
end
if nexo == "u" then
return "u~y~"..sufijo
end
end
if find(sufijo, "^i[aeoáéó]") then
if (nexo == "ñ" or nexo == "ll") then
return "~"..nexo..sub(sufijo, 2).."~"
end
if nexo == "gü" then
return "g~uy~"..sub(sufijo, 2)
end
if nexo == "u" then
return "u~y~"..sub(sufijo, 2)
end
if nexo == "e" then
return nexo.."~y~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[^aeiouáéíóú]") then
if nexo == "e" then
return nexo.."~í~"..sub(sufijo, 2)
end
end
if find(sufijo, "^i[eé]") then
if find(nexo, "u#$") then -- ir --> fuera (subj)
return nexo..sub(sufijo, 2)
end
if nexo == "#j#" or nexo == "~j~" then
return nexo..sub(sufijo, 2)
end
end
if find(sufijo, "^í$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~e~"
end
end
if find(sufijo, "^ió$") then
if nexo == "#j#" or nexo == "~j~" then
return nexo.."~o~"
end
end
if find(sufijo, "^[ie]r") then
if find(nexo, "^[~#]?[bdr]?r[~#]?$") then
return nexo..sub(sufijo, 3)
end
end
end
if nexo == "I" then
return "i"..sufijo -- sinéresis normal
end
if nexo == "C" then
return "c"..sufijo -- sin epéntesis
end
if nexo == "S" then -- mecer
return "c"..sufijo
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, nucleo_inf)
local nucleo_ = gsub(nucleo, "[~#]", "")
local nexosufijo_ = gsub(nexosufijo, "[~#]", "")
if find(nucleo_, "[yi]$") and find(nexosufijo_, "^i") then -- se juntan dos íes o y-i (ej. reír, freír, oír)
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1")
elseif find(nucleo_, "^[^áéíóú]-[aeiou]h?$") and find(nexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- sufijo con i/u tónica (caISTE, caIMOS, caIDO, oID, reHÚyo etc.)
return nucleo..gsub1(nexosufijo, "^([~#]?h?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleo_, "[^gq][aeiou]$") and find(nexosufijo_, "^i[aeiouáéíóú]") then -- se junta [aeiou]i[aeiouáéíóú] -> cambio a y (creYO) PERO [[chinguiar]] -> chinguIando
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~y~")
elseif find(nucleo_, "[aeiou]$") and find(nexosufijo_, "^id$") then -- reír -> reÍd, embaír -> embaÍd
return nucleo..gsub1(nexosufijo, "^([~#]?)i", "%1~í~")
elseif find(nucleo_, "^[^aeiouáéíóú]+$")
and (find(nexosufijo_, "^"..CONS.."?"..CONS.."?".."[iuü]?[áéó][iuü]?[ns]?$") or find(nexosufijo_, "^[íú][ns]?$")) then -- caso de dar, vos *d+ás, debo quitar la tilde
return nucleo..gsub1(nexosufijo, "[áéíóú]", function(v) return "~"..quitar_tilde[v].."~" end)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
local prefijo_ = gsub(prefijo, "[~#]", "")
local nucleonexosufijo_ = gsub(nucleonexosufijo, "[~#]", "")
if prefijo_ and find(prefijo_, "[aeiou]") and not find(prefijo_, "[áéíóú]") then
if find(prefijo_, "^[^áéíóú]-[aeiou]h?$") and find(nucleonexosufijo_, "^h?[iuü]"..CONS..CONS.."?[aeiou][iuü]?[ns]?$") then -- nucleonexosufijo con i/u tónica (rehacer -> rehíce)
return prefijo..gsub1(nucleonexosufijo, "^([~#]?h?[~#]?)([iuü])", function (a, v) return a.."~"..agregar_tilde[v].."~" end)
elseif find(nucleonexosufijo_, "^("..CONS.."*[iuü]?)([aeiou])([iuü]?[ns]?)$") then -- monosílabo: prever --> prevén
return prefijo..gsub1(nucleonexosufijo, "^([~#]?"..CONS.."*[~#]?[iuü]?[~#]?)([aeiou])([~#]?[iuü]?[~#]?[ns]?[~#]?)$", function(a, b, c) return a..agregar_tilde[b]..c end) -- ven --> prevén
end
end
return prefijo..nucleonexosufijo
end
local paradigmas_regulares = {
["ar"] = {
{"añunciar", {"iar$"}, { --necesidad de explicitar el diptongo, aunque esta variante es la que consideramos como la regular
}},
{"evacuar", {"cuar$"}, {
nexo = "cu"
}},
{"averiguar", {"guar$"}, {
nexo = "gu"
}},
{"complicar", {"car$"}, {
nexo = "c"
}},
{"llegar", {"gar$"}, {
nexo = "g"
}},
{"actuar", {"uar$"}, {
nexo = "u"
}},
{"realizar", {"zar$"}, {
nexo = "z"
}},
{"amar", {"ar$"}, {
}},
},
["er"] = {
{"ller", {"ller$"}, { -- Existe esto??
nexo = "ll"
}},
{"guer", {"guer$"}, { -- Existe esto??
nexo = "gu"
}},
{"güer", {"güer$"}, { -- Existe esto??
nexo = "gü"
}},
{"quer", {"quer$"}, { -- Existe esto??
nexo = "qu"
}},
{"parecer", {"[aeiou]cer$"}, {
nexo = "C"
}},
{"vencer", {"[^aeious]cer$"}, { -- los verbos en -scer NO entran en este paradigma (ver fosforescer o evanescer)
nexo = "c"
}},
{"leer", {"eer$"}, {
nexo = "e"
}},
{"proteger", {"ger$"}, {
nexo = "g"
}},
{"atañer", {"ñer$"}, {
nexo = "ñ"
}},
{"uer", {"uer$"}, { -- Existe esto??
nexo = "u"
}},
{"temer", {"er$"}, {
}},
},
["ir"] = {
{"producir", {"ducir$"}, { -- REVISAR
nucleo = "du",
nexo = "C",
ind_perf = {nexo = "~j~"},
subj_imp = {nexo = "~j~"},
}},
{"escabullir", {"llir$"}, {
nexo = "ll"
}},
{"distinguir", {"guir$"}, {
nexo = "gu"
}},
{"argüir", {"güir$"}, {
nexo = "gü"
}},
{"delinquir", {"quir$"}, {
nexo = "qu"
}},
{"lucir", {"[aeiou]cir$"}, {
nexo = "C"
}},
{"fruncir", {"[^aeious]cir$"}, {
nexo = "c"
}},
{"dirigir", {"gir$"}, {
nexo = "g"
}},
{"gruñir", {"ñir$"}, {
nexo = "ñ"
}},
{"construir", {"uir$"}, {
nexo = "u"
}},
{"partir", {"ir$"}, {
}},
},
["ír"] = {
{"reír", {"eír$"}, {
nucleo = "e",
alt = {"í-i"},
}},
{"ír", {"ír$"}, { -- para que oír no tire error
}},
}
}
local paradigmas_irregulares = {
["ar"] = {
{"andar", {"^d?e?s?andar$"}, { -- cuidado con mandar
nucleo = "and",
ind_perf = {nucleo = "anduv"},
subj_imp = {nucleo = "anduv"},
}},
{"dar", {"^d?e?s?dar$"}, { -- no pueden ir otros verbos como "andar o quedar"
nucleo = "d",
ind_pres = {{"doi", "do"}},
ind_perf = {sufijo_inf = "er"},
subj_pres = {nucleo = "de"},
subj_imp = {sufijo_inf = "er"},
}},
{"errar", {"^errar$"}, {
nucleo = "err",
alt = {"ye"},
}},
{"inhestar", {"inhestar$"}, {
alt = {"ie"},
part = {"inhiesto"}
}},
{"tar", {"^tar$"}, {
ind_pres = {{"toi", "to"}},
ind_perf = {nucleo = "tuv"},
subj_pres = {nucleo = "te"},
subj_imp = {nucleo = "tuv"},
imper = {nil, nil, {"tea"}, nil, {"tai"}, {"tean"}}
}},
{"enfriar", {"enfriar$"}, {
nexo = "i",
}},
--{"culiar", {"culiar$"}, { por precaución sacamos esto
-- nexo = "I"
--}},
{"aislar", {"aislar$"}, {
alt = {"í"}
}},
{"avergoñar", {"avergoñar$"}, {
alt = {"üe"}
}},
{"auñar", {"^auñar$"}, { -- REVISAR
alt = {"ú"}
}},
{"contar", {"contar$"}, {
alt = {"ue"}
}},
{"pensar", {"^pensar$"}, { -- no puede ir compensar
alt = {"ie"}
}},
},
["er"] = {
{"caber", {"^caber$"}, {
ind_pres = {{"quepo"}},
ind_fut = {nucleo = "ca", nexo = "#br#"},
ind_perf = {nucleo = "cup"},
subj_pres = {nucleo = "quep"},
subj_imp = {nucleo = "cup"},
cond = {nucleo = "ca", nexo = "#br#"},
}},
{"caer", {"caer$"}, { -- REVISAR http://ast.oslin.org/index.php?action=lemma&lemma=11064 hay alguna regla detrás de esto??
nucleo = "ca",
ind_pres = {{"caigo", "cayo"}, {"caes", "cayes"}, nil, {"caemos", "cayemos"}, {"caéis", "cayéis"}, {"caen", "cayen"}},
subj_pres = {nucleo = "caig"},
imper = {nil, nil, nil, {"caiga"}, {"caigamos"}, nil, {"caigan"}}
}},
{"cocer", {"cocer$"}, {
nucleo = "co",
nexo = "S", -- evitar C (epéntesis con zc)
alt = {"ue"},
}},
{"facer", {"[hfj]acer$"}, { -- REVISAR
nucleo = "a",
nexo = "S", -- evitar C (epéntesis con zc)
part = {"echu"},
ind_pres = {{"ago", "aigo"}},
ind_perf = {nucleo = "i"},
ind_fut = {nucleo = "a", nexo = "#dr#"},
subj_pres = {nucleo = "ag", nexo = ""},
subj_imp = {nucleo = "i"},
cond = {nucleo = "a", nexo = "#dr#"},
}},
{"haber", {"^haber$"}, {
ind_pres = {{"he"}, {"has"}, {"ha", "hai{IMPERSONAL}"}, {"hemos", "habemos"}, nil, {"han"}},
ind_perf = {nucleo = "hub"},
ind_fut = {nucleo = "ha", nexo = "#br#"},
subj_pres = {nucleo = "hay"},
subj_imp = {nucleo = "hub"},
cond = {nucleo = "ha", nexo = "#br#"},
imper = {nil, {"he{†}", "habe{†}"}, {"he{†}", "habe{†}"}, {"haya{†}"}, {"hayamos{†}"}, nil, {"hayan{†}"}},
}},
{"mecer", {"^r?e?mecer$"}, {
nexo = "S", -- evitar C (epéntesis con zc)
}},
{"morrer", {"morrer$"}, {
nucleo = "morr",
alt = {"ue"},
part = {"muertu"},
}},
{"goler", {"^goler$"}, {
alt = {"üe"},
}},
{"volver", {"olver$"}, {
nucleo = "olv",
alt = {"ue"},
part = {"ueltu"}
}},
{"placer", {"placer$"}, { -- REVISAR, existe esto??
nucleo = "pla",
ind_perf = {nil, nil, nil, {"plació", "plugo"}, nil, nil, {"placieron", "pluguieron"}},
subj_imp = {nil, nil, nil, {"placiera", "placiese", "pluguiera", "pluguiese"}, nil, nil, nil},
}},
{"poder", {"poder$"}, {
nucleo = "pod",
alt = {"ue"},
ger = {"pudiendo"},
ind_perf = {nucleo = "pud"},
ind_fut = {nucleo = "po", nexo = "#dr#"},
subj_imp = {nucleo = "pud"},
cond = {nucleo = "po", nexo = "#dr#"},
}},
{"poner", {"poner$"}, {
nucleo = "pon",
part = {"puesto"},
ind_pres = {{"pongo"}},
ind_perf = {nucleo = "pus"},
ind_fut = {nucleo = "pon", nexo = "#dr#"},
subj_pres = {nucleo = "pong"},
subj_imp = {nucleo = "pus"},
cond = {nucleo = "pon", nexo = "#dr#"},
imper = {nil, {"pon"}, {"ponga"}, nil, nil, {"pongan"}},
}},
{"proveer", {"proveer$"}, {
nucleo = "prov",
part = {"provisto", "proveído{†}"}
}},
{"querer", {"querer$"}, { -- REVISAR
nucleo = "quer",
alt = {"ie"},
ind_perf = {nucleo = "quis"},
ind_fut = {nucleo = "que", nexo = "#dr#"},
subj_imp = {nucleo = "quis"},
cond = {nucleo = "que", nexo = "#dr#"},
}},
{"raer", {"^raer$", "^rayer$"}, { -- no contraer, etc. REVISAR
ind_pres = {{"raigo", "rayo"}},
subj_pres = {nucleo = {"raig", "ray"}},
imper = {nil, nil, {"raiga", "raya"}, nil, {"raíi", "rayíi"}, {"raigan", "rayan"}}
}},
{"roer", {"roer$", "royer$"}, { -- REVISAR
nucleo = "ro",
ind_pres = {{"roigo", "royo"}},
subj_pres = {nucleo = {"roig", "roy"}},
imper = {nil, nil, {"roiga", "roya"}, nil, {"roíi", "royíi"}, {"roigan", "royan"}}
}},
{"romper", {"^romper$", "^arromper$"}, { -- no corromper, derromper, entrerromper
nucleo = "romp",
alt = {"ue"},
part = {"rotu"}
}},
{"saber", {"saber$"}, {
nucleo = "sab",
ind_pres = {{"sé"}},
ind_perf = {nucleo = "sup"},
ind_fut = {nucleo = "sa", nexo = "#br#"},
subj_pres = {nucleo = "sep"},
subj_imp = {nucleo = "sup"},
cond = {nucleo = "sa", nexo = "#br#"},
imper = {nil, nil, {"sepa"}, nil, nil, {"sepan"}}
}},
{"ser", {"^ser$"}, {
ind_pres = {{"soi", "so"}, {"yes"}, {"ye"}, {"somos"}, {"sois"}, {"son"}},
ind_imp = {{"yera"}, {"yeres"}, {"yera"}, {"yéramos", "yéremos"}, {"yerais", "yereis"}, {"yeren"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fostis", "fuestis", "fuistis"}, {"foron", "fueron"}},
subj_pres = {nucleo = {"sey", "sí"}},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: hay que agregar la variante con fo
imper = {nil, {"sé"}, {"sea"}, nil, nil, {"sean"}}
}},
{"tener", {"tener$", "^ter$"}, {
nucleo = "ten",
alt = {"ie"},
ind_pres = {{"tengo", "teo", "to"}},
ind_perf = {nucleo = {"tev", "tuv"}},
ind_fut = {nucleo = "ten", nexo = "#dr#"},
subj_pres = {nucleo = "teng"},
subj_imp = {nucleo = "tuv"},
cond = {nucleo = "ten", nexo = "#dr#"},
imper = {nil, {"ten"}, {"tenga"}, nil, nil, {"tengan"}}
}},
{"traer", {"traer$", "trayer$"}, {
nucleo = "tra",
ind_pres = {{"traigo"}},
ind_perf = {nucleo = "tra", nexo = "#j#"},
subj_pres = {nucleo = "traig"},
subj_imp = {nucleo = "tra", nexo = "#j#"},
imper = {nil, nil, nil, {"traiga"}, {"traigamos"}, nil, {"traigan"}}
}},
{"ver", {"^ver$", "^antever$", "^entrever$", "^prever$", "^rever$"}, {
nucleo = "v",
part = {"visto"},
ind_pres = {{"veo"}},
subj_pres = {nucleo = "ve"},
imper = {nil, nil, {"vea"}, nil, nil, {"vean"}}
}},
{"yacer", {"^yacer$", "^subyacer$"}, { -- REVISAR: existe esto?
nucleo = "yac",
nexo = "", -- evitar C (epéntesis con zc), lo voy a agregar manual
ind_pres = {{"yazco", "yazgo", "yago"}},
subj_pres = {nucleo = {"yazc", "yazg", "yag"}},
imper = {nil, {"yace", "yaz"}, {"yazca", "yazga", "yaga"}, nil, nil, {"yazcan", "yazgan", "yagan"}}
}},
{"mover", {"mover$"}, {
alt = {"ue"},
}},
{"entender", {"entender$"}, {
alt = {"ie"},
}},
},
["ir"] = {
{"asir", {"asir$"}, { -- REVISAR: existe esto
nucleo = "as",
ind_pres = {{"asgo"}},
subj_pres = {nucleo = "asg"},
imper = {nil, nil, {"asga"}, {"asgamos"}, nil, {"asgan"}}
}},
{"abrir", {"[^js]abrir$", "^abrir$"}, { -- abrir, cubrir y derivados, pero no "desabrir" ni "jabrir" (son regs.)
nucleo = "abr",
part = {"abiertu"}
}},
{"abrir", {"ubrir$"}, { -- Parte 2. NOTA: no pueto tomar "br" como núcleo porque el programa piensa que es monosílabo y pone mal las tildes (cf. [[entreabrir]], [[reabrir]])
nucleo = "ubr",
part = {"ubiertu"}
}},
-- para decir contemplo 4 casos:
-- 1. decir, redecir, entredecir, antedecir: lo normal, con el imperativo en "dí" (di)
-- 2. interdecir: similar a 1. pero el imperativo es interdice (no *interdí) --> esto no existe en ast creo
-- 3. bendecir, maldecir: agrego bendito, maldito al pp
-- 4. condecir, contradecir, desdecir, predecir: parto de 1 pero agrego el futuro regular que esta aceptado
{"dicir", {"^dicir$", "^redicir$", "^entredicir$", "^antedicir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dichu"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = "d", nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
cond = {nucleo = "d", nexo=""},
imper = {nil, {"di"}, {"diga"}, nil, nil, {"digan"}}
}},
{"bendicir", {"bendicir$", "maldicir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"decíu{PART}", "ditu{ADJ}"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
imper = {nil, {"diz"}, {"diga"}, nil, nil, {"digan"}}
}},
{"predicir", {"dicir$"}, {
nucleo = "de",
nexo = "S", -- para evitar C (epéntesis con zc)
alt = {"i-i"},
part = {"dichu"},
ind_pres = {{"digo"}},
ind_perf = {nucleo = "di", nexo = "#j#"},
ind_fut = {nucleo = {"dec", "d"}, nexo=""},
subj_pres = {nexo = "#g#"},
subj_imp = {nexo = "#j#"},
cond = {nucleo = {"dec", "d"}, nexo=""},
imper = {nil, {"dí"}, {"diga"}, nil, nil, {"digan"}}
}},
{"erguir", {"^erguir$"}, {
nucleo = "er",
alt = {"ye-i", "i-i"},
}},
{"imprimir", {"imprimir$"}, {
nucleo = "imprim",
part = {"imprimíu{PART}", "impresu{ADJ}"}
}},
{"dir", {"^dir$"}, {
ind_pres = {{"voi", "vo"}, {"vas"}, {"va"}, {"vamos"}, {"vais"}, {"van"}},
ind_imp = {{"diba"}, {"dibas"}, {"diba"}, {"díbamos", "díbemos"}, {"dibais", "dibeis"}, {"diben"}},
ind_perf = {{"fui"}, {"fosti", "fuesti", "fuisti"}, {"foi", "fo"}, {"fomos", "fuemos", "fuimos"}, {"fuestis", "fuistis"}, {"foron", "fueron"}},
subj_pres = {{"fora", "vaiga", "vaya"}, {"vaigas", "vayas"}, {"fora", "vaiga", "vaya"}, {"vaigamos", "vayamos"}, {"vaigáis", "vayáis"}, {"vaigan", "vayan"}},
subj_imp = {nucleo = "", nexo = "#fu#"}, -- no puedo poner "u" porque obtendría "fuyera" -- REVISAR: faltan los otros nexos posibles
imper = {nil, {"ve"}, {"vaya"}, nil, nil, {"vayan"}}
}},
{"pudrir", {"pudrir$"}, { -- REVISAR: existe esto?
nucleo = "pudr",
part = {"podridu"}
}},
{"salir", {"salir$"}, {
nucleo = "sal",
ind_pres = {{"salgo"}},
ind_fut = {nucleo = "sal", nexo = "#dr#"},
subj_pres = {nucleo = "salg"},
cond = {nucleo = "sal", nexo = "#dr#"},
imper = {nil, {"sal"}, {"salga"}, nil, nil, {"salgan"}}
}},
{"escribir", {"scribir$"}, {
nucleo = "scrib",
part = {"scrito"}
}},
{"valir", {"valir$"}, {
nucleo = "val",
ind_pres = {{"valgo"}},
ind_fut = {nucleo = "val", nexo = "#dr#"},
subj_pres = {nucleo = "valg"},
cond = {nucleo = "val", nexo = "#dr#"},
imper = {nil, nil, {"valga"}, nil, nil, {"valgan"}}
}},
{"venir", {"venir$"}, {
nucleo = "ven",
alt = {"ie-i"},
ind_pres = {{"vengo"}},
ind_fut = {nexo = "#dr#"},
ind_perf = {nucleo = "vin"}, -- REVISAR: la 3s es él vIEno, no *vino, hay más verbos así?
subj_pres = {nucleo = "veng"},
cond = {nexo = "#dr#"},
imper = {nil, {"ven"}, {"venga"}, nil, nil, {"vengan"}}
}},
{"sentir", {"sentir$"}, { -- discernir entra en este paradigma tmb.
alt = {"ie-i"}
}},
{"podrir", {"podrir$"}, {
alt = {"u-u"},
}},
{"reunir", {"reunir$"}, {
alt = {"ú"}
}},
{"prohibir", {"prohibir$"}, {
alt = {"í"}
}},
{"rehenchir", {"rehenchir$"}, {
alt = {"í-i"}
}},
{"dormir", {"dormir$"}, {
alt = {"ue-u"}
}},
},
["ír"] = {
{"desvaír", {"desvaír$"}, { -- hay más verbos en -air? no podemos considerarlo como regla general
ind_pres = {{"desvayo"}},
subj_pres = {nucleo = "desvay"},
imper = {nil, nil, nil, {"desvaya"}, {"desvayamos"}, nil, {"desvayan"}}
}},
{"freír", {"freír$"}, {
nucleo = "fre",
part = {"frito{PART/ADJ}", "freído{PART}"},
}},
{"oír", {"oír$"}, {
nucleo = "o",
alt = {"oy"},
ger = {"oyendo"},
ind_pres = {{"oigo"}},
subj_pres = {nucleo = "oig"},
imper = {nil, nil, nil, {"oiga"}, {"oigamos"}, nil, {"oigan"}}
}},
},
}
local alt_info = {
["ar"] = {
["í"] = {"aislar", "i", "í"}, -- tb. descafeinar
["ú"] = {"aunar", "u", "ú"}, -- tb. rehusar
["ie"] = {"pensar", "e", "ie"},
["ue"] = {"contar", "ou", "ue"}, -- también jugar
["üe"] = {"agorar", "o", "üe"},
["hue"] = {"desosar", "ou", "hue"},
["ye"] = {"errar", "e", "ye"},
},
["er"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["ie"] = {"entender", "e", "ie"},
["ue"] = {"mover", "o", "ue"},
["üe"] = {"goler", "o", "üe"},
},
["ir"] = {
["i"] = {"???", "e", "i"}, -- REVISAR: existe esto??
["í"] = {"prohibir", "i", "í"},
["í-i"] = {"rehenchir", "e", "í", "i"},
-- ["i-i"] = {"pedir", "e", "i", "i"},
--["ie"] = {"discernir", "ei", "ie"}, -- por las dudas también la i, por inquirir
["ie-i"] = {"sentir", "ei", "ie", "i"}, -- inquirir
["u"] = {"???", "o", "u", "u"},
["ú"] = {"reunir", "u", "ú"},
["u-u"] = {"podrir", "o", "u", "u"}, -- REVISAR: existe esto??
["ue-u"] = {"dormir", "o", "ue", "u"},
["ye-i"] = {"erguir", "e", "ye", "i"},
},
["ír"] = {
["í-i"] = {"reír", "e", "í", "i"},
["oy"] = {"oír", "o", "oy", "oy"},
}
}
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijo_inf = conjinfo[forma].sufijo_inf or conjinfo.sufijo_inf
if sufijo_inf == "ar" and conjinfo[forma].nucleo then
sufijo_inf = "er" -- echo mano a los sufijos de la otra conjugación, más que nada aplica a verbos como andar -> ANDUViera
end
local sufijos_ = obtener_sufijos(sufijo_inf, (forma == "ind_perf" and conjinfo[forma].nucleo) and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleos2
elseif forma == "part" then
nucleos = conjinfo.nucleo_inf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos1}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleo_inf, conjinfo.nucleos2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleos2, conjinfo.nucleos1}
elseif forma == "subj_imp" then
local n = conjinfo.nucleos2
nucleos = {n, n, n, n, n, n}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleos1, conjinfo.nucleos1, conjinfo.nucleos2, conjinfo.nucleo_inf, conjinfo.nucleos1}
else
local n = conjinfo.nucleo_inf
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for j, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[1], sufijo_inf)
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(nucleo, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
end
return
end
for i = YO, ELLOS do
if conjinfo[forma][i] then
for j, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..tostr[i]], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
for _, n in ipairs(nucleos[i]) do
local nexosufijo, nexosufijo2 = combinar_nexo_sufijo(nexo, sufijos_[k], sufijo_inf)
insert_if_not(conjugado[forma..tostr[i]], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo, conjinfo.nucleo_inf[1])))
if nexosufijo2 then
insert_if_not(conjugado[forma..tostr[i]], combinar_prefijo_nucleonexosufijo(prefijo, combinar_nucleo_nexosufijo(n, nexosufijo2, conjinfo.nucleo_inf[1])))
end
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local arr = res[forma]
local t = {}
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["indirecto"] = {tipo = "bool"},
["alt"] = {lista = true},
["nucleopres1"] = {lista = true},
["nucleopret3"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["núcleopret3"] = {alias_de = "nucleopret3"},
["paradigma"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([sSnN][íu]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, pron, art, resto = match(r1, "^("..LETRA.."*[aeiáéí]r)(s?e?)(l?[aeo]?s?)(.-)$")
local resto_pl = args["plural"] and match(args["plural"], "^[sSnN]?[ío]?"..ESPACIO.."?"..LETRA.."*[aeiáéí]rs?e?l?[aeo]?s?(.-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
v = gsub(v, "^(%S*)ár$", "%1ar") -- pronominales
v = gsub(v, "^(%S*)ér$", "%1er") -- pronominales
v = gsub(v, "^(%S*[^aeo])ír$", "%1ir") -- grafías anticuadas
local sufijo_inf = match(v, "[aeií]r$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, math.max(1,
maxindex(args["paradigma"]),
maxindex(args["alt"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopret3"])) do
local conjinfo = {}
if find(v, "iar$") and (not args["paradigma"][N] or args["paradigma"][N] == "") then
error("Especifique el (los) paradigma(s) para los verbos en -iar (añunciar, enfriar)")
end
local encontre_irreg = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontre_irreg = true
break
end
end
if encontre_irreg then
break
end
end
local encontre_reg = false
for _,p in ipairs(paradigmas_regulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
local vacio = true
for k, v in pairs(p[3]) do
vacio = false
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
if vacio then
paradigmas_reconocidos[p[1]] = true -- caso de [[anunciar]]
end
encontre_reg = true
break
end
end
if encontre_reg then
break
end
end
assert(encontre_reg, "paradigma no reconocido")
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo or sufijo_inf
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
conjinfo.prefijo = ""
elseif not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
if not conjinfo.prefijo then -- caso en el que cambié el núcleo
conjinfo.prefijo = ""
end
conjinfo.nucleos1 = {}
conjinfo.nucleos2 = {}
conjinfo.alt = conjinfo.alt or {}
if args["alt"][N] then
insert(conjinfo.alt, args["alt"][N])
end
for i, a in ipairs(conjinfo.alt) do
if a ~= "REG" then
local n1, n2
local info = alt_info[sufijo_inf][a]
assert(info, "Valor de alt no reconocido: "..a)
local sust
n1, sust = gsubb(conjinfo.nucleo_inf, "^([^"..info[2].."]*)["..info[2].."]([^"..info[2].."]*)$", "%1#"..info[3].."#%2")
if info[4] then
n2, sust = gsubb(conjinfo.nucleo_inf, "^([^"..info[2].."]*)["..info[2].."]([^"..info[2].."]*)$", "%1#"..info[4].."#%2")
end
assert(sust, "Alternancia vocálica no reconocida")
insert_if_not(conjinfo.nucleos1, n1)
insert_if_not(conjinfo.nucleos2, n2)
paradigmas_reconocidos[info[1]] = true
es_irregular = true -- si tengo el alt será siemrpe irregular, indistintamente de si el paradigma del mismo índice es regular
else
insert_if_not(conjinfo.nucleos1, conjinfo.nucleo_inf)
end
end
if args["nucleopres1"][N] then
for k, v in pairs(alt_info[sufijo_inf]) do
if args["nucleopret3"][N] then
if v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
and gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[4]) == gsub1(args["nucleopret3"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
insert_if_not(conjinfo.nucleos2, args["nucleopret3"][N])
break
end
end
else
if not v[4] then
if gsub1(conjinfo.nucleo_inf, "^.*["..v[2].."].-$", v[3]) == gsub1(args["nucleopres1"][N], "^.*#([^#]+)#.*$", "%1")
then
es_irregular = true
paradigmas_reconocidos[v[1]] = true
insert_if_not(conjinfo.nucleos1, args["nucleopres1"][N])
break
end
end
end
end
end
if not conjinfo.nucleos1[1] then
conjinfo.nucleos1[1] = conjinfo.nucleo_inf
end
if not conjinfo.nucleos2[1] then
conjinfo.nucleos2[1] = conjinfo.nucleo_inf
end
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
conjinfo.v = v
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante)
local part_no_adj = {}
for _,e in ipairs(resultante.part) do
if find(e, 'PART') or not find(e, 'ADJ') then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl,impers=args["impersonal"]}
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for _,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for _,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local es_impersonal = args["impersonal"]
local es_indirecto = args["indirecto"]
if es_indirecto then
error("no implementado")
end
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local impers = args["impersonal"]
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
if args["indirecto"] then
error("No implementado aún")
else
fila_pronombres_ind = {"", "(ello)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", color=COLOR_IMPER, header=true, class="pc"}
end
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(ello)", "(ellos)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(ello)", "(ellos)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(que ello)", "(que ellos)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(ello)", "(ellos)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "yo", "tu", "él, vusté", "nosotros", "vosotros", "vustedes, ellos", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "yo", "tu", "él, vusté", "nosotros, nosotres, nós", "vosotros", "vustedes, ellos", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que yo", "que tu", "que él, vusté", "que nosotros", "que vosotros", "que vustedes, ellos", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tú)", "(vusté)", "(nosotros)", "(vosotros)", "(vustedes)", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, resultante.ind_pres1, resultante.ind_pres2, resultante.ind_pres3, resultante.ind_pres4, resultante.ind_pres5, resultante.ind_pres6}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, resultante.ind_imp1, resultante.ind_imp2, resultante.ind_imp3, resultante.ind_imp4, resultante.ind_imp5, resultante.ind_imp6}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, resultante.ind_perf1, resultante.ind_perf2, resultante.ind_perf3, resultante.ind_perf4, resultante.ind_perf5, resultante.ind_perf6}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, resultante.ind_pluperf1, resultante.ind_pluperf2, resultante.ind_pluperf3, resultante.ind_pluperf4, resultante.ind_pluperf5, resultante.ind_pluperf6}
t[12] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, resultante.ind_perf_comp1, resultante.ind_perf_comp2, resultante.ind_perf_comp3, resultante.ind_perf_comp4, resultante.ind_perf_comp5, resultante.ind_perf_comp6}
t[13] = {{"Futuro", color=COLOR_IND, header=true}, resultante.ind_fut1, resultante.ind_fut2, resultante.ind_fut3, resultante.ind_fut4, resultante.ind_fut5, resultante.ind_fut6}
t[14] = {{"Futuro compuesto", color=COLOR_IND, header=true}, resultante.ind_fut_comp1, resultante.ind_fut_comp2, resultante.ind_fut_comp3, resultante.ind_fut_comp4, resultante.ind_fut_comp5, resultante.ind_fut_comp6}
t[15] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, resultante.ind_anter1, resultante.ind_anter2, resultante.ind_anter3, resultante.ind_anter4, resultante.ind_anter5, resultante.ind_anter6}
t[16] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[17] = fila_pronombres_cond
t[18] = {{"Condicional simple", color=COLOR_COND, header=true}, resultante.cond1, resultante.cond2, resultante.cond3, resultante.cond4, resultante.cond5, resultante.cond6}
t[19] = {{"Condicional compuesto", color=COLOR_COND, header=true}, resultante.cond_comp1, resultante.cond_comp2, resultante.cond_comp3, resultante.cond_comp4, resultante.cond_comp5, resultante.cond_comp6}
t[20] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[21] = fila_pronombres_subj
t[22] = {{"Presente", color=COLOR_SUBJ, header=true}, resultante.subj_pres1, resultante.subj_pres2, resultante.subj_pres3, resultante.subj_pres4, resultante.subj_pres5, resultante.subj_pres6}
t[23] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, resultante.subj_imp1, resultante.subj_imp2, resultante.subj_imp3, resultante.subj_imp4, resultante.subj_imp5, resultante.subj_imp6}
t[24] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, resultante.subj_perf1, resultante.subj_perf2, resultante.subj_perf3, resultante.subj_perf4, resultante.subj_perf5, resultante.subj_perf6}
t[25] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, resultante.subj_pluperf1, resultante.subj_pluperf2, resultante.subj_pluperf3, resultante.subj_pluperf4, resultante.subj_pluperf5, resultante.subj_pluperf6}
t[26] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[27] = fila_pronombres_imper
if mostrar_imper then
t[28] = {{"Presente", color=COLOR_IMPER, header=true}, resultante.imper}
else
t[29] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[30] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[31] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "AN:Verbos irregulares")
-- si es irregular, los paradigmas regulares que no aportan nada de información (los vacíos) no pueden estar
paradigmas_reconocidos["añunciar"] = nil
paradigmas_reconocidos["amar"] = nil
paradigmas_reconocidos["temer"] = nil
paradigmas_reconocidos["partir"] = nil
paradigmas_reconocidos["ír"] = nil
else
insert(cats, "AN:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "AN:Verbos del paradigma "..p)
end
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "AN:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "AN:Verbos terciopersonales")
end
if find(impers, "^ind") then
insert(cats, "AN:Verbos de objeto indirecto")
end
if defectivo then
insert(cats, "AN:Verbos defectivos")
end
if sufijo_inf == "ar" then
insert(cats, "AN:Verbos de la primera conjugación")
elseif sufijo_inf == "er" then
insert(cats, "AN:Verbos de la segunda conjugación")
else -- será ir o ír, ya fue chequeado antes
insert(cats, "AN:Verbos de la tercera conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
q14w0e60l5cusvsrqllapzqtb92bvlm
Módulo:flex/fr
828
1056508
6307330
6294753
2026-08-06T00:34:12Z
TMCbot
164594
.
6307330
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos en francés
-- Autor: Tmagc
local export = {}
local max = math.max
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local size = m_table.size
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local CFLEX = u(0x302)
local DIER = u(0x308)
local vocales = "aàâeéèêiîoôuûäëïöüÿæœAÀÂEÉÈÊIÎOÔUÛÄËÏÖÜŸÆŒ"
local consonantes_salvo_cglryx = "bdfhjkmnpqstvwzçBDFHJKMNPQSTVWZÇ"
local V = "[" .. vocales .. "]"
local C = "[" .. consonantes_salvo_cglryx .. "cglryxCGLRYX]"
local C_SALVO_Y = "[" .. consonantes_salvo_cglryx .. "cglrxCGLRX]"
local C_SALVO_CGY = "[" .. consonantes_salvo_cglryx .. "lrxLRX]"
local C_SALVO_YX = "[" .. consonantes_salvo_cglryx .. "cglrCGLR]"
local C_SALVO_LRYX = "[" .. consonantes_salvo_cglryx .. "cgCG]"
local espacios = "%s"
local espacios_o_guiones = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local ESPACIO_O_GUION = "["..espacios_o_guiones.."]"
local LETRA = "[^"..espacios.."]"
local function es_locucion(tit, cop)
return find(tit, LETRA..ESPACIO_O_GUION..LETRA) or (cop ~= nil and find(tit, LETRA..ESPACIO_O_GUION..LETRA))
end
local function try(p, rx, pl, f, fpl, femenino)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if not pl then
return {m={p2}, p={}, f={}, fp={}}
end
if not femenino or not f then
if pl == sub(rx, 1, -2) then
return {m={p2}, p={}, f={}, fp={}}
else
return {m={p2}, p={gsub1(p, rx, "~"..pl.."~")}, f={}, fp={}}
end
end
return {m={p2}, p={gsub1(p, rx, "~"..pl.."~")}, f={gsub1(p, rx, "~"..f.."~")}, fp={gsub1(p, rx, "~"..fpl.."~")}}
end
-- https://fr.wiktionary.org/wiki/Annexe:Pluriels_irr%C3%A9guliers_en_fran%C3%A7ais
-- https://fr.wiktionary.org/wiki/Module:fr-flexion
-- https://dictionnaire.lerobert.com/guide/feminin-des-noms
-- https://www.alloprof.qc.ca/fr/eleves/bv/francais/le-pluriel-des-noms-f1489
-- https://web.unica.it/unica/protected/409843/0/def/ref/MAT407472/s
local function flexionar_palabra(p, g)
local femenino = g == "mf"
local changed = try(p, "ieur$", "ieurs", "ieure", "ieures", femenino) or
try(p, "teur$", "teurs", "trice", "trices", femenino) or
try(p, "ain$", "ains", "aine", "aines", femenino) or
try(p, "eau$", "eaux", "elle", "elles", femenino) or
try(p, "eux$", "eux", "euse", "euses", femenino) or
try(p, "eur$", "eurs", "euse", "euses", femenino) or -- CUIDADO: multiples excepciones
try(p, "oeu$", "oeux", "oeue", "oeues", femenino) or -- grafía no estándar, se repite abajo
try(p, "al$", "aux", "ale", "ales", femenino) or
try(p, "an$", "ans", "ane", "anes", femenino) or -- no duplico porque es más común la consonante simple
try(p, "el$", "els", "elle", "elles", femenino) or
try(p, "en$", "ens", "enne", "ennes", femenino) or
try(p, "er$", "ers", "ère", "ères", femenino) or
try(p, "et$", "ets", "ette", "ettes", femenino) or -- agregar excepciones
try(p, "gu$", "gus", "güe", "gües", femenino) or
try(p, "if$", "ifs", "ive", "ives", femenino) or
try(p, "on$", "ons", "onne", "onnes", femenino) or -- excepciones?
try(p, "[aeœ]u$", "%0x", "%0e", "%0es", femenino) or
try(p, "f$", "fs", "ve", "ves", femenino) or
try(p, "p$", "ps", "ve", "ves", femenino) or
try(p, "c$", "cs", "que", "ques", femenino) or -- REVISAR
try(p, "x$", "x", "se", "ses", femenino) or
try(p, "s$", "s", "se", "ses", femenino) or -- agregar excepciones que dupliquen la s, si las hay
try(p, "z$", "z", "ze", "zes", femenino) or
try(p, "e$", "es", nil, nil, femenino) or
try(p, LETRA.."$", "%0s", "%0e", "%0es", femenino)
assert(changed, "No se pudo determinar la flexión de la palabra")
return changed
end
local function flexion_sust_adj(palabras, g, copulativa)
local a, separador, b
if copulativa == true or copulativa == false then
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO_O_GUION..")("..LETRA.."+)$")
else
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
end
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g)
local flex2 = copulativa and flexionar_palabra(b, g) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto
if copulativa == false then
p, resto = match(palabras, "^(%-?[^"..espacios_o_guiones.."]+)(.-)$")
else
p, resto = match(palabras, "^("..LETRA.."+)(.-)$")
end
local flex = flexionar_palabra(p, g)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif es_locucion(title, args["cop"]) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "FR:Locuciones sustantivas" or "FR:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "FR:Locuciones adjetivas" or "FR:Adjetivos")
end
local sufijos = {
{ -- er
["ger"] = {"ant"},
["part"] = {"é"},
["ind_pres"] = {"e", "es", "e", "ons", "ez", "ent"},
["ind_imp"] = {"ais", "ais", "ait", "ions", "iez", "aient"},
["ind_perf"] = {"ai", "as", "a", "âmes", "âtes", "èrent"},
["fut"] = {"erai", "eras", "era", "erons", "erez", "eront"},
["subj_pres"] = {"e", "es", "e", "ions", "iez", "ent"},
["subj_imp"] = {"asse", "asses", "ât", "assions", "assiez", "assent"},
["cond"] = {"erais", "erais", "erait", "erions", "eriez", "eraient"},
["imper"] = {nil, "e", nil, "ons", "ez", nil}
},
{ -- ir, re
["ger"] = {"ant"},
["part"] = {""},
["ind_pres"] = {"s", "s", "t", "ons", "ez", "ent"},
["ind_pres_alt"] = {"e", "es", "e", "ons", "ez", "ent"},
["ind_imp"] = {"ais", "ais", "ait", "ions", "iez", "aient"},
["ind_perf"] = {"s", "s", "t", CFLEX.."mes", CFLEX.."tes", "rent"},
["ind_perf_alt"] = {"ai", "as", "a", "âmes", "âtes", "èrent"},
["fut"] = {"ai", "as", "a", "ons", "ez", "ont"},
["subj_pres"] = {"e", "es", "e", "ions", "iez", "ent"},
["subj_imp"] = {"sse", "sses", CFLEX.."t", "ssions", "ssiez", "ssent"},
["subj_imp_alt"] = {"asse", "asses", "ât", "assions", "assiez", "assent"},
["cond"] = {"ais", "ais", "ait", "ions", "iez", "aient"},
["imper"] = {nil, "s", nil, "ons", "ez", nil},
["imper_alt"] = {nil, "e", nil, "ons", "ez", nil}
},
}
local nucleos = {
["er"] = {
},
["ër"] = {
},
["ir"] = {
nucleopres1 = {"-i"},
nucleopres2 = {"-iss"},
nucleopres3 = {"-iss"},
nucleosubj1 = {"-iss"},
nucleosubj2 = {"-iss"},
nucleoperf = {"-i"},
nucleofut = {"-ir"},
},
["ïr"] = {
nucleopres1 = {"-ï"},
nucleopres2 = {"-ïss"},
nucleopres3 = {"-ïss"},
nucleosubj1 = {"-ïss"},
nucleosubj2 = {"-ïss"},
nucleoperf = {"-ï"},
nucleofut = {"-ïr"}
},
["re"] = {
nucleoperf = {"-i"},
nucleofut = {"-r"},
},
}
local auxiliar = {
["avoir"] = {
["inf_comp"] = {"avoir"},
["ger_comp"] = {"en (ayant)"},
["ind_perf_comp"] = {"ai", "as", "a", "avons", "avez", "ont"},
["ind_pluperf"] = {"avais", "avais", "avait", "avions", "aviez", "avaient"},
["ind_anter"] = {"eus", "eus", "eut", "eûmes", "eûtes", "eurent"},
["fut_comp"] = {"aurai", "auras", "aura", "aurons", "aurez", "auront"},
["cond_comp"] = {"aurais", "aurais", "aurait", "aurions", "auriez", "auraient"},
["subj_perf"] = {"aie", "aies", "ait", "ayons", "ayez", "aient"},
["subj_pluperf"] = {"eusse", "eusses", "eût", "eussions", "eussiez", "eussent"},
},
["etre"] = {
["inf_comp"] = {"être"},
["ger_comp"] = {"en (étant)"},
["ind_perf_comp"] = {"suis", "es", "est", "sommes", "êtes", "sont"},
["ind_pluperf"] = {"étais", "étais", "était", "étions", "étiez", "étaient"},
["ind_anter"] = {"fus", "fus", "fut", "fûmes", "fûtes", "furent"},
["fut_comp"] = {"serai", "seras", "sera", "serons", "serez", "seront"},
["cond_comp"] = {"serais", "serais", "serait", "serions", "seriez", "seraient"},
["subj_perf"] = {"sois", "sois", "soit", "soyons", "soyez", "soient"},
["subj_pluperf"] = {"fusse", "fusses", "fût", "fussions", "fussiez", "fussent"},
}
}
local function obtener_sufijos(sufijo_inf, forma)
if sufijo_inf == "er" or sufijo_inf == "ër" then
return sufijos[1][forma]
else
return sufijos[2][forma]
end
end
local JE, TU, IL, NOUS, VOUS, ILLS = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"je/j'", "tu", "il, elle, on", "nous", "vous", "ils/elles"}
local PRONOMBRES_SUBJ = {"que je/j'", "que tu", "qu'il, qu'elle, qu'on", "que nous", "que vous", "qu'ils, qu'elles"}
local PRONOMBRES_IMP = {"―", "(tu)", "―", "(nous)", "(vous)", "―"}
local IMPERSONALES = {"", "", "", "il, elle", "", "", "ils, elles"}
local IMPERSONALES_SUBJ = {"", "", "", "qu'il, qu'elle", "", "", "qu'ils, qu'elles"}
local REFLEXIVOS_ANTEPUESTOS = {"me", "te", "se", "nous", "vous", "se"}
local REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS = {"m'", "t'", "s'", "nous ", "vous ", "s'"}
local REFLEXIVOS_POSPUESTOS = {"-me", "-toi", "-se", "-nous", "-vous", "-se"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
["ind_pres"] = true,
["ind_imp"] = true,
["ind_perf"] = true,
["fut"] = true,
["subj_pres"] = true,
["subj_imp"] = true,
["cond"] = true,
["imper"] = true,
}
local formas_no_personales_compuestas = {
["inf_comp"] = true,
["ger_comp"] = true,
}
local formas_personales_compuestas = {
["ind_perf_comp"] = true,
["ind_pluperf"] = true,
["ind_anter"] = true,
["fut_comp"] = true,
["cond_comp"] = true,
["subj_perf"] = true,
["subj_pluperf"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
elseif find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
-- NOTA: los siguientes verbos no forman paradigma aparte, ora porque solamente
-- presentan mutaciones fonéticas que no se escriben, ora porque pueden ser
-- representados como una combinación de paradigmas existentes:
--[[
fluorescer, escer$
pailler, iller$
rocouier, ouier$
abréyer, éyer$
planchéier, éier$
créer, éer$
simplifier, ier$
paranoïer, ïer$
tuer, uer$
argüer, üer$
--]]
local paradigmas_regulares1 = {
["er"] = {
{"modeler", {"eler$"}, { -- todos salvo appeler
alternar = "el",
}},
{"acheter", {"eter$"}, { -- todos salvo jeter
alternar = "et",
}},
{"beder", {"e"..C_SALVO_YX.."er$"}, {
alternar = "e"
}},
{"beder", {"e"..C_SALVO_LRYX.."[lr]er$"}, { -- [[sevrer]], pero no -ller, -rrer, -rler ([[perler]])
alternar = "e"
}},
{"espérer", {"é"..C_SALVO_Y.."*"..C_SALVO_CGY.."er$"}, {
alternar = "é"
}},
{"espérer", {"é[gq]uer$"}, { -- [[alléguer]], [[disséquer]]
alternar = "é",
}},
{"espérer", {"é[cgï]er$"}, { -- [[capéïer]], [[rapiécer]]
alternar = "é",
}},
{"aimer", {"cobayer$"}, { -- única excepción que no admite i
}},
{"payer", {"ayer$"}, { -- y o i
alternar = "ay",
}},
{"noyer", {"[ou]yer$"}, { -- solo i
alternar = "y",
}},
},
["ër"] = {
},
["ir"] = {
},
["ïr"] = {
},
["re"] = {
},
}
local paradigmas_regulares2 = {
["er"] = {
{"commencer", {"cer$"}, {
nexo = "c"
}},
{"changer", {"ger$"}, {
nexo = "g",
}},
{"aimer", {"er$"}, {
}},
},
["ër"] = {
{"arguër", {"uër$"}, {
nexo = "u",
}},
},
["ir"] = {
{"finir", {"ir$"}, {
}},
},
["ïr"] = {
{"amuïr", {"ïr$"}, {
}},
},
["re"] = {
{"vendre", {"re$"}, {
}},
},
}
local paradigmas_irregulares = {
["er"] = {
{"envoyer", {"envoyer$"}, {
nucleofut = {"enverr"},
}},
{"appeler", {"appeler$"}, {
alternar = "EL"
}},
{"jeter", {"jeter$"}, {
alternar = "ET"
}},
{"aller", {"aller$"}, {
sufijo_inf = "ir",
nucleopres1 = {"va"},
nucleopres2 = {"all"},
nucleoperf = {"all"},
nucleofut = {"ir"},
part = {"allé"},
nucleosubj1 = {"aill"},
nucleosubj2 = {"all"},
ind_pres = {nil, {"vas"}, {"va"}, nil, nil, {"vont"}},
imper = {nil, {"va"}},
ind_perf = {alt=true},
subj_imp = {alt=true}
}},
},
["ër"] = {
},
["ir"] = {
{"faillir", {"^faillir$"}, {
nucleopres1 = {"fau"},
nucleopres2 = {"faill"},
nucleopres3 = {"faill"},
nucleoperf = {"failli"},
nucleofut = {"faudr", "faillir"},
ind_pres = {{"faux"}, {"faux"}},
imper = {nil, {"faux"}}
}},
{"défaillir", {"faillir$"}, {
nucleo = "ill",
nucleopres1 = {"ill"},
nucleoperf = {"illi"},
nucleofut = {"illir"},
ind_pres = {alt=true},
imper = {alt=true}
}},
{"saillir", {"aillir$", "cueillir$"}, {
nucleo = "ill",
nucleopres1 = {"ill"},
nucleoperf = {"illi"},
nucleofut = {"illir", "iller"},
ind_pres = {alt=true},
imper = {alt=true}
}},
{"bouillir", {"ouillir$"}, {
nucleopres1 = {"ou"},
nucleopres2 = {"ouill"},
nucleopres3 = {"ouill"},
nucleoperf = {"ouilli"},
}},
{"dormir", {"dormir$"}, {
nucleopres1 = {"dor"},
nucleopres2 = {"dorm"},
nucleopres3 = {"dorm"},
nucleoperf = {"dormi"},
}},
{"dormir", {"partir$", "sortir$", "sentir$", "mentir$", "repentir$"}, {
nucleo = "t",
nucleopres1 = {""},
nucleopres2 = {"t"},
nucleopres3 = {"t"},
nucleoperf = {"ti"},
}},
{"dormir", {"servir$"}, {
nucleo = "v",
nucleopres1 = {""},
nucleopres2 = {"v"},
nucleopres3 = {"v"},
nucleoperf = {"vi"},
}},
{"vêtir", {"vêtir$"}, {
nucleopres1 = {"vêt"},
part = {"vêtu"}
}},
{"venir", {"enir$"}, {
nucleopres1 = {"ien"},
nucleopres2 = {"en"},
nucleopres3 = {"ienn"},
nucleoperf = {"in"},
nucleofut = {"iendr"},
part = {"enu"},
}},
{"férir", {"férir$"}, {
nucleo = false,
part = {"féru"}
}},
{"gésir", {"gésir$"}, {
nucleopres1 = {"gi"},
nucleopres2 = {"gis"},
nucleopres3 = {"gis"},
nucleoperf = {},
nucleofut = {},
nucleosubj1 = {},
nucleosubj2 = {}
}},
{"asseoir", {"asseoir$"}, {
nucleopres1 = {"assoi", "assied"},
nucleopres2 = {"assoy", "assey"},
nucleopres3 = {"assoi", "assey"},
nucleoperf = {"assi"},
nucleofut = {"assoir", "assiér"},
part = {"assis"},
impers = "36"
}},
{"surseoir", {"surseoir$"}, {
nucleopres1 = {"sursoi"},
nucleopres2 = {"sursoy"},
nucleopres3 = {"sursoi"},
nucleoperf = {"sursi"},
nucleofut = {"surseoir"},
part = {"sursis"},
impers = "36"
}},
{"seoir", {"seoir$", "soir$"}, { -- CUIDADO, -soir es una variante defectiva
nucleopres1 = {"sied"},
nucleopres2 = {"sey"},
nucleopres3 = {"sié"},
nucleoperf = {},
nucleofut = {"siér"},
impers = "36"
}},
{"échoir", {"^échoir$"}, {
nucleopres1 = {"échoi"},
nucleopres2 = {"échoy"},
nucleopres3 = {"échoi"},
nucleoperf = {"échu"},
nucleofut = {"échoir", "écherr"},
impers = "36"
}},
{"choir", {"choir$"}, {
nucleopres1 = {"choi"},
nucleopres2 = {"choy"},
nucleopres3 = {"choi"},
nucleoperf = {"chu"},
nucleofut = {"choir"},
ger = {"-"},
ind_imp = {{},{},{},{},{},{}},
subj_pres = {{},{},{},{},{},{}},
imper = {{},{},{},{},{},{}},
}},
{"prévaloir", {"prévaloir$"}, {
nucleopres1 = {"prévau"},
nucleopres2 = {"préval"},
nucleopres3 = {"préval"},
nucleoperf = {"prévalu"},
nucleofut = {"prévaudr"},
nucleosubj1 = {"préval"},
nucleosubj2 = {"préval"},
ind_pres = {{"prévaux"}, {"prévaux"}},
imper = {nil, {"prévaux"}}
}},
{"valoir", {"valoir$"}, {
nucleopres1 = {"vau"},
nucleopres2 = {"val"},
nucleopres3 = {"val"},
nucleoperf = {"valu"},
nucleofut = {"vaudr"},
nucleosubj1 = {"vaill"},
nucleosubj2 = {"val"},
ind_pres = {{"vaux"}, {"vaux"}},
imper = {nil, {"vaux"}}
}},
{"falloir", {"falloir$"}, {
nucleopres1 = {"fau"},
nucleopres2 = {"fall"},
nucleopres3 = {"fall"},
nucleoperf = {"fallu"},
nucleofut = {"faudr"},
nucleosubj1 = {"faill"},
impers = "3"
}},
{"vouloir", {"^vouloir$"}, {
nucleopres1 = {"veu"},
nucleopres2 = {"voul"},
nucleopres3 = {"veul"},
nucleoperf = {"voulu"},
nucleofut = {"voudr"},
nucleosubj1 = {"veuill"},
ind_pres = {{"veux"}, {"veux"}},
imper = {nil, {"veux", "veuille"}, nil, {"voulons", "veuillons"}, {"voulez", "veuillez"}}
}},
{"revouloir", {"ouloir$"}, {
nucleopres1 = {"eu"},
nucleopres2 = {"oul"},
nucleopres3 = {"eul"},
nucleoperf = {"oulu"},
nucleofut = {"oudr"},
nucleosubj1 = {"euill"},
ind_pres = {{"eux"}, {"eux"}},
imper = {nil, {"euille"}, nil, {"oulons"}, {"euillez"}}
}},
{"savoir", {"savoir$"}, {
nucleopres1 = {"sai"},
nucleopres2 = {"sav"},
nucleopres3 = {"sav"},
nucleoperf = {"su"},
nucleofut = {"saur"},
nucleosubj1 = {"sach"},
imper = {nil, {"sache"}, nil, {"sachons"}, {"sachez"}},
ger = {"sachant"}
}},
{"avoir", {"avoir$"}, {
nucleopres1 = {"a"},
nucleopres2 = {"av"},
nucleoperf = {"eu"},
nucleofut = {"aur"},
nucleosubj1 = {"ai"},
nucleosubj2 = {"ay"},
ger = {"ayant"},
ind_pres = {{"ai"}, {"as"}, {"a"}, nil, nil, {"ont"}},
subj_pres = {nil, nil, {"ait"}, {"ayons"}, {"ayez"}},
imper = {nil, {"aie"}, nil, {"ayons"}, {"ayez"}}
}},
--{"ramentevoir", {"ramentevoir$"}, {
--}},
{"recevoir", {"cevoir$"}, {
nucleopres1 = {"çoi"},
nucleopres2 = {"cev"},
nucleopres3 = {"çoiv"},
nucleoperf = {"çu"},
nucleofut = {"cevr"}
}},
{"devoir", {"^devoir$"}, {
nucleopres1 = {"doi"},
nucleopres2 = {"dev"},
nucleopres3 = {"doiv"},
nucleoperf = {"dû"},
}},
{"redevoir", {"devoir$"}, {
nucleopres1 = {"doi"},
nucleopres2 = {"dev"},
nucleopres3 = {"doiv"},
nucleoperf = {"du"},
}},
{"pleuvoir", {"pleuvoir$"}, {
nucleopres1 = {"pleu"},
nucleopres2 = {"pleuv"},
nucleopres3 = {"pleuv"},
nucleoperf = {"plu"},
nucleofut = {"pleuvr"},
}},
{"mouvoir", {"^mouvoir$"}, {
nucleopres1 = {"meu"},
nucleopres2 = {"mouv"},
nucleopres3 = {"meuv"},
nucleoperf = {"mu"},
part = {"mû"},
nucleofut = {"mouvr"}
}},
{"promouvoir", {"mouvoir$"}, {
nucleopres1 = {"meu"},
nucleopres2 = {"mouv"},
nucleopres3 = {"meuv"},
nucleoperf = {"mu"},
nucleofut = {"mouvr"}
}},
{"pourvoir", {"pourvoir$"}, {
nucleopres1 = {"pourvoi"},
nucleopres2 = {"pourvoy"},
nucleopres3 = {"pourvoi"},
nucleoperf = {"puorvu"},
}},
{"pouvoir", {"pouvoir$"}, {
nucleopres1 = {"peu"},
nucleopres2 = {"pouv"},
nucleopres3 = {"peuv"},
nucleoperf = {"pu"},
nucleofut = {"pourr"},
nucleosubj1 = {"puiss"},
ind_pres = {{"peux", "puis"}, {"peux"}},
imper = {{},{},{},{},{},{}},
}},
{"voir", {"voir$"}, {
nucleopres1 = {"voi"},
nucleopres2 = {"voy"},
nucleopres3 = {"voi"},
nucleoperf = {"vi"},
nucleofut = {"verr"},
part = {"vu"},
}},
{"quérir", {"quérir$"}, {
nucleopres1 = {"quier"},
nucleopres2 = {"quér"},
nucleopres3 = {"quièr"},
nucleoperf = {"qui"},
nucleofut = {"querr"},
part = {"quis"}
}},
{"courir", {"courir$"}, {
nucleopres1 = {"cour"},
nucleopres2 = {"cour"},
nucleopres3 = {"cour"},
nucleoperf = {"couru"},
nucleofut = {"courr"},
}},
{"mourir", {"mourir$"}, {
nucleopres1 = {"meur"},
nucleopres2 = {"mour"},
nucleopres3 = {"meur"},
nucleoperf = {"mouru"},
nucleofut = {"mourr"},
part = {"mort"}
}},
{"ouvrir", {"ouvrir$", "ffrir$"}, {
nucleo = "r",
nucleopres1 = {"r"},
nucleoperf = {"ri"},
part = {"ert"},
ind_pres = {alt=true},
imper = {alt=true}
}},
{"issir", {"^issir$"}, {
nucleopres1 = {"is"},
nucleopres2 = {"iss"},
nucleopres3 = {"iss"},
part = {"issu"},
impers = "36"
}},
{"fuir", {"fuir$"}, {
nucleopres1 = {"fui"},
nucleopres2 = {"fuy"},
nucleopres3 = {"fui"},
nucleoperf = {"fui"},
}},
},
["ïr"] = {
{"haïr", {"haïr$"}, {
nucleopres1 = {"-i"},
nucleopres2 = {"-ïss"}, -- necesito volver a poner los valores por defecto para que no propague nucleopres1
nucleopres3 = {"-ïss"},
nucleosubj1 = {"-ïss"},
nucleosubj2 = {"-ïss"},
}},
{"ouïr", {"ouïr$"}, {
nucleopres1 = {"ouï", "oi"},
nucleopres2 = {"ouïss", "oy"},
nucleopres3 = {"ouïss", "oi"},
nucleoperf = {"ouï"},
nucleofut = {"ouïr", "oir", "orr"}
}},
},
["re"] = {
{"vaincre", {"cre$"}, {
nucleo = "c",
nucleopres1 = {"c"},
nucleopres2 = {"qu"},
nucleopres3 = {"qu"},
nucleoperf = {"qui"},
part = {"cu"},
}},
{"prendre", {"prendre$"}, {
nucleopres1 = {"prend"},
nucleopres2 = {"pren"},
nucleopres3 = {"prenn"},
nucleoperf = {"pri"},
part = {"pris"},
}},
{"peindre", {"indre$"}, {
nucleopres1 = {"in"},
nucleopres2 = {"ign"},
nucleopres3 = {"ign"},
nucleoperf = {"igni"},
part = {"int"}
}},
{"coudre", {"coudre$"}, {
nucleopres1 = {"coud"},
nucleopres2 = {"cous"},
nucleopres3 = {"cous"},
nucleoperf = {"cousi"},
part = {"cousu"},
}},
{"moudre", {"moudre$"}, {
nucleopres1 = {"moud"},
nucleopres2 = {"moul"},
nucleopres3 = {"moul"},
nucleoperf = {"moulu"},
}},
{"résoudre", {"résoudre$"}, {
nucleopres1 = {"résou"},
nucleopres2 = {"résolv"},
nucleopres3 = {"résolv"},
nucleoperf = {"résolu"},
}},
{"absoudre", {"soudre$"}, {
nucleopres1 = {"sou"},
nucleopres2 = {"solv"},
nucleopres3 = {"solv"},
nucleoperf = {"solu"},
part = {"sous"}
}},
{"faire", {"faire$"}, {
nucleopres1 = {"fai"},
nucleopres2 = {"fais"},
nucleopres3 = {"fais"},
nucleoperf = {"fi"},
nucleofut = {"fer"},
part = {"fait"},
nucleosubj1 = {"fass"},
ind_pres = {nil, nil, nil, nil, {"faites"}, {"font"}},
imper = {nil, nil, nil, nil, {"faites"}}
}},
{"plaire", {"plaire$"}, {
nucleopres1 = {"plai"},
nucleopres2 = {"plais"},
nucleopres3 = {"plais"},
nucleoperf = {"plu"},
}},
{"distraire", {"raire$"}, {
nucleopres1 = {"rai"},
nucleopres2 = {"ray"},
nucleopres3 = {"rai"},
nucleoperf = {"ray"},
part = {"rait"},
ind_perf = {alt=true},
subj_imp = {alt=true}
}},
{"taire", {"taire$"}, {
nucleopres1 = {"tai"},
nucleopres2 = {"tais"},
nucleopres3 = {"tais"},
nucleoperf = {"tu"},
}},
{"circoncire", {"circoncire$"}, {
nucleopres1 = {"circonci"},
nucleopres2 = {"circoncis"},
nucleopres3 = {"circoncis"},
nucleoperf = {"circonci"},
part = {"circoncis"}
}},
{"dire", {"^dire$", "^redire$"}, {
nucleo = "di",
nucleopres1 = {"di"},
nucleopres2 = {"dis"},
nucleopres3 = {"dis"},
nucleoperf = {"di"},
part = {"dit"},
ind_pres = {nil, nil, nil, nil, {"dites"}},
imper = {nil, nil, nil, nil, {"dites"}},
}},
{"maudire", {"dire$"}, {
nucleopres1 = {"di"},
nucleopres2 = {"dis"},
nucleopres3 = {"dis"},
nucleoperf = {"di"},
part = {"dit"}
}},
{"suffire", {"suffire$"}, {
nucleopres1 = {"suffi"},
nucleopres2 = {"suffis"},
nucleopres3 = {"suffis"},
nucleoperf = {"suffi"},
}},
{"confire", {"confire$"}, {
nucleopres1 = {"confi"},
nucleopres2 = {"confis"},
nucleopres3 = {"confis"},
nucleoperf = {"confi"},
part = {"confit"}
}},
{"lire", {"lire$"}, {
nucleopres1 = {"li"},
nucleopres2 = {"lis"},
nucleopres3 = {"lis"},
nucleoperf = {"lu"},
}},
{"luire", {"luire$"}, {
nucleopres1 = {"lui"},
nucleopres2 = {"luis"},
nucleopres3 = {"luis"},
nucleoperf = {"lui", "luisi"},
part = {"lui"}
}},
{"boire", {"boire$"}, {
nucleopres1 = {"boi"},
nucleopres2 = {"buv"},
nucleopres3 = {"boiv"},
nucleoperf = {"bu"},
}},
{"croire", {"croire$"}, {
nucleopres1 = {"croi"},
nucleopres2 = {"croy"},
nucleopres3 = {"croi"},
nucleoperf = {"cru"},
}},
{"écrire", {"crire$"}, {
nucleopres1 = {"cri"},
nucleopres2 = {"criv"},
nucleopres3 = {"criv"},
nucleoperf = {"crivi"},
part = {"crit"}
}},
{"frire", {"frire$"}, {
nucleopres1 = {"fri"},
nucleopres2 = {"fri"},
nucleopres3 = {"fri"},
nucleoperf = {"fri"},
part = {"frit"},
ind_imp = {{},{},{},{},{},{}},
ind_perf = {{},{},{},{},{},{}},
fut = {{},{},{},{},{},{}},
cond = {{},{},{},{},{},{}},
subj_pres = {{},{},{},{},{},{}},
subj_imp = {{},{},{},{},{},{}},
imper = {{},{},{},{},{},{}},
impers = "sg"
}},
{"rire", {"rire$"}, {
nucleopres1 = {"ri"},
nucleopres2 = {"ri"},
nucleopres3 = {"ri"},
nucleoperf = {"ri"},
}},
{"bruire", {"bruire$"}, {
nucleopres1 = {"bruis"},
nucleopres2 = {"bruiss"},
nucleopres3 = {"bruiss"},
nucleoperf = {"brui"},
impers = "36"
}},
{"nuire", {"nuire$"}, {
nucleopres1 = {"nui"},
nucleopres2 = {"nuis"},
nucleopres3 = {"nuis"},
nucleoperf = {"nuisi"},
part = {"nui"}
}},
{"cuire", {"uire$"}, {
nucleopres1 = {"ui"},
nucleopres2 = {"uis"},
nucleopres3 = {"uis"},
nucleoperf = {"uisi"},
part = {"uit"}
}},
{"clore", {"clore$"}, {
nucleopres1 = {"clo"},
nucleopres2 = {"clos"},
nucleopres3 = {"clos"},
nucleoperf = {},
part = {"clos"}
}},
{"rompre", {"pre$"}, {
nucleopres1 = {"p"},
nucleopres2 = {"p"},
nucleopres3 = {"p"},
nucleoperf = {"pi"},
part = {"pu"}
}},
{"être", {"^être$"}, {
nucleopres1 = {"e"},
nucleopres2 = {"ét"},
nucleoperf = {"fu"},
nucleofut = {"ser"},
part = {"été"},
nucleosubj1 = {"soi"},
nucleosubj2 = {"soy"},
ind_pres = {{"suis"}, {"es"}, {"est"}, {"sommes"}, {"êtes"}, {"sont"}},
subj_pres = {{"sois"}, {"sois"}, {"soit"}, {"soyons"}, {"soyez"}},
imper = {nil, {"sois"}, nil, {"soyons"}, {"soyez"}}
}},
{"naitre", {"^na[iî]tre$", "rena[iî]tre$"}, { -- no connaitre, va en el paradigma de abajo
nucleo = "nait",
nucleopres1 = {"nai"},
nucleopres2 = {"naiss"},
nucleopres3 = {"naiss"},
nucleoperf = {"naqui"},
part = {"né"},
}},
{"paitre", {"a[iî]tre$"}, { -- tb. repaitre, etc
nucleopres1 = {"ai"},
nucleopres2 = {"aiss"},
nucleopres3 = {"aiss"},
nucleoperf = {"u"},
}},
{"croitre", {"o[iî]tre$"}, {
nucleopres1 = {"oi"},
nucleopres2 = {"oiss"},
nucleopres3 = {"oiss"},
nucleoperf = {"u"},
}},
{"battre", {"battre$"}, {
nucleopres1 = {"bat"},
nucleopres2 = {"batt"},
nucleopres3 = {"batt"},
nucleoperf = {"batti"},
part = {"battu"}
}},
{"mettre", {"mettre$"}, {
nucleopres1 = {"met"},
nucleopres2 = {"mett"},
nucleopres3 = {"mett"},
nucleoperf = {"mi"},
part = {"mis"}
}},
{"foutre", {"foutre$"}, {
nucleopres1 = {"fou"},
nucleopres2 = {"fout"},
nucleoperf = {"fouti"},
part = {"foutu"}
}},
{"inclure", {"inclure$", "transclure$", "occlure$"}, {
nucleo = "clu",
nucleopres1 = {"clu"},
nucleopres2 = {"clu"},
nucleopres3 = {"clu"},
nucleoperf = {"clu"},
part = {"clus"}
}},
{"conclure", {"clure$"}, {
nucleopres1 = {"clu"},
nucleopres2 = {"clu"},
nucleopres3 = {"clu"},
nucleoperf = {"clu"},
}},
{"ensuivre", {"ensuivre$"}, {
nucleopres1 = {"sui"},
nucleopres2 = {"suiv"},
nucleopres3 = {"suiv"},
nucleoperf = {"suivi"},
impers = "36"
}},
{"suivre", {"suivre$"}, {
nucleopres1 = {"sui"},
nucleopres2 = {"suiv"},
nucleopres3 = {"suiv"},
nucleoperf = {"suivi"},
}},
{"vivre", {"vivre$"}, {
nucleopres1 = {"vi"},
nucleopres2 = {"viv"},
nucleopres3 = {"viv"},
nucleoperf = {"vécu"},
}},
},
}
local function combinar_nexo_sufijo(nexo, sufijo, sufijo_inf)
if not nexo then
return sufijo
end
if sufijo_inf == "er" then
if find(sufijo, "^[aouâ]") then
if nexo == "c" then
return "~ç~"..sufijo
end
if nexo == "g" then
return "~ge~"..sufijo
end
end
elseif sufijo_inf == "ër" then
if find(sufijo, "^[aouâéí]") then
if nexo == "u" then
return "~ü~"..sufijo
end
end
if find(sufijo, "^[ei]") then
if nexo == "u" then
return nexo.."~"..sub(sufijo, 1, 1)..DIER.."~"..sub(sufijo, 2)
end
end
end
return nexo..sufijo
end
local function combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma, alternar)
if not nucleo or not nexosufijo then
return nil
end
if alternar and (forma == "fut" or forma == "cond" or find(nexosufijo, "^.?e[ns]?t?$")) then
if alternar == "ay" then
return nucleo..nexosufijo, (gsub(nucleo, "ay$", "a~i~"))..nexosufijo
end
if alternar == "el" then
return (gsub(nucleo, "el$", "~è~l"))..nexosufijo, (gsub(nucleo, "el$", "e~ll~"))..nexosufijo
end
if alternar == "et" then
return (gsub(nucleo, "et$", "~è~t"))..nexosufijo, (gsub(nucleo, "et$", "e~tt~"))..nexosufijo
end
if alternar == "EL" then
return (gsub(nucleo, "el$", "e#ll#"))..nexosufijo
end
if alternar == "ET" then
return (gsub(nucleo, "et$", "e#tt#"))..nexosufijo
end
if alternar == "y" then
return (gsub(nucleo, "y$", "~i~"))..nexosufijo
end
if alternar == "é" then
if forma == "fut" or forma == "cond" then
return (gsub(nucleo, "é(.-)$", "~è~%1"))..nexosufijo, nucleo..nexosufijo
else
return (gsub(nucleo, "é(.-)$", "~è~%1"))..nexosufijo
end
end
if alternar == "e" then
return (gsub(nucleo, "e(.-)$", "~è~%1"))..nexosufijo
end
end
if find(nucleo, "[tdc][~#]?$") and nexosufijo == "t" then
return nucleo
end
if not find(nucleo, "[aiu][~#]?$") and find(nexosufijo, "^"..CFLEX) then
return nucleo..sub(nexosufijo, 2)
end
if find(nucleo, "[aiu][~#]$") and find(nexosufijo, "^"..CFLEX) then
return (gsub(nucleo, "([aiu])([~#])$", "%1"..CFLEX.."%2"))..sub(nexosufijo, 2)
end
return nucleo..nexosufijo
end
local function combinar_prefijo_nucleonexosufijo(prefijo, nucleonexosufijo)
if not prefijo or not nucleonexosufijo then
return nil
end
return prefijo..nucleonexosufijo
end
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijos_ = obtener_sufijos(conjinfo.sufijo_inf, conjinfo[forma].alt and forma.."_alt" or forma)
local nucleos
if not conjinfo[forma].nucleo then
if forma == "inf" then
conjugado[forma] = {conjinfo.v}
return
elseif forma == "ger" then
nucleos = conjinfo.nucleopres2
elseif forma == "part" then
nucleos = conjinfo.nucleoperf
elseif forma == "ind_pres" then
nucleos = {conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres1, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres3}
elseif forma == "ind_imp" then
nucleos = {conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres2, conjinfo.nucleopres2}
elseif forma == "subj_pres" then
nucleos = {conjinfo.nucleosubj1, conjinfo.nucleosubj1, conjinfo.nucleosubj1, conjinfo.nucleosubj2, conjinfo.nucleosubj2, conjinfo.nucleosubj1}
elseif forma == "imper" then
nucleos = {{}, conjinfo.nucleopres1, {}, conjinfo.nucleopres2, conjinfo.nucleopres2, {}}
elseif forma == "fut" then
nucleos = {conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut}
elseif forma == "cond" then
nucleos = {conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut, conjinfo.nucleofut}
elseif forma == "ind_perf" then
nucleos = {conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf}
elseif forma == "subj_imp" then
nucleos = {conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf, conjinfo.nucleoperf}
else
local n
if conjinfo.nucleo_inf then
n = {conjinfo.nucleo_inf}
else
n = {}
end
nucleos = {n, n, n, n, n, n}
end
else
local ns = type(conjinfo[forma].nucleo) ~= "table" and {conjinfo[forma].nucleo} or conjinfo[forma].nucleo
for i,_ in ipairs(ns) do
ns[i] = "#"..ns[i].."#"
end
nucleos = {ns, ns, ns, ns, ns, ns}
end
local nexo = conjinfo[forma].nexo or conjinfo.nexo
local prefijo = conjinfo.prefijo
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local nexosufijo = combinar_nexo_sufijo(nexo, sufijos_[1], conjinfo.sufijo_inf)
for _,nucleo in ipairs(nucleos) do
local nxs1, nxs2 = combinar_nucleo_nexosufijo(nucleo, nexosufijo, forma, conjinfo.alternar)
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, nxs1))
insert_if_not(conjugado[forma], combinar_prefijo_nucleonexosufijo(prefijo, nxs2))
end
end
return
end
for i = JE, ILLS do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleonexosufijo(prefijo, fm).."#")
end
else
local k = i
while sufijos_[k] do
local nexosufijo = combinar_nexo_sufijo(nexo, sufijos_[k], conjinfo.sufijo_inf)
for _, n in ipairs(nucleos[i]) do
local nxs1, nxs2 = combinar_nucleo_nexosufijo(n, nexosufijo, forma, conjinfo.alternar)
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, nxs1))
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleonexosufijo(prefijo, nxs2))
end
k = k + 6
end
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local pron = fmtinfo.pron
local art = fmtinfo.art
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local etre = fmtinfo.etre
local arr = res[forma]
local t = {}
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
local j
if not i then
tiempo = forma
i = 1
j = 3
else
i = tonumber(i)
j = i
end
local rest_ = i < NOUS and resto or resto_pl
local rest_pl_ = resto_pl
local vaux = (etre or pron == "se" or pron == "s'") and "etre" or "avoir"
for _, v in ipairs(arr) do
local hs = auxiliar[vaux][tiempo]
local rest = rest_
local rest_pl = rest_pl_
if hs then
if vaux == "etre" and i >= NOUS then
v = gsub(v, "("..LETRA..")([~#]?)$", "%1s%2")
end
rest = " "..v..rest
rest_pl = " "..v..rest_pl
v = auxiliar[vaux][tiempo][i]
end
if tiempo == "imper" then -- lo único pospuesto es el imperativo
local vpronart = v
if pron == "se" or pron == "s'" then
vpronart = vpronart..REFLEXIVOS_POSPUESTOS[j]
end
if art and art ~= "" then
vpronart = vpronart.."-"..art
end
insert(t, adv..((pron or art) and f(vpronart) or f_links(vpronart))..f_links(rest))
else -- antepuesto
local pronartv = v
if art and art ~= "" then
pronartv = find(pronartv, "^[~#]?"..V) and (gsub(art, "^l.*$", "l'"))..pronartv or art.." "..pronartv
end
if pron == "se" or pron == "s'" then
pronartv = find(pronartv, "^[~#]?"..V) and REFLEXIVOS_ANTEPUESTOS_CONTRAIDOS[j]..pronartv or REFLEXIVOS_ANTEPUESTOS[j].." "..pronartv
end
insert(t, adv..((pron or art) and f(pronartv) or f_links(pronartv))..f_links(rest))
if es_no_personal and rest_pl ~= rest then
insert(t, adv..((pron or art) and f(pronartv) or f_links(pronartv))..f_links(rest_pl))
end
end
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["nucleopres1"] = {lista = true},
["núcleopres1"] = {alias_de = "nucleopres1"},
["nucleopres2"] = {lista = true},
["núcleopres2"] = {alias_de = "nucleopres2"},
["nucleopres3"] = {lista = true},
["núcleopres3"] = {alias_de = "nucleopres3"},
["nucleosubj1"] = {lista = true},
["núcleosubj1"] = {alias_de = "nucleosubj1"},
["nucleosubj2"] = {lista = true},
["núcleosubj2"] = {alias_de = "nucleosubj2"},
["nucleoperf"] = {lista = true},
["núcleoperf"] = {alias_de = "nucleoperf"},
["nucleofut"] = {lista = true},
["núcleofut"] = {alias_de = "nucleofut"},
["paradigma"] = {lista = true},
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["plural"] = {},
["etre"] = {tipo = "bool"},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local adv, r1 = match(tit, "^([o]?[uUnN][ieo]n?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local pron, art, v, resto = match(r1, "^(se)"..ESPACIO.."(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])( .-)$") -- obligo a que haya un espacio después: si o sí es el sufijo del verbo
if not v then
local pron, art, v, resto = match(r1, "^(s')(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])( .-)$")
end
if not v then
pron, v, resto = match(r1, "^(se)"..ESPACIO.."("..LETRA.."*[eëiïr][re])( .-)$")
end
if not v then
pron, v, resto = match(r1, "^(s')("..LETRA.."*[eëiïr][re])( .-)$")
end
if not v then
art, v, resto = match(r1, "^(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])( .-)$")
end
if not v then
pron, art, v = match(r1, "^(se)"..ESPACIO.."(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])$") -- sin resto: si o sí tiene que ser el final
end
if not v then
pron, art, v = match(r1, "^(s')(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])$") -- sin resto: si o sí tiene que ser el final
end
if not v then
pron, v = match(r1, "^(se)"..ESPACIO.."("..LETRA.."*[eëiïr][re])$")
end
if not v then
pron, v = match(r1, "^(s')("..LETRA.."*[eëiïr][re])$")
end
if not v then
art, v = match(r1, "^(l[ae]?s?'?)"..ESPACIO.."("..LETRA.."*[eëiïr][re])$")
end
if not v then
v = match(r1, LETRA.."*[eëiïr][re]$")
end
if not resto then
resto = ""
end
local resto_pl = args["plural"] and match(args["plural"], "^s?e?"..ESPACIO.."?l?[ae]?s?'?"..ESPACIO.."?"..LETRA.."*[eëiïr][re]( .-)$") or resto
assert(v and v ~= "", "Forma canónica no reconocida")
local sufijo_inf = match(v, "[eëiïr][re]$")
assert(sufijo_inf)
local paradigmas_reconocidos = {}
local es_irregular
for N = 1, max(1,
maxindex(args["paradigma"]),
maxindex(args["nucleopres1"]),
maxindex(args["nucleopres2"]),
maxindex(args["nucleopres3"]),
maxindex(args["nucleosubj1"]),
maxindex(args["nucleosubj2"]),
maxindex(args["nucleoperf"]),
maxindex(args["nucleofut"])) do
local conjinfo = {}
local encontrado1 = false
local encontrado2 = false
for _,p in ipairs(paradigmas_irregulares[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
conjinfo = deepcopy(p[3])
conjinfo.rxx = match(v, rx)
es_irregular = true
paradigmas_reconocidos[p[1]] = true
encontrado1 = true
break
end
end
if encontrado1 then
break
end
end
encontrado1 = false
for _,p in ipairs(paradigmas_regulares1[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
if size(p[3]) == 0 then
paradigmas_reconocidos[p[1]] = true
end
for k, v in pairs(p[3]) do
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
encontrado1 = true
break
end
end
if encontrado1 then
break
end
end
for _,p in ipairs(paradigmas_regulares2[sufijo_inf]) do
for _,rx in ipairs(p[2]) do
if args["paradigma"][N] == p[1] or find(v, rx) then
if size(p[3]) == 0 and not encontrado1 then
paradigmas_reconocidos[p[1]] = true
end
for k, v in pairs(p[3]) do
if not conjinfo[k] then -- no puede sobreescribir la información del paradigma irregular
conjinfo[k] = v
paradigmas_reconocidos[p[1]] = true
end
end
encontrado2 = true
break
end
end
if encontrado2 then
break
end
end
assert(encontrado2, "paradigma no reconocido")
conjinfo.nucleo_inf = conjinfo.nucleo
conjinfo.nexo_inf = conjinfo.nexo or ""
conjinfo.sufijo_inf = conjinfo.sufijo_inf or sufijo_inf
if conjinfo.nucleo_inf == nil then -- puede ser false
if conjinfo.rxx then
conjinfo.nucleo_inf = sub(conjinfo.rxx, 1, len(conjinfo.rxx) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
else
conjinfo.nucleo_inf = sub(v, 1, len(v) - len(conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
end
if type(conjinfo.nucleo_inf) == "string" then
if not conjinfo.prefijo then
conjinfo.prefijo = sub(v, 1, len(v) - len(conjinfo.nucleo_inf..conjinfo.nexo_inf..conjinfo.sufijo_inf)) -- no busco regex porque pueden haberse cambiado
end
else
conjinfo.prefijo = ""
end
local sobreescrito = {}
local function parsear_nucleo(n, pd)
if conjinfo.nucleo_inf == false or conjinfo[n] == false then
conjinfo[n] = {}
return
end
local por_defecto
if pd and sobreescrito[pd] then
por_defecto = deepcopy(conjinfo[pd])
else
por_defecto = nucleos[conjinfo.sufijo_inf][n] and deepcopy(nucleos[conjinfo.sufijo_inf][n]) or {conjinfo.nucleo_inf}
end
for i, nucl in ipairs(por_defecto) do
if sub(nucl, 1, 1) == "-" then
nucl = conjinfo.nucleo_inf..sub(nucl, 2)
end
por_defecto[i] = nucl
end
if not conjinfo[n] then
if args[n][N] then
conjinfo[n] = {args[n][N]}
else
conjinfo[n] = por_defecto
end
end
for i, nucl in ipairs(conjinfo[n]) do
if sub(nucl, 1, 1) == "-" then
nucl = conjinfo.nucleo_inf..sub(nucl, 2)
end
if find(nucl, "#") then
sobreescrito[n] = true
end
if nucl ~= por_defecto[1] and not find(nucl, "#") then -- si por_defecto traía más núcleos, lo considero irregular
nucl = "#"..nucl.."#"
sobreescrito[n] = true
end
conjinfo[n][i] = nucl
end
end
parsear_nucleo("nucleopres1")
parsear_nucleo("nucleopres2", "nucleopres1")
parsear_nucleo("nucleopres3", "nucleopres2")
parsear_nucleo("nucleosubj1", "nucleopres3")
parsear_nucleo("nucleosubj2", "nucleopres2")
parsear_nucleo("nucleoperf")
parsear_nucleo("nucleofut")
if not conjinfo.part and sufijo_inf == "re" then
local pp = sobreescrito["nucleoperf"] and deepcopy(conjinfo.nucleoperf) or {conjinfo.nucleo_inf}
for i,p in ipairs(pp) do
p = gsub(p, "[~#]", "")
p = gsub(p, "u?$", "u", 1) -- para que no inserte dos úes
pp[i] = p
end
conjinfo.part = pp
end
conjinfo.v = v
args["impersonal"] = args["impersonal"] or conjinfo.impers
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
end
local resultante = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
local part_no_adj = {}
for _,e in ipairs(conjugado.part) do
if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
insert(part_no_adj, gsub1(e, '%b{}', ''))
end
end
local fmtinfo = {adv=adv, pron=pron, art=art, resto=resto, resto_pl=resto_pl, impers=args["impersonal"], etre=args["etre"]}
for form,_ in pairs(formas_no_personales) do
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_no_personales_compuestas) do
resultante[form] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form)
end
for form,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
for form,_ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
resultante[form..s] = part_no_adj
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
local impers = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "il", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "il", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "qu'il", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(il)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "il, elle", "ils, elles", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "il, elle", "ils, elles", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "qu'il, qu'elle", "qu'ils, qu'elles", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(il, elle)", "(ils, elles)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "je/j'", "tu", "il, elle, on", "nous", "vous", "ils/elles", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "je/j'", "tu", "il, elle, on", "nous", "vous", "ils/elles", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "que je/j'", "que tu", "qu'il, qu'elle, qu'on", "que nous", "que vous", "qu'ils, qu'elles", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "―", "(nous)", "(vous)", "―", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
resultante.inf[1] = resultante.inf[1]..", "..resultante.inf_comp[1]
resultante.ger[1] = resultante.ger[1]..", "..resultante.ger_comp[1]
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.part.colspan = cs1-1
resultante.inf_comp.colspan = cs2
resultante.ger_comp.colspan = cs2
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf, resultante.inf_comp}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger, resultante.ger_comp}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")}
t[12] = {{"Pretérito perfecto compuesto", color=COLOR_IND, header=true}, ic("ind_perf_comp")}
t[13] = {{"Futuro", color=COLOR_IND, header=true}, ic("fut")}
t[14] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("fut_comp")}
t[15] = {{f("Pretérito anterior{†}"), color=COLOR_IND, header=true}, ic("ind_anter")}
t[16] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[17] = fila_pronombres_cond
t[18] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[19] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[20] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[21] = fila_pronombres_subj
t[22] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[23] = {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")}
t[24] = {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")}
t[25] = {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")}
t[26] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[27] = fila_pronombres_imper
if mostrar_imper then
t[28] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[28] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[29] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[30] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local paradigmas_t = {}
local cats = {}
if es_irregular then
insert(cats, "FR:Verbos irregulares")
paradigmas_reconocidos["aimer"] = nil
paradigmas_reconocidos["arguër"] = nil
paradigmas_reconocidos["finir"] = nil
paradigmas_reconocidos["haïr"] = nil
paradigmas_reconocidos["vendre"] = nil
else
insert(cats, "FR:Verbos regulares")
end
for p, _ in pairs(paradigmas_reconocidos) do
insert(paradigmas_t, p)
insert(cats, "FR:Verbos del paradigma "..p)
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "FR:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "FR:Verbos terciopersonales")
end
if defectivo then
insert(cats, "FR:Verbos defectivos")
end
if sufijo_inf == "er" or sufijo_inf == "ër" then
insert(cats, "FR:Verbos de la primera conjugación")
elseif sufijo_inf == "ir" or sufijo_inf == "ïr" then
insert(cats, "FR:Verbos de la segunda conjugación")
else
insert(cats, "FR:Verbos de la tercera conjugación")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''  paradigma"..(#paradigmas_t > 1 and "s" or "")..": "..concat(paradigmas_t, ", ").." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
a869istei66737rtts94u4nrubdbktm
Módulo:flex/en
828
1056551
6307305
6236034
2026-08-05T19:52:00Z
Tmagc
158167
6307305
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos en inglés
-- Parte de este módulo está copiado de [[en:Module:en-utilities]]
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local merge = m_table.merge
local insert_if_not = m_table.insertIfNot
local m_str = require("Módulo:string")
local find = m_str.find
local gsub1 = m_str.gsub1
local lower = m_str.lower
local match = string.match
local sub = string.sub
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocales = "aàâeéèêiîoôuûäëïöüÿæœAÀÂEÉÈÊIÎOÔUÛÄËÏÖÜŸÆŒ"
local consonantes = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ"
local V = "[" .. vocales .. "]"
local C = "[" .. consonantes .. "]"
local LETRA = "[" .. vocales .. consonantes .. "]"
local espacios = "%s"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local vowels = "aæᴀᴁɐɑɒ@eᴇǝⱻəɛɘɜɞɤiıɪɨᵻoøœᴏɶɔᴐɵuᴜʉᵾɯꟺʊʋʌyʏ"
local hyphens = "%-‐‑‒–—―"
-- Loaders for objects, which load data (or some other object) into some variable,
-- which can then be accessed as "foo or get_foo()", where the function get_foo
-- sets the object to "foo" and then returns it. This ensures they are only loaded
-- when needed, and avoids the need to check for the existence of the object each
-- time, since once "foo" has been set, "get_foo" will not be called again.
local diacritics
local function get_diacritics()
diacritics, get_diacritics = mw.loadData("Módulo:flex/en/diacríticos").diacritics_all .. "+", nil
return diacritics
end
-- Normalize a string, so that case and diacritics are ignored. By default, "gu"
-- and "qu" are normalized to "g" and "q", because they behave like consonants
-- under certain conditions (e.g. final "y" does not usually have the plural
-- "ies" after a vowel, but it's regular for "quy" to become "quies". The flag
-- `not_gu` prevents this happening to "gu", and is needed because terms ending
-- "-guy" are almost always compounds of "guy" (→ "guys").
local function normalize(str, followed_by, not_gu)
if not followed_by then
followed_by = ""
end
str = gsub1(toNFD(str) .. followed_by, "([" .. (not_gu and "" or "Gg") .. "Qq])u([".. vowels .. "])", "%1%2")
return lower(gsub1(sub(str, 1, #str - #followed_by), diacritics or get_diacritics(), ""))
end
local function epenthetic_e_default(stem)
return sub(stem, -1) ~= "e"
end
local function epenthetic_e_for_s(stem, term)
-- If the stem is different, it must be from "y" → "i".
if stem ~= term then
return true
end
local final
if match(stem, "^[^\128-\255]*$") then
final = sub(stem, -1)
else
stem = gsub1(toNFD(stem), diacritics or get_diacritics(), "")
final = sub(stem, -1)
end
-- Epenthetic "e" is added after a sibilant or sibilant-affricate. The vast
-- majority of these are spelled "s", "x", "z", "ch" and "sh", but "dg"
-- (→ "dge") and "ß" (→ "ss") can be found in obsolete spellings, "shh" in
-- onomatopoeia, and "zh", "dj", "jj" (and more) in loanwords.
return (
final == "g" and sub(stem, -2, -2) == "d" or
final == "h" and match(stem, "[csz]h+$") or
final == "j" and match(stem, "[^" .. vowels .. "]j$") or
final == "s" or
final == "u" and match(stem, "%f[%w']u$") or
final == "x" or
final == "z" or
final == "ß"
)
end
local suffixes = {}
suffixes["'s"] = {
truncated = function(stem)
return sub(stem, -1) == "s" and "'" or "'s"
end,
}
suffixes["s.plural"] = {
final_y_is_i = true,
epenthetic_e = epenthetic_e_for_s,
modifies_possessive = true,
}
suffixes["s.verb"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_for_s
}
suffixes["ing"] = {
final_consonant_is_doubled = true,
remove_silent_e = true,
}
suffixes["d"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default,
}
suffixes["dst"] = suffixes["d"]
suffixes["st.verb"] = suffixes["d"]
suffixes["th"] = suffixes["d"]
suffixes["n"] = {
final_y_is_i = true,
final_y_is_i_after_vowel = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
-- No epenthetic "e" after an "e", or an "i", "r" or "w" preceded by a vowel.
epenthetic_e = function(stem)
return not (
sub(stem, -1) == "e" or
match(normalize(stem), "[" .. vowels .. "][irw]$")
)
end,
}
suffixes["r"] = {
final_y_is_i = true,
final_ey_is_i = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default
}
suffixes["st.superlative"] = suffixes["r"]
local function remove_possessive(stem)
return match(stem, "^(.*)'s$") or match(stem, "^(.*s)'$") or stem
end
-- Returns the stem used for suffixes that sometimes convert final "y" into "i",
-- such as "-es" ("-ies"), e.g. "penny" → "penni" ("pennies"). If
-- `final_ey_is_i` is true, final "ey" may also be converted, e.g. "plaguey" →
-- "plagui"; this is needed for "-er" ("-ier") and "-est" ("-iest"). If `not_gu`
-- is true, then normalize() will be called with the `not_gu` flag (see there
-- for more info); this is true in most cases.
local function convert_final_y_to_i(str, not_gu, final_ey_is_i, final_y_is_i_after_vowel)
local final3 = sub(str, -3)
-- Special case: treat "eey" as "ee" + "y" (e.g. "treey" → "treeiest").
-- "oey" and "uey" are usually vowel + "ey", but examples of "oe" + "y" and
-- "ue" = "y" do also exist: compare "go" → "goey" → "goier" with "doe" →
-- "doey" → "doeier"; "flu" → "fluey" → "fluiest" and "flue" → "fluey" →
-- "flueiest" form a theoretically possible minimal pair.
if final3 == "eey" then
return sub(str, 1, -2) .. "i"
end
local final2 = sub(str, -2)
-- If `final_ey_is_i` is true, treat final "-ey" can also be reduced.
if final_ey_is_i and final2 == "ey" then
-- Remove "ey" to get the base stem.
local base_stem = sub(str, 1, -3)
-- Special case: allow final "-ey" ("potato-ey" → "potato-iest").
if match(final3, "[" .. hyphens .. "]ey") then
return base_stem .. "i"
end
-- Final "ey" becomes "i" iff the term is polysyllabic (e.g. not
-- "grey"). "ey" is common if the base stem ends in a vowel ("echo →
-- "echoey"), so the presence of a vowel anywhere in the base stem is
-- sufficient to deem it polysyllabic. ("echoey" → "echo" → "echoiest",
-- "beigey" → "beig" → "beigiest", but "grey" → "gr" → "greyest"). The
-- first "y" in "-yey" can be treated as a vowel as long as it's
-- preceded by something ("clayey" → "clay" → "clayiest", "cryey" →
-- "cry" → "cryiest", but "*yey" → "*y" → "*yeyest"), so it needs to be
-- treated as a special case.
local normalized = normalize(base_stem, "ey")
if sub(normalized, -1) == "y" then
if match(normalized, "[%w@][yY]$") then
return base_stem .. "i"
end
elseif match(normalized, "[" .. vowels .. "%d]%w*$") then
return base_stem .. "i"
end
-- Special cases:
-- Final "quy" ("soliloquy" → "soliloquies").
-- Final "guy" iff `not_gu` is false ("roguy" → "roguiest").
-- Final "y" after a vowel iff `final_y_is_i_after_vowel` is true ("slay" →
-- "slain").
-- Final "-y" ("bro-y" → "bro-iest"), accounting for hyphen variation.
elseif match(final2, "[" .. hyphens .. "]y") then
-- Replace final "y" with "i".
return sub(str, 1, -2) .. "i"
-- Otherwise, final "y" becomes "i" iff it's not preceded by a vowel
-- ("shy" → "shiest", "horsy" → "horsies", but "day" → "days", "coy" →
-- "coyest").
else
-- Remove "y" to get the base stem.
local base_stem = sub(str, 1, -2)
if match(normalize(base_stem, "y", not_gu), "[^%s%p" .. (final_y_is_i_after_vowel and "" or vowels) .. "]$") then
return base_stem .. "i"
end
end
return str
end
local function double_final_consonant(str, final)
local initial = match(normalize(sub(str, 1, -2), final), "^.*%f[^%z%s" .. hyphens .. "…]([%l%p]*)[" .. vowels .. "]$")
return initial and (
initial == "" or
initial == "y" or
match(initial, "^.[\128-\191]*$") and match(initial, "[^" .. vowels .. "]") or
match(initial, "^[^" .. vowels .. "]*%f[^%l]$")
) and (str .. final) or str
end
local function remove_silent_e(str)
local final2 = sub(str, -2)
if final2 == "ie" then
-- Replace "ie" with "y", unless it follows another "y" (e.g.
-- "spulyie" → "spulyieing").
return gsub1(str, "([^yY%s%p])ie$", "%1y")
end
local base_stem = sub(str, 1, -2)
-- Silent "e" occurs after "u" or a consonant (cluster) preceded by a vowel.
return (
final2 == "ue" or
match(normalize(base_stem, "e"), "[" .. vowels .. "][^" .. vowels .. "]+$")
) and base_stem or str
end
local function add_suffix(term, suffix, pos)
local data, possessive = suffixes[suffix], nil
-- If modifies_possessive is set, check for and remove any possessive
-- suffix, which will be re-added again at the end.
if data.modifies_possessive then
local new = remove_possessive(term)
if new ~= term then
term, possessive = new, true
end
end
suffix = match(suffix, "^([^.]*)")
local final, stem = sub(term, -1)
-- Proper nouns don't have a final "y" changed to "i" (e.g. "the Gettys",
-- "the public Ivys").
if data.final_y_is_i and final == "y" and pos ~= "proper noun" then
stem = convert_final_y_to_i(term, not data.final_guy_is_gui, data.final_ey_is_i, data.final_y_is_i_after_vowel)
elseif data.remove_silent_e and final == "e" then
stem = remove_silent_e(term)
else
stem = term
end
local epenthetic_e = data.epenthetic_e
if epenthetic_e and epenthetic_e(stem, term) then
suffix = "e" .. suffix
end
if (
data.final_consonant_is_doubled and
match(final, "^[bcdfgjklmnpqrstvz]$") and -- Only double regular consonants.
match(suffix, "^[" .. vowels .. "]")
) then
stem = double_final_consonant(term, final)
end
local truncated = data.truncated
if truncated then
suffix = truncated(stem)
end
local output = stem .. suffix
-- Re-add the possessive suffix, if applicable.
if possessive then
output = add_suffix(output, "'s", pos)
end
return output
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido=true},
[2] = {},
[3] = {},
[4] = {},
[5] = {},
["alt"] = {},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["noes"] = {alias_de = "s"},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["n"] = {},
["nota"] = {alias_de = "n"},
["pnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["p"][1] = args["p"][1] or args[2]
args["p"][2] = args["p"][2] or args[3]
args["p"][3] = args["p"][3] or args[4]
args["p"][4] = args["p"][4] or args[5]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones sustantivas" or "EN:Sustantivos"
local cats = {}
local enc
if modo then
if find(modo, "inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
insert(cats, cat_pref.." irregulares")
elseif find(modo, "inc") then
enc = "incontable"
insert(cats, cat_pref.." incontables")
insert(cats, cat_pref.." regulares")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["n"],
{},
ns == 0 and cats or {}
)
end
end
local pos = find(title, "^[A-Z]") and "proper noun" or "noun"
local plural = args["s"] == true and title.."#s#" or add_suffix(title, "s.plural", pos)
local flex_ = {{title}, {plural}}
args[1] = {}
args[2] = args["p"]
local flex, i1 = sobreescribir_formas(flex_, args)
if not flex[2][1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif i1 or args["s"] then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
else
if modo == "ci" then
enc = "contable e incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?i") or find(modo, "gi") then
enc = "generalmente incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?c") or find(modo, "gc") then
enc = "generalmente contable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
else
insert(cats, cat_pref.." contables")
end
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"plural", flex[2], args["pnota"]}},
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["n"] = {},
["nota"] = {alias_de = "n"},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adjetivas" or "EN:Adjetivos"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["n"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.adv(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["n"] = {},
["nota"] = {alias_de = "n"},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adverbiales" or "EN:Adverbios"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["n"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["n"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
local auxiliar = {
["pret_comp"] = {"have", "have", "has", "have"},
["pret_ant"] = {"had", "had", "had", "had"},
["fut"] = {"will", "will", "will", "will"},
["fut_comp"] = {"will have", "will have", "will have", "will have"},
["cond"] = {"would", "would", "would", "would"},
["cond_comp"] = {"would have", "would have", "would have", "would have"},
}
local I, YOU, HE, WE = 1, 2, 3, 4
local tostr = {"1", "2", "3", "4"}
local PRONOMBRES = {"I", "you", "he, she, it", "we, you, they"}
local PRONOMBRES_IMP = {"―", "(you)", "―", "(we)"}
local IMPERSONALES = {"", "", "(it)", "(they)"}
local IMPERSONALES_SUBJ = {"", "", "(it)", "(they)"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
pres = true,
pret = true,
subj_pres = true,
subj_pret = true
}
local formas_personales_compuestas = {
pret_comp = true,
pret_ant = true,
fut = true,
fut_comp = true,
cond = true,
cond_comp = true,
}
local formas = merge(formas_no_personales, formas_personales)
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
end
if find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
local function agregar_forma(conjugado, forma, v)
local ed
for i = 1, 4 do
local vconj, vconj2
if forma == "inf" then
conjugado.inf = {v}
return
elseif forma == "ger" then
vconj = add_suffix(v, "ing", "verb")
elseif forma == "part" then
vconj = add_suffix(v, "d", "verb")
elseif forma == "pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
if i == YOU then
vconj2 = add_suffix(v, "dst", "verb").."{†}"
end
elseif forma == "subj_pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
elseif forma == "pres" then
if i == YOU then
vconj = v
vconj2 = add_suffix(v, "st.verb", "verb").."{†}"
elseif i == HE then
vconj = add_suffix(v, "s.verb", "verb")
vconj2 = add_suffix(v, "th", "verb").."{†}"
else
vconj = v
end
else
vconj = v
end
if formas_no_personales[forma] then
insert_if_not(conjugado[forma], vconj)
if vconj2 then
insert_if_not(conjugado[forma], vconj2)
end
return
end
local p = tostr[i]
insert_if_not(conjugado[forma..p], vconj)
if vconj2 then
insert_if_not(conjugado[forma..p], vconj2)
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local tit = fmtinfo.tit
local arr = res[forma]
local t = {}
if forma == "imper1" or forma == "imper3" then
res[forma] = {}
return
elseif forma == "imper2" then
local v = fmtinfo.v
local imp1 = (adv == "not " and "don't " or adv)..(v ~= tit and f_links(v) or f(v))..f_links(resto)
res[forma] = {imp1}
return
elseif forma == "imper4" then
local v = fmtinfo.v
local imp2 = "let's "..adv..(v ~= tit and f_links(v) or f(v))..f_links(resto_pl)
res[forma] = {imp2}
return
end
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest = i >= WE and resto_pl or resto
local aux = auxiliar[tiempo] and auxiliar[tiempo][i].." " or ""
for _, v in ipairs(arr) do
insert(t, adv..aux..(v ~= tit and f_links(v) or f(v))..f_links(rest))
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["plural"] = {},
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["imper"] = {},
["n"] = {},
["nota"] = {alias_de = "n"},
["ll"] = {tipo = "bool"},
[1] = {tipo=parsear_arreglo, por_defecto={}},
[2] = {tipo=parsear_arreglo, por_defecto={}},
[3] = {tipo=parsear_arreglo, por_defecto={}},
[4] = {tipo=parsear_arreglo, por_defecto={}}
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
for forma,_ in pairs(formas_personales_compuestas) do
params[forma] = {}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local tit2 = match(tit, "^to (.*)$") -- no considero el "to" inicial para las conjugaciones
tit = tit2 or tit
local adv, r1 = match(tit, "^([dn]ot?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, resto = match(r1, "^("..NO_ESPACIO.."*)( .-)$") -- obligo a que haya un espacio después: si o sí es el sufijo del verbo
resto = resto or ""
v = v or tit
local resto_pl = args["plural"] and match(args["plural"], "^"..NO_ESPACIO.."*( .-)$") or resto
local z = sub(v, -1) -- ultimo caracter
if args["ll"] then
if z == "l" then
args[1] = {v.."ed[US]", v..z.."ed[UK]"}
args[2] = {v.."ed[US]", v..z.."ed[UK]"}
args[3] = {v.."ing[US]", v..z.."ing[UK]"}
else
args[1] = {v.."ed", v..z.."ed"}
args[2] = {v.."ed", v..z.."ed"}
args[3] = {v.."ing", v..z.."ing"}
end
end
local duplica
if find(args[1][1] or "", v..z.."ed") then
duplica = true
if not args[3][1] then
args[3][1] = v..z.."ing"
end
elseif find(args[1][1] or "", v.."ked") then
duplica = true
if not args[3][1] then
args[3][1] = v.."king"
end
end
args["pres3"] = args["pres3"][1] and args["pres3"] or args[4]
args["ger"] = args["ger"][1] and args["ger"] or args[3]
args["part"] = args["part"][1] and args["part"] or (args[2][1] and args[2] or args[1])
args["pret1"] = args["pret1"][1] and args["pret1"] or args[1]
args["pret2"] = args["pret2"][1] and args["pret2"] or args[1]
args["pret3"] = args["pret3"][1] and args["pret3"] or args[1]
args["pret4"] = args["pret4"][1] and args["pret4"] or args[1]
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or args[1]
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or args[1]
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or args[1]
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or args[1]
-- parche para be, para que sean más prácticas las locuciones
if v == "be" then
args["part"] = args["part"][1] and args["part"] or {"been"}
args["pres1"] = args["pres1"][1] and args["pres1"] or {"am"}
args["pres2"] = args["pres2"][1] and args["pres2"] or {"are"}
args["pres3"] = args["pres3"][1] and args["pres3"] or {"is"}
args["pres4"] = args["pres4"][1] and args["pres4"] or {"are"}
args["pret1"] = args["pret1"][1] and args["pret1"] or {"was"}
args["pret2"] = args["pret2"][1] and args["pret2"] or {"were"}
args["pret3"] = args["pret3"][1] and args["pret3"] or {"was"}
args["pret4"] = args["pret4"][1] and args["pret4"] or {"were"}
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or {"were"}
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or {"were"}
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or {"was"}
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or {"were"}
end
for forma, _ in pairs(formas) do
agregar_forma(conjugado, forma, v)
end
local resultante, es_irregular = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {}, tostr)
local pret3, part1 = resultante.pret3[1], resultante.part[1]
pret3 = pret3 or "―"
part1 = part1 or "―"
local impers = args["impersonal"]
local part = deepcopy(resultante.part)
local infinit = deepcopy(resultante.inf)
local fmtinfo = {adv=adv, resto=resto, resto_pl=resto_pl, impers=impers, tit=tit, v=v}
for form, _ in pairs(formas_no_personales) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form)
end
end
for form, _ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
for form, _ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
if form == "fut" or form == "cond" then
resultante[form..s] = infinit
else
resultante[form..s] = part
end
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
if args["imper"] ~= "no" and args["imper"] ~= "-" then
formatear_conjugacion(resultante, fmtinfo, "imper1")
formatear_conjugacion(resultante, fmtinfo, "imper2")
formatear_conjugacion(resultante, fmtinfo, "imper3")
formatear_conjugacion(resultante, fmtinfo, "imper4")
else
resultante["imper1"] = {}
resultante["imper2"] = {}
resultante["imper3"] = {}
resultante["imper4"] = {}
end
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(it)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(it)", "(they)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", "(they)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", "(they)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", "(they)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "I", "you (thou)", "he, she, it", "we, you, they", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(you)", "―", "(we)", color=COLOR_IMPER, header=true, class="pc"}
cs = 5
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
resultante.inf.colspan=cs-1
resultante.ger.colspan=cs-1
resultante.part.colspan=cs-1
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."4"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("pres")}
t[9] = {{"Pretérito", color=COLOR_IND, header=true}, ic("pret")}
t[10] = {{"Pretérito compuesto", color=COLOR_IND, header=true}, ic("pret_comp")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("pret_ant")}
t[12] = {{"Futuro", color=COLOR_IND, header=true}, ic("fut")}
t[13] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("fut_comp")}
t[14] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[15] = fila_pronombres_cond
t[16] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[17] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[18] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[19] = fila_pronombres_subj
t[20] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[21] = {{"Pretérito", color=COLOR_SUBJ, header=true}, ic("subj_pret")}
t[22] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[23] = fila_pronombres_imper
if mostrar_imper then
t[24] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[24] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[25] = {{f("Leyenda: † arcaico, x no normativo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[26] = {{args["nota"], colspan=cs}}
local cats = {}
if es_irregular then
insert(cats, "EN:Verbos irregulares")
else
insert(cats, "EN:Verbos regulares")
if duplica then
insert(cats, "EN:Verbos con duplicación de consonante final")
end
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "EN:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "EN:Verbos terciopersonales")
end
if defectivo then
insert(cats, "EN:Verbos defectivos")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'' ("..f(pret3)..", "..f(part1)..")''' ".." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {}
)
end
return export
lw9ussh43qazorxsjka24n4756fftml
6307325
6307305
2026-08-06T00:34:04Z
TMCbot
164594
.
6307325
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos en inglés
-- Parte de este módulo está copiado de [[en:Module:en-utilities]]
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local merge = m_table.merge
local insert_if_not = m_table.insertIfNot
local m_str = require("Módulo:string")
local find = m_str.find
local gsub1 = m_str.gsub1
local lower = m_str.lower
local match = string.match
local sub = string.sub
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocales = "aàâeéèêiîoôuûäëïöüÿæœAÀÂEÉÈÊIÎOÔUÛÄËÏÖÜŸÆŒ"
local consonantes = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ"
local V = "[" .. vocales .. "]"
local C = "[" .. consonantes .. "]"
local LETRA = "[" .. vocales .. consonantes .. "]"
local espacios = "%s"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local vowels = "aæᴀᴁɐɑɒ@eᴇǝⱻəɛɘɜɞɤiıɪɨᵻoøœᴏɶɔᴐɵuᴜʉᵾɯꟺʊʋʌyʏ"
local hyphens = "%-‐‑‒–—―"
-- Loaders for objects, which load data (or some other object) into some variable,
-- which can then be accessed as "foo or get_foo()", where the function get_foo
-- sets the object to "foo" and then returns it. This ensures they are only loaded
-- when needed, and avoids the need to check for the existence of the object each
-- time, since once "foo" has been set, "get_foo" will not be called again.
local diacritics
local function get_diacritics()
diacritics, get_diacritics = mw.loadData("Módulo:flex/en/diacríticos").diacritics_all .. "+", nil
return diacritics
end
-- Normalize a string, so that case and diacritics are ignored. By default, "gu"
-- and "qu" are normalized to "g" and "q", because they behave like consonants
-- under certain conditions (e.g. final "y" does not usually have the plural
-- "ies" after a vowel, but it's regular for "quy" to become "quies". The flag
-- `not_gu` prevents this happening to "gu", and is needed because terms ending
-- "-guy" are almost always compounds of "guy" (→ "guys").
local function normalize(str, followed_by, not_gu)
if not followed_by then
followed_by = ""
end
str = gsub1(toNFD(str) .. followed_by, "([" .. (not_gu and "" or "Gg") .. "Qq])u([".. vowels .. "])", "%1%2")
return lower(gsub1(sub(str, 1, #str - #followed_by), diacritics or get_diacritics(), ""))
end
local function epenthetic_e_default(stem)
return sub(stem, -1) ~= "e"
end
local function epenthetic_e_for_s(stem, term)
-- If the stem is different, it must be from "y" → "i".
if stem ~= term then
return true
end
local final
if match(stem, "^[^\128-\255]*$") then
final = sub(stem, -1)
else
stem = gsub1(toNFD(stem), diacritics or get_diacritics(), "")
final = sub(stem, -1)
end
-- Epenthetic "e" is added after a sibilant or sibilant-affricate. The vast
-- majority of these are spelled "s", "x", "z", "ch" and "sh", but "dg"
-- (→ "dge") and "ß" (→ "ss") can be found in obsolete spellings, "shh" in
-- onomatopoeia, and "zh", "dj", "jj" (and more) in loanwords.
return (
final == "g" and sub(stem, -2, -2) == "d" or
final == "h" and match(stem, "[csz]h+$") or
final == "j" and match(stem, "[^" .. vowels .. "]j$") or
final == "s" or
final == "u" and match(stem, "%f[%w']u$") or
final == "x" or
final == "z" or
final == "ß"
)
end
local suffixes = {}
suffixes["'s"] = {
truncated = function(stem)
return sub(stem, -1) == "s" and "'" or "'s"
end,
}
suffixes["s.plural"] = {
final_y_is_i = true,
epenthetic_e = epenthetic_e_for_s,
modifies_possessive = true,
}
suffixes["s.verb"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_for_s
}
suffixes["ing"] = {
final_consonant_is_doubled = true,
remove_silent_e = true,
}
suffixes["d"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default,
}
suffixes["dst"] = suffixes["d"]
suffixes["st.verb"] = suffixes["d"]
suffixes["th"] = suffixes["d"]
suffixes["n"] = {
final_y_is_i = true,
final_y_is_i_after_vowel = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
-- No epenthetic "e" after an "e", or an "i", "r" or "w" preceded by a vowel.
epenthetic_e = function(stem)
return not (
sub(stem, -1) == "e" or
match(normalize(stem), "[" .. vowels .. "][irw]$")
)
end,
}
suffixes["r"] = {
final_y_is_i = true,
final_ey_is_i = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default
}
suffixes["st.superlative"] = suffixes["r"]
local function remove_possessive(stem)
return match(stem, "^(.*)'s$") or match(stem, "^(.*s)'$") or stem
end
-- Returns the stem used for suffixes that sometimes convert final "y" into "i",
-- such as "-es" ("-ies"), e.g. "penny" → "penni" ("pennies"). If
-- `final_ey_is_i` is true, final "ey" may also be converted, e.g. "plaguey" →
-- "plagui"; this is needed for "-er" ("-ier") and "-est" ("-iest"). If `not_gu`
-- is true, then normalize() will be called with the `not_gu` flag (see there
-- for more info); this is true in most cases.
local function convert_final_y_to_i(str, not_gu, final_ey_is_i, final_y_is_i_after_vowel)
local final3 = sub(str, -3)
-- Special case: treat "eey" as "ee" + "y" (e.g. "treey" → "treeiest").
-- "oey" and "uey" are usually vowel + "ey", but examples of "oe" + "y" and
-- "ue" = "y" do also exist: compare "go" → "goey" → "goier" with "doe" →
-- "doey" → "doeier"; "flu" → "fluey" → "fluiest" and "flue" → "fluey" →
-- "flueiest" form a theoretically possible minimal pair.
if final3 == "eey" then
return sub(str, 1, -2) .. "i"
end
local final2 = sub(str, -2)
-- If `final_ey_is_i` is true, treat final "-ey" can also be reduced.
if final_ey_is_i and final2 == "ey" then
-- Remove "ey" to get the base stem.
local base_stem = sub(str, 1, -3)
-- Special case: allow final "-ey" ("potato-ey" → "potato-iest").
if match(final3, "[" .. hyphens .. "]ey") then
return base_stem .. "i"
end
-- Final "ey" becomes "i" iff the term is polysyllabic (e.g. not
-- "grey"). "ey" is common if the base stem ends in a vowel ("echo →
-- "echoey"), so the presence of a vowel anywhere in the base stem is
-- sufficient to deem it polysyllabic. ("echoey" → "echo" → "echoiest",
-- "beigey" → "beig" → "beigiest", but "grey" → "gr" → "greyest"). The
-- first "y" in "-yey" can be treated as a vowel as long as it's
-- preceded by something ("clayey" → "clay" → "clayiest", "cryey" →
-- "cry" → "cryiest", but "*yey" → "*y" → "*yeyest"), so it needs to be
-- treated as a special case.
local normalized = normalize(base_stem, "ey")
if sub(normalized, -1) == "y" then
if match(normalized, "[%w@][yY]$") then
return base_stem .. "i"
end
elseif match(normalized, "[" .. vowels .. "%d]%w*$") then
return base_stem .. "i"
end
-- Special cases:
-- Final "quy" ("soliloquy" → "soliloquies").
-- Final "guy" iff `not_gu` is false ("roguy" → "roguiest").
-- Final "y" after a vowel iff `final_y_is_i_after_vowel` is true ("slay" →
-- "slain").
-- Final "-y" ("bro-y" → "bro-iest"), accounting for hyphen variation.
elseif match(final2, "[" .. hyphens .. "]y") then
-- Replace final "y" with "i".
return sub(str, 1, -2) .. "i"
-- Otherwise, final "y" becomes "i" iff it's not preceded by a vowel
-- ("shy" → "shiest", "horsy" → "horsies", but "day" → "days", "coy" →
-- "coyest").
else
-- Remove "y" to get the base stem.
local base_stem = sub(str, 1, -2)
if match(normalize(base_stem, "y", not_gu), "[^%s%p" .. (final_y_is_i_after_vowel and "" or vowels) .. "]$") then
return base_stem .. "i"
end
end
return str
end
local function double_final_consonant(str, final)
local initial = match(normalize(sub(str, 1, -2), final), "^.*%f[^%z%s" .. hyphens .. "…]([%l%p]*)[" .. vowels .. "]$")
return initial and (
initial == "" or
initial == "y" or
match(initial, "^.[\128-\191]*$") and match(initial, "[^" .. vowels .. "]") or
match(initial, "^[^" .. vowels .. "]*%f[^%l]$")
) and (str .. final) or str
end
local function remove_silent_e(str)
local final2 = sub(str, -2)
if final2 == "ie" then
-- Replace "ie" with "y", unless it follows another "y" (e.g.
-- "spulyie" → "spulyieing").
return gsub1(str, "([^yY%s%p])ie$", "%1y")
end
local base_stem = sub(str, 1, -2)
-- Silent "e" occurs after "u" or a consonant (cluster) preceded by a vowel.
return (
final2 == "ue" or
match(normalize(base_stem, "e"), "[" .. vowels .. "][^" .. vowels .. "]+$")
) and base_stem or str
end
local function add_suffix(term, suffix, pos)
local data, possessive = suffixes[suffix], nil
-- If modifies_possessive is set, check for and remove any possessive
-- suffix, which will be re-added again at the end.
if data.modifies_possessive then
local new = remove_possessive(term)
if new ~= term then
term, possessive = new, true
end
end
suffix = match(suffix, "^([^.]*)")
local final, stem = sub(term, -1)
-- Proper nouns don't have a final "y" changed to "i" (e.g. "the Gettys",
-- "the public Ivys").
if data.final_y_is_i and final == "y" and pos ~= "proper noun" then
stem = convert_final_y_to_i(term, not data.final_guy_is_gui, data.final_ey_is_i, data.final_y_is_i_after_vowel)
elseif data.remove_silent_e and final == "e" then
stem = remove_silent_e(term)
else
stem = term
end
local epenthetic_e = data.epenthetic_e
if epenthetic_e and epenthetic_e(stem, term) then
suffix = "e" .. suffix
end
if (
data.final_consonant_is_doubled and
match(final, "^[bcdfgjklmnpqrstvz]$") and -- Only double regular consonants.
match(suffix, "^[" .. vowels .. "]")
) then
stem = double_final_consonant(term, final)
end
local truncated = data.truncated
if truncated then
suffix = truncated(stem)
end
local output = stem .. suffix
-- Re-add the possessive suffix, if applicable.
if possessive then
output = add_suffix(output, "'s", pos)
end
return output
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido=true},
[2] = {},
[3] = {},
[4] = {},
[5] = {},
["alt"] = {},
["nota"] = {},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["pnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["p"][1] = args["p"][1] or args[2]
args["p"][2] = args["p"][2] or args[3]
args["p"][3] = args["p"][3] or args[4]
args["p"][4] = args["p"][4] or args[5]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones sustantivas" or "EN:Sustantivos"
local cats = {}
local enc
if modo then
if find(modo, "inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
insert(cats, cat_pref.." irregulares")
elseif find(modo, "inc") then
enc = "incontable"
insert(cats, cat_pref.." incontables")
insert(cats, cat_pref.." regulares")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local pos = find(title, "^[A-Z]") and "proper noun" or "noun"
local plural = args["s"] == true and title.."#s#" or add_suffix(title, "s.plural", pos)
local flex_ = {{title}, {plural}}
args[1] = {}
args[2] = args["p"]
local flex, i1 = sobreescribir_formas(flex_, args)
if not flex[2][1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif i1 or args["s"] then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
else
if modo == "ci" then
enc = "contable e incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?i") or find(modo, "gi") then
enc = "generalmente incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?c") or find(modo, "gc") then
enc = "generalmente contable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
else
insert(cats, cat_pref.." contables")
end
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"plural", flex[2], args["pnota"]}},
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adjetivas" or "EN:Adjetivos"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.adv(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adverbiales" or "EN:Adverbios"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
local auxiliar = {
["pret_comp"] = {"have", "have", "has", "have"},
["pret_ant"] = {"had", "had", "had", "had"},
["fut"] = {"will", "will", "will", "will"},
["fut_comp"] = {"will have", "will have", "will have", "will have"},
["cond"] = {"would", "would", "would", "would"},
["cond_comp"] = {"would have", "would have", "would have", "would have"},
}
local I, YOU, HE, WE = 1, 2, 3, 4
local tostr = {"1", "2", "3", "4"}
local PRONOMBRES = {"I", "you", "he, she, it", "we, you, they"}
local PRONOMBRES_IMP = {"―", "(you)", "―", "(we)"}
local IMPERSONALES = {"", "", "(it)", "(they)"}
local IMPERSONALES_SUBJ = {"", "", "(it)", "(they)"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
pres = true,
pret = true,
subj_pres = true,
subj_pret = true
}
local formas_personales_compuestas = {
pret_comp = true,
pret_ant = true,
fut = true,
fut_comp = true,
cond = true,
cond_comp = true,
}
local formas = merge(formas_no_personales, formas_personales)
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
end
if find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
local function agregar_forma(conjugado, forma, v)
local ed
for i = 1, 4 do
local vconj, vconj2
if forma == "inf" then
conjugado.inf = {v}
return
elseif forma == "ger" then
vconj = add_suffix(v, "ing", "verb")
elseif forma == "part" then
vconj = add_suffix(v, "d", "verb")
elseif forma == "pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
if i == YOU then
vconj2 = add_suffix(v, "dst", "verb").."{†}"
end
elseif forma == "subj_pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
elseif forma == "pres" then
if i == YOU then
vconj = v
vconj2 = add_suffix(v, "st.verb", "verb").."{†}"
elseif i == HE then
vconj = add_suffix(v, "s.verb", "verb")
vconj2 = add_suffix(v, "th", "verb").."{†}"
else
vconj = v
end
else
vconj = v
end
if formas_no_personales[forma] then
insert_if_not(conjugado[forma], vconj)
if vconj2 then
insert_if_not(conjugado[forma], vconj2)
end
return
end
local p = tostr[i]
insert_if_not(conjugado[forma..p], vconj)
if vconj2 then
insert_if_not(conjugado[forma..p], vconj2)
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local tit = fmtinfo.tit
local arr = res[forma]
local t = {}
if forma == "imper1" or forma == "imper3" then
res[forma] = {}
return
elseif forma == "imper2" then
local v = fmtinfo.v
local imp1 = (adv == "not " and "don't " or adv)..(v ~= tit and f_links(v) or f(v))..f_links(resto)
res[forma] = {imp1}
return
elseif forma == "imper4" then
local v = fmtinfo.v
local imp2 = "let's "..adv..(v ~= tit and f_links(v) or f(v))..f_links(resto_pl)
res[forma] = {imp2}
return
end
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest = i >= WE and resto_pl or resto
local aux = auxiliar[tiempo] and auxiliar[tiempo][i].." " or ""
for _, v in ipairs(arr) do
insert(t, adv..aux..(v ~= tit and f_links(v) or f(v))..f_links(rest))
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["plural"] = {},
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["imper"] = {},
["nota"] = {},
["ll"] = {tipo = "bool"},
[1] = {tipo=parsear_arreglo, por_defecto={}},
[2] = {tipo=parsear_arreglo, por_defecto={}},
[3] = {tipo=parsear_arreglo, por_defecto={}},
[4] = {tipo=parsear_arreglo, por_defecto={}}
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
for forma,_ in pairs(formas_personales_compuestas) do
params[forma] = {}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local tit2 = match(tit, "^to (.*)$") -- no considero el "to" inicial para las conjugaciones
tit = tit2 or tit
local adv, r1 = match(tit, "^([dn]ot?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, resto = match(r1, "^("..NO_ESPACIO.."*)( .-)$") -- obligo a que haya un espacio después: si o sí es el sufijo del verbo
resto = resto or ""
v = v or tit
local resto_pl = args["plural"] and match(args["plural"], "^"..NO_ESPACIO.."*( .-)$") or resto
local z = sub(v, -1) -- ultimo caracter
if args["ll"] then
if z == "l" then
args[1] = {v.."ed[US]", v..z.."ed[UK]"}
args[2] = {v.."ed[US]", v..z.."ed[UK]"}
args[3] = {v.."ing[US]", v..z.."ing[UK]"}
else
args[1] = {v.."ed", v..z.."ed"}
args[2] = {v.."ed", v..z.."ed"}
args[3] = {v.."ing", v..z.."ing"}
end
end
local duplica
if find(args[1][1] or "", v..z.."ed") then
duplica = true
if not args[3][1] then
args[3][1] = v..z.."ing"
end
elseif find(args[1][1] or "", v.."ked") then
duplica = true
if not args[3][1] then
args[3][1] = v.."king"
end
end
args["pres3"] = args["pres3"][1] and args["pres3"] or args[4]
args["ger"] = args["ger"][1] and args["ger"] or args[3]
args["part"] = args["part"][1] and args["part"] or (args[2][1] and args[2] or args[1])
args["pret1"] = args["pret1"][1] and args["pret1"] or args[1]
args["pret2"] = args["pret2"][1] and args["pret2"] or args[1]
args["pret3"] = args["pret3"][1] and args["pret3"] or args[1]
args["pret4"] = args["pret4"][1] and args["pret4"] or args[1]
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or args[1]
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or args[1]
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or args[1]
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or args[1]
-- parche para be, para que sean más prácticas las locuciones
if v == "be" then
args["part"] = args["part"][1] and args["part"] or {"been"}
args["pres1"] = args["pres1"][1] and args["pres1"] or {"am"}
args["pres2"] = args["pres2"][1] and args["pres2"] or {"are"}
args["pres3"] = args["pres3"][1] and args["pres3"] or {"is"}
args["pres4"] = args["pres4"][1] and args["pres4"] or {"are"}
args["pret1"] = args["pret1"][1] and args["pret1"] or {"was"}
args["pret2"] = args["pret2"][1] and args["pret2"] or {"were"}
args["pret3"] = args["pret3"][1] and args["pret3"] or {"was"}
args["pret4"] = args["pret4"][1] and args["pret4"] or {"were"}
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or {"were"}
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or {"were"}
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or {"was"}
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or {"were"}
end
for forma, _ in pairs(formas) do
agregar_forma(conjugado, forma, v)
end
local resultante, es_irregular = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {}, tostr)
local pret3, part1 = resultante.pret3[1], resultante.part[1]
pret3 = pret3 or "―"
part1 = part1 or "―"
local impers = args["impersonal"]
local part = deepcopy(resultante.part)
local infinit = deepcopy(resultante.inf)
local fmtinfo = {adv=adv, resto=resto, resto_pl=resto_pl, impers=impers, tit=tit, v=v}
for form, _ in pairs(formas_no_personales) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form)
end
end
for form, _ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
for form, _ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
if form == "fut" or form == "cond" then
resultante[form..s] = infinit
else
resultante[form..s] = part
end
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
if args["imper"] ~= "no" and args["imper"] ~= "-" then
formatear_conjugacion(resultante, fmtinfo, "imper1")
formatear_conjugacion(resultante, fmtinfo, "imper2")
formatear_conjugacion(resultante, fmtinfo, "imper3")
formatear_conjugacion(resultante, fmtinfo, "imper4")
else
resultante["imper1"] = {}
resultante["imper2"] = {}
resultante["imper3"] = {}
resultante["imper4"] = {}
end
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(it)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(it)", "(they)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", "(they)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", "(they)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", "(they)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "I", "you (thou)", "he, she, it", "we, you, they", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(you)", "―", "(we)", color=COLOR_IMPER, header=true, class="pc"}
cs = 5
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
resultante.inf.colspan=cs-1
resultante.ger.colspan=cs-1
resultante.part.colspan=cs-1
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."4"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("pres")}
t[9] = {{"Pretérito", color=COLOR_IND, header=true}, ic("pret")}
t[10] = {{"Pretérito compuesto", color=COLOR_IND, header=true}, ic("pret_comp")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("pret_ant")}
t[12] = {{"Futuro", color=COLOR_IND, header=true}, ic("fut")}
t[13] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("fut_comp")}
t[14] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[15] = fila_pronombres_cond
t[16] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[17] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[18] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[19] = fila_pronombres_subj
t[20] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[21] = {{"Pretérito", color=COLOR_SUBJ, header=true}, ic("subj_pret")}
t[22] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[23] = fila_pronombres_imper
if mostrar_imper then
t[24] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[24] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[25] = {{f("Leyenda: † arcaico, x no normativo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[26] = {{args["nota"], colspan=cs}}
local cats = {}
if es_irregular then
insert(cats, "EN:Verbos irregulares")
else
insert(cats, "EN:Verbos regulares")
if duplica then
insert(cats, "EN:Verbos con duplicación de consonante final")
end
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "EN:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "EN:Verbos terciopersonales")
end
if defectivo then
insert(cats, "EN:Verbos defectivos")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'' ("..f(pret3)..", "..f(part1)..")''' ".." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {}
)
end
return export
prmfbjc6xwj5fgx0wvl7ozekfaqpgqj
6307386
6307325
2026-08-06T01:01:38Z
Tmagc
158167
6307386
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos en inglés
-- Parte de este módulo está copiado de [[en:Module:en-utilities]]
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local merge = m_table.merge
local insert_if_not = m_table.insertIfNot
local m_str = require("Módulo:string")
local find = m_str.find
local gsub1 = m_str.gsub1
local lower = m_str.lower
local match = string.match
local sub = string.sub
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_COND = m_flex.COLOR_COND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocales = "aàâeéèêiîoôuûäëïöüÿæœAÀÂEÉÈÊIÎOÔUÛÄËÏÖÜŸÆŒ"
local consonantes = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ"
local V = "[" .. vocales .. "]"
local C = "[" .. consonantes .. "]"
local LETRA = "[" .. vocales .. consonantes .. "]"
local espacios = "%s"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local vowels = "aæᴀᴁɐɑɒ@eᴇǝⱻəɛɘɜɞɤiıɪɨᵻoøœᴏɶɔᴐɵuᴜʉᵾɯꟺʊʋʌyʏ"
local hyphens = "%-‐‑‒–—―"
-- Loaders for objects, which load data (or some other object) into some variable,
-- which can then be accessed as "foo or get_foo()", where the function get_foo
-- sets the object to "foo" and then returns it. This ensures they are only loaded
-- when needed, and avoids the need to check for the existence of the object each
-- time, since once "foo" has been set, "get_foo" will not be called again.
local diacritics
local function get_diacritics()
diacritics, get_diacritics = mw.loadData("Módulo:flex/en/diacríticos").diacritics_all .. "+", nil
return diacritics
end
-- Normalize a string, so that case and diacritics are ignored. By default, "gu"
-- and "qu" are normalized to "g" and "q", because they behave like consonants
-- under certain conditions (e.g. final "y" does not usually have the plural
-- "ies" after a vowel, but it's regular for "quy" to become "quies". The flag
-- `not_gu` prevents this happening to "gu", and is needed because terms ending
-- "-guy" are almost always compounds of "guy" (→ "guys").
local function normalize(str, followed_by, not_gu)
if not followed_by then
followed_by = ""
end
str = gsub1(toNFD(str) .. followed_by, "([" .. (not_gu and "" or "Gg") .. "Qq])u([".. vowels .. "])", "%1%2")
return lower(gsub1(sub(str, 1, #str - #followed_by), diacritics or get_diacritics(), ""))
end
local function epenthetic_e_default(stem)
return sub(stem, -1) ~= "e"
end
local function epenthetic_e_for_s(stem, term)
-- If the stem is different, it must be from "y" → "i".
if stem ~= term then
return true
end
local final
if match(stem, "^[^\128-\255]*$") then
final = sub(stem, -1)
else
stem = gsub1(toNFD(stem), diacritics or get_diacritics(), "")
final = sub(stem, -1)
end
-- Epenthetic "e" is added after a sibilant or sibilant-affricate. The vast
-- majority of these are spelled "s", "x", "z", "ch" and "sh", but "dg"
-- (→ "dge") and "ß" (→ "ss") can be found in obsolete spellings, "shh" in
-- onomatopoeia, and "zh", "dj", "jj" (and more) in loanwords.
return (
final == "g" and sub(stem, -2, -2) == "d" or
final == "h" and match(stem, "[csz]h+$") or
final == "j" and match(stem, "[^" .. vowels .. "]j$") or
final == "s" or
final == "u" and match(stem, "%f[%w']u$") or
final == "x" or
final == "z" or
final == "ß"
)
end
local suffixes = {}
suffixes["'s"] = {
truncated = function(stem)
return sub(stem, -1) == "s" and "'" or "'s"
end,
}
suffixes["s.plural"] = {
final_y_is_i = true,
epenthetic_e = epenthetic_e_for_s,
modifies_possessive = true,
}
suffixes["s.verb"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_for_s
}
suffixes["ing"] = {
final_consonant_is_doubled = true,
remove_silent_e = true,
}
suffixes["d"] = {
final_y_is_i = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default,
}
suffixes["dst"] = suffixes["d"]
suffixes["st.verb"] = suffixes["d"]
suffixes["th"] = suffixes["d"]
suffixes["n"] = {
final_y_is_i = true,
final_y_is_i_after_vowel = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
-- No epenthetic "e" after an "e", or an "i", "r" or "w" preceded by a vowel.
epenthetic_e = function(stem)
return not (
sub(stem, -1) == "e" or
match(normalize(stem), "[" .. vowels .. "][irw]$")
)
end,
}
suffixes["r"] = {
final_y_is_i = true,
final_ey_is_i = true,
final_guy_is_gui = true,
final_consonant_is_doubled = true,
epenthetic_e = epenthetic_e_default
}
suffixes["st.superlative"] = suffixes["r"]
local function remove_possessive(stem)
return match(stem, "^(.*)'s$") or match(stem, "^(.*s)'$") or stem
end
-- Returns the stem used for suffixes that sometimes convert final "y" into "i",
-- such as "-es" ("-ies"), e.g. "penny" → "penni" ("pennies"). If
-- `final_ey_is_i` is true, final "ey" may also be converted, e.g. "plaguey" →
-- "plagui"; this is needed for "-er" ("-ier") and "-est" ("-iest"). If `not_gu`
-- is true, then normalize() will be called with the `not_gu` flag (see there
-- for more info); this is true in most cases.
local function convert_final_y_to_i(str, not_gu, final_ey_is_i, final_y_is_i_after_vowel)
local final3 = sub(str, -3)
-- Special case: treat "eey" as "ee" + "y" (e.g. "treey" → "treeiest").
-- "oey" and "uey" are usually vowel + "ey", but examples of "oe" + "y" and
-- "ue" = "y" do also exist: compare "go" → "goey" → "goier" with "doe" →
-- "doey" → "doeier"; "flu" → "fluey" → "fluiest" and "flue" → "fluey" →
-- "flueiest" form a theoretically possible minimal pair.
if final3 == "eey" then
return sub(str, 1, -2) .. "i"
end
local final2 = sub(str, -2)
-- If `final_ey_is_i` is true, treat final "-ey" can also be reduced.
if final_ey_is_i and final2 == "ey" then
-- Remove "ey" to get the base stem.
local base_stem = sub(str, 1, -3)
-- Special case: allow final "-ey" ("potato-ey" → "potato-iest").
if match(final3, "[" .. hyphens .. "]ey") then
return base_stem .. "i"
end
-- Final "ey" becomes "i" iff the term is polysyllabic (e.g. not
-- "grey"). "ey" is common if the base stem ends in a vowel ("echo →
-- "echoey"), so the presence of a vowel anywhere in the base stem is
-- sufficient to deem it polysyllabic. ("echoey" → "echo" → "echoiest",
-- "beigey" → "beig" → "beigiest", but "grey" → "gr" → "greyest"). The
-- first "y" in "-yey" can be treated as a vowel as long as it's
-- preceded by something ("clayey" → "clay" → "clayiest", "cryey" →
-- "cry" → "cryiest", but "*yey" → "*y" → "*yeyest"), so it needs to be
-- treated as a special case.
local normalized = normalize(base_stem, "ey")
if sub(normalized, -1) == "y" then
if match(normalized, "[%w@][yY]$") then
return base_stem .. "i"
end
elseif match(normalized, "[" .. vowels .. "%d]%w*$") then
return base_stem .. "i"
end
-- Special cases:
-- Final "quy" ("soliloquy" → "soliloquies").
-- Final "guy" iff `not_gu` is false ("roguy" → "roguiest").
-- Final "y" after a vowel iff `final_y_is_i_after_vowel` is true ("slay" →
-- "slain").
-- Final "-y" ("bro-y" → "bro-iest"), accounting for hyphen variation.
elseif match(final2, "[" .. hyphens .. "]y") then
-- Replace final "y" with "i".
return sub(str, 1, -2) .. "i"
-- Otherwise, final "y" becomes "i" iff it's not preceded by a vowel
-- ("shy" → "shiest", "horsy" → "horsies", but "day" → "days", "coy" →
-- "coyest").
else
-- Remove "y" to get the base stem.
local base_stem = sub(str, 1, -2)
if match(normalize(base_stem, "y", not_gu), "[^%s%p" .. (final_y_is_i_after_vowel and "" or vowels) .. "]$") then
return base_stem .. "i"
end
end
return str
end
local function double_final_consonant(str, final)
local initial = match(normalize(sub(str, 1, -2), final), "^.*%f[^%z%s" .. hyphens .. "…]([%l%p]*)[" .. vowels .. "]$")
return initial and (
initial == "" or
initial == "y" or
match(initial, "^.[\128-\191]*$") and match(initial, "[^" .. vowels .. "]") or
match(initial, "^[^" .. vowels .. "]*%f[^%l]$")
) and (str .. final) or str
end
local function remove_silent_e(str)
local final2 = sub(str, -2)
if final2 == "ie" then
-- Replace "ie" with "y", unless it follows another "y" (e.g.
-- "spulyie" → "spulyieing").
return gsub1(str, "([^yY%s%p])ie$", "%1y")
end
local base_stem = sub(str, 1, -2)
-- Silent "e" occurs after "u" or a consonant (cluster) preceded by a vowel.
return (
final2 == "ue" or
match(normalize(base_stem, "e"), "[" .. vowels .. "][^" .. vowels .. "]+$")
) and base_stem or str
end
local function add_suffix(term, suffix, pos)
local data, possessive = suffixes[suffix], nil
-- If modifies_possessive is set, check for and remove any possessive
-- suffix, which will be re-added again at the end.
if data.modifies_possessive then
local new = remove_possessive(term)
if new ~= term then
term, possessive = new, true
end
end
suffix = match(suffix, "^([^.]*)")
local final, stem = sub(term, -1)
-- Proper nouns don't have a final "y" changed to "i" (e.g. "the Gettys",
-- "the public Ivys").
if data.final_y_is_i and final == "y" and pos ~= "proper noun" then
stem = convert_final_y_to_i(term, not data.final_guy_is_gui, data.final_ey_is_i, data.final_y_is_i_after_vowel)
elseif data.remove_silent_e and final == "e" then
stem = remove_silent_e(term)
else
stem = term
end
local epenthetic_e = data.epenthetic_e
if epenthetic_e and epenthetic_e(stem, term) then
suffix = "e" .. suffix
end
if (
data.final_consonant_is_doubled and
match(final, "^[bcdfgjklmnpqrstvz]$") and -- Only double regular consonants.
match(suffix, "^[" .. vowels .. "]")
) then
stem = double_final_consonant(term, final)
end
local truncated = data.truncated
if truncated then
suffix = truncated(stem)
end
local output = stem .. suffix
-- Re-add the possessive suffix, if applicable.
if possessive then
output = add_suffix(output, "'s", pos)
end
return output
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido=true},
[2] = {},
[3] = {},
[4] = {},
[5] = {},
["alt"] = {},
["nota"] = {},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["pnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["p"][1] = args["p"][1] or args[2]
args["p"][2] = args["p"][2] or args[3]
args["p"][3] = args["p"][3] or args[4]
args["p"][4] = args["p"][4] or args[5]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones sustantivas" or "EN:Sustantivos"
local cats = {}
local enc
if modo then
if find(modo, "inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
insert(cats, cat_pref.." irregulares")
elseif find(modo, "inc") then
enc = "incontable"
insert(cats, cat_pref.." incontables")
insert(cats, cat_pref.." regulares")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local pos = find(title, "^[A-Z]") and "proper noun" or "noun"
local plural = args["s"] == true and title.."#s#" or add_suffix(title, "s.plural", pos)
local flex_ = {{title}, {plural}}
args[1] = {}
args[2] = args["p"]
local flex, i1 = sobreescribir_formas(flex_, args)
if not flex[2][1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif i1 or args["s"] then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
else
if modo == "ci" then
enc = "contable e incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?i") or find(modo, "gi") then
enc = "generalmente incontable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
elseif find(modo, "umc?c") or find(modo, "gc") then
enc = "generalmente contable"
insert(cats, cat_pref.." contables")
insert(cats, cat_pref.." incontables")
else
insert(cats, cat_pref.." contables")
end
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"plural", flex[2], args["pnota"]}},
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adjetivas" or "EN:Adjetivos"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.adv(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
[3] = {},
["alt"] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, LETRA..ESPACIO..LETRA) and "EN:Locuciones adverbiales" or "EN:Adverbios"
local cats = {}
local corto = find(modo, "c")
local largo = find(modo, "l")
local further = find(modo, "f")
local gral = find(modo, "g")
if further then
largo = true
end
if corto and gral then
largo = true
end
if largo and gral then
corto = true
end
local enc
local flex_ = {{title}, {}, {}}
if find(modo, "i?nc") or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." sin comparativo")
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex_[1][1]),
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
assert (corto or largo, "Especifique 'c' (corto), 'l' (largo) o 'f' (further) en el primer parámetro.")
if corto and largo then
if find(modo, "gc") then
enc = "generalmente corto"
elseif find(modo, "gl") then
enc = "generalmente largo"
else
enc = "corto y largo"
end
insert(cats, cat_pref.." cortos")
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
elseif corto then
enc = "corto"
insert(cats, cat_pref.." cortos")
else
enc = "largo"
insert(cats, cat_pref.." largos")
if further then
insert(cats, cat_pref.." largos con further")
end
end
if corto then
insert(flex_[2], add_suffix(title, "r"))
insert(flex_[3], add_suffix(title, "st.superlative"))
end
args[1] = {}
args[2] = args["comp"]
args[3] = args["sup"]
local flex, i1 = sobreescribir_formas(flex_, args)
-- necesito insertar los largos después de insertar los cortos irregulares, para no sobreescribir
if largo and not further then
insert(flex[2], "more "..title)
insert(flex[3], "most "..title)
end
if largo and further then
insert(flex[2], "further "..title)
insert(flex[3], "furthest "..title)
end
if args["comp"][1] == "no" then
enc = enc..", sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
elseif args["sup"][1] == "no" then
enc = enc..", sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]}},
ns == 0 and cats or {}
)
end
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex[1][1]),
enc,
args["nota"],
{{"comparativo", flex[2], args["compnota"]},
{"superlativo", flex[3], args["supnota"]}},
ns == 0 and cats or {}
)
end
local auxiliar = {
["pret_comp"] = {"have", "have", "has", "have"},
["pret_ant"] = {"had", "had", "had", "had"},
["fut"] = {"will", "will", "will", "will"},
["fut_comp"] = {"will have", "will have", "will have", "will have"},
["cond"] = {"would", "would", "would", "would"},
["cond_comp"] = {"would have", "would have", "would have", "would have"},
}
local I, YOU, HE, WE = 1, 2, 3, 4
local tostr = {"1", "2", "3", "4"}
local PRONOMBRES = {"I", "you", "he, she, it", "we, you, they"}
local PRONOMBRES_IMP = {"―", "(you)", "―", "(we)"}
local IMPERSONALES = {"", "", "(it)", "(they)"}
local IMPERSONALES_SUBJ = {"", "", "(it)", "(they)"}
local formas_no_personales = {
["inf"] = true,
["ger"] = true,
["part"] = true,
}
local formas_personales = {
pres = true,
pret = true,
subj_pres = true,
subj_pret = true
}
local formas_personales_compuestas = {
pret_comp = true,
pret_ant = true,
fut = true,
fut_comp = true,
cond = true,
cond_comp = true,
}
local formas = merge(formas_no_personales, formas_personales)
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
if find(conj, "^subj") then
return IMPERSONALES_SUBJ[p]
end
return IMPERSONALES[p]
end
if find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
local function agregar_forma(conjugado, forma, v)
local ed
for i = 1, 4 do
local vconj, vconj2
if forma == "inf" then
conjugado.inf = {v}
return
elseif forma == "ger" then
vconj = add_suffix(v, "ing", "verb")
elseif forma == "part" then
vconj = add_suffix(v, "d", "verb")
elseif forma == "pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
if i == YOU then
vconj2 = add_suffix(v, "dst", "verb").."{†}"
end
elseif forma == "subj_pret" then
if not ed then
ed = add_suffix(v, "d", "verb")
end
vconj = ed
elseif forma == "pres" then
if i == YOU then
vconj = v
vconj2 = add_suffix(v, "st.verb", "verb").."{†}"
elseif i == HE then
vconj = add_suffix(v, "s.verb", "verb")
vconj2 = add_suffix(v, "th", "verb").."{†}"
else
vconj = v
end
else
vconj = v
end
if formas_no_personales[forma] then
insert_if_not(conjugado[forma], vconj)
if vconj2 then
insert_if_not(conjugado[forma], vconj2)
end
return
end
local p = tostr[i]
insert_if_not(conjugado[forma..p], vconj)
if vconj2 then
insert_if_not(conjugado[forma..p], vconj2)
end
end
end
local function formatear_conjugacion(res, fmtinfo, forma)
local adv = fmtinfo.adv
local resto = fmtinfo.resto
local resto_pl = fmtinfo.resto_pl
local tit = fmtinfo.tit
local arr = res[forma]
local t = {}
if forma == "imper1" or forma == "imper3" then
res[forma] = {}
return
elseif forma == "imper2" then
local v = fmtinfo.v
local imp1 = (adv == "not " and "don't " or adv)..(v ~= tit and f_links(v) or f(v))..f_links(resto)
res[forma] = {imp1}
return
elseif forma == "imper4" then
local v = fmtinfo.v
local imp2 = "let's "..adv..(v ~= tit and f_links(v) or f(v))..f_links(resto_pl)
res[forma] = {imp2}
return
end
local es_no_personal = formas_no_personales[forma]
local tiempo, i = match(forma, "^(.*)(%d)$")
if not i then
tiempo = forma
i = 1
end
i = tonumber(i)
local rest = i >= WE and resto_pl or resto
local aux = auxiliar[tiempo] and auxiliar[tiempo][i].." " or ""
for _, v in ipairs(arr) do
insert(t, adv..aux..(v ~= tit and f_links(v) or f(v))..f_links(rest))
end
res[forma] = t
return
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
["plural"] = {},
["impersonal"] = {},
["impers"] = {alias_de = "impersonal"},
["imper"] = {},
["nota"] = {},
["ll"] = {tipo = "bool"},
[1] = {tipo=parsear_arreglo, por_defecto={}},
[2] = {tipo=parsear_arreglo, por_defecto={}},
[3] = {tipo=parsear_arreglo, por_defecto={}},
[4] = {tipo=parsear_arreglo, por_defecto={}}
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
for forma,_ in pairs(formas_personales_compuestas) do
params[forma] = {}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local tit2 = match(tit, "^to (.*)$") -- no considero el "to" inicial para las conjugaciones
tit = tit2 or tit
local adv, r1 = match(tit, "^([dn]ot?"..ESPACIO..")(.*)$")
adv = adv or ""
r1 = r1 or tit
local v, resto = match(r1, "^("..NO_ESPACIO.."*)( .-)$") -- obligo a que haya un espacio después: si o sí es el sufijo del verbo
resto = resto or ""
v = v or tit
local resto_pl = args["plural"] and match(args["plural"], "^"..NO_ESPACIO.."*( .-)$") or resto
local z = sub(v, -1) -- ultimo caracter
if args["ll"] then
if z == "l" then
args[1] = {v.."ed[US]", v..z.."ed[UK]"}
args[2] = {v.."ed[US]", v..z.."ed[UK]"}
args[3] = {v.."ing[US]", v..z.."ing[UK]"}
else
args[1] = {v.."ed", v..z.."ed"}
args[2] = {v.."ed", v..z.."ed"}
args[3] = {v.."ing", v..z.."ing"}
end
end
local duplica
if find(args[1][1] or "", v..z.."ed") then
duplica = true
if not args[3][1] then
args[3][1] = v..z.."ing"
end
elseif find(args[1][1] or "", v.."ked") then
duplica = true
if not args[3][1] then
args[3][1] = v.."king"
end
end
args["pres3"] = args["pres3"][1] and args["pres3"] or args[4]
args["ger"] = args["ger"][1] and args["ger"] or args[3]
args["part"] = args["part"][1] and args["part"] or (args[2][1] and args[2] or args[1])
args["pret1"] = args["pret1"][1] and args["pret1"] or args[1]
args["pret2"] = args["pret2"][1] and args["pret2"] or args[1]
args["pret3"] = args["pret3"][1] and args["pret3"] or args[1]
args["pret4"] = args["pret4"][1] and args["pret4"] or args[1]
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or args[1]
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or args[1]
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or args[1]
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or args[1]
-- parche para be, para que sean más prácticas las locuciones
if v == "be" then
args["part"] = args["part"][1] and args["part"] or {"been"}
args["pres1"] = args["pres1"][1] and args["pres1"] or {"am"}
args["pres2"] = args["pres2"][1] and args["pres2"] or {"are"}
args["pres3"] = args["pres3"][1] and args["pres3"] or {"is"}
args["pres4"] = args["pres4"][1] and args["pres4"] or {"are"}
args["pret1"] = args["pret1"][1] and args["pret1"] or {"was"}
args["pret2"] = args["pret2"][1] and args["pret2"] or {"were"}
args["pret3"] = args["pret3"][1] and args["pret3"] or {"was"}
args["pret4"] = args["pret4"][1] and args["pret4"] or {"were"}
args["subj_pret1"] = args["subj_pret1"][1] and args["subj_pret1"] or {"were"}
args["subj_pret2"] = args["subj_pret2"][1] and args["subj_pret2"] or {"were"}
args["subj_pret3"] = args["subj_pret3"][1] and args["subj_pret3"] or {"was"}
args["subj_pret4"] = args["subj_pret4"][1] and args["subj_pret4"] or {"were"}
end
for forma, _ in pairs(formas) do
agregar_forma(conjugado, forma, v)
end
local resultante, es_irregular = sobreescribir_formas(conjugado, args)
local defectivo = comprobar_defectivo(resultante, {}, tostr)
local pret3, part1 = resultante.pret3[1], resultante.part[1]
pret3 = pret3 or "―"
part1 = part1 or "―"
local impers = args["impersonal"]
local part = deepcopy(resultante.part)
local infinit = deepcopy(resultante.inf)
local fmtinfo = {adv=adv, resto=resto, resto_pl=resto_pl, impers=impers, tit=tit, v=v}
for form, _ in pairs(formas_no_personales) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form)
end
end
for form, _ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
for form, _ in pairs(formas_personales_compuestas) do
for i,s in ipairs(tostr) do
if args[form] == "-" or args[form] == "no" then
resultante[form..s] = {}
else
if form == "fut" or form == "cond" then
resultante[form..s] = infinit
else
resultante[form..s] = part
end
formatear_conjugacion(resultante, fmtinfo, form..s)
end
end
end
if args["imper"] ~= "no" and args["imper"] ~= "-" then
formatear_conjugacion(resultante, fmtinfo, "imper1")
formatear_conjugacion(resultante, fmtinfo, "imper2")
formatear_conjugacion(resultante, fmtinfo, "imper3")
formatear_conjugacion(resultante, fmtinfo, "imper4")
else
resultante["imper1"] = {}
resultante["imper2"] = {}
resultante["imper3"] = {}
resultante["imper4"] = {}
end
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, impers)
end)
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_cond, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(it)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(it)", "(they)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "(it)", "(they)", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "(it)", "(they)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(it)", "(they)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "I", "you (thou)", "he, she, it", "we, you, they", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_cond = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_COND, header=true, class="pc"}
fila_pronombres_subj = {"", "I", "you", "he, she, it", "we, you, they", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(you)", "―", "(we)", color=COLOR_IMPER, header=true, class="pc"}
cs = 5
mostrar_imper = true
end
cs1 = math.floor(cs / 2)
cs2 = cs - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
resultante.inf.colspan=cs-1
resultante.ger.colspan=cs-1
resultante.part.colspan=cs-1
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."4"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("pres")}
t[9] = {{"Pretérito", color=COLOR_IND, header=true}, ic("pret")}
t[10] = {{"Pretérito compuesto", color=COLOR_IND, header=true}, ic("pret_comp")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("pret_ant")}
t[12] = {{"Futuro", color=COLOR_IND, header=true}, ic("fut")}
t[13] = {{"Futuro compuesto", color=COLOR_IND, header=true}, ic("fut_comp")}
t[14] = {{"Modo condicional", colspan=cs}, color=COLOR_COND, header=true}
t[15] = fila_pronombres_cond
t[16] = {{"Condicional simple", color=COLOR_COND, header=true}, ic("cond")}
t[17] = {{"Condicional compuesto", color=COLOR_COND, header=true}, ic("cond_comp")}
t[18] = {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true}
t[19] = fila_pronombres_subj
t[20] = {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")}
t[21] = {{"Pretérito", color=COLOR_SUBJ, header=true}, ic("subj_pret")}
t[22] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[23] = fila_pronombres_imper
if mostrar_imper then
t[24] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[24] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[25] = {{f("Leyenda: † arcaico, x no normativo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[26] = {{args["nota"], colspan=cs}}
local cats = {}
if es_irregular then
insert(cats, "EN:Verbos irregulares")
else
insert(cats, "EN:Verbos regulares")
if duplica then
insert(cats, "EN:Verbos con duplicación de consonante final")
end
end
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "EN:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "EN:Verbos terciopersonales")
end
if defectivo then
insert(cats, "EN:Verbos defectivos")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'' ''("..f(pret3)..", "..f(part1)..")''''' ".." ("..(es_irregular and "irregular" or "regular")..")",
t,
ns == 0 and cats or {}
)
end
return export
en0bv7mtydwwjxpltod9kvukhl7tc2g
Plantilla:ca.sust/doc
10
1056610
6307383
6288063
2026-08-06T01:00:18Z
TMCbot
164594
.
6307383
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
{{metaplantilla de avisos|tipo=desarrollo|texto=Documentación incompleta. Contactar a [[Usuario discusión:Tmagc]] si se necesita mayor información}}
== Uso ==
Esta es la nueva plantilla para flexionar '''sustantivos''' del catalán. Reemplaza a todas las anteriores que se usaron.
TLDR: '''Obligatorio especificar el género del sustantivo en el primer parámetro'''. Puede ser masculino (m), femenino (f) o masculino y femenino (mf). Obviamente que las otras opciones (ng, inv, s, p, irreg) también son aceptables y dan suficiente información para construir la flexión "regular". Para la plantilla {{ep|ca.adj}}, se activa por defecto "mf" para que genere ambas formas, mientras que el resto funciona igual a esta plantilla.
Los sustantivos se flexionan según el siguiente criterio, respetando la precedencia de las filas:
(tabla por construir)
Los sustantivos que NO se ajusten a estas reglas deberán ser tratados como irregulares, especificando toda la flexión manualmente. '''PRESTE ATENCIÓN''' Muchas irregularidades están asociadas a:
* La eliminación o inserción de la doble s final en los plurales. Actualmente la plantilla solo duplica la s en palabras terminadas en -[aàéíoò]s, de lo contrario no la duplica.
* Palabras cuyo femenino se adiciona una -a. En general se detecta cuándo debe hacerse, pero hay ciertas palabras como las terminadas en -il, -ç o -nt que se consideran invariantes en cuanto al género y si tienen femenino con -a deben ser tratadas como irregulares y ser especificado el femenino manualmente junto con las demás formas.
=== Otros casos ===
:* '''Sustantivos masculinos y femeninos''': Invóquese con el valor <code>mf</code> en el primer parámetro
:* '''Sustantivos y adjetivos invariantes, o solo en singular o plural''': En estos casos debe usarse el primer parámetro:
::* con {{epc|ca.sust|n}} o {{epc|ca.sust|ng}} (no género) se especifica "mf" pero se prohíbe explícitamente flexionar en género, muy útil en adjetivos con forma idéntica en femenino y masculino.
::* con {{epc|ca.sust|inv}}, la palabra es invariante tanto en género como en número.
::* con {{epc|ca.sust|s}} o con {{epc|ca.sust|p}}, la palabra existe solo en singular o solo en plural.
::* con {{epc|ca.sust|irreg}}, la palabra flexiona de forma irregular (ver Sustantivos y adjetivos con femeninos o plurales irregulares).
:* '''Comparativos y superlativos''': Se puede especificar cada uno de los comparativos y superlativos con los parámetros de lista {{parámetro|comparativo}} y {{parámetro|superlativo}}. Ver ejemplo en [[bueno]].
:* '''Sustantivos y adjetivos con femeninos o plurales irregulares''': Las palabras que no se ajustan a las reglas deberán especificarse manualmente con los parámetros de lista {{parámetro|p}} (plural), {{parámetro|f}} (femenino), {{parámetro|fp}} (femenino plural), habiéndose invocado con el valor "irreg" en el primer parámetro. Por defecto, el segundo, tercer y cuarto parámetro posicional de la plantilla están asociados con {{parámetro|p1}}, {{parámetro|f1}}, {{parámetro|fp1}}. Ver ejemplos en [[líder]] o [[actor]].
:* '''Notas al pie''': Se puede agregar una nota al pie con el parámetro {{parámetro|nota}}.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|1}}
|Tipo de flexión en el sustantivo o adjetivo.
|Lista de valores
|m (masculino), f (femenino), mf (masculino y femenino), ng (sin marca de género), inv (invariante), s (singularia tantum), p (pluralia tantum), irreg (sufijo completamente irregular)
|-
|{{parámetro|2}}
|Alias para {{parámetro|p1}}
|
|
|-
|{{parámetro|3}}
|Alias para {{parámetro|f1}}
|
|
|-
|{{parámetro|4}}
|Alias para {{parámetro|fp1}}
|
|
|-
|{{parámetro|ayuda}}
|Grafía de la palabra con tildes.
|Libre
|Indica cuál es la sílaba tónica o si tiene diptongos o hiatos. Si no se especifica se asume acentuación llana.
|-
|{{parámetro|s}} ({{parámetro|forzars}})
|Prohibir el plural con -es
|booleano
|n (no, por defecto), s (sí)
|-
|{{parámetro|p}} ({{parámetro|p2}}, {{parámetro|p3}}, etc.)
|Plurales (masculinos) irregulares
|Libre
|especificar el plural
|-
|{{parámetro|f}} ({{parámetro|f2}}, {{parámetro|f3}}, etc.)
|Femeninos irregulares
|Libre
|especificar el femenino
|-
|{{parámetro|fp}} ({{parámetro|fp2}}, {{parámetro|fp3}}, etc.)
|Femeninos plurales irregulares
|Libre
|especificar el femenino en plural
|-
|{{parámetro|comp}} ({{parámetro|comp2}}, {{parámetro|comp3}}, etc.)
|Comparativo
|Libre
|especificar el comparativo
|-
|{{parámetro|sup}} ({{parámetro|sup2}}, {{parámetro|sup3}}, etc.)
|Superlativo
|Libre
|especificar el superlativo
|-
|{{parámetro|cop}}
|Si la estructura es copulativa; '''obligatorio especificarlo en las locuciones que tienen plural, si no lo tiene o es invariante especificarlo con el primer parámetro posicional'''. '''PRESTE ATENCIÓN''' Debido a la ambigüedad del uso del guion que existe en el catalán, si una entrada tiene guion se procederá de la siguiente manera: si se especifica este mismo parámetro, ya sea verdadero o falso, se considera que el guion separa dos palabras, y se tratan como dos palabras distintas (locución). Si no se especifica nada, se considera que el guion separa un prefijo o una palabra compuesta, pero la plantilla la interpretará como una única palabra flexionando solo el final.
|booleano
|n (no), s (sí)
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
=== Categorías relacionadas ===
* [[:Categoría:CA:Plantillas de flexión]]
=== Véase también ===
* {{ep|ca.adj}}
* {{ep|ca.v}}
== Referencias ==
<references />
<includeonly><!--
++++ POR FAVOR, AÑADE LAS CATEGORÍAS DEBAJO DE ESTA LÍNEA, DENTRO DE LAS ETIQUETAS INCLUDEONLY, GRACIAS. -->
[[Categoría:CA:Plantillas de flexión]]
</includeonly>
co8h8m727xu0tshhex6uit6le0frdv4
acrobat
0
1058426
6307270
5865477
2026-08-05T13:17:11Z
Intolerable situation
130039
/* {{lengua|en}} */
6307270
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈækɹəbæt}}
=== Etimología ===
{{etimología|leng=en}}.
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|acróbata}}.
== {{lengua|oc}} ==
{{pron-graf|leng=oc|}}
=== Etimología ===
{{etimología|leng=oc}}.
=== {{sustantivo masculino|oc}} ===
;1: {{plm|acróbata}}.
== {{lengua|ro}} ==
{{pron-graf|leng=ro|}}
=== Etimología ===
{{etimología|leng=ro}}.
=== {{sustantivo masculino|ro}} ===
;1: {{plm|acróbata}}.
== Referencias y notas ==
<references />
giasaq8knfbambdoyg9kqio343vzfuk
6307274
6307270
2026-08-05T13:28:46Z
Intolerable situation
130039
/* {{lengua|en}} */
6307274
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈækɹəbæt|ls=3}}
=== Etimología ===
{{etimología|leng=en}}.
=== {{sustantivo|en}} ===
{{en.sust|c}}
;1: {{plm|acróbata}}.
== {{lengua|oc}} ==
{{pron-graf|leng=oc|}}
=== Etimología ===
{{etimología|leng=oc}}.
=== {{sustantivo masculino|oc}} ===
;1: {{plm|acróbata}}.
== {{lengua|ro}} ==
{{pron-graf|leng=ro|}}
=== Etimología ===
{{etimología|leng=ro}}.
=== {{sustantivo masculino|ro}} ===
;1: {{plm|acróbata}}.
== Referencias y notas ==
<references />
4wy7fspm6g9wu7ngniotdkdwt15tlo2
algae
0
1058533
6307267
5861427
2026-08-05T13:10:09Z
Intolerable situation
130039
/* {{lengua|en}} */
6307267
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=ˈæld͡ʒi|1fono2=ˈælɡi|1fono3=ˈæld͡ʒaɪ|1fono4=ˈælɡaɪ}}
=== Forma flexiva ===
==== Forma sustantiva ====
;1: {{forma sustantivo|leng=en|alga|plural}}.
== Referencias y notas ==
<references />
2csg1bph24twwrx4vbj0m1mfpuflpkn
6307268
6307267
2026-08-05T13:11:41Z
Intolerable situation
130039
/* {{lengua|en}} */
6307268
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=ˈæld͡ʒi|1fono2=ˈælɡi}}
=== Forma flexiva ===
==== Forma sustantiva ====
;1: {{forma sustantivo|leng=en|alga|plural}}.
== Referencias y notas ==
<references />
d9vqibet5rqq9lqfsgdv3p7jjunatcf
Módulo:flex/sl
828
1058643
6307345
6124313
2026-08-06T00:34:40Z
TMCbot
164594
.
6307345
Scribunto
text/plain
-- Flexión en esloveno
-- Adaptado de en.wikt
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local sub = m_str.sub
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local toNFC = m_str_avanzado.toNFC
local m_flex = require("Módulo:flex")
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local vocal = "aeiouêôẹọáéẹ́íóọ́úȃȇẹ̑ȋȏọ̑ȗèȁȅȉȍȕə̏AEIOUÊÔẸỌÁÉẸ́ÍÓỌ́ÚȂȆẸ̑ȊȎỌ̑ȖÈȀȄȈȌȔƏ̏"
local cons = "bcčćdđfghjklmnpqrsšśtvwxyzžBCČĆDĐFGHJKLMNPQRSŠŚTVWXYZŽ"
local espacios = "%-‐%s"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local LETRA = "["..vocal..cons.."]"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local ac_grave = u(0x300)
local ac_agudo = u(0x301)
local ac_circ = u(0x302)
local macron = u(0x304)
local ac_doble = u(0x30F)
local breve_inv = u(0x311)
local punto = u(0x323)
local labels = {
["nom_sg"] = "sg.",
["acc_sg"] = "sg.",
["gen_sg"] = "sg.",
["dat_sg"] = "sg.",
["loc_sg"] = "sg.",
["ins_sg"] = "sg.",
["nom_du"] = "du.",
["acc_du"] = "du.",
["gen_du"] = "du.",
["dat_du"] = "du.",
["loc_du"] = "du.",
["ins_du"] = "du.",
["nom_pl"] = "pl.",
["acc_pl"] = "pl.",
["gen_pl"] = "pl.",
["dat_pl"] = "pl.",
["loc_pl"] = "pl.",
["ins_pl"] = "pl.",
}
local function remove_accents(x)
local d = toNFD(x)
d = gsub(d, "["..ac_grave..ac_agudo..ac_circ..macron..ac_doble..breve_inv..punto.."]", "")
return toNFC(d)
end
local function make_endingless_stem(stem)
local stem_noaccents = remove_accents(stem)
if find(stem_noaccents, "[^aeioujlrv][ln]j$") then
return gsub(stem, "([ln]j)$", "e%1")
elseif find(stem_noaccents, "[^aeiouln]j$") then
return gsub(stem, "j$", "ij")
elseif find(stem_noaccents, "[^aeiou]r$") or find(stem_noaccents, "[^aeioujlrv][lmnv]$") then
return gsub(stem, "(.)$", "e%1")
else
return stem
end
end
local function is_soft(stem)
if find(stem, "[cjčšž]$") then
return true
else
return false
end
end
local function make_long(stem)
local vowel_repl = {
["à"] = "á",
["è"] = "ê",
["ì"] = "í",
["ò"] = "ô",
["ù"] = "ú"}
local function repl(vowel, rest)
return (vowel_repl[vowel] or vowel) .. rest
end
return gsub(stem, "([àèìòù])([^aeiouàèìòùáéíóúêô]+)$", repl)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["alt"] = {},
["g"] = {requerido = true},
["a"] = {tipo = "bool"},
["sg"] = {tipo = "bool", por_defecto=true},
["singular"] = {alias_de = "sg"},
["du"] = {tipo = "bool", por_defecto=true},
["dual"] = {alias_de = "du"},
["pl"] = {tipo = "bool", por_defecto=true},
["plural"] = {alias_de = "pl"},
["nom_sg"] = {lista = true},
["acc_sg"] = {lista = true},
["gen_sg"] = {lista = true},
["dat_sg"] = {lista = true},
["loc_sg"] = {lista = true},
["ins_sg"] = {lista = true},
["nom_du"] = {lista = true},
["acc_du"] = {lista = true},
["gen_du"] = {lista = true},
["dat_du"] = {lista = true},
["loc_du"] = {lista = true},
["ins_du"] = {lista = true},
["nom_pl"] = {lista = true},
["acc_pl"] = {lista = true},
["gen_pl"] = {lista = true},
["dat_pl"] = {lista = true},
["loc_pl"] = {lista = true},
["ins_pl"] = {lista = true},
["nota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(args[1], "falta especificar la raíz en el primer parámetro")
local stem = args[2] or args[1]
local stem_noending = args[2] and args[1] or make_endingless_stem(stem)
local stem_noaccents = remove_accents(stem)
local cats = {}
local oe = "o"
local soft = false
if is_soft(stem) then
oe = "e"
soft = true
end
if soft then
insert(cats, "SL:Sustantivos con raíz blanda")
else
insert(cats, "SL:Sustantivos con raíz dura")
end
local decl = {}
local tipo
if args["g"] == "m" then
decl["nom_sg"] = {stem_noending}
decl["acc_sg"] = {args["a"] and stem .. "a" or stem_noending}
decl["gen_sg"] = {stem .. "a"}
decl["dat_sg"] = {stem .. "u"}
decl["loc_sg"] = {stem .. "u"}
decl["ins_sg"] = {stem .. oe .. "m"}
decl["nom_du"] = {stem .. "a"}
decl["acc_du"] = {stem .. "a"}
decl["gen_du"] = {stem .. oe .. "v"}
decl["dat_du"] = {stem .. oe .. "ma"}
decl["loc_du"] = {stem .. "ih"}
decl["ins_du"] = {stem .. oe .. "ma"}
decl["nom_pl"] = {stem .. "i"}
decl["acc_pl"] = {stem .. "e"}
decl["gen_pl"] = {stem .. oe .. "v"}
decl["dat_pl"] = {stem .. oe .. "m"}
decl["loc_pl"] = {stem .. "ih"}
decl["ins_pl"] = {stem .. "i"}
tipo = "masculino normal"
insert(cats, "SL:Sustantivos masculinos")
if args["a"] then
insert(cats, "SL:Sustantivos masculinos animados")
else
insert(cats, "SL:Sustantivos masculinos inanimados")
end
elseif args["g"] == "m-ov" then
decl["nom_sg"] = {stem_noending}
decl["acc_sg"] = {args["a"] and stem .. "a" or stem_noending}
decl["gen_sg"] = {stem .. "a"}
decl["dat_sg"] = {stem .. "u"}
decl["loc_sg"] = {stem .. "u"}
decl["ins_sg"] = {stem .. oe .. "m"}
decl["nom_du"] = {stem_noaccents .. "ôva"}
decl["acc_du"] = {stem_noaccents .. "ôva"}
decl["gen_du"] = {stem_noaccents .. "ôv"}
decl["dat_du"] = {stem_noaccents .. "ôvoma"}
decl["loc_du"] = {stem_noaccents .. "ôvih"}
decl["ins_du"] = {stem_noaccents .. "ôvoma"}
decl["nom_pl"] = {stem_noaccents .. "ôvi"}
decl["acc_pl"] = {stem_noaccents .. "ôve"}
decl["gen_pl"] = {stem_noaccents .. "ôv"}
decl["dat_pl"] = {stem_noaccents .. "ôvom"}
decl["loc_pl"] = {stem_noaccents .. "ôvih"}
decl["ins_pl"] = {stem_noaccents .. "ôvi"}
tipo = "masculino con plural en -ôv-"
insert(cats, "SL:Sustantivos masculinos")
if args["a"] then
insert(cats, "SL:Sustantivos masculinos animados")
else
insert(cats, "SL:Sustantivos masculinos inanimados")
end
elseif args["g"] == "m-a" then
decl["nom_sg"] = {stem .. "a"}
decl["acc_sg"] = {stem .. "o"}
decl["gen_sg"] = {stem .. "e"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem .. "o"}
decl["nom_du"] = {stem .. "i"}
decl["acc_du"] = {stem .. "i"}
decl["gen_du"] = {stem_noending}
decl["dat_du"] = {stem .. "ama"}
decl["loc_du"] = {stem .. "ah"}
decl["ins_du"] = {stem .. "ama"}
decl["nom_pl"] = {stem .. "e"}
decl["acc_pl"] = {stem .. "e"}
decl["gen_pl"] = {stem_noending}
decl["dat_pl"] = {stem .. "am"}
decl["loc_pl"] = {stem .. "ah"}
decl["ins_pl"] = {stem .. "ami"}
tipo = "masculino con raíz en -a"
insert(cats, "SL:Sustantivos masculinos")
if args["a"] then
insert(cats, "SL:Sustantivos masculinos animados")
else
insert(cats, "SL:Sustantivos masculinos inanimados")
end
elseif args["g"] == "f" then
decl["nom_sg"] = {stem .. "a"}
decl["acc_sg"] = {stem .. "o"}
decl["gen_sg"] = {stem .. "e"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem .. "o"}
decl["nom_du"] = {stem .. "i"}
decl["acc_du"] = {stem .. "i"}
decl["gen_du"] = {stem_noending}
decl["dat_du"] = {stem .. "ama"}
decl["loc_du"] = {stem .. "ah"}
decl["ins_du"] = {stem .. "ama"}
decl["nom_pl"] = {stem .. "e"}
decl["acc_pl"] = {stem .. "e"}
decl["gen_pl"] = {stem_noending}
decl["dat_pl"] = {stem .. "am"}
decl["loc_pl"] = {stem .. "ah"}
decl["ins_pl"] = {stem .. "ami"}
tipo = "femenino normal"
insert(cats, "SL:Sustantivos femeninos")
elseif args["g"] == "f-mixto" then
decl["nom_sg"] = {stem .. "a"}
decl["acc_sg"] = {stem_noaccents .. "ó"}
decl["gen_sg"] = {stem_noaccents .. "é"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem_noaccents .. "ó"}
decl["nom_du"] = {stem_noaccents .. "é"}
decl["acc_du"] = {stem_noaccents .. "é"}
decl["gen_du"] = {stem_noaccents .. "á"}
decl["dat_du"] = {stem_noaccents .. "áma"}
decl["loc_du"] = {stem_noaccents .. "àh"}
decl["ins_du"] = {stem_noaccents .. "áma"}
decl["nom_pl"] = {stem_noaccents .. "é"}
decl["acc_pl"] = {stem_noaccents .. "é"}
decl["gen_pl"] = {stem_noaccents .. "á"}
decl["dat_pl"] = {stem_noaccents .. "àm"}
decl["loc_pl"] = {stem_noaccents .. "àh"}
decl["ins_pl"] = {stem_noaccents .. "ámi"}
tipo = "femenino con acento mixto"
insert(cats, "SL:Sustantivos femeninos")
elseif args["g"] == "f-v" then
decl["nom_sg"] = {stem_noending}
decl["acc_sg"] = {stem_noending}
decl["gen_sg"] = {stem .. "e"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem .. "ijo"}
decl["nom_du"] = {stem .. "i"}
decl["acc_du"] = {stem .. "i"}
decl["gen_du"] = {stem_noending}
decl["dat_du"] = {stem .. "ama"}
decl["loc_du"] = {stem .. "ah"}
decl["ins_du"] = {stem .. "ama"}
decl["nom_pl"] = {stem .. "e"}
decl["acc_pl"] = {stem .. "e"}
decl["gen_pl"] = {stem_noending}
decl["dat_pl"] = {stem .. "am"}
decl["loc_pl"] = {stem .. "ah"}
decl["ins_pl"] = {stem .. "ami"}
tipo = "femenino con raíz en -v"
insert(cats, "SL:Sustantivos femeninos")
elseif args["g"] == "f-i" then
decl["nom_sg"] = {stem_noending}
decl["acc_sg"] = {stem_noending}
decl["gen_sg"] = {stem .. "i"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem .. (stem ~= stem_noending and "i" or "") .. "jo"}
decl["nom_du"] = {stem .. "i"}
decl["acc_du"] = {stem .. "i"}
decl["gen_du"] = {stem .. "i"}
decl["dat_du"] = {stem .. (stem ~= stem_noending and "i" or "") .. "ma"}
decl["loc_du"] = {stem .. "ih"}
decl["ins_du"] = {stem .. (stem ~= stem_noending and "i" or "") .. "ma"}
decl["nom_pl"] = {stem .. "i"}
decl["acc_pl"] = {stem .. "i"}
decl["gen_pl"] = {stem .. "i"}
decl["dat_pl"] = {stem .. "im"}
decl["loc_pl"] = {stem .. "ih"}
decl["ins_pl"] = {stem .. (stem ~= stem_noending and "i" or "") .. "mi"}
tipo = "femenino con raíz en -i"
insert(cats, "SL:Sustantivos femeninos")
elseif args["g"] == "f-i-mixto" then
decl["nom_sg"] = {stem_noending}
decl["acc_sg"] = {stem_noending}
decl["gen_sg"] = {stem_noaccents .. "í"}
decl["dat_sg"] = {stem .. "i"}
decl["loc_sg"] = {stem .. "i"}
decl["ins_sg"] = {stem_noaccents .. (stem ~= stem_noending and "i" or "") .. "jó"}
decl["nom_du"] = {stem_noaccents .. "í"}
decl["acc_du"] = {stem_noaccents .. "í"}
decl["gen_du"] = {stem_noaccents .. "í"}
decl["dat_du"] = {stem_noaccents .. "éma"}
decl["loc_du"] = {stem_noaccents .. "éh"}
decl["ins_du"] = {stem_noaccents .. "éma"}
decl["nom_pl"] = {stem_noaccents .. "í"}
decl["acc_pl"] = {stem_noaccents .. "í"}
decl["gen_pl"] = {stem_noaccents .. "í"}
decl["dat_pl"] = {stem_noaccents .. "ém"}
decl["loc_pl"] = {stem_noaccents .. "éh"}
decl["ins_pl"] = {stem_noaccents .. (stem ~= stem_noending and "i" or "") .. "mí"}
tipo = "femenino con raíz en -i, acento mixto"
insert(cats, "SL:Sustantivos femeninos")
elseif args["g"] == "n" then
decl["nom_sg"] = {stem .. oe}
decl["acc_sg"] = {stem .. oe}
decl["gen_sg"] = {stem .. "a"}
decl["dat_sg"] = {stem .. "u"}
decl["loc_sg"] = {stem .. "u"}
decl["ins_sg"] = {stem .. oe .. "m"}
decl["nom_du"] = {stem .. "i"}
decl["acc_du"] = {stem .. "i"}
decl["gen_du"] = {stem_noending}
decl["dat_du"] = {stem .. oe .. "ma"}
decl["loc_du"] = {stem .. "ih"}
decl["ins_du"] = {stem .. oe .. "ma"}
decl["nom_pl"] = {stem .. "a"}
decl["acc_pl"] = {stem .. "a"}
decl["gen_pl"] = {stem_noending}
decl["dat_pl"] = {stem .. oe .. "m"}
decl["loc_pl"] = {stem .. "ih"}
decl["ins_pl"] = {stem .. "i"}
tipo = "neutro"
insert(cats, "SL:Sustantivos neutros")
else
error("Debe especificar el género con uno de los siguientes valores: m, m-ov, m-a, f, f-mixto, f-i, f-i-mixto, f-v, n")
end
local sg = args["sg"]
local pl = args["pl"]
local du = args["du"]
local dec = sobreescribir_formas(decl, args)
dec = desactivar_formas(dec,
function (form)
local xx = sub(form, -2)
return (xx == "sg" and not sg) or (xx == "pl" and not pl) or xx == "du" and not du
end
)
dec = agregar_enlaces(dec, title, remove_accents)
dec = formatear_formas(dec, labels)
local t = {}
insert(t, {{""}, {"Singular"}, {"Dual"}, {"Plural"}, header=true, color=COLOR_H})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, dec["nom_sg"], dec["nom_du"], dec["nom_pl"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, dec["gen_sg"], dec["gen_du"], dec["gen_pl"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, dec["dat_sg"], dec["dat_du"], dec["dat_pl"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, dec["acc_sg"], dec["acc_du"], dec["acc_pl"]})
insert(t, {{"Locativo", header=true, color=COLOR_H}, dec["loc_sg"], dec["loc_du"], dec["loc_pl"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, dec["ins_sg"], dec["ins_du"], dec["ins_pl"]})
insert(t, {{args["nota"] or "", colspan=4}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''  tipo: "..tipo..", "..(args["a"] and "animado" or "inanimado"),
t,
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["alt"] = {},
["def"] = {tipo = "bool"},
["a"] = {tipo = "bool", requerido = true},
["sg"] = {tipo = "bool", por_defecto=true},
["singular"] = {alias_de = "sg"},
["du"] = {tipo = "bool", por_defecto=true},
["dual"] = {alias_de = "du"},
["pl"] = {tipo = "bool", por_defecto=true},
["plural"] = {alias_de = "pl"},
["nom_sg"] = {lista = true},
["acc_sg"] = {lista = true},
["gen_sg"] = {lista = true},
["dat_sg"] = {lista = true},
["loc_sg"] = {lista = true},
["ins_sg"] = {lista = true},
["nom_du"] = {lista = true},
["acc_du"] = {lista = true},
["gen_du"] = {lista = true},
["dat_du"] = {lista = true},
["loc_du"] = {lista = true},
["ins_du"] = {lista = true},
["nom_pl"] = {lista = true},
["acc_pl"] = {lista = true},
["gen_pl"] = {lista = true},
["dat_pl"] = {lista = true},
["loc_pl"] = {lista = true},
["ins_pl"] = {lista = true},
["nota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(args[1], "falta especificar la raíz en el primer parámetro")
-- Create the full stem, which is used when endings are added
local final = args[2]
local stem = args[1]
local full_stem = args[1]
if final then
full_stem = full_stem .. final
else
full_stem = make_long(full_stem)
end
local cats = {}
--[[
if args["a"] then
insert(cats, "SL:Adjetivos animados")
else
insert(cats, "SL:Adjetivos inanimados")
end
]]--
local oe = "o"
local soft = false
if is_soft(stem) then
oe = "e"
soft = true
end
if soft then
insert(cats, "SL:Adjetivos con raíz blanda")
else
insert(cats, "SL:Adjetivos con raíz dura")
end
local decl = {}
local tipo
if args["def"] == true then
decl["nom_sg"] = {full_stem .. "i", full_stem .. "a", full_stem .. oe}
elseif args["def"] == false then
decl["nom_sg"] = {stem .. (final and "e" .. final or "") , full_stem .. "a", full_stem .. oe}
else
decl["nom_sg"] = {full_stem .. "i", stem .. (final and "e" .. final or "") , full_stem .. "a", full_stem .. oe}
end
decl["acc_sg"] = {args["a"] and full_stem .. "ega" or decl["nom_sg"][1], full_stem .. "o", full_stem .. oe}
decl["gen_sg"] = {full_stem .. "ega", full_stem .. "e", full_stem .. "ega"}
decl["dat_sg"] = {full_stem .. "emu", full_stem .. "i", full_stem .. "emu"}
decl["loc_sg"] = {full_stem .. "em", full_stem .. "i", full_stem .. "em"}
decl["ins_sg"] = {full_stem .. "im", full_stem .. "o", full_stem .. "im"}
decl["nom_du"] = {full_stem .. "a", full_stem .. "i", full_stem .. "i"}
decl["acc_du"] = {full_stem .. "a", full_stem .. "i", full_stem .. "i"}
decl["gen_du"] = {full_stem .. "ih", full_stem .. "ih", full_stem .. "ih"}
decl["dat_du"] = {full_stem .. "ima", full_stem .. "ima", full_stem .. "ima"}
decl["loc_du"] = {full_stem .. "ih", full_stem .. "ih", full_stem .. "ih"}
decl["ins_du"] = {full_stem .. "ima", full_stem .. "ima", full_stem .. "ima"}
decl["nom_pl"] = {full_stem .. "i", full_stem .. "e", full_stem .. "a"}
decl["acc_pl"] = {full_stem .. "e", full_stem .. "e", full_stem .. "a"}
decl["gen_pl"] = {full_stem .. "ih", full_stem .. "ih", full_stem .. "ih"}
decl["dat_pl"] = {full_stem .. "im", full_stem .. "im", full_stem .. "im"}
decl["loc_pl"] = {full_stem .. "ih", full_stem .. "ih", full_stem .. "ih"}
decl["ins_pl"] = {full_stem .. "imi", full_stem .. "imi", full_stem .. "imi"}
local sg = args["sg"]
local pl = args["pl"]
local du = args["du"]
local dec = sobreescribir_formas(decl, args)
dec = agregar_enlaces(dec, title, remove_accents)
dec = formatear_formas(dec, labels)
local t = {}
insert(t, {{""}, {"Singular"}, {"Dual"}, {"Plural"}, header=true, color=COLOR_H})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, dec["nom_sg"], dec["nom_du"], dec["nom_pl"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, dec["gen_sg"], dec["gen_du"], dec["gen_pl"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, dec["dat_sg"], dec["dat_du"], dec["dat_pl"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, dec["acc_sg"], dec["acc_du"], dec["acc_pl"]})
insert(t, {{"Locativo", header=true, color=COLOR_H}, dec["loc_sg"], dec["loc_du"], dec["loc_pl"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, dec["ins_sg"], dec["ins_du"], dec["ins_pl"]})
insert(t, {{args["n"] or "", colspan=4}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''  tipo: "..tipo..", "..(args["a"] and "animado" or "inanimado"),
t,
ns == 0 and cats or {}
)
end
return export
o0t5duliu5z0pkk3yd95kp83dun94hn
Módulo:flex/cs
828
1058703
6307323
6288411
2026-08-06T00:33:59Z
TMCbot
164594
.
6307323
Scribunto
text/plain
-- Flexión para el checo
-- Importado desde en.wikt por Tmagc
local export = {}
local unpack = unpack or table.unpack
local concat = table.concat
local insert = table.insert
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local match = m_str.match
local gmatch = m_str.gmatch
local gsplit = m_str.gsplit
local gsub = m_str.gsub
local len = m_str.len
local upper = m_str.upper
local m_flex = require("Módulo:flex")
local separar_palabras = m_flex.separar_palabras
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local TEMP_CH = u(0xFFF0)
local TEMP_SOFT_LABIAL = u(0xFFF1)
local lowercase = "aeiouyáéíóúýěůbcdfghjkmnpqstvwxzčňšžďťlrř"
local uppercase = "AEIOUYÁÉÍÓÚÝĚŮBCDFGHJKMNPQSTVWXZČŇŠŽĎŤLRŘ"
local vowel = "aeiouyáéíóúýěůAEIOUYÁÉÍÓÚÝĚŮ"
local cons = "bcdfghjkmnpqstvwxzčňšžďťlrřBCDFGHJKMNPQSTVWXZČŇŠŽĎŤLRŘ"..TEMP_CH
local non_syllabic_cons = "bcdfghjkmnpqstvwxzčňšžďťBCDFGHJKMNPQSTVWXZČŇŠŽĎŤ"..TEMP_CH..TEMP_SOFT_LABIAL
local velar = "kghKGH"
local plain_labial = "mpbfvwMPBFVW"
local labial = plain_labial..TEMP_SOFT_LABIAL
local inherently_soft_not_c = "čjřšžťďňČJŘŠŽŤĎŇ"
local inherently_soft = inherently_soft_not_c .. "cC"
local paired_plain = "ndtNDT"
local paired_palatal = "ňďťŇĎŤ"
local followable_by_e_hacek = labial..paired_plain
local LOWERCASE_C = "["..lowercase.."]"
local UPPERCASE_C = "["..uppercase.."]"
local VOWEL_C = "["..vowel.."]"
local CONS_C = "["..cons.."]"
local NON_SYLLABIC_CONS_C = "["..non_syllabic_cons.."]"
local VELAR_C = "["..velar.."]"
local LABIAL_C = "["..labial.."]"
local INHERENTLY_SOFT_NOT_C_C = "["..inherently_soft_not_c.."]"
local INHERENTLY_SOFT_C = "["..inherently_soft.."]"
local PAIRED_PLAIN_C = "["..paired_plain.."]"
local PAIRED_PALATAL_C = "["..paired_palatal.."]"
local FOLLOWABLE_BY_E_HACEK_C = "["..followable_by_e_hacek.."]"
local paired_palatal_to_plain = {
["ň"] = "n",
["Ň"] = "N",
["ť"] = "t",
["Ť"] = "T",
["ď"] = "d",
["Ď"] = "D",
}
local paired_plain_to_palatal = {}
for k, v in pairs(paired_palatal_to_plain) do
paired_plain_to_palatal[v] = k
end
paired_palatal_to_plain[TEMP_SOFT_LABIAL] = ""
for labial in gmatch(plain_labial, ".") do
paired_plain_to_palatal[labial] = labial .. TEMP_SOFT_LABIAL
end
local function convert_paired_plain_to_palatal(stem, ending)
if ending and not find(ending, "^[ěií]") then
return stem
end
local stembegin, lastchar = match(stem, "^(.*)(" .. FOLLOWABLE_BY_E_HACEK_C .. ")$")
if lastchar then
return stembegin .. paired_plain_to_palatal[lastchar]
else
return stem
end
end
local function convert_paired_palatal_to_plain(stem, ending)
-- For stems that alternate between n/t/d and ň/ť/ď, we always maintain the stem in the latter format and convert
-- to the corresponding plain as needed, with e -> ě. Likewise, stems ending in /bj/ /vj/ etc. use TEMP_SOFT_LABIAL.
if ending and not find(ending, "^[Eeěií]") then
stem = stem:gsub(TEMP_SOFT_LABIAL, "")
return stem, ending
end
local stembegin, lastchar = match(stem, "^(.*)([" .. paired_palatal .. TEMP_SOFT_LABIAL .. "])$")
if lastchar then
ending = ending and gsub(ending, "^e", "ě") or nil
stem = stembegin .. paired_palatal_to_plain[lastchar]
end
-- 'E' has served its purpose of preventing the e -> ě conversion after a paired palatal (i.e. it depalatalizes
-- paired palatals).
ending = ending and gsub(ending, "^E", "e") or nil
return stem, ending
end
local function is_monosyllabic(word)
-- Treat ou as a single vowel.
word = word:gsub("ou", "ů")
word = word:gsub("ay$", "aj")
-- Convert all vowels to 'e'.
word = gsub(word, VOWEL_C, "e")
-- All consonants next to a vowel are non-syllabic; convert to 't'.
word = gsub(word, CONS_C .. "e", "te")
word = gsub(word, "e" .. CONS_C, "et")
-- Convert all remaining non-syllabic consonants to 't'.
word = gsub(word, NON_SYLLABIC_CONS_C, "t")
-- At this point, what remains is 't', 'e', or a syllabic consonant. Count the latter two types.
word = word:gsub("t", "")
return len(word) <= 1
end
local function apply_vowel_alternation(alt, stem)
local modstem, origvowel
if alt == "quant" or alt == "quant-ě" then
-- [[sníh]] "snow", gen sg. [[sněhu]]
-- [[míra]] "snow", gen pl. [[měr]]
-- [[hůl]] "cane", gen sg. [[hole]]
-- [[práce]] "work", ins sg. [[prací]]
modstem = gsub(stem, "(.)([íůáé])(" .. CONS_C .. "*)$",
function(pre, vowel, post)
origvowel = vowel
if vowel == "í" then
if alt == "quant-ě" then
if find(pre, FOLLOWABLE_BY_E_HACEK_C.."$") then
return pre .. "ě" .. post
else
return pre .. "e" .. post
end
else
return pre .. "i" .. post
end
elseif vowel == "ů" then
return pre .. "o" .. post
elseif vowel == "é" then
return pre .. "e" .. post
else
return pre .. "a" .. post
end
end
)
-- [[houba]] "mushroom", gen pl. [[hub]]
modstem = gsub(modstem, "ou(" .. CONS_C .. "*)$", "u%1")
if modstem == stem then
error("Indicator '" .. alt .. "' can't be applied because stem '" .. stem .. "' doesn't have an í, ů, ou, á or é as its last vowel")
end
else
return stem, nil
end
return modstem, origvowel
end
local function make_try(word)
return function(from, to)
local stem = match(word, "^(.*)" .. from .. "$")
if stem then
return stem .. to
end
return nil
end
end
local function apply_first_palatalization(word, is_adjective)
-- -rr doesn't palatalize (e.g. [[torr]] voc_s 'torre') but otherwise -Cr normally does.
if find(word, "rr$") then
return word
end
local stem = match(word, "^(.*" .. CONS_C .. ")r$")
if stem then
return stem .. "ř"
end
local try = make_try(word)
return
try("ch", "š") or
try("[hg]", "ž") or
is_adjective and try("sk", "št") or
is_adjective and try("ck", "čt") or
try("[kc]", "č") or
word
end
local function apply_second_palatalization(word, is_adjective)
local try = make_try(word)
return
try("ch", "š") or
try("[hg]", "z") or
try("rr", "ř") or
try("r", "ř") or
is_adjective and try("sk", "št") or
is_adjective and try("ck", "čt") or
try("k", "c") or
word
end
local function undo_second_palatalization(word, is_adjective)
local try = make_try(word)
return is_adjective and try("št", "sk") or
is_adjective and try("čt", "ck") or
try("c", "k") or -- FIXME, this could be wrong and c correct
try("ř", "r") or
try("z", "h") or -- FIXME, this could be wrong and z or g correct
try("š", "ch") or
word
end
local function reduce(word)
local pre, letter, vowel, post = match(word, "^(.*)([" .. cons .. "y%-])([eě])(" .. CONS_C .. "+)$")
if not pre then
return nil
end
if vowel == "ě" and find(letter, PAIRED_PLAIN_C) then
letter = paired_plain_to_palatal[letter]
end
return pre .. letter .. post
end
local function dereduce(base, stem)
local pre, letter, post = match(stem, "^(.*)(" .. CONS_C .. ")(" .. CONS_C .. ")$")
if not pre or not letter or not post then
error("Unable to dereduce stem '" .. stem .. "'")
return nil
end
local epvowel
if find(letter, PAIRED_PALATAL_C) then
letter = paired_palatal_to_plain[letter]
epvowel = "ě"
else
epvowel = "e"
end
if base.c_as_k and post == "c" then
-- [[ayahuasca]] dereduces to gen pl 'ayahuasek'
post = "k"
end
return pre .. letter .. epvowel .. post
end
-- For an adjectival lemma, synthesize the masc singular form.
local function synthesize_adj_lemma(base)
local stem
if base.indecl then
base.decl = "indecl"
stem = base.lemma
else
local gender, number
local function sub_ov(stem)
stem = stem:gsub("ov$", "ův")
return stem
end
while true do
if base.number == "pl" then
if base.gender == "m" then
stem = match(base.lemma, "^(.*)í$")
if stem then
if base.soft then
-- nothing to do
else
if base.animacy ~= "an" then
error(("Masculine plural-only adjectival lemma '%s' ending in -í can only be animate unless '.soft' is specified"):
format(base.lemma))
end
base.lemma = undo_second_palatalization(stem, true) .. "ý"
end
break
end
stem = match(base.lemma, "^(.*)é$")
if stem then
if base.animacy == "an" then
error(("Masculine plural-only adjectival lemma '%s' ending in -é must be inanimate"):
format(base.lemma))
end
base.lemma = stem .. "ý"
break
end
stem = match(base.lemma, "^(.*ov)i$") or match(base.lemma, "^(.*in)i$")
if stem then
if base.animacy ~= "an" then
error(("Masculine plural-only possessive adjectival lemma '%s' ending in -i must be animate"):
format(base.lemma))
end
base.lemma = sub_ov(stem)
break
end
stem = match(base.lemma, "^(.*ov)y$") or match(base.lemma, "^(.*in)y$")
if stem then
if base.animacy == "an" then
error(("Masculine plural-only possessive adjectival lemma '%s' ending in -y must be inanimate"):
format(base.lemma))
end
base.lemma = sub_ov(stem)
break
end
if base.animacy == "an" then
error(("Animate masculine plural-only adjectival lemma '%s' should end in -í, -ovi or -ini"):
format(base.lemma))
elseif base.soft then
error(("Soft masculine plural-only adjectival lemma '%s' should end in -í"):format(base.lemma))
else
error(("Inanimate masculine plural-only adjectival lemma '%s' should end in -é, -ovy or -iny"):
format(base.lemma))
end
elseif base.gender == "f" then
stem = match(base.lemma, "^(.*)é$") -- hard adjective
if stem then
base.lemma = stem .. "ý"
break
end
stem = match(base.lemma, "^(.*)í$") -- soft adjective
if stem then
break
end
stem = match(base.lemma, "^(.*ov)y$") or match(base.lemma, "^(.*in)y$") -- possessive adjective
if stem then
base.lemma = sub_ov(stem)
break
end
error(("Feminine plural-only adjectival lemma '%s' should end in -é, -í, -ovy or -iny"):format(base.lemma))
else
stem = match(base.lemma, "^(.*)á$") -- hard adjective
if stem then
base.lemma = stem .. "ý"
break
end
stem = match(base.lemma, "^(.*)í$") -- soft adjective
if stem then
break
end
stem = match(base.lemma, "^(.*ov)a$") or match(base.lemma, "^(.*in)a$") -- possessive adjective
if stem then
base.lemma = sub_ov(stem)
break
end
error(("Neuter plural-only adjectival lemma '%s' should end in -á, -í, -ova or -ina"):format(base.lemma))
end
else
if base.gender == "m" then
stem = match(base.lemma, "^(.*)[ýí]$") or match(base.lemma, "^(.*)ův$") or match(base.lemma, "^(.*)in$")
if stem then
break
end
error(("Masculine adjectival lemma '%s' should end in -ý, -í, -ův or -in"):format(base.lemma))
elseif base.gender == "f" then
stem = match(base.lemma, "^(.*)á$")
if stem then
base.lemma = stem .. "ý"
break
end
stem = match(base.lemma, "^(.*)í$")
if stem then
break
end
stem = match(base.lemma, "^(.*ov)a$") or match(base.lemma, "^(.*in)a$")
if stem then
base.lemma = sub_ov(stem)
break
end
error(("Feminine adjectival lemma '%s' should end in -á, -í, -ova or -ina"):format(base.lemma))
else
stem = match(base.lemma, "^(.*)é$")
if stem then
base.lemma = stem .. "ý"
break
end
stem = match(base.lemma, "^(.*)í$")
if stem then
break
end
stem = match(base.lemma, "^(.*ov)o$") or match(base.lemma, "^(.*in)o$")
if stem then
base.lemma = sub_ov(stem)
break
end
error(("Neuter adjectival lemma '%s' should end in -é, -í, -ovo or -ino"):format(base.lemma))
end
end
end
base.decl = "adj"
end
-- Now set the stem sets if not given.
-- Now set the stem sets if not given.
if not base.stem_sets then
base.stem_sets = {{reducible = false}}
end
for _, stems in ipairs(base.stem_sets) do
-- Set the stems.
stems.vowel_stem = stem
stems.nonvowel_stem = stem
end
end
local function adj_combine_stem_ending(stem, ending)
if stem == "?" then
return "?"
else
return stem .. ending
end
end
local function adj_add(base, slot, stems, endings, footnote)
if not stems or not endings then
return
end
if type(stems) == "string" then
stems = {stems}
end
if type(endings) == "string" then
endings = {endings}
end
local ll = {}
for _,stem in ipairs(stems) do
for _,ending in ipairs(endings) do
ll[adj_combine_stem_ending(stem, ending)] = true
end
end
if not base.forms[slot] then
base.forms[slot] = {}
end
for l,_ in pairs(ll) do
insert(base.forms[slot], l..(footnote and "{"..footnote.."}" or ""))
end
end
local function adj_add_normal_decl(base, stems,
nom_m, nom_f, nom_n, nom_mp_an, nom_fp, nom_np,
gen_mn, gen_f, gen_p,
dat_mn, dat_f, dat_p,
acc_f,
loc_mn, loc_f, loc_p,
ins_mn, ins_f, ins_p,
footnote)
adj_add(base, "nom_m", stems, nom_m, footnote)
adj_add(base, "nom_f", stems, nom_f, footnote)
adj_add(base, "nom_n", stems, nom_n, footnote)
adj_add(base, "nom_mp_an", stems, nom_mp_an, footnote)
adj_add(base, "nom_fp", stems, nom_fp, footnote)
adj_add(base, "nom_np", stems, nom_np, footnote)
adj_add(base, "gen_mn", stems, gen_mn, footnote)
adj_add(base, "gen_f", stems, gen_f, footnote)
adj_add(base, "gen_p", stems, gen_p, footnote)
adj_add(base, "dat_mn", stems, dat_mn, footnote)
adj_add(base, "dat_f", stems, dat_f, footnote)
adj_add(base, "dat_p", stems, dat_p, footnote)
adj_add(base, "acc_f", stems, acc_f, footnote)
adj_add(base, "loc_mn", stems, loc_mn, footnote)
adj_add(base, "loc_f", stems, loc_f, footnote)
adj_add(base, "loc_p", stems, loc_p, footnote)
adj_add(base, "ins_mn", stems, ins_mn, footnote)
adj_add(base, "ins_f", stems, ins_f, footnote)
adj_add(base, "ins_p", stems, ins_p, footnote)
end
local function adj_add_short_decl(base, stems, m, f_, n, mp_an, fp, np, footnote)
adj_add(base, "short_m", stems, m, footnote)
adj_add(base, "short_f", stems, f_, footnote)
adj_add(base, "short_n", stems, n, footnote)
adj_add(base, "short_mp_an", stems, mp_an, footnote)
adj_add(base, "short_fp", stems, fp, footnote)
adj_add(base, "short_np", stems, np, footnote)
end
local function adj_fill_decls(base)
base.forms["acc_n"] = deepcopy(base.forms["nom_n"])
base.forms["acc_m_an"] = deepcopy(base.forms["gen_mn"])
base.forms["acc_m_in"] = deepcopy(base.forms["nom_m"])
base.forms["acc_mfp"] = deepcopy(base.forms["nom_fp"])
base.forms["acc_np"] = deepcopy(base.forms["nom_np"])
end
local adj_decls = {}
adj_decls["normal"] = function(base)
local stem, suffix
-- hard in -ý
stem, suffix = match(base.lemma, "^(.*)(ý)$")
if stem then
adj_add_normal_decl(base, stem,
"ý", "á", "é", {}, "é", "á",
"ého", "é", "ých",
"ému", "é", "ým",
"ou",
"ém", "é", "ých",
"ým", "ou", "ými"
)
-- Do the nominative masculine animate plural separately since it may have a different stem (with the second
-- palatalization applied).
adj_add_normal_decl(base, apply_second_palatalization(stem, "is adj"), nil, nil, nil, "í")
if base.short then
-- Examples of short adjectives:
-- bledý "pale" -> bled
-- bosý "barefoot" -> bos
-- pilný "hardworking, diligent" -> pilen (reducible)
-- veselý "funny, jolly" -> vesel
-- jistý "certain, sure" -> jist
-- vinný "guilty" -> vinen (reducible)
-- živý "alive, living" -> živ
-- tichý "quiet" -> tich; mp_an = tiši
-- vědomý "conscious, aware" -> vědom
-- rád "glad" (short only)
-- chudý "poor" -> chud
-- nevinný "innocent" -> nevinen (reducible)
-- silný "strong" -> silen (reducible)
-- známý "known" -> znám
-- mladý "young" -> mlád (note length); other forms have mlád- or mlad-
-- starý "old" -> stár (note length); other forms have stár- or star-; mp_an = stáři, staři
-- slabý "weak" -> sláb (note length); other forms only have sláb- (FIXME: check against a grammar)
-- zdravý "healthy" -> zdráv (note length); other forms only have zdráv- (FIXME: check against a grammar)
-- nemocný "ill" -> nemocen (reducible)
-- plný "full" -> pln
-- schopný "able, capable" -> schopen (reducible)
-- vděčný "grateful" -> vděčen (reducible)
-- věrný "faithful" -> věren (reducible)
-- šťastný "happy" -> šťasten (reducible)
-- křepký "strong" -> křepek (reducible); mp_an = křepci
-- hotový "ready, finished" -> hotov
-- němý "mute" -> něma
-- smutný "sad" -> smuten (reducible)
-- samotný "lonely" -> samoten (reducible)
-- bohatý "rich" -> bohat
-- chladný "cold" -> chladen (reducible)
-- dlužný "necessary?" -> dlužen (reducible)
-- povinný "mandatory" -> povinen (reducible)
-- zodpovědný "responsible" -> zodpověden (reducible)
-- udatný "brave" -> udaten (reducible)
-- náchylný "susceptible" -> náchylen (reducible)
for _, short_stem_obj in ipairs(base.short) do
adj_add_short_decl(base, short_stem_obj.base, "")
adj_add_short_decl(base, short_stem_obj.stem, nil, "a", "o", nil, "y", "a")
adj_add_short_decl(base, apply_second_palatalization(short_stem_obj.stem[1], "is adj"), nil, nil, nil, "i",
short_stem_obj.stem.footnotes)
end
end
return
end
-- soft in -í
stem, suffix = match(base.lemma, "^(.*)(í)$")
if stem then
adj_add_normal_decl(base, stem,
"í", "í", "í", "í", "í", "í",
"ího", "í", "ích",
"ímu", "í", "ím",
"í",
"ím", "í", "ích",
"ím", "í", "ími"
)
return
end
-- possessive in -ův
stem, suffix = match(base.lemma, "^(.*)(ův)$")
if stem then
adj_add_normal_decl(base, stem,
"ův", "ova", "ovo", "ovi", "ovy", "ova",
"ova", "ovy", "ových",
"ovu", "ově", "ovým",
"ovu",
{"ově", "ovu"}, "ově", "ových",
"ovým", "ovou", "ovými"
)
return
end
-- possessive in -in
stem, suffix = match(base.lemma, "^(.*)(in)$")
if stem then
adj_add_normal_decl(base, stem,
"in", "ina", "ino", "ini", "iny", "ina",
"ina", "iny", "iných",
"inu", "ině", "iným",
"inu",
{"ině", "inu"}, "ině", "iných",
"iným", "inou", "inými"
)
return
end
error("Unrecognized adjective lemma, should end in '-ý', '-í', '-ův' or '-in': '" .. base.lemma .. "'")
end
adj_decls["irreg"] = function(base)
local stem, suffix
local obs_note = "†"
-- determiner like můj
stem, suffix = match(base.lemma, "^(.*)(ůj)$")
if stem then
adj_add_normal_decl(base, stem,
"ůj", {"á", "oje"}, {"é", "oje"}, {"í", "oji"}, {"é", "oje"}, {"á", "oje"},
"ého", {"é", "ojí"}, "ých",
"ému", {"é", "ojí"}, "ým",
{"ou", "oji"},
"ém", {"é", "ojí"}, "ých",
"ým", {"ou", "ojí"}, "ými"
)
return
end
-- determiner like dvoje
stem, suffix = match(base.lemma, "^(.*)(oje)$")
if stem then
adj_add_normal_decl(base, stem,
nil, nil, "oje", nil, "oje", "oje",
"ojího", nil, "ojích",
"ojímu", nil, "ojím",
nil,
"ojím", nil, "ojích",
"ojím", nil, "ojími"
)
adj_add_normal_decl(base, stem,
"ůj", "oje", nil, "oji", nil, nil,
nil, "ojí", nil,
nil, "ojí", nil,
"oji",
nil, "ojí", nil,
nil, "ojí", nil, obs_note
)
return
end
-- determiner like čtvery
stem, suffix = match(base.lemma, "^(.*)(ery)$")
if stem then
adj_add_normal_decl(base, stem,
nil, nil, "ero", nil, "ery", "era",
"erého", nil, "erých",
"erému", nil, "erým",
nil,
"erém", nil, "erých",
"erým", nil, "erými"
)
adj_add_normal_decl(base, stem,
"er", "era", nil, "eři", nil, nil,
nil, "eré", nil,
nil, "eré", nil,
"eru",
nil, "eré", nil,
nil, "erou", nil, obs_note
)
return
end
if base.lemma == "všechen" then
adj_add_normal_decl(base, "",
"všechen", "všechna", {"všechno", "vše"}, "všichni", "všechny", "všechna",
"všeho", "vší", "všech",
"všemu", "vší", "všem",
{"všechnu", "vši"},
"všem", "vší", "všech",
"vším", "vší", "všemi"
)
return
end
if base.lemma == "všecek" then
adj_add_normal_decl(base, "",
"všecek", "všecka", {"všecko", "vše"}, "všicci", "všecky", "všecka",
"všeho", "vší", "všech",
"všemu", "vší", "všem",
{"všecku", "vši"},
"všem", "vší", "všech",
"vším", "vší", "všemi"
)
return
end
if base.lemma == "všecken" then
adj_add_normal_decl(base, "",
"všecken", "všeckna", {"všeckno", "vše"}, "všickni", "všeckny", "všeckna",
"všeho", "vší", "všech",
"všemu", "vší", "všem",
{"všecknu", "vši"},
"všem", "vší", "všech",
"vším", "vší", "všemi"
)
return
end
-- determiner like [[ten]], [[tamten]], [[tamhleten]], [[tuten]], [[jeden]], [[onen]]
-- [[tento]] uses 'ten<irreg>to'
-- [[tenhle]] uses 'ten<irreg>hle'
-- [[tenhleten]] uses 'ten<irreg>hleten<irreg>'
stem, suffix = match(base.lemma, "^(.*)(en)$")
if stem then
local nom_stem = stem .. suffix
if nom_stem == "jeden" then
stem = "jedn"
end
adj_add_normal_decl(base, nom_stem, "")
adj_add_normal_decl(base, stem,
nil, "a", "o", "i", "y", "a",
"oho", "é", "ěch",
"omu", "é", "ěm",
"u",
"om", "é", "ěch",
"ím", "ou", "ěmi"
)
return
end
-- [[náš]], [[váš]]
stem, suffix = match(base.lemma, "^(.*)(áš)$")
if stem then
local nom_stem = stem .. suffix
stem = stem .. "aš"
adj_add_normal_decl(base, nom_stem, "")
adj_add_normal_decl(base, stem,
nil, "e", "e", "i", "e", "e",
"eho", "í", "ich",
"emu", "í", "im",
"i",
"em", "í", "ich",
"ím", "í", "imi"
)
return
end
if base.lemma == "jenž" then
local preposition_footnote = "j-/n-"
-- Add the non-prepositional forms.
adj_add_normal_decl(base, "",
"jenž", "jež", "jež", "již", "jež", "jež",
{"jehož", "jejž"}, "jíž", "jichž",
"jemuž", "jíž", "jimž",
"již",
nil, nil, nil,
"jímž", "jíž", "jimiž"
)
-- Add the prepositional forms. (FIXME: Maybe should go in a separate column in a special table.)
adj_add_normal_decl(base, "",
nil, nil, nil, nil, nil, nil,
{"něhož", "nějž"}, "níž", "nichž",
"němuž", "níž", "nimž",
"niž",
"němž", "níž", "nichž",
"nímž", "níž", "nimiž",
preposition_footnote
)
-- Unusually, the accusative masculine animate singular is not the same as the genitive masculine singular,
-- and the accusative masculine inanimate singular is not the same as the nominative masculine singular.
adj_add(base, "acc_m_an", "", {"jejž", "jehož"})
adj_add(base, "acc_m_an", "", {"nějž", "něhož"}, preposition_footnote)
adj_add(base, "acc_m_in", "", "jejž")
adj_add(base, "acc_m_in", "", "nějž", preposition_footnote)
return
end
if base.lemma == "tentýž" then
adj_add_normal_decl(base, "",
"tentýž", "tatáž", "totéž", "titíž", "tytéž", "tatáž",
"téhož", "téže", "týchž",
{"témuž", "tomutéž"}, "téže", "týmž",
"tutéž",
"tomtéž", "téže", "týchž",
"tímtéž", "toutéž", "týmiž"
)
return
end
if base.lemma == "týž" then
adj_add_normal_decl(base, "",
"týž", "táž", nil, "tíž", nil, "tatáž",
"téhož", "téže", "týchž",
"témuž", "téže", "týmž",
"touž",
"témž", "téže", "týchž",
"týmž", "touž", "týmiž"
)
return
end
if base.lemma == "sám" then
-- This mixes long and short endings.
adj_add_normal_decl(base, "sám", "")
adj_add_normal_decl(base, "sam",
nil, "a", "o", "i", "y", "a",
"ého", "é", "ých",
"ému", "é", "ým",
"u",
"ém", "é", "ých",
"ým", "ou", "ými"
)
-- Unusually, the accusative masculine animate singular is not the same as the genitive masculine singular.
adj_add(base, "acc_m_an", "sam", {"a", "ého"})
return
end
if base.lemma == "jejíž" then
adj_add_normal_decl(base, "jej",
"íž", "íž", "íž", "íž", "íž", "íž",
"íhož", "íž", "íchž",
"ímuz", "íž", "ímž",
"íž",
"ímž", "íž", "íchž",
"ímž", "íž", "ímiž"
)
return
end
error("Unrecognized irregular lemma '" .. base.lemma .. "'")
end
local function noun_combine_stem_ending(base, slot, stem, ending)
if stem == "?" then
return "?"
else
-- There are occasional occurrences of soft-only consonants at the end of the stem in hard paradigms, e.g.
-- [[banjo]] "banjo", [[gadžo]] "gadjo (non-Romani)", [[Miša]] "Misha, Mike", [[paša]] "pasha". These force a
-- following y to turn into i. Things are tricky with -c; [[hec]] "joke" (hard masculine) has ins_pl 'hecy',
-- but [[paňáca]] "jester, fop" has ins_pl 'paňáci'. We have to set a flag to indicate whether to allow y after
-- c. This needs to proceed depalatalization of paired palatal consonants in the case of e.g. [[říďa]]
-- "principal, headmaster", with instrumental plural 'řídi' (říďy -> říďi -> řídi).
if find(ending, "^y") and (find(stem, INHERENTLY_SOFT_NOT_C_C .. "$") or
not base.hard_c and find(stem, "[cC]$")) then
ending = gsub(ending, "^y", "i")
end
-- Convert ňe and ňě -> ně. Convert nE and ňE -> ne. Convert ňi and ni -> ni.
stem, ending = convert_paired_palatal_to_plain(stem, ending)
-- We specify endings with -e/ě using ě, but some consonants cannot be followed by ě; convert to plain e.
if find(ending, "^ě") and not find(stem, FOLLOWABLE_BY_E_HACEK_C .. "$") then
ending = gsub(ending, "^ě", "e")
end
if base.all_uppercase then
stem = upper(stem)
end
if base.collapse_ee and find(ending, "^e") and find(stem, "e$") then
-- Two e's should maybe collapse to one; occurs in [[Sofokles]] stem 'Sofokle-' voc 'Sofokle' not '#Sofoklee'; also
-- in terms like [[Pete]], [[Mike]], [[Gable]] with silent -e that's kept in the stem except before an ending in -e.
-- But not in [[Prométheus]], with voc. 'Prométhee'.
return stem:gsub("e$", "") .. ending
else
return stem .. ending
end
end
end
-- Determine the declension based on the lemma, gender and number. The declension is set in base.decl. In the process,
-- we set either base.vowel_stem (if the lemma ends in a vowel) or base.nonvowel_stem (if the lemma does not end in a
-- vowel), which is used by noun_determine_stems(). In some cases (specifically with certain foreign nouns), we set
-- base.lemma to a new value; this is as if the user specified 'decllemma:'.
local function noun_determine_declension(base)
if base.decl then -- numerales
return
end
if base.adj then
base.decl = "adj"
return
end
if base.mostlyindecl then
base.decl = "mostly-indecl"
base.nonvowel_stem = base.lemma
return
end
if base.indecl then
base.decl = "indecl"
base.nonvowel_stem = base.lemma
return
end
-- Determine declension
local stem = match(base.lemma, "^(.*)a$")
if stem then
if base.gender == "m" then
if base.animacy ~= "an" then
error("Masculine lemma in -a must be animate")
end
base.decl = "a-m"
elseif base.gender == "f" then
if base.hard then
-- e.g. [[doňa]], which seems not to have soft alternates as [[piraňa]] does (despite IJP; but see the note at the
-- bottom)
base.decl = "hard-f"
elseif find(stem, "e$") then
-- [[idea]], [[diarea]] (subtype '.tech'), [[Korea]], etc.
base.decl = "ea-f"
elseif find(stem, "i$") then
-- [[signoria]], [[sinfonia]], [[paranoia]], etc.
base.decl = "ia-f"
elseif find(stem, "[ou]$") then
-- [[stoa]], [[kongrua]], [[Samoa]], [[Nikaragua]], etc.
base.decl = "oa-f"
elseif not base.persname and find(stem, "^.*[ňj]$") then
-- [[maracuja]], [[papája]], [[sója]]; [[piraňa]] etc. Also [[Keňa]], [[Troja]]/[[Trója]], [[Amudarja]].
-- Not [[Táňa]], [[Darja]], which decline like [[gejša]], [[skica]], etc. (subtype of hard feminines).
base.decl = "mixed-f"
else
base.decl = "hard-f"
end
elseif base.gender == "n" then
if find(stem, "m$") then
base.decl = "ma-n"
else
error("Lemma ending in -a and neuter must end in -ma")
end
end
base.vowel_stem = stem
return
end
local stem, ending
stem, ending = match(base.lemma, "^(.*)([eě])$")
if stem then
if ending == "ě" then
stem = convert_paired_plain_to_palatal(stem)
end
if base.gender == "m" then
if base.foreign then
-- [[software]] and similar English-derived nouns with silent -e; set the lemma here as if decllemma: were given
base.lemma = stem
base.nonvowel_stem = stem
base.decl = "hard-m"
return
end
if base.hard then
-- -e be damned; e.g. [[Sofokles]] with hard stem 'Sofokle-' (genitive 'Sofoklea', dative 'Sofokleovi', etc.)
base.nonvowel_stem = base.lemma
base.decl = "hard-m"
return
end
if base.tstem then
if base.animacy ~= "an" then
error("T-stem masculine lemma in -e must be animate")
end
base.decl = "tstem-m"
elseif find(stem, "i$") then
-- [[zombie]], [[hippie]], [[yuppie]], [[rowdie]]
base.decl = "ie-m"
elseif find(stem, "e$") then
-- [[Yankee]]
base.nonvowel_stem = base.lemma
base.decl = "ee-m"
return
else
base.decl = "e-m"
end
elseif base.gender == "f" then
base.decl = "soft-f"
elseif base.gender ~= "none" then
if base.tstem then
base.decl = "tstem-n"
else
base.decl = "soft-n"
end
end
base.vowel_stem = stem
return
end
stem = match(base.lemma, "^(.*)o$")
if stem then
if base.gender == "m" then
-- Cf. [[maestro]] m.
base.decl = "o-m"
elseif base.gender == "f" then
-- [[zoo]]; [[Žemaitsko]]?
error("Feminine nouns in -o are indeclinable; use '.indecl' if needed")
elseif base.nstem then
base.decl = "n-n"
elseif base.hard then
base.decl = "hard-n"
elseif find(stem, "[aeiuy]$") then
-- These have gen pl in -í and often other soft plural endings.
base.decl = "semisoft-n"
else
base.decl = "hard-n"
end
base.vowel_stem = stem
return
end
stem = match(base.lemma, "^(.*[iy])$")
if stem then
if base.gender == "m" then
if base.soft then
-- [[gay]] "gay man", [[gray]] "gray (scientific unit)", [[Nagy]] (surname)
base.decl = "soft-m"
else
-- Cf. [[kivi]] "kiwi (bird)", [[husky]] "kusky", etc.
base.decl = "i-m"
end
elseif base.gender == "f" then
if base.soft then
-- [[Uruguay]], [[Paraguay]]
base.decl = "soft-f"
else
-- [[máti]], [[pramáti]]; note also indeclinable [[tsunami]]/[[cunami]], [[okapi]]
base.decl = "i-f"
if stem:find("i$") then
stem = stem:gsub("i$", "")
else
error("Feminine nouns in -y are either soft or indeclinable; use '.soft' or '.indecl' as needed")
end
end
elseif base.gender ~= "none" then
error("Neuter nouns in -i are indeclinable; use '.indecl' if needed")
end
base.vowel_stem = stem
return
end
stem = match(base.lemma, "^(.*u)$")
if stem then
if base.gender == "m" then
-- Cf. [[emu]], [[guru]], etc.
base.decl = "u-m"
elseif base.gender == "f" then
-- Only one I know is [[budižkničemu]], which is indeclinable in the singular and declines in the plural as
-- if written 'budižkničema'.
error("Feminine nouns in -u are indeclinable; use '.indecl' if needed")
else
error("Neuter nouns in -u are indeclinable; use '.indecl' if needed")
end
base.vowel_stem = stem
return
end
stem = match(base.lemma, "^(.*[íý])$")
if stem then
if base.gender == "m" then
base.decl = "í-m"
elseif base.gender == "f" then
-- FIXME: Do any exist? If not, update this message.
error("Support for non-adjectival non-indeclinable feminine nouns in -í/-ý not yet implemented")
elseif base.gender ~= "none" then
base.decl = "í-n"
end
base.vowel_stem = stem
return
end
stem = match(base.lemma, "^(.*" .. CONS_C .. ")$")
if stem then
if base.gender == "m" then
if base.foreign then
-- [[komunismus]] "communism", [[kosmos]] "cosmos", [[hádes]] "Hades"
stem = match(base.lemma, "^(.*)[ueoaéá]s$")
if not stem then
error("Unrecognized masculine foreign ending, should be -us, -es, -os, -as, -és or -ás")
end
if not base.hard and (find(stem, "[ei]$") and base.animacy == "an" or
find(stem, "i$") and base.animacy == "inan") then
-- [[genius]], [[basileus]], [[rádius]]; not [[nukleus]], [[choreus]] (inanimate); not
-- [[skarabeus]] (animate), which should specify 'hard'
base.decl = "semisoft-m"
else
base.decl = "hard-m"
end
-- set the lemma here as if decllemma: were given
base.lemma = stem
elseif base.hard then
base.decl = "hard-m"
elseif base.soft then
base.decl = "soft-m"
elseif base.mixed then
base.decl = "mixed-m"
elseif find(base.lemma, INHERENTLY_SOFT_C .. "$") or find(base.lemma, "tel$") then
base.decl = "soft-m"
else
base.decl = "hard-m"
end
elseif base.gender == "f" then
if base.mixedistem then
base.decl = "mixed-istem-f"
elseif base.istem == true then
base.decl = "istem-f"
elseif base.istem == false then
base.decl = "cons-f"
elseif find(base.lemma, "st$") then
-- Numerous abstracts in -ost; also [[kost]], [[část]], [[srst]], [[bolest]]
base.decl = "istem-f"
else
base.decl = "cons-f"
end
elseif base.gender == "n" then
if base.foreign then
stem = match(base.lemma, "^(.*)um$") or match(base.lemma, "^(.*)on$")
if not stem then
error("Unrecognized neuter foreign ending, should be -um or -on")
end
if base.hard then
base.decl = "hard-n"
elseif find(stem, "[eiuy]$") then
base.decl = "semisoft-n"
else
base.decl = "hard-n"
end
-- set the lemma here as if decllemma: were given
base.lemma = stem .. "o"
base.vowel_stem = stem
return
else
error("Neuter nouns ending in a consonant should use '.foreign' or '.decllemma:...'")
end
end
base.nonvowel_stem = stem
return
end
error("Unrecognized ending for lemma: '" .. base.lemma .. "'")
end
-- Determine the default value for the 'reducible' flag.
local function noun_determine_default_reducible(base)
-- Nouns in vowels other than -a/o as well as masculine nouns ending in all vowels don't have null endings so not
-- reducible. Note, we are never called on adjectival nouns.
if find(base.lemma, "[iyuíeě]$") or base.gender == "m" and find(base.lemma, "[ao]$") or base.tstem then
base.default_reducible = false
return
end
local stem
stem = match(base.lemma, "^(.*" .. CONS_C .. ")$")
if stem then
-- When analyzing existing manual declensions in -ec and -ek, 290 were reducible vs. 23 non-reducible. Of these
-- 23, 15 were monosyllabic (and none of the 290 reducible nouns were monosyllabic) -- and two of these were
-- actually reducible but irregularly: [[švec]] "shoemaker" (gen sg 'ševce') and [[žnec]] "reaper (person)"
-- (gen sg. 'žence'). Of the remaining 8 multisyllabic non-reducible words, two were actually reducible but
-- irregularly: [[stařec]] "old man" (gen sg 'starce') and [[tkadlec]] "weaver" (gen sg 'tkalce'). The remaining
-- six consisted of 5 compounds of monosyllabic words: [[dotek]], [[oblek]], [[kramflek]], [[pucflek]],
-- [[pokec]], plus [[česnek]], which should be reducible but would lead to an impossible consonant cluster.
if base.gender == "m" and find(stem, "[eě][ck]$") and not is_monosyllabic(stem) then
base.default_reducible = true
elseif base.gender == "f" and find(stem, "[eě]ň$") then
-- [[pochodeň]] "torch", [[píseň]] "leather", [[žeň]] "harvest"; not [[reveň]] "rhubarb" or [[dřeň]] "pulp",
-- which need an override.
base.default_reducible = true
else
base.default_reducible = false
end
return
end
if base.number == "sg" then
base.default_reducible = false
return
end
if find(base.lemma, "isko$") then
-- e.g. [[středisko]]
base.default_reducible = "mixed"
return
end
stem = match(base.lemma, "^(.*)" .. VOWEL_C .. "$")
if not stem then
error(("Internal error: Something wrong, lemma '%s' doesn't end in consonant or vowel"):format(base.lemma))
end
-- Substitute 'ch' with a single character to make the following code simpler.
stem = stem:gsub("ch", TEMP_CH)
if find(stem, CONS_C .. "[lr]" .. CONS_C .. "$") then
-- [[vrba]], [[vlha]]; not reducible. (But note [[jablko]], reducible; needs override.)
base.default_reducible = false
elseif not base.foreign and (find(stem, CONS_C .. "[bkhlrmnv]$") or base.c_as_k and find(stem, CONS_C .. "c$")) then
-- [[ayahuasca]] has gen pl 'ayahuasek'
base.default_reducible = true
elseif base.foreign and find(stem, CONS_C .. "r$") then
-- Foreign nouns in -CCum seem generally non-reducible in the gen pl except for those in -Crum like [[centrum]],
-- Examples: [[album]], [[verbum]], [[signum]], [[interregnum]], [[sternum]]. [[infernum]] has gen pl 'infern/inferen'.
base.default_reducible = true
else
base.default_reducible = false
end
end
-- Determine the stems to use for each stem set: vowel and nonvowel stems, for singular
-- and plural. We assume that one of base.vowel_stem or base.nonvowel_stem has been
-- set in noun_determine_declension(), depending on whether the lemma ends in
-- a vowel. We construct all the rest given the reducibility, vowel alternation spec and
-- any explicit stems given. We store the determined stems inside of the stem-set objects
-- in `base.stem_sets`, meaning that if the user gave multiple reducible or vowel-alternation
-- patterns, we will compute multiple sets of stems. The reason is that the stems may vary
-- depending on the reducibility and vowel alternation.
local function noun_determine_stems(base)
if not base.stem_sets then
base.stem_sets = {{}}
end
-- Set default reducible and check for default mixed reducible, which needs to be expanded into two entries.
local default_mixed_reducible = false
for _, stems in ipairs(base.stem_sets) do
if stems.reducible == nil then
stems.reducible = base.default_reducible
end
if stems.reducible == "mixed" then
default_mixed_reducible = true
end
end
if default_mixed_reducible then
local new_stem_sets = {}
for _, stems in ipairs(base.stem_sets) do
if stems.reducible == "mixed" then
local non_reducible_copy = deepcopy(stems)
non_reducible_copy.reducible = false
stems.reducible = true
insert(new_stem_sets, stems)
insert(new_stem_sets, non_reducible_copy)
else
insert(new_stem_sets, stems)
end
end
base.stem_sets = new_stem_sets
end
-- Now determine all the stems for each stem set.
for _, stems in ipairs(base.stem_sets) do
local lemma_is_vowel_stem = not not base.vowel_stem
if base.vowel_stem then
stems.vowel_stem = base.vowel_stem
stems.nonvowel_stem = stems.vowel_stem
-- Apply vowel alternation first in cases like jádro -> jader; apply_vowel_alternation() will throw an error
-- if the vowel being modified isn't the last vowel in the stem.
stems.oblique_nonvowel_stem = apply_vowel_alternation(stems.vowelalt, stems.nonvowel_stem)
if stems.reducible then
stems.nonvowel_stem = dereduce(base, stems.nonvowel_stem)
stems.oblique_nonvowel_stem = dereduce(base, stems.oblique_nonvowel_stem)
end
else
stems.nonvowel_stem = base.nonvowel_stem
-- The user specified #, #ě, ## or ##ě and we're dealing with a term like masculine [[bůh]] or feminine
-- [[sůl]] that ends in a consonant. In this case, all slots except the nom_s and maybe acc_s have vowel
-- alternation.
if stems.oblique_slots then
stems.oblique_slots = "all"
end
stems.oblique_nonvowel_stem = apply_vowel_alternation(stems.vowelalt, stems.nonvowel_stem)
if stems.reducible then
stems.vowel_stem = reduce(base.nonvowel_stem)
if not stems.vowel_stem then
error("Unable to reduce stem '" .. base.nonvowel_stem .. "'")
end
else
stems.vowel_stem = base.nonvowel_stem
end
end
stems.oblique_vowel_stem = apply_vowel_alternation(stems.vowelalt, stems.vowel_stem)
end
end
-- For a plural-only lemma, synthesize a likely singular lemma. It doesn't have to be
-- theoretically correct as long as it generates all the correct plural forms.
local function synthesize_singular_lemma(base)
if not base.stem_sets then
base.stem_sets = {{}}
end
local lemma_determined
-- Loop over all stem sets in case the user specified multiple ones (e.g. '*,-*'). If we try to reconstruct
-- different lemmas for different stem sets, we'll throw an error below.
for _, stems in ipairs(base.stem_sets) do
local stem, lemma
while true do
if base.indecl then
-- If specified as indeclinable, leave it alone; e.g. 'pesos' indeclinable plural of [[peso]].
lemma = base.lemma
break
elseif base.gender == "m" then
if base.animacy == "an" then
stem = match(base.lemma, "^(.*)i$")
if stem then
if base.soft then
-- [[Blíženci]] "Gemini"
-- Since the nominative singular has no ending.
lemma = convert_paired_plain_to_palatal(stem, nil)
else
lemma = undo_second_palatalization(stem)
end
else
stem = match(base.lemma, "^(.*)ové$") or match(base.lemma, "^(.*)é$")
if stem then
-- [[manželé]] "married couple", [[Velšané]] "Welsh people"
lemma = stem
else
error(("Animate masculine plural-only lemma '%s' should end in -i, -ové or -é"):format(base.lemma))
end
end
else
stem = match(base.lemma, "^(.*)y$")
if stem then
-- [[droby]] "giblets"; [[tvarůžky]] "Olomouc cheese"; [[alimenty]] "alimony"; etc.
lemma = stem
else
local ending
stem, ending = match(base.lemma, "^(.*)([eě])$")
if stem then
-- [[peníze]] "money", [[tvargle]] "Olomouc cheese" (mixed declension), [[údaje]] "data",
-- [[Lazce]] (a village), [[lováče]] "money", [[Krkonoše]] "Giant Mountains", [[kříže]] "clubs"
lemma = convert_paired_plain_to_palatal(stem, ending)
if not base.mixed then
base.soft = true
end
else
error(("Inanimate masculine plural-only lemma '%s' should end in -y, -e or -ě"):format(base.lemma))
end
end
end
if stems.reducible == nil then
if find(lemma, CONS_C .. "[ck]$") and not is_monosyllabic(base.lemma) then
stems.reducible = true
end
if stems.reducible then
lemma = dereduce(base, lemma)
end
end
break
elseif base.gender == "f" then
stem = match(base.lemma, "^(.*)y$")
if stem then
lemma = stem .. "a"
break
end
stem = match(base.lemma, "^(.*)[eě]$")
if stem then
-- Singular like the plural. Cons-stem feminines like [[dlaň]] "palm (of the hand)" have identical
-- plurals to soft-stem feminines like [[růže]] (modulo e/ě differences), so we don't need to
-- reconstruct the former type.
lemma = base.lemma
break
end
stem = match(base.lemma, "^(.*)i$")
if stem then
-- i-stems.
lemma = stem
base.istem = true
break
end
error(("Feminine plural-only lemma '%s' should end in -y, -ě, -e or -i"):format(base.lemma))
elseif base.gender == "n" then
-- -ata nouns like [[slůně]] "baby elephant" nom pl 'slůňata' are declined in the plural same as if
-- the singular were 'slůňato' so we don't have to worry about them.
stem = match(base.lemma, "^(.*)a$")
if stem then
lemma = stem .. "o"
break
end
stem = match(base.lemma, "^(.*)[eěí]$")
if stem then
-- singular lemma also in -e, -ě or -í; e.g. [[věčná loviště]] "[[happy hunting ground]]"
lemma = base.lemma
break
end
error(("Neuter plural-only lemma '%s' should end in -a, -í, -ě or -e"):format(base.lemma))
else
error(("Internal error: Unrecognized gender '%s'"):format(base.gender))
end
end
if lemma_determined and lemma_determined ~= lemma then
error(("Attempt to set two different singular lemmas '%s' and '%s'"):format(lemma_determined, lemma))
end
lemma_determined = lemma
end
base.lemma = lemma_determined
end
local function set_det_defaults(base)
if base.gender or base.number or base.animacy then
error("Can't specify gender, number or animacy for determiner")
end
local function det_props()
-- Return values are GENDER, NUMBER, ANIMACY, HAS_CLITIC.
return "none", "none", "none", false
end
local gender, number, animacy, has_clitic = det_props()
base.gender = gender
base.actual_gender = gender
base.number = number
base.actual_number = number
base.animacy = animacy
base.actual_animacy = animacy
base.has_clitic = has_clitic
end
local function determine_determiner_stems(base)
if base.stem_sets then
error("Reducible and vowel alternation specs cannot be given with determiners")
end
local stem = match(base.lemma, "^(.*)" .. VOWEL_C .. "$") or base.lemma
base.stem_sets = {{reducible = false, vowel_stem = stem, nonvowel_stem = stem}}
base.decl = "det"
end
local function set_pron_defaults(base)
if base.gender or base.lemma ~= "ona" and base.number or base.animacy then
error("Can't specify gender, number or animacy for pronouns")
end
local function pron_props()
-- Return values are GENDER, NUMBER, ANIMACY, HAS_CLITIC.
if base.lemma == "kdo" then
return "none", "sg", "an", false
elseif base.lemma == "co" then
return "none", "sg", "inan", false
elseif base.lemma == "já" or base.lemma == "ty" then
return "none", "sg", "an", true
elseif base.lemma == "my" or base.lemma == "vy" then
return "none", "pl", "an", false
elseif base.lemma == "on" then
return "m", "sg", "none", true
elseif base.lemma == "ono" then
return "n", "sg", "inan", true
elseif base.lemma == "oni" then
return "m", "pl", "an", false
elseif base.lemma == "ony" then
return "none", "pl", "none", false
elseif base.lemma == "ona" then
if base.number ~= "sg" and base.number ~= "pl" then
error("Must specify '.sg' or '.pl' with lemma 'ona'")
end
if base.number == "sg" then
return "f", "sg", "none", false
else
return "n", "pl", "inan", false
end
elseif base.lemma == "sebe" then
return "none", "none", "none", true
else
error(("Unrecognized pronoun '%s'"):format(base.lemma))
end
end
local gender, number, animacy, has_clitic = pron_props()
base.gender = gender
base.actual_gender = gender
base.number = number
base.actual_number = number
base.animacy = animacy
base.actual_animacy = animacy
base.has_clitic = has_clitic
end
local function determine_pronoun_stems(base)
if base.stem_sets then
error("Reducible and vowel alternation specs cannot be given with pronouns")
end
base.stem_sets = {{reducible = false, vowel_stem = "", nonvowel_stem = ""}}
base.decl = "pron"
end
local function set_num_defaults(base)
if base.gender or base.number or base.animacy then
error("Can't specify gender, number or animacy for numeral")
end
local function num_props()
-- Return values are GENDER, NUMBER, ANIMACY, HAS_CLITIC.
return "none", "pl", "none", false
end
local gender, number, animacy, has_clitic = num_props()
base.gender = gender
base.actual_gender = gender
base.number = number
base.actual_number = number
base.animacy = animacy
base.actual_animacy = animacy
base.has_clitic = has_clitic
end
local function determine_numeral_stems(base)
if base.stem_sets then
error("Reducible and vowel alternation specs cannot be given with numerals")
end
local stem = match(base.lemma, "^(.*)" .. VOWEL_C .. "$") or base.lemma
base.stem_sets = {{reducible = false, vowel_stem = stem, nonvowel_stem = stem}}
base.decl = "num"
end
--[=[
Maybe modify the stem and/or ending in certain special cases:
1. Final -e in vocative singular triggers first palatalization of the stem in some cases (e.g. hard masc).
2. Endings beginning with ě, i, í trigger second palatalization, as does -e in the loc_s.
NOTE: Correctly handling -e vs. -ě and -tdn/-ťďň alternations is tricky. We have to deal with the following:
1. Soft-stem and t-stem neuters can have either -e or -ě. With coronals we have both [[poledne]] "noon" with /n/ and
[[kutě]] "bed" with /ť/. We also have soft-stem neuter [[Labe]] with /b/ vs. t-stem neuter [[hříbě]] with /bj/.
2. Underlying palatal coronals maintain their nature before back vowels and when not followed by a vowel, e.g. [[štěně]]
"puppy" becomes 'štěňata' in the nom/acc/voc plural and [[přítelkyně]] "girlfriend" becomes 'přítelkyň' in the gen
plural, but underlying palatal labials become non-palatal, e.g. [[hříbě]] "foal" becomes 'hříbata' in the nom/acc/voc
plural.
3. There are at least four types of endings beginning with '-e':
a. "maintaining" endings, e.g. instrumental singular '-em', which do not change the nature of the consonant, e.g.
[[zákon]] "law" becomes 'zákonem' while [[vězeň]] "prisoner" becomes 'vězeněm';
b. "palatalizing" endings, e.g. locative singular '-e', which palatalizes t/d/n (and more generally applies the
Slavic second palatalization, e.g. k -> c, r -> ř), e.g. [[žena]] "woman" becomes 'ženě';
c. "depalatalizing" endings, e.g. feminine i-stem dative plural '-em', which actively depalatalize ť/ď/ň, e.g.
[[oběť]] "sacrifice, victim" becomes 'obětem';
d. vocative singular '-e' of hard-stem masculines, which applies the Slavic first palatalization in some
circumstances (e.g. k -> č, Cr -> Cř, sometimes c -> č).
The way we handle this as follows:
1. We maintain the underlying stems always in their "pronounced" form, i.e. if the last consonant is pronounced ť/ď/ň
we maintain the stem in that form, but if pronounced t/d/n, we use those consonants. Hence neuter [[poledne]] "noon"
has stem 'poledn-' but neuter [[štěně]] "puppy" has stem 'štěň'. If the stem ends in labial + /j/, we use a special
TEMP_SOFT_LABIAL character after the labial (rather than 'j', in case of stems that actually have a written 'j' in
them such as [[banjo]]).
2. We signal types (a), (b) and (c) above using respectively 'e', 'ě' and 'E'. Type (d) uses 'e' and sets
`base.palatalize_voc`.
3. In noun_combine_stem_ending(), we convert the stem back to the written form before adding the ending. If the ending begins
with -e, this may entail converting -e to -ě, and in all cases -E is converted to -e. "Converting to the written
form" converts ť/ď/ň to plain equivalents and deletes TEMP_SOFT_LABIAL before -e, converting -e to -ě with such
consonants. The same conversions happen before other front consonants -ě/-é/-i/-í, which don't allow ť/ď/ň to
precede, and in all cases with TEMP_SOFT_LABIAL, which is not an actual consonant.
4. If the ending is specified using -ě, this is maintained after plain coronals and labials in noun_combine_stem_ending(),
and converted to -e in other cases.
5. Applying the first and second palatalization happens below in noun_apply_special_cases().
]=]
local function noun_apply_special_cases(base, slot, stem, ending)
local palatalize_voc
if base.c_as_k and find(ending, "^[aouyáóúůý]") then
local k_stem = gsub(stem, "c$", "k")
stem = {stem, k_stem}
elseif slot == "voc_s" and ending == "e" and base.palatalize_voc and base.velar ~= false then
-- Don't palatalize words like [[hadíth]] with silent -h.
local palstem = apply_first_palatalization(stem)
-- According to IJP, nouns ending in -Cr palatalize in the vocative, but those in -Vr don't. In reality,
-- though, it's more complex. It appears that animate nouns in -Cr tend to palatalize but inanimate nouns
-- do it optionally. Specifics:
-- -- Inanimate nouns with optional palatalization (ř listed second): [[alabastr]], [[amfiteátr]], [[barometr]],
-- [[centilitr]], [[centrimetr]], [[decilitr]], [[decimetr]], [[Dněstr]], [[filtr]], [[galvanometr]],
-- [[hektolitr]], [[kalorimetr]], [[litr]], [[lustr]], [[manometr]], [[manšestr]], [[metr]] (NOTE: is both
-- animate and inanimate), [[mikrometr]], [[miliampérmetr]], [[mililitr]], [[nanometr]], [[orchestr]],
-- [[parametr]], [[piastr]], [[půllitr]], [[radiometr]], [[registr]], [[rotmistr]], [[semestr]], [[skútr]],
-- [[spirometr]], [[svetr]], [[šutr]], [[tachometr]], [[titr]], [[vítr]] (NOTE: has í-ě alternation),
-- [[voltmetr]]; [[bagr]], [[bunkr]], [[cedr]], [[Dněpr]], [[fofr]], [[habr]] (NOTE: ř listed first), [[hadr]]
-- (NOTE: ř listed first), [[hamr]], [[kafr]], [[kepr]], [[kopr]], [[koriandr]], [[krekr]], [[kufr]],
-- [[Kypr]], [[lágr]], [[lógr]], [[manévr]], [[masakr]], [[okr]], [[oleandr]], [[pulovr]], [[šlágr]],
-- [[vichr]] (NOTE: ř listed first), [[žánr]]
--
-- -- Inanimate nouns that don't palatalize: [[ampérmetr]], [[anemometr]], [[sfygmomanometr]], [[sfygmometr]];
-- [[dodekaedr]], [[Hamr]], [[ikozaedr]], [[kvádr]], [[sandr]], [[torr]]
--
-- -- Animate nouns that palatalize: [[arbitr]], [[bratr]], [[ekonometr]], [[foniatr]], [[fotr]], [[geometr]],
-- [[kmotr]], [[lotr]], [[magistr]], [[metr]] (NOTE: is both animate and inanimate), [[ministr]], [[mistr]],
-- [[pediatr]], [[Petr]], [[psychiatr]], [[purkmistr]], [[setr]], [[šamstr]]; [[bobr]], [[fajnšmekr]],
-- [[humr]], [[hypochondr]], [[kapr]], [[lídr]], [[negr]], [[obr]], [[salamandr]], [[sólokapr]], [[švagr]],
-- [[tygr]], [[zlobr]], [[zubr]]
--
-- -- Animate nouns with optional palatalization (ř listed first): [[Silvestr]]; [[Alexandr]], [[snajpr]]
--
-- Note the inconsistencies, e.g. [[sfygmomanometr]] and [[ampérmetr]] don't palatalize but [[manometr]] and
-- [[miliampérmetr]] do it optionally. In reality, inanimate vocatives are extremely rare so this may not be the
-- final word.
if base.animacy == "inan" and find(stem, CONS_C .. "r$") and not find(stem, "rr$") then
-- optional r -> ř
stem = {stem, palstem}
else
stem = palstem
end
elseif find(ending, "^[ěií]") or slot == "loc_s" and ending == "e" then
if find(stem, "ck$") and find(base.lemma, "ck$") then
-- IJP says nouns in -ck (back, comeback, crack, deadlock, hatchback, hattrick, joystick, paperback, quarterback,
-- rock, soundtrack, track, truck) simplify the resulting -cc ending in the loc_p to -c. Similarly [[quarterback]]
-- has nom_pl 'quarterbaci, quarterbackove'. We need to check the lemma as well because nouns in -cek don't do this.
stem = gsub(stem, "ck$", "k")
end
if base.velar then
-- [[petanque]] /petank/ -> loc pl 'petancích'.
stem = gsub(stem, "gu$", "g")
stem = gsub(stem, "qu$", "k")
end
-- loc_s of hard masculines is sometimes -e/ě; the user might indicate this as -e, which we should handle
-- correctly
stem = apply_second_palatalization(stem)
end
return stem, ending
end
local function noun_skip_slot(number, slot)
return number == "sg" and find(slot, "_p$") or
number == "pl" and find(slot, "_s$")
end
-- Basic function to combine stem(s) and ending(s) and insert the result into the appropriate slot. `stems` is either
-- the `stems` object passed into the declension functions (containing the various stems; see below) or a string to
-- override the stem. (NOTE: If you pass a string in as `stems`, you should pass the value of `stems.footnotes` as the
-- value of `footnotes` as it will be lost otherwise. If you need to supply your own footnote in addition, use
-- iut.combine_footnotes() to combine any user-specified footnote(s) with your footnote(s).) `endings` is either a
-- string specifying a single ending or a list of endings. If `endings` is nil, no forms are inserted. If an ending is
-- "-", the value of `stems` is ignored and the lemma is used instead as the stem; this is important in case the user
-- used `decllemma:` to specify a declension lemma different from the actual lemma, or specified '.foreign' (which has
-- a similar effect).
local function noun_add(base, slot, stems, endings, footnote)
if not stems or not endings then
return
end
-- Call noun_skip_slot() based on the declined number; if the actual number is different, we correct this in
-- decline_noun() at the end.
if noun_skip_slot(base.number, slot) then
return
end
if type(endings) == "string" then
endings = {endings}
end
for _, ending in ipairs(endings) do
-- Compute the stem. If ending is "-", use the lemma regardless. Otherwise if `stems` is a string, use it.
-- Otherwise `stems` is an object containing four stems (vowel-vs-non-vowel cross regular-vs-oblique);
-- compute the appropriate stem based on the slot and whether the ending begins with a vowel.
local stem
if ending == "-" then
stem = base.actual_lemma
ending = ""
elseif type(stems) == "string" then
stem = stems
else
local is_vowel_ending = find(ending, "^" .. VOWEL_C)
if stems.oblique_slots == "all" or
(stems.oblique_slots == "gen_p" or stems.oblique_slots == "all-oblique") and slot == "gen_p" or
stems.oblique_slots == "all-oblique" and (slot == "ins_s" or slot == "dat_p" or slot == "loc_p" or slot == "ins_p") then
if is_vowel_ending then
stem = stems.oblique_vowel_stem
else
stem = stems.oblique_nonvowel_stem
end
elseif is_vowel_ending then
stem = stems.vowel_stem
else
stem = stems.nonvowel_stem
end
end
-- Maybe apply the first or second Slavic palatalization.
stem, ending = noun_apply_special_cases(base, slot, stem, ending)
if not base.forms[slot] then
base.forms[slot] = {}
end
insert(base.forms[slot], noun_combine_stem_ending(base, slot, stem, ending)..(footnote and "{"..footnote.."}" or ""))
end
end
local function noun_add_decl(base, stems,
gen_s, dat_s, acc_s, voc_s, loc_s, ins_s,
nom_p, gen_p, dat_p, acc_p, loc_p, ins_p, footnote
)
noun_add(base, "nom_s", stems, "-", footnote)
noun_add(base, "gen_s", stems, gen_s, footnote)
noun_add(base, "dat_s", stems, dat_s, footnote)
noun_add(base, "acc_s", stems, acc_s, footnote)
noun_add(base, "voc_s", stems, voc_s, footnote)
noun_add(base, "loc_s", stems, loc_s, footnote)
noun_add(base, "ins_s", stems, ins_s, footnote)
if base.number == "pl" then
-- If this is a plurale tantum noun and we're processing the nominative plural, use the user-specified lemma
-- rather than generating the plural from the synthesized singular, which may not match the specified lemma
-- (e.g. [[tvargle]] "Olomouc cheese" using <m.pl.mixed> would try to generate 'tvargle/tvargly', and [[peníze]]
-- "money" using <m.pl.#ě.genpl-> would try to generate 'peněze').
local acc_p_like_nom = deepequals(nom_p, acc_p)
nom_p = "-"
if acc_p_like_nom then
acc_p = "-"
end
end
noun_add(base, "nom_p", stems, nom_p, footnote)
noun_add(base, "gen_p", stems, gen_p, footnote)
noun_add(base, "dat_p", stems, dat_p, footnote)
noun_add(base, "acc_p", stems, acc_p, footnote)
noun_add(base, "loc_p", stems, loc_p, footnote)
noun_add(base, "ins_p", stems, ins_p, footnote)
end
local function noun_add_sg_decl(base, stems,
gen_s, dat_s, acc_s, voc_s, loc_s, ins_s, footnote
)
noun_add_decl(base, stems, gen_s, dat_s, acc_s, voc_s, loc_s, ins_s,
nil, nil, nil, nil, nil, nil, footnote)
end
local function noun_add_pl_only_decl(base, stems,
gen_p, dat_p, acc_p, loc_p, ins_p, footnote
)
noun_add_decl(base, stems, nil, nil, nil, nil, nil, nil,
"-", gen_p, dat_p, acc_p, loc_p, ins_p, footnote)
end
local function noun_add_sg_decl_with_clitic(base, stems,
gen_s, clitic_gen_s, dat_s, clitic_dat_s, acc_s, clitic_acc_s, voc_s, loc_s, ins_s, footnote, no_nom_s
)
if not no_nom_s then
noun_add(base, "nom_s", stems, "-", footnote)
end
noun_add(base, "gen_s", stems, gen_s, footnote)
noun_add(base, "clitic_gen_s", stems, clitic_gen_s, footnote)
noun_add(base, "dat_s", stems, dat_s, footnote)
noun_add(base, "clitic_dat_s", stems, clitic_dat_s, footnote)
noun_add(base, "acc_s", stems, acc_s, footnote)
noun_add(base, "clitic_acc_s", stems, clitic_acc_s, footnote)
noun_add(base, "voc_s", stems, voc_s, footnote)
noun_add(base, "loc_s", stems, loc_s, footnote)
noun_add(base, "ins_s", stems, ins_s, footnote)
end
-- Table mapping declension types to functions to decline the noun. The function takes two arguments, `base` and
-- `stems`; the latter specifies the computed stems (vowel vs. non-vowel, singular vs. plural) and whether the noun
-- is reducible and/or has vowel alternations in the stem. Most of the specifics of determining which stem to use
-- and how to modify it for the given ending are handled in noun_add_decl(); the declension functions just need to generate
-- the appropriate endings.
local noun_decls = {}
-- Table specifying additional properties for declension types. Every declension type must have such a table, which
-- specifies which category or categories to add and what annotation to show in the title bar of the declension table.
--
-- * Only the `cat` property of this table is mandatory; there is also a `desc` property to specify the annotation, but
-- this can be omitted and the annotation will then be computed from the `cat` property. The `cat` property is either
-- a string, a list of strings or a function (of two arguments, `base` and `stems` as above) returning a string or
-- list of strings. The string can contain the keywords GENDER to substitute the gender (and animacy for masculine
-- nouns) and POS (to substitute the pluralized part of speech). The keyword GENPOS is equivalent to 'GENDER POS'. If
-- no keyword is present, ' GENPOS' is added onto the end. If only GENDER is present, ' POS' is added onto the end.
-- In all cases, the language name is added onto the beginning to form the full category name.
-- * The `desc` property is of the same form as the `cat` property and specifies the annotation to display in the title
-- bar (which may have the same format as the category minus the part of speech, or may be abbreviated). The value
-- may not be a list of strings, as only one annotation is displayed. If omitted, it is derived from the category
-- spec(s) by taking the last category (if more than one is given) and removing ' POS' before keyword substitution.
local noun_declprops = {}
-- Return the default masculine animate nominative plural ending(s) given `base` and `stems`. This is called for hard
-- and soft masculines ending in a consonant, but not for nouns ending in a vowel, which have their own defaults
-- (particularly nouns in -a, where -ista/-ita/-asta behave differently from other nouns in -a).
local function default_masc_animate_nom_pl(base, stems)
return
-- [monosyllabic words: Dánové, Irové, králové, mágové, Rusové, sokové, synové, špehové, zběhové, zeťové, manové, danové
-- (but Žid → Židé, Čech → Češi).] -- There are too many exceptions to this to make a special rule. It is better to use
-- the overall default of -i and require that cases with -ove, -ove/-i, -i/-ove, etc. use overrides.
-- is_monosyllabic(base.lemma) and "ové" or
-- reducible terms in -Cek; order of -ové vs. -i sometimes varies:
-- [[fracek]] (ové/i), [[klacek]] (i/ové), [[macek]] (ové/i), [[nácek]] (i/ové), [[prcek]] (ové/i), [[racek]] (ové/i);
-- [[bazilišek]] (i/ové), [[černoušek]] (i/ové), [[drahoušek]] (ové/i), [[fanoušek]] (i/ové), [[františek]] (an/inan,
-- ends in -i/-y but not -ové), [[koloušek]] (-i only), [[kulíšek]] (i/ové), [[oříšek]] (i/ové), [[papoušek]] (-i only),
-- [[prášek]] (i/ové), [[šašek]] (i/ové).
-- make sure to check `stems` as we don't want to include non-reducible words in -Cek (but do want to include
-- [[quarterback]], with -i/-ové)
find(stems.vowel_stem, "^" .. LOWERCASE_C .. ".*" .. CONS_C .. "k$") and {"i", "ové"} or
-- [[stoik]], [[neurotik]], [[logik]], [[fyzik]], etc.
find(base.lemma, "^" .. LOWERCASE_C .. ".ik$") and {"i", "ové"} or
-- barmani, gentlemani, jazzmani, kameramani, narkomani, ombudsmani, pivotmani, rekordmani, showmani, supermani, toxikomani
find(base.lemma, "^" .. LOWERCASE_C .. ".*man$") and "i" or
-- terms ending in -an after a palatal or a consonant that doesn't change when palatalized, i.e. labial or l (but -man
-- forms -mani unless in a proper noun): Brňan → Brňané, křesťan → křesťané, měšťan → měšťané, Moravan → Moravané,
-- občan → občané, ostrovan → ostrované, Pražan → Pražané, Slovan → Slované, svatebčan → svatebčané, venkovan → venkované,
-- Australan → Australané; also s, because there are many demonyms in -san e.g. [[Andalusan]], [[Barbadosan]], [[Oděsan]],
-- and few proper nouns in -san; similarly z because of [[Belizan]], [[Gazan]], [[Kavkazan]], etc.; also w, which isn't a
-- normal consonant in Czech but occurs in [[Glasgowan]] and [[Zimbabwan]]; NOTE: a few misc words like [[pohan]] also
-- work this way but need manual overrides
find(base.lemma, "[" .. inherently_soft .. labial .. "wlsz]an$") and {"é", "i"} or -- most now can also take -i
-- proper names: Baťové, Novákové, Petrové, Tomášové, Vláďové; exclude demonyms (but include surnames)
find(base.lemma, "^" .. UPPERCASE_C) and (base.surname or not find(base.lemma, "[eě]c$")) and "ové" or
-- demonyms: [[Albánec]], [[Gruzínec]], [[Izraelec]], [[Korejec]], [[Libyjec]], [[Litevec]], [[Němec]], [[Portugalec]]
find(base.lemma, "^" .. UPPERCASE_C .. ".*[eě]c$") and "i" or
-- From here on down, we're dealing only with lowercase terms.
-- buditelé, budovatelé, čekatelé, činitelé, hostitelé, jmenovatelé, pisatelé, ručitelé, velitelé, živitelé
find(base.lemma, ".*tel$") and "é" or
-- nouns in -j: čaroděj → čarodějové, lokaj → lokajové, patricij → patricijové, plebej → plebejové, šohaj → šohajové, žokej → žokejové
-- nouns in -l: apoštol → apoštolové, břídil → břídilové, fňukal → fňukalové, hýřil → hýřilové, kutil → kutilové,
-- loudal → loudalové, mazal → mazalové, škrabal → škrabalové, škudlil → škudlilové, vyvrhel → vyvrhelové, žvanil → žvanilové
-- (we excluded those in -tel above)
find(base.lemma, ".*[jl]$") and "ové" or
-- archeolog → archeologové, biolog → biologové, geolog → geologové, meteorolog → meteorologové
find(base.lemma, ".*log$") and "ové" or
-- dramaturg → dramaturgové, chirurg → chirurgové
find(base.lemma, ".*urg$") and "ové" or
-- fotograf → fotografové, geograf → geografové, lexikograf → lexikografové
find(base.lemma, ".*graf$") and "ové" or
-- bibliofil → bibliofilové, germanofil → germanofilové
find(base.lemma, ".*fil$") and "ové" or
-- rusofob → rusofobové
find(base.lemma, ".*fob$") and "ové" or
-- agronom → agronomové, ekonom → ekonomové
find(base.lemma, ".*nom$") and "ové" or
"i"
end
noun_decls["hard-m"] = function(base, stems)
-- Nouns ending in hard -c, e.g. [[hec]] "joke", [[kibuc]] "kibbutz", don't palatalize.
base.palatalize_voc = not find(stems.vowel_stem, "c$")
base.hard_c = true
local velar = (base.velar ~= false) and find(stems.vowel_stem, VELAR_C .. "$") or nil
-- See [https://prirucka.ujc.cas.cz/en/?id=360] on declension of toponyms.
local toponym = base.animacy == "inan" and find(base.lemma, "^" .. UPPERCASE_C)
-- Some toponyms take -a in the genitive singular, e.g. toponyms in -ín ([[Zlín]], [[Jičín]], [[Berlín]]);
-- -ýn ([[Hostýn]], [[Londýn]]); -ov ([[Havířov]]); and -ev ([[Bezdrev]]), as do some others, e.g. domestic
-- [[Beroun]], [[Brandýs]], [[Náchod]], [[Tábor]] and foreign [[Betlém]] "Bethlehem", [[Egypt]],
-- [[Jeruzalém]] "Jerusalem", [[Milán]] "Milan", [[Řím]] "Rome", [[Rýn]] "Rhine". Also some transferred from
-- common nouns e.g. ([[Nový]]) [[Kostel]], ([[Starý]]) [[Rybník]].
local toponym_gen_a = toponym and (find(base.lemma, "[íý]n$") or find(base.lemma, "[oe]v$"))
-- Toponyms in -ík (Mělník, Braník, Rakovník, Lipník) seem to fluctuate between gen -a and -u. Also some in
-- ‑štejn, ‑berg, ‑perk, ‑burk, ‑purk (Rabštejn, Heidelberg, Kašperk, Hamburk, Prešpurk) and some others:
-- Zbiroh, Kamýk, Příbor, Zábřeh, Žebrák, Praděd.
local toponym_gen_a_u = toponym and find(base.lemma, "ík$")
-- Toponyms that take -a in the genitive singular tend to take -ě in the locative singular; so do those in
-- -štejn (Rabštejn), -hrad (Petrohrad), -grad (Volgograd).
local toponym_loc_e = toponym and (toponym_gen_a or find(base.lemma, "štejn$") or find(base.lemma, "[gh]rad$"))
-- Toponyms in -ík seem to fluctuate between loc -ě and -u.
local toponym_loc_e_u = toponym_gen_a_u
-- Inanimate gen_s in -a other than toponyms in -ín/-ýn/-ev/-ov (e.g. [[zákon]] "law", [[oběd]] "lunch", [[kostel]] "church",
-- [[dnešek]] "today", [[leden]] "January", [[trujúhelník]] "triangle") needs to be given manually, using '<gena>'.
local gen_s = toponym_gen_a and "a" or toponym_gen_a_u and {"a", "u"} or base.animacy == "inan" and "u" or "a"
-- Animates with dat_s only in -u (e.g. [[člověk]] "person", [[Bůh]] "God") need to give this manually,
-- using '<datu>'.
local dat_s = base.animacy == "inan" and "u" or base.surname and "ovi" or {"ovi", "u"}
-- Inanimates with loc_s in -e/ě other than certain toponyms (see above) need to give this manually, using <locě>, but
-- it will trigger the second palatalization automatically.
local loc_s = toponym_loc_e and "ě" or toponym_loc_e_u and {"ě", "u"} or dat_s
-- Velar-stem animates with voc_s in -e (e.g. [[Bůh]] "God", voc_s 'Bože'; [[člověk]] "person", voc_s 'člověče')
-- need to give this manually using <voce>; it will trigger the first palatalization automatically.
local voc_s = velar and "u" or "e" -- 'e' will trigger first palatalization in noun_apply_special_cases()
-- Nom_p in -i will trigger second palatalization in noun_apply_special_cases().
local nom_p = base.animacy == "inan" and "y" or default_masc_animate_nom_pl(base, stems)
-- Per IJP and Janda and Townsend:
-- * loc_p in -ích is currently the default for velars but not otherwise; it will automatically trigger the second
-- palatalization (e.g. [[práh]] "threshold", loc_p 'prazích'). Otherwise, -ích needs to be given manually using
-- <locplích>, e.g. [[les]] "forest"; [[hotel]] "hotel"; likewise for loc_p in -ách (e.g. [[plech]]
-- "metal plate"), using <locplách>.
-- * Inanimate hard nouns in -c normally have -ech: [[hec]] "joke", [[tác]] "tray", [[truc]], [[kec]], [[frc]],
-- [[flanc]], [[kibuc]] "kibbutz", [[pokec]] "chat".
-- In the IJP tables, inanimate reducible nouns in -ček (and most in -cek, although there are many fewer; also some
-- in -žek, but in this case it's too inconsistent to make the default) regularly have both -ích and -ách in the
-- locative plural, while similar animate nouns only have -ích. This applies even to nouns like [[háček]] and
-- [[koníček]] that can be either animate or inanimate. Make sure to exclude nouns in -ck such as [[comeback]] and
-- [[joystick]], which have only -ích.
local loc_p =
base.animacy == "inan" and find(base.lemma, "[cč]ek$") and find(stems.vowel_stem, "[cč]k$") and {"ích", "ách"} or
velar and "ích" or "ech"
noun_add_decl(base, stems, gen_s, dat_s, nil, voc_s, loc_s, "em",
-- loc_p in -ích not after velar stems (e.g. [[les]] "forest"; [[hotel]] "hotel") needs to be given manually
-- using <locplích>; it will automatically trigger the second palatalization; loc_p in -ách (e.g. [[plech]]
-- "metal plate") also needs to be given manually using <locplách>
nom_p, "ů", "ům", "y", loc_p, "y")
end
noun_declprops["hard-m"] = {
desc = function(base, stems)
if base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$") then
return "velar GENDER"
else
return "hard GENDER"
end
end,
cat = function(base, stems)
if base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$") then
return "velar-stem"
else
return "hard"
end
end
}
noun_decls["semisoft-m"] = function(base, stems)
-- Examples:
-- * Animate in -ius: génius, nuncius, nonius (breed of horse), notárius, ordinárius, patricius, primárius,
-- pronuncius, various names
-- * Animate in -eus: farizeus, basileus, pygmeus ([[skarabeus]] inflects hard in the plural), various names
-- * Inanimate in -ius: nonius (measuring device), rádius, sestercius
-- NOTE: Inanimate nouns in -eus (nukleus, choreus) inflect hard in the plural
local dat_s = base.animacy == "inan" and "u" or base.surname and "ovi" or {"ovi", "u"}
local loc_s = dat_s
local nom_p = base.animacy == "inan" and "e" or "ové"
noun_add_decl(base, stems, "a", dat_s, nil, "e", loc_s, "em",
nom_p, "ů", "ům", "e", "ích", "i")
end
noun_declprops["semisoft-m"] = {
cat = "semisoft"
}
noun_decls["soft-m"] = function(base, stems)
base.palatalize_voc = true
-- animates with dat_s only in -i need to give this manually, using '<dati>'
local dat_s = base.animacy == "inan" and "i" or base.surname and "ovi" or {"ovi", "i"}
local loc_s = dat_s
-- Per IJP, the vast majority of soft masculine animates take -i in the voc_s, but those in -ec/-ěc take -e with first
-- palatalization to -če, e.g. [[otec]] "father", [[lovec]] "hunter", [[blbec]] "fool, idiot", [[horolezec]]
-- "mountaineer", [[znalec]] "expert", [[chlapec]] "boy", [[nadšenec]] "enthusiast", [[luněc]] (type of bird).
-- Demonyms but not surnames ending in -ec but beginning with a capital letter take either -e or -i (only the former
-- triggers the first palatalization). Examples: [[Portugalec]], [[Slovinec]] "Slovenian", [[Japonec]], [[Vietnamec]].
-- Not [[Kadlec]] (surname).
local voc_s = base.animacy == "an" and find(base.lemma, "[eě]c$") and stems.reducible and
(not base.surname and find(base.lemma, "^" .. UPPERCASE_C) and {"e", "i"} or "e") or "i"
local nom_p = base.animacy == "inan" and "e" or default_masc_animate_nom_pl(base, stems)
-- nouns with loc_p in -ech (e.g. [[cíl]] "goal") need to give this manually, using <locplech>
noun_add_decl(base, stems, "e", dat_s, nil, voc_s, loc_s, "em",
nom_p, "ů", "ům", "e", "ích", "i")
end
noun_declprops["soft-m"] = {
cat = "soft"
}
noun_decls["mixed-m"] = function(base, stems)
-- NOTE: IJP tends to list the soft endings first, but per their section on this
-- (https://prirucka.ujc.cas.cz/en/?id=220), the hard endings tend to predominate in modern use, so we list them
-- first.
if base.animacy == "an" then
if find(base.lemma, "l$") then
-- [[anděl]] "angel", [[manžel]] "husband", [[strašpytel]] "coward"; 'strašpytel' has a different declension
-- from the other two, with more soft forms. [[manžel]] has plural in -é or -ové and needs an override.
local dat_s = base.surname and "ovi" or {"ovi", "u"}
local loc_s = dat_s
noun_add_decl(base, stems, "a", dat_s, nil, "i", loc_s, "em",
"é", "ů", "ům", {"y", "e"}, {"ech", "ích"}, {"y", "i"})
else
-- -s/-z: rorýs, platýs, pilous, markýz, všekaz, stávkokaz, penězokaz, listokaz, dřevokaz, zrnokaz, boss.
-- Others recently moving towards this declension: primas, karas, kalous, konipas, ibis, chabrus, chuďas,
-- kakabus, kliďas, kandrdas, morous, vágus.
-- Some names: Alois, Mánes.
-- Both hard and soft endings throughout. Most have -i and -ové in the nominative plural.
local dat_s = base.surname and "ovi" or {"u", "i", "ovi"}
local loc_s = dat_s
noun_add_decl(base, stems, {"a", "e"}, dat_s, nil, {"e", "i"}, loc_s, "em",
{"i", "ové"}, "ů", "ům", {"y", "e"}, {"ech", "ích"}, {"y", "i"})
end
else
-- Given in IJP: burel, hnědel, chmel, krevel, kužel, námel, plevel, tmel, zádrhel, apríl, artikul, koukol, rubl,
-- úběl, plus reducible nouns cumel, chrchel, [[kotel]] "cauldron", sopel, uhel. Also [[městys]]. Many of them are listed in the
-- IJP tables with only hard or with fewer soft forms, so need to be investigated individually.
if find(base.lemma, "[ls]$") then
noun_add_decl(base, stems, {"u", "e"}, {"u", "i"}, nil, {"e", "i"}, {"u", "e", "i"}, "em",
{"y", "e"}, "ů", "ům", {"y", "e"}, {"ech", "ích"}, {"y", "i"})
else
-- -n/-t; hard in the plural: hřeben, ječmen, [[kámen]] "stone", kmen, kořen, křemen, plamen,
-- [[pramen]] "source", [[řemen]] "strap", den, týden, [[loket]] "elbow".
-- There may be deviations (e.g. soft plural forms for [[den]]), so need to be investigated individually.
noun_add_decl(base, stems, {"u", "e"}, {"u", "i"}, nil, "i", {"u", "i"}, "em",
"y", "ů", "ům", "y", "ech", "y")
end
end
end
noun_declprops["mixed-m"] = {
cat = "mixed"
}
noun_decls["a-m"] = function(base, stems)
-- husita → husité, izraelita → izraelité, jezuita → jezuité, kosmopolita → kosmopolité, táborita → táborité
-- fašista → fašisté, filatelista → filatelisté, fotbalista → fotbalisté, kapitalista → kapitalisté,
-- marxista → marxisté, šachista → šachisté, terorista → teroristé. NOTE: most these words actually appear in
-- the IJP tables with -é/-i, so we go accordingly.
--
-- gymnasta → gymnasté, fantasta → fantasté; also chiliasta, orgiasta, scholiasta, entuziasta, dynasta, ochlasta,
-- sarkasta, vymasta; NOTE: Only 'gymnasta' actually given with just -é; 'fantasta' with -ové/-é, 'dynasta' and
-- 'ochlasta' with just -ové, vymasta not in IJP (no plural given in SSJC), and the rest with -é/-i. So we go
-- accordingly.
local it_ist = find(stems.vowel_stem, "is?t$") or find(stems.vowel_stem, "ast$")
-- Velar nouns (e.g. [[sluha]] "servant") have -ích in the loc_p (which triggers the second palatalization)
-- instead of -ech. Nouns whose stem ends in a soft consonant ([[rikša]], [[paša]], [[bača]], [[mahárádža]],
-- [[paňáca]], etc.) behave likewise.
-- FIXME: [[pária]] "pariah", [[Maria]] etc.
local loc_p =
(base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$") or find(stems.vowel_stem, INHERENTLY_SOFT_C .. "$")) and
"ích" or "ech"
noun_add_decl(base, stems, "y", "ovi", "u", "o", "ovi", "ou",
it_ist and {"é", "i"} or "ové", "ů", "ům", "y", loc_p, "y")
end
noun_declprops["a-m"] = {
cat = "GENPOS in -a"
}
noun_decls["e-m"] = function(base, stems)
-- [[zachránce]] "savior"; [[soudce]] "judge"; etc.
-- At least two inanimates: [[průvodce]] "guide, guidebook; computing wizard"; [[správce]] "manager (software program), configuration program"
local dat_s = base.animacy == "inan" and "i" or base.surname and "ovi" or {"ovi", "i"}
local loc_s = dat_s
noun_add_decl(base, stems, "e", dat_s, nil, "-", loc_s, "em",
-- nouns with -ové as well (e.g. [[soudce]] "judge") will need to specify that manually, e.g. <nompli:ové>
base.animacy == "inan" and "e" or "i", "ů", "ům", "e", "ích", "i")
end
noun_declprops["e-m"] = {
cat = "GENPOS in -e"
}
noun_decls["i-m"] = function(base, stems)
-- [[kivi]] "kiwi (bird)"; [[kuli]] "coolie"; [[lori]] "lory, lorikeet (bird)" (loc_pl 'loriech/loriích/lorich');
-- [[vini]] "parrot of the genus Vini"; [[yetti]]/[[yeti]] "yeti". other examples: [[aguti]], [[efendi]], [[hadži]],
-- [[pekari]], [[regenschori]], [[yetti]]/[[yeti]].
--
-- [[grizzly]]/[[grizly]] "grizzly bear"; [[pony]] "pony"; [[husky]] "husky"; [[dandy]] "dandy"; [[Billy]] "billy".
--
-- NOTE: Some nouns in -y are regular soft stems, e.g. [[gay]] "gay person"; [[gray]] "gray (unit of absorbed
-- radiation)"; [[Nagy]] (surname).
--
-- NOTE: The stem ends in -i/-y.
noun_add_decl(base, stems, "ho", "mu", nil, "-", "m", "m",
-- ins_pl 'kivii/kivimi'
{"ové", ""}, {"ů", "ch"}, {"ům", "m"}, {"e", ""}, {"ích", "ch"}, {"i", "mi"})
end
noun_declprops["i-m"] = {
cat = "GENPOS in -i/-y"
}
noun_decls["í-m"] = function(base, stems)
-- [[kádí]] "qadi (Islamic judge)", [[mahdí]] "Mahdi (Islamic prophet)", [[muftí]] "mufti (Islamic scholar)",
-- [[sipáhí]] "sipahi (Algerian cavalryman in the French army)"
--
-- No obvious examples in -ý, but the support is there.
--
-- NOTE: The stem ends in -í/-ý.
noun_add_decl(base, stems, "ho", "mu", nil, "-", "m", "m",
{"ové", ""}, {"ů", "ch"}, {"ům", "m"}, {"e", ""}, "ích", "mi")
end
noun_declprops["í-m"] = {
cat = "GENPOS in -í/-ý"
}
noun_decls["ie-m"] = function(base, stems)
-- [[zombie]] "zombie" (also fem/neut), [[hippie]] "hippie", [[yuppie]] "yuppie", [[rowdie]] "rowdy/hooligan"
--
-- NOTE: The stem ends in -i (not -ie, because of the plural).
noun_add_decl(base, stems, "eho", "emu", nil, "-", "em", "em",
{"ové", "es"}, {"ů", "es"}, {"ům", "es"}, {"e", "es"}, {"ích", "es"}, {"i", "es"})
end
noun_declprops["ie-m"] = {
cat = "GENPOS in -ie"
}
noun_decls["ee-m"] = function(base, stems)
-- [[Yankee]] "Yankee"
--
-- NOTE: The stem ends in -ee.
noun_add_decl(base, stems, "ho", "mu", nil, "-", "m", "m",
"ové", "ů", "ům", "e", "ích", "i")
end
noun_declprops["ee-m"] = {
cat = "GENPOS in -ee"
}
noun_decls["o-m"] = function(base, stems)
-- [[kápo]] "head, leader"; [[lamželezo]] "strongman"; [[torero]] "bullfighter"; [[žako]] "African gray parrot";
-- [[dingo]] "dingo"; [[kakapo]] "kakapo" (given in Wiktionary with dat_s/loc_s in -ovi only not -ovi/-u; probably
-- wrong but not in IJP); [[maestro]] "maestro"; [[Bruno]] "Bruno", [[Hugo]] "Hugo"; [[Ivo]] "Yves" (these names
-- are singular-only per IJP); [[Kvido]] "Guido, Guy" (per IJP has accusative in -a or -ona); [[Oto]] "Otto" (per
-- IJP also declinable like virile -a masculines; singular-only); [[Kuřátko]] (a surname; how declined?);
-- [[Picasso]] (surname; how declined?); [[Pluto]] "Pluto (God)", also "Pluto (planet)", which is inanimate;
-- [[Samo]]/[[Sámo]] "Samo (7th century Slavic ruler)" (dat_s/loc_s only in -ovi, needs override); [[Tomio]]
-- "Tomio (Japanese male given name)" (how declined?); [[nemakačenko]] "idler, loafer" (given in Wiktionary with
-- dat_s/loc_s in -ovi only, as for [[kakapo]]); [[nefachčenko]] "idler, loafer"; note also [[gadžo]] "gadjo",
-- which has a unique declension.
--
-- Velar nouns ([[žako]], [[dingo]], etc.) have -ích in the loc_p (which triggers the second palatalization)
-- instead of -ech.
local velar = base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$")
-- inanimates e.g. [[Pluto]] (planet) have -u only, like for normal hard masculines.
local dat_s = base.animacy == "inan" and "u" or base.surname and "ovi"or {"ovi", "u"}
local loc_s = dat_s
local loc_p = velar and "ích" or "ech"
noun_add_decl(base, stems, "a", dat_s, nil, "-", loc_s, "em",
"ové", "ů", "ům", "y", loc_p, "y")
end
noun_declprops["o-m"] = {
cat = "GENPOS in -o"
}
noun_decls["u-m"] = function(base, stems)
-- [[emu]] "emu", [[guru]] "guru", [[kakadu]] "cockatoo", [[marabu]] "marabou" (declined the same way)
-- [[Osamu]] "Osamu (Japanese male given name)" [how declined?]
-- [[Višnu]] "Vishnu" (declined like [[guru]] but singular-only)
-- [[budižkničemu]] "good-for-nothing, ne'er-do-well" (indeclinable in the singular, declinable as masculine hard stem
-- budižkničemové etc. in the plural, declinable as feminine hard stem budižkničemy etc. in the plural when feminine).
--
-- NOTE: The stem ends in -u.
noun_add_decl(base, stems, "a", "ovi", nil, "-", "ovi", "em",
"ové", "ů", "ům", "y", "ech", "y")
end
noun_declprops["u-m"] = {
cat = "GENPOS in -u"
}
noun_decls["tstem-m"] = function(base, stems)
-- E.g. [[kníže]] "prince", [[hrabě]] "earl", [[markrabě]] "margrave".
noun_add_decl(base, stems, "ete", "eti", "ete", "-", "eti", "etem",
"ata", "at", "atům", "ata", "atech", "aty")
end
noun_declprops["tstem-m"] = {
cat = "t-stem"
}
noun_decls["hard-f"] = function(base, stems)
base.no_palatalize_c = true
if base.c_as_k then
-- forms like 'ayahuascy' are allowed.
base.hard_c = true
end
-- [[skica]] "sketch", [[gejša]] "geisha", [[rikša]] "rickshaw (vehicle)"; [[arakača]], [[čača]], [[čiča]] (drink),
-- [[dača]] "dacha", [[gutaperča]] "guttapercha", [[viskača]]; [[babča]], [[číča]], [[káča]], [[mamča]], [[úča]].
-- Also appears to apply to ď (e.g. [[Naďa]]) and ť, as well as certain words with stems in -ň and -j (e.g. [[doňa]],
-- and personal names such as [[Táňa]] and [[Darja]]), which normally have a mixed declension.
local soft_cons = find(base.vowel_stem, "[cčšžďťjň]$") and not base.c_as_k
local dat_s = soft_cons and {"ě", "i"} or "ě"
local loc_s = dat_s
noun_add_decl(base, stems, "y", dat_s, "u", "o", loc_s, "ou",
"y", "", "ám", "y", "ách", "ami")
end
noun_declprops["hard-f"] = {
cat = "hard"
}
noun_decls["soft-f"] = function(base, stems)
-- This also includes feminines in -ie, e.g. [[belarie]], [[signorie]], [[uncie]], and feminines in -oe, e.g.
-- [[kánoe]], [[aloe]] and medical terms like [[dyspnoe]], [[apnoe]], [[hemoptoe]], [[kalanchoe]].
-- Nouns in -ice like [[ulice]] "street" have null genitive plural e.g. 'ulic'; nouns in -yně e.g. [[přítelkyně]]
-- "girlfriend" have gen pl 'přítelkyň' or 'přítelkyní' with two possible endings; otherwise -í. (Alternation between
-- -ň and -n and between -e and -ě handled automatically by noun_combine_stem_ending().)
local gen_p = find(base.lemma, "ice$") and "" or find(base.lemma, "yně$") and {"", "í"} or "í"
-- Vocative really ends in -e, not just a copy of the nominative; cf. [[sinfonia]], which is soft-f except for
-- the nominative and has -e in the vocative singular.
noun_add_decl(base, stems, "e", "i", "i", "e", "i", "í",
"e", gen_p, "ím", "e", "ích", "emi")
end
noun_declprops["soft-f"] = {
cat = "soft"
}
noun_decls["mixed-f"] = function(base, stems)
-- Lowercase nouns in -ňa (e.g. bárišňa/báryšňa, doňa, dueňa, piraňa, vikuňa) and -ja (e.g. maracuja, papája, sója).
-- Also non-personal proper nouns in -ňa (e.g. [[Keňa]] "Kenya") and -ja (e.g. [[Troja]]/[[Trója]] "Troy",
-- [[Amudarja]] "Amu Darya"). Does not appear to apply to personal proper nouns (e.g. [[Táňa]] "Tanya", [[Darja]] "Daria"),
-- which usually decline like [[gejša]], [[dača]], [[skica]]).
noun_add_decl(base, stems, {"i", "e"}, {"e", "i"}, "u", "o", {"e", "i"}, "ou",
{"i", "e"}, {"", "í"}, {"ám", "ím"}, {"i", "e"}, {"ách", "ích"}, {"ami", "emi"})
end
noun_declprops["mixed-f"] = {
cat = "mixed"
}
noun_decls["cons-f"] = function(base, stems)
-- e.g. [[dlaň]] "palm (of the hand)"
noun_add_decl(base, stems, "e", "i", "-", "i", "i", "í",
"e", "í", "ím", "e", "ích", "emi")
end
noun_declprops["cons-f"] = {
cat = "soft zero-ending"
}
noun_decls["istem-f"] = function(base, stems)
noun_add_decl(base, stems, "i", "i", "-", "i", "i", "í",
-- See above under noun_apply_special_cases(); -E causes depalatalization of ť/ď/ň.
"i", "í", "Em", "i", "Ech", "mi")
end
noun_declprops["istem-f"] = {
cat = "i-stem"
}
noun_decls["mixed-istem-f"] = function(base, stems)
local gen_s, nom_p, dat_p, loc_p, ins_p
-- Use of ě vs E below is intentional. Contrast [[oběť]] dat pl 'obětem' (depalatalizing) with [[nit]] ins pl
-- 'nitěmi' (palatalizing). See comment above under noun_apply_special_cases().
if base.mixedistem == "pěst" then
-- pěst, past, mast, lest [reducible; ins pl 'lstmi'], pelest, propust, plst, oběť, zeď [reducible; ins pl
-- 'zdmi'], paměť [ins pl 'pamětmi/paměťmi]
gen_s, nom_p, dat_p, loc_p, ins_p = "i", "i", {"ím", "Em"}, {"ích", "Ech"}, "mi"
elseif base.mixedistem == "moc" then
-- moc, nemoc, pomoc, velmoc; NOTE: pravomoc has -i/-e alternation in gen_s, nom_p
gen_s, nom_p, dat_p, loc_p, ins_p = "i", "i", {"Em", "ím"}, {"Ech", "ích"}, "ěmi"
elseif base.mixedistem == "myš" then
-- myš, veš [reducible, ins pl vešmi], hruď, měď, pleť, spleť, směs, smrt, step, odpověď [ins pl 'odpověď'mi/odpovědmi'], šeď,
-- závěť [ins pl 'závěťmi/závětmi'], plsť [ins pl 'plstmi']
gen_s, nom_p, dat_p, loc_p, ins_p = "i", "i", "ím", "ích", "mi"
elseif base.mixedistem == "noc" then
-- lež [reducible], noc, mosaz, rez [reducible], ves [reducible], mysl, sůl, běl, žluť
gen_s, nom_p, dat_p, loc_p, ins_p = "i", "i", "ím", "ích", "ěmi"
elseif base.mixedistem == "žluč" then
-- žluč, moč, modř, čeleď, kapraď, záď, žerď, čtvrť/čtvrt, drť, huť, chuť, nit, pečeť, závrať, pouť, stať, ocel
gen_s, nom_p, dat_p, loc_p, ins_p = {"i", "ě"}, {"i", "ě"}, "ím", "ích", "ěmi"
elseif base.mixedistem == "loď" then
-- loď, suť
gen_s, nom_p, dat_p, loc_p, ins_p = {"i", "ě"}, {"i", "ě"}, "ím", "ích", {"ěmi", "mi"}
else
error(("Unrecognized value '%s' for 'mixedistem', should be one of 'pěst', 'moc', 'myš', 'noc', 'žluč' or 'loď'"):
format(base.mixedistem))
end
noun_add_decl(base, stems, gen_s, "i", "-", "i", "i", "í",
nom_p, "í", dat_p, nom_p, loc_p, ins_p)
end
noun_declprops["mixed-istem-f"] = {
-- Include subtype in the table description but not in the category to avoid too many categories.
desc = function(base, stems)
return ("mixed i-stem [type '%s'] GENDER"):format(base.mixedistem)
end,
cat = function(base, stems)
return {"mixed i-stem", ("mixed i-stem GENPOS (type '%s')"):format(base.mixedistem)}
end,
}
noun_decls["i-f"] = function(base, stems)
-- [[máti]] "mother" (singular-only), [[pramáti]] "foremother"; very similar to the 'noc' mixed i-stem type
noun_add_decl(base, stems, "i", "i", "-", "i", "i", "í",
"i", "í", "ím", "i", "ích", "ěmi")
end
noun_declprops["i-f"] = {
cat = "GENPOS in -i"
}
noun_decls["ea-f"] = function(base, stems)
-- Stem ends in -e.
if base.tech then
-- diarea, gonorea, chorea, nauzea, paleogea, seborea, trachea
noun_add_decl(base, stems, "y", "i", "u", "o", "i", "ou",
"y", "í", {"ám", "ím"}, "y", {"ách", "ích"}, "ami")
elseif base.persname then
-- Medea, Andrea, etc.
noun_add_decl(base, stems, {"y", "je", "ji"}, {"e", "je", "ji"}, "u", "o", {"e", "je", "ji"}, "ou",
-- this is a guess, based on the same as below; plural of personal names not attested in IJP
{"y", "je"}, "jí", {"ám", "jím"}, {"y", "je"}, {"ách", "jích"}, {"ami", "jemi"})
else
-- idea, odysea ("wandering pilgrimage"), orchidea, palea, spirea
-- proper names Galilea, Judea, Caesarea, Korea, Odyssea ("epic poem")
noun_add_decl(base, stems, {"y", "je"}, "ji", "u", "o", "ji", {"ou", "jí"},
{"y", "je"}, "jí", {"ám", "jím"}, {"y", "je"}, {"ách", "jích"}, {"ami", "jemi"})
end
end
noun_declprops["ea-f"] = {
cat = function(base, stems)
if base.tech then
return {"GENPOS in -ea", "technical GENPOS in -ea"}
else
return "GENPOS in -ea"
end
end
}
noun_decls["oa-f"] = function(base, stems)
-- Stem ends in -o/-u.
-- stoa, kongrua; proper names Samoa, Managua, Nikaragua, Capua
noun_add_decl(base, stems, "y", "i", "u", "o", "i", "ou",
"y", "í", "ám", "y", "ách", "ami")
end
noun_declprops["oa-f"] = {
cat = "GENPOS in -oa/-ua"
}
noun_decls["ia-f"] = function(base, stems)
-- Stem ends in -i.
-- belaria, signoria, uncia; paranoia, sinfonia;
-- proper names Alexandria, Alexia, Livia, Monrovia, Olympia, Sofia
-- Identical to soft declension except for nom sg.
noun_decls["soft-f"](base, stems)
end
noun_declprops["ia-f"] = {
cat = "GENPOS in -ia"
}
noun_decls["hard-n"] = function(base, stems)
local velar = base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$")
-- NOTE: Per IJP it appears the meaning of the preceding preposition makes a difference: 'o' = "about" takes
-- '-u' or '-ě', while 'na/v' = "in, on" normally takes '-ě'.
local loc_s =
-- Exceptions: [[mléko]] "milk" ('mléku' or 'mléce'), [[břicho]] "belly" ('břiše' or (less often) 'břichu'),
-- [[roucho]] ('na rouchu' or 'v rouše'; why the difference in preposition?).
velar and "u" or
-- IJP says nouns in -dlo take only -e but the declension tables show otherwise. It appears -u is possible
-- but significantly less common. Other nouns in -lo usually take just -e ([[čelo]] "forehead",
-- [[kolo]] "wheel", [[křeslo]] "armchair", [[máslo]] "butter", [[peklo]] "hell", [[sklo]] "glass",
-- [[světlo]] "light", [[tělo]] "body"; but [[číslo]] "number' with -e/-u; [[zlo]] "evil" and [[kouzlo]] "spell"
-- with -u/-e).
find(base.lemma, "dlo$") and {"ě", "u"} or
find(base.lemma, "lo$") and "ě" or
(find(base.lemma, "[sc]tvo$") or find(base.lemma, "ivo$")) and "u" or
-- Per IJP: Borrowed words and abstracts take -u (e.g. [[banjo]]/[[bendžo]]/[[benžo]] "banjo", [[depo]] "depot",
-- [[chladno]] "cold", [[mokro]] "damp, dampness", [[právo]] "law, right", [[šeru]] "twilight?",
-- [[temno]] "dark, darkness", [[tempo]] "rate, tempo", [[ticho]] "quiet, silence", [[vedro]] "heat") and others
-- often take -ě/-u. Formerly we defaulted to -ě/-u but it seems better to default to just -u, similarly to hard
-- masculines.
-- {"ě", "u"}
"u"
local loc_p =
-- Note, lemmas in -isko also have mixed-reducible as default, handled in noun_determine_default_reducible().
-- Note also, ending -ích triggers the second palatalization.
find(base.lemma, "isko$") and {"ích", "ách"} or
-- Diminutives in -ko, -čko, -tko; also [[lýtko]], [[děcko]], [[vrátka]], [[dvířka]], [[jho]], [[roucho]],
-- [[tango]], [[mango]], [[sucho]], [[blaho]], [[víko]], [[echo]], [[embargo]], [[largo]], [[jericho]] (from
-- IJP). Also foreign nouns in -kum: [[antibiotikum]], [[narkotikum]], [[afrodiziakum]], [[analgetikum]], etc.
-- [[jablko]] "apple" has '-ách' or '-ích' and needs an override; likewise for [[vojsko]] "troop"; [[riziko]]
-- "risk" normally has '-ích' and needs and override.
velar and "ách" or
"ech"
noun_add_decl(base, stems, "a", "u", "-", "-", loc_s, "em",
"a", "", "ům", "a", loc_p, "y")
-- FIXME: paired body parts e.g. [[rameno]] "shoulder" (gen_p/loc_p 'ramenou/ramen'), [[koleno]] "knee"
-- (gen_p/loc_p 'kolenou/kolen'), [[prsa]] "chest, breasts" (plurale tantum; gen_p/loc_p 'prsou').
-- FIXME: Nouns with both neuter and feminine forms in the plural, e.g. [[lýtko]] "calf (of the leg)",
-- [[bedro]] "hip", [[vrátka]] "gate".
end
noun_declprops["hard-n"] = {
desc = function(base, stems)
if base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$") then
return "velar GENDER"
else
return "hard GENDER"
end
end,
cat = function(base, stems)
if base.velar ~= false and find(stems.vowel_stem, VELAR_C .. "$") then
return "velar-stem"
else
return "hard"
end
end
}
noun_decls["semisoft-n"] = function(base, stems)
-- Examples:
-- * In -ao: [[kakao]] "cacao", [[makao]] "Macao (gambling card game, see Wikipedia)", [[curaçao]] "curaçao (liqueur)"
-- (IJP gives gen pl 'curaç' but ASSC [https://slovnikcestiny.cz/heslo/cura%C3%A7ao/0/9967] says 'curaçí' as expected),
-- [[farao]] "faro (card game)"; also [[Makao]], [[Pathet Lao]], but these are sg-only
-- * In -eo: [[stereo]], [[rodeo]], [[video]], [[solideo]]; also [[Borneo]], [[Montevideo]], but these are sg-only
-- * In -io: [[rádio]] "radio", [[gramorádio]], [[studio]], [[scenário]], [[trio]], [[ážio]] (also spelled [[agio]]),
-- [[disážio]], [[folio]], [[vibrio]]; also [[arpeggio]], [[adagio]], [[capriccio]], [[solfeggio]] although
-- pronounced the Italian way without /i/; also [[Ohio]], [[Ontario]], [[Tokio]], but these are sg-only
-- * In -uo: only [[duo]]
-- * In -yo: only [[embryo]]
-- * In -eum: [[muzeum]], [[lyceum]], [[linoleum]], [[ileum]], etc.
-- * In -ium: [[atrium]] "atrium", most chemical elements, etc.
-- * In -uum: [[individuum]], [[kontinuum]], [[premenstruum]], [[residuum]], [[vakuum]]/[[vacuum]]
-- * In -yum: only [[baryum]] "barium" (none others in SSJC)
-- * In -ion: [[enkómion]] "encomium", [[eufonion]] (variant of [[eufonium]]), [[amnion]], [[ganglion]], [[gymnasion]],
-- [[scholion]], [[kritérion]] (rare for [[kritérium]]), [[onomatopoion]] (variant of [[onomatopoie]]),
-- [[symposion]], [[synedrion]]; also [[Byzantion]], but this is sg-only; most words in -ion are masculine
-- Hard in the singular, mostly soft in the plural. Those in -eo and -uo have alternative hard endings in the
-- dat/loc/ins pl, but not those in -eum or -uum. Those in -ao have only hard endings except in the gen pl. (There are
-- apparently no neuters in -eon; those in -eon or -yon e.g. [[akordeon]], [[neon]], [[nukleon]], [[karyon]], [[Lyon]]
-- are masculine.)
local dat_p, loc_p, ins_p
if find(base.actual_lemma, "ao$") then
dat_p, loc_p, ins_p = "ům", "ech", "y"
elseif find(base.actual_lemma, "[eu]o$") then
dat_p, loc_p, ins_p = {"ím", "ům"}, {"ích", "ech"}, {"i", "y"}
else
dat_p, loc_p, ins_p = "ím", "ích", "i"
end
noun_add_decl(base, stems, "a", "u", "-", "-", "u", "em",
"a", "í", dat_p, "a", loc_p, ins_p)
end
noun_declprops["semisoft-n"] = {
cat = "semisoft"
}
noun_decls["soft-n"] = function(base, stems)
-- Examples: [[moře]] "sea", [[slunce]] "sun", [[srdce]] "heart", [[citoslovce]] "interjection",
-- [[dopoledne]] "late morning", [[odpoledne]] "afternoon", [[hoře]] "sorrow, grief" (archaic or literary),
-- [[inhalace]] "inhalation", [[kafe]] "coffee", [[kanape]] "sofa", [[kutě]] "bed", [[Labe]] "Elbe (singular only)",
-- [[líce]] "cheek", [[lože]] "bed", [[nebe]] "sky; heaven", [[ovoce]] "fruit", [[pole]] "field", [[poledne]]
-- "noon", [[příslovce]] "adverb", [[pukrle]] "curtsey" (also t-n), [[vejce]] "egg" (NOTE: gen pl 'vajec').
--
-- Many nouns in -iště, with null genitive plural.
local gen_p = find(base.vowel_stem, "išť$") and "" or "í"
noun_add_decl(base, stems, "e", "i", "-", "-", "i", "em",
"e", gen_p, "ím", "e", "ích", "i")
-- NOTE: Some neuter words in -e indeclinable, e.g. [[Belize]], [[Chile]], [[garde]] "chaperone", [[karaoke]],
-- [[karate]], [[re]] "double raise (card games)", [[ukulele]], [[Zimbabwe]], [[zombie]] (pl. 'zombie' or
-- 'zombies')
-- some nearly indeclinable, e.g. [[finále]], [[chucpe]]; see mostly-indecl below
end
noun_declprops["soft-n"] = {
cat = "soft"
}
noun_decls["í-n"] = function(base, stems)
-- [[nábřeží]] "waterfront" and a zillion others; also [[úterý]] "Tuesday".
-- NOTE: The stem ends in -í/-ý.
noun_add_decl(base, stems, "", "", "-", "-", "", "m",
"", "", "m", "", "ch", "mi")
end
noun_declprops["í-n"] = {
cat = "GENPOS in -í/-ý"
}
noun_decls["n-n"] = function(base, stems)
-- E.g. [[břemeno]] "burden" (also [[břímě]], use 'decllemma:'); [[písmeno]] "letter"; [[plemeno]] "breed";
-- [[rameno]] "shoulder" (also [[rámě]], use 'decllemma:'); [[semeno]] "seed" (also [[sémě]], [[símě]], use
-- 'decllemma:'); [[temeno]] "crown (of the head)"; [[vemeno]] "udder"
noun_add_decl(base, stems, {"a", "e"}, {"i", "u"}, "-", "-", {"ě", "i", "u"}, "em",
"a", "", "ům", "a", "ech", "y")
end
noun_declprops["n-n"] = {
cat = "n-stem"
}
noun_decls["tstem-n"] = function(base, stems)
-- E.g. [[batole]] "toddler", [[čuně]] "pig", [[daňče]] "fallow deer fawn", [[děvče]] "girl", [[ďouče]] "girl"
-- (dialectal), [[dítě]] "child" (NOTE: feminine in the plural [[děti]], declined as a feminine i-stem), [[dvojče]]
-- "twin", [[hádě]] "young snake", [[house]] "gosling", [[hříbě]] "foal" (pl. hříbata), [[jehně]] "lamb", [[kavče]]
-- "young jackdaw; chough", [[káče]] "duckling", [[káně]] "buzzard chick" (NOTE: also feminine meaning "buzzard"),
-- [[klíště]] "tick", [[kose]] "blackbird chick" (rare), [[kuře]] "chick (young chicken)", [[kůzle]]
-- "kid (young goat)", [[lišče]] "fox cub", [[lvíče]] "lion cub", [[medvídě]] "bear cub", [[mládě]] "baby animal",
-- [[morče]] "guinea pig", [[mrně]] "toddler", [[nemluvně]] "infant", [[novorozeně]] "newborn", [[orle]] "eaglet",
-- [[osle]] "donkey foal", [[pachole]] "boy (obsolete); page, squire", [[páže]] "page, squire", [[podsvinče]]
-- "suckling pig", [[prase]] "pig", [[prtě]] "toddler", [[ptáče]] "chick (young bird)",
-- [[robě]] "baby, small child", [[saranče]] "locust" (NOTE: also feminine), [[sele]] "piglet",
-- [[slůně]] "baby elephant", [[škvrně]] "toddler", [[štěně]] "puppy", [[tele]] "calf", [[velbloudě]] "camel colt",
-- [[vlče]] "wolf cub", [[vnouče]] "grandchild", [[vyžle]] "small hunting dog; slender person",
-- [[zvíře]] "animal, beast".
--
-- Some referring to inanimates, e.g. [[doupě]] "lair" (pl. doupata), [[koště]]/[[chvoště]] "broom", [[paraple]]
-- "umbrella", [[poupě]] "bud", [[pukrle]] "curtsey" (also soft-n), [[rajče]] "tomato", [[šuple]] "drawer",
-- [[varle]] "testicle", [[vole]] "craw (of a bird); goiter".
noun_add_decl(base, stems, "ete", "eti", "-", "-", "eti", "etem",
"ata", "at", "atům", "ata", "atech", "aty")
end
noun_declprops["tstem-n"] = {
cat = "t-stem"
}
noun_decls["ma-n"] = function(base, stems)
-- E.g. [[drama]] "drama", [[dogma]] "dogma", [[aneurysma]]/[[aneuryzma]] "aneurysm", [[dilema]] "dilemma",
-- [[gumma]] "gumma" (non-cancerous syphilitic growth), [[klima]] "climate", [[kóma]] "coma", [[lemma]] "lemma",
-- [[melisma]] "melisma", [[paradigma]] "paradigm", [[plasma]]/[[plazma]] "plasma [partly ionized gas]"
-- (note [[plasma]]/[[plazma]] "blood plasma" is feminine), [[revma]] "rheumatism", [[schéma]] "schema, diagram",
-- [[schisma]]/[[schizma]] "schism", [[smegma]] "smegma", [[sofisma]]/[[sofizma]] "sophism", [[sperma]] "sperm",
-- [[stigma]] "stigma", [[téma]] "theme", [[trauma]] "trauma", [[trilema]] "trilemma", [[zeugma]] "zeugma".
noun_add_decl(base, stems, "atu", "atu", "-", "-", "atu", "atem",
"ata", "at", "atům", "ata", "atech", "aty")
end
noun_declprops["ma-n"] = {
cat = "ma-stem"
}
noun_decls["adj"] = function(base, stems)
local adj_alternant_multiword_spec = deepcopy(base)
synthesize_adj_lemma(adj_alternant_multiword_spec)
adj_decls["normal"](adj_alternant_multiword_spec)
adj_fill_decls(adj_alternant_multiword_spec)
local function copy(from_slot, to_slot)
base.forms[to_slot] = adj_alternant_multiword_spec.forms[from_slot]
end
if base.number ~= "pl" then
if base.gender == "m" then
copy("nom_m", "nom_s")
copy("gen_mn", "gen_s")
copy("dat_mn", "dat_s")
copy("loc_mn", "loc_s")
copy("ins_mn", "ins_s")
elseif base.gender == "f" then
copy("nom_f", "nom_s")
copy("gen_f", "gen_s")
copy("dat_f", "dat_s")
copy("acc_f", "acc_s")
copy("loc_f", "loc_s")
copy("ins_f", "ins_s")
else
copy("nom_n", "nom_s")
copy("gen_mn", "gen_s")
copy("dat_mn", "dat_s")
copy("acc_n", "acc_s")
copy("loc_mn", "loc_s")
copy("ins_mn", "ins_s")
end
if not base.forms.voc_s then
base.forms.voc_s = deepcopy(base.forms.nom_s)
end
end
if base.number ~= "sg" then
if base.gender == "m" then
if base.animacy == "an" then
copy("nom_mp_an", "nom_p")
else
copy("nom_fp", "nom_p")
end
copy("acc_mfp", "acc_p")
elseif base.gender == "f" then
copy("nom_fp", "nom_p")
copy("acc_mfp", "acc_p")
else
copy("nom_np", "nom_p")
copy("acc_np", "acc_p")
end
copy("gen_p", "gen_p")
copy("dat_p", "dat_p")
copy("ins_p", "ins_p")
copy("loc_p", "loc_p")
end
end
local function get_stemtype(base)
if find(base.lemma, "ý$") then
return "hard"
elseif find(base.lemma, "í$") then
return "soft"
else
return "possessive"
end
end
noun_declprops["adj"] = {
cat = function(base, stems)
return {"adjectival POS", get_stemtype(base) .. " GENDER adjectival POS"}
end,
}
noun_decls["mostly-indecl"] = function(base, stems)
-- Several neuters: E.g. [[finále]] "final (sports)", [[čtvrtfinále]] "quarterfinal", [[chucpe]] "chutzpah",
-- [[penále]] "fine, penalty", [[promile]] "" (NOTE: loc pl also promilech), [[rande]] "rendezvous", [[semifinále]]
-- "semifinal", [[skóre]] "score".
-- At least one masculine animate: [[kamikaze]]/[[kamikadze]], where IJP says only -m in the ins sg.
local ins_s = base.gender == "m" and "m" or {"-", "m"}
noun_add_decl(base, stems, "-", "-", "-", "-", "-", ins_s,
"-", "-", "-", "-", "-", "-")
end
noun_declprops["mostly-indecl"] = {
cat = "mostly indeclinable"
}
noun_decls["indecl"] = function(base, stems)
-- Indeclinable. Note that fully indeclinable nouns should not have a table at all rather than one all of whose forms
-- are the same; but having an indeclinable declension is useful for nouns that may or may not be indeclinable, e.g.
-- [[desatero]] "group of ten" or the plural of [[peso]], which may be indeclinable 'pesos'.
noun_add_decl(base, stems, "-", "-", "-", "-", "-", "-",
"-", "-", "-", "-", "-", "-")
end
noun_declprops["indecl"] = {
cat = function(base, stems)
if base.adj then
return {"adjectival POS", "indeclinable adjectival POS", "indeclinable GENDER adjectival POS"}
else
return {"indeclinable POS", "indeclinable GENPOS"}
end
end
}
noun_decls["manual"] = function(base, stems)
-- Anything declined manually using overrides. We don't set any declensions except the nom_s (or nom_p if plurale
-- tantum).
noun_add(base, base.number == "pl" and "nom_p" or "nom_s", stems, "-")
end
noun_declprops["manual"] = {
desc = "GENDER",
cat = {},
}
noun_decls["pron"] = function(base, stems)
local after_prep_footnote = "PREP"
local animate_footnote = "ANIM"
if base.lemma == "kdo" then
noun_add_decl(base, stems, "koho", "komu", nil, nil, "kom", "kým")
elseif base.lemma == "co" then
noun_add_decl(base, stems, "čeho", "čemu", nil, nil, "čem", "čím")
elseif base.lemma == "já" then
noun_add_sg_decl_with_clitic(base, stems, "mne", "mě", "mně", "mi", nil, nil, nil, "mně", "mnou")
elseif base.lemma == "ty" then
noun_add_sg_decl_with_clitic(base, stems, "tebe", "tě", "tobě", "ti", nil, nil, nil, "tobě", "tebou")
elseif base.lemma == "my" then
noun_add_pl_only_decl(base, stems, "nás", "nám", "nás", "nás", "námi")
elseif base.lemma == "vy" then
noun_add_pl_only_decl(base, stems, "vás", "vám", "vás", "vás", "vámi")
elseif base.lemma == "on" or base.lemma == "ono" then
local acc_s = base.lemma == "on" and "jej" or {"jej", "je"}
local clitic_acc_s = base.lemma == "on" and {"jej", "ho"} or {"jej", "ho", "je"}
local prep_acc_s = base.lemma == "on" and "něj" or {"něj", "ně"}
local prep_clitic_acc_s = base.lemma == "on" and "-ň" or nil
noun_add_sg_decl_with_clitic(base, stems, {"jeho", "jej"}, {"ho", "jej"}, "jemu", "mu", acc_s, clitic_acc_s, nil, nil, "jím")
noun_add_sg_decl_with_clitic(base, stems, {"něho", "něj"}, nil, "němu", nil, prep_acc_s, prep_clitic_acc_s, nil, "něm", "ním",
after_prep_footnote)
if base.lemma == "on" then
noun_add_sg_decl_with_clitic(base, stems, nil, nil, nil, nil, "jeho", nil, nil, nil, nil,
animate_footnote)
noun_add_sg_decl_with_clitic(base, stems, nil, nil, nil, nil, "něho", nil, nil, nil, nil,
after_prep_footnote and animate_footnote)
end
elseif base.lemma == "ona" and base.number == "sg" then
noun_add_sg_decl(base, stems, "jí", "jí", "ji", nil, nil, "jí")
noun_add_sg_decl(base, stems, "ní", "ní", "ni", nil, "ní", "ní", after_prep_footnote)
elseif base.lemma == "oni" or base.lemma == "ony" or base.lemma == "ona" then
noun_add_pl_only_decl(base, stems, "jich", "jim", "je", nil, "jimi")
noun_add_pl_only_decl(base, stems, "nich", "nim", "ně", "nich", "nimi", after_prep_footnote)
elseif base.lemma == "sebe" then
-- Underlyingly we handle [[sebe]]'s slots as singular.
noun_add_sg_decl_with_clitic(base, stems, "sebe", "sebe", "sobě", "si", "sebe", "se", nil, "sobě", "sebou",
nil, "no nom_s")
else
error(("Internal error: Unrecognized pronoun lemma '%s'"):format(base.lemma))
end
end
noun_declprops["pron"] = {
desc = "GENDER pronoun",
cat = {},
}
noun_decls["num"] = function(base, stems)
local after_prep_footnote = "PREP"
local colq_note = "x"
local ma_note = "-ma"
if base.lemma == "dva" or base.lemma == "dvě" then
-- in compound numbers; stem is dv-
noun_add_pl_only_decl(base, stems, "ou", "ěma", "-", "ou", "ěma")
elseif base.lemma == "tři" or base.lemma == "čtyři" then
-- stem is without -i
local is_three = base.lemma == "tři"
noun_add_pl_only_decl(base, stems, is_three and "í" or "", "em", "-", "ech", is_three and "emi" or "mi")
noun_add_pl_only_decl(base, stems, "ech", nil, nil, nil, nil, colq_note)
noun_add_pl_only_decl(base, stems, nil, nil, nil, nil, is_three and "ema" or "ma",
ma_note)
elseif base.lemma == "devět" then
noun_add_pl_only_decl(base, "", "devíti", "devíti", "-", "devíti", "devíti", stems.footnotes)
elseif base.lemma == "sta" or base.lemma == "stě" or base.lemma == "set" then
noun_add_pl_only_decl(base, "", "set", "stům", "-", "stech", "sty", stems.footnotes)
elseif find(base.lemma, "[cs]et$") then
-- [[deset]] and all numbers ending in -cet ([[dvacet]], [[třicet]], [[čtyřicet]] and inverted compound
-- numerals such as [[pětadvacet]] "25" and [[dvaatřicet]] "32")
local begin = match(base.lemma, "^(.*)et$")
noun_add_pl_only_decl(base, stems, "i", "i", "-", "i", "i")
noun_add_pl_only_decl(base, begin, "íti", "íti", "-", "íti", "íti", stems.footnotes)
elseif find(base.lemma, "oje$") then
-- [[dvoje]], [[troje]]
-- stem is without -e
noun_add_pl_only_decl(base, stems, "ích", "ím", "-", "ích", "ími")
elseif find(base.lemma, "ery$") then
-- [[čtvery]], [[patery]], [[šestery]], [[sedmery]], [[osmery]], [[devatery]], [[desatery]]
-- stem is without -y
noun_add_pl_only_decl(base, stems, "ých", "ým", "-", "ých", "ými")
else
noun_add_pl_only_decl(base, stems, "i", "i", "-", "i", "i")
end
end
noun_declprops["num"] = {
desc = "GENDER numeral",
cat = {},
}
noun_decls["det"] = function(base, stems)
noun_add_sg_decl(base, stems, "a", "a", "-", nil, "a", "a")
end
noun_declprops["det"] = {
desc = "GENDER determiner",
cat = {},
}
local function merge_clitics(forms)
for form,arr in pairs(forms) do
local noc = match(form, "^clitic_(.*)$")
if noc then
for _,b in ipairs(arr) do
insert(forms[noc], b)
end
forms[form] = nil
end
end
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {lista = true},
["title"] = {},
["ayuda"] = {alias_de = "title"},
["nucleo"] = {lista = true},
["núcleo"] = {alias_de = "nucleo"},
["stem"] = {alias_de = "nucleo"},
["alt"] = {alias_de = "nucleo"},
["number"] = {},
["num"] = {alias_de = "number"},
["núm"] = {alias_de = "number"},
["velar"] = {tipo = "bool", lista = true},
["foreign"] = {tipo = "bool", lista = true},
["c_as_k"] = {tipo = "bool", lista = true},
["collapse_ee"] = {tipo = "bool", lista = true},
["istem"] = {tipo = "bool", lista = true},
["nstem"] = {tipo = "bool", lista = true},
["tstem"] = {tipo = "bool", lista = true},
["hard"] = {tipo = "bool", lista = true},
["soft"] = {tipo = "bool", lista = true},
["mixed"] = {tipo = "bool", lista = true},
["mixedistem"] = {lista = true}, -- no es booleano
["tech"] = {tipo = "bool", lista = true},
["indecl"] = {tipo = "bool", lista = true},
["mostlyindecl"] = {tipo = "bool", lista = true},
["surname"] = {tipo = "bool", lista = true},
["adj"] = {tipo = "bool", lista = true},
-- REVISAR
-- ["pron"] = {tipo = "bool"},
-- ["det"] = {tipo = "bool"},
-- ["num"] = {tipo = "bool"},
["nom_s"] = {lista = true},
["gen_s"] = {lista = true},
["dat_s"] = {lista = true},
["acc_s"] = {lista = true},
["ins_s"] = {lista = true},
["loc_s"] = {lista = true},
["voc_s"] = {lista = true},
["nom_p"] = {lista = true},
["gen_p"] = {lista = true},
["dat_p"] = {lista = true},
["acc_p"] = {lista = true},
["ins_p"] = {lista = true},
["loc_p"] = {lista = true},
["voc_p"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local cats = {}
local palabras, separadores = separar_palabras(title, args["title"])
local args_num = {}
for i,a in ipairs(args) do
args_num[i] = a
end
local L = #palabras
local M = 1
local declinfo, ovinfo
local t
local forms
local enc_decl = {}
for N,p in ipairs(palabras) do
local nargs = {
[1] = args[N],
velar = args.velar[N],
foreign = args.foreign[N],
c_as_k = args.c_as_k[N],
collapse_ee = args.collapse_ee[N],
istem = args.istem[N],
nstem = args.nstem[N],
tstem = args.tstem[N],
soft = args.soft[N],
mixed = args.mixed[N],
mixedistem = args.mixedistem[N],
tech = args.tech[N],
indecl = args.indecl[N],
mostlyindecl = args.mostlyindecl[N],
surname = args.surname[N],
adj = args.adj[N],
nucleo = args.nucleo[N],
number = args.number
}
if args[N] == "num" then
nargs.lemma = p
set_num_defaults(nargs)
else
if find(args[N], "inan") then
nargs.animacy = "inan"
elseif find(args[N], "an") then
nargs.animacy = "an"
end
if find(args[N], "m") then
nargs.gender = "m"
elseif find(args[N], "f") then
nargs.gender = "f"
elseif find(args[N], "n") then
nargs.gender = "n"
end
if find(args[N], "adj") then -- alternativa para indicar que es un adjetivo
nargs.adj = true
end
end
assert(nargs.gender, "especifique el género (m, f, o n)")
if nargs.gender == "m" then
assert(nargs.animacy, "especifique el si es animado o inanimado (an, inan)")
end
if nargs.number then
assert(nargs.number == "sg" or nargs.number == "pl", "Unrecognized value '%s' for 'declnumber', should be 'sg' or 'pl'")
end
nargs.title = p
nargs.lemma = p
nargs.actual_lemma = p
if upper(p) == p then
nargs.all_uppercase = true
end
if nargs.hard then
nargs.hard_c = true
end
nargs.forms = {}
if nargs["nucleo"] then
for a in gsplit(nargs["nucleo"], ";") do
if not nargs.stem_sets then
nargs.stem_sets = {}
end
insert(nargs.stem_sets, {
reducible = find(a, "r") and true or false,
vowelalt = (find(a, "q") and "quant") or (find(a, "e") and "quant-ě" or nil),
oblique_slots = find(a, "g") and "gen_p" or (find(a, "o") and "all-oblique" or "all"),
})
if find(a, "q") then
insert(cats, "CS:Sustantivos con alternancia vocálica")
end
end
end
if args.number == "pl" then
synthesize_singular_lemma(nargs)
end
noun_determine_declension(nargs)
if not nargs.adj then -- preprocesamiento exclusivo de sustantivos
if args[N] == "num" then
determine_numeral_stems(nargs)
else
noun_determine_default_reducible(nargs)
noun_determine_stems(nargs)
end
for _, stems in ipairs(nargs.stem_sets) do
if not noun_decls[nargs.decl] then
error("Internal error: Unrecognized declension type '" .. nargs.decl .. "'")
end
noun_decls[nargs.decl](nargs, stems)
insert(enc_decl, nargs.decl)
end
else
noun_decls["adj"](nargs)
insert(enc_decl, "adj")
end
if not nargs.pron and not nargs.det then
-- Pronouns don't have a vocative (singular or plural).
nargs.forms.voc_p = deepcopy(nargs.forms.nom_p)
end
if not nargs.forms.acc_s then
nargs.forms.acc_s = nargs.animacy == "inan" and deepcopy(nargs.forms.nom_s) or deepcopy(nargs.forms.gen_s)
end
if not nargs.forms.clitic_acc_s then
nargs.forms.clitic_acc_s = nargs.animacy == "inan" and deepcopy(nargs.forms.nom_s) or deepcopy(nargs.forms.clitic_gen_s)
end
if not forms then
forms = nargs.forms
else
forms = combinar_copulativa(forms, nargs.forms, separadores[M])
M = M + 1
end
if L > 1 then
if nargs.gender == "m" then
insert(cats, "CS:Locuciones sustantivas masculinas")
if nargs.animacy == "an" then
insert(cats, "CS:Locuciones sustantivas masculinas animadas")
else
insert(cats, "CS:Locuciones sustantivas masculinas inanimadas")
end
elseif nargs.gender == "f" then
insert(cats, "CS:Locuciones sustantivas femeninas")
else
insert(cats, "CS:Locuciones sustantivas neutras")
end
else
if nargs.gender == "m" then
insert(cats, "CS:Sustantivos masculinos")
if nargs.animacy == "an" then
insert(cats, "CS:Sustantivos masculinos animados")
else
insert(cats, "CS:Sustantivos masculinos inanimados")
end
elseif nargs.gender == "f" then
insert(cats, "CS:Sustantivos femeninos")
else
insert(cats, "CS:Sustantivos neutros")
end
end
end
local noun_labels = {
["nom_s"] = "sg.",
["gen_s"] = "sg.",
["dat_s"] = "sg.",
["acc_s"] = "sg.",
["ins_s"] = "sg.",
["loc_s"] = "sg.",
["voc_s"] = "sg.",
["nom_p"] = "pl.",
["gen_p"] = "pl.",
["dat_p"] = "pl.",
["acc_p"] = "pl.",
["ins_p"] = "pl.",
["loc_p"] = "pl.",
["voc_p"] = "pl.",
}
merge_clitics(forms)
local irr
forms, irr = sobreescribir_formas(forms, args, false, {}, noun_labels)
forms = desactivar_formas(forms,
function (form)
local pl = find(form, "p")
return (args.number == "pl" and not pl) or (args.number == "sg" and pl)
end
)
forms = agregar_enlaces(forms, title)
forms = formatear_formas(forms, noun_labels)
local t = {}
insert(t, {{""}, {"Singular"}, {"Plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_s"], forms["nom_p"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_s"], forms["gen_p"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_s"], forms["dat_p"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_s"], forms["acc_p"]})
insert(t, {{"Locativo", header=true, color=COLOR_H}, forms["loc_s"], forms["loc_p"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, forms["ins_s"], forms["ins_p"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["voc_s"], forms["voc_p"]})
insert(t, {{args["nota"] or "", colspan=3}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''  tipo: "..concat(enc_decl, ", "),
t,
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
["alt"] = {},
["short"] = {tipo = "bool"},
["corto"] = {alias_de = "short"},
["nored"] = {tipo = "bool"},
["noreducible"] = {alias_de = "nored"},
["nom_m"] = {lista = true},
["nom_f"] = {lista = true},
["nom_n"] = {lista = true},
["nom_mp_an"] = {lista = true},
["nom_fp"] = {lista = true},
["nom_np"] = {lista = true},
["gen_mn"] = {lista = true},
["gen_f"] = {lista = true},
["gen_p"] = {lista = true},
["dat_mn"] = {lista = true},
["dat_f"] = {lista = true},
["dat_p"] = {lista = true},
["acc_m_an"] = {lista = true},
["acc_m_in"] = {lista = true},
["acc_f"] = {lista = true},
["acc_n"] = {lista = true},
["acc_mfp"] = {lista = true},
["acc_np"] = {lista = true},
["acc_mp"] = {lista = true},
["acc_fnp"] = {lista = true},
["ins_mn"] = {lista = true},
["ins_f"] = {lista = true},
["ins_p"] = {lista = true},
["loc_mn"] = {lista = true},
["loc_f"] = {lista = true},
["loc_p"] = {lista = true},
["short_m"] = {lista = true},
["short_f"] = {lista = true},
["short_n"] = {lista = true},
["short_mp_an"] = {lista = true},
["short_fp"] = {lista = true},
["short_np"] = {lista = true},
["nota"] = {},
["n"] = {alias_de = "nota"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(not find(title, " "), "locuciones no soportadas aún") -- REVISAR
if args.number then
assert(args.number == "sg" or args.number == "pl", "Unrecognized value '%s' for 'declnumber', should be 'sg' or 'pl'")
end
args.lemma = title
args.actual_lemma = title
args.declnumber = args.number
if upper(title) == title then
args.all_uppercase = true
end
if args[1] and find(args[1], "^irr") then
args.decl = "irreg"
else
args.decl = "normal"
end
-- synthesize_adj_lemma(args) REVISAR: parece que esta función solo aplica para sustantivos que se declinan como adjetivos!
if args.short then
local stem = match(args.lemma, "^(.*)ý$")
assert(stem, "Short forms can only be specified for lemmas ending in -ý, but saw '" .. args.lemma .. "'")
args.short = {{
base = {
args.nored and dereduce(args, stem) or stem,
},
stem = {
args.nored and dereduce(args, stem) or stem,
}
}}
end
args.forms = {}
adj_decls[args.decl](args)
adj_fill_decls(args)
local adj_labels = {
["nom_m"] = "m.",
["nom_f"] = "f.",
["nom_n"] = "n.",
["nom_mp_an"] = "m. an.",
["nom_fp"] = "m. inan./f.",
["nom_np"] = "n.",
["gen_mn"] = "m./n.",
["gen_f"] = "f.",
["gen_p"] = "m./f./n.",
["dat_mn"] = "m./n.",
["dat_f"] = "f.",
["dat_p"] = "m./f./n.",
["acc_m_an"] = "m. an.",
["acc_m_in"] = "m. inan.",
["acc_f"] = "f.",
["acc_n"] = "n.",
["acc_mfp"] = "m./f.",
["acc_np"] = "n.",
["acc_mp"] = "m.",
["acc_fnp"] = "f./n.",
["ins_mn"] = "m./n.",
["ins_f"] = "f.",
["ins_p"] = "p.",
["loc_mn"] = "m./n.",
["loc_f"] = "f.",
["loc_p"] = "p.",
["short_m"] = "m.",
["short_f"] = "f.",
["short_n"] = "n.",
["short_mp_an"] = "m. an.",
["short_fp"] = "m. inan./f.",
["short_np"] = "n.",
}
merge_clitics(args.forms)
args.forms["short_m"] = args.forms["short_m"] or {}
args.forms["short_fp"] = args.forms["short_fp"] or {}
local forms, irr = sobreescribir_formas(args.forms, args)
forms = desactivar_formas(forms,
function (form)
local pl = find(form, "p")
return (args.number == "pl" and not pl) or (args.number == "sg" and pl)
end
)
forms = agregar_enlaces(forms, title)
forms = formatear_formas(forms, adj_labels)
local cats = {}
if args.decl == "normal" then
insert(cats, "CS:Adjetivos regulares")
else
insert(cats, "CS:Adjetivos irregulares")
end
if args.short then
insert(cats, "CS:Adjetivos con forma corta")
end
forms["nom_m"].colspan = 2
forms["gen_mn"].colspan = 2
forms["dat_mn"].colspan = 2
forms["loc_mn"].colspan = 2
forms["ins_mn"].colspan = 2
forms["short_m"].colspan = 2
forms["nom_fp"].colspan = 2
forms["gen_p"].colspan = 4
forms["dat_p"].colspan = 4
forms["acc_mfp"].colspan = 3
forms["loc_p"].colspan = 4
forms["ins_p"].colspan = 4
forms["short_fp"].colspan = 2
local t = {}
insert(t, {{"Singular", colspan=5}, header=true, color=COLOR_H})
insert(t, {{""}, {"Masc. animado"}, {"Masc. inanimado"}, {"Femenino"}, {"Neutro"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_m"], forms["nom_f"], forms["nom_n"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_mn"], forms["gen_f"], forms["gen_mn"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_mn"], forms["dat_f"], forms["dat_mn"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_m_an"], forms["acc_m_in"], forms["acc_f"], forms["acc_n"]})
insert(t, {{"Locativo", header=true, color=COLOR_H}, forms["loc_mn"], forms["loc_f"], forms["loc_mn"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, forms["ins_mn"], forms["ins_f"], forms["ins_mn"]})
if args.short then
insert(t, {{"Corto", header=true, color=COLOR_H}, forms["short_m"], forms["short_f"], forms["short_n"]})
end
insert(t, {{"Plural", colspan=5, header=true, color=COLOR_H}})
insert(t, {{""}, {"Masc. animado"}, {"Masc. inanimado"}, {"Femenino"}, {"Neutro"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_mp_an"], forms["nom_fp"], forms["nom_np"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_p"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_p"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_mfp"], forms["acc_np"]})
insert(t, {{"Locativo", header=true, color=COLOR_H}, forms["loc_p"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, forms["ins_p"]})
if args.short then
insert(t, {{"Corto", header=true, color=COLOR_H}, forms["short_mp_an"], forms["short_fp"], forms["short_np"]})
end
insert(t, {{args["nota"] or "", colspan=5}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''  tipo: "..(args.decl == "normal" and "normal" or "irregular"),
t,
ns == 0 and cats or {}
)
end
return export
j2g77xlfih3dwzxxat5l00pd1a7y2hj
Módulo:flex/eo
828
1059240
6307326
6118169
2026-08-06T00:34:06Z
TMCbot
164594
.
6307326
Scribunto
text/plain
-- Módulo para flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local find = m_str.find
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local agregar_enlaces = m_flex.agregar_enlaces
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local LETRA = "%S"
local ESPACIO = "%s"
local guion = "%-"
function export.flexionar_palabra(p)
if find(p, "^[aeiou]$") or find(p, "^[bcĉdfgĝhĥjĵklmnprsŝtŭvz]o$") then
return {s={p}, p={p.."~-oj~"}, acc={p.."~-on~"}, accp={p.."~-ojn~"}}
end
return {s={p}, p={p.."~j~"}, acc={p.."~n~"}, accp={p.."~jn~"}}
end
local function flexion_sust_adj(palabras, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = export.flexionar_palabra(a)
local flex2 = copulativa and export.flexionar_palabra(b) or {s={b}, p={b}, acc={b}, accp={b}}
local flex = combinar_copulativa(flex1, flex2, separador)
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = export.flexionar_palabra(p)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.acc[1] and not flex.accp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
flex.accp = {}
elseif modo and sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
flex.accp = {}
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p},
{"acusativo", flex.acc},
{"acusativo plural", flex.accp},
{"comparativo", args["comp"]},
{"superlativo", args["sup"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
[3] = {alias_de = "acc"},
[4] = {alias_de = "accp"},
["alt"] = {},
["nota"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nomp"] = {alias_de = "p"},
["acc"] = {lista = true},
["accs"] = {alias_de = "acc"},
["accp"] = {lista = true},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "EO:Locuciones sustantivas" or "EO:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
[3] = {alias_de = "acc"},
[4] = {alias_de = "accp"},
["alt"] = {},
["nota"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nomp"] = {alias_de = "p"},
["acc"] = {lista = true},
["accs"] = {alias_de = "acc"},
["accp"] = {lista = true},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "EO:Locuciones adjetivas" or "EO:Adjetivos")
end
local formas = {
inf = "i",
imper = "u",
cond = "us",
pers = "s",
part_pas = "ta",
part_act = "nta",
part_nom_pas = "to",
part_nom_act = "nto",
part_adv_pas = "te",
part_adv_act = "nte",
}
local formas_con_tiempo = {
pers = true,
part_pas = true,
part_act = true,
part_nom_pas = true,
part_nom_act = true,
part_adv_pas = true,
part_adv_act = true,
}
local formas_con_flexion = {
part_pas = true,
part_act = true,
part_nom_pas = true,
part_nom_act = true,
}
local tiempos = {
pres = "a",
pret = "i",
fut = "o",
}
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
tr = {tipo="bool"},
transitivo = {alias_de="tr"},
nota = {}
}
local v = title
if find(v, ESPACIO) then
error("Locuciones no implementadas aún")
end
local r = match(v, "^(.*)i$")
assert(r, "Forma canónica no reconocida")
local conjugado = {}
for forma, sufijo in pairs(formas) do
if formas_con_tiempo[forma] then
for tiempo, infijo in pairs(tiempos) do
conjugado[forma.."_"..tiempo] = {r..infijo..sufijo}
params[forma.."_"..tiempo] = {tipo=parsear_arreglo, por_defecto={}}
if formas_con_flexion[forma] then
conjugado[forma.."_"..tiempo][2] = r..infijo..sufijo.."j"
conjugado[forma.."_"..tiempo][3] = r..infijo..sufijo.."n"
conjugado[forma.."_"..tiempo][4] = r..infijo..sufijo.."jn"
end
end
else
conjugado[forma] = {r..sufijo}
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
end
end
local args = require("Módulo:parámetros").obtener_parametros(frame:getParent().args, params)
local res, irr = sobreescribir_formas(conjugado, args)
local def = comprobar_defectivo(res, {}, {})
res = agregar_enlaces(res, title)
res = formatear_formas(res, function (x)
if x:find("pres") then
return "pres."
end
if x:find("pret") then
return "pret."
end
if x:find("fut") then
return "fut."
end
return nil
end)
res.inf.colspan = 3
res.cond.colspan = 3
res.imper.colspan = 3
local t = {}
insert(t, {{"Infinitivo", header=true, color=COLOR_H}, res.inf})
insert(t, {{"Condicional", header=true, color=COLOR_H}, res.cond})
insert(t, {{"Imperativo", header=true, color=COLOR_H}, res.imper})
insert(t, {{""}, {"Presente"}, {"Pretérito"}, {"Futuro"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Personal", header=true, color=COLOR_H}, res.pers_pres, res.pers_pret, res.pers_fut})
insert(t, {{"Part. activo", header=true, color=COLOR_H}, res.part_act_pres, res.part_act_pret, res.part_act_fut})
insert(t, {{"Part. activo nominal", header=true, color=COLOR_H}, res.part_nom_act_pres, res.part_nom_act_pret, res.part_nom_act_fut})
insert(t, {{"Part. activo adverbial", header=true, color=COLOR_H}, res.part_adv_act_pres, res.part_adv_act_pret, res.part_adv_act_fut})
if args.tr then
insert(t, {{"Part. pasivo", header=true, color=COLOR_H}, res.part_pas_pres, res.part_pas_pret, res.part_pas_fut})
insert(t, {{"Part. pasivo nominal", header=true, color=COLOR_H}, res.part_nom_pas_pres, res.part_nom_pas_pret, res.part_nom_pas_fut})
insert(t, {{"Part. pasivo adverbial", header=true, color=COLOR_H}, res.part_adv_pas_pres, res.part_adv_pas_pret, res.part_adv_pas_fut})
end
insert(t, {{args.nota or "", colspan=4}})
local cats = {}
if irr then
insert(cats, "EO:Verbos irregulares")
end
if def then
insert(cats, "EO:Verbos defectivos")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..title.."'''''  ("..(irr and "irregular" or "regular")..")",
t,
ns == 0 and cats or {})
end
return export
hqsinvx2y4vr8mc6te5i8da7vkqz2rl
Módulo:flex/ro
828
1059290
6307344
6294119
2026-08-06T00:34:37Z
TMCbot
164594
.
6307344
Scribunto
text/plain
-- Flexión para el rumano
-- Reciclado de en.wikt por Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local sort = table.sort
local min = math.min
local max = math.max
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local len = m_str.len
local sub = m_str.sub
local split = m_str.split
local tsub = function(t, i, j)
local res = deepcopy(t)
if type(res) == "string" then
res = {res}
end
for k, form in ipairs(res) do
res[k] = sub(form, i, j)
end
return res
end
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local vocal = "aăâeêĕiîĭoôŏuûŭyAĂÂEĔÊIĬÎOŎÔUŬÛY"
local vowels = vocal
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "[^"..vocal..espacios.."]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local adj_lb = {
na_indef_sg_m = "m./n. sg.",
na_indef_sg_f = "f. sg.",
na_indef_pl_m = "m./n. pl.",
na_indef_pl_f = "f. pl.",
na_def_sg_m = "m./n. sg.",
na_def_sg_f = "f. sg.",
na_def_pl_m = "m./n. pl.",
na_def_pl_f = "f. pl.",
gd_indef_sg_m = "m. sg.",
gd_indef_sg_f = "f./n. sg.",
gd_indef_pl_m = "m. pl.",
gd_indef_pl_f = "f./n. pl.",
gd_def_sg_m = "m. sg.",
gd_def_sg_f = "f./n. sg.",
gd_def_pl_m = "m. pl.",
gd_def_pl_f = "f./n. pl.",
}
local sust_lb = {
na_indef_sg = "sg.",
na_indef_pl = "pl.",
na_def_sg = "sg.",
na_def_pl = "pl.",
gd_indef_sg = "sg.",
gd_indef_pl = "pl.",
gd_def_sg = "sg.",
gd_def_pl = "pl.",
voc_sg = "sg.",
voc_pl = "pl."
}
local consonants = {
i = {
str = 'ștr';
st = 'șt';
sc = 'șt';
d = 'z';
s = 'ș';
t = 'ț';
x = 'cș';
},
e = {
sc = 'șt';
}
}
-- these adjectives have different defaults
local endings = {
{pattern = "([stz])or$", fs = "%1oare", mp = "%1ori", fp = "%1oare"},
{pattern = "os$", fs = "oasă", mp = "oși", fp = "oase"},
{pattern = "iesc$", fs = "iască", mp = "iești", fp = "iești"},
{pattern = "esc$", fs = "ească", mp = "ești", fp = "ești"},
{pattern = "([iy])an$", fs = "%1ană", mp = "%1eni", fp = "%1ene"},
{pattern = "ean$", fs = "eană", mp = "eni", fp = "ene"},
{pattern = "eț$", fs = "eață", mp = "eți", fp = "ețe"},
{pattern = "iu$", fs = "ie", mp = "ii", fp = "ii"},
}
local function make_na_def_sg(word, gender)
local definite
if gender == "m" or gender == "n" then
if find(word, "u$") then
definite = word .. "l"
elseif find(word, "e$") then
definite = word .. "le"
else
definite = word .. "ul"
end
elseif gender == "f" then
if find(word, "ă$") then
definite = gsub(word, "ă$", "a")
elseif find(word, "[aeiouăâî]ie") then
definite = gsub(word, "e$", "a")
elseif find(word, "ie$") then
definite = gsub(word, "e$", "a")
elseif find(word, "e$") then
definite = word .. "a"
elseif find(word, "a$") then
definite = word .. "ua"
end
else
error("Invalid or missing gender")
end
return definite
end
local function make_na_indef_sg_f(word)
local f
if find(word, "e$") then
f = word
elseif find(word, "[aăâiîeou]i$") then
f = word .. "e"
elseif find(word, "iu$") then
f = gsub(word, "u$", "e")
elseif find(word, "u$") then
f = sub(word, 1, -2) .. "ă"
elseif find(word, "[cg]h?i$") then
f = sub(word, 1, -2) .. "e"
elseif find(word, "[^aioăâî]$") then
f = word .. "ă"
else
error("Feminine of \"" .. word .. "\" could not be generated automatically")
end
if f then
f = gsub(f, "([âei])ă$", "%1e")
end
return f
end
local function split_stem(word)
local stem, cons
stem, cons = match(word, '^(.-[aeiouăâî])([iu])$')
if cons then
return stem, cons
end
stem, cons = match(word, '^(.-[aeiouăâî]-)([bcdfghj-np-tv-zșț]-)$')
return stem, cons
end
local function find_cons(cons, mode)
for i = -3, -1 do
if consonants[mode][sub(cons, i)] and not match(sub(cons, 1, i-1), "^[șj]$") then
cons = sub(cons, 1, i-1) .. consonants[mode][sub(cons, i)]
break
end
end
return cons
end
local function adj_make_na_indef_pl(word, g)
local pl
local suf1, suf2, pre1 = sub(word, -1), sub(word, -2), sub(word, 1, -2)
if g == 'm' then
if suf1 == 'i' then
pl = word
else
local stem, cons = split_stem(match(word, '^(.-)[eu]?$'))
cons = find_cons(cons, 'i')
pl = stem .. cons .. 'i'
end
elseif g == 'f' then
if suf1 == 'a' then
if suf2 == 'ea' then
pl = pre1 .. 'le'
elseif suf2 == 'ia' then
pl = pre1 .. 'ele'
else
pl = word .. 'le'
end
else
if suf1 == 'e' then
pl = word
elseif suf1 == 'ă' then
local stem, cons = split_stem(match(word, '^(.-)ă$'))
cons = find_cons(cons, 'e')
pl = stem .. cons .. 'e'
end
end
end
return pl
end
local function noun_make_na_indef_pl(word, g)
local pl
local suf1, suf2, pre1 = sub(word, -1), sub(word, -2), sub(word, 1, -2)
local suf4 = sub(word, -4)
if g == 'm' then
if suf1 == 'i' then
pl = word
else
local stem, cons = split_stem(match(word, '^(.-)[eu]?$'))
cons = find_cons(cons, 'i')
pl = stem .. cons .. 'i'
end
elseif g == 'f' then
if suf4 == "tate" then
pl = sub(word, 1, -5).."tăți"
elseif suf1 == 'a' then
if suf2 == 'ea' then -- revisar: existe este sufijo en sustantivos tmb?
pl = pre1 .. 'le'
elseif suf2 == 'ia' then -- revisar: existe este sufijo en sustantivos tmb?
pl = pre1 .. 'ele'
elseif suf2 == "ie" then
pl = pre1
else
pl = word .. 'le' -- revisar: existe este sufijo en sustantivos tmb?
end
else
if suf1 == 'e' then
pl = pre1..'i'
elseif suf1 == 'ă' then
local stem, cons = split_stem(match(word, '^(.-)ă$'))
cons = find_cons(cons, 'e')
pl = stem .. cons .. 'e'
end
end
elseif g == 'n' then
pl = find(word, "e$") and word or word.."e"
end
assert(pl)
return pl
end
local form_names = {
"na_indef_sg_m",
"na_indef_sg_f",
"na_indef_pl_m",
"na_indef_pl_f",
"na_def_sg_m",
"na_def_sg_f",
"na_def_pl_m",
"na_def_pl_f",
"gd_indef_sg_m",
"gd_indef_sg_f",
"gd_indef_pl_m",
"gd_indef_pl_f",
"gd_def_sg_m",
"gd_def_sg_f",
"gd_def_pl_m",
"gd_def_pl_f",
}
local function fun(arr, f)
if type(arr) == "string" then
return f(arr)
end
local arr2 = {}
for _,a in ipairs(arr) do
insert(arr2, f(a))
end
return arr2
end
local function decl_adj(p, imode, det, fs, mp, fp)
local flex = {}
flex.na_indef_sg_m = p
if #fs > 0 then
flex.na_indef_sg_f = fs
end
if #mp > 0 then
flex.na_indef_pl_m = mp
end
if #fp > 0 then
flex.na_indef_pl_f = fp
end
for _,info in ipairs(endings) do
if find(p, info.pattern) then
flex.na_indef_sg_f = flex.na_indef_sg_f or gsub(p, info.pattern, info.fs)
flex.na_indef_pl_m = flex.na_indef_pl_m or gsub(p, info.pattern, info.mp)
flex.na_indef_pl_f = flex.na_indef_pl_f or gsub(p, info.pattern, info.fp)
break
end
end
flex.na_indef_sg_f = flex.na_indef_sg_f or make_na_indef_sg_f(p)
flex.na_indef_pl_m = flex.na_indef_pl_m or adj_make_na_indef_pl(p, "m")
flex.na_indef_pl_f = flex.na_indef_pl_f or (imode and flex.na_indef_pl_m or adj_make_na_indef_pl(type(flex.na_indef_sg_f) == "table" and flex.na_indef_sg_f[1] or flex.na_indef_sg_f, "f"))
if det then
flex.gd_indef_sg_m = match(p, "^(.*)[eu]?$").."ui"
flex.gd_indef_sg_f = match(p, "^(.*)[eu]?$").."ei"
flex.gd_indef_pl_m = match(p, "^(.*)[eu]?$").."or"
flex.gd_indef_pl_f = flex.gd_indef_pl_m
flex.na_def_sg_m = {}
flex.na_def_sg_f = {}
flex.na_def_pl_m = {}
flex.na_def_pl_f = {}
flex.gd_def_sg_m = {}
flex.gd_def_sg_f = {}
flex.gd_def_pl_m = {}
flex.gd_def_pl_f = {}
else
flex.gd_indef_sg_m = flex.na_indef_sg_m
flex.gd_indef_sg_f = flex.na_indef_pl_f
flex.gd_indef_pl_m = flex.na_indef_pl_m
flex.gd_indef_pl_f = flex.na_indef_pl_f
flex.na_def_sg_m = make_na_def_sg(p, "m")
flex.na_def_sg_f = fun(flex.na_indef_sg_f, function (x)
return make_na_def_sg(x, "f")
end)
flex.na_def_pl_m = fun(flex.na_indef_pl_m, function (x)
return x.."i"
end)
flex.na_def_pl_f = fun(flex.na_indef_pl_f, function (x)
return x.."le"
end)
flex.gd_def_sg_m = fun(flex.na_def_sg_m, function (x)
return find(x, "e$") and sub(x, 1, -2).."ui" or x.."ui"
end)
if type(flex.na_indef_sg_f) == "string" then
flex.na_indef_sg_f = {flex.na_indef_sg_f}
end
if type(flex.na_indef_pl_f) == "string" then
flex.na_indef_pl_f = {flex.na_indef_pl_f}
end
flex.gd_def_sg_f = {}
for i=1, min(#flex.na_indef_sg_f, #flex.na_indef_pl_f) do
insert_if_not(flex.gd_def_sg_f, find(flex.na_indef_pl_f[i], "[^aăâeiîou]ii$") and flex.na_indef_sg_f[i].."i" or flex.na_indef_pl_f[i].."i")
end
flex.gd_def_pl_m = fun(flex.na_indef_pl_m, function (x)
return x.."lor"
end)
flex.gd_def_pl_f = fun(flex.na_indef_pl_f, function (x)
return x.."lor"
end)
end
return flex
end
local function decl_sust(p, g, pl)
local flex = {}
flex.na_indef_sg = p
flex.na_indef_pl = #pl > 0 and pl or noun_make_na_indef_pl(p, g)
if g == "m" or g == "n" then
flex.gd_indef_sg = flex.na_indef_sg
flex.gd_indef_pl = flex.na_indef_pl
else
flex.gd_indef_sg = flex.na_indef_pl
flex.gd_indef_pl = flex.na_indef_pl
end
flex.na_def_sg = make_na_def_sg(p, g)
if g == "m" then
flex.na_def_pl = fun(flex.na_indef_pl, function (x)
return x.."i"
end)
else
flex.na_def_pl = fun(flex.na_indef_pl, function (x)
return x.."le"
end)
end
if g == "m" or g == "n" then
flex.gd_def_sg = fun(flex.na_def_sg, function (x)
return find(x, "e$") and sub(x, 1, -2).."ui" or x.."ui"
end)
else
if type(flex.na_indef_sg) == "string" then
flex.na_indef_sg = {flex.na_indef_sg}
end
if type(flex.na_indef_pl) == "string" then
flex.na_indef_pl = {flex.na_indef_pl}
end
flex.gd_def_sg = {}
for i=1, min(#flex.na_indef_sg, #flex.na_indef_pl) do
insert_if_not(flex.gd_def_sg, find(flex.na_indef_pl[i], "[^aăâeiîou]ii$") and flex.na_indef_sg[i].."i" or flex.na_indef_pl[i].."i")
end
end
flex.gd_def_pl = fun(flex.na_indef_pl, function (x)
return x.."lor"
end)
if g == "m" or g == "n" then
flex.voc_sg = find(p, "e$") and {p} or (find(p, "u$") and {p.."le"} or {p.."ule"})
else
if find(p, "ie$") then
flex.voc_sg = {p, gsub1(p, "e$", "o")}
elseif find(p, "ă$") then
flex.voc_sg = {p, gsub1(p, "ă$", "o")}
elseif find(p, "a$") then
flex.voc_sg = {p}
else
flex.voc_sg = {p, p.."o"}
end
end
flex.voc_pl = flex.gd_def_pl
return flex
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {por_defecto=""},
["ayuda"] = {por_defecto=title},
["title"] = {alias_de="ayuda"},
["i"] = {tipo="bool"},
["num"] = {por_defecto=""},
["núm"] = {alias_de="num"},
["def"] = {por_defecto=""},
["nota"] = {},
}
for form,_ in pairs(adj_lb) do
params[form] = {lista=true}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if find(args["ayuda"], "%s") then
error("locuciones no soportadas")
end
local decl = {}
local cats = {}
local enc = "regular"
local irr
local defect
local sg = find(args["num"], "s")
local pl = find(args["num"], "p")
local def = find(args["def"], "^def")
local indef = find(args["def"], "indef")
if find(args[1], "^in") then
for form,_ in pairs(adj_lb) do
decl[form] = {args["ayuda"]}
end
enc = "invariable"
insert(cats, "RO:Adjetivos invariables")
else
decl = decl_adj(args["ayuda"], args.i, find(args[1], "det"), args.na_indef_sg_f, args.na_indef_pl_m, args.na_indef_pl_f)
decl, irr = sobreescribir_formas(decl, args, false, {})
if irr then
enc = "irregular"
insert(cats, "RO:Adjetivos irregulares")
else
insert(cats, "RO:Adjetivos regulares")
end
local defect2 = comprobar_defectivo(decl)
if defect2 then
insert(cats, "RO:Adjetivos defectivos")
end
decl, defect = desactivar_formas(decl, function (x)
return (find(x, "pl") and sg) or (find(x, "sg") and pl) or (find(x, "_def") and indef) or (find(x, "indef") and def)
end)
if defect then
insert(cats, "RO:Adjetivos defectivos")
end
end
decl = agregar_enlaces(decl, title)
decl = formatear_formas(decl, adj_lb)
local t = {}
insert(t, {{""}, {"Masculino/neutro singular"}, {"Masculino/neutro plural"}, {"Femenino singular"}, {"Femenino plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nom./acc. indefinido", header=true, color=COLOR_H}, decl.na_indef_sg_m, decl.na_indef_pl_m, decl.na_indef_sg_f, decl.na_indef_pl_f})
insert(t, {{"Nom./acc. definido", header=true, color=COLOR_H}, decl.na_def_sg_m, decl.na_def_pl_m, decl.na_def_sg_f, decl.na_def_pl_f})
insert(t, {{""}, {"Masculino singular"}, {"Masculino plural"}, {"Femenino/neutro singular"}, {"Femenino/neutro plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Gen./dat. indefinido", header=true, color=COLOR_H}, decl.gd_indef_sg_m, decl.gd_indef_pl_m, decl.gd_indef_sg_f, decl.gd_indef_pl_f})
insert(t, {{"Gen./dat. definido", header=true, color=COLOR_H}, decl.gd_def_sg_m, decl.gd_def_pl_m, decl.gd_def_sg_f, decl.gd_def_pl_f})
insert(t, args.nota)
return renderizar_tabla(
frame,
"'''Declinación de ''"..args["ayuda"].."'''''  ("..enc..")",
t,
cats
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
["ayuda"] = {por_defecto=title},
["title"] = {alias_de="ayuda"},
["i"] = {tipo="bool"},
["num"] = {por_defecto=""},
["núm"] = {alias_de="num"},
["def"] = {por_defecto=""},
["nota"] = {},
}
for form,_ in pairs(sust_lb) do
params[form] = {lista=true}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if find(title, "%s") then
error("locuciones no soportadas")
end
assert(args[1], "especifique el género en el primer parámetro")
local decl = {}
local cats = {}
local enc = "regular"
local irr
local defect
local sg = find(args["num"], "s")
local pl = find(args["num"], "p")
local def = find(args["def"], "^def")
local indef = find(args["def"], "indef")
if find(args[1], "^in") then
for form,_ in pairs(sust_lb) do
decl[form] = args["ayuda"]
end
enc = "invariable"
insert(cats, "RO:Sustantivos invariables")
else
decl = decl_sust(args["ayuda"], args[1], args.na_indef_pl)
decl, irr = sobreescribir_formas(decl, args, false, {})
if irr then
enc = "irregular"
insert(cats, "RO:Sustantivos irregulares")
else
insert(cats, "RO:Sustantivos regulares")
end
local defect2 = comprobar_defectivo(decl)
if defect2 then
insert(cats, "RO:Adjetivos defectivos")
end
decl, defect = desactivar_formas(decl, function (x)
return (find(x, "pl") and sg) or (find(x, "sg") and pl) or (find(x, "_def") and indef) or (find(x, "indef") and def)
end)
if defect then
insert(cats, "RO:Sustantivos defectivos")
end
end
decl = agregar_enlaces(decl, title)
decl = formatear_formas(decl, sust_lb)
local t = {}
insert(t, {{""}, {"Singular"}, {"Plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nom./acc. indefinido", header=true, color=COLOR_H}, decl.na_indef_sg, decl.na_indef_pl})
insert(t, {{"Gen./dat. indefinido", header=true, color=COLOR_H}, decl.gd_indef_sg, decl.gd_indef_pl})
insert(t, {{"Nom./acc. definido", header=true, color=COLOR_H}, decl.na_def_sg, decl.na_def_pl})
insert(t, {{"Gen./dat. definido", header=true, color=COLOR_H}, decl.gd_def_sg, decl.gd_def_pl})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, decl.voc_sg, decl.voc_pl})
insert(t, args.nota)
return renderizar_tabla(
frame,
"'''Declinación de ''"..args["ayuda"].."'''''  ("..enc..")",
t,
cats
)
end
local EU, TU, EL, NOI, VOI, EI = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"eu, io", "tu", "el, ea", "noi", "voi", "ei, ele"}
local PRONOMBRES_IMP = {"-", "(tu)", "-", "-", "(voi)", "-"}
local IMPERSONALES = {"", "", "(ăsta)", "", "", "(astea)"}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers and impers ~= "" then
return IMPERSONALES[p]
else
if find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local formas_no_personales = {
["ger"] = true,
["part"] = true,
["inf"] = true,
}
local formas_personales = {
["pres"] = true,
["imp"] = true,
["perf"] = true,
["pluperf"] = true,
["imper"] = true,
}
local formas = merge(formas_no_personales, formas_personales)
local consonants_verb = {
["i_"] = {
{"[sș][ct]$", "șt"},
{"^d$", "z"},
{"^t$", "ț"},
{"([^șj])d$", "%1z"},
{"([^șj])t$", "%1ț"},
{"s$", "ș"},
{"x$", "cș"},
},
["i"] = {
{"[sș]c$", "șt"},
{"x$", "cș"},
},
["e"] = {
{"[sș]c$", "șt"},
},
}
local consonants_23_verb = {
["i_"] = {
{"^n$", ""},
},
["u"] = {
{"^d$", "z"},
},
["â"] = {
{"d$", "z"},
-- {"t$", "ț"}, -- inconsistent
}
}
-- stressed stems for null, ă, e and i endings
-- the given stems should not include the unstressed stem (unless it happens to
-- coincide with one of the other forms)
local vow_changes = {
-- sort order: aeiouâîă
["a-e"] = { -- zbiera/așeza, a variant of e-ea below
["-"] = "e",
["ă"] = "a",
["e"] = "e",
["i"] = "e",
},
["a-e-ă"] = { -- spăla
["-"] = "ă",
["ă"] = "a",
["e"] = "e",
["i"] = "e",
},
["a-ă"] = { -- arăta
["-"] = "ă",
["ă"] = "a",
["e"] = "a",
["i"] = "ă",
},
["e-ea"] = { -- încerca
["-"] = "e",
["ă"] = "ea",
["e"] = "e",
["i"] = "e",
},
["e-ea-2"] = { -- lepăda
["-"] = {"e", "ea"},
["ă"] = "ea",
["e"] = "e",
["i"] = "e",
},
["e-ă"] = { -- supăra
["-"] = "ă",
["ă"] = "ă",
["e"] = "e",
["i"] = "e",
},
["i-â"] = { -- vinde (might be the only one)
["-"] = "â",
["ă"] = "â",
["e"] = "i",
["i"] = "i",
},
["o-oa"] = { -- toca
["-"] = "o",
["ă"] = "oa",
["e"] = "oa",
["i"] = "o",
},
}
local segunda_conjugacion = {
"avea$",
"^bea$",
"cădea$",
"căpea$",
"durea$",
"mânea$",
"părea$",
"plăcea$",
"putea$",
"ședea$",
"tăcea$",
"ținea$",
"vedea$",
"vrea$",
"zăcea$",
"zbea$"
}
-- format: conj = {lemma, stems, stem}
local template_defaults = {
["a"] = {"aduna"},
["a-ez"] = {"lucra"},
["i"] = {"dormi", "dorm/doarm"},
["i-esc"] = {"munci"},
["î"] = {"coborî", "cobor/coboar"},
["î-ăsc"] = {"hotărî"},
["e-s"] = {"ajunge"},
["e-t"] = {"sparge", "sparg", "spărg"},
["e-pt"] = {"rupe"},
["e-ut"] = {"trece", "trec/treac"},
["ea-ut"] = {"cădea", "cad"},
}
local function split_svc(word)
local stem, vow, cons
if match(word, "[" .. vowels .. "][iu]$") then
stem, vow, cons = match(word, "^(.-)([" .. vowels .. "]-)([iu])$")
else
stem, vow, cons = match(word, "^(.-)([" .. vowels .. "]-)([^" .. vowels .. "]-)$")
end
return stem, vow, cons
end
local function split_vow(vow)
local pre, post = "", ""
if len(vow) > 1 then
pre, vow, post = match(vow, "^([iu]?)(.-)([iu]?)$")
end
return pre, vow, post
end
-- todo: somehow account for hiatus (deochea)
local function get_vow_changes(words, result)
local all_dupes = true
for _, val in ipairs(words) do
if val ~= words[1] then
all_dupes = false
break
end
end
if all_dupes then
insert(result, words[1])
return
else
local split_words = {}
for _, val in ipairs(words) do
if val == "" then
error("Cannot match stems, should only have different vowels")
end
local stem, pre, vow, post, cons
local res = {}
stem, vow, cons = split_svc(val)
pre, vow, post = split_vow(vow)
insert(res, stem)
insert(res, pre)
insert(res, vow)
insert(res, post)
insert(res, cons)
insert(split_words, res)
end
local vowel_appearances, found_vowels = {}, {}
for i, val in ipairs(split_words) do
-- compare pre-vowel, post-vowel, cons
if val[5] ~= split_words[1][5] then
error("Stems differ in something other than main vowels: "
.. words[1] .. ", " .. words[i] .. ", "
.. (val[5] or "fjdfl") .. ", " .. (split_words[1][5] or " fda"))
end
if val[4] ~= split_words[1][4] then
error("Stems differ in something other than main vowels: "
.. words[1] .. ", " .. words[i] .. ", "
.. val[4] .. ", " .. split_words[1][4])
end
if val[2] ~= split_words[1][2] then
error("Stems differ in something other than main vowels: "
.. words[1] .. ", " .. words[i] .. ", "
.. val[2] .. ", " .. split_words[1][2])
end
-- add the vowel
vowel_appearances[val[3]] = true
end
for vow, _ in pairs(vowel_appearances) do
insert(found_vowels, vow)
end
sort(found_vowels)
-- replace words with stems
for key, _ in ipairs(words) do
words[key] = split_words[key][1]
end
get_vow_changes(words, result)
-- join pre-vowel to last consonant
result[#result] = result[#result] .. split_words[1][2]
-- add all the vowel variations
insert(result, concat(found_vowels, "-"))
-- add post-vowel + last cons
insert(result, split_words[1][4] .. split_words[1][5])
return
end
end
-- given a comma-separated list of slash-separated lists of stems
-- get a list of stems for each ending
local function get_stems(stems, inf_stem)
local stem_types = {"-", "ă", "e", "i"}
local res = {}
for _, stype in ipairs(stem_types) do
res[stype] = {}
end
if not stems then
local stem = inf_stem
for _, val in ipairs(stem_types) do
res[val] = stem
end
else
local stem_lists = split(stems, " *; *")
for _, stem_set in ipairs(stem_lists) do
-- make a new resi table to hold all the stems
local resi = {}
local stems2, stem_parts = split(stem_set, " */ *"), {}
get_vow_changes(stems2, stem_parts)
for _, stype in ipairs(stem_types) do
resi[stype] = {""}
for i = 1, #stem_parts, 2 do
for j, _ in ipairs(resi[stype]) do
resi[stype][j] = resi[stype][j] .. stem_parts[i]
end
-- which syllable this is, counting from the end
local syln = (#stem_parts - i) / 2
if stem_parts[i + 1] then
local vc = vow_changes[stem_parts[i + 1] .. "-" .. syln]
or vow_changes[stem_parts[i + 1]]
if not vc then
-- no vowel alternation found for these vowels
if not find(stem_parts[i + 1], "%-") then
-- there's only one vowel, so use it
for k, stem in ipairs(resi[stype]) do
resi[stype][k] = stem .. stem_parts[i + 1]
end
else
-- multiple vowels not matching a known vowel alternation
error(stem_parts[i + 1] ..
" is not a valid vowel change")
end
elseif type(vc[stype]) == "string" then
-- only one vowel can be used with that ending
for k, stem in ipairs(resi[stype]) do
resi[stype][k] = stem .. vc[stype]
end
elseif type(vc[stype]) == "table" then
-- multiple vowels for that ending, so make a copy
-- of the partial stem for each one
local copy = resi[stype]
resi[stype] = {}
for _, vow in ipairs(vc[stype]) do
for _, stem in ipairs(copy) do
insert(resi[stype], stem .. vow)
end
end
end
end
end
end
-- add only the stems that are not already in res
for _, stype in ipairs(stem_types) do
for _, stemi in ipairs(resi[stype]) do
local is_new = true
for _, stem in ipairs(res[stype]) do
if stem == stemi then
is_new = false
break
end
end
if is_new then
insert(res[stype], stemi)
end
end
end
end
end
return res
end
local function find_cons_verb(cons, mode, conj_23, vow)
local n
-- ugly hack
if conj_23 and mode == "â" and cons == "t"
and find(vow, "[eio]$") then
cons = "ț"
return cons
end
if conj_23 and consonants_23_verb[mode] then
for _, p in ipairs(consonants_23_verb[mode]) do
cons, n = gsub(cons, p[1], p[2], 1)
if n >= 1 then
return cons
end
end
end
if consonants_verb[mode] then
for _, p in pairs(consonants_verb[mode]) do
cons, n = gsub(cons, p[1], p[2], 1)
if n >= 1 then
return cons
end
end
end
return cons
end
-- common for both functions below
local join_ending_common = function(stem, ending)
ending = ending or ""
local res = {}
if type(stem) == "string" then
stem = {stem}
end
for _, s in ipairs(stem) do
if ending == "" then
if match(s, "[cg]h$") or match(s, "[^" .. vowels .. "]i$") then
insert(res, s .. "i")
elseif match(s, "[^" .. vowels .. "][lr]$") then
insert(res, s .. "u")
end
elseif match(s, "[cg]h$") then
if match(ending, "^a") then
insert(res, s .. "e" .. ending)
elseif match(ending, "^ă") then
insert(res, s .. gsub(ending, "^ă", "e"))
elseif match(ending, "^[âî]") then
insert(res, s .. gsub(ending, "^[âî]", "i"))
end
elseif match(s, "i$") then
if match(ending, "^ă") then
insert(res, s .. gsub(ending, "^ă", "e"))
elseif match(ending, "^ea") then
insert(res, s .. gsub(ending, "^e", ""))
elseif match(ending, "^[âi]") then
if match(s, "[" .. vowels .. "]i$") then
insert(res, s .. gsub(ending, "^[âi]", ""))
else
insert(res, s .. gsub(ending, "^[âi]", "i"))
end
end
end
end
return res
end
-- no consonant change
local join_ending_2 = function(stem, ending)
ending = ending or ""
local res = join_ending_common(stem, ending)
if #res == 0 then
if type(stem) == "string" then
stem = {stem}
end
for _, s in ipairs(stem) do
if match(ending, "^[ei]") and match(s, "[cg]$") then
insert(res, s .. "h" .. ending)
else
insert(res, s .. ending)
end
end
end
for i, form in ipairs(res) do
res[i] = match(form, "^(.-)_?$")
end
return res
end
-- consonant change
local join_ending = function(stem, ending, conj_23)
ending = ending or ""
local res = join_ending_common(stem, ending)
if #res == 0 then
if type(stem) == "string" then
stem = {stem}
end
for _, s in ipairs(stem) do
if match(ending, "^[ei]") or (conj_23 and match(ending, "^[uâ]")) then
local st, vow, cons = split_svc(s)
local ending_vow = ending == "i_" and "i_" or sub(ending, 1, 1)
cons = find_cons_verb(cons, ending_vow, conj_23, vow)
insert(res, st .. vow .. cons .. ending)
else
insert(res, s .. ending)
end
end
end
for i, form in ipairs(res) do
res[i] = match(form, "^(.-)_?$")
end
return res
end
local add_form = function(t, name, new_form)
if type(new_form) == "string" then
new_form = {new_form}
end
if not t[name] then
t[name] = {}
end
for _,e in ipairs(new_form) do
insert_if_not(t[name], e)
end
end
local add_repeated_forms_new = function(t)
add_form(t, "imp1", join_ending(t.impf_stem, "am"))
add_form(t, "imp2", join_ending(t.impf_stem, "ai"))
add_form(t, "imp3", join_ending(t.impf_stem, "a"))
add_form(t, "imp4", join_ending(t.impf_stem, "am"))
add_form(t, "imp5", join_ending(t.impf_stem, "ați"))
add_form(t, "imp6", join_ending(t.impf_stem, "au"))
add_form(t, "pluperf1", join_ending(t.plup_stem, "sem"))
add_form(t, "pluperf2", join_ending(t.plup_stem, "seși"))
add_form(t, "pluperf3", join_ending(t.plup_stem, "se"))
add_form(t, "pluperf4", join_ending(t.plup_stem, "serăm"))
add_form(t, "pluperf5", join_ending(t.plup_stem, "serăți"))
add_form(t, "pluperf6", join_ending(t.plup_stem, "seră"))
add_form(t, "subj1", deepcopy(t.pres1))
add_form(t, "subj2", deepcopy(t.pres2))
add_form(t, "subj4", deepcopy(t.pres4))
add_form(t, "subj5", deepcopy(t.pres5))
add_form(t, "subj6", deepcopy(t.subj3))
add_form(t, "imper5", deepcopy(t.pres5))
end
local conjugations_new = {}
conjugations_new["a"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before ă ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before i ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ând"))
add_form(t, "part", join_ending(ppstem, "at"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_"))
add_form(t, "pres3", join_ending(stem_ah, "ă"))
add_form(t, "pres4", join_ending(stem, "ăm"))
add_form(t, "pres5", join_ending(stem, "ați"))
add_form(t, "pres6", deepcopy(t.pres3))
t.impf_stem = stem
add_form(t, "perf1", join_ending(ppstem, "ai"))
add_form(t, "perf2", join_ending(ppstem, "ași"))
add_form(t, "perf3", join_ending(ppstem, "ă"))
add_form(t, "perf4", join_ending(ppstem, "arăm"))
add_form(t, "perf5", join_ending(ppstem, "arăți"))
add_form(t, "perf6", join_ending(ppstem, "ară"))
t.plup_stem = join_ending(ppstem, "a")
add_form(t, "subj3", join_ending(stem_e, "e"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["a-ez"] = function(t, stem, stems, ppstem)
local stem = stem
local stem_ez = join_ending_2(stem, "ez")
local stem_eaz = join_ending_2(stem, "eaz")
conjugations_new["a"](t, stem, {["-"] = stem_ez,
["ă"] = stem_eaz,
["e"] = stem_ez,
["i"] = stem_ez}, ppstem)
end
conjugations_new["i"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before ă ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before i ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ind"))
add_form(t, "part", join_ending(ppstem, "it"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_"))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem, "im"))
add_form(t, "pres5", join_ending(stem, "iți"))
-- todo: this is probably based on stress
add_form(t, "pres6", deepcopy(match(type(stem_) == "table" and stem_[1] or stem_, "[" .. vowels .. "]i$"))
and t.pres3 or t.pres1)
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(ppstem, "ii"))
add_form(t, "perf2", join_ending(ppstem, "iși"))
add_form(t, "perf3", join_ending(ppstem, "i"))
add_form(t, "perf4", join_ending(ppstem, "irăm"))
add_form(t, "perf5", join_ending(ppstem, "irăți"))
add_form(t, "perf6", join_ending(ppstem, "iră"))
t.plup_stem = join_ending(ppstem, "i")
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["i-esc"] = function(t, stem, stems, ppstem)
local stem = stem
local stem_esc = join_ending(stem, "esc")
local stem_easc = join_ending(stem, "easc")
conjugations_new["i"](t, stem, {["-"] = stem_esc,
["ă"] = stem_easc,
["e"] = stem_esc,
["i"] = stem_esc}, ppstem)
end
conjugations_new["î"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before ă ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before i ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ând"))
add_form(t, "part", join_ending(ppstem, "ât"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_"))
add_form(t, "pres3", join_ending(stem_ah, "ă"))
add_form(t, "pres4", join_ending(stem, "âm"))
add_form(t, "pres5", join_ending(stem, "âți"))
-- todo: change this
add_form(t, "pres6", deepcopy(t.pres3))
t.impf_stem = stem
add_form(t, "perf1", join_ending(ppstem, "âi"))
add_form(t, "perf2", join_ending(ppstem, "âși"))
add_form(t, "perf3", join_ending(ppstem, "î"))
add_form(t, "perf4", join_ending(ppstem, "ârăm"))
add_form(t, "perf5", join_ending(ppstem, "ârăți"))
add_form(t, "perf6", join_ending(ppstem, "âră"))
t.plup_stem = join_ending(ppstem, "â")
add_form(t, "subj3", join_ending(stem_e, "e"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["î-ăsc"] = function(t, stem, stems, ppstem)
local stem = stem
local stem_ = join_ending(stem, "ăsc") -- stressed stem before zero ending
local stem_ah = join_ending(stem, "asc") -- stressed stem before ă ending
local stem_e = stem_ -- stressed stem before e ending
local stem_i = stem_ -- stressed stem before i ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ând"))
add_form(t, "part", join_ending(ppstem, "ât"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_"))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem, "âm"))
add_form(t, "pres5", join_ending(stem, "âți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = stem
add_form(t, "perf1", join_ending(ppstem, "âi"))
add_form(t, "perf2", join_ending(ppstem, "âși"))
add_form(t, "perf3", join_ending(ppstem, "î"))
add_form(t, "perf4", join_ending(ppstem, "ârăm"))
add_form(t, "perf5", join_ending(ppstem, "ârăți"))
add_form(t, "perf6", join_ending(ppstem, "âră"))
t.plup_stem = join_ending(ppstem, "â")
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["e-s"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before i ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before ă ending
local pp_stem = tsub(stem, 1, -2)
local pp_stem_ = tsub(stem_, 1, -2)
local pp_stem_e = tsub(stem_e, 1, -2)
if type(ppstem) == "string" or type(ppstem) == "table" and #ppstem > 0 then -- parche para [[scrie]]
pp_stem = ppstem
pp_stem_ = ppstem
pp_stem_e = ppstem
end
add_form(t, "ger", join_ending(stem, "ând", true))
add_form(t, "part", join_ending(pp_stem_, "s"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_", true))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem_e, "em"))
add_form(t, "pres5", join_ending(stem_e, "eți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(pp_stem, "sei"))
add_form(t, "perf2", join_ending(pp_stem, "seși"))
add_form(t, "perf3", join_ending(pp_stem_e, "se"))
add_form(t, "perf4", join_ending(pp_stem_e, "serăm"))
add_form(t, "perf5", join_ending(pp_stem_e, "serăți"))
add_form(t, "perf6", join_ending(pp_stem_e, "seră"))
t.plup_stem = join_ending(pp_stem, "se")
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
-- same as e-s except for the past participle
conjugations_new["e-t"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before i ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before ă ending
local pp_stem = tsub(stem, 1, -2)
local pp_stem_ = tsub(stem_, 1, -2)
local pp_stem_e = tsub(stem_e, 1, -2)
if type(ppstem) == "string" or type(ppstem) == "table" and #ppstem > 0 then -- parche para [[scrie]]
pp_stem = ppstem
pp_stem_ = ppstem
pp_stem_e = ppstem
end
add_form(t, "ger", join_ending(stem, "ând", true))
add_form(t, "part", join_ending(pp_stem_, "t"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_", true))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem_e, "em"))
add_form(t, "pres5", join_ending(stem_e, "eți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(pp_stem, "sei"))
add_form(t, "perf2", join_ending(pp_stem, "seși"))
add_form(t, "perf3", join_ending(pp_stem_e, "se"))
add_form(t, "perf4", join_ending(pp_stem_e, "serăm"))
add_form(t, "perf5", join_ending(pp_stem_e, "serăți"))
add_form(t, "perf6", join_ending(pp_stem_e, "seră"))
t.plup_stem = join_ending(pp_stem, "se")
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["e-pt"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before i ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before ă ending
local pp_stem = tsub(stem, 1, -2)
local pp_stem_ = tsub(stem_, 1, -2)
local pp_stem_e = tsub(stem_e, 1, -2)
if type(ppstem) == "string" or type(ppstem) == "table" and #ppstem > 0 then -- parche para [[scrie]]
pp_stem = ppstem
pp_stem_ = ppstem
pp_stem_e = ppstem
end
add_form(t, "ger", join_ending(stem, "ând", true))
add_form(t, "part", join_ending(pp_stem_, "pt"))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_", true))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem_e, "em"))
add_form(t, "pres5", join_ending(stem_e, "eți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(pp_stem, "psei"))
add_form(t, "perf2", join_ending(pp_stem, "pseși"))
add_form(t, "perf3", join_ending(pp_stem_e, "pse"))
add_form(t, "perf4", join_ending(pp_stem_e, "pserăm"))
add_form(t, "perf5", join_ending(pp_stem_e, "pserăți"))
add_form(t, "perf6", join_ending(pp_stem_e, "pseră"))
t.plup_stem = join_ending(pp_stem, "pse")
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["e-ut"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before i ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before ă ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ând", true))
add_form(t, "part", join_ending(ppstem, "ut", true))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_", true))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem_e, "em"))
add_form(t, "pres5", join_ending(stem_e, "eți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(ppstem, "ui", true))
add_form(t, "perf2", join_ending(ppstem, "uși", true))
add_form(t, "perf3", join_ending(ppstem, "u", true))
add_form(t, "perf4", join_ending(ppstem, "urăm", true))
add_form(t, "perf5", join_ending(ppstem, "urăți", true))
add_form(t, "perf6", join_ending(ppstem, "ură", true))
t.plup_stem = join_ending(ppstem, "u", true)
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
conjugations_new["ea-ut"] = function(t, stem, stems, ppstem)
local stem = stem -- unstressed stem
local stem_ = stems["-"] or stem -- stressed stem before zero ending
local stem_ah = stems["ă"] or stem -- stressed stem before i ending
local stem_e = stems["e"] or stem -- stressed stem before e ending
local stem_i = stems["i"] or stem -- stressed stem before ă ending
if not ppstem or #ppstem == 0 then
ppstem = stem
end
add_form(t, "ger", join_ending(stem, "ând", true))
add_form(t, "part", join_ending(ppstem, "ut", true))
add_form(t, "pres1", join_ending(stem_, ""))
add_form(t, "pres2", join_ending(stem_i, "i_", true))
add_form(t, "pres3", join_ending(stem_e, "e"))
add_form(t, "pres4", join_ending(stem, "em"))
add_form(t, "pres5", join_ending(stem, "eți"))
add_form(t, "pres6", deepcopy(t.pres1))
t.impf_stem = tsub(join_ending(stem, "ea"), 1, -2)
add_form(t, "perf1", join_ending(ppstem, "ui", true))
add_form(t, "perf2", join_ending(ppstem, "uși", true))
add_form(t, "perf3", join_ending(ppstem, "u", true))
add_form(t, "perf4", join_ending(ppstem, "urăm", true))
add_form(t, "perf5", join_ending(ppstem, "urăți", true))
add_form(t, "perf6", join_ending(ppstem, "ură", true))
t.plup_stem = join_ending(ppstem, "u", true)
add_form(t, "subj3", join_ending(stem_ah, "ă"))
add_form(t, "imper2", deepcopy(t.pres3))
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["nucleoperf"] = {por_defecto = ""},
["núcleoperf"] = {alias_de = "nucleoperf"},
["nucleosubj"] = {por_defecto = ""}, -- sin uso
["núcleosubj"] = {alias_de = "nucleosubj"},
["tipo"] = {},
["impersonal"] = {por_defecto = ""},
["impers"] = {alias_de = "impersonal"},
["paradigma"] = {lista = true}, -- sin uso
["nota"] = {},
["aux"] = {},
-- formas del subjuntivo, por ahora sin uso
["subj1"] = {tipo=parsear_arreglo, por_defecto={}},
["subj2"] = {tipo=parsear_arreglo, por_defecto={}},
["subj3"] = {tipo=parsear_arreglo, por_defecto={}},
["subj4"] = {tipo=parsear_arreglo, por_defecto={}},
["subj5"] = {tipo=parsear_arreglo, por_defecto={}},
["subj6"] = {tipo=parsear_arreglo, por_defecto={}}
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local v = tit
assert(not find(v, " "), "locuciones no soportadas")
local sufijo_inf
local paradigmas_reconocidos = {} -- sin uso
local es_irregular
local es_inco
local es_puro
local conjinfo = {}
for _,rx in ipairs(segunda_conjugacion) do
if find(v, rx) then
conjinfo.sufijo_inf = "ea"
end
end
if not conjinfo.sufijo_inf then
conjinfo.sufijo_inf = match(v, "[aeiî]$")
end
assert(conjinfo.sufijo_inf, "forma canónica no reconocida")
sufijo_inf = conjinfo.sufijo_inf
if conjinfo.nucleo then
conjinfo.nucleo_inf = conjinfo.nucleo
end
if not conjinfo.nucleo_inf then
conjinfo.nucleo_inf = sub(v, 1, max(len(v) - len(conjinfo.sufijo_inf), 0))
end
conjinfo.prefijo = "" -- por ahora sin uso
local stems = get_stems(args[1], conjinfo.nucleo_inf)
conjinfo.nucleo_inf = {conjinfo.nucleo_inf}
if not args.tipo then
args.tipo = conjinfo.sufijo_inf
end
if args.tipo == "e" then
args.tipo = "e-s"
elseif args.tipo == "ea" then
args.tipo = "ea-ut"
end
if find(args.tipo, "sc") or find(args.tipo, "ez") then
es_inco = true
else
es_puro = true
end
if args[1] or args[2] or args.nucleoperf ~= "" then
es_irregular = true
end
conjugations_new[args.tipo](conjugado, args[2] and split(args[2], " */ *") or conjinfo.nucleo_inf, stems, split(args.nucleoperf, " *; *"))
add_repeated_forms_new(conjugado)
conjugado.inf = {v}
local resultante, irr = sobreescribir_formas(conjugado, args)
es_irregular = es_irregular or irr
local defectivo = comprobar_defectivo(resultante, {"^imper"}, tostr)
resultante = agregar_enlaces(resultante, tit)
local es_impersonal = args["impersonal"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local impers = args["impersonal"]
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(ăsta)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_imper = {"", "(ăsta)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
fila_pronombres_ind = {"", "(ăsta)", "(astea)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_imper = {"", "(ăsta)", "(astea)", color=COLOR_IMPER, header=true, class="pc"}
cs = 3
else
fila_pronombres_ind = {"", "eu, io", "tu", "el, ea", "noi", "voi", "ei, ele", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_imper = {"", "―", "(tu)", "―", "―", "(voi)", "―", color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = math.floor((cs-1) / 2)
cs2 = cs - 1 - cs1
local t = {}
t[1] = {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true}
if impers == "3" then
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
else
resultante.inf.colspan = cs - 1
resultante.ger.colspan = cs - 1
resultante.part.colspan = cs - 1
t[2] = {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf}
t[3] = {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger}
t[4] = {{"Participio", header=true, color=COLOR_NP}, resultante.part}
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
t[5] = {{"Formas personales", colspan=cs}, color=COLOR_H, header=true}
t[6] = {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true}
t[7] = fila_pronombres_ind
t[8] = {{"Presente", color=COLOR_IND, header=true}, ic("pres")}
t[9] = {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("imp")}
t[10] = {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("perf")}
t[11] = {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("pluperf")}
t[12] = {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true}
t[13] = fila_pronombres_imper
if mostrar_imper then
t[14] = {{"Presente", color=COLOR_IMPER, header=true}, ic("imper")}
else
t[14] = {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}}
end
t[15] = {{f("Leyenda: † arcaico, x no normativo, PART se usa más como participio, ADJ se usa más como adjetivo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}}
args["nota"] = args["nota"] or ""
if args["impersonal"] == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if args["impersonal"] == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if args["impersonal"] == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
t[16] = {{args["nota"] and args["nota"] or "", colspan=cs}}
local cats = {}
local enc = {}
if not es_inco and not es_puro then
es_puro = true
end
if sufijo_inf == "a" then
insert(cats, "RO:Verbos de la primera conjugación")
insert(enc, "primera conjugación")
if es_inco then
insert(cats, "RO:Verbos incoativos")
insert(enc, "incoativo")
end
if es_puro then
insert(cats, "RO:Verbos puros")
insert(enc, "puro")
end
elseif sufijo_inf == "ea" then
insert(cats, "RO:Verbos de la segunda conjugación")
insert(enc, "segunda conjugación")
elseif sufijo_inf == "e" then
insert(cats, "RO:Verbos de la tercera conjugación")
insert(enc, "tercera conjugación")
elseif sufijo_inf == "i" or sufijo_inf == "î" then
insert(cats, "RO:Verbos de la cuarta conjugación")
insert(enc, "cuarta conjugación")
if es_inco then
insert(cats, "RO:Verbos incoativos")
insert(enc, "incoativo")
end
if es_puro then
insert(cats, "RO:Verbos puros")
insert(enc, "puro")
end
end
if es_irregular then
insert(cats, "RO:Verbos irregulares")
insert(enc, "irregular")
else
insert(cats, "RO:Verbos regulares")
insert(enc, "regular")
end
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(cats, "RO:Verbos impersonales")
end
if impers == "36" or find(impers, "^u[tm]c36$") then
insert(cats, "RO:Verbos terciopersonales")
end
if defectivo then
insert(cats, "RO:Verbos defectivos")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit.."'''''   ("..concat(enc, ", ")..")",
t,
ns == 0 and cats or {})
end
return export
ncw80fvi2hsfw9a3d7ukeut3k5rv1ua
Módulo:flex/la
828
1059810
6307336
6294610
2026-08-06T00:34:27Z
TMCbot
164594
.
6307336
Scribunto
text/plain
-- FLEXIÓN DEL LATÍN
-- Adaptado desde en.wikt por Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local keys_to_list = m_table.keysToList
local insert_if_not = m_table.insertIfNot
local deep_copy = m_table.deepCopy
local contains = m_table.contains
local merge = m_table.merge
local m_str = require("Módulo:string")
local u = m_str.char
local match = m_str.match
local sub = m_str.sub
local gsub = m_str.gsub
local split = m_str.split
local gsplit = m_str.gsplit
local find = m_str.find
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local toNFC = m_str_avanzado.toNFC
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local separar_palabras = m_flex.separar_palabras
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_tabla = m_flex.renderizar_tabla
local renderizar_encabezado = m_flex.renderizar_encabezado
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local MACRON = u(0x304)
local BREVE = u(0x306)
local DIAER = u(0x308)
local DBREVE = u(0x361)
local ACCENT = "[" .. MACRON .. BREVE .. DIAER .. DBREVE .. "]"
local VOWEL = "[aæeioœuyAÆEIOŒUY]"
local cons_to_vowel = {
["j"] = "i", ["J"] = "I",
["v"] = "u", ["V"] = "U",
}
local function normalizar_enlace(x)
x = toNFD(x)
x = gsub(x, ACCENT, "")
return toNFC(x)
end
local function join(a, b)
a, b = toNFD(a), toNFD(b)
-- If the first part ends in "j" or "v", convert it to "i" or "u" unless
-- the second part begins with a vowel.
if not match(b, "^" .. VOWEL) then
a = gsub(a, "[jvJV]$", cons_to_vowel)
end
return toNFC(a..b)
end
local function add_form(decl, slot, stem, suf)
if type(slot) == "string" then
slot = {slot}
end
for _,slt in ipairs(slot) do
if type(decl[slt]) == "nil" or decl[slt] == "" then
decl[slt] = {}
elseif type(decl[slt]) == "string" then
decl[slt] = {decl[slt]}
end
insert_if_not(decl[slt], join(stem, suf))
end
end
local function remove_forms(decl, forms)
for form,_ in pairs(decl) do
for _,rx in ipairs(forms) do
if form:find(rx) then
forms[form] = {}
break
end
end
end
end
local function merge_forms(forms, forms2, keys)
keys = keys or forms2
for key,arr in pairs(keys) do
if not forms[key] then
forms[key] = {}
end
if type(forms2[key]) == "string" then
insert_if_not(forms[key], forms2[key])
elseif type(forms2[key]) == "table" then
for _,a in ipairs(forms2[key]) do
insert_if_not(forms[key], a)
end
end
end
end
local noun_decl = {}
noun_decl["0"] = function(data, args)
local forms = data.forms
local stem = args[1]
insert_if_not(data.title, "indeclinable")
insert_if_not(data.categories, "LA:Sustantivos indeclinables")
forms["nom_sg"] = stem
forms["gen_sg"] = stem
forms["dat_sg"] = stem
forms["acc_sg"] = stem
forms["abl_sg"] = stem
forms["voc_sg"] = stem
forms["nom_pl"] = stem
forms["gen_pl"] = stem
forms["dat_pl"] = stem
forms["acc_pl"] = stem
forms["abl_pl"] = stem
forms["voc_pl"] = stem
-- with locative
if data.loc then
forms["loc_sg"] = stem
forms["loc_pl"] = stem
end
end
local function alt_gen_pl_in_um(stem, forms, types, subtitles, i_stem)
if types.genplum then
add_form(forms, "gen_pl", stem, (i_stem and "i" or "") .. "um")
elseif types.not_genplum then
-- FIXME: not a contraction.
-- insert_if_not(subtitles, "uncontracted genitive plural")
end
end
noun_decl["1"] = function(data, args)
local forms, types, loc, subtitles = data.forms, data.types, data.loc, data.subtitles
local stem = args[1]
-- normal 1st
local nom_sg = "a"
local gen_loc_sg = "ae"
local dat_sg = "ae"
local acc_sg = "am"
local abl_sg = "ā"
local voc_sg = "a"
local nom_voc_pl = "ae"
local gen_pl = "ārum"
local dat_abl_loc_pl = "īs"
local acc_pl = "ās"
insert_if_not(data.title, "primera declinación")
insert_if_not(data.categories, "LA:Sustantivos de la primera declinación")
-- ām
if types.am then
nom_sg = "ām"
acc_sg = "ām"
abl_sg = {"ām", "ā"}
voc_sg = "ām"
-- all Greek
elseif types.Greek then
insert_if_not(data.title, "griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
--Greek Ma
if types.Ma then
nom_sg = "ās"
acc_sg = "ān"
voc_sg = "ā"
-- Greek Me
elseif types.Me then
nom_sg = "ēs"
acc_sg = "ēn"
abl_sg = "ē"
voc_sg = "ē"
-- Greek
else
nom_sg = "ē"
gen_loc_sg = "ēs"
acc_sg = "ēn"
abl_sg = "ē"
voc_sg = "ē"
end
end
-- ābus
if types.abus then
dat_abl_loc_pl = "ābus"
end
add_form(forms, "nom_sg", stem, nom_sg)
add_form(forms, "gen_sg", stem, gen_loc_sg)
add_form(forms, "dat_sg", stem, dat_sg)
add_form(forms, "acc_sg", stem, acc_sg)
add_form(forms, "abl_sg", stem, abl_sg)
add_form(forms, "voc_sg", stem, voc_sg)
add_form(forms, {"nom_pl", "voc_pl"}, stem, nom_voc_pl)
add_form(forms, "gen_pl", stem, gen_pl)
add_form(forms, {"dat_pl", "abl_pl"}, stem, dat_abl_loc_pl)
add_form(forms, "acc_pl", stem, acc_pl)
-- with locative
if loc then
add_form(forms, "loc_sg", stem, gen_loc_sg)
add_form(forms, "loc_pl", stem, dat_abl_loc_pl)
end
end
noun_decl["2"] = function(data, args)
local forms, types, subtitles, notes = data.forms, data.types, data.subtitles, data.notes
local stem1, stem2 = args[1], args[2]
insert_if_not(data.title, "segunda declinación")
insert_if_not(data.categories, "LA:Sustantivos de la segunda declinación")
-- normal 2nd
forms["nom_sg"] = stem1 .. "us"
forms["gen_sg"] = stem1 .. "ī"
forms["dat_sg"] = stem1 .. "ō"
forms["acc_sg"] = stem1 .. "um"
forms["abl_sg"] = stem1 .. "ō"
forms["voc_sg"] = stem1 .. "e"
forms["nom_pl"] = stem1 .. "ī"
forms["gen_pl"] = stem1 .. "ōrum"
forms["dat_pl"] = stem1 .. "īs"
forms["acc_pl"] = stem1 .. "ōs"
forms["abl_pl"] = stem1 .. "īs"
forms["voc_pl"] = stem1 .. "ī"
-- all neuter
if types.N then
forms["nom_sg"] = stem1 .. "um"
forms["voc_sg"] = stem1 .. "um"
forms["nom_pl"] = stem1 .. "a"
forms["acc_pl"] = stem1 .. "a"
forms["voc_pl"] = stem1 .. "a"
-- neuter ium
if types.ium then
forms["nom_sg"] = stem1 .. "ium"
forms["gen_sg"] = {stem1 .. "iī", stem1 .. "ī{†}"}
forms["dat_sg"] = stem1 .. "iō"
forms["acc_sg"] = stem1 .. "ium"
forms["abl_sg"] = stem1 .. "iō"
forms["voc_sg"] = stem1 .. "ium"
forms["nom_pl"] = stem1 .. "ia"
forms["gen_pl"] = stem1 .. "iōrum"
forms["dat_pl"] = stem1 .. "iīs"
forms["acc_pl"] = stem1 .. "ia"
forms["abl_pl"] = stem1 .. "iīs"
forms["voc_pl"] = stem1 .. "ia"
-- neuter us, plural a
elseif types.a then
forms["nom_sg"] = stem1 .. "us"
forms["acc_sg"] = stem1 .. "us"
forms["voc_sg"] = stem1 .. "us"
forms["nom_pl"] = stem1 .. "a"
forms["acc_pl"] = stem1 .. "a"
forms["voc_pl"] = stem1 .. "a"
-- -vom (aevom, etc.)
elseif types.vom then
forms["nom_sg"] = stem1 .. "om"
forms["acc_sg"] = stem1 .. "om"
forms["voc_sg"] = stem1 .. "om"
-- neuter Greek in -os (cētos)
elseif types.Greek and types.us then
insert_if_not(data.title, "griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = stem1 .. "os"
forms["acc_sg"] = stem1 .. "os"
forms["voc_sg"] = stem1 .. "os"
forms["nom_pl"] = stem1 .. "ē"
forms["gen_pl"] = stem1 .. "ōn"
forms["acc_pl"] = stem1 .. "ē"
forms["voc_pl"] = stem1 .. "ē"
-- neuter Greek
elseif types.Greek then
insert_if_not(data.title, "griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = stem1 .. "on"
forms["acc_sg"] = stem1 .. "on"
forms["voc_sg"] = stem1 .. "on"
-- neuter us
elseif types.us then
forms["nom_sg"] = stem1 .. "us"
forms["acc_sg"] = stem1 .. "us"
forms["voc_sg"] = stem1 .. "us"
forms["nom_pl"] = stem1 .. "ī"
forms["acc_pl"] = stem1 .. "ōs"
forms["voc_pl"] = stem1 .. "ī"
end
-- er
elseif types.er then
forms["nom_sg"] = stem1
forms["gen_sg"] = stem2 .. "ī"
forms["dat_sg"] = stem2 .. "ō"
forms["acc_sg"] = stem2 .. "um"
forms["abl_sg"] = stem2 .. "ō"
forms["voc_sg"] = stem1
forms["nom_pl"] = stem2 .. "ī"
forms["gen_pl"] = stem2 .. "ōrum"
forms["dat_pl"] = stem2 .. "īs"
forms["acc_pl"] = stem2 .. "ōs"
forms["abl_pl"] = stem2 .. "īs"
forms["voc_pl"] = stem2 .. "ī"
-- ius
elseif types.ius then
forms["nom_sg"] = stem1 .. "ius"
forms["gen_sg"] = {stem1 .. "iī", stem1 .. "ī{†}"}
forms["dat_sg"] = stem1 .. "iō"
forms["acc_sg"] = stem1 .. "ium"
forms["abl_sg"] = stem1 .. "iō"
if types.voci then
-- Only for proper names and fīlius, genius
forms["voc_sg"] = stem1 .. "ī"
else
forms["voc_sg"] = stem1 .. "ie"
end
forms["nom_pl"] = stem1 .. "iī"
forms["gen_pl"] = stem1 .. "iōrum"
forms["dat_pl"] = stem1 .. "iīs"
forms["acc_pl"] = stem1 .. "iōs"
forms["abl_pl"] = stem1 .. "iīs"
forms["voc_pl"] = stem1 .. "iī"
-- -vos (servos, etc.)
elseif types.vos then
forms["nom_sg"] = stem1 .. "os"
forms["acc_sg"] = stem1 .. "om"
-- Greek
elseif types.Greek then
insert_if_not(data.title, "griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = stem1 .. "os"
forms["acc_sg"] = stem1 .. "on"
if data.num == "pl" then
forms["nom_pl"] = stem1 .. "oe"
forms["voc_pl"] = stem1 .. "oe"
else
forms["nom_pl"] = {stem1 .. "ī", stem1 .. "oe"}
forms["voc_pl"] = {stem1 .. "ī", stem1 .. "oe"}
end
elseif types.not_Greek then
insert_if_not(data.title, "no griego")
end
-- with -um genitive plural
alt_gen_pl_in_um(stem2, forms, types, subtitles, types.ius or types.ium)
-- with locative
if data.loc then
if types.ius or types.ium then
forms["loc_sg"] = stem2 .. "iī"
forms["loc_pl"] = stem2 .. "iīs"
else
forms["loc_sg"] = stem2 .. "ī"
forms["loc_pl"] = stem2 .. "īs"
end
end
end
local acc_sg_i_stem_subtypes = {
acc_im = {
-- amussis, basis, buris, cucumis, gummis, mephitis, paraphrasis, poesis, ravis, sitis, tussis, (vis) [abl -ī];
-- cannabis, senapis, sinapis [abl -e, -ī]
acc_sg = {"im"},
title = {"accusative singular in ''-im''"},
},
acc_im_in = {
-- cities, rivers, gods, e.g. Bilbilis, Syrtis, Tiberis, Anubis, Osiris [abl -ī];
-- Baetis, Tigris [acc -e, -ī]
acc_sg = {"im", "in"},
title = {"accusative singular in ''-im'' or ''-in''"},
},
acc_im_in_em = {
-- e.g. tigris, river Līris
acc_sg = {"im", "in", "em"},
title = {"accusative singular in ''-im'', ''-in'' or ''-em''"},
},
acc_im_em = {
acc_sg = {"im", "em"},
title = {"accusative singular in ''-im'' or ''-em''"},
},
acc_im_occ_em = {
-- febris, pelvis, puppis, restis, securis, turris [abl -ī, -e]
acc_sg = {"im", "em"},
title = {"accusative singular in ''-im'' or occasionally ''-em''"},
},
acc_em_im = {
-- aqualis, clavis, lens, navis [abl -e, -ī];
-- cutis, restis [abl -e]
acc_sg = {"em", "im"},
title = {"accusative singular in ''-em'' or ''-im''"},
},
}
local abl_sg_i_stem_subtypes = {
abl_i = {
-- amussis, basis, buris, cucumis, gummis, mephitis, paraphrasis, poesis, ravis, sitis, tussis, (vis) [acc -im];
-- cities, rivers, gods, e.g. Bilbilis, Syrtis, Tiberis, Anubis, Osiris [acc -im or -in];
-- canalis "water pipe", months in -is or -er, nouns originally i-stem adjectives such as aedilis, affinis, bipennis, familiaris, sodalis, volucris, etc. [acc -em]
abl_sg = {"ī"},
title = {"ablative singular in ''-ī''"},
},
abl_i_e = {
-- febris, pelvis, puppis, restis, securis, turris [acc -im, -em]
abl_sg = {"ī", "e"},
title = {"ablative singular in ''-ī'' or ''-e''"},
},
abl_e_i = {
-- cannabis, senapis, sinapis [acc -im];
-- Baetis, Tigris [acc -im, -in];
-- aqualis, clavis, lens, navis [acc -em, -im];
-- finis, mugilis, occiput, pugil, rus, supellex, vectis [acc -em]
abl_sg = {"e", "ī"},
title = {"ablative singular in ''-e'' or ''-ī''"},
},
abl_e_occ_i = {
-- amnis, anguis, avis, civis, classis, fustis, ignis, imber, orbis, pars, postis, sors, unguis, vesper [acc -em]
abl_sg = {"e", "ī"},
title = {"ablative singular in ''-e'' or occasionally ''-ī''"},
},
}
local function extract_stem(form, ending)
local base = match(form, "^(.*)" .. ending .. "$")
if not base then
error("Form " .. form .. " should end in -" .. ending)
end
return base
end
local function count_vowels(stem)
return select(2, toNFD(stem):gsub("[aeiouyAEIOUY]", ""))
end
noun_decl["3"] = function(data, args)
local forms, types, subtitles, notes = data.forms, data.types, data.subtitles, data.notes
local stem1, stem2 = args[1], args[2]
-- local function non_i_stem_type()
-- return (count_vowels(stem1) > count_vowels(stem2) and "parisyllabic" or "imparisyllabic") .. " non-i-stem"
-- end
insert_if_not(data.title, "tercera declinación")
insert_if_not(data.categories, "LA:Sustantivos de la tercera declinación")
--normal 3rd
forms["nom_sg"] = stem1
forms["gen_sg"] = stem2 .. "is"
forms["dat_sg"] = stem2 .. "ī"
forms["acc_sg"] = stem2 .. "em"
forms["abl_sg"] = stem2 .. "e"
forms["voc_sg"] = stem1
forms["nom_pl"] = stem2 .. "ēs"
forms["gen_pl"] = stem2 .. "um"
forms["dat_pl"] = stem2 .. "ibus"
forms["acc_pl"] = stem2 .. "ēs"
forms["abl_pl"] = stem2 .. "ibus"
forms["voc_pl"] = stem2 .. "ēs"
local acc_sg_i_stem_subtype = false
local not_acc_sg_i_stem_subtype = false
for subtype, _ in pairs(types) do
if acc_sg_i_stem_subtypes[subtype] then
acc_sg_i_stem_subtype = true
break
end
end
for acc_sg_subtype, _ in pairs(acc_sg_i_stem_subtypes) do
if types["not_" .. acc_sg_subtype] then
not_acc_sg_i_stem_subtype = true
break
end
end
local abl_sg_i_stem_subtype = false
local not_abl_sg_i_stem_subtype = false
for subtype, _ in pairs(types) do
if abl_sg_i_stem_subtypes[subtype] then
abl_sg_i_stem_subtype = true
break
end
end
for abl_sg_subtype, _ in pairs(abl_sg_i_stem_subtypes) do
if types["not_" .. abl_sg_subtype] then
not_abl_sg_i_stem_subtype = true
break
end
end
-- all Greek
if types.Greek then
insert_if_not(data.title, "griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
-- Greek er
if types.er then
stem1 = extract_stem(stem1, "ēr")
forms["nom_sg"] = stem1 .. "ēr"
forms["gen_sg"] = stem1 .. "eris"
forms["dat_sg"] = stem1 .. "erī"
forms["acc_sg"] = {stem1 .. "era", stem1 .. "erem"}
forms["abl_sg"] = stem1 .. "ere"
forms["voc_sg"] = stem1 .. "ēr"
forms["nom_pl"] = stem1 .. "erēs"
forms["gen_pl"] = stem1 .. "erum"
forms["dat_pl"] = stem1 .. "eribus"
forms["acc_pl"] = stem1 .. "erēs"
forms["abl_pl"] = stem1 .. "eribus"
forms["voc_pl"] = stem1 .. "erēs"
-- Greek on
elseif types.on then
stem1 = extract_stem(stem1, "ōn")
forms["nom_sg"] = stem1 .. "ōn"
forms["gen_sg"] = {stem1 .. "ontis", stem1 .. "ontos"}
forms["dat_sg"] = stem1 .. "ontī"
forms["acc_sg"] = stem1 .. "onta"
forms["abl_sg"] = stem1 .. "onte"
forms["voc_sg"] = stem1 .. "ōn"
forms["nom_pl"] = stem1 .. "ontēs"
forms["gen_pl"] = {stem1 .. "ontum", stem1 .. "ontium"}
forms["dat_pl"] = stem1 .. "ontibus"
forms["acc_pl"] = {stem1 .. "ontēs", stem1 .. "ontās"}
forms["abl_pl"] = stem1 .. "ontibus"
forms["voc_pl"] = stem1 .. "ontēs"
-- Greek i-stem
elseif types.I then
forms["gen_sg"] = {stem2 .. "is", stem2 .. "eōs", stem2 .. "ios"}
forms["acc_sg"] = {stem2 .. "im", stem2 .. "in", stem2 .. "em{MED}"}
forms["abl_sg"] = {stem2 .. "ī", stem2 .. "e{MED}"}
forms["voc_sg"] = {stem2 .. "is", stem2 .. "i"}
forms["nom_pl"] = {stem2 .. "ēs", stem2 .. "eis"}
forms["gen_pl"] = {stem2 .. "ium", stem2 .. "eōn"}
forms["acc_pl"] = {stem2 .. "ēs", stem2 .. "eis"}
forms["voc_pl"] = {stem2 .. "ēs", stem2 .. "eis"}
if types.poetic_esi then
forms["dat_pl"] = {stem2 .. "ibus", stem2 .. "esi{L}"}
forms["abl_pl"] = {stem2 .. "ibus", stem2 .. "esi{L}"}
end
-- normal Greek
else
forms["gen_sg"] = stem2 .. "os"
if match(toNFD(stem2), "[yY]" .. ACCENT .. "*$") then
forms["acc_sg"] = stem2 .. "n"
else
forms["acc_sg"] = stem2 .. "a"
end
forms["nom_pl"] = stem2 .. "es"
forms["acc_pl"] = stem2 .. "as"
forms["voc_pl"] = stem2 .. "es"
if match(toNFD(stem1), "[iyIY]" .. ACCENT .. "*s$") then
-- Per Hiley, words in -is and -ys have a poetic vocative
-- without the -s, but otherwise the vocative is the same
-- as the nominative.
forms["voc_sg"] = {stem1, (stem1:gsub("s$", "")).."{L}"}
end
end
elseif types.not_Greek then
insert_if_not(data.title, "no griego")
end
-- polis
if types.polis then
stem1 = extract_stem(stem1, "polis")
insert_if_not(data.title, "parcialmente griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = stem1 .. "polis"
forms["gen_sg"] = stem1 .. "polis"
forms["dat_sg"] = stem1 .. "polī"
forms["acc_sg"] = {stem1 .. "polim", stem1 .. "polin"}
forms["abl_sg"] = stem1 .. "polī"
forms["voc_sg"] = {stem1 .. "polis", stem1 .. "polī"}
end
-- all neuter
if types.N then
forms["acc_sg"] = stem1
-- neuter I stem
if types.I then
-- pure variety
if types.pure then
forms["abl_sg"] = stem2 .. "ī"
forms["nom_pl"] = stem2 .. "ia"
forms["gen_pl"] = stem2 .. "ium"
forms["acc_pl"] = stem2 .. "ia"
forms["voc_pl"] = stem2 .. "ia"
-- non-pure variety (rare)
else
forms["nom_pl"] = stem2 .. "a"
forms["gen_pl"] = {stem2 .. "ium", stem2 .. "um"}
forms["acc_pl"] = stem2 .. "a"
forms["voc_pl"] = stem2 .. "a"
end
-- normal neuter
else
forms["nom_pl"] = stem2 .. "a"
forms["acc_pl"] = stem2 .. "a"
forms["voc_pl"] = stem2 .. "a"
end
-- I stem
elseif types.I or acc_sg_i_stem_subtype or abl_sg_i_stem_subtype then
forms["gen_pl"] = stem2 .. "ium"
-- Per Allen and Greenough, Hiley and others, the acc_pl in -īs
-- applied originally to all i-stem nouns, and was current as an
-- alternative form up through Caesar.
forms["acc_pl"] = {stem2 .. "ēs", stem2 .. "īs"}
-- pure variety
if types.pure then
forms["acc_sg"] = stem2 .. "im"
forms["abl_sg"] = stem2 .. "ī"
forms["nom_pl"] = stem2 .. "īs"
forms["acc_pl"] = stem2 .. "īs"
forms["voc_pl"] = stem2 .. "īs"
end
local num = data.num
for subtype, _ in pairs(types) do
local acc_sg_i_stem_props = acc_sg_i_stem_subtypes[subtype]
if acc_sg_i_stem_props then
forms["acc_sg"] = {}
for _, ending in ipairs(acc_sg_i_stem_props.acc_sg) do
insert_if_not(forms["acc_sg"], stem2 .. ending)
end
-- if num ~= "pl" then
-- for _, t in ipairs(acc_sg_i_stem_props.title) do
-- insert_if_not(subtitles, t)
-- end
-- end
break
end
end
-- FIXME: needs to be done for neuter nouns as well.
for subtype, _ in pairs(types) do
local abl_sg_i_stem_props = abl_sg_i_stem_subtypes[subtype]
if abl_sg_i_stem_props then
forms["abl_sg"] = {}
for _, ending in ipairs(abl_sg_i_stem_props.abl_sg) do
insert_if_not(forms["abl_sg"], stem2 .. ending)
end
-- if num ~= "pl" then
-- for _, t in ipairs(abl_sg_i_stem_props.title) do
-- insert_if_not(subtitles, t)
-- end
-- end
break
end
end
end
-- with locative
if data.loc then
-- As far as I can tell, in general both dative singular and
-- ablative singular could be used for the third-declension locative,
-- with different time periods preferring different forms.
-- http://dcc.dickinson.edu/grammar/latin/3rd-declension-locative-case
-- mentions rūrī along with either Carthāginī or Carthāgine.
-- Wikipedia in https://en.wikipedia.org/wiki/Locative_case#Latin
-- says this:
--
-- In archaic times, the locative singular of third declension nouns
-- was still interchangeable between ablative and dative forms, but in
-- the Augustan Period the use of the ablative form became fixed.
-- Therefore, both forms "rūrī" and "rūre" may be encountered.
--
-- Lewis and Short confirm this.
local loc_sg = forms["dat_sg"]
if type(loc_sg) == "table" then
loc_sg = deep_copy(loc_sg)
else
loc_sg = {loc_sg}
end
local abl_sg = forms["abl_sg"]
if type(abl_sg) == "table" then
for _, form in ipairs(abl_sg) do
insert_if_not(loc_sg, deep_copy(form))
end
else
insert_if_not(loc_sg, abl_sg)
end
forms["loc_sg"] = loc_sg
forms["loc_pl"] = deep_copy(forms["abl_pl"])
--The following is what we used to have, but I simply cannot believe it.
--if types.Greek and not types.s then
-- forms["loc_pl"] = stem2 .. "ēs"
--end
end
end
noun_decl["4"] = function(data, args)
local forms, types, subtitles, notes = data.forms, data.types, data.subtitles, data.notes
local stem = args[1]
insert_if_not(data.title, "cuarta declinación")
insert_if_not(data.categories, "LA:Sustantivos de la cuarta declinación")
-- normal 4th
forms["nom_sg"] = stem .. "us"
forms["gen_sg"] = stem .. "ūs"
forms["dat_sg"] = stem .. "uī"
forms["acc_sg"] = stem .. "um"
forms["abl_sg"] = stem .. "ū"
forms["voc_sg"] = stem .. "us"
forms["nom_pl"] = stem .. "ūs"
forms["gen_pl"] = stem .. "uum"
forms["dat_pl"] = stem .. "ibus"
forms["acc_pl"] = stem .. "ūs"
forms["abl_pl"] = stem .. "ibus"
forms["voc_pl"] = stem .. "ūs"
if types.echo then
for slot in pairs(forms) do
if slot ~= "gen_sg" then
forms[slot] = stem .. "ō"
end
end
add_form(forms, "acc_sg", stem, "ōn")
elseif types.Callisto then
for slot in pairs(forms) do
if slot ~= "gen_sg" then
forms[slot] = stem .. "ō"
end
end
end
-- neuter
if types.N then
forms["nom_sg"] = stem .. "ū̆{?}"
forms["gen_sg"] = {stem .. "ūs{C}", stem .. "ū{S}"}
forms["dat_sg"] = {stem .. "uī{C}", stem .. "ū{S}"}
forms["acc_sg"] = stem .. "ū̆{?}"
forms["voc_sg"] = stem .. "ū̆{?}"
forms["nom_pl"] = stem .. "ua"
forms["acc_pl"] = stem .. "ua"
forms["voc_pl"] = stem .. "ua"
end
-- ubus
if types.ubus then
forms["dat_pl"] = stem .. "ubus"
forms["abl_pl"] = stem .. "ubus"
end
-- with locative
if data.loc then
forms["loc_sg"] = forms["abl_sg"]
forms["loc_pl"] = forms["abl_pl"]
end
end
noun_decl["5"] = function(data, args)
local forms, types = data.forms, data.types
local stem = args[1]
insert_if_not(data.title, "quinta declinación")
insert_if_not(data.categories, "LA:Sustantivos de la quinta declinación")
-- ies
if types.i then
stem = stem .. "i"
end
forms["nom_sg"] = stem .. "ēs"
forms["gen_sg"] = stem .. "eī"
forms["dat_sg"] = stem .. "eī"
forms["acc_sg"] = stem .. "em"
forms["abl_sg"] = stem .. "ē"
forms["voc_sg"] = stem .. "ēs"
forms["nom_pl"] = stem .. "ēs"
forms["gen_pl"] = stem .. "ērum"
forms["dat_pl"] = stem .. "ēbus"
forms["acc_pl"] = stem .. "ēs"
forms["abl_pl"] = stem .. "ēbus"
forms["voc_pl"] = stem .. "ēs"
-- ies
if types.i then
forms["gen_sg"] = stem .. "ēī"
forms["dat_sg"] = stem .. "ēī"
end
--with locative
if data.loc then
forms["loc_sg"] = stem .. "ē"
forms["loc_pl"] = stem .. "ēbus"
end
end
noun_decl["sgpl"] = function(data, args)
local forms = data.forms
local stem1, stem2 = args[1], args[2]
insert_if_not(data.title, "indeclinable")
insert_if_not(data.categories, "LA:Sustantivos indeclinables")
forms["nom_sg"] = stem1
forms["gen_sg"] = stem1
forms["dat_sg"] = stem1
forms["acc_sg"] = stem1
forms["abl_sg"] = stem1
forms["voc_sg"] = stem1
forms["nom_pl"] = stem2
forms["gen_pl"] = stem2
forms["dat_pl"] = stem2
forms["acc_pl"] = stem2
forms["abl_pl"] = stem2
forms["voc_pl"] = stem2
-- with locative
if data.loc then
forms["loc_sg"] = stem1
forms["loc_pl"] = stem2
end
end
noun_decl["indecl"] = function(data, args)
local forms = data.forms
local stem = args[1]
insert_if_not(data.title, "indeclinable")
insert_if_not(data.categories, "LA:Sustantivos indeclinables")
forms["nom_sg"] = stem
forms["gen_sg"] = {}
forms["dat_sg"] = {}
forms["acc_sg"] = stem
forms["abl_sg"] = {}
forms["voc_sg"] = {}
forms["nom_pl"] = {}
forms["gen_pl"] = {}
forms["dat_pl"] = {}
forms["acc_pl"] = {}
forms["abl_pl"] = {}
forms["voc_pl"] = {}
-- with locative (for multiword terms)
if data.loc then
forms["loc_sg"] = {}
forms["loc_pl"] = {}
end
data.num = "sg"
end
noun_decl["irreg"] = function(data, args)
local forms, subtitles, notes = data.forms, data.subtitles, data.notes
local stem = args[1]
insert_if_not(data.title, "irregular")
insert_if_not(data.categories, "LA:Sustantivos irregulares")
forms["nom_sg"] = {}
forms["gen_sg"] = {}
forms["dat_sg"] = {}
forms["acc_sg"] = {}
forms["abl_sg"] = {}
forms["voc_sg"] = {}
forms["nom_pl"] = {}
forms["gen_pl"] = {}
forms["dat_pl"] = {}
forms["acc_pl"] = {}
forms["abl_pl"] = {}
forms["voc_pl"] = {}
if stem == "bōs" then
data.decl = "3"
local stem1, stem2 = "bōs", "bov"
noun_decl["3"](data, {stem1, stem2})
add_form(forms, "abl_sg", stem2, "īd{†}")
add_form(forms, "gen_pl", "bo", "um")
add_form(forms, "gen_pl", stem2, "erum")
add_form(forms, "dat_pl", "", "bōbus")
add_form(forms, "dat_pl", "", "būbus")
add_form(forms, "abl_pl", "", "bōbus")
add_form(forms, "abl_pl", "", "būbus")
elseif stem:match("^[dD]eus$") then
data.decl = "2"
local dD = stem:sub(1, 1)
forms["nom_sg"] = dD .. "eus"
forms["gen_sg"] = dD .. "eī"
forms["dat_sg"] = dD .. "eō"
forms["acc_sg"] = dD .. "eum"
forms["abl_sg"] = dD .. "eō"
forms["voc_sg"] = {dD .. "eus", dD .. "ee"}
if stem == "deus" then
forms["nom_pl"] = {"dī", "diī", "deī"}
forms["gen_pl"] = {"deōrum", "deum"}
forms["dat_pl"] = {"dīs", "diīs", "deīs"}
forms["acc_pl"] = "deōs"
forms["abl_pl"] = {"dīs", "diīs", "deīs"}
forms["voc_pl"] = {"dī", "diī", "deī"}
end
elseif stem == "domus" then
data.decl = "4,2"
insert_if_not(data.title, "cuarta/segunda declinación")
forms["nom_sg"] = "domus"
forms["gen_sg"] = {"domūs", "domī"}
forms["dat_sg"] = {"domuī", "domō", "domū"}
forms["acc_sg"] = "domum"
forms["abl_sg"] = {"domū", "domō"}
forms["voc_sg"] = "domus"
forms["loc_sg"] = "domī"
forms["nom_pl"] = "domūs"
forms["gen_pl"] = {"domuum", "domōrum"}
forms["dat_pl"] = "domibus"
forms["acc_pl"] = {"domūs", "domōs"}
forms["abl_pl"] = "domibus"
forms["voc_pl"] = "domūs"
forms["loc_pl"] = {}
data.loc = true
elseif match(stem, "^[IÏJ]ēs[uū]" .. BREVE .. "?s$") then
local ij = sub(stem, 1, 1)
local uu = match(stem, "[uū]" .. BREVE .. "?")
forms["nom_sg"] = stem
forms["gen_sg"] = ij .. "ēsū"
forms["dat_sg"] = ij .. "ēsū"
forms["acc_sg"] = ij .. "ēs" .. uu .. "m"
forms["abl_sg"] = ij .. "ēsū"
forms["voc_sg"] = ij .. "ēsū"
data.num = "sg"
elseif stem == "Mōsēs" or stem == "Moesēs" or match(stem, "^M[oō]" .. BREVE .. "?[īȳ]sēs$") then
local mos = sub(stem, 1, -3)
forms["nom_sg"] = stem
forms["gen_sg"] = {mos .. "ī", mos .. "ēī", mos .. "is", mos .. "ēn", mos .. "eōs"}
forms["dat_sg"] = mos .. "ī"
forms["acc_sg"] = {mos .. "ēn", mos .. "em"}
forms["abl_sg"] = {mos .. "e", mos .. "ēn", mos .. "ī"}
forms["voc_sg"] = {mos .. "ēs", mos .. "ē"}
data.num = "sg"
elseif stem:match("^[ij]ūgerum$") then
data.decl = "2,3"
local ij = stem:sub(1, 1)
insert_if_not(data.title, "segunda/tercera declinación híbrido")
forms["nom_sg"] = ij .. "ūgerum"
forms["gen_sg"] = ij .. "ūgerī"
forms["dat_sg"] = ij .. "ūgerō"
forms["acc_sg"] = ij .. "ūgerum"
forms["abl_sg"] = ij .. "ūgerō"
forms["voc_sg"] = ij .. "ūgerum"
forms["nom_pl"] = ij .. "ūgera"
forms["gen_pl"] = ij .. "ūgerum"
forms["dat_pl"] = ij .. "ūgeribus"
forms["acc_pl"] = ij .. "ūgera"
forms["abl_pl"] = {ij .. "ūgeribus", ij .. "ūgerīs{†}"}
forms["voc_pl"] = ij .. "ūgera"
elseif stem == "sūs" then
data.decl = "3"
forms["nom_sg"] = "sūs"
forms["gen_sg"] = "suis"
forms["dat_sg"] = "suī"
forms["acc_sg"] = "suem"
forms["abl_sg"] = "sue"
forms["voc_sg"] = "sūs"
forms["nom_pl"] = "suēs"
forms["gen_pl"] = "suum"
forms["dat_pl"] = {"suibus", "sūbus", "subus"}
forms["acc_pl"] = "suēs"
forms["abl_pl"] = {"suibus", "sūbus", "subus"}
forms["voc_pl"] = "suēs"
elseif stem == "ēthos" then
data.decl = "3"
insert_if_not(data.title, "tercera declinación, griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = "ēthos"
forms["gen_sg"] = "ētheos"
forms["acc_sg"] = "ēthos"
forms["voc_sg"] = "ēthos"
forms["nom_pl"] = {"ēthea", "ēthē"}
forms["dat_pl"] = {"ēthesi", "ēthesin"}
forms["acc_pl"] = {"ēthea", "ēthē"}
forms["abl_pl"] = {"ēthesi", "ēthesin"}
forms["voc_pl"] = {"ēthea", "ēthē"}
elseif stem == "Athōs" then
data.decl = "2"
insert_if_not(data.title, "segunda declinación, griego")
insert_if_not(data.categories, "LA:Sustantivos griegos")
forms["nom_sg"] = "Athōs"
forms["gen_sg"] = "Athō"
forms["dat_sg"] = "Athō"
forms["acc_sg"] = {"Athō", "Athōn"}
forms["abl_sg"] = "Athō"
forms["voc_sg"] = "Athōs"
data.num = "sg"
elseif stem:match("^[uv]ēnum$") then
data.decl = "4,2"
local uv = stem:sub(1, 1)
insert_if_not(data.title, "cuarta/segunda declinación, defectivo")
forms["dat_sg"] = {uv .. "ēnuī", uv .. "ēnō"}
forms["acc_sg"] = uv .. "ēnum"
data.num = "sg"
elseif stem:match("^[uv]īs$") then
data.decl = "3"
local uv = stem:sub(1, 1)
insert_if_not(data.title, "defectivo")
forms["nom_sg"] = uv .. "īs"
forms["gen_sg"] = uv .. "īs"
forms["dat_sg"] = uv .. "ī"
forms["acc_sg"] = uv .. "im"
forms["abl_sg"] = uv .. "ī"
forms["voc_sg"] = uv .. "īs"
forms["nom_pl"] = uv .. "īrēs"
forms["gen_pl"] = uv .. "īrium"
forms["dat_pl"] = uv .. "īribus"
forms["acc_pl"] = {uv .. "īrēs", uv .. "īrīs"}
forms["abl_pl"] = uv .. "īribus"
forms["voc_pl"] = uv .. "īrēs"
else
error("Stem " .. stem .. " not recognized.")
end
end
local adj_decl = {}
adj_decl["0+"] = function(data, args)
local forms, categories = data.forms, data.categories
local stem = args[1]
insert_if_not(data.title, "indeclinable")
insert_if_not(categories, "LA:Adjetivos indeclinables")
forms["nom_sg_m"] = stem
forms["nom_pl_m"] = stem
forms["gen_sg_m"] = stem
forms["gen_pl_m"] = stem
forms["dat_sg_m"] = stem
forms["dat_pl_m"] = stem
forms["acc_sg_m"] = stem
forms["acc_pl_m"] = stem
forms["abl_sg_m"] = stem
forms["abl_pl_m"] = stem
forms["voc_sg_m"] = stem
forms["voc_pl_m"] = stem
forms["loc_sg_m"] = stem
forms["loc_pl_m"] = stem
end
adj_decl["1&2+"] = function(data, args)
local forms, types, pos, subtitles, categories = data.forms, data.types, data.pos, data.subtitles, data.categories
local stem = args[1]
insert_if_not(data.title, "primera y segunda declinación")
insert_if_not(categories, "LA:Adjetivos de la primera declinación")
insert_if_not(categories, "LA:Adjetivos de la segunda declinación")
local original
if types.er then
local final2 = stem:sub(-2)
if final2 == "er" then
-- insert_if_not(categories, "LA:Sustantivos de la primera declinación")
-- insert_if_not(categories, "LA:Sustantivos de la segunda declinación")
elseif final2 == "ur" then
-- insert_if_not(categories, "LA:Sustantivos de la primera declinación")
-- insert_if_not(categories, "LA:Sustantivos de la segunda declinación")
else
error("Unrecognized ''-r'' stem (doesn't end in ''-er'' or ''-ur''): " .. stem)
end
stem, original = args[2], stem
end
local us = "us"
local a_sf = "a"
local um = "um"
local ae_gsf = "ae"
local am = "am"
local a_macron = "ā"
local i_pl = stem .. "ī"
if types.greekA or types.greekE then
insert_if_not(data.title, "griego")
insert_if_not(categories, "LA:Sustantivos griegos")
if types.greekA then
us = "os"
um = "on"
am = "ān"
else
us = "os"
a_sf = "ē"
um = "on"
ae_gsf = "ēs"
am = "ēn"
a_macron = "ē"
end
i_pl = {i_pl, stem .. "oe"}
end
forms["nom_sg_m"] = original or (stem .. us)
forms["nom_sg_f"] = stem .. a_sf
forms["nom_sg_n"] = stem .. um
forms["nom_pl_m"] = i_pl
forms["nom_pl_f"] = stem .. "ae"
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ī"
forms["gen_sg_f"] = stem .. ae_gsf
forms["gen_sg_n"] = stem .. "ī"
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_f"] = stem .. "ārum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_sg_m"] = stem .. "ō"
forms["dat_sg_f"] = stem .. "ae"
forms["dat_sg_n"] = stem .. "ō"
forms["dat_pl_m"] = stem .. "īs"
forms["dat_pl_f"] = stem .. "īs"
forms["dat_pl_n"] = stem .. "īs"
forms["acc_sg_m"] = stem .. um
forms["acc_sg_f"] = stem .. am
forms["acc_sg_n"] = stem .. um
forms["acc_pl_m"] = stem .. "ōs"
forms["acc_pl_f"] = stem .. "ās"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ō"
forms["abl_sg_f"] = stem .. a_macron
forms["abl_sg_n"] = stem .. "ō"
forms["abl_pl_m"] = stem .. "īs"
forms["abl_pl_f"] = stem .. "īs"
forms["abl_pl_n"] = stem .. "īs"
forms["voc_sg_m"] = original or (stem .. "e")
forms["voc_sg_f"] = stem .. a_sf
forms["voc_sg_n"] = stem .. um
forms["voc_pl_m"] = i_pl
forms["voc_pl_f"] = stem .. "ae"
forms["voc_pl_n"] = stem .. "a"
if types.ius then
insert_if_not(data.title, "pronominal")
--insert_if_not(subtitles, "with genitive singular in ''-ī̆us'' and dative singular in ''-ī''")
forms["gen_sg_m"] = stem .. "ī̆us"
forms["gen_sg_f"] = stem .. "ī̆us"
forms["gen_sg_n"] = stem .. "ī̆us"
forms["dat_sg_m"] = stem .. "ī"
forms["dat_sg_f"] = stem .. "ī"
forms["dat_sg_n"] = stem .. "ī"
elseif types.not_ius then
insert_if_not(data.title, "no pronominal")
--insert_if_not(subtitles, "with normal genitive and dative singular")
end
if stem == "me" then
forms["voc_sg_m"] = "mī"
end
if types.ic then
--insert_if_not(subtitles, "with genitive singular ending in ''-ius'' and dative singular ending in ''-ic''")
local oc = "oc"
local oc_macron = "ōc"
if stem == "ill" then
oc = "uc"
oc_macron = "ūc"
end
forms["nom_sg_m"] = stem .. "ic"
forms["nom_sg_f"] = stem .. "aec"
forms["nom_sg_n"] = stem .. oc
forms["nom_pl_n"] = stem .. "aec"
forms["gen_sg_m"] = stem .. "uius"
forms["gen_sg_f"] = stem .. "uius"
forms["gen_sg_n"] = stem .. "uius"
forms["dat_sg_m"] = stem .. "uic"
forms["dat_sg_f"] = stem .. "uic"
forms["dat_sg_n"] = stem .. "uic"
forms["acc_sg_m"] = stem .. "unc"
forms["acc_sg_f"] = stem .. "anc"
forms["acc_sg_n"] = stem .. oc
forms["acc_pl_n"] = stem .. "aec"
forms["abl_sg_m"] = stem .. "ōc"
forms["abl_sg_f"] = stem .. "āc"
forms["abl_sg_n"] = stem .. oc_macron
forms["voc_sg_m"] = {}
forms["voc_sg_f"] = {}
forms["voc_sg_n"] = {}
forms["voc_pl_m"] = {}
forms["voc_pl_f"] = {}
forms["voc_pl_n"] = {}
end
if types.distr then
if stem:sub(-1) == "n" then
forms["gen_pl_m"] = {stem .. "um", stem .. "ōrum{R}"}
forms["gen_pl_f"] = {stem .. "um", stem .. "ārum{R}"}
forms["gen_pl_n"] = {stem .. "um", stem .. "ōrum{R}"}
else
error("Unrecognized distributive numeral stem (doesn't end in ''n''): " .. stem)
end
end
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
adj_decl["1-1+"] = function(data, args)
local forms, subtitles, categories = data.forms, data.subtitles, data.categories
local stem = args[1]
insert_if_not(data.title, "primera declinación")
insert_if_not(categories, "LA:Adjetivos de la primera declinación")
forms["nom_sg_m"] = stem .. "a"
forms["nom_pl_m"] = stem .. "ae"
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ae"
forms["gen_pl_m"] = stem .. "ārum"
forms["dat_sg_m"] = stem .. "ae"
forms["dat_pl_m"] = stem .. "īs"
forms["acc_sg_m"] = stem .. "am"
forms["acc_sg_n"] = stem .. "a"
forms["acc_pl_m"] = stem .. "ās"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ā"
forms["abl_pl_m"] = stem .. "īs"
forms["voc_sg_m"] = stem .. "a"
forms["voc_pl_m"] = stem .. "ae"
forms["voc_pl_n"] = stem .. "a"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
end
adj_decl["2-2+"] = function(data, args)
local forms, types, pos, subtitles, categories = data.forms, data.types, data.pos, data.subtitles, data.categories
local stem = args[1]
insert_if_not(data.title, "segunda declinación")
insert_if_not(categories, "LA:Adjetivos de la segunda declinación")
local us = "us"
local um = "um"
local i_pl = stem .. "ī"
if types.greek then
insert_if_not(data.title, "griego")
insert_if_not(categories, "LA:Sustantivos griegos")
us = "os"
um = "on"
i_pl = {i_pl, stem .. "oe"}
end
forms["nom_sg_m"] = stem .. us
forms["nom_sg_n"] = stem .. um
forms["nom_pl_m"] = i_pl
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ī"
forms["gen_sg_n"] = stem .. "ī"
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_sg_m"] = stem .. "ō"
forms["dat_sg_n"] = stem .. "ō"
forms["dat_pl_m"] = stem .. "īs"
forms["dat_pl_n"] = stem .. "īs"
forms["acc_sg_m"] = stem .. um
forms["acc_sg_n"] = stem .. um
forms["acc_pl_m"] = stem .. "ōs"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ō"
forms["abl_sg_n"] = stem .. "ō"
forms["abl_pl_m"] = stem .. "īs"
forms["abl_pl_n"] = stem .. "īs"
forms["voc_sg_m"] = stem .. "e"
forms["voc_sg_n"] = stem .. um
forms["voc_pl_m"] = i_pl
forms["voc_pl_n"] = stem .. "a"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
local function abl_i_e(...)
local function update_slot(forms, slot, f, do_copy)
if not forms[slot] then
return do_copy
elseif do_copy then
f = deep_copy(f)
end
forms[slot] = f
return true
end
function abl_i_e(stem, forms, types)
local f, do_copy
if types["abl_e_i"] then
f = {stem .. "e", stem .. "ī"}
elseif types["abl_i_e"] then
f = {stem .. "ī", stem .. "e"}
else
return
end
do_copy = update_slot(forms, "abl_sg_m", f, do_copy)
do_copy = update_slot(forms, "abl_sg_f", f, do_copy)
-- Neuter doesn't take -e with i-stems.
if not types.I then
update_slot(forms, "abl_sg_n", f, do_copy)
end
end
return abl_i_e(...)
end
adj_decl["3-1+"] = function(data, args)
local forms, types, pos, subtitles, notes, categories = data.forms, data.types, data.pos, data.subtitles, data.notes, data.categories
local stem1, stem2 = args[1], args[2]
-- local singpos = singularize(pos)
insert_if_not(data.title, "tercera declinación, dos terminaciones")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación con dos terminaciones")
forms["nom_sg_m"] = stem1
forms["nom_sg_n"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1
forms["acc_pl_m"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
abl_i_e(stem2, forms, types)
forms["voc_sg_m"] = stem1
forms["voc_sg_n"] = stem1
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
if types.par then
forms["nom_pl_n"] = stem2 .. "a"
forms["gen_pl_m"] = stem2 .. "um"
forms["gen_pl_n"] = stem2 .. "um"
forms["abl_sg_m"] = stem2 .. "e"
forms["abl_sg_n"] = stem2 .. "e"
forms["loc_sg_m"] = {stem2 .. "ī", stem2 .. "e"} -- Really?
forms["loc_sg_n"] = {stem2 .. "ī", stem2 .. "e"} -- Why does this happen?
forms["acc_pl_n"] = stem2 .. "a"
forms["voc_pl_n"] = stem2 .. "a"
end
local es_base = stem1:match("^(.-)ēs$")
if es_base and es_base == stem2 then
if types.greek then
forms["nom_sg_n"] = {stem2 .. "ē̆s{?}"}
forms["acc_sg_n"] = {stem2 .. "ē̆s{?}"}
forms["voc_sg_m"] = {stem2 .. "ē̆s{?}"}
forms["voc_sg_n"] = {stem2 .. "ē̆s{?}"}
forms["nom_pl_n"] = {stem2 .. "a{?}", stem2 .. "ia{?}"}
forms["acc_pl_n"] = {stem2 .. "a{?}", stem2 .. "ia{?}"}
forms["voc_pl_n"] = {stem2 .. "a{?}", stem2 .. "ia{?}"}
forms["abl_sg_m"] = {stem2 .. "e{?}", stem2 .. "ī{?}"}
forms["abl_sg_n"] = {stem2 .. "e{?}", stem2 .. "ī{?}"}
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["gen_pl_m"] = {stem2 .. "um{?}", stem2 .. "ium{?}"}
forms["gen_pl_n"] = {stem2 .. "um{?}", stem2 .. "ium{?}"}
insert_if_not(data.title, "griego")
insert_if_not(categories, "LA:Adjetivos griegos")
elseif types.not_greek then
insert_if_not(data.title, "no griego")
end
end
end
adj_decl["3-def+"] = function(data, args)
local forms, types, pos, subtitles, notes, categories = data.forms, data.types, data.pos, data.subtitles, data.notes, data.categories
local stem1, stem2 = args[1], args[2]
-- local singpos = singularize(pos)
insert_if_not(data.title, "tercera declinación, defectivo")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación")
forms["nom_sg_m"] = stem1
forms["nom_sg_n"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1
forms["acc_pl_m"] = stem2 .. "ēs"
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
forms["voc_sg_m"] = stem1
forms["voc_sg_n"] = stem1
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
if types.tor then
insert_if_not(data.title, "tercera declinación, solo en masculino")
insert_if_not(categories, "LA:Adjetivos solo en masculino")
remove_forms(forms, {"_f$", "_n$"})
forms["nom_sg_m"] = stem1
forms["gen_sg_m"] = stem2 .. "is"
forms["dat_sg_m"] = stem2 .. "ī"
forms["acc_sg_m"] = stem2 .. "em"
forms["abl_sg_m"] = stem2 .. "e"
forms["voc_sg_m"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["gen_pl_m"] = stem2 .. "um"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["acc_pl_m"] = stem2 .. "ēs"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["voc_pl_m"] = stem2 .. "ēs"
end
if types.trix then
insert_if_not(data.title, "tercera declinación, solo en femenino o en neutro plural")
insert_if_not(categories, "LA:Adjetivos solo en femenino")
insert_if_not(categories, "LA:Adjetivos solo en neutro")
remove_forms(forms, {"_m$", "sg_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = stem2 .. "is"
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = stem2 .. "em"
forms["abl_sg_f"] = {stem2 .. "e", stem2 .. "ī"}
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = stem2 .. "ēs"
forms["gen_pl_f"] = stem2 .. "ium"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = stem2 .. "ēs"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = stem2 .. "ēs"
end
if types.trixf then
insert_if_not(data.title, "tercera declinación, solo en femenino")
insert_if_not(categories, "LA:Adjetivos solo en femenino")
remove_forms(forms, {"_m$","_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = stem2 .. "is"
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = stem2 .. "em"
forms["abl_sg_f"] = {stem2 .. "e", stem2 .. "ī"}
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = stem2 .. "ēs"
forms["gen_pl_f"] = stem2 .. "ium"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = stem2 .. "ēs"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = stem2 .. "ēs"
end
if types.idis then
insert_if_not(data.title, "tercera declinación, solo en femenino")
insert_if_not(categories, "LA:Adjetivos solo en femenino")
remove_forms(forms, {"_m$","_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = {stem2 .. "is", stem2 .. "os"}
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = {stem2 .. "em", stem2 .. "a"}
forms["abl_sg_f"] = stem2 .. "e"
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = {stem2 .. "ēs", stem2 .. "es"}
forms["gen_pl_f"] = stem2 .. "um"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = {stem2 .. "ēs", stem2 .. "as"}
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = {stem2 .. "ēs", stem2 .. "es"}
end
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
adj_decl["3-C+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem1 = args[1]
local stem2 = stem1 .. "ōr"
insert_if_not(data.title, "tercera declinación, comparativo")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación")
insert_if_not(categories, "LA:Adjetivos comparativos")
forms["nom_sg_m"] = stem1 .. "or"
forms["nom_sg_n"] = stem1 .. "us"
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "a"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "um"
forms["gen_pl_n"] = stem2 .. "um"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1 .. "us"
forms["acc_pl_m"] = {stem2 .. "ēs", stem2 .. "īs"}
forms["acc_pl_n"] = stem2 .. "a"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
abl_i_e(stem2, forms, types)
forms["voc_sg_m"] = stem1 .. "or"
forms["voc_sg_n"] = stem1 .. "us"
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "a"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
adj_decl["3-P+"] = function(data, args)
local forms, notes = data.forms, data.notes
local stem2 = args[2]
adj_decl["3-1+"](data, args)
insert_if_not(data.title, "tercera declinación, participio")
insert_if_not(data.categories, "LA:Adjetivos de la tercera declinación")
forms["abl_sg_m"] = {stem2 .. "e{PART}", stem2 .. "ī{ADJ}"}
forms["abl_sg_n"] = {stem2 .. "e{PART}", stem2 .. "ī{ADJ}"}
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["acc_pl_m"] = {stem2 .. "ēs", stem2 .. "īs"}
end
adj_decl["3-2+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem = args[1]
-- local singpos = singularize(pos)
insert_if_not(data.title, "tercera declinación, dos terminaciones")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación con dos terminaciones")
forms["nom_sg_m"] = stem .. "is"
forms["nom_sg_n"] = stem .. "e"
forms["nom_pl_m"] = stem .. "ēs"
forms["nom_pl_n"] = stem .. "ia"
forms["gen_sg_m"] = stem .. "is"
forms["gen_sg_n"] = stem .. "is"
forms["gen_pl_m"] = stem .. "ium"
forms["gen_pl_n"] = stem .. "ium"
forms["dat_sg_m"] = stem .. "ī"
forms["dat_sg_n"] = stem .. "ī"
forms["dat_pl_m"] = stem .. "ibus"
forms["dat_pl_n"] = stem .. "ibus"
forms["acc_sg_m"] = stem .. "em"
forms["acc_sg_n"] = stem .. "e"
forms["acc_pl_m"] = {stem .. "īs", stem .. "ēs"}
forms["acc_pl_n"] = stem .. "ia"
forms["abl_sg_m"] = stem .. "ī"
forms["abl_sg_n"] = stem .. "ī"
forms["abl_pl_m"] = stem .. "ibus"
forms["abl_pl_n"] = stem .. "ibus"
-- abl_i_e(stem, forms, types) -- enable once [[Module:la-nominal]] has ben updated
forms["voc_sg_m"] = stem .. "is"
forms["voc_sg_n"] = stem .. "e"
forms["voc_pl_m"] = stem .. "ēs"
forms["voc_pl_n"] = stem .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
adj_decl["3-3+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem1, stem2 = args[1], args[2]
-- local singpos = singularize(pos)
insert_if_not(data.title, "tercera declinación")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación")
insert_if_not(categories, "LA:Adjetivos de la tercera declinación con tres terminaciones")
forms["nom_sg_m"] = stem1
forms["nom_sg_f"] = stem2 .. "is"
forms["nom_sg_n"] = stem2 .. "e"
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_f"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_f"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_f"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_f"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_f"] = stem2 .. "em"
forms["acc_sg_n"] = stem2 .. "e"
forms["acc_pl_m"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_f"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_f"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
-- abl_i_e(stem2, forms, types) -- enable once [[Module:la-nominal]] has ben updated
forms["voc_sg_m"] = stem1
forms["voc_sg_f"] = stem2 .. "is"
forms["voc_sg_n"] = stem2 .. "e"
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_f"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
end
adj_decl["indecl+"] = function(data, args)
local forms, subtitles, categories = data.forms, data.subtitles, data.categories
local stem = args[1]
insert_if_not(data.title, "indeclinable")
insert_if_not(categories, "LA:Adjetivos indeclinables")
forms["nom_sg_m"] = stem
forms["nom_pl_m"] = {}
forms["gen_sg_m"] = {}
forms["gen_pl_m"] = {}
forms["dat_sg_m"] = {}
forms["dat_pl_m"] = {}
forms["acc_sg_m"] = stem
forms["acc_pl_m"] = {}
forms["abl_sg_m"] = {}
forms["abl_pl_m"] = {}
forms["voc_sg_m"] = {}
forms["voc_pl_m"] = {}
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
end
adj_decl["irreg+"] = function(data,args)
local forms, types, pos, notes, categories = data.forms, data.types, data.pos, data.notes, data.categories
local arg1 = args[1]
insert_if_not(data.title, "irregular")
insert_if_not(categories, "LA:Adjetivos irregulares")
if arg1 == "duo" or arg1 == "ambō" then
local stem = sub(arg1, 1, -2)
-- data.title = stem == "amb" and "irregular adjective" or "numeral"
data.num = "pl"
local stem_with_o = stem .. (stem == "amb" and "ō" or "o")
forms["nom_pl_m"] = stem_with_o
forms["nom_pl_f"] = stem .. "ae"
forms["nom_pl_n"] = stem_with_o
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_f"] = stem .. "ārum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_pl_m"] = stem .. "ōbus"
forms["dat_pl_f"] = stem .. "ābus"
forms["dat_pl_n"] = stem .. "ōbus"
forms["acc_pl_m"] = {stem .. "ōs", stem_with_o}
forms["acc_pl_f"] = stem .. "ās"
forms["acc_pl_n"] = stem_with_o
forms["abl_pl_m"] = stem .. "ōbus"
forms["abl_pl_f"] = stem .. "ābus"
forms["abl_pl_n"] = stem .. "ōbus"
forms["voc_pl_m"] = stem_with_o
forms["voc_pl_f"] = stem .. "ae"
forms["voc_pl_n"] = stem_with_o
if stem == "du" then
forms["gen_pl_m"] = {forms["gen_pl_m"], "duum", "duom{†}"}
forms["gen_pl_n"] = {forms["gen_pl_n"], "duum", "duom{†}"}
end
elseif arg1:sub(-6) == "mīlle" then
insert_if_not(data.title, "numeral semiindeclinable")
local stem = arg1:sub(1, -3)
forms["nom_sg_m"] = stem .. "le"
forms["nom_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["gen_sg_m"] = stem .. "le"
forms["gen_pl_m"] = {stem .. "ium", stem .. "lium"}
forms["dat_sg_m"] = stem .. "le"
forms["dat_pl_m"] = {stem .. "ibus", stem .. "libus"}
forms["acc_sg_m"] = stem .. "le"
forms["acc_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["abl_sg_m"] = stem .. "le"
forms["abl_pl_m"] = {stem .. "ibus", stem .. "libus"}
forms["voc_sg_m"] = stem .. "le"
forms["voc_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
elseif arg1 == "ille" or arg1 == "iste" or arg1 == "ipse" or arg1 == "olle" then
local stem = arg1:sub(1, -2)
types.ius = true
adj_decl["1&2+"](data, {stem})
insert_if_not(data.title, "demostrativo") -- .. " " .. singularize(data.pos)
forms["nom_sg_m"] = arg1
if arg1 == "ipse" then
add_form(forms, "nom_sg_n", stem, "ud{MED}")
add_form(forms, "acc_sg_n", stem, "ud{MED}")
else
forms["nom_sg_n"] = stem .. "ud"
forms["acc_sg_n"] = stem .. "ud"
end
forms["voc_sg_m"] = {}
forms["voc_sg_f"] = {}
forms["voc_sg_n"] = {}
forms["voc_pl_m"] = {}
forms["voc_pl_f"] = {}
forms["voc_pl_n"] = {}
elseif arg1 == "illic" or arg1 == "istic" or arg1 == "isthic" then
insert_if_not(data.title, "demostrativo") -- .. " " .. singularize(data.pos)
local stem = arg1:sub(1, -3)
forms["nom_sg_m"] = stem .. "ic"
forms["nom_sg_f"] = stem .. "aec"
forms["nom_sg_n"] = {stem .. "uc", stem .. "ucce", stem .. "oc"}
forms["gen_sg_m"] = stem .. "ī̆usce"
forms["gen_sg_f"] = stem .. "ī̆usce"
forms["gen_sg_n"] = stem .. "ī̆usce"
forms["dat_sg_m"] = stem .. "īc"
forms["dat_sg_f"] = stem .. "īc"
forms["dat_sg_n"] = stem .. "īc"
forms["acc_sg_m"] = stem .. "unc"
forms["acc_sg_f"] = stem .. "anc"
forms["acc_sg_n"] = {stem .. "uc", stem .. "ucce", stem .. "oc"}
forms["abl_sg_m"] = stem .. "ōc"
forms["abl_sg_f"] = stem .. "āc"
forms["abl_sg_n"] = stem .. "ōc"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["nom_pl_m"] = stem .. "īsce"
forms["nom_pl_f"] = stem .. "aec"
forms["nom_pl_n"] = stem .. "aec"
forms["gen_pl_m"] = stem .. "ōrunc{?}"
forms["gen_pl_f"] = stem .. "ārunc{?}"
forms["gen_ok_n"] = stem .. "ōrunc{?}"
forms["dat_pl_m"] = stem .. "īsce"
forms["dat_pl_f"] = stem .. "īsce"
forms["dat_pl_n"] = stem .. "īsce"
forms["acc_pl_m"] = stem .. "ōsce"
forms["acc_pl_f"] = stem .. "āsce"
forms["acc_pl_n"] = stem .. "aec"
forms["abl_pl_m"] = stem .. "īsce"
forms["abl_pl_f"] = stem .. "īsce"
forms["abl_pl_n"] = stem .. "īsce"
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
elseif arg1 == "hice" then
insert_if_not(data.title, "demostrativo") -- .. " pronoun"
forms["nom_sg_m"] = "hice"
forms["nom_sg_f"] = "haece"
forms["nom_sg_n"] = "hoce"
forms["nom_pl_m"] = "hīce"
forms["nom_pl_f"] = "haece"
forms["nom_pl_n"] = "haece"
forms["gen_sg_m"] = "huiusce"
forms["gen_sg_f"] = "huiusce"
forms["gen_sg_n"] = "huiusce"
forms["gen_pl_m"] = {"hōrunce", "hōrumce"}
forms["gen_pl_f"] = {"hārunce", "hārumce"}
forms["gen_pl_n"] = {"hōrunce", "hōrumce"}
forms["dat_sg_m"] = "huīce"
forms["dat_sg_f"] = "huīce"
forms["dat_sg_n"] = "huīce"
forms["dat_pl_m"] = "hīsce"
forms["dat_pl_f"] = "hīsce"
forms["dat_pl_n"] = "hīsce"
forms["acc_sg_m"] = "hunce"
forms["acc_sg_f"] = "hance"
forms["acc_sg_n"] = "hoce"
forms["acc_pl_m"] = "hōsce"
forms["acc_pl_f"] = "hāsce"
forms["acc_pl_n"] = "haece"
forms["abl_sg_m"] = "hōce"
forms["abl_sg_f"] = "hāce"
forms["abl_sg_n"] = "hōce"
forms["abl_pl_m"] = "hīsce"
forms["abl_pl_f"] = "hīsce"
forms["abl_pl_n"] = "hīsce"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
elseif arg1 == "plūs" then
insert_if_not(data.title, "comparativo")
insert_if_not(data.categories, "LA:Sustantivos de la tercera declinación")
insert_if_not(data.categories, "LA:Sustantivos de la tercera declinación con una terminación")
data.note = "Ninguna de las formas en singular se usaron en latín clásico"
forms["nom_sg_n"] = "plūs"
forms["nom_pl_m"] = "plūrēs"
forms["nom_pl_n"] = "plūra"
forms["gen_sg_m"] = "plūris"
forms["gen_sg_n"] = "plūris"
forms["gen_pl_m"] = "plūrium"
forms["gen_pl_n"] = "plūrium"
forms["dat_sg_m"] = "plūrī"
forms["dat_sg_n"] = "plūrī"
forms["dat_pl_m"] = "plūribus"
forms["dat_pl_n"] = "plūribus"
forms["acc_sg_m"] = "plūrem"
forms["acc_sg_f"] = "plūrem"
forms["acc_sg_n"] = "plūs"
forms["acc_pl_m"] = {"plūrēs", "plūrīs"}
forms["acc_pl_n"] = "plūra"
forms["abl_sg_m"] = {"plūrī", "plūre"}
forms["abl_sg_f"] = {"plūrī", "plūre"}
forms["abl_sg_n"] = {"plūrī", "plūre"}
forms["abl_pl_m"] = "plūribus"
forms["abl_pl_n"] = "plūribus"
forms["voc_sg_n"] = "plūs"
forms["voc_pl_m"] = "plūrēs"
forms["voc_pl_n"] = "plūra"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
elseif match(arg1, "^egō̆?$") or arg1 == "nōs" then
insert_if_not(data.title, "pronombre nominativo")
forms["nom_sg_m"] = arg1
forms["nom_pl_m"] = "nōs"
forms["gen_sg_m"] = "meī"
forms["gen_pl_m"] = {"nostrī", "nostrum"}
forms["dat_sg_m"] = "mihī̆"
forms["dat_pl_m"] = "nōbīs"
forms["acc_sg_m"] = {"mē", "mēmē"}
forms["acc_pl_m"] = "nōs"
forms["abl_sg_m"] = {"mē", "mēmē"}
forms["abl_pl_m"] = "nōbīs"
forms["voc_sg_m"] = arg1
forms["voc_pl_m"] = "nōs"
elseif arg1 == "tū" or arg1 == "vōs" then
insert_if_not(data.title, "pronombre nominativo")
forms["nom_sg_m"] = arg1
forms["nom_pl_m"] = "vōs"
forms["gen_sg_m"] = "tuī"
forms["gen_pl_m"] = {"vestrī", "vestrum"}
forms["dat_sg_m"] = "tibī̆"
forms["dat_pl_m"] = "vōbīs"
forms["acc_sg_m"] = {"tē", "tētē"}
forms["acc_pl_m"] = "vōs"
forms["abl_sg_m"] = {"tē", "tētē"}
forms["abl_pl_m"] = "vōbīs"
forms["voc_sg_m"] = arg1
forms["voc_pl_m"] = "vōs"
elseif arg1 == "suī" then
insert_if_not(data.title, "pronombre reflexivo")
forms["nom_sg_m"] = {}
forms["nom_pl_m"] = {}
forms["gen_sg_m"] = arg1
forms["gen_pl_m"] = forms["gen_sg_m"]
forms["dat_sg_m"] = "sibī̆"
forms["dat_pl_m"] = forms["dat_sg_m"]
forms["acc_sg_m"] = {"sē", "sēsē"}
forms["acc_pl_m"] = {"sē", "sēsē"}
forms["abl_sg_m"] = {"sē", "sēsē"}
forms["abl_pl_m"] = {"sē", "sēsē"}
forms["voc_sg_m"] = {}
forms["voc_pl_m"] = {}
elseif arg1 == "is" or arg1 == "īdem" then
insert_if_not(data.title, "pronombre demostrativo")
forms["nom_sg_m"] = "is"
forms["nom_sg_f"] = "ea"
forms["nom_sg_n"] = "id"
forms["nom_pl_m"] = {"iī", "eī", "ī"}
forms["nom_pl_f"] = "eae"
forms["nom_pl_n"] = "ea"
forms["gen_sg_m"] = {"eius", "ejus"}
forms["gen_sg_f"] = {"eius", "ejus"}
forms["gen_sg_n"] = {"eius", "ejus"}
forms["gen_pl_m"] = {"eōrum", "eum"}
forms["gen_pl_f"] = "eārum"
forms["gen_pl_n"] = {"eōrum", "eum"}
forms["dat_sg_m"] = {"eī", "e͡i", "ēī"}
forms["dat_sg_f"] = {"eī", "e͡i", "ēī", "eae"}
forms["dat_sg_n"] = {"eī", "e͡i", "ēī"}
forms["dat_pl_m"] = {"iīs", "eīs", "īs"}
forms["dat_pl_f"] = {"iīs", "eīs", "īs", "eābus"}
forms["dat_pl_n"] = {"iīs", "eīs", "īs"}
forms["acc_sg_m"] = "eum"
forms["acc_sg_f"] = "eam"
forms["acc_sg_n"] = "id"
forms["acc_pl_m"] = "eōs"
forms["acc_pl_f"] = "eās"
forms["acc_pl_n"] = "ea"
forms["abl_sg_m"] = "eō"
forms["abl_sg_f"] = "eā"
forms["abl_sg_n"] = "eō"
forms["abl_pl_m"] = {"iīs", "eīs", "īs"}
forms["abl_pl_f"] = {"iīs", "eīs", "īs"}
forms["abl_pl_n"] = {"iīs", "eīs", "īs"}
if arg1 == "īdem" then
forms["nom_sg_m"] = "ī"
forms["nom_sg_n"] = "i"
forms["acc_sg_n"] = "i"
end
elseif arg1 == "quis" or arg1 == "quī" then
data.note = "La forma ''qua'' es preferida frente a ''quae'' cuando se usa como indefinido"
local id = "id"
if arg1 == "quī" then
insert_if_not(data.title, "determinante relativo/interrogativo")
id = "od"
forms["nom_sg_m"] = {"quī", "quis", "quei{†}"}
forms["nom_sg_f"] = {"quae", "qua"}
forms["acc_sg_f"] = "quam"
forms["abl_sg_m"] = "quō"
forms["abl_sg_f"] = "quā"
forms["abl_sg_n"] = "quō"
else
insert_if_not(data.title, "pronombre relativo/interrogativo")
forms["nom_sg_m"] = {"quis", "quī"}
forms["nom_sg_f"] = {"quae", "qua", "quis{†}"}
forms["acc_sg_f"] = {"quam", "quem{†}"}
forms["abl_sg_m"] = {"quō", "quī"}
forms["abl_sg_f"] = {"quā", "quī"}
forms["abl_sg_n"] = {"quō", "quī"}
end
forms["nom_sg_n"] = "qu"..id
forms["nom_pl_m"] = {"quī", "quei{†}"}
forms["nom_pl_f"] = "quae"
forms["nom_pl_n"] = {"quae", "qua"}
forms["gen_sg_m"] = {"cuius", "quoius{†}"}
forms["gen_sg_f"] = {"cuius", "quoius{†}"}
forms["gen_sg_n"] = {"cuius", "quoius{†}"}
forms["gen_pl_m"] = "quōrum"
forms["gen_pl_f"] = "quārum"
forms["gen_pl_n"] = "quōrum"
forms["dat_sg_m"] = {"cui", "quoi{†}", "quoiei{†}"}
forms["dat_sg_f"] = {"cui", "quoi{†}", "quoiei{†}"}
forms["dat_sg_n"] = {"cui", "quoi{†}", "quoiei{†}"}
forms["dat_pl_m"] = {"quibus", "quīs", "queis{†}"}
forms["dat_pl_f"] = {"quibus", "quīs", "queis{†}"}
forms["dat_pl_n"] = {"quibus", "quīs", "queis{†}"}
forms["acc_sg_m"] = "quem"
forms["acc_sg_n"] = "qu"..id
forms["acc_pl_m"] = "quōs"
forms["acc_pl_f"] = "quās"
forms["acc_pl_n"] = {"quae", "qua"}
forms["abl_pl_m"] = {"quibus", "quīs", "queis{†}"}
forms["abl_pl_f"] = {"quibus", "quīs", "queis{†}"}
forms["abl_pl_n"] = {"quibus", "quīs", "queis{†}"}
elseif arg1 == "aliquī" then
insert_if_not(data.title, "determinante indefinido")
forms["nom_sg_m"] = {"aliquī{DET/ADJ}", "aliquis{PRON/SUST}"}
forms["nom_sg_f"] = {"aliqua", "aliquae{R}"}
forms["nom_sg_n"] = "aliquod"
forms["nom_pl_m"] = "aliquī"
forms["nom_pl_f"] = "aliquae"
forms["nom_pl_n"] = "aliqua"
forms["gen_sg_m"] = {"alicuius", "aliquoius{†}"}
forms["gen_sg_f"] = {"alicuius", "aliquoius{†}"}
forms["gen_sg_n"] = {"alicuius", "aliquoius{†}"}
forms["gen_pl_m"] = "aliquōrum"
forms["gen_pl_f"] = "aliquārum"
forms["gen_pl_n"] = "aliquōrum"
forms["dat_sg_m"] = {"alicui", "aliquoi{†}"}
forms["dat_sg_f"] = {"alicui", "aliquoi{†}"}
forms["dat_sg_n"] = {"alicui", "aliquoi{†}"}
forms["dat_pl_m"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
forms["dat_pl_f"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
forms["dat_pl_n"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
forms["acc_sg_m"] = "aliquem"
forms["acc_sg_f"] = "aliquam"
forms["acc_sg_n"] = "aliquod"
forms["acc_pl_m"] = "aliquōs"
forms["acc_pl_f"] = "aliquās"
forms["acc_pl_n"] = "aliqua"
forms["abl_sg_m"] = "aliquō"
forms["abl_sg_f"] = "aliquā"
forms["abl_sg_n"] = "aliquō"
forms["abl_pl_m"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
forms["abl_pl_f"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
forms["abl_pl_n"] = {"aliquīs", "aliquibus", "aliqueis{†}"}
elseif arg1 == "quisquam" then
insert_if_not(data.title, "determinante indefinido, concordancia en negativo")
data.note = "En latín clásico, era preferidas las formas de ''ūllus'' en lugar de las esta voz para el femenino y el neutro."
forms["nom_sg_m"] = "quisquam"
forms["nom_sg_f"] = {"quaequam", "quisquam{†}"}
forms["nom_sg_n"] = "quodquam"
forms["nom_pl_m"] = "quīquam"
forms["nom_pl_f"] = "quaequam"
forms["nom_pl_n"] = "quaequam"
forms["gen_sg_m"] = "cuiusquam"
forms["gen_sg_f"] = "cuiusquam"
forms["gen_sg_n"] = "cuiusquam"
forms["gen_pl_m"] = "quōrumquam"
forms["gen_pl_f"] = "quārumquam"
forms["gen_pl_n"] = "quōrumquam"
forms["dat_sg_m"] = "cuiquam"
forms["dat_sg_f"] = "cuiquam"
forms["dat_sg_n"] = "cuiquam"
forms["dat_pl_m"] = "quibusquam"
forms["dat_pl_f"] = "quibusquam"
forms["dat_pl_n"] = "quibusquam"
forms["acc_sg_m"] = "quemquam"
forms["acc_sg_f"] = {"quamquam", "quemquam{†}"}
forms["acc_sg_n"] = "quodquam"
forms["acc_pl_m"] = "quōsquam"
forms["acc_pl_f"] = "quāsquam"
forms["acc_pl_n"] = "quaequam"
forms["abl_sg_m"] = {"quōquam", "quīquam{†}"}
forms["abl_sg_f"] = "quāquam"
forms["abl_sg_n"] = "quōquam"
forms["abl_pl_m"] = "quibusquam"
forms["abl_pl_f"] = "quibusquam"
forms["abl_pl_n"] = "quibusquam"
forms["voc_sg_m"] = "quisquam"
forms["voc_sg_f"] = "quaequam"
forms["voc_sg_n"] = "quodquam"
forms["voc_pl_m"] = "quīquam"
forms["voc_pl_f"] = "quaequam"
forms["voc_pl_n"] = "quaequam"
elseif arg1 == "quisquis" then
insert_if_not(data.title, "pronombre relativo/interrogativo")
forms["nom_sg_m"] = "quisquis"
forms["nom_sg_f"] = "quisquis"
forms["nom_sg_n"] = {"quidquid", "quicquid"}
forms["nom_pl_m"] = "quīquī"
forms["nom_pl_f"] = "quaequae"
forms["nom_pl_n"] = "quaequae"
forms["gen_sg_m"] = "cuiuscuius"
forms["gen_sg_f"] = "cuiuscuius"
forms["gen_sg_n"] = "cuiuscuius"
forms["gen_pl_m"] = "quōrumquōrum"
forms["gen_pl_f"] = "quārumquārum"
forms["gen_pl_n"] = "quōrumquōrum"
forms["dat_sg_m"] = "cuicui"
forms["dat_sg_f"] = "cuicui"
forms["dat_sg_n"] = "cuicui"
forms["dat_pl_m"] = {"quibusquibus", "quīsquīs"}
forms["dat_pl_f"] = {"quibusquibus", "quīsquīs"}
forms["dat_pl_n"] = {"quibusquibus", "quīsquīs"}
forms["acc_sg_m"] = "quemquem"
forms["acc_sg_f"] = "quamquam"
forms["acc_sg_n"] = {"quidquid", "quicquid"}
forms["acc_pl_m"] = "quōsquōs"
forms["acc_pl_f"] = "quāsquās"
forms["acc_pl_n"] = "quaequae"
forms["abl_sg_m"] = "quōquō"
forms["abl_sg_f"] = "quāquā"
forms["abl_sg_n"] = "quōquō"
forms["abl_pl_m"] = {"quibusquibus", "quīsquīs"}
forms["abl_pl_f"] = {"quibusquibus", "quīsquīs"}
forms["abl_pl_n"] = {"quibusquibus", "quīsquīs"}
forms["voc_sg_m"] = "quisquis"
forms["voc_sg_f"] = "quisquis"
forms["voc_sg_n"] = {"quidquid", "quicquid"}
forms["voc_pl_m"] = "quīquī"
forms["voc_pl_f"] = "quaequae"
forms["voc_pl_n"] = "quaequae"
elseif arg1 == "ecquis" then
insert_if_not(data.title, "pronombre interrogativo")
forms["nom_sg_m"] = {"ecquis", "ecquī"}
forms["nom_sg_f"] = {"ecqua", "ecquae"}
forms["nom_sg_n"] = "ecquid"
forms["nom_pl_m"] = "ecquī"
forms["nom_pl_f"] = "ecquae"
forms["nom_pl_n"] = {"ecqua", "ecquae"}
forms["gen_sg_m"] = "eccuius"
forms["gen_sg_f"] = "eccuius"
forms["gen_sg_n"] = "eccuius"
forms["dat_sg_m"] = "eccui"
forms["dat_sg_f"] = "eccui"
forms["dat_sg_n"] = "eccui"
forms["acc_sg_m"] = "ecquem"
forms["acc_sg_f"] = "ecquam"
forms["acc_sg_n"] = "ecquod"
forms["acc_pl_m"] = "ecquōs"
forms["acc_pl_f"] = "ecquās"
forms["acc_pl_n"] = {"ecqua", "ecquae"}
forms["abl_sg_m"] = {"ecquō", "ecquī"}
forms["abl_sg_f"] = {"ecquā", "ecquī"}
forms["abl_sg_n"] = {"ecquō", "ecquī"}
elseif arg1 == "quīdam" then
insert_if_not(data.title, "pronombre indefinido")
forms["nom_sg_m"] = "quīdam"
forms["nom_sg_f"] = "quaedam"
forms["nom_sg_n"] = "quiddam"
forms["nom_pl_m"] = {"quīdam", "quēsdam{†}"}
forms["nom_pl_f"] = "quaedam"
forms["nom_pl_n"] = "quaedam"
forms["gen_sg_m"] = {"cuiusdam", "quoiusdam{†}"}
forms["gen_sg_f"] = {"cuiusdam", "quoiusdam{†}"}
forms["gen_sg_n"] = {"cuiusdam", "quoiusdam{†}"}
forms["gen_pl_m"] = {"quōrundam", "quōrumdam"}
forms["gen_pl_f"] = {"quārundam", "quārumdam"}
forms["gen_pl_n"] = {"quōrundam", "quōrumdam"}
forms["dat_sg_m"] = {"cuidam", "quoidam{†}"}
forms["dat_sg_f"] = {"cuidam", "quoidam{†}"}
forms["dat_sg_n"] = {"cuidam", "quoidam{†}"}
forms["dat_pl_m"] = {"quibusdam", "quīsdam{†}"}
forms["dat_pl_f"] = {"quibusdam", "quīsdam{†}"}
forms["dat_pl_n"] = {"quibusdam", "quīsdam{†}"}
forms["acc_sg_m"] = {"quendam", "quemdam"}
forms["acc_sg_f"] = {"quandam", "quamdam"}
forms["acc_sg_n"] = "quiddam"
forms["acc_pl_m"] = {"quōsdam", "quēsdam{†}"}
forms["acc_pl_f"] = "quāsdam"
forms["acc_pl_n"] = "quaedam"
forms["abl_sg_m"] = "quōdam"
forms["abl_sg_f"] = "quādam"
forms["abl_sg_n"] = "quōdam"
forms["abl_pl_m"] = {"quibusdam", "quīsdam{†}"}
forms["abl_pl_f"] = {"quibusdam", "quīsdam{†}"}
forms["abl_pl_n"] = {"quibusdam", "quīsdam{†}"}
elseif arg1 == "nēmō" then
insert_if_not(data.title, "Determinante y pronombre, concordancia en negativo")
forms["nom_sg_m"] = "nēmō"
forms["nom_sg_f"] = "nēmō"
forms["gen_sg_m"] = {"nūllī̆us", "nēminis{R}"}
forms["gen_sg_f"] = {"nūllī̆us", "nēminis{R}"}
forms["dat_sg_m"] = "nēminī"
forms["dat_sg_f"] = "nēminī"
forms["acc_sg_m"] = "nēminem"
forms["acc_sg_f"] = "nēminem"
forms["abl_sg_m"] = {"nūllō", "nēmine{R}"}
forms["abl_sg_f"] = {"nūllā", "nēmine{R}"}
else
error('adjective ' .. arg1 .. ' not recognized')
end
end
local function extract_base(lemma, ending)
if ending:find("(", nil, true) then
return match(lemma, ending)
end
return match(lemma, "^(.*)" .. ending .. "$")
end
local function get_noun_subtype_by_ending(lemma, stem2, decltype, specified_subtypes,
endings_and_subtypes)
for _, ending_and_subtypes in ipairs(endings_and_subtypes) do
local ending = ending_and_subtypes[1]
local subtypes = ending_and_subtypes[2]
local not_this_subtype = false
if (
specified_subtypes.pl and not contains(subtypes, "pl") or
contains(subtypes, "both") and not specified_subtypes.both
) then
-- We now require that plurale tantum terms specify a plural-form lemma.
-- The autodetected subtypes will include 'pl' for such lemmas; if not,
-- we fail this entry. Additionally, if the rule contains 'both', it
-- must be explicitly specified to match.
not_this_subtype = true
else
for _, subtype in ipairs(subtypes) do
-- A subtype is directly canceled by specifying -SUBTYPE.
-- In addition, M or F as a subtype is canceled by N, and
-- vice-versa, but M doesn't cancel F or vice-versa; instead,
-- we simply ignore the conflicting gender specification when
-- constructing the combination of specified and inferred subtypes.
-- The reason for this is that neuters have distinct declensions
-- from masculines and feminines, but masculines and feminines have
-- the same declension, and various nouns in Latin that are
-- normally masculine are exceptionally feminine and vice-versa
-- (nauta, agricola, fraxinus, malus "apple tree", manus, rēs,
-- etc.).
--
-- In addition, sg as a subtype is canceled by pl and vice-versa.
-- It's also possible to specify both, which will override sg but
-- not cancel it (in the sense that it won't prevent the relevant
-- rule from matching). For example, there's a rule specifying that
-- lemmas beginning with a capital letter and ending in -ius take
-- the ius.voci.sg subtypes. Specifying such a lemma with the
-- subtype both will result in the ius.voci.both subtypes, whereas
-- specifying such a lemma with the subtype pl will cause this rule
-- not to match, and it will fall through to a less specific rule
-- that returns just the ius subtype, which will be combined with
-- the explicitly specified pl subtype to produce ius.pl.
if specified_subtypes["-" .. subtype] or
subtype == "N" and (specified_subtypes.M or specified_subtypes.F) or
(subtype == "M" or subtype == "F") and specified_subtypes.N or
subtype == "sg" and specified_subtypes.pl or
subtype == "pl" and specified_subtypes.sg then
not_this_subtype = true
break
end
end
end
if not not_this_subtype then
if type(ending) == "table" then
local lemma_ending = ending[1]
local stem2_ending = ending[2]
local base = extract_base(lemma, lemma_ending)
if base and base .. stem2_ending == stem2 then
return base, stem2, subtypes
end
else
local base = extract_base(lemma, ending)
if base then
return base, stem2, subtypes
end
end
end
end
if decltype then
error("Unrecognized ending for declension-" .. decltype .. " noun: " .. lemma)
end
return lemma, stem2, keys_to_list(specified_subtypes)
end
local patterns = {
{"[mM]a", "%0t"},
{"e", ""},
{"([aoAO])([lr])", "%1" .. MACRON .. "%2"},
{"[eE]l", "%0l"},
{"([mM])en", "%1in"},
{"([tT]ūd)ō", "%1in"},
{"([gG])ō", "%1in"},
{"[ōŌ]", "%1n"},
{"er", "r"},
{"[ēi]s", ""},
{"([āēīōūȳĀĒĪŌŪȲ]n)s", function(v)
return (gsub(toNFD(v), MACRON, "") .. "t")
end},
{"([cC])eps", "%1ipit"},
{"([bp])s", "%1"},
{"us", "or"},
{"s", "t"},
{"ex", "ic"},
{"x", "c"},
}
local function make_stem2(stem)
local n
for _, pattern in ipairs(patterns) do
local key = pattern[1]
stem, n = gsub(stem, key .. "$", pattern[2])
if n > 0 then
-- debug_track("la-utilities/" .. key) REVISAR
return toNFC(stem)
end
end
-- debug_track("la-utilities") REVISAR
return stem
end
local function detect_noun_subtype(lemma, stem2, typ, subtypes)
local base, _
if typ == "1" then
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"ām", {"F", "am"}},
{"ās", {"M", "Greek", "Ma"}},
{"ēs", {"M", "Greek", "Me"}},
{"ē", {"F", "Greek"}},
{"ae", {"F", "pl"}},
{"a", {"F"}},
})
elseif typ == "2" then
local detected_subtypes
lemma, stem2, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"^(.*r)$", {"M", "er"}},
{"^(.*v)os$", {"M", "vos"}},
{"^(.*v)om$", {"N", "vom"}},
-- If the lemma ends in -os and the user said N or -M, then the
-- following won't apply, and the second (neuter) -os will applly.
{"os", {"M", "Greek"}},
{"os", {"N", "Greek", "us"}},
{"on", {"N", "Greek"}},
-- -ius beginning with a capital letter is assumed a proper name,
-- and takes the voci subtype (vocative in -ī) along with the ius
-- subtype and sg-only. Other nouns in -ius just take the ius
-- subtype. Explicitly specify "sg" so that if .pl is given,
-- this rule won't apply.
{"^(%u.*)ius$", {"M", "ius", "voci", "sg"}},
{"ius", {"M", "ius"}},
{"ium", {"N", "ium"}},
-- If the lemma ends in -us and the user said N or -M, then the
-- following won't apply, and the second (neuter) -us will applly.
{"us", {"M"}},
{"us", {"N", "us"}},
{"um", {"N"}},
{"iī", {"M", "ius", "pl"}},
{"ia", {"N", "ium", "pl"}},
-- If the lemma ends in -ī and the user said N or -M, then the
-- following won't apply, and the second (neuter) -ī will applly.
{"ī", {"M", "pl"}},
{"ī", {"N", "us", "pl"}},
{"oe", {"M", "Greek", "pl"}},
{"a", {"N", "pl"}},
})
stem2 = stem2 or lemma
return lemma, stem2, detected_subtypes
elseif typ == "3" then
if subtypes.pl then
if subtypes.Greek then
base = lemma:match("^(.*)erēs$")
if base then
return base .. "ēr", base .. "er", {"er"}
end
base = lemma:match("^(.*)ontēs$")
if base then
return base .. "ōn", base .. "ont", {"on"}
end
base = lemma:match("^(.*)es$")
if base then
return base, stem2 or base, {}
end
error("Unrecognized ending for declension-3 plural Greek noun: " .. lemma)
end
base = lemma:match("^(.*)ia$")
if base then
return base, stem2 or base, {"N", "I", "pure"}
end
base = lemma:match("^(.*)a$")
if base then
return base, stem2 or base, {"N"}
end
base = lemma:match("^(.*)ēs$")
if base then
return base, stem2 or base, {}
end
error("Unrecognized ending for declension-3 plural noun: " .. lemma)
end
stem2 = stem2 or make_stem2(lemma)
local detected_subtypes
if subtypes.Greek then
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"is", ""}, {"I"}},
{"ēr", {"er"}},
{"ōn", {"on"}},
})
if base then
return lemma, stem2, detected_subtypes
end
return lemma, stem2, {}
end
if not subtypes.N then
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"^(%u.*pol)is$", ""}, {"F", "polis", "sg", "loc"}},
{{"tūdō", "tūdin"}, {"F"}},
{{"tās", "tāt"}, {"F"}},
{{"tūs", "tūt"}, {"F"}},
{{"tiō", "tiōn"}, {"F"}},
{{"siō", "siōn"}, {"F"}},
{{"xiō", "xiōn"}, {"F"}},
{{"gō", "gin"}, {"F"}},
{{"or", "ōr"}, {"M"}},
{{"tr[iī]x", "trīc"}, {"F"}},
{{"is", ""}, {"I"}},
{{"^(%l.*)ēs$", ""}, {"I"}},
})
if base then
return lemma, stem2, detected_subtypes
end
end
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"us", "or"}, {"N"}},
{{"us", "er"}, {"N"}},
{{"ma", "mat"}, {"N"}},
{{"men", "min"}, {"N"}},
{{"^(%u.*)e$", ""}, {"N", "sg"}},
{{"e", ""}, {"N", "I", "pure"}},
{{"al", "āl"}, {"N", "I", "pure"}},
{{"ar", "ār"}, {"N", "I", "pure"}},
})
if base then
return lemma, stem2, detected_subtypes
end
return lemma, stem2, {}
elseif typ == "4" then
if subtypes.echo or subtypes.Callisto then
base = lemma:match("^(.*)ō$")
if not base then
error("Declension-4 noun of subtype .echo or .Callisto should end in -ō: " .. lemma)
end
if subtypes.Callisto then
return base, nil, {"F", "sg"}
else
return base, nil, {"F"}
end
end
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"us", {"M"}},
{"ū̆", {"N"}},
{"ūs", {"M", "pl"}},
{"ua", {"N", "pl"}},
})
elseif typ == "5" then
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"iēs", {"F", "i"}},
{"iēs", {"F", "i", "pl"}},
{"ēs", {"F"}},
{"ēs", {"F", "pl"}},
})
elseif typ == "sgpl" then
return lemma, stem2, {}
elseif typ == "irreg" and lemma == "domus" then
-- [[domus]] auto-sets data.loc = true, but we need to know this
-- before declining the noun so we can propagate it to other segments.
return lemma, nil, {"loc"}
elseif typ == "indecl" or typ == "irreg" and (
lemma == "Deus" or match(lemma, "^[IJ]ēs[uū]s$") or
lemma == "Athōs" or lemma == "vēnum"
) then
-- Indeclinable nouns, and certain irregular nouns, set data.num = "sg",
-- but we need to know this before declining the noun so we can
-- propagate it to other segments.
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"", {"both"}},
{"", {"sg"}},
{"", {"pl"}},
})
elseif typ == "indecl" or typ == "irreg" then
return lemma, nil, {}
else
return nil, nil, {}
end
end
-- Given ENDINGS_AND_SUBTYPES (a list of four-tuples of ENDING, RETTYPE,
-- SUBTYPES, PROCESS_RETVAL), check each ENDING in turn against LEMMA and
-- STEM2. If it matches, return a four-tuple BASE, STEM2, RETTYPE, NEW_SUBTYPES
-- where BASE is normally the remainder of LEMMA minus the ending, STEM2 is
-- as passed in, RETTYPE is as passed in, and NEW_SUBTYPES is the same as
-- SUBTYPES minus any subtypes beginning with a hyphen. If no endings match,
-- throw an error if DECLTYPPE is non-nil, mentioning the DECLTYPE
-- (user-specified declension); but if DECLTYPE is nil, just return the tuple
-- nil, nil, nil, nil.
--
-- In order for a given entry to match, ENDING must match and also the subtypes
-- in SUBTYPES (a list) must not be incompatible with the passed-in
-- user-specified subtypes SPECIFIED_SUBTYPES (a set, i.e. a table where the
-- keys are strings and the value is always true). "Incompatible" means that
-- a given SUBTYPE is specified in either one and -SUBTYPE in the other, or
-- that "pl" is found in SPECIFIED_SUBTYPES and not in SUBTYPES.
--
-- The ending spec in ENDINGS_AND_SUBTYPES is one of the following:
--
-- 1. A simple string, e.g. "tūdō", specifying an ending.
-- 2. A regex that should match the entire lemma (it should be anchored at
-- the beginning with ^ and at the end with $), and contains a single
-- capturing group to match the base.
-- 3. A pair {SIMPLE_STRING_OR_REGEX, STEM2_ENDING} where
-- SIMPLE_STRING_OR_REGEX is one of the previous two possibilities and
-- STEM2_ENDING is a string specifying the corresponding ending that must
-- be present in STEM2. If this form is used, the combination of
-- base + STEM2_ENDING must exactly match STEM2 in order for this entry
-- to be considered a match. An example is {"is", ""}, which will match
-- lemma == "follis", stem2 == "foll", but not lemma == "lapis",
-- stem2 == "lapid".
--
-- If PROCESS_STEM2 is given and the returned STEM2 would be nil, call
-- process_stem2(BASE) to get the STEM2 to return.
local function get_adj_type_and_subtype_by_ending(lemma, stem2, decltype,
specified_subtypes, endings_and_subtypes, process_stem2)
for _, ending_and_subtypes in ipairs(endings_and_subtypes) do
local ending = ending_and_subtypes[1]
local rettype = ending_and_subtypes[2]
local subtypes = ending_and_subtypes[3]
local process_retval = ending_and_subtypes[4]
local not_this_subtype = false
if (
specified_subtypes.pl and not contains(subtypes, "pl") or
contains(subtypes, "both") and not specified_subtypes.both
) then
-- We now require that plurale tantum terms specify a plural-form lemma.
-- The autodetected subtypes will include 'pl' for such lemmas; if not,
-- we fail this entry. Additionally, if the rule contains 'both', it
-- must be explicitly specified to match.
not_this_subtype = true
else
for _, subtype in ipairs(subtypes) do
-- A subtype is directly canceled by specifying -SUBTYPE.
if specified_subtypes["-" .. subtype] then
not_this_subtype = true
break
end
-- A subtype is canceled if the user specified SUBTYPE and
-- -SUBTYPE is given in the to-be-returned subtypes.
local must_not_be_present = subtype:match("^%-(.*)$")
if must_not_be_present and specified_subtypes[must_not_be_present] then
not_this_subtype = true
break
end
end
end
if not not_this_subtype then
local base
if type(ending) == "table" then
local lemma_ending = ending[1]
local stem2_ending = ending[2]
base = extract_base(lemma, lemma_ending)
if base and base .. stem2_ending ~= stem2 then
base = nil
end
else
base = extract_base(lemma, ending)
end
if base then
-- Remove subtypes of the form -SUBTYPE from the subtypes
-- to be returned.
local new_subtypes = {}
for _, subtype in ipairs(subtypes) do
if subtype:sub(1, 1) ~= "-" then
insert(new_subtypes, subtype)
end
end
if process_retval then
base, stem2 = process_retval(base, stem2)
end
if process_stem2 then
stem2 = stem2 or process_stem2(base)
end
return base, stem2, rettype, new_subtypes
end
end
end
if not decltype then
return lemma, stem2, nil, keys_to_list(specified_subtypes)
elseif decltype == "" then
error("Unrecognized ending for adjective: " .. lemma)
else
error("Unrecognized ending for declension-" .. decltype .. " adjective: " .. lemma)
end
end
-- Autodetect the type and subtype of an adjective given all the information
-- specified by the user: lemma, stem2, declension type and specified subtypes.
-- Four values are returned: the lemma base (i.e. the stem of the lemma, as
-- required by the declension functions), the value of stem2 to pass to the
-- declension function, the declension type and the autodetected subtypes.
-- Note that this will not detect a given subtype if -SUBTYPE is specified for
-- any subtype that would be returned, or if SUBTYPE is specified and -SUBTYPE
-- is among the subtypes that would be returned (such subtypes are filtered out
-- of the returned subtypes).
local function detect_adj_type_and_subtype(lemma, stem2, typ, subtypes)
local function base_as_stem2(base, stem2)
return base, base
end
local function constant_base(baseval)
return function(base, stem2)
return baseval, nil
end
end
local function decl12_stem2(base)
return base
end
local function decl3_stem2(base)
return make_stem2(base)
end
local decl12_entries = {
{"us", "1&2+", {}},
{"a", "1&2+", {}},
{"um", "1&2+", {}},
{"ī", "1&2+", {"pl"}},
{"ae", "1&2+", {"pl"}},
{"a", "1&2+", {"pl"}},
-- Nearly all -os adjectives are greekA
{"os", "1&2+", {"greekA", "-greekE"}},
{"os", "1&2+", {"greekE", "-greekA"}},
{"ē", "1&2+", {"greekE", "-greekA"}},
{"on", "1&2+", {"greekA", "-greekE"}},
{"on", "1&2+", {"greekE", "-greekA"}},
{"^(.*er)$", "1&2+", {"er"}},
{"^(.*ur)$", "1&2+", {"er"}},
{"^(h)ic$", "1&2+", {"ic"}},
}
local decl3_entries = {
{"^(.*er)$", "3-3+", {"I"}},
{"^(.*er)$", "3-3+", {}},
{"is", "3-2+", {"I"}},
{"is", "3-2+", {}},
{"e", "3-2+", {"I"}},
{"e", "3-2+", {}},
{"^(.*[ij])or$", "3-C+", {"abl_e_i", "-abl_i_e"}},
{"^(.*[ij])or$", "3-C+", {}},
{"^(min)or$", "3-C+", {"abl_e_i", "-abl_i_e"}},
{"^(min)or$", "3-C+", {}},
{"^(.*trīx)$", "3-def+", {"trix", "abl_i_e", "-abl_e_i"}},
{"^(.*trīx)$", "3-def+", {"trix"}},
{"^(.*tor)$", "3-def+", {"tor", "abl_i_e", "-abl_e_i"}},
{"^(.*tor)$", "3-def+", {"tor"}},
-- Detect -ēs as 3-1 without auto-inferring .pl if .pl
-- not specified. If we don't do this, the later entry for
-- -ēs will auto-infer .pl whenever -ēs is specified (which
-- won't work for adjectives like quadripēs, volucripēs).
-- Essentially, for declension-3 adjectives, we require that
-- .pl is given if the lemma is plural.
--
-- Most 3-1 adjectives are i-stem (e.g. audāx) so we require -I
-- to be given with non-i-stem adjectives. The first entry below
-- will apply when -I isn't given, the second when it is given.
{"^(.*ēs)$", "3-1+", {"I", "abl_i_e", "-abl_e_i"}},
{"^(.*ēs)$", "3-1+", {"I"}},
{"^(.*ēs)$", "3-1+", {"par", "abl_i_e", "-abl_e_i"}},
{"^(.*ēs)$", "3-1+", {"par"}},
{"^(.*[ij])ōrēs$", "3-C+", {"pl"}},
{"^(min)ōrēs$", "3-C+", {"pl"}},
-- If .pl with -ēs, we don't know if the adjective is 3-1, 3-2
-- or 3-3. Since 3-2 is probably the most common, we infer it
-- (as well as the fact that these adjectives *are* in a sense
-- 3-2 since they have a distinct neuter in -(i)a. Note that
-- we have two entries here; the first one will apply unless
-- -I is given, and will infer an i-stem adjective; the second
-- one will apply otherwise (and infer a non-i-stem 3-1 adjective).
{"ēs", "3-2+", {"pl", "I"}, base_as_stem2},
{"ēs", "3-1+", {"pl", "par"}, base_as_stem2},
-- Same for neuters.
{"ia", "3-2+", {"pl", "I"}, base_as_stem2},
{"a", "3-1+", {"pl", "par"}, base_as_stem2},
-- As above for -ēs but for miscellaneous singulars.
{"", "3-1+", {"I", "abl_i_e", "-abl_e_i"}},
{"", "3-1+", {"I"}},
{"", "3-1+", {"par", "abl_i_e", "-abl_e_i"}},
{"", "3-1+", {"par"}},
}
local function get_subtypes_and_endings(typ, f)
local subtypes_and_endings = {}
for _, v in ipairs(decl3_entries) do
if f(v) then
v = deep_copy(v)
v[2] = typ
insert(subtypes_and_endings, v)
end
end
return subtypes_and_endings
end
local function compare(spec)
return spec[2] == typ
end
if typ == "+" then
local base, new_stem2, rettype, new_subtypes = get_adj_type_and_subtype_by_ending(lemma, stem2, nil, subtypes, decl12_entries, decl12_stem2)
if rettype then
return base, new_stem2, rettype, new_subtypes
else
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl3_entries, decl3_stem2)
end
elseif typ == "3+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl3_entries, decl3_stem2)
elseif typ == "1&2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl12_entries, decl12_stem2)
elseif typ == "1-1+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"a", typ, {}},
{"ae", typ, {"pl"}},
})
elseif typ == "2-2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"us", typ, {}},
{"um", typ, {}},
{"ī", typ, {"pl"}},
{"a", typ, {"pl"}},
{"os", typ, {"greek"}},
{"on", typ, {"greek"}},
{"oe", typ, {"greek", "pl"}},
})
elseif typ == "3-1+" then
-- Use the specs from `decl3_entries`, but add the two i-stem 3-2+ specs when plural-only, as they're the same when 3-1+.
local subtypes_and_endings = get_subtypes_and_endings(typ, function(spec)
local spec1, spec2 = spec[1], spec[2]
return spec2 == typ or (spec2 == "3-2+" and spec1 == "ēs" or spec1 == "ia")
end)
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, subtypes_and_endings, decl3_stem2)
elseif typ == "3-def+" then
-- Like 3-1+ but defective in gender
local subtypes_and_endings = get_subtypes_and_endings(typ, compare)
insert(subtypes_and_endings, {"", typ, {"I"}})
insert(subtypes_and_endings, {"", typ, {"par"}})
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, subtypes_and_endings, decl3_stem2)
elseif typ == "3-2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"is", typ, {}},
{"e", typ, {}},
-- Detect -ēs as 3-2 without auto-inferring .pl if .pl
-- not specified. If we don't do this, the later entry for
-- -ēs will auto-infer .pl whenever -ēs is specified (which
-- won't work for adjectives like isoscelēs). Essentially,
-- for declension-3 adjectives, we require that .pl is given
-- if the lemma is plural.
{"ēs", typ, {}},
{"ēs", typ, {"pl"}},
{"ia", typ, {"pl"}},
}, decl3_stem2)
elseif typ == "3-3+" or typ == "3-P+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"ēs", typ, {"pl"}, base_as_stem2},
{"ia", typ, {"pl"}, base_as_stem2},
{"", typ, {}},
}, decl3_stem2)
elseif typ == "3-C+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, get_subtypes_and_endings(typ, compare), decl3_stem2)
elseif typ == "irreg+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"^(duo)$", typ, {"pl"}},
{"^(ambō)$", typ, {"pl"}},
{"^(mīll?ia)$", typ, {"N", "pl"}, constant_base("mīlle")},
-- match ea
{"^(ea)$", typ, {}, constant_base("is")},
-- match id
{"^(id)$", typ, {}, constant_base("is")},
-- match plural eī, iī
{"^([ei]ī)$", typ, {"pl"}, constant_base("is")},
-- match plural ea, eae
{"^(eae?)$", typ, {"pl"}, constant_base("is")},
-- match eadem
{"^(eadem)$", typ, {}, constant_base("īdem")},
-- match īdem, idem
{"^([īi]dem)$", typ, {}, constant_base("īdem")},
-- match plural īdem
{"^(īdem)$", typ, {"pl"}},
-- match plural eadem, eaedem
{"^(eae?dem)$", typ, {"pl"}, constant_base("īdem")},
-- match illa, ipsa, ista; it doesn't matter if we overmatch because
-- we'll get an error as we use the stem itself in the returned base
{"^(i[lps][lst])a$", typ, {}, function(base, stem2) return base .. "e", nil end},
-- match illud, istud; as above, it doesn't matter if we overmatch
{"^(i[ls][lt])ud$", typ, {}, function(base, stem2) return base .. "e", nil end},
-- match ipsum
{"^(ipsum)$", typ, {}, constant_base("ipse")},
-- match plural illī, ipsī, istī; as above, it doesn't matter if we
-- overmatch
{"^(i[lps][lst])ī$", typ, {"pl"}, function(base, stem2) return base .. "e", nil end},
-- match plural illa, illae, ipsa, ipsae, ista, istae; as above, it
-- doesn't matter if we overmatch
{"^(i[lps][lst])ae?$", typ, {"pl"}, function(base, stem2) return base .. "e", nil end},
-- Detect quī as non-plural unless .pl specified.
{"^(quī)$", typ, {}},
-- Otherwise detect quī as plural.
{"^(quī)$", typ, {"pl"}},
-- Same for quae.
{"^(quae)$", typ, {}, constant_base("quī")},
{"^(quae)$", typ, {"pl"}, constant_base("quī")},
{"^(quid)$", typ, {}, constant_base("quis")},
{"^(quod)$", typ, {}, constant_base("quī")},
{"^(qui[cd]quid)$", typ, {}, constant_base("quisquis")},
{"^(quīquī)$", typ, {"pl"}, constant_base("quisquis")},
{"^(quaequae)$", typ, {"pl"}, constant_base("quisquis")},
-- match all remaining lemmas in lemma form
{"", typ, {}},
})
elseif typ == "indecl+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"", typ, {"both"}},
{"", typ, {"sg"}},
{"", typ, {"pl"}},
})
else -- 0+
return lemma, nil, typ, {}
end
end
local noun_lb = {
nom_sg = "sg.",
gen_sg = "sg.",
dat_sg = "sg.",
acc_sg = "sg.",
abl_sg = "sg.",
voc_sg = "sg.",
loc_sg = "sg.",
nom_pl = "pl.",
gen_pl = "pl.",
dat_pl = "pl.",
acc_pl = "pl.",
abl_pl = "pl.",
voc_pl = "pl.",
loc_pl = "pl."
}
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {lista=true, requerido=true},
["alt"] = {},
["num"] = {por_defecto = ""},
["núm"] = {alias_de = "num"},
["nota"] = {},
}
for form,_ in pairs(noun_lb) do
params[form] = {lista=true}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local tpalabras = {}
for _,p in ipairs(args) do
p = match(p, "^(.-);") or p
local a, b = match(p, "^(.-)%.(.*)$")
assert(b, "error en especificaciones de palabra")
local r1 = match(a, "^([^/]+)/")
if not r1 then
r1 = a
end
if r1 == "idem" or r1 == "īdem" then -- REVISAR: parche para idem que internamente lo declina como si fuera "i"
insert(tpalabras, "ī")
else
insert(tpalabras, r1)
end
end
local palabras, separadores = separar_palabras(title, concat(tpalabras, "-"))
local M = 1
local declinfo
local titles = {}
local cats = {}
local genero
local nosg, nopl = true, true
for _,arg in ipairs(args) do
local formas = {}
for subarg in gsplit(arg, ";") do
local types = {}
local a, b = match(subarg, "^(.-)%.(.*)$")
assert(b, "error en especificaciones de palabra")
local c, d = match(b, "^(.-)%.(.*)$")
if d then
for spec in gsplit(d, "%.") do
spec = gsub(spec, "(.)%-", "%1_")
types[spec] = true
end
end
c = c or b
local r = split(a, "/")
local r1, r2, detected_subtypes = detect_noun_subtype(r[1], r[2], c, types)
for _, subtype in ipairs(detected_subtypes) do
if types["-" .. subtype] then
-- if a "cancel subtype" spec is given, remove the cancel spec
-- and don't apply the subtype
types["-" .. subtype] = nil
elseif (subtype == "M" or subtype == "F" or subtype == "N") and
(types.M or types.F or types.N) then
-- if gender already specified, don't create conflicting gender spec
elseif (subtype == "sg" or subtype == "pl" or subtype == "both") and
(types.sg or types.pl or types.both) then
-- if number restriction already specified, don't create conflicting
-- number restriction spec
else
types[subtype] = true
end
end
if not genero then
if types.M then
genero = "m"
end
if types.N then
genero = "n"
end
if types.F then
genero = "f"
end
end
local es_adj
if not r1 and genero then
local typ
r1, r2, typ, detected_subtypes = detect_adj_type_and_subtype(r[1], r[2], c, types)
if r1 then
c = typ
es_adj = true
end
end
assert(r1, "forma no reconocida: "..r[1])
local cb = es_adj and adj_decl[c] or noun_decl[c]
assert(cb, "Especifique el tipo de sustantivo correcto en el primer parámetro")
local data = {forms={}, types=types, pos="", subtitles="", notes="", categories=cats, title=titles, loc=types.loc, num=args.num}
cb(data, {r1, r2})
if es_adj then
local forms_ = {}
for form,arr in pairs(data.forms) do
local f1, f2 = form:match("^(.*)(_"..genero..")$")
if f1 then
forms_[f1] = arr
end
end
data.forms = forms_
end
if not types.sg then
nopl = false
end
if not types.pl then
nosg = false
end
if types.sg then
for key,_ in pairs(data.forms) do
if key:find("_pl") then
data.forms[key] = {}
end
end
end
if types.pl then
for key,_ in pairs(data.forms) do
if key:find("_sg") then
data.forms[key] = {}
end
end
end
merge_forms(formas, data.forms, noun_lb)
end
if not declinfo then
declinfo = formas
else
declinfo = combinar_copulativa(declinfo, formas, separadores[M])
M = M + 1
end
end
if declinfo["loc_sg"] and #declinfo["loc_sg"] == 0 then
declinfo["loc_sg"] = nil
end
if declinfo["loc_pl"] and #declinfo["loc_pl"] == 0 then
declinfo["loc_pl"] = nil
end
if nosg == false then
nosg = find(args["num"], "p")
end
if nopl == false then
nopl = find(args["num"], "s")
end
local forms = sobreescribir_formas(declinfo, args, false, {})
comprobar_defectivo(forms, {})
forms = desactivar_formas(forms,
function (form)
return (form:find("pl$") and nopl) or (form:find("sg$") and nosg)
end
)
local raiz_nom = f(forms["nom_sg"][1] or forms["nom_pl"][1] or "?")
local raiz_gen = f(forms["gen_sg"][1] or forms["gen_pl"][1] or "?")
forms = agregar_enlaces(forms, title, normalizar_enlace)
forms = formatear_formas(forms, noun_lb)
local t = {}
insert(t, {{""}, {"Singular"}, {"Plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_sg"], forms["nom_pl"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_sg"], forms["gen_pl"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_sg"], forms["dat_pl"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_sg"], forms["acc_pl"]})
insert(t, {{"Ablativo", header=true, color=COLOR_H}, forms["abl_sg"], forms["abl_pl"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["voc_sg"], forms["voc_pl"]})
if (forms["loc_sg"] and forms["loc_sg"][1]) or (forms["loc_pl"] and forms["loc_pl"][1]) then
insert(t, {{"Locativo", header=true, color=COLOR_H}, forms["loc_sg"], forms["loc_pl"]})
end
insert(t, {{args["nota"] or "", colspan=3}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..raiz_nom..", "..raiz_gen.."'''''  tipo: "..concat(titles, ", "),
t,
ns == 0 and cats or {}
)
end
local adj_lb = {
nom_sg_m = "m.",
nom_sg_n = "n.",
nom_sg_f = "f.",
nom_pl_m = "m.",
nom_pl_n = "n.",
nom_pl_f = "f.",
gen_sg_m = "m.",
gen_sg_n = "n.",
gen_sg_f = "f.",
gen_pl_m = "m.",
gen_pl_n = "n.",
gen_pl_f = "f.",
dat_sg_m = "m.",
dat_sg_n = "n.",
dat_sg_f = "f.",
dat_pl_m = "m.",
dat_pl_n = "n.",
dat_pl_f = "f.",
acc_sg_m = "m.",
acc_sg_n = "n.",
acc_sg_f = "f.",
acc_pl_m = "m.",
acc_pl_n = "n.",
acc_pl_f = "f.",
abl_sg_m = "m.",
abl_sg_n = "n.",
abl_sg_f = "f.",
abl_pl_m = "m.",
abl_pl_n = "n.",
abl_pl_f = "f.",
voc_sg_m = "m.",
voc_sg_n = "n.",
voc_sg_f = "f.",
voc_pl_m = "m.",
voc_pl_n = "n.",
voc_pl_f = "f.",
}
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {lista=true, requerido=true},
["alt"] = {},
["num"] = {por_defecto = ""},
["núm"] = {alias_de="num"},
["gen"] = {por_defecto="mfn"},
["nota"] = {},
}
for form,_ in pairs(adj_lb) do
params[form] = {lista=true}
end
params["dat_pl"] = {lista=true}
params["abl_pl"] = {lista=true}
params["loc_pl"] = {lista=true}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if args["dat_pl"][1] then
args["dat_pl_m"] = deep_copy(args["dat_pl"])
args["dat_pl_n"] = deep_copy(args["dat_pl"])
args["dat_pl_f"] = deep_copy(args["dat_pl"])
end
if args["abl_pl"][1] then
args["abl_pl_m"] = deep_copy(args["abl_pl"])
args["abl_pl_n"] = deep_copy(args["abl_pl"])
args["abl_pl_f"] = deep_copy(args["abl_pl"])
end
if args["loc_pl"][1] then
args["loc_pl_m"] = deep_copy(args["loc_pl"])
args["loc_pl_n"] = deep_copy(args["loc_pl"])
args["loc_pl_f"] = deep_copy(args["loc_pl"])
end
args["dat_pl"] = nil
args["abl_pl"] = nil
args["loc_pl"] = nil
assert(not find(title, " "), "locuciones no soportadas aún") -- REVISAR
local tpalabras = {}
for _,p in ipairs(args) do
p = match(p, "^(.-);") or p
local a, b = match(p, "^(.-)%.(.*)$")
assert(b, "error en especificaciones de palabra")
local r1 = match(a, "^([^/]+)/")
if not r1 then
r1 = a
end
if r1 == "idem" or r1 == "īdem" then -- REVISAR: parche para idem que internamente lo declina como si fuera "i"
insert(tpalabras, "ī")
else
insert(tpalabras, r1)
end
end
local palabras, separadores = separar_palabras(title, concat(tpalabras, "-"))
local M = 1
local declinfo
local titles = {}
local cats = {}
local nosg, nopl = true, true
for _,arg in ipairs(args) do
local formas = {}
for subarg in gsplit(arg, ";") do
local types = {}
local a, b = match(subarg, "^(.-)%.(.*)$")
a = a or subarg
b = b or "+"
local c, d = match(b, "^(.-)%.(.*)$")
if d then
for spec in gsplit(d, "%.") do
spec = gsub(spec, "(.)%-", "%1_")
types[spec] = true
end
end
c = c or b
local r = split(a, "/")
local r1, r2, typ, detected_subtypes = detect_adj_type_and_subtype(r[1], r[2], c, types)
for _, subtype in ipairs(detected_subtypes) do
if types["-" .. subtype] then
-- if a "cancel subtype" spec is given, remove the cancel spec
-- and don't apply the subtype
types["-" .. subtype] = nil
elseif (subtype == "M" or subtype == "F" or subtype == "N") and
(types.M or types.F or types.N) then
-- if gender already specified, don't create conflicting gender spec
elseif (subtype == "sg" or subtype == "pl" or subtype == "both") and
(types.sg or types.pl or types.both) then
-- if number restriction already specified, don't create conflicting
-- number restriction spec
else
types[subtype] = true
end
end
local cb = adj_decl[typ]
assert(cb, "Especifique el tipo de sustantivo correcto en el primer parámetro")
local data = {forms={}, types=types, pos="", subtitles="", notes="", categories=cats, title=titles, loc=types.loc, num=args.num}
cb(data, {r1, r2})
local formas_ = {} -- necesario crear otro arreglo para no modificar las claves durante la iteración
for form,arr in pairs(data.forms) do
local pref = match(form, "^(.*)_m$")
if pref and not data.forms[pref.."_f"] then
formas_[pref.."_f"] = deep_copy(arr)
end
if pref and not data.forms[pref.."_n"] then
formas_[pref.."_n"] = deep_copy(arr)
end
formas_[form] = arr
end
data.forms = formas_
if not types.sg then
nopl = false
end
if not types.pl then
nosg = false
end
if types.sg then
for key,_ in pairs(data.forms) do
if key:find("_pl") then
data.forms[key] = {}
end
end
end
if types.pl then
for key,_ in pairs(data.forms) do
if key:find("_sg") then
data.forms[key] = {}
end
end
end
merge_forms(formas, data.forms, adj_lb)
end
if not declinfo then
declinfo = formas
else
declinfo = combinar_copulativa(declinfo, formas, separadores[M])
M = M + 1
end
end
if nosg == false then
nosg = find(args["num"], "p")
end
if nopl == false then
nopl = find(args["num"], "s")
end
local m = find(args["gen"], "m")
local fem = find(args["gen"], "f")
local n = find(args["gen"], "n")
local forms = sobreescribir_formas(declinfo, args, false, {}, adj_lb)
comprobar_defectivo(forms)
forms = desactivar_formas(forms,
function (form)
return (form:find("pl") and nopl) or (form:find("sg") and nosg) or (form:find("m$") and not m) or (form:find("f$") and not fem) or (form:find("n$") and not n)
end
)
local raiz_m = f(forms["nom_sg_m"][1] or forms["nom_pl_m"][1] or "?")
local raiz_f = f(forms["nom_sg_f"][1] or forms["nom_pl_f"][1] or "?")
local raiz_n = f(forms["nom_sg_n"][1] or forms["nom_pl_n"][1] or "?")
forms = agregar_enlaces(forms, title, normalizar_enlace)
forms = formatear_formas(forms, adj_lb)
local t = {}
insert(t, {{"Singular", colspan=4}, header=true, color=COLOR_H})
insert(t, {{""}, {"Masculino"}, {"Femenino"}, {"Neutro"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_sg_m"], forms["nom_sg_f"], forms["nom_sg_n"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_sg_m"], forms["gen_sg_f"], forms["gen_sg_n"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_sg_m"], forms["dat_sg_f"], forms["dat_sg_n"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_sg_m"], forms["acc_sg_f"], forms["acc_sg_n"]})
insert(t, {{"Ablativo", header=true, color=COLOR_H}, forms["abl_sg_m"], forms["abl_sg_f"], forms["abl_sg_n"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["voc_sg_m"], forms["voc_sg_f"], forms["voc_sg_n"]})
insert(t, {{"Plural", colspan=4, header=true, color=COLOR_H}})
insert(t, {{""}, {"Masculino"}, {"Femenino"}, {"Neutro"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_pl_m"], forms["nom_pl_f"], forms["nom_pl_n"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_pl_m"], forms["gen_pl_f"], forms["gen_pl_n"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_pl_m"], forms["dat_pl_f"], forms["dat_pl_n"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_pl_m"], forms["acc_pl_f"], forms["acc_pl_n"]})
insert(t, {{"Ablativo", header=true, color=COLOR_H}, forms["abl_pl_m"], forms["abl_pl_f"], forms["abl_pl_n"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["voc_pl_m"], forms["voc_pl_f"], forms["voc_pl_n"]})
insert(t, {{args["nota"] or "", colspan=4}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..raiz_m..", "..raiz_f..", "..raiz_n.."'''''  tipo: "..concat(titles, ", "),
t,
ns == 0 and cats or {}
)
end
local EGO, TU, IS, NOS, VOS, EI = 1, 2, 3, 4, 5, 6
local tostr = {"1", "2", "3", "4", "5", "6"}
local PRONOMBRES = {"ego", "tū", "is, ea, id", "nōs", "vōs", "eī, eae, ea"}
local PRONOMBRES_SUBJ = {"ut ego", "ut tū", "ut is, ut ea, ut id", "ut nōs", "ut vōs", "ut eī, ut eae, ut ea"}
local PRONOMBRES_IMP = {"―", "(tū)", "(is, ea, id)", "―", "(vōs)", "(eī, eae, ea)"}
local IMPERSONALES = {"", "", "(id)", "", "", ""}
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
return IMPERSONALES[p]
else
if find(conj, "^subj") then
return PRONOMBRES_SUBJ[p]
end
if find(conj, "^imper") then
return PRONOMBRES_IMP[p]
end
return PRONOMBRES[p]
end
end
local sufijos = {
["1"] = {
inf_act = {"āre","isse"},
inf_pas = {"ārī"},
part_act = {"āns","ūrus"},
part_pas = {"andus","us"},
ger = {"andī","andō","andum"},
sup = {"um","ū"},
ind_pres = {"ō","ās","at","āmus","ātis","ant"},
ind_imp = {"ābam","ābās","ābat","ābāmus","ābātis","ābant"},
ind_perf = {"ī","istī","it","imus","istis","ērunt",
nil,nil,nil,nil,nil,"ēre"},
ind_pluperf = {"eram","erās","erat","erāmus","erātis","erant"},
ind_fut = {"ābō","ābis","ābit","ābimus","ābitis","ābunt"},
ind_fut_perf = {"erō","eris","erit","erimus","eritis","erint"},
ind_fut_sig = {"ō","is","it","imus","itis","int"},
ind_pres_pas = {"or","āris","ātur","āmur","āminī","antur",
nil,"āre"},
ind_imp_pas = {"ābar","ābāris","ābātur","ābāmur","ābāminī","ābantur",
nil,"ābāre"},
ind_fut_pas = {"ābor","āberis","ābitur","ābimur","ābiminī","ābuntur",
nil,"ābere"},
subj_pres = {"em","ēs","et","ēmus","ētis","ent"},
subj_imp = {"ārem","ārēs","āret","ārēmus","ārētis","ārent"},
subj_perf = {"erim","erīs","erit","erīmus","erītis","erint"},
subj_pluperf = {"issem","issēs","isset","issēmus","issētis","issent"},
subj_aor_sig = {"im","īs","īt","īmus","ītis","int"},
subj_pres_pas = {"er","ēris","ētur","ēmur","ēminī","entur",
nil,"ēre"},
subj_imp_pas = {"ārer","ārēris","ārētur","ārēmur","ārēminī","ārentur",
nil,"ārēre"},
imper_pres = {nil,"ā",nil,nil,"āte",nil},
imper_fut = {nil,"ātō","ātō",nil,"ātōte","antō"},
imper_pres_pas = {nil,"āre",nil,nil,"āminī",nil},
imper_fut_pas = {nil,"ātor","ātor",nil,nil,"antor"},
},
["2"] = {
inf_act = {"ēre","isse"},
inf_pas = {"ērī"},
part_act = {"ēns","ūrus"},
part_pas = {"endus","us"},
ger = {"endī","endō","endum"},
sup = {"um","ū"},
ind_pres = {"eō","ēs","et","ēmus","ētis","ent"},
ind_imp = {"ēbam","ēbās","ēbat","ēbāmus","ēbātis","ēbant"},
ind_perf = {"ī","istī","it","imus","istis","ērunt",
nil,nil,nil,nil,nil,"ēre"},
ind_pluperf = {"eram","erās","erat","erāmus","erātis","erant"},
ind_fut = {"ēbō","ēbis","ēbit","ēbimus","ēbitis","ēbunt"},
ind_fut_perf = {"erō","eris","erit","erimus","eritis","erint"},
ind_fut_sig = {"ō","is","it","imus","itis","int"},
ind_pres_pas = {"eor","ēris","ētur","ēmur","ēminī","entur",
nil,"ēre"},
ind_imp_pas = {"ēbar","ēbāris","ēbātur","ēbāmur","ēbāminī","ēbantur",
nil,"ēbāre"},
ind_fut_pas = {"ēbor","ēberis","ēbitur","ēbimur","ēbiminī","ēbuntur",
nil,"ēbere"},
subj_pres = {"eam","eās","eat","eāmus","eātis","eant"},
subj_imp = {"ērem","ērēs","ēret","ērēmus","ērētis","ērent"},
subj_perf = {"erim","erīs","erit","erīmus","erītis","erint"},
subj_pluperf = {"issem","issēs","isset","issēmus","issētis","issent"},
subj_aor_sig = {"im","īs","īt","īmus","ītis","int"},
subj_pres_pas = {"ear","eāris","eātur","eāmur","eāminī","eantur",
nil,"eāre"},
subj_imp_pas = {"ērer","ērēris","ērētur","ērēmur","ērēminī","ērentur",
nil,"ērēre"},
imper_pres = {nil,"ē",nil,nil,"ēte",nil},
imper_fut = {nil,"ētō","ētō",nil,"ētōte","entō"},
imper_pres_pas = {nil,"ēre",nil,nil,"ēminī",nil},
imper_fut_pas = {nil,"ētor","ētor",nil,nil,"entor"},
},
["3"] = { -- 3 (comparar [[capio]] con [[lego]], las raíces con capi- y leg- pero hay que eliminar la doble ii)
inf_act = {"ere","isse"},
inf_pas = {"ī"},
part_act = {"ēns","ūrus"},
part_pas = {"endus","us"},
ger = {"endī","endō","endum"},
sup = {"um","ū"},
ind_pres = {"ō","is","it","imus","itis","unt"},
ind_imp = {"ēbam","ēbās","ēbat","ēbāmus","ēbātis","ēbant"},
ind_perf = {"ī","istī","it","imus","istis","ērunt",
nil,nil,nil,nil,nil,"ēre"},
ind_pluperf = {"eram","erās","erat","erāmus","erātis","erant"},
ind_fut = {"am","ēs","ēt","ēmus","ētis","ent"},
ind_fut_perf = {"erō","eris","erit","erimus","eritis","erint"},
ind_fut_sig = {"ō","is","it","imus","itis","int"},
ind_pres_pas = {"or","eris","itur","imur","iminī","untur",
nil,"ere"},
ind_imp_pas = {"ēbar","ēbāris","ēbātur","ēbāmur","ēbāminī","ēbantur",
nil,"ēbāre"},
ind_fut_pas = {"ar","ēris","ētur","ēmur","ēminī","entur",
nil,"ēre"},
subj_pres = {"am","ās","at","āmus","ātis","ant"},
subj_imp = {"erem","erēs","eret","erēmus","erētis","erent"},
subj_perf = {"erim","erīs","erit","erīmus","erītis","erint"},
subj_pluperf = {"issem","issēs","isset","issēmus","issētis","issent"},
subj_aor_sig = {"im","īs","īt","īmus","ītis","int"},
subj_pres_pas = {"ar","āris","ātur","āmur","āminī","antur",
nil,"āre"},
subj_imp_pas = {"erer","erēris","erētur","erēmur","erēminī","erentur",
nil,"erēre"},
imper_pres = {nil,"e",nil,nil,"ite",nil},
imper_fut = {nil,"itō","itō",nil,"itōte","untō"},
imper_pres_pas = {nil,"ere",nil,nil,"iminī",nil},
imper_fut_pas = {nil,"itor","itor",nil,nil,"untor"},
},
["3/4"] = {
inf_act = {"ere","isse","īre","isse"},
inf_pas = {"ī","īrī"},
part_act = {"ēns","iēns","ūrus"},
part_pas = {"endus","iendus","us"},
ger = {"endī","endō","endum","iendī","iendō","iendum"},
sup = {"um","ū"},
ind_pres = {"ō","is","it","imus","itis","unt",
"iō","īs",nil,"īmus","ītis","iunt"
},
ind_imp = {"ēbam","ēbās","ēbat","ēbāmus","ēbātis","ēbant",
"iēbam","iēbās","iēbat","iēbāmus","iēbātis","iēbant"
},
ind_perf = {"ī","istī","it","imus","istis","ērunt",
nil,nil,nil,nil,nil,"ēre"},
ind_pluperf = {"eram","erās","erat","erāmus","erātis","erant"},
ind_fut = {"am","ēs","ēt","ēmus","ētis","ent",
"iam","iēs","iet","iēmus","iētis","ient"
},
ind_fut_perf = {"erō","eris","erit","erimus","eritis","erint"},
ind_fut_sig = {"ō","is","it","imus","itis","int"},
ind_pres_pas = {"or","eris","itur","imur","iminī","untur",
"ior","ere","ītur","īmur","īminī","iuntur",
nil,"īris",nil,nil,nil,nil,
nil,"īre"
},
ind_imp_pas = {"ēbar","ēbāris","ēbātur","ēbāmur","ēbāminī","ēbantur",
"iēbar","ēbāre","iēbātur","iēbāmur","iēbāminī","iēbantur",
nil,"iēbāris",nil,nil,nil,nil,
nil,"iēbāre"
},
ind_fut_pas = {"ar","ēris","ētur","ēmur","ēminī","entur",
"iar","ēre","iētur","iēmur","iēminī","ientur",
nil,"iēris",nil,nil,nil,nil,
nil,"iēre"
},
subj_pres = {"am","ās","at","āmus","ātis","ant",
"iam","iās","iat","iāmus","iātis","iant",
},
subj_imp = {"erem","erēs","eret","erēmus","erētis","erent",
"īrem","īrēs","īret","īrēmus","īrētis","īrent"
},
subj_perf = {"erim","erīs","erit","erīmus","erītis","erint"},
subj_pluperf = {"issem","issēs","isset","issēmus","issētis","issent"},
subj_aor_sig = {"im","īs","īt","īmus","ītis","int"},
subj_pres_pas = {"ar","āris","ātur","āmur","āminī","antur",
"iar","āre","iātur","iāmur","iāminī","iantur",
nil,"iāris",nil,nil,nil,nil,
nil,"iāre"
},
subj_imp_pas = {"erer","erēris","erētur","erēmur","erēminī","erentur",
"īrer","erēre","īrētur","īrēmur","īrēminī","īrentur",
nil,"īrēris",nil,nil,nil,nil,
nil,"īrēre"
},
imper_pres = {nil,"e",nil,nil,"ite",nil,
nil,"ī",nil,nil,"īte",nil
},
imper_fut = {nil,"itō","itō",nil,"itōte","untō",
nil,"ītō","ītō",nil,"ītōte","iuntō"
},
imper_pres_pas = {nil,"ere",nil,nil,"iminī",nil,
nil,"īre",nil,nil,"īminī",nil
},
imper_fut_pas = {nil,"itor","itor",nil,nil,"untor",
nil,"ītor","ītor",nil,nil,"iuntor"
},
},
["4"] = {
inf_act = {"īre","isse"},
inf_pas = {"īrī"},
part_act = {"iēns","ūrus"},
part_pas = {"iendus","us"},
ger = {"iendī","iendō","iendum"},
sup = {"um","ū"},
ind_pres = {"iō","īs","it","īmus","ītis","iunt"},
ind_imp = {"iēbam","iēbās","iēbat","iēbāmus","iēbātis","iēbant"},
ind_perf = {"ī","istī","it","imus","istis","ērunt",
nil,nil,nil,nil,nil,"ēre"},
ind_pluperf = {"eram","erās","erat","erāmus","erātis","erant"},
ind_fut = {"iam","iēs","iet","iēmus","iētis","ient"},
ind_fut_perf = {"erō","eris","erit","erimus","eritis","erint"},
ind_fut_sig = {"ō","is","it","imus","itis","int"},
ind_pres_pas = {"ior","īris","ītur","īmur","īminī","iuntur",
nil,"īre"},
ind_imp_pas = {"iēbar","iēbāris","iēbātur","iēbāmur","iēbāminī","iēbantur",
nil,"iēbāre"},
ind_fut_pas = {"iar","iēris","iētur","iēmur","iēminī","ientur",
nil,"iēre"},
subj_pres = {"iam","iās","iat","iāmus","iātis","iant"},
subj_imp = {"īrem","īrēs","īret","īrēmus","īrētis","īrent"},
subj_perf = {"erim","erīs","erit","erīmus","erītis","erint"},
subj_pluperf = {"issem","issēs","isset","issēmus","issētis","issent"},
subj_aor_sig = {"im","īs","īt","īmus","ītis","int"},
subj_pres_pas = {"iar","iāris","iātur","iāmur","iāminī","iantur",
nil,"iāre"},
subj_imp_pas = {"īrer","īrēris","īrētur","īrēmur","īrēminī","īrentur",
nil,"īrēre"},
imper_pres = {nil,"ī",nil,nil,"īte",nil},
imper_fut = {nil,"ītō","ītō",nil,"ītōte","iuntō"},
imper_pres_pas = {nil,"īre",nil,nil,"īminī",nil},
imper_fut_pas = {nil,"ītor","ītor",nil,nil,"iuntor"},
}
}
local formas_no_personales = {
inf_act = true,
inf_pas = true,
part_act = true,
part_pas = true,
ger = true,
sup = true,
}
local formas_personales = {
ind_pres = true,
ind_imp = true,
ind_perf = true,
ind_pluperf = true,
ind_fut = true,
ind_fut_perf = true,
ind_fut_sig = true,
ind_pres_pas = true,
ind_imp_pas = true,
ind_fut_pas = true,
subj_pres = true,
subj_imp = true,
subj_perf = true,
subj_pluperf = true,
subj_aor_sig = true,
subj_pres_pas = true,
subj_imp_pas = true,
imper_pres = true,
imper_fut = true,
imper_pres_pas = true,
imper_fut_pas = true,
}
local formas = merge(formas_no_personales, formas_personales)
local verbos_irregulares = {
{"aiō", {"aiō", "aiiō", "aijō", "ajō"}, {
desactivar = {"inf_pas","part_pas","ger","sup","ind_pluperf","ind_fut","ind_fut_perf",
"ind_pres_pas","ind_imp_pas","ind_fut_pas","subj_perf","subj_pluperf","subj_pres_pas",
"subj_imp_pas","imper_fut","imper_pres_pas","imper_fut_pas"
},
conj = "3",
nucleopres = {"ai"},
nucleoperf = {"a"},
nucleosup = {},
nucleosigm = {},
inf_act = {"aiere"},
ind_pres = {nil,nil,nil,{}},
ind_perf = {{},nil,nil,{},{}},
subj_pres = {nil,nil,nil,{},{}},
subj_imp = {{},{},nil,{},{},{}},
imper_pres = {{},{"ai"},{},{},{},{}},
}},
{"cedo", {"cedo"}, {
desactivar = {"inf_act","inf_pas","part_act","part_pas","ger","sup","ind_pluperf","ind_pres","ind_imp","ind_perf",
"ind_fut","ind_fut_perf","ind_pres_pas","ind_imp_pas","ind_fut_pas","subj_pres","subj_imp","subj_perf",
"subj_pluperf","subj_pres_pas","subj_imp_pas","imper_fut","imper_pres_pas","imper_fut_pas"
},
conj = "3",
nucleopres = {},
nucleoperf = {},
nucleosup = {},
nucleosigm = {},
imper_pres = {nil,{"cedo"},nil,nil,{"cette","cedile"},nil},
}},
{"edō", {"edō", "ëdō"}, {
conj = "3",
nucleopres = {"ed"},
nucleoperf = {"ēd"},
nucleosup = {""},
nucleosigm = {},
desactivar = {},
inf_act = {"edere","ēsse"},
part_act = {"edēns","ēsūrus","ēssūrus","ēstūrus"},
part_pas = {"edendus","edundus","ēsus","ēssus","ēstus"},
sup = {"ēsum","ēssum","ēstum","ēsū","ēssū","ēstū"},
ind_pres = {nil,{"edis","ēs"},{"edit","ēst"},nil,{"editis","ēstis"},nil},
ind_pres_pas = {nil,{"ederis","edere","ēssis","ēsse"},{"editur","ēstur"}},
subj_pres = {{"edam","edim"},{"edās","edīs"},{"edat","edit","ēst"},{"edāmus","edīmus"},{"edātis","edītis"},{"edant","edint"}},
subj_imp = {{"ederem","ēssem"},{"ederēs","ēssēs"},{"ederet","ēsset"},{"ederēmus","ēssēmus"},{"ederētis","ēssētis"},{"ederent","ēssent"}},
subj_imp_pas = {{"ederer","ēsser"},{"ederēris","ederēre","ēssēris","ēssēre"},{"ederetur","ēssetur"},{"ederēmur","ēssēmur"},{"ederēminī","ēssēminī"},{"ederentur","ēssentur"}},
imper_pres = {nil,{"ede","ēs"},nil,nil,{"edite","ēste"},nil},
imper_fut = {nil,{"editō","ēstō"},{"editō","ēstō"},nil,{"editōte","ēstōte"},{"eduntō"}},
imper_pres_pas = {nil,{"edere","ēsse"},nil,nil,{"ediminī"},nil},
imper_fut_pas = {nil,{"editor","ēstor"},{"editor","ēstor"},nil,nil,{"eduntor"}},
}},
{"dīcō", {"dīcō"}, {
conj = "3",
nucleopres = {"dīc"},
nucleoperf = {"dīx"},
nucleosup = {"dict"},
nucleosigm = {"dīx"},
desactivar = {},
part_pas = {"dīcendus", "dīcundus", "dictus"},
imper_pres = {nil, {"dīc", "dīce"}},
inf_pas = {"dīcī", "dīcier{L}"},
}},
{"dō", {"dō"}, {
conj = "1",
nucleopres = {"d"},
nucleoperf = {"ded"},
nucleosup = {"dat"},
nucleosigm = {},
desactivar = {},
inf_act = {"dare","dedisse"},
inf_pas = {"darī"},
ind_pres = {nil,nil,nil,{"damus"},{"datis"},nil},
ind_imp = {{"dabam"},{"dabās"},{"dabat"},{"dabāmus"},{"dabātis"},{"dabant"}},
ind_fut = {{"dabō"},{"dabis"},{"dabit"},{"dabimus"},{"dabitis"},{"dabunt"}},
ind_imp_pas = {{"dabar"},{"dabāris","dabāre"},{"dabātur"},{"dabāmur"},{"dabāminī"},{"dabantur"}},
ind_fut_pas = {{"dabor"},{"daberis","dabere"},{"dabitur"},{"dabimur"},{"dabiminī"},{"dabuntur"}},
subj_imp = {{"darem"},{"darēs"},{"daret"},{"darēmus"},{"darētis"},{"darent"}},
subj_imp_pas = {{"darer"},{"darēris","darēre"},{"darētur"},{"darēmur"},{"darēminī"},{"darentur"}},
imper_pres = {nil,nil,nil,nil,{"date"},nil},
imper_fut = {nil,{"datō"},{"datō"},nil,{"datōte"},{"dantō"}},
imper_pres_pas = {nil,{"dare"},nil,nil,{"daminī"},nil},
imper_fut_pas = {nil,{"dator"},{"dator"},nil,nil,{"dator"}},
}},
{"dūcō", {"dūcō"}, {
conj = "3",
nucleopres = {"dūc"},
nucleoperf = {"dūx"},
nucleosup = {"duct"},
nucleosigm = {},
desactivar = {},
imper_pres = {nil, {"dūc", "dūce"}},
}},
{"eō", {"eō", "ëō"}, {
conj = "4",
nucleopres = {""},
nucleoperf = {""},
nucleosup = {""},
nucleosigm = {},
desactivar = {"imper_pres_pas"},
inf_act = {"īre","īsse","iisse","īvisse"},
inf_pas = {"īrī","īrier"},
part_act = {"iēns","itūrus"},
part_pas = {"eundum","itum"},
ger = {"eundī","eundō","eundum"},
sup = {"itum","itū"},
ind_pres = {{"eō"},{"īs"},{"it"},{"īmus"},{"ītis"},{"eunt"}},
ind_imp = {{"ībam"},{"ībās"},{"ībat"},{"ībāmus"},{"ībātis"},{"ībant"}},
ind_perf = {{"iī","īvī"},{"īstī","iistī","īvistī"},{"iit","īvit"},{"iimus","īvimus"},{"īstis","iistis","īvistis"},{"iērunt","iēre","īvērunt","īvēre"}},
ind_pluperf = {{"ieram","īveram"},{"ierās","īverās"},{"ierat","īverat"},{"ierāmus","īverāmus"},{"ierātis","īverātis"},{"ierant","īverant"}},
ind_fut = {{"ībō"},{"ībis"},{"ībit"},{"ībimus"},{"ībitis"},{"ībunt"}},
ind_fut_perf = {{"ierō","īverō"},{"ieris","īveris"},{"ierit","īverit"},{"ierimus","īverimus"},{"ieritis","īveritis"},{"ierint","īverint"}},
ind_fut_sig = {nil,nil,nil,nil,nil,nil},
ind_pres_pas = {{},{},{"ītur"},{},{},{}},
ind_imp_pas = {{},{},{"ībātur"},{},{},{}},
ind_fut_pas = {{},{},{"ībitur"},{},{},{}},
subj_pres = {{"eam"},{"eās"},{"eat"},{"eāmus"},{"eātis"},{"eant"}},
subj_imp = {{"īrem"},{"īrēs"},{"īret"},{"īrēmus"},{"īrētis"},{"īrent"}},
subj_perf = {{"ierim","īverim"},{"ierīs","īverīs"},{"ierit","īverit"},{"ierīmus","īverīmus"},{"ierītis","īverītis"},{"ierint","īverint"}},
subj_pluperf = {{"īssem","iissem","īvissem"},{"īssēs","iissēs","īvissēs"},{"īsset","iisset","īvisset"},{"īssēmus","iissēmus","īvissēmus"},{"īssētis","iissētis","īvissētis"},{"īssent","iissent","īvissent"}},
subj_aor_sig = {nil,nil,nil,nil,nil,nil},
subj_pres_pas = {{},{},{"eātur"},{},{},{}},
subj_imp_pas = {{},{},{"īrētur"},{},{},{}},
imper_pres = {nil,nil,nil,nil,nil,nil},
imper_fut = {nil,nil,nil,nil,nil,{"euntō"}},
imper_fut_pas = {nil,{},nil,nil,nil,{}},
}},
{"faciō", {"faciō"}, {
conj = "3",
I = true,
inf_act = {"facere", "fāre{L}", "fēcisse"},
inf_pas = {"fierī"},
part_pas = {"faciendus", "faciundus", "factus"},
nucleopres = {"fac"},
nucleoperf = {"fēc"},
nucleosup = {"fact"},
nucleosigm = {"fax","faxs","facs"},
desactivar = {},
ind_pres_pas = {{"fīō"},{"fīs"},{"fit"},{"fīmus"},{"fītis"},{"fīunt"}},
ind_imp_pas = {{"fīēbam"},{"fīēbās"},{"fīēbat"},{"fīēbāmus"},{"fīēbātis"},{"fīēbant"}},
ind_fut_pas = {{"fīam"},{"fīēs"},{"fīet"},{"fīēmus"},{"fīētis"},{"fīent"}},
subj_pres_pas = {{"fīam"},{"fīās"},{"fīat"},{"fīāmus"},{"fīātis"},{"fīant"}},
subj_imp_pas = {{"fierem"},{"fierēs"},{"fieret"},{"fierēmus"},{"fierētis"},{"fierent"}},
imper_pres = {nil,{"fac","face"},nil,nil,nil,nil},
imper_pres_pas = {nil,{"fī"},nil,nil,{"fīte"},nil},
imper_fut_pas = {nil,{"fītō"},{"fītō"},nil,{"fītōte"},{"fīuntō"}},
}},
{"ferō", {"ferō"}, {
conj = "3",
nucleopres = {"fer"},
nucleoperf = {"tul", "tetul{†}"},
nucleosup = {"lāt"},
nucleosigm = {},
desactivar = {},
inf_act = {"ferre", "tulisse", "tetulisse{†}"},
inf_pas = {"ferrī"},
ind_pres = {nil,{"fers"},{"fert"},nil,{"fertis"}},
ind_pres_pas = {nil,{"ferris","ferre"}},
subj_imp = {{"ferrem"},{"ferrēs"},{"ferret"},{"ferrēmus"},{"ferrētis"},{"ferrent"}},
subj_imp_pas = {{"ferrer"},{"ferrēris","ferrēre"},{"ferrētur"},{"ferrēmur"},{"ferrēminī"},{"ferrentur"}},
imper_pres = {nil,{"fer"},nil,nil,{"ferte"},nil},
imper_pres_pas = {nil,{"ferre"},nil,nil,nil,nil},
imper_fut = {nil,{"fertō"},{"fertō"},nil,{"fertōte"},{"feruntō"}},
imper_fut_pas = {nil,{"fertor"},{"fertor"},nil,nil,nil},
}},
{"fīō", {"fīō"}, {
conj = "3",
nucleopres = {"fī"},
nucleoperf = {},
nucleosup = {"fact"},
nucleosigm = {},
semidep = true,
desactivar = {},
inf_act = {"fierī"},
ind_pres = {{"fīō"},{"fīs"},{"fit"},{"fīmus"},{"fītis"},{"fīunt"}},
imper_pres = {nil,{"fī"},nil,nil,{"fīte"},nil},
imper_fut = {nil,{"fītō"},{"fītō"},nil,{"fītōte"},{"fīuntō"}},
}},
{"inquam", {"inquam"}, {
conj = "3",
I = true,
nucleopres = {"inqu"},
nucleoperf = {},
nucleosup = {},
nucleosigm = {},
nopasivo = true,
desactivar = {"inf_act","inf_pas","part_pas","ger"},
ind_pres = {{"inquam"}},
}},
{"possum", {"possum"}, {
conj = "3",
nucleopres = {"pot"},
nucleoperf = {"pot"},
nucleosup = {},
nucleosigm = {},
pres = "possō",
desactivar = {"inf_pas","part_pas","ger","sup","ind_pres_pas","ind_imp_pas","ind_fut_pas",
"subj_pres_pas","subj_imp_pas","imper_pres","imper_fut","imper_pres_pas","imper_fut_pas"},
inf_act = {"posse","potesse{†}"},
part_act = {"potēns"},
ind_pres = {{"possum"},{"potes"},{"potest"},{"possumus"},{"potestis"},{"possunt"}},
ind_imp = {{"poteram"},{"poterās"},{"poterat"},{"poterāmus"},{"poterātis"},{"poterant"}},
ind_fut = {{"poterō"},{"poteris","potere"},{"poterit"},{"poterimus"},{"poteritis"},{"poterunt"}},
ind_perf = {{"potuī"},{"potuistī"},{"potuit"},{"potuimus"},{"potuistis"},{"potuērunt","potuēre"}},
ind_pluperf = {{"potueram"},{"potuerās"},{"potuerat"},{"potuerāmus"},{"potuerātis"},{"potuerant"}},
ind_fut_perf = {{"potuerō"},{"potueris"},{"potuerit"},{"potuerimus"},{"potueritis"},{"potuerunt"}},
subj_pres = {{"possem"},{"possēs"},{"possēt"},{"possēmus"},{"possētis"},{"possent"}},
subj_imp = {{"possim"},{"possīs"},{"possit"},{"possīmus"},{"possītis"},{"possint"}},
subj_perf = {{"potuerim"},{"potuerīs"},{"potuerit"},{"potuerīmus"},{"potuerītis"},{"potuerint"}},
subj_pluperf = {{"potuissem"},{"potuissēs"},{"potuisset"},{"potuissēmus"},{"potuissētis"},{"potuissent"}},
}},
{"sum", {"sum"}, {
conj = "3",
nucleopres = {"s"},
nucleoperf = {"fu"},
nucleosup = {},
nucleosigm = {},
pres = "sō",
desactivar = {"inf_pas","part_pas","ger","sup","ind_pres_pas","ind_imp_pas","ind_fut_pas",
"subj_pres_pas","subj_imp_pas","imper_pres_pas","imper_fut_pas"},
inf_act = {"esse"},
part_act = {"futūrus"},
ind_pres = {{"sum"},{"es"},{"est"},{"sumus"},{"estis"},{"sunt"}},
ind_imp = {{"eram"},{"erās"},{"erat"},{"erāmus"},{"erātis"},{"erant"}},
ind_fut = {{"erō"},{"eris","ere"},{"erit"},{"erimus"},{"eritis"},{"erunt"}},
subj_pres = {{"sim","siem","fuam{†}"},{"sīs","siēs","fuās{†}"},{"sit","siet","fuat{†}"},{"sīmus","siēmus","fuāmus{†}"},{"sītis","siētis","fuātis{†}"},{"sint","sient","fuant{†}"}},
subj_imp = {{"essem","forem"},{"essēs","forēs"},{"esset","foret"},{"essēmus","forēmus"},{"essētis","forētis"},{"essent","forent"}},
imper_pres = {nil,{"es"},nil,nil,{"este"},nil},
imper_fut = {nil,{"estō"},{"estō"},nil,{"estōte"},nil},
}},
{"mālō", {"mālō"}, {
conj = "3",
nucleopres = {"māl"},
nucleoperf = {"mālu"},
nucleosup = {},
nucleosigm = {},
desactivar = {"sup","ger","inf_pas","part_pas","ind_pres_pas","ind_imp_pas","ind_fut_pas","subj_pres_pas","subj_imp_pas",
"imper_pres","imper_fut","imper_pres_pas","imper_fut_pas"},
inf_act = {"mālle","māluisse"},
ind_pres = {{"mālō"},{"māvīs"},{"māvult"},{"mālumus"},{"māvultis"},{"mālunt"}},
subj_pres = {{"mālim"},{"mālīs"},{"mālit"},{"mālīmus"},{"mālītis"},{"mālint"}},
subj_imp = {{"māllem"},{"māllēs"},{"māllet"},{"māllēmus"},{"māllētis"},{"māllent"}},
}},
{"nōlō", {"nōlō"}, {
conj = "3",
nucleopres = {"nōl"},
nucleoperf = {"nōlu"},
nucleosup = {},
nucleosigm = {},
desactivar = {"sup","ger","inf_pas","part_pas","ind_pres_pas","ind_imp_pas","ind_fut_pas","subj_pres_pas","subj_imp_pas",
"imper_pres","imper_fut","imper_pres_pas","imper_fut_pas"},
inf_act = {"nōlle","nōluisse"},
ind_pres = {{"nōlō"},{"nōn vīs","nevīs{†}"},{"nōn vult","nōn volt","nevolt{†}"},{"nōlumus"},{"nōn vultis","nōn voltis","nōltis{†}"},{"nōlunt"}},
subj_pres = {{"nōlim"},{"nōlīs"},{"nōlit"},{"nōlīmus"},{"nōlītis"},{"nōlint"}},
subj_imp = {{"nōllem"},{"nōllēs"},{"nōllet"},{"nōllēmus"},{"nōllētis"},{"nōllent"}},
}},
{"volō", {"volō"}, {
conj = "3",
nucleopres = {"vol"},
nucleoperf = {"volu"},
nucleosup = {"volit"},
nucleosigm = {},
desactivar = {"sup","ger","inf_pas","part_pas","ind_pres_pas","ind_imp_pas","ind_fut_pas","subj_pres_pas","subj_imp_pas",
"imper_pres","imper_fut","imper_pres_pas","imper_fut_pas"},
inf_act = {"velle","voluisse"},
ind_pres = {{"volō"},{"vīs"},{"vult","volt{†}"},{"volumus"},{"vultis","voltis{†}"},{"volunt"}},
subj_pres = {{"velim","volim{†}"},{"velīs","volīs{†}"},{"velit","volit{†}"},{"velīmus","volīmus{†}"},{"velītis","volītis{†}"},{"velint","volint{†}"}},
subj_imp = {{"vellem"},{"vellēs"},{"vellet"},{"vellēmus"},{"vellētis"},{"vellent"}},
}},
}
local function combinar_prefijo_nucleosufijo(prefijo, nucleosufijo)
return prefijo..nucleosufijo
end
local function combinar_nucleo_sufijo(nucleo, sufijo, agregar_i)
if agregar_i and (not find(sufijo, "^[iī]")) and (sufijo ~= "e") and (not find(sufijo, "^er")) then
return nucleo.."~i~"..sufijo
end
return nucleo..sufijo
end
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local sufijos_ = sufijos[conjinfo.conj][forma]
local nucleos
local prefijo
if forma == "sup" then
nucleos = conjinfo.nucleosup
prefijo = conjinfo.prefijosup or conjinfo.prefijo
elseif find(forma, "sig") then
nucleos = conjinfo.nucleosigm
prefijo = conjinfo.prefijosigm or conjinfo.prefijo
elseif find(forma, "perf") then
nucleos = conjinfo.nucleoperf
prefijo = conjinfo.prefijoperf or conjinfo.prefijo
else
nucleos = conjinfo.nucleopres
prefijo = conjinfo.prefijo
end
if formas_no_personales[forma] then
if conjinfo[forma][1] then
if nucleos and #nucleos > 0 then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], "#"..combinar_prefijo_nucleosufijo(prefijo, fm).."#")
end
end
else
for _, sufijo in ipairs(sufijos_) do
local nucleos_ = nucleos
if forma == "inf_act" and sufijo == "isse" then
nucleos_ = conjinfo.nucleoperf
elseif forma == "part_act" and sufijo == "ūrus" then
nucleos_ = conjinfo.nucleosup
elseif forma == "part_pas" and sufijo == "us" then
nucleos_ = conjinfo.nucleosup
end
local agregar_i = conjinfo.I and nucleos_ == conjinfo.nucleopres
for _,nucleo in ipairs(nucleos_) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleosufijo(prefijo, combinar_nucleo_sufijo(nucleo, sufijo, agregar_i)))
end
end
end
return
end
for i = EGO, EI do
local p = tostr[i]
if conjinfo[forma][i] then
if nucleos and #nucleos > 0 then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], "#"..combinar_prefijo_nucleosufijo(prefijo, fm).."#")
end
end
else
local k = i
while sufijos_[k] do
local agregar_i = conjinfo.I and nucleos == conjinfo.nucleopres
for j, n in ipairs(nucleos) do
local x = combinar_prefijo_nucleosufijo(prefijo, combinar_nucleo_sufijo(n, sufijos_[k], agregar_i))
if conjinfo.always_sync_perf and (forma == "ind_perf" or forma == "ind_pluperf" or forma == "ind_fut_perf" or forma == "subj_perf" or forma == "subj_pluperf") then
x = x:gsub("īvī", "iī")
x = x:gsub("īvi", "ī")
x = x:gsub("īve", "ī")
x = x:gsub("īvē", "ē")
end
insert_if_not(conjugado[forma..p], x)
end
k = k + 6
end
end
end
end
local function get_subtype_by_ending(pres, conjinfo, specs)
for _, spec in ipairs(specs) do
local base = extract_base(pres, spec[1])
if base then
for _,s in ipairs(spec[2]) do
if conjinfo[s] == nil then
conjinfo[s] = true
end
end
return base
end
end
error("Unrecognized ending for conjugation " .. conjinfo["conj"])
end
local function detect_v_type_and_subtypes(conjinfo)
local pres = conjinfo["v"]
local conj_arg = conjinfo["conj"]
pres = toNFC(pres)
local base_conj_arg, auto_perf_supine = conj_arg:match("^([124]/?4?)(%+%+?)$")
if base_conj_arg then
if auto_perf_supine == "++" and base_conj_arg ~= "4" then
error("Conjugation types 1++ and 2++ not allowed")
end
conj_arg = base_conj_arg
end
conjinfo.conj = conj_arg
if conj_arg == "1" then
local base = get_subtype_by_ending(pres, conjinfo, {
{"ō", {}},
{"or", {"dep"}},
{"at", {"impers"}},
{"ātur", {"dep", "impers"}},
{"ī", {"nopres"}},
{"it", {"nopres", "impers"}},
})
if not conjinfo["nucleopres"][1] then
conjinfo["nucleopres"][1] = base
end
if auto_perf_supine then
if not conjinfo["nucleoperf"][1] then
conjinfo["nucleoperf"][1] = base .. "āv"
end
if not conjinfo["nucleosup"][1] then
conjinfo["nucleosup"][1] = base .. "āt"
end
end
if conjinfo.sigm then
if not conjinfo["nucleosigm"][1] then
conjinfo["nucleosigm"][1] = base .. "āss"
end
end
elseif conj_arg == "2" then
local base = get_subtype_by_ending(pres, conjinfo, {
{"eō", {}},
{"eor", {"dep"}},
{"et", {"impers"}},
{"ētur", {"dep", "impers"}},
{"ī", {"nopres"}},
{"it", {"nopres", "impers"}},
})
if not conjinfo["nucleopres"][1] then
conjinfo["nucleopres"][1] = base
end
if auto_perf_supine then
if not conjinfo["nucleoperf"][1] then
conjinfo["nucleoperf"][1] = base .. "u"
end
if not conjinfo["nucleosup"][1] then
conjinfo["nucleosup"][1] = base .. "it"
end
end
if conjinfo.sigm then
if not conjinfo["nucleosigm"][1] then
conjinfo["nucleosigm"][1] = base .. "ēss"
end
end
elseif conj_arg == "3" then
local base
if conjinfo.I == false then -- si explícitamente se indicó que no es del tipo -io, hay que excluir sufijos
base = get_subtype_by_ending(pres, conjinfo, {
{"ō", {}},
{"or", {"dep"}},
{"it", {"impers"}},
{"itur", {"dep", "impers"}},
{"ī", {"nopres"}},
})
else
base = get_subtype_by_ending(pres, conjinfo, {
{"iō", {"I"}},
{"ior", {"dep", "I"}},
{"ō", {}},
{"or", {"dep"}},
{"it", {"impers"}},
{"itur", {"dep", "impers"}},
{"ī", {"nopres"}},
})
end
if not conjinfo["nucleopres"][1] then
conjinfo["nucleopres"][1] = base
end
if not conjinfo["nucleoperf"][1] and conjinfo["nopres"] then
conjinfo["nucleoperf"][1] = base
end
assert(conjinfo["nucleoperf"][1], "especifique todos los núcleos para verbos de la tercera conjugación")
assert(conjinfo["nucleosup"][1], "especifique todos los núcleos para verbos de la tercera conjugación")
if conjinfo.sigm then
if not conjinfo["nucleosigm"][1] then
conjinfo["nucleosigm"][1] = base .. "ēss"
end
end
elseif conj_arg == "3/4" then
local base
base = get_subtype_by_ending(pres, conjinfo, {
{"iō", {"I"}},
{"ior", {"dep", "I"}},
})
if not conjinfo["nucleopres"][1] then
conjinfo["nucleopres"][1] = base
end
if not conjinfo["nucleoperf"][1] and conjinfo["nopres"] then
conjinfo["nucleoperf"][1] = base
end
if not conjinfo["nucleoperf"][1] and auto_perf_supine == "++" then
conjinfo["nucleoperf"][1] = base .. "īv"
conjinfo["nucleoperf"][2] = base .. "i"
end
if not conjinfo["nucleoperf"][1] and auto_perf_supine == "+" then
conjinfo["nucleoperf"][1] = base .. "īv"
end
if not conjinfo["nucleosup"][1] and auto_perf_supine then
conjinfo["nucleosup"][1] = base .. "īt"
end
if conjinfo.sigm then
if not conjinfo["nucleosigm"][1] then
conjinfo["nucleosigm"][1] = base .. "īss"
end
end
elseif conj_arg == "4" then
local base = get_subtype_by_ending(pres, conjinfo, {
{"iō", {}},
{"ior", {"dep"}},
{"it", {"impers"}},
{"ītur", {"dep", "impers"}},
{"ī", {"nopres"}},
})
if not conjinfo["nucleopres"][1] then
conjinfo["nucleopres"][1] = base
end
if not conjinfo["nucleoperf"][1] and conjinfo["nopres"] then
conjinfo["nucleoperf"][1] = base
end
if not conjinfo["nucleoperf"][1] and auto_perf_supine == "++" then
conjinfo["nucleoperf"][1] = base .. "īv"
conjinfo["nucleoperf"][2] = base .. "i"
end
if not conjinfo["nucleoperf"][1] and auto_perf_supine == "+" then
conjinfo["nucleoperf"][1] = base .. "īv"
end
if not conjinfo["nucleosup"][1] and auto_perf_supine then
conjinfo["nucleosup"][1] = base .. "īt"
end
if conjinfo.sigm then
if not conjinfo["nucleosigm"][1] then
conjinfo["nucleosigm"][1] = base .. "īss"
end
end
elseif conj_arg == "irreg" then
for _,p in ipairs(verbos_irregulares) do
for _,rx in ipairs(p[2]) do
local pref, verb = match(conjinfo.v, "^(.*)("..rx..")$")
if verb then
conjinfo.v = verb
conjinfo.prefijo = pref
if conjinfo.nucleoperf[1] and conjinfo.nucleoperf[1] ~= "-" then -- [[ecfero]]
conjinfo.prefijoperf = conjinfo.nucleoperf[1]
conjinfo.nucleoperf = {}
end
if conjinfo.nucleosup[1] and conjinfo.nucleosup[1] ~= "-" then
conjinfo.prefijosup = conjinfo.nucleosup[1]
conjinfo.nucleosup = {}
end
if conjinfo.nucleosigm[1] and conjinfo.nucleosigm[1] ~= "-" then
conjinfo.prefijosigm = conjinfo.nucleosigm[1]
conjinfo.nucleosigm = {}
end
conjinfo.irreg = true
conjinfo.conj = p[3].conj
for k,val in pairs(p[3]) do
if not conjinfo[k] or (type(conjinfo[k]) == "table" and not conjinfo[k][1]) then
conjinfo[k] = deep_copy(val)
end
end
return conjinfo
end
end
end
error("Unrecognized conjugation '" .. conj_arg .. "'")
else
error("Unrecognized conjugation '" .. conj_arg .. "'")
end
return conjinfo
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {alias_de = "conj"},
[2] = {alias_de = "pres"},
[3] = {alias_de = "nucleoperf"},
[4] = {alias_de = "nucleosup"},
[5] = {alias_de = "nucleosigm"},
["impers"] = {}, -- pas para formas pasivas solamente
["impersonal"] = {alias_de = "impers"},
["dep"] = {tipo="bool"},
["depon"] = {alias_de="dep"},
["deponente"] = {alias_de="dep"},
["semidep"] = {tipo="bool"},
["semidepon"] = {alias_de="semidep"},
["semideponente"] = {alias_de="semidep"},
["sigm"] = {tipo="bool"},
["nopasivo"] = {tipo="bool"},
["soloperf"] = {tipo="bool"},
["I"] = {tipo="bool"},
["p3inf"] = {tipo="bool"}, -- sin uso
["poet_sync_perf"] = {tipo="bool"}, -- sin uso
["always_sync_perf"] = {tipo="bool"}, -- solo en [[saevio]]
["opt_sync_perf"] = {tipo="bool"}, -- sin uso
["opt_semi_depon"] = {tipo="bool"}, -- sin uso
["old_impf_futr"] = {tipo="bool"}, -- sin uso
["conj"] = {requerido=true},
["pres"] = {requerido=true},
["nucleopres"] = {lista = true},
["nucleoperf"] = {lista = true},
["nucleosup"] = {lista = true},
["nucleosigm"] = {lista = true},
["núcleopres"] = {alias_de="nucleopres"},
["núcleoperf"] = {alias_de="nucleoperf"},
["núcleosup"] = {alias_de="nucleosup"},
["paradigma"] = {lista = true},
["desactivarnucleos"] = {tipo="bool", por_defecto=true}, -- para [[-o]]
["nota"] = {},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(not find(tit, " "), "locuciones no soportadas aún")
assert(not (args["dep"] and args["semidep"]), "un verbo no puede ser deponente y semideponente a la vez")
local conjinfo = {
conj = args.conj,
prefijo="",
v=args.pres,
desactivar = {},
dep=args.dep,
semidep=args.semidep,
sigm=args.sigm,
impers=args.impers,
nopasivo=args.nopasivo,
soloperf=args.soloperf,
I=args.I,
p3inf=args.p3inf,
poet_sync_perf=args.poet_sync_perf, -- sin uso
always_sync_perf=args.always_sync_perf,
nucleopres = deep_copy(args.nucleopres),
nucleoperf = deep_copy(args.nucleoperf),
nucleosup = deep_copy(args.nucleosup),
nucleosigm = deep_copy(args.nucleosigm)
}
conjinfo = detect_v_type_and_subtypes(conjinfo)
if conjinfo.impers == true then
conjinfo.impers = "3"
end
-- no puede ir conjinfo acá abajo porque si es un sufijo va a quedar "-" en la raíz, lo que anularía todas las formas conjugadas, tiene que venir directo de args
if args.desactivarnucleos then
if args.nucleopres[1] == "-" then
conjinfo.nucleopres = {}
end
if args.nucleoperf[1] == "-" then
conjinfo.nucleoperf = {}
end
if args.nucleosup[1] == "-" then
conjinfo.nucleosup = {}
end
if args.nucleosigm[1] == "-" then
conjinfo.nucleosigm = {}
end
end
local es_irregular = conjinfo.irreg
for _,d in ipairs(conjinfo.desactivar) do
if formas_no_personales[d] then
args[d] = {"no"}
else
args[d.."2"] = {"no"}
end
end
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
local resultante = sobreescribir_formas(conjugado, args)
local mostrar_fut_sig = #resultante["ind_fut_sig1"] > 0
local mostrar_aor_sig = #resultante["subj_aor_sig1"] > 0
local defectivo = comprobar_defectivo(resultante, {"^imper", "_sig"}, tostr)
local defect2
resultante, defect2 = desactivar_formas(resultante,
function (form)
return (conjinfo.nopasivo and form:find("_pas")) or (conjinfo.soloperf and not form:find("perf")) or (conjinfo.impers == "pas" and form:find("_pas[^3]")) or (conjinfo.impers == "pas3" and form:find("_pas[^3]")) or (conjinfo.impers == "pas36" and form:find("_pas[^36]"))
end
)
if defect2 then
defectivo = true
end
-- por ahora innecesario
-- local part_no_adj = {}
-- for _,e in ipairs(resultante.part) do
-- if (find(e, 'PART') or not find(e, 'ADJ')) and not find(e, "†") then
-- insert(part_no_adj, gsub1(e, '%b{}', ''))
-- end
-- end
local tit_pres = f(resultante["ind_pres1"][1] or "―")
local tit_inf = f(resultante["inf_act"][1] or "―")
local tit_perf = f(resultante["ind_perf1"][1] or "―")
local tit_sup = f(resultante["sup"][1] or "―")
resultante = agregar_enlaces(resultante, tit, normalizar_enlace)
local es_impersonal = conjinfo.impers
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local impers = conjinfo.impers
local cs, cs1, cs2, fila_pronombres_ind, fila_pronombres_subj, fila_pronombres_imper, mostrar_imper
if impers == "3" then
fila_pronombres_ind = {"", "(id)", color=COLOR_IND, header=true, class="pc"}
fila_pronombres_subj = {"", "(quod id)", color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", "(id)", color=COLOR_IMPER, header=true, class="pc"}
cs = 2
elseif impers == "36" then
error("no soportado actualmente")
cs = 3
else
fila_pronombres_ind = {"", PRONOMBRES[1], PRONOMBRES[2], PRONOMBRES[3], PRONOMBRES[4], PRONOMBRES[5], PRONOMBRES[6], color=COLOR_IND, header=true, class="pc"}
fila_pronombres_subj = {"", PRONOMBRES_SUBJ[1], PRONOMBRES_SUBJ[2], PRONOMBRES_SUBJ[3], PRONOMBRES_SUBJ[4], PRONOMBRES_SUBJ[5], PRONOMBRES_SUBJ[6], color=COLOR_SUBJ, header=true, class="pc"}
fila_pronombres_imper = {"", PRONOMBRES_IMP[1], PRONOMBRES_IMP[2], PRONOMBRES_IMP[3], PRONOMBRES_IMP[4], PRONOMBRES_IMP[5], PRONOMBRES_IMP[6], color=COLOR_IMPER, header=true, class="pc"}
cs = 7
mostrar_imper = true
end
cs1 = cs -- math.floor(cs / 2)
-- cs2 = cs - cs1
local t = {}
insert(t, {{"Formas no personales (verboides)", colspan=cs}, color=COLOR_H, header=true})
if impers == "3" then
insert(t, {{"Infinitivo activo", header=true, color=COLOR_NP}, resultante.inf_act})
insert(t, {{"Infinitivo pasivo", header=true, color=COLOR_NP}, resultante.inf_pas})
insert(t, {{"Participio activo", header=true, color=COLOR_NP}, resultante.part_act})
insert(t, {{"Participio pasivo", header=true, color=COLOR_NP}, resultante.part_pas})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Supino", header=true, color=COLOR_NP}, resultante.sup})
else
resultante.inf_act.colspan = cs1-1
resultante.inf_pas.colspan = cs1-1
resultante.part_act.colspan = cs1-1
resultante.part_pas.colspan = cs1-1
resultante.ger.colspan = cs1-1
resultante.sup.colspan = cs1-1
if conjinfo.dep then
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf_pas})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part_pas})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Supino", header=true, color=COLOR_NP}, resultante.sup})
elseif conjinfo.semidep then
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf_act})
insert(t, {{"Participio", header=true, color=COLOR_NP}, resultante.part_act})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Supino", header=true, color=COLOR_NP}, resultante.sup})
else
insert(t, {{"Infinitivo activo", header=true, color=COLOR_NP}, resultante.inf_act})
insert(t, {{"Infinitivo pasivo", header=true, color=COLOR_NP}, resultante.inf_pas})
insert(t, {{"Participio activo", header=true, color=COLOR_NP}, resultante.part_act})
insert(t, {{"Participio pasivo", header=true, color=COLOR_NP}, resultante.part_pas})
insert(t, {{"Gerundio", header=true, color=COLOR_NP}, resultante.ger})
insert(t, {{"Supino", header=true, color=COLOR_NP}, resultante.sup})
end
end
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
insert(t, {{"Formas personales", colspan=cs}, color=COLOR_H, header=true})
insert(t, {{"Modo indicativo", colspan=cs}, color=COLOR_IND, header=true})
insert(t, fila_pronombres_ind)
if conjinfo.dep then
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres_pas")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp_pas")})
insert(t, {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut_pas")})
if mostrar_fut_sig then
insert(t, {{f("Futuro sigmático{†}"), color=COLOR_IND, header=true}, ic("ind_fut_sig")})
end
elseif conjinfo.semidep then
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")})
insert(t, {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")})
if mostrar_fut_sig then
insert(t, {{f("Futuro sigmático{†}"), color=COLOR_IND, header=true}, ic("ind_fut_sig")})
end
else
insert(t, {{"Presente", color=COLOR_IND, header=true}, ic("ind_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_IND, header=true}, ic("ind_imp")})
insert(t, {{"Futuro", color=COLOR_IND, header=true}, ic("ind_fut")})
insert(t, {{"Pretérito perfecto", color=COLOR_IND, header=true}, ic("ind_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_IND, header=true}, ic("ind_pluperf")})
insert(t, {{"Futuro perfecto", color=COLOR_IND, header=true}, ic("ind_fut_perf")})
if mostrar_fut_sig then
insert(t, {{f("Futuro sigmático{†}"), color=COLOR_IND, header=true}, ic("ind_fut_sig")})
end
insert(t, {{"Presente pasivo", color=COLOR_IND, header=true}, ic("ind_pres_pas")})
insert(t, {{"Pretérito imperfecto pasivo", color=COLOR_IND, header=true}, ic("ind_imp_pas")})
insert(t, {{"Futuro pasivo", color=COLOR_IND, header=true}, ic("ind_fut_pas")})
end
insert(t, {{"Modo subjuntivo", colspan=cs}, color=COLOR_SUBJ, header=true})
insert(t, fila_pronombres_subj)
if conjinfo.dep then
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres_pas")})
insert(t, {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp_pas")})
if mostrar_aor_sig then
insert(t, {{f("Aorista sigmático{†}"), color=COLOR_SUBJ, header=true}, ic("subj_aor_sig")})
end
elseif conjinfo.semidep then
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")})
if mostrar_aor_sig then
insert(t, {{f("Aorista sigmático{†}"), color=COLOR_SUBJ, header=true}, ic("subj_aor_sig")})
end
else
insert(t, {{"Presente", color=COLOR_SUBJ, header=true}, ic("subj_pres")})
insert(t, {{"Pretérito imperfecto", color=COLOR_SUBJ, header=true}, ic("subj_imp")})
insert(t, {{"Pretérito perfecto", color=COLOR_SUBJ, header=true}, ic("subj_perf")})
insert(t, {{"Pretérito pluscuamperfecto", color=COLOR_SUBJ, header=true}, ic("subj_pluperf")})
if mostrar_aor_sig then
insert(t, {{f("Aorista sigmático{†}"), color=COLOR_SUBJ, header=true}, ic("subj_aor_sig")})
end
insert(t, {{"Presente pasivo", color=COLOR_SUBJ, header=true}, ic("subj_pres_pas")})
insert(t, {{"Pretérito imperfecto pasivo", color=COLOR_SUBJ, header=true}, ic("subj_imp_pas")})
end
insert(t, {{"Modo imperativo", colspan=cs}, color=COLOR_IMPER, header=true})
insert(t, fila_pronombres_imper)
if mostrar_imper then
if conjinfo.dep then
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper_pres_pas")})
insert(t, {{"Futuro", color=COLOR_IMPER, header=true}, ic("imper_fut_pas")})
elseif conjinfo.semidep then
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper_pres")})
insert(t, {{"Futuro", color=COLOR_IMPER, header=true}, ic("imper_fut")})
else
insert(t, {{"Presente", color=COLOR_IMPER, header=true}, ic("imper_pres")})
insert(t, {{"Futuro", color=COLOR_IMPER, header=true}, ic("imper_fut")})
insert(t, {{"Presente pasivo", color=COLOR_IMPER, header=true}, ic("imper_pres_pas")})
insert(t, {{"Futuro pasivo", color=COLOR_IMPER, header=true}, ic("imper_fut_pas")})
end
else
insert(t, {{"Como verbo "..(impers == "3" and "impersonal" or "terciopersonal")..", ''"..tit.."'' CARECE de imperativo", color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{f("Leyenda: † arcaico, x no normativo, ~■~ cambio ortográfico, #■# irregularidad"), colspan=cs}})
args["nota"] = args["nota"] or ""
if conjinfo.impers == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if conjinfo.impers == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if conjinfo.impers == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if conjinfo.impers == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if conjinfo.impers == "pas" or conjinfo.imeprs == "pas3" then
args["nota"] = args["nota"].." NOTA: impersonal para las formas pasivas"
end
if conjinfo.impers == "pas36" then
args["nota"] = args["nota"].." NOTA: formas pasivas terciopersonales (solamente tercera persona singular y plural)"
end
if conjinfo.soloperf then
args["nota"] = args["nota"].. " NOTA: solo se emplean las formas del perfecto y pluscuamperfecto con valor de presente, imperfecto o futuro"
end
if conjinfo.nopasivo then
args["nota"] = args["nota"].. " NOTA: solo se emplean las formas activas"
end
insert(t, {{args["nota"] and args["nota"] or "", colspan=cs}})
local cats = {}
local subtits = {}
local conj_str
if conjinfo.conj == "1" then
conj_str = "primera conjugación"
elseif conjinfo.conj == "2" then
conj_str = "segunda conjugación"
elseif conjinfo.conj == "3" then
conj_str = "tercera conjugación"
elseif conjinfo.conj == "3/4" then
conj_str = "tercera/cuarta conjugación"
else
conj_str = "cuarta conjugación"
end
insert(cats, "LA:Verbos de la "..conj_str)
insert(subtits, conj_str)
impers = impers or ""
if impers == "3" or find(impers, "^u[tm]c3$") then
insert(subtits, "impersonal")
insert(cats, "LA:Verbos impersonales")
end
if defectivo then
insert(subtits, "defectivo")
insert(cats, "LA:Verbos defectivos")
end
if conjinfo.dep then
insert(subtits, "deponente")
insert(cats, "LA:Verbos deponentes")
end
if conjinfo.semidep then
insert(subtits, "semideponente")
insert(cats, "LA:Verbos semideponentes")
end
if es_irregular then
insert(subtits, "irregular")
insert(cats, "LA:Verbos irregulares")
else
insert(subtits, "regular")
insert(cats, "LA:Verbos regulares")
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..tit_pres..", "..tit_inf..", "..tit_perf..", "..tit_sup.."'''''  ("..concat(subtits, ", ")..")",
t,
ns == 0 and cats or {})
end
function export.adv(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local head = args[1]
local modo = args[2]
local enc
local cats = {}
local cat_pref = "LA:Adverbios"
if modo == "-" then
enc = "sin comparativo ni superlativo"
insert(cats, cat_pref.." incomparables")
return renderizar_encabezado(
frame,
head,
enc,
args["nota"],
{},
ns == 0 and cats or {},
normalizar_enlace
)
end
local flex = {comp={},sup={}}
local stem
for _, suff in ipairs{"iter", "nter", "ter", "er", "iē", "ē", "rā", "im", "ō"} do
stem = match(head, "^(.*)" .. suff .. "$")
if stem ~= nil then
local comp_suff, sup_suff = "ius", "issimē"
if suff == "nter" then
stem = stem .. "nt"
end
if suff == "rā" then
comp_suff = "er" .. comp_suff
sup_suff = "imē"
end
insert(flex.comp, stem .. comp_suff)
insert(flex.sup, stem .. sup_suff)
break
end
end
if not stem and not args.comp[1] and not args.sup[1] then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō”, “-ra” or specify irregular forms or “-” if incomparable.")
end
local formas, irr = sobreescribir_formas(flex, args)
if args["comp"][1] == "no" then
enc = "sin comparativo"
insert(cats, cat_pref.." sin comparativo")
return renderizar_encabezado(
frame,
head,
enc,
args["nota"],
{{"superlativo", formas.sup, args["supnota"]}},
ns == 0 and cats or {},
normalizar_enlace
)
elseif args["sup"][1] == "no" then
enc = "sin superlativo"
insert(cats, cat_pref.." sin superlativo")
return renderizar_encabezado(
frame,
head,
enc,
args["nota"],
{{"comparativo", formas.comp, args["compnota"]}},
ns == 0 and cats or {},
normalizar_enlace
)
end
if irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
head,
enc,
args["nota"],
{{"comparativo", formas.comp, args["compnota"]},
{"superlativo", formas.sup, args["supnota"]}},
ns == 0 and cats or {},
normalizar_enlace
)
end
return export
soq77wx9e9p6y1yqab95gbh4l4p3yhr
Módulo:flex/grc
828
1059871
6307332
6076996
2026-08-06T00:34:20Z
TMCbot
164594
.
6307332
Scribunto
text/plain
-- FLEXIÓN PARA EL GRIEGO CLÁSICO
-- Adaptado desde en.wikt por Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local keys_to_list = m_table.keysToList
local maxindex = m_table.maxIndex
local deep_copy = m_table.deepCopy
local m_str = require("Módulo:string")
local len = m_str.len
local find = m_str.find
local gsub = m_str.gsub
local match = m_str.match
local sub = m_str.sub
local split = m_str.split
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFD = m_str_avanzado.toNFD
local toNFC = m_str_avanzado.toNFC
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local separar_palabras = m_flex.separar_palabras
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local agregar_colores = m_flex.agregar_colores
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local MODULE_PATH = "Módulo:flex/grc"
local m_classes = mw.loadData(MODULE_PATH .. '/clases')
local m_paradigms = mw.loadData(MODULE_PATH .. '/paradigmas')
local m_dialect_groups = mw.loadData(MODULE_PATH .. '/dialectos')
local m_decl_data = require(MODULE_PATH .. '/declinador')
local m_accent = require(MODULE_PATH .. '/herramientas')
local grc_utilities_data = mw.loadData(MODULE_PATH .. "/datos")
local inflections = m_decl_data.inflections
local adjinflections = m_decl_data.adjinflections
local adjinflections_con = m_decl_data.adjinflections_con
local handle_unmarked_length = m_accent.handle_unmarked_length
local normalizar_enlace = m_accent.make_entry_link
local m_translit = require("Módulo:translit/grc")
local transliterar = m_translit.transliterar
local dialectos = {
["aca"] = "acarnanio",
["ach"] = "dórico aqueo",
["aio"] = "eólico",
["ait"] = "etolio",
["ara"] = "arcadio",
["ark"] = "arcadiochipriota",
["arg"] = "argivo",
["att"] = "ático",
["boi"] = "beocio",
["buc"] = "dórico bucólico",
["gkm"] = "bizantino",
["byz"] = "bizantino",
["cho"] = "dórico coral",
["koa"] = "coense",
["ker"] = "corcirense",
["kor"] = "corintio",
["kre"] = "cretence",
["kyp"] = "chipriota",
["del"] = "délfico",
["dor"] = "dórico",
["egp"] = "egipcio",
["ele"] = "helénico",
["epi"] = "épico",
["epd"] = "epidaurio",
["epr"] = "epirota",
["eub"] = "eubeo",
["her"] = "hercúleo",
["hom"] = "homérico",
["ion"] = "jónico",
["koi"] = "koiné",
["lak"] = "laconio",
["lat"] = "poético tardío",
["les"] = "lésbico",
["lok"] = "locrio",
["lur"] = "lírico",
["lyr"] = "lírico",
["meg"] = "megarense",
["muk"] = "micénico",
["myk"] = "micénico",
["ato"] = "ático antiguo",
["pam"] = "pánfilo",
["pho"] = "focio",
["rho"] = "rodio",
["thr"] = "terenciano",
["the"] = "tesalio",
["tra"] = "trágico"
}
local function quote(text)
return "“" .. text .. "”"
end
local function get_accent_info(form)
-- Get position of accent (nth vowel from beginning of word).
local accent = {}
local is_suffix = form:sub(1, 1) == '-'
accent.position, accent.type = m_accent.detect_accent(form)
-- Position: position of accent from beginning of word (number) or nil.
-- Accent: accent name (string) or nil.
-- Form must have an accent, unless it is a suffix.
if not is_suffix and not next(accent) then
error('No accent detected on ' .. quote(form) ..
'. Please add an accent by copying this template and placing ' ..
quote('/') .. ' for acute or ' .. quote('~') ..
' for circumflex after the vowel that should be accented: {{subst:chars|grc|' .. form .. '}}.')
end
-- Accent term as proxy for distinguishing between oxytone and perispomenon.
accent.term = m_accent.get_accent_term(form)
return accent, is_suffix
end
local noun_ovinfo = {
NS = {"AS", "VS"},
ND = {"AD", "VD"},
NP = {"AP", "VP"},
GD = {"DD"}
}
local adj_ovinfo = {
MNS = {"MAS", "MVS", "NAS"},
MND = {"MAD", "MVD", "NAD"},
MNP = {"MAP", "MVP", "NAP"},
MGS = {"NGS"},
MGD = {"MDD", "NDD", "NGD"},
MGP = {"NGP"},
MDS = {"NDS"},
MDP = {"NDP"},
FNS = {"FAS", "FVS"},
FND = {"FAD", "FVD"},
FNP = {"FAP", "FVP"},
FGD = {"FDD"},
NNS = {"NAS", "NVS"},
NND = {"NAD", "NVD"},
NNP = {"NAP", "NVP"},
}
local function add_forms(args)
if not args.irregular then
--add stem to forms
local function add_stem(forms)
return forms:gsub('%$', args.stem)
end
-- args.suffix indicates that this is a paradigm for an unaccented suffix,
-- such as [[-εια]].
if args.indeclinable then
for k in pairs(args.ctable) do
if k:match('[NGDAV][SDP]') then -- only format case-number forms
args.ctable[k] = args[2]
end
end
elseif args.suffix and not next(args.accent) then
for k, v in pairs(args.ctable) do
if k:match('[NGDAV][SDP]') then -- only format case-number forms
args.ctable[k] = add_stem(v)
end
end
else
-- If the term is not a suffix and no accent was detected, then
-- get_accent_info above must throw an error,
-- or else there will be an uncaught error here.
local add_circumflex = args.accent.type == 'circumflex'
local recessive = -3
-- Force recessive accent in the Lesbian dialect.
local accent_position = args.dial == 'les' and recessive
or args.accent.position
-- Circumflex on monosyllabic DS and AS in consonant-stem third-
-- declension nouns: for example, Τρῷ and Τρῶ, DS and AS of Τρώς.
local DS_AS = args.accent_alternating == true
-- Added by "kles" function: for example, Περίκλεις.
local VS = args.recessive_VS and recessive
local synaeresis = args.synaeresis
local add_accent = m_accent.add_accent
local function add_accent_to_forms(forms, code)
return forms:gsub('[^/]+', function(form)
return add_accent(form,
code == 'VS' and VS or accent_position,
{
synaeresis = synaeresis,
circumflex = (code == 'DS' or code == 'AS') and DS_AS or add_circumflex,
short_diphthong = true,
force_antepenult = args.force_antepenult,
}
)
end)
end
for k, v in pairs(args.ctable) do
if k:match('[NGDAV][SDP]') then -- only format case-number forms
args.ctable[k] = add_accent_to_forms(add_stem(v), k)
end
end
end
end
end
local gender_codes = { 'M', 'F', 'N' }
local case_codes = { 'N', 'G', 'D', 'A', 'V' }
local number_codes = { 'S', 'D', 'P' }
--[=[
Gets stem-ending combinations from [[Module:grc-decl/decl/data]]
and [[Module:grc-decl/decl/staticdata]]. Called a single time to get forms
of a noun, and two or three times by make_decl_adj for each of the genders
of an adjective.
]=]
local function make_decl(args, decl, root, is_adjective)
if not inflections[decl] then
error('Inflection type ' .. quote(decl) .. ' not found in [[' .. MODULE_PATH .. "/data]].")
end
if args.adjective and args.irregular then
error('Irregular adjectives are not handled by make_decl.')
end
if not root then
error('No root for ' .. args[1] .. '.')
end
args.stem = root
inflections[decl](args)
args.gender[1] = args.gender[1] or args.ctable['g']
args.declheader = args.declheader or args.ctable['decl']
add_forms(args)
if not args.ctable.NS then
args.ctable.NS = args[1] -- REVISAR: esto es un parche porque algunas tablas de /paradigmas no tienen el NS, está bien ponerlo justo acá?
end
for key,str in pairs(args.ctable) do
if key:find("^[A-Z]+$") then -- todas las formas flexivas están en mayúscula y lo demás es información extra que no hay que pasar a tabla
args.ctable[key] = split(str, "/")
end
end
end
-- String (comparative ending), function (input: root; output: comparative),
-- false (the declension has no comparative form), or nil (use the if-statements
-- to determine a comparative form).
local decl_to_comp = {
['1&3-ᾰν'] = 'ᾰ́ντερος',
['1&3-εν'] = 'έντερος',
['1&3-εσσ'] = 'έστερος', -- hopefully this is general?
['1&3-εσσ-con'] = 'ήστερος',
['1&3-ups'] = 'ῠ́τερος',
['3rd-cons'] = function(root)
local last2 = sub(root, -2)
if last2 == 'ον' then
return root .. 'έστερος'
elseif last2 == 'εσ' then
return root:gsub('εσ$', 'έστερος')
else
return false
end
end,
['1&3-οτ'] = false,
['3rd-εσ'] = 'έστερος',
['3rd-εσ-open'] = 'έστερος',
['1&2-alp-con'] = 'εώτερος', -- I assume—though I can't find examples
['1&2-eta-con'] = 'εώτερος',
}
local function retrieve_comp(root, decl_type)
local data = decl_to_comp[decl_type]
if not data then
return data
elseif type(data) == 'string' then
return root .. data
elseif type(data) == 'function' then
return data(root)
else
error('Data for ' .. decl_type .. ' is invalid.')
end
end
-- Constructs an adverb, comparative, and superlative.
local function make_acs(args)
-- input:
-- strings
local root, decl_type = args.root, args.decl_type
-- tables
local accent, atable = args.accent, args.atable
-- output:
local comp = retrieve_comp(root, decl_type)
local super, adv
if comp == nil then
local alpha_nonultima = decl_type == '1&2-alp' and
accent.term ~= 'oxytone' and
accent.term ~= 'perispomenon'
local last3 = sub(root, -3)
if alpha_nonultima and last3 == 'τερ' then
comp = nil
adv = deep_copy(atable['NNS'])
-- ?
-- comp = nil
elseif alpha_nonultima and last3 == 'τᾰτ' then
super = nil
adv = deep_copy(atable['NNP'])
-- ?
-- super = nil
elseif decl_type:find('ντ') then
comp = nil -- participles
super = nil
elseif (m_accent.get_weight(root, 1) == "light" or decl_type:match('att$')) then
comp = root .. 'ώτερος'
else
comp = root .. 'ότερος'
end
end
atable.adv = adv
-- Actually neuter accusative singular. This is correct for -τερος and
-- for μείζων; also for all comparatives in -ων?
or args.comparative and deep_copy(atable.NNS)
-- actually neuter accusative plural
or args.superlative and deep_copy(atable.NNP)
or atable.MGP[1] and atable.MGP[1]:gsub('ν$', 'ς'):gsub('ν<', 'ς<')
atable.comp = comp
atable.super = super or comp[1] and comp[1]:gsub('ερος$', 'ᾰτος')
-- Remove comparative and superlative if adjective is a comparative or superlative.
-- Parameters that trigger this condition are |deg=comp, |deg=super, and the
-- deprecated |form=comp.
if args.comparative or args.superlative then
atable.comp, atable.super = nil, nil
end
for _, form in ipairs { 'adv', 'comp', 'super' } do
if args[form] == "-" then
atable[form] = nil
elseif args[form] then
atable[form] = args[form]
end
end
end
--[[
noun_table contains case-number forms.
adjective_table will contain gender-case-number forms.
override_table contains gender-case-number forms that will override the
forms in noun_table.
]]
local function transfer_forms_to_adjective_table(adjective_table, noun_table, gender_code)
for case_and_number_code, form in pairs(noun_table) do
adjective_table[gender_code .. case_and_number_code] = form
end
end
--[=[
Interprets the table for the adjective's inflection type
in [[Module:grc-decl/decl/staticdata]].
]=]
local function make_decl_adj(args, ct)
if args.irregular then
return inflections['irreg-adj'](args)
end
--[[
Two possibilities, with the indices of the table of endings
and the stem augmentation that they use:
- masculine–feminine (1, a1), neuter (2, a2)
- masculine (1, a1), feminine (2, a2), neuter (3, a1)
]]
-- Masculine or masculine and feminine forms.
make_decl(args, ct[1], args.root .. (ct.a1 or ''), true)
transfer_forms_to_adjective_table(args.atable, args.ctable, 'M')
-- Feminine or neuter forms.
if ct[2] then
make_decl(args, ct[2], args.fstem or (args.root .. (ct.a2 or '')), true)
transfer_forms_to_adjective_table(args.atable, args.ctable, 'F')
end
make_decl(args, ct[3], args.root .. (ct.a1 or ''), true)
transfer_forms_to_adjective_table(args.atable, args.ctable, 'N')
args.ctable = nil
make_acs(args)
args.adeclheader = ct.adeclheader or 'Declension'
end
-- This function requires NFC forms for [[Module:grc-decl/decl/classes]],
-- but NFD forms for [[Module:grc-decl/decl/data]].
local function get_decl(args)
if args.indeclinable then
if not args[2] then error("Specify the indeclinable form in the 2nd parameter.") end
args.decl_type, args.root = 'indecl', ''
return
elseif args.irregular then
if args.gender[1] == "N" then
args.decl_type, args.root = 'irregN', ''
else
args.decl_type, args.root = 'irreg', ''
end
return
elseif not (args[1] and args[2]) then
error("Use the 1st and 2nd parameters for the nominative and genitive singular.")
end
local infl_info = m_classes.infl_info.noun
args[1] = toNFC(args[1])
args[2] = toNFC(args[2])
local arg1, arg2 = args[1], args[2]
local nom_without_accent = toNFC(m_accent.strip_tone(arg1))
local gen_without_accent = toNFC(m_accent.strip_tone(arg2))
local nominative_matches, decl_type, root = {}
for i = -infl_info.longest_nominative_ending, -1 do
local nominative_ending = sub(nom_without_accent, i)
local decl_types_by_genitive_ending = infl_info[nominative_ending]
-- If decl_types_by_genitive_ending is a string, then it is the key of
-- another table in infl_info, a nominative ending with a macron or
-- breve (ι → ῐ).
if type(decl_types_by_genitive_ending) == "string" then
decl_types_by_genitive_ending = infl_info[decl_types_by_genitive_ending]
end
if decl_types_by_genitive_ending then
insert(nominative_matches, decl_types_by_genitive_ending)
root = sub(nom_without_accent, 1, -1 - len(nominative_ending))
for j = -6, -1 do
local genitive_ending = sub(gen_without_accent, j)
local name = decl_types_by_genitive_ending[genitive_ending]
if name then
decl_type = name
break
end
end
if decl_type then
break
end
end
end
args.accent, args.suffix = get_accent_info(arg1)
if decl_type and root then
if args.contracted == 'false' and not decl_type:find('open') then
decl_type = decl_type .. '-open'
end
args.decl_type, args.root = decl_type, toNFD(root)
return
elseif gen_without_accent:match('ος$') then
local root = toNFD(sub(gen_without_accent, 1, -3))
if (
args.gender[1] == "N" or (
not (args.gender[1] == "M" and args.gender[2] == "F") and
match(root, "α" .. grc_utilities_data.length.mandatory .. "τ$")
)
) then
args.decl_type, args.root = '3rd-N-cons', root
else
args.decl_type, args.root = '3rd-cons', root
end
return
end
if nominative_matches[1] then
if nominative_matches[2] then
local new_nominative_matches = {}
for _, matches in ipairs(nominative_matches) do
for k, v in pairs(matches) do
new_nominative_matches[k] = v
end
end
nominative_matches = new_nominative_matches
else
nominative_matches = nominative_matches[1]
end
local gens = keys_to_list(nominative_matches) -- REVISAR: falta la sort_key
for i,el in ipairs(gens) do
gens[i] = quote("-" .. el)
end
local agreement
if #gens > 1 then
agreement = { "Declensions were", "s ", " do" }
else
agreement = { "A declension was", " ", " does" }
end
gens = concat(gens, ", ")
error(agreement[1] .. " found that matched the ending of the nominative form " .. quote(arg1) ..
", but the genitive ending" .. agreement[2] .. gens ..
agreement[3] .. " not match the genitive form " .. quote(arg2) .. ".")
else
for nom, gens in pairs(m_classes.ambig_forms) do
if arg1:match(nom .. "$") then
for gen, _ in pairs(gens) do
if arg2:match(gen .. "$") then
error("No declension found for nominative " .. quote(arg1) .. " and genitive " .. quote(arg2) ..
". There are two declensions with nominative " .. quote("-" .. nom) ..
" and genitive " .. quote("-" .. gen) ..
". To indicate which one you mean, mark the vowel length of the endings with a macron or breve.")
end
end
end
end
error("Can’t find a declension type for nominative " .. quote(arg1) .. " and genitive " .. quote(arg2) .. ".")
end
end
-- This function requires NFC forms for [[Module:grc-decl/decl/classes]],
-- but NFD forms for [[Module:grc-decl/decl/data]].
local function get_decl_adj(args)
if args.irregular then
args.decl_type, args.root = 'irreg', ''
return
elseif not args[1] then
error('Use the 1st and 2nd parameters for the masculine and the ' ..
'feminine or neuter nominative singular, or the first parameter ' ..
' alone for the 3rd declension stem.')
end
args[1] = toNFC(args[1])
if args[2] then
args[2] = toNFC(args[2])
end
local arg1, arg2 = args[1], args[2]
local mstrip = toNFC(m_accent.strip_tone(arg1))
local fstrip
if arg2 then
fstrip = toNFC(m_accent.strip_tone(arg2))
else
args.accent, args.suffix = get_accent_info(arg1)
args.decl_type, args.root = '3rd-cons', toNFD(mstrip)
return
end
local infl_info = m_classes.infl_info.adj
-- See if last three or two characters of masc have an entry.
local masc, decl
for i = -infl_info.longest_masculine_ending, -2 do
local ending = sub(mstrip, i)
local data = infl_info[ending]
if data then
masc = ending
decl = data
break
end
end
-- Allows redirecting, so that macrons or breves can be omitted for instance.
if type(decl) == "string" then
decl = infl_info[decl]
end
if decl then
-- Look for a feminine ending that matches the end of the feminine form.
local fem, name
for feminine, decl_name in pairs(decl) do
if fstrip:match(feminine .. '$') then
fem = feminine
name = decl_name:gsub("%d$", "")
break
end
end
if fem then
args.accent, args.suffix = get_accent_info(arg1)
-- The only indication that λέγων, λέγουσᾰ (stem λεγοντ-) and
-- ποιῶν, ποιοῦσᾰ (stem ποιουντ-) have different stems is the
-- accentuation of the masculine form.
if name == '1&3-οντ' and args.accent.term == 'perispomenon' then
name = '1&3-οντ-con'
end
if not adjinflections[name] then
error('Inflection recognition failed. Function for generated inflection code ' ..
quote(name) .. ' not found in [[' .. MODULE_PATH .. "/data]].")
end
local aux = mstrip:gsub(masc .. "$", "")
args.decl_type, args.root = name, toNFD(aux)
return
else
-- No declension type found.
local fems = {}
local is_neuter = false
for fem in pairs(decl) do
if fem == "ον" then
is_neuter = true
end
insert(fems, quote("-" .. fem))
end
fems = concat(fems, ", ")
local agreement = { "A declension was", " ", " does" }
if #fems > 1 then
agreement = { "Declensions were", "s ", " do" }
end
error(agreement[1] .. " found that matched the ending of the masculine " .. quote(arg1) ..
", but the corresponding feminine" .. (is_neuter and " and neuter" or "") .. " ending" .. agreement[2] .. fems ..
agreement[3] .. " not match the feminine " .. quote(arg2) .. ".")
end
end
error("Can’t find a declension type for masculine " .. quote(arg1) .. " and feminine or neuter " .. quote(arg2) .. ".")
end
--[[
Returns a table containing the inflected forms of the article,
to be placed before each inflected noun form.
]]
local function infl_art(args)
if args.dial == 'epi' or args.adjective or args.no_article then
return {}
end
local art = {}
local arttable
if args.gender[1] then
arttable = m_paradigms.art_att[args.gender[1]]
else
error('Gender not specified.')
end
for code, suffix in pairs(arttable) do
if (args.gender[1] == "M" and args.gender[2] == "F") and
m_paradigms.art_att.M[code] ~= m_paradigms.art_att.F[code] then
art[code] = m_paradigms.art_att.M[code] .. ' / ' .. m_paradigms.art_att.F[code]
else
art[code] = suffix
end
end
if args.gender[1] == 'F' then
if m_dialect_groups['nonIA'][args.dial] then
art['NS'] = 'ᾱ̔' -- 104.1-4
art['GS'] = 'τᾶς'
art['DS'] = 'τᾷ'
art['AS'] = 'τᾱ̀ν'
end
if args.dial == 'the' or args.dial == 'les' then
art['DS'] = 'τᾶ' -- 39
elseif args.dial == 'boi' or args.dial == 'ara' or args.dial == 'ele' then
art['DS'] = 'ται' -- 104.3
end
if m_dialect_groups['nonIA'][args.dial] then
art['GP'] = 'τᾶν' -- 104.6
end
if args.dial == 'ato' then
art['DP'] = 'τῆσῐ(ν)' -- 104.7
elseif args.dial == 'ion' then
art['DP'] = 'τῇσῐ(ν)' -- 104.7
end
if m_dialect_groups['buck78'][args.dial] then
art['AP'] = 'τᾰ̀ς' -- 104.8
elseif args.dial == 'kre' or args.dial == 'arg' then
art['AP'] = 'τὰνς'
elseif args.dial == 'les' then
art['AP'] = 'ταῖς'
elseif args.dial == 'ele' then
art['AP'] = 'ταὶρ'
end
if args.dial == 'kre' or args.dial == 'les' or args.dial == 'kyp' then
art['NS'] = 'ᾱ̓' -- 57
art['NP'] = 'αἰ'
elseif args.dial == 'ele' then
art['NS'] = 'ᾱ̓'
art['NP'] = 'ταὶ'
elseif args.dial == 'boi' then
art['NP'] = 'τὴ' -- 104.5
elseif m_dialect_groups['west'][args.dial] then --boeotian is covered above
art['NP'] = 'ταὶ'
end
elseif args.gender[1] == 'M' or args.gender[1] == 'N' then
if args.dial == 'the' then
art['GS'] = 'τοῖ' -- 106.1
art['DS'] = 'τοῦ' -- 23
art['ND'] = 'τοὺ'
art['GP'] = 'τοῦν'
end
if args.dial == 'les' then
art['DS'] = 'τῶ' -- 106.2
elseif args.dial == 'boi' or args.dial == 'ara' or args.dial == 'ele' or args.dial == 'eub' then
art['DS'] = 'τοῖ' -- 106.2
end
if args.dial == 'ato' or args.dial == 'ion' then
art['DP'] = 'τοῖσῐ(ν)' -- 106.4
end
if args.gender[1] == 'M' then
if m_dialect_groups['buck78'][args.dial] then
art['AP'] = 'τὸς' -- 106.5
elseif args.dial == 'kre' or args.dial == 'arg' then
art['AP'] = 'τὸνς'
elseif args.dial == 'les' then
art['AP'] = 'τοῖς'
elseif args.dial == 'ele' then
art['AP'] = 'τοὶρ'
elseif m_dialect_groups['severe'][args.dial] or args.dial == 'boi' then
art['AP'] = 'τὼς'
end
if args.dial == 'kre' or args.dial == 'les' or args.dial == 'kyp' then
art['NS'] = 'ὀ' -- 57
art['NP'] = 'οἰ'
elseif args.dial == 'ele' then
art['NS'] = 'ὀ'
art['NP'] = 'τοὶ'
elseif m_dialect_groups['west'][args.dial] or args.dial == 'boi' then
art['NP'] = 'τοὶ'
end
end
if args.dial == 'ele' then
art['GD'] = 'τοίοις'
-- elseif args.dial == 'ara' then
-- art['GD'] = 'τοιυν'
end
end
return art
end
local function tag(text)
return text -- REVISAR: falta implementar
end
local function print_detection_table(detection_table, labels, noun)
local out = {}
for key1, value1 in sorted_pairs(detection_table) do
if key1:match('^longest') then
insert(out, '* ' .. key1:gsub('_', ' ') .. ': ' .. value1 .. ' characters')
else
insert(out, "\n* " .. labels[1] .. " " .. tag(key1))
if type(value1) == "string" then
insert(out, " → " .. tag(value1))
elseif type(value1) == "table" then
for key2, value2 in sorted_pairs(value1) do
-- mw.log(len(key1), len(key2))
insert(out, "\n** " ..
(noun and labels[2] or key2 == "ον" and "neuter" or "feminine") ..
" " .. tag(key2) .. ": <code>" .. value2 .. "</code>")
if noun then
insert(out, " (<code>" .. (m_classes.conversion[value2] or "?") .. "</code>)")
end
end
end
end
end
return concat(out)
end
local function show_noun_categories(frame)
return print_detection_table(m_classes.infl_info.noun, { "nominative", "genitive" }, true)
end
local function show_adj_categories(frame)
return print_detection_table(m_classes.infl_info.adj, { "masculine", "feminine or neuter" })
end
-- These conditions should be mutually exclusive so that we don't need two
-- separate functions.
local function uncontracted_condition(dialect, contracted)
return dialect == 'ion' or dialect == 'epi'
or not (contracted == true or dialect == 'att')
end
local function contracted_condition(dialect, contracted)
return not (dialect == 'ion' or dialect == 'epi' or contracted == false)
end
-- Canonicalize specially-handled dialect codes.
local function handle_dialect(dialect)
if dialect == "Homeric" then
dialect = "hom"
elseif dialect == "Attic" then
dialect = "att"
elseif dialect == "Epic" then
dialect = "epi"
elseif dialect == "Ionic" then
dialect = "ion"
end
if dialect == "hom" then
dialect = "epi"
end
return dialect
end
local function interpret_form(form_param, is_adjective)
if type(form_param) ~= 'string' then
return {}, {}, nil, nil
end
local no_article = form_param:find('X') and true or false
if no_article and is_adjective then
error('Adjectives cannot have articles. Remove ' .. quote('X') ..
' option in the ' .. quote('form') .. ' parameter.')
end
-- Convert sing, dual, plur to S, D, P.
-- Remove other lowercase letters. This removes "con" and "open".
local number_codes = { sing = true, dual = true, plur = true }
local contracted, comparative, like_adjective
local new_form = form_param:gsub('((%l)%l+)', function(wholematch, initial)
if wholematch == 'con' then
contracted = true
elseif wholematch == 'open' then
contracted = false
elseif wholematch == 'comp' then
comparative = true
elseif wholematch == 'adj' or wholematch == 'adjective' then
like_adjective = true
elseif number_codes[wholematch] then
return initial:upper()
end
return ''
end)
--[[
Returns tables containing all genders and numbers.
For instance, for nouns that are variably masculine or feminine:
args.gender { "M", "F", ["M"] = true, ["F"] = true }
args.number { "S", "D", "P", ["S"] = true, ["D"] = true, ["P"] = true }
Not sure if the sequential entries are needed.
]]
-- Find contiguous gender abbreviations.
local genders = new_form:match("[MFN]+")
if is_adjective and genders then
error("Adjectives cannot have gender specified in the form parameter.")
end
-- Find number abbreviations.
-- If no number, assume all numbers will be displayed.
local numbers = new_form:gsub('[^SDP]+', '')
if numbers == '' then
numbers = 'SDP'
end
if genders then
genders = split(genders, "")
for i, gender in ipairs(genders) do
if gender == "" then
genders[i] = nil
else
genders[gender] = true
end
end
if genders.N and ( genders.M or genders.F ) then
error("A noun cannot be neuter and another gender at the same time.")
end
else
genders = {}
end
if numbers then
numbers = split(numbers, "")
for i, number in ipairs(numbers) do
if number == "" then
numbers[i] = nil
else
numbers[number] = true
end
end
if numbers.S and numbers.D and numbers.P then
numbers.F = true
end
else
numbers = {}
end
return genders, numbers, no_article, contracted, comparative, is_adjective or like_adjective
end
local function swap_args(args, suffix)
--This function has undefined behavior if both <arg> and <arg><suffix> are
--specified; use e.g. <arg>1 and <arg>2 instead.
local args_ = args
args = {}
for code, value in pairs(args_) do
if type(code) == 'number' then
args[code] = value
else
-- Removes suffix from the end of string keys.
args[code:gsub(suffix .. '$', '')] = value
end
end
end
local noun_lb = {
NS = "sg.",
GS = "sg.",
DS = "sg.",
AS = "sg.",
VS = "sg.",
ND = "du.",
GD = "du.",
DD = "du.",
AD = "du.",
VD = "du.",
NP = "pl.",
GP = "pl.",
DP = "pl.",
AP = "pl.",
VP = "pl.",
}
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["form"] = {por_defecto=""},
["dial"] = {por_defecto="att"},
["voc"] = {},
["ayuda"] = {},
["title"] = {alias_de="ayuda"},
["nota"] = {},
}
for form,_ in pairs(noun_lb) do
params[form] = {tipo=parsear_arreglo, por_defecto={}}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local arg1 = args[1]
local irreg = arg1 == 'irreg'
local indecl = arg1 == 'indecl'
local form_param = args.form
local dialect_code
form_param, dialect_code = args.form, args.dial
args.maxindex = maxindex(params)
if irreg then
require('Módulo:traza')('grc-decl/irreg')
end
args[1], args[2] = handle_unmarked_length(args[1], args[2], false)
local arg2 = args[2]
args.dial = handle_dialect(dialect_code)
args.gender, args.number, args.no_article, args.contracted, args.comparative, args.like_adjective = interpret_form(form_param, false)
args.indeclinable, args.irregular = indecl, irreg
args.categories = {}
args.form_decl = {}
args.titleapp = {}
get_decl(args)
if args.root:sub(1, 1) == '-' and not args.form:find('[MFN]') then
args.no_article = true
end
if args.decl_type:find('2nd') and not args.decl_type:find('N') and not args.form:find('[MFN]') then
insert(args.categories, 'GRC:Sustantivos sin género especificado')
end
if args.decl_type:find('κλῆς') or find(args.decl_type, '[ᾰε]σ') then
local out = {}
if uncontracted_condition(args.dial, args.contracted) then
args.titleapp = {}
swap_args(args, 1)
insert(args.titleapp, 'expandido')
make_decl(args, args.decl_type, args.root)
args.article = infl_art(args)
end
if contracted_condition(args.dial, args.contracted) then
args.titleapp = {}
swap_args(args, 2)
insert(args.titleapp, 'contraído')
make_decl(args, args.decl_type, args.root)
args.article = infl_art(args)
end
else
make_decl(args, args.decl_type, args.root)
args.article = infl_art(args)
end
local form_keys = keys_to_list(args.ctable)
for _,form in ipairs(form_keys) do
local ovtable = noun_ovinfo[form]
if ovtable then
for _,ovform in ipairs(ovtable) do
if not args.ctable[ovform] then
args.ctable[ovform] = args.ctable[form]
end
end
end
end
local sg = find(args["form"], "S")
local du = find(args["form"], "D")
local pl = find(args["form"], "P")
if not sg and not du and not pl then
sg = true
du = true
pl = true
end
local forms = sobreescribir_formas(args.ctable, args, false, noun_ovinfo, noun_lb)
comprobar_defectivo(forms)
forms = desactivar_formas(forms,
function (form)
return ((form:find("S") and not sg) or (form:find("D") and not du) or (form:find("P") and not pl))
end
)
local nom_sg = f(forms["NS"][1] or "?")
local gen_sg = f(forms["GS"][1] or "?")
local ndec = args.ctable.decl
local gen = args.ctable.g
local head, cat = m_classes.headers[ndec], m_classes.categories[ndec]
insert(args.titleapp, head)
insert(args.categories, "GRC:Sustantivos"..cat)
if gen == "M" then
insert(args.titleapp, "masculino")
insert(args.categories, "GRC:Sustantivos masculinos")
elseif gen == "F" then
insert(args.titleapp, "femenino")
insert(args.categories, "GRC:Sustantivos femeninos")
elseif gen == "N" then
insert(args.titleapp, "neutro")
insert(args.categories, "GRC:Sustantivos neutros")
end
for form,_ in pairs(noun_lb) do
if args.article[form] then
for i,val in ipairs(forms[form]) do
forms[form][i] = args.article[form].." "..val
end
end
end
local forms_tl = {}
for k,v in pairs(forms) do
forms_tl[k] = {}
for i,f in ipairs(v) do
forms_tl[k][i] = transliterar(f)
end
end
forms = agregar_enlaces(forms, tit, normalizar_enlace)
forms = formatear_formas(forms, noun_lb)
forms_tl = agregar_colores(forms_tl)
forms_tl = formatear_formas(forms_tl)
for k,v in pairs(forms) do
v[2] = forms_tl[k][1]
end
local t = {}
insert(t, {{""}, {"Singular"}, {"Dual"}, {"Plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["NS"], forms["ND"], forms["NP"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["GS"], forms["GD"], forms["GP"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["DS"], forms["DD"], forms["DP"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["AS"], forms["AD"], forms["AP"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["VS"], forms["VD"], forms["VP"]})
insert(t, {{args["nota"] or "", colspan=4}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..nom_sg..", "..gen_sg.."'''''  dialecto: "..dialectos[args.dial].."  tipo: "..concat(args.titleapp, ", "),
t,
ns == 0 and args.categories or {}
)
end
local adj_lb = {
MNS = "m. sg.",
MGS = "m. sg.",
MDS = "m. sg.",
MAS = "m. sg.",
MVS = "m. sg.",
MND = "m. du.",
MGD = "m. du.",
MDD = "m. du.",
MAD = "m. du.",
MVD = "m. du.",
MNP = "m. pl.",
MGP = "m. pl.",
MDP = "m. pl.",
MAP = "m. pl.",
MVP = "m. pl.",
FNS = "f. sg.",
FGS = "f. sg.",
FDS = "f. sg.",
FAS = "f. sg.",
FVS = "f. sg.",
FND = "f. du.",
FGD = "f. du.",
FDD = "f. du.",
FAD = "f. du.",
FVD = "f. du.",
FNP = "f. pl.",
FGP = "f. pl.",
FDP = "f. pl.",
FAP = "f. pl.",
FVP = "f. pl.",
NNS = "n. sg.",
NGS = "n. sg.",
NDS = "n. sg.",
NAS = "n. sg.",
NVS = "n. sg.",
NND = "n. du.",
NGD = "n. du.",
NDD = "n. du.",
NAD = "n. du.",
NVD = "n. du.",
NNP = "n. pl.",
NGP = "n. pl.",
NDP = "n. pl.",
NAP = "n. pl.",
NVP = "n. pl.",
}
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {},
["form"] = {por_defecto=""},
["dial"] = {por_defecto="att"},
["voc"] = {},
["ayuda"] = {},
["title"] = {alias_de="ayuda"},
["deg"] = {},
["adv"] = {},
["comp"] = {},
["super"] = {},
["nota"] = {},
}
for form,_ in pairs(adj_lb) do
params[form] = {tipo=parsear_arreglo, por_defecto={}}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local arg1 = args[1]
local irreg = arg1 == 'irreg'
local indecl = arg1 == 'indecl'
local form_param = args.form
if args.deg then
if not (args.deg == 'comp' or args.deg == 'super') then
error('Adjective degree ' .. quote(args.deg) .. ' not recognized.')
end
-- Comparatives sometimes are treated as the lemma because there is
-- no positive form. Superlatives should not be lemmas?
if args.deg == 'comp' and args.comp
or args.deg == 'super' and (args.super or args.comp) then
local form_name = args.deg == 'comp' and 'comparative' or 'superlative'
error(("A %s adjective cannot have a %s form specified.")
:format(form_name, form_name))
end
end
local dialect_code
form_param, dialect_code = args.form, args.dial
args.maxindex = maxindex(params)
if irreg then
require('Módulo:traza')('grc-decl/irreg')
end
args.adjective = true
args.atable = {}
args[1], args[2] = handle_unmarked_length(args[1], args[2], true)
local arg2 = args[2]
args.dial = handle_dialect(dialect_code)
args.gender, args.number, args.no_article, args.contracted, args.comparative, args.like_adjective = interpret_form(form_param, true)
if args.comparative then
if (arg2 or args.dial ~= 'att' or not arg1:find("ον$")) then
error("|form=comp is only meant for Attic third-declension comparatives with a stem in " .. quote("-ον") .. ".")
end
if args.deg then
error('|form=comp not needed when |deg=comp is set.')
end
end
if args.deg == 'comp' then
args.comparative = true
elseif args.deg == 'super' then
args.superlative = true
end
args.indeclinable, args.irregular = indecl, irreg
args.categories = {}
args.form_decl = {}
args.titleapp = {}
get_decl_adj(args)
if adjinflections_con[args.decl_type] then
local out = {}
if uncontracted_condition(args.dial, args.contracted) then
args.titleapp, args.notes, args.categories = {}, {}, {}
swap_args(args, 1)
insert(args.titleapp, 'expandido')
args.act = adjinflections[args.decl_type]
make_decl_adj(args, adjinflections[args.decl_type])
end
if contracted_condition(args.dial, args.contracted) then
args.titleapp, args.notes, args.categories = {}, {}, {}
swap_args(args, 2)
insert(args.titleapp, 'contraído')
args.act = adjinflections_con[args.decl_type]
make_decl_adj(args, adjinflections_con[args.decl_type])
end
else
args.act = adjinflections[args.decl_type]
make_decl_adj(args, adjinflections[args.decl_type])
end
local form_keys = keys_to_list(args.atable)
for _,form in ipairs(form_keys) do
local ovtable = adj_ovinfo[form]
if ovtable then
for _,ovform in ipairs(ovtable) do
if not args.atable[ovform] then
args.atable[ovform] = args.atable[form]
end
end
end
end
form_keys = keys_to_list(args.atable)
for _,form in ipairs(form_keys) do
if form:find("^M") then
local fform = "F"..form:sub(2)
if not args.atable[fform] then
args.atable[fform] = args.atable[form]
end
end
end
local sg = find(args["form"], "S")
local du = find(args["form"], "D")
local pl = find(args["form"], "P")
if not sg and not du and not pl then
sg = true
du = true
pl = true
end
local forms = sobreescribir_formas(args.atable, args, false, adj_ovinfo, adj_lb)
comprobar_defectivo(forms)
forms = desactivar_formas(forms,
function (form)
return ((form:find("S") and not sg) or (form:find("D") and not du) or (form:find("P") and not pl))
end
)
local ndec = args.adeclheader
local head, cat = m_classes.headers[ndec], m_classes.categories[ndec]
insert(args.titleapp, head)
insert(args.categories, "GRC:Adjetivos"..cat)
local f1 = f(forms["MNS"][1] or "?")
local f2 = f((args.atable.Mg == args.atable.Fg and forms["NNS"][1] or forms["FNS"][1]) or "?")
local forms_tl = {}
for k,v in pairs(forms) do
forms_tl[k] = {}
for i,f in ipairs(v) do
forms_tl[k][i] = transliterar(f)
end
end
forms = agregar_enlaces(forms, tit, normalizar_enlace)
forms = formatear_formas(forms, adj_lb)
forms_tl = agregar_colores(forms_tl)
forms_tl = formatear_formas(forms_tl)
for k,v in pairs(forms) do
v[2] = forms_tl[k][1]
end
local t = {}
insert(t, {{""}, {"M. singular"}, {"M. dual"}, {"M. plural"}, {"F. singular"}, {"F. dual"}, {"F. plural"}, {"N. singular"}, {"N. dual"}, {"N. plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["MNS"], forms["MND"], forms["MNP"], forms["FNS"], forms["FND"], forms["FNP"], forms["NNS"], forms["NND"], forms["NNP"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["MGS"], forms["MGD"], forms["MGP"], forms["FGS"], forms["FGD"], forms["FGP"], forms["NGS"], forms["NGD"], forms["NGP"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["MDS"], forms["MDD"], forms["MDP"], forms["FDS"], forms["FDD"], forms["FDP"], forms["NDS"], forms["NDD"], forms["NDP"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["MAS"], forms["MAD"], forms["MAP"], forms["FAS"], forms["FAD"], forms["FAP"], forms["NAS"], forms["NAD"], forms["NAP"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["MVS"], forms["MVD"], forms["MVP"], forms["FVS"], forms["FVD"], forms["FVP"], forms["NVS"], forms["NVD"], forms["NVP"]})
insert(t, {{args["nota"] or "", colspan=10}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..f1..", "..f2.."'''''  dialecto: "..dialectos[args.dial].."  tipo: "..concat(args.titleapp, ", "),
t,
ns == 0 and args.categories or {}
)
end
return export
fsj8kdeknpn8je0fszlo9cjvrb0icj6
Módulo:flex/yua
828
1059887
6307348
6118185
2026-08-06T00:34:45Z
TMCbot
164594
.
6307348
Scribunto
text/plain
-- FLEXIÓN DEL MAYA YUCATECO
-- Autor: Tmagc
-- basado en las indicaciones de 26agcp
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local list_to_set = m_table.listToSet
local keys_to_list = m_table.keysToList
local insert_if_not = m_table.insertIfNot
local deep_copy = m_table.deepCopy
local contains = m_table.contains
local append = m_table.append
local merge = m_table.merge
local m_str = require("Módulo:string")
local u = m_str.char
local match = m_str.match
local sub = m_str.sub
local gsub = m_str.gsub
local gsubb = m_str.gsubb
local split = m_str.split
local gsplit = m_str.gsplit
local find = m_str.find
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local separar_palabras = m_flex.separar_palabras
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local COLOR_NP = m_flex.COLOR_NP
local COLOR_IND = m_flex.COLOR_IND
local COLOR_SUBJ = m_flex.COLOR_SUBJ
local COLOR_IMPER = m_flex.COLOR_IMPER
local apostrofe = "'ʼꞌꞋ’" -- son distintos
local APOSTROFE = "["..apostrofe.."]"
local divsil = "%-"
local separador = "%s"..divsil
local SEPARADOR = "[" .. separador .. "]"
local vocales = "aeiouáéíóúàèìòùüýAEIOUÁÉÍÓÚÀÈÌÒÙÜÝ"
local vocales_tildadas = "áéíóúàèìòùüýÁÉÍÓÚÀÈÌÒÙÜÝ"
local VOCAL = "["..vocales.."]"
local VOCAL_TILDADA = "["..vocales_tildadas.."]"
local ESPACIO = "%s"
local guion = "%-"
local consonantes = "bcdfghjklmnñpqrstvwxyzBCDFGHJKLMNÑPQRSTVWXYZ"
local CONS = "[^"..vocales..separador.."]" -- tomo el complemento, asumo que el apóstrofe es consonante
local LETRA = "[^"..separador.."]"
local function flexionar_palabra(p, sust_adj)
local r, a, b
if find(p, VOCAL.."$") then
return {s={p}, p={}}
end
if sust_adj == "sust" then
r, a = match(p, "^(.*)("..VOCAL..APOSTROFE..")$")
if a then
return {s={r.."~"..a.."~"}, p={r.."~"..a.."ob~"}}
end
r, a = match(p, "^(.*)(.)$")
return {s={r.."~"..a.."~"}, p={r.."~"..a.."oʼob~"}}
else
r, a, b = match(p, "^(.*)("..VOCAL..")("..APOSTROFE..")$")
if a then
return {s={r.."~"..a..b.."~"}, p={r.."~"..a..b..a.."tak~", r.."~"..a..b..a.."takoʼob~"}}
end
r, a = match(p, "^(.*)(.)$")
return {s={r.."~"..a.."~"}, p={r.."~"..a.."tak~", r.."~"..a.."takoʼob~"}}
end
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local flex_ = flexionar_palabra(title, args["cg"])
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
elseif modo and sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p},
{"comparativo", args["comp"]},
{"superlativo", args["sup"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args["cg"] = "sust"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "YUA:Locuciones sustantivas" or "YUA:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args["cg"] = "adj"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "YUA:Locuciones adjetivas" or "YUA:Adjetivos")
end
local TEEN, TEECH, LETI, TOON, TEEX, LETIOB = 1, 2, 3, 4, 5, 6
local PRONOMBRES = {"(teen)", "(teech)", "(letiʼ)", "(toʼon)", "(teʼex)", "(letiʼob)"}
local tostr = {"1", "2", "3", "4", "5", "6"}
local quitar_tilde = {
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["ü"] = "u",
["ý"] = "y",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["y"] = "y"
}
local formas_no_personales = {
inf = true,
part = true
}
local formas_personales = {
-- formas intransitivas
inc = true,
com = true,
res = true,
subj = true,
-- formas transitivas
inc_act = true,
com_act = true,
res_act = true,
subj_act = true,
inc_pas = true,
com_pas = true,
res_pas = true,
subj_pas = true,
--
imper = true,
}
local formas = merge(formas_no_personales, formas_personales)
local prefijos = {
tr = {
inf = {""},
part = {""},
inc_act = {"kin ","ka ","ku ","k ","ka ","ku ",
nil,nil,nil,"kin "
},
com_act = {"tin ","ta ","tu ","t(k) ","ta ","tu ",
nil,nil,nil,"tin ","ta ","tu ",
nil,nil,nil,"tin "
},
res_act = {"in ","a ","u ","k ","a ","u ",
nil,nil,nil,"in ","a ","u ",
nil,nil,nil,"in "
},
subj_act = {"in ","a ","u ","k ","a ","u ",
nil,nil,nil,"in "
},
inc_pas = {"kin ","ka ","ku ","k ","ka ","ku ",
nil,nil,nil,"kin "
},
com_pas = {"(j)","(j)","(j)","(j)","(j)","(j)"},
res_pas = {"","","","","",""},
subj_pas = {"","","","","",""},
imper = {nil,"",nil,nil,"",nil},
},
intr = {
inf = {""},
part = {nil},
inc = {"kin ","ka ","ku ","k ","ka ","ku ",
nil,nil,nil,"kin "
},
com = {"(j)","(j)","(j)","(j)","(j)","(j)"},
res = {"","","","","",""},
subj = {"","","","","",""},
imper = {nil,"",nil,nil,"",nil},
}
}
local sufijos = {
tr = {
inf = {"ik"},
part = {"bil"},
inc_act = {"ik","ik","ik","ik","ikeʼex","ikoʼob",
nil,nil,nil,"ikoʼon{OTE}"
},
com_act = {"aj","aj","aj","aj","ajeʼex","ajoʼob",
nil,nil,nil,"ajoʼon{OTE}","eʼex{COL}","oʼob{COL}",
nil,nil,nil,"oʼon{OTE/COL}"
},
res_act = {"maj","maj","maj","maj","majeʼex","majoʼob",
nil,nil,nil,"majoʼon{OTE}","meʼex{COL}","moʼob{COL}",
nil,nil,nil,"moʼon{OTE/COL}"
},
subj_act = {"ej{*}","ej{*}","ej{*}","ej{*}","eʼex","oʼob",
nil,nil,nil,"oʼon{OTE}"
},
inc_pas = {"","","","","eʼex","oʼob",
nil,nil,nil,"oʼon{OTE}"
},
com_pas = {"en","ech","ij{*}","oʼon","eʼex","oʼob"},
res_pas = {"en","ech","","oʼon","eʼex","oʼob"},
subj_pas = {"en","ech","","oʼon","eʼex","oʼob"},
imper = {nil,"ej{*}",nil,nil,"eʼex",nil},
},
intr = {
inf = {""},
part = {nil},
inc = {"","","","","eʼex","oʼob",
nil,nil,nil,"oʼon{OTE}"
},
com = {"en","ech","ij{*}","oʼon","eʼex","oʼob"},
res = {"en","ech","","oʼon","eʼex","oʼob"},
subj = {"en","ech","","oʼon","eʼex","oʼob"},
imper = {nil,"",nil,nil,"eʼex",nil},
}
}
local function normalizar_enlace(x)
return x:gsub("%b()", "")
end
local function obtener_pronombre(forma, impers)
local conj, p = match(forma, "^(.*)(%d)$")
if not p then
return nil
end
p = tonumber(p)
if impers then
return PRONOMBRES[p]
end
return PRONOMBRES[p]
end
local paradigmas_irregulares = {
{"uʼuy", {"^u"..APOSTROFE.."uy$"}, {
tipo = "t1",
inc_act = {nil, nil, {"ku yuʼubik"}, nil, nil, {"ku yuʼubikoʼob"}},
com_act = {nil, nil, {"tu yuʼubaj"}, nil, nil, {"tu yuʼubajoʼob", "tu yuʼuboʼob{COL}"}},
res_act = {nil, nil, {"u yuʼubmaj"}, nil, nil, {"u yuʼubmajoʼob", "u yuʼubmoʼob{COL}"}},
subj_act = {nil, nil, {"u yuʼubej{*}"}, nil, nil, {"u yuʼuboʼob"}},
inc_pas = {nil, nil, {"ku yuʼubaʼal"}, nil, nil, {"ku yuʼubaʼaloʼob"}},
}},
{"tsʼáaj", {"^ts"..APOSTROFE.."áaj$"}, {
tipo = "t2",
nucleoincp = {"tsʼaʼabal"},
nucleocomp = {"tsʼaʼab"},
nucleoresp = {"tsʼaʼan"},
nucleosubjp = {"tsʼaʼabak"},
com_act = {{"tin tsʼáaj"}, {"ta tsʼáaj"}, {"tu tsʼáaj"}, {"t(k) tsʼáaj", "tin tsʼáajoʼon{OTE}"}, {"ta tsʼáajeʼex"}, {"tu tsʼáajoʼob"}},
}},
{"síij", {"^síij$"}, {
tipo = "t2",
inf = {"síik"},
part = {"síibil"},
nucleoinc = {"sí"},
nucleores = {"síi"},
nucleoincp = {"siʼibil"},
nucleocomp = {"siʼib"},
nucleoresp = {"siʼan"},
nucleosubjp = {"siʼibik"}
}},
}
local function combinar_prefijo_nucleosufijo(prefijo, nucleosufijo)
if find(nucleosufijo, "^[~#]?"..VOCAL) then
if prefijo == "(j)" then
return "(j-)"..nucleosufijo
end
if prefijo == "kin " or prefijo == "ka " or prefijo == "tin " or prefijo == "ta " or prefijo == "in " or prefijo == "a " then
return prefijo.."~w~"..nucleosufijo
end
if prefijo == "ku " or prefijo == "tu " or prefijo == "u " then
return prefijo.."~y~"..nucleosufijo
end
end
return prefijo..nucleosufijo
end
local function combinar_nucleo_sufijo(nucleo, sufijo)
if find(sufijo, "^b") then
local a = match(nucleo, "("..VOCAL..")"..APOSTROFE.."[~#]?$")
if a then
return nucleo.."~"..a.."~"..sufijo
end
local b, c = match(nucleo, "^(.*)n([~#]?)$")
if b then
return b.."~m~"..c..sufijo
end
end
if find(sufijo, "^"..VOCAL..APOSTROFE) then
if find(nucleo, VOCAL..APOSTROFE.."[~#]?$") then
return nucleo.."~"..sub(sufijo, 3).."~"
end
end
return nucleo..sufijo
end
local function agregar_forma(conjugado, conjinfo, forma)
conjinfo[forma] = conjinfo[forma] or {}
local nucleos
if forma == "inc_act" then
nucleos = conjinfo.nucleoinc
elseif forma == "com" or forma == "com_act" then
nucleos = conjinfo.nucleocom
elseif forma == "res" or forma == "res_act" then
nucleos = conjinfo.nucleores
elseif forma == "subj" then
nucleos = conjinfo.nucleosubj
elseif forma == "inc_pas" then
nucleos = conjinfo.nucleoincp
elseif forma == "com_pas" then
nucleos = conjinfo.nucleocomp
elseif forma == "res_pas" then
nucleos = conjinfo.nucleoresp
elseif forma == "subj_pas" then
nucleos = conjinfo.nucleosubjp
elseif forma == "imper" then
nucleos = conjinfo.nucleoimper
else
nucleos = conjinfo.nucleo
end
local sufijos_ = sufijos[conjinfo.tr_intr][forma] or {}
local prefijos_ = prefijos[conjinfo.tr_intr][forma] or {}
if formas_no_personales[forma] then
if conjinfo[forma][1] then
for _, fm in ipairs(conjinfo[forma]) do
insert_if_not(conjugado[forma], (gsub(fm, LETRA.."+$", "#%0#")))
end
else
for _, prefijo in ipairs(prefijos_) do
for _, sufijo in ipairs(sufijos_) do
for _,nucleo in ipairs(nucleos) do
insert_if_not(conjugado[forma], combinar_prefijo_nucleosufijo(prefijo, combinar_nucleo_sufijo(nucleo, sufijo)))
end
end
end
end
return
end
for i = TEEN, LETIOB do
local p = tostr[i]
if conjinfo[forma][i] then
for _, fm in ipairs(conjinfo[forma][i]) do
insert_if_not(conjugado[forma..p], (gsub(fm, LETRA.."+$", "#%0#")))
end
else
local k = i
while prefijos_[k] or sufijos_[k] do
for j, n in ipairs(nucleos) do
insert_if_not(conjugado[forma..p], combinar_prefijo_nucleosufijo(prefijos_[k], combinar_nucleo_sufijo(n, sufijos_[k])))
end
k = k + 6
end
end
end
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local tit = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido = true}, -- tipo = i, a, m, p, d, t1, t2
["impers"] = {}, -- 3, 36
["impersonal"] = {alias_de = "impers"},
["nucleoinc"] = {lista = true},
["núcleoinc"] = {alias_de="nucleoinc"},
["nucleocom"] = {lista = true},
["núcleocom"] = {alias_de="nucleocom"},
["nucleores"] = {lista = true},
["núcleores"] = {alias_de="nucleores"},
["nucleosubj"] = {lista = true},
["núcleosubj"] = {alias_de="nucleosubj"},
["nucleoincp"] = {lista = true},
["núcleoincp"] = {alias_de="nucleoincp"},
["nucleocomp"] = {lista = true},
["núcleocomp"] = {alias_de="nucleocomp"},
["nucleoresp"] = {lista = true},
["núcleoresp"] = {alias_de="nucleoresp"},
["nucleosubjp"] = {lista = true},
["núcleosubjp"] = {alias_de="nucleosubjp"},
["nucleoimper"] = {lista = true},
["núcleoimper"] = {alias_de="nucleoimper"},
["nota"] = {},
}
local conjugado = {}
for forma,_ in pairs(formas_no_personales) do
params[forma] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma] = {}
end
for forma,_ in pairs(formas_personales) do
for i,s in ipairs(tostr) do
params[forma..s] = {tipo=parsear_arreglo, por_defecto={}}
conjugado[forma..s] = {}
if i == 1 then
params[forma] = {alias_de=forma..s}
end
end
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(not find(tit, " "), "locuciones no soportadas aún")
local v = tit
local tr_intr
local ninc, ncom, nres, nsubj, nimper, nincp, ncomp, nresp, nsubjp
local no_imperativo_msj
local subs
local raiz = v
local cats = {}
local enc = {}
local es_irregular
for k,arr in pairs(args) do
if type(k) == "string" and k:find("nucleo") then
for i,el in ipairs(arr) do
arr[i] = "#"..el.."#"
es_irregular = true
end
end
end
local conjinfo = {}
for _,p in ipairs(paradigmas_irregulares) do
for _,rx in ipairs(p[2]) do
if find(v, rx) then
for y,z in pairs(p[3]) do
conjinfo[y] = deep_copy(z)
end
es_irregular = true
break
end
end
end
local tipo = conjinfo.tipo or args[1]
for k,arr in pairs(conjinfo) do
if type(k) == "string" and k:find("nucleo") then
for i,el in ipairs(arr) do
arr[i] = "#"..el.."#"
es_irregular = true
end
end
end
if tipo == "i" then
tr_intr = "intr"
ncom = gsub(raiz, VOCAL.."l$", "")
nres, subs = gsubb(raiz, VOCAL_TILDADA.."("..VOCAL..CONS.."+)"..VOCAL.."l$", "%1aʼan")
if not subs then
nres = ncom.."aʼan"
end
nsubj = ncom..sub(raiz, -2, -2).."k"
if find(raiz, "pajal$") or find(raiz, "kʼajal$") then
no_imperativo_msj = "Como verbo intransitivo terminado en -pajal o -kʼajal, ''"..v.."'' CARECE de imperativo"
else
nimper = ncom.."en"
end
insert(enc, "intransitivo, de raíz")
insert(cats, "YUA:Verbos intransitivos")
insert(cats, "YUA:Verbos intransitivos de raíz")
elseif tipo == "a" then
tr_intr = "intr"
local a = match(raiz, "("..VOCAL..")"..APOSTROFE.."$") or ""
ncom = raiz..a.."naj"
nres = raiz..a.."najaʼan"
nsubj = raiz..a.."nak"
nimper = raiz..a.."nen"
insert(enc, "intransitivo, antipasivo")
insert(cats, "YUA:Verbos intransitivos")
insert(cats, "YUA:Verbos intransitivos antipasivos")
elseif tipo == "m" then
tr_intr = "intr"
local r, a, b, c, d = match(raiz, "^(.*)("..VOCAL_TILDADA..")("..VOCAL..CONS.."+)("..VOCAL..")(l)$")
assert(d)
local e = quitar_tilde[a]
ncom = r..a..b
nres = r..e..b..c..d
nsubj = r..a..b..c.."k"
no_imperativo_msj = "Como verbo intransitivo mediopasivo, ''"..v.."'' CARECE de imperativo"
insert(enc, "intransitivo, mediopasivo")
insert(cats, "YUA:Verbos intransitivos")
insert(cats, "YUA:Verbos intransitivos mediopasivos")
elseif tipo == "p" then
tr_intr = "intr"
local r = match(raiz, "^(.-)l?tal$")
assert(r)
ncom = r.."laj"
nres = r.."lajaʼan"
nsubj = r.."lak"
nimper = r.."len"
insert(enc, "intransitivo, posicional")
insert(cats, "YUA:Verbos intransitivos")
insert(cats, "YUA:Verbos intransitivos posicionales")
elseif tipo == "d" then
tr_intr = "intr"
local r = match(raiz, "^(.*)tal$") or match(raiz, "^(.*)chajal")
assert(r)
ncom = r.."chaj"
nres = r.."chajaʼan"
nsubj = r.."chajak"
no_imperativo_msj = "Como verbo intransitivo denominal/deadjetival, ''"..v.."'' CARECE de imperativo"
insert(enc, "intransitivo, denominal/deadjetival")
insert(cats, "YUA:Verbos intransitivos")
insert(cats, "YUA:Verbos intransitivos denominales/deadjetivales")
elseif tipo == "t1" then
tr_intr = "tr"
ninc = raiz
ncom = raiz
nres = raiz
nincp = raiz.."aʼal"
ncomp = raiz.."aʼab"
nresp = raiz.."aʼan"
nsubjp = raiz.."aʼak"
nimper = raiz
insert(enc, "transitivo, tipo 1")
insert(cats, "YUA:Verbos transitivos")
insert(cats, "YUA:Verbos transitivos tipo 1")
elseif tipo == "t2" then
tr_intr = "tr"
local a = match(raiz, "("..VOCAL..")"..APOSTROFE.."$")
if a then
ninc = raiz
ncom = raiz
nres = raiz..a
nincp = raiz..a.."b"..a.."l"
ncomp = raiz..a.."b"
nresp = raiz.."an"
nsubjp = raiz..a.."b"..a.."k"
nimper = raiz
else
local r, b
r, a, b = match(raiz, "^(.*)("..VOCAL..")("..CONS.."+)$")
assert(b)
ninc = raiz
ncom = raiz
nres = raiz
nincp = r..a.."ʼ"..a..b..a.."l"
ncomp = r..a.."ʼ"..a..b
nresp = r..a..b.."aʼan"
nsubjp = r..a.."ʼ"..a..b..a.."k"
nimper = raiz
end
insert(enc, "transitivo, tipo 2")
insert(cats, "YUA:Verbos transitivos")
insert(cats, "YUA:Verbos transitivos tipo 2")
else
error("subtipo no reconocido")
end
args.nucleoinc[1] = args.nucleoinc[1] or ninc
args.nucleocom[1] = args.nucleocom[1] or ncom
args.nucleores[1] = args.nucleores[1] or nres
args.nucleosubj[1] = args.nucleosubj[1] or nsubj
args.nucleoincp[1] = args.nucleoincp[1] or nincp
args.nucleocomp[1] = args.nucleocomp[1] or ncomp
args.nucleoresp[1] = args.nucleoresp[1] or nresp
args.nucleosubjp[1] = args.nucleosubjp[1] or nsubjp
args.nucleoimper[1] = args.nucleoimper[1] or nimper
conjinfo.tipo = tipo
conjinfo.nucleo = {v}
conjinfo.nucleoinc = conjinfo.nucleoinc or args.nucleoinc
conjinfo.nucleocom = conjinfo.nucleocom or args.nucleocom
conjinfo.nucleores = conjinfo.nucleores or args.nucleores
conjinfo.nucleosubj = conjinfo.nucleosubj or args.nucleosubj
conjinfo.nucleoincp = conjinfo.nucleoincp or args.nucleoincp
conjinfo.nucleocomp = conjinfo.nucleocomp or args.nucleocomp
conjinfo.nucleoresp = conjinfo.nucleoresp or args.nucleoresp
conjinfo.nucleosubjp = conjinfo.nucleosubjp or args.nucleosubjp
conjinfo.nucleoimper = conjinfo.nucleoimper or args.nucleoimper
conjinfo.tr_intr = conjinfo.tr_intr or tr_intr
for forma,_ in pairs(formas) do
agregar_forma(conjugado, conjinfo, forma)
end
local resultante = sobreescribir_formas(conjugado, args)
local vozact = f(resultante.inf[1] or "―")
local vozpas = f(conjinfo.nucleoincp[1] or "―")
local exclusiones = tr_intr == "tr" and {"^imper", "^inc$", "^com$", "^res$", "^subj$"} or {"^imper", "^part$", "_act", "_pas"}
local defectivo = comprobar_defectivo(resultante, exclusiones, tostr)
resultante = agregar_enlaces(resultante, tit, normalizar_enlace, "%S")
local impers = conjinfo.impers or args["impers"]
resultante = formatear_formas(resultante, function (x)
return obtener_pronombre(x, es_impersonal)
end)
local cs, cs1, cs2, fila_pronombres
if impers == "3" then
fila_pronombres = {"", PRONOMBRES[3], header=true, class="pc"}
cs = 2
if not no_imperativo_msj then
no_imperativo_msj = "Como verbo impersonal, ''"..v.."'' CARECE de imperativo"
end
elseif impers == "36" then
fila_pronombres = {"", PRONOMBRES[3], PRONOMBRES[6], header=true, class="pc"}
cs = 3
if not no_imperativo_msj then
no_imperativo_msj = "Como verbo terciopersonal, ''"..v.."'' CARECE de imperativo"
end
else
fila_pronombres = {"", PRONOMBRES[1], PRONOMBRES[2], PRONOMBRES[3], PRONOMBRES[4], PRONOMBRES[5], PRONOMBRES[6], header=true, class="pc"}
cs = 7
end
cs1 = cs -- math.floor(cs / 2)
-- cs2 = cs - cs1
local t = {}
local function ic(tiempo)
if impers == "3" then
return resultante[tiempo.."3"]
elseif impers == "36" then
return resultante[tiempo.."3"], resultante[tiempo.."6"]
end
return resultante[tiempo.."1"], resultante[tiempo.."2"], resultante[tiempo.."3"], resultante[tiempo.."4"], resultante[tiempo.."5"], resultante[tiempo.."6"]
end
if tr_intr == "tr" then
resultante.inf.colspan = cs-1
resultante.part.colspan = cs-1
insert(t, {{"Formas no personales (verboides)", colspan=cs}, header=true, color=COLOR_H})
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Participio pasivo", header=true, color=COLOR_NP}, resultante.part})
insert(t, {{"Formas personales", colspan=cs}, header=true, color=COLOR_H})
insert(t, {{"Voz activa", colspan=cs}, header=true, color=COLOR_H})
insert(t, fila_pronombres)
insert(t, {{"Indicativo incompletivo", color=COLOR_IND, header=true}, ic("inc_act")})
insert(t, {{"Indicativo completivo", color=COLOR_IND, header=true}, ic("com_act")})
insert(t, {{"Indicativo resultativo", color=COLOR_IND, header=true}, ic("res_act")})
insert(t, {{"Subjuntivo", color=COLOR_SUBJ, header=true}, ic("subj_act")})
if not no_imperativo_msj then
insert(t, {{"Imperativo", color=COLOR_IMPER, header=true}, ic("imper")})
else
insert(t, {{no_imperativo_msj, color=COLOR_IMPER, header=true, colspan=cs}})
end
insert(t, {{"Voz pasiva", colspan=cs}, header=true, color=COLOR_H})
insert(t, fila_pronombres)
insert(t, {{"Indicativo incompletivo", color=COLOR_IND, header=true}, ic("inc_pas")})
insert(t, {{"Indicativo completivo", color=COLOR_IND, header=true}, ic("com_pas")})
insert(t, {{"Indicativo resultativo", color=COLOR_IND, header=true}, ic("res_pas")})
insert(t, {{"Subjuntivo", color=COLOR_SUBJ, header=true}, ic("subj_pas")})
else
resultante.inf.colspan = cs-1
insert(t, {{"Formas no personales (verboides)", colspan=cs}, header=true, color=COLOR_H})
insert(t, {{"Infinitivo", header=true, color=COLOR_NP}, resultante.inf})
insert(t, {{"Formas personales", colspan=cs}, header=true, color=COLOR_H})
insert(t, fila_pronombres)
insert(t, {{"Indicativo incompletivo", color=COLOR_IND, header=true}, ic("inc")})
insert(t, {{"Indicativo completivo", color=COLOR_IND, header=true}, ic("com")})
insert(t, {{"Indicativo resultativo", color=COLOR_IND, header=true}, ic("res")})
insert(t, {{"Subjuntivo", color=COLOR_SUBJ, header=true}, ic("subj")})
if not no_imperativo_msj then
insert(t, {{"Imperativo", color=COLOR_IMPER, header=true}, ic("imper")})
else
insert(t, {{no_imperativo_msj, color=COLOR_IMPER, header=true, colspan=cs}})
end
end
insert(t, {{f("Leyenda: † arcaico, x no normativo, ~■~ cambio ortográfico, #■# irregularidad, OTE: forma usada en el oriente de Yucatán y centro de Quintana Roo, COL: coloquial, * los sufijos -ej/-ij se eliminan en posición no terminal."), colspan=cs}})
args["nota"] = args["nota"] or ""
if conjinfo.impers == "utc3" then
args["nota"] = args["nota"].." NOTA: se usa también como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if conjinfo.impers == "umc3" then
args["nota"] = args["nota"].." NOTA: se usa más como impersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular."
end
if conjinfo.impers == "utc36" then
args["nota"] = args["nota"].." NOTA: se usa también como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
if conjinfo.impers == "umc36" then
args["nota"] = args["nota"].." NOTA: se usa más como terciopersonal, en cuyo caso solo son válidas las conjugaciones de la tercera persona singular y plural."
end
insert(t, {{args["nota"] and args["nota"] or "", colspan=cs}})
impers = impers or ""
if impers == "3" then
insert(enc, "impersonal")
insert(cats, "YUA:Verbos impersonales")
end
if impers == "36" then
insert(enc, "terciopersonal")
insert(cats, "YUA:Verbos terciopersonales")
end
if defectivo then
insert(enc, "defectivo")
insert(cats, "YUA:Verbos defectivos")
end
if es_irregular then
insert(enc, "irregular")
insert(cats, "YUA:Verbos irregulares")
else
insert(enc, "regular")
insert(cats, "YUA:Verbos regulares")
end
local actpasstr = ""
if tr_intr == "tr" then
actpasstr = " ("..vozact..", "..vozpas..")"
end
return renderizar_tabla(
frame,
"'''Conjugación de ''"..v.."''"..actpasstr.."'''  ("..concat(enc, ", ")..")",
t,
ns == 0 and cats or {})
end
return export
75p5aeendlkb9rrndfh05z4fvcoo8nl
Módulo:flex/cy
828
1059938
6307324
6288410
2026-08-06T00:34:00Z
TMCbot
164594
.
6307324
Scribunto
text/plain
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local lower = m_str.lower
local match = m_str.match
local sub = m_str.sub
local m_str_avanzado = require("Módulo:string/avanzado")
local toNFC = m_str_avanzado.toNFC
local toNFD = m_str_avanzado.toNFD
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local GRAVE = "\204\128"
local ACUTE = "\204\129"
local CIRC = "\204\130"
local DIAER = "\204\136"
local mutation_rules = {
["b"] = {"f", "m"},
["c"] = {"g", "ngh", "ch"},
["ch"] = true,
["d"] = {"dd", "n"},
["dd"] = true,
["f"] = true,
["g"] = {"", "ng"},
["h"] = true,
["j"] = true,
["k"] = true,
["l"] = true,
["ll"] = {"l"},
["m"] = {"f"},
["mh"] = true,
["n"] = true,
["p"] = {"b", "mh", "ph"},
["ph"] = true,
["q"] = true,
["r"] = true,
["rh"] = {"r"},
["s"] = true,
["t"] = {"d", "nh", "th"},
["th"] = true,
["ts"] = true,
["tsi"] = {"j", colloquial = true}, -- TODO: add colloquial marker.
["v"] = true,
["x"] = true,
["z"] = true
}
local function get_mutation_data(term)
local data = {radical = term}
local term_lower = term:gsub("^.[\128-\191]*", lower) -- term with lowercase initial
data.is_uppercase = term_lower ~= term
local normalized = toNFD(term_lower)
data.vowel = normalized:match("^[aeiouwy]") and true or false
if data.vowel then
data.final = term_lower
-- H-prothesis, unless initial "w" is a semivowel (followed by a vowel other than "y", or "y" with a diacritic).
if not (normalized:match("^w[aeiouw]") or match(normalized, "^wy[" .. GRAVE .. ACUTE .. CIRC .. DIAER .. "]")) then
data.mut3 = "h"
end
return data
end
local initial, final, mut
for i = 3, 1, -1 do
initial = sub(normalized, 1, i)
mut = mutation_rules[initial]
if mut then
final = sub(normalized, i + 1)
break
elseif i == 1 then
error(("no mutation rule found for %s"):format(term))
end
end
if type(mut) == "table" then
for k, v in pairs(mut) do
if tonumber(k) then
data["mut" .. k] = v
end
end
data.colloquial = mut.colloquial
end
if initial == "tsi" then
-- "i" in "tsi" is retained if:
-- followed by a consonant (e.g. "tsips" → "jips")
-- followed by a semivowel (e.g. "tsiwawa" → "jiwawa", but "*tsiŵawa" → "*jŵawa"); "i" and "w" are semivowels if followed by any vowel, due to the preceding "i".
-- it has a diacritic (e.g. "tsïars" → "jïars")
if not (final:match("^[aeiouwy]") and not final:match("^[iw][aeiouwy]")) then
final = "i" .. final
-- If "i" in "tsi" is not retained, the following vowel cannot have a diaeresis unless it's followed by a vowel.
elseif not match(final, "^[aeiouwy]" .. DIAER .. "[" .. GRAVE .. ACUTE .. CIRC .. "]?[aeiouwy]") then
final = final:gsub("^([aeiouwy])" .. DIAER, "%1") -- If there's no diaeresis, this does nothing.
end
end
data.final = toNFC(final)
return data
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "ec"},
[3] = {alias_de = "comp"},
[4] = {alias_de = "sup"},
["alt"] = {},
["nota"] = {},
["raiz"] = {},
["raíz"] = {alias_de = "raiz"},
["f"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fnota"] = {lista = true},
["pl"] = {lista = true},
["plural"] = {alias_de = "pl"},
["plnota"] = {lista = true},
["ec"] = {lista = true},
["ecuativo"] = {alias_de = "ec"},
["ecnota"] = {lista = true},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
if find(title, "%s") then
error("locuciones no soportadas")
end
local cat_pref = "CY:Adjetivos"
local cats = {}
local enc
local flex_ = {p=title}
if modo == "inc" then
enc = "incomparable"
flex_.ec = {}
flex_.comp = {}
flex_.sup = {}
insert(cats, cat_pref.." incomparables")
return renderizar_encabezado(
frame,
args["alt"] or f(title),
enc,
args["nota"],
{{"plural", args.pl, args["plnota"]},
{"femenino", args.f, args["fnota"]}},
ns == 0 and cats or {}
)
elseif modo == "mwy" or modo == "l" then
enc = "largo"
local mutdata = get_mutation_data(title)
if mutdata.mut1 and mutdata.initial ~= "ll" and mutdata.initial ~= "rh" then
flex_.ec = {"mor ~" .. mutdata.mut1 .. "~" .. mutdata.final}
else
flex_.ec = {"mor "..title}
end
flex_.comp = {"mwy "..title}
flex_.sup = {"mwyaf "..title}
insert(cats, cat_pref.." largos")
elseif modo == "ach" or modo == "c" then
enc = "corto"
local r = args.raiz or title
flex_.ec = {r.."ed"}
flex_.comp = {r.."ach"}
flex_.sup = {r.."af"}
insert(cats, cat_pref.." cortos")
else
error("modo no reconocido")
end
args.p = {} -- para que no arroje "irregular"
local flex, i1 = sobreescribir_formas(flex_, args)
if i1 then
enc = enc..", "..f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.p[1]),
enc,
args["nota"],
{{"plural", args.pl, args["plnota"]},
{"femenino", args.f, args["fnota"]},
{"ecuativo", flex.ec, args["ecnota"]},
{"comparativo", flex.comp, args["compnota"]},
{"superlativo", flex.sup, args["supnota"]},
},
ns == 0 and cats or {}
)
end
return export
qciypjhsxc54vz4w1q77y5tu39254iv
Módulo:flex/br
828
1059940
6307321
6118166
2026-08-06T00:33:55Z
TMCbot
164594
.
6307321
Scribunto
text/plain
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local deepcopy = m_table.deepCopy
local merge = m_table.merge
local insert_if_not = m_table.insertIfNot
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local lower = m_str.lower
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local function try(p, a, b)
local q, sust = gsub(p, a, b)
if sust > 0 then
return q
end
return nil
end
local function mutacion_cola(x)
x = gsub(x, "b$", "p")
x = gsub(x, "d$", "t")
x = gsub(x, "g$", "k")
x = gsub(x, "z$", "s")
x = gsub(x, "zh$", "sh")
return x
end
local function mutacion_suave(x)
x = gsub(x, "^m", "v")
x = gsub(x, "^M", "V")
x = gsub(x, "^b", "v")
x = gsub(x, "^B", "V")
x = gsub(x, "^d", "z")
x = gsub(x, "^D", "Z")
x = gsub(x, "^p", "b")
x = gsub(x, "^P", "B")
x = gsub(x, "^t", "d")
x = gsub(x, "^T", "D")
x = gsub(x, "^gw", "w")
x = gsub(x, "^Gw", "W")
x = gsub(x, "^gou", "ou")
x = gsub(x, "^Gou", "Ou")
x = gsub(x, "^g", "c'h")
x = gsub(x, "^G", "C'h")
x = gsub(x, "^k", "g")
x = gsub(x, "^K", "G")
return x
end
local function mutacion_dura(x)
x = gsub(x, "^b", "p")
x = gsub(x, "^B", "P")
x = gsub(x, "^d", "t")
x = gsub(x, "^D", "T")
x = gsub(x, "^g", "k")
x = gsub(x, "^G", "K")
return x
end
local function mutacion_aspirada(x)
x = gsub(x, "^p", "f")
x = gsub(x, "^P", "F")
x = gsub(x, "^t", "z")
x = gsub(x, "^T", "Z")
x = gsub(x, "^k", "c'h")
x = gsub(x, "^K", "C'h")
return x
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "pl"},
[3] = {alias_de = "f"},
[4] = {alias_de = "fpl"},
["alt"] = {},
["nota"] = {},
["pl"] = {lista = true},
["plural"] = {alias_de = "pl"},
["plnota"] = {},
["du"] = {lista = true},
["dual"] = {alias_de = "du"},
["dunota"] = {},
["f"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fnota"] = {},
["fpl"] = {lista = true},
["femeninoplural"] = {alias_de = "fpl"},
["fplnota"] = {},
["fdu"] = {lista = true},
["femeninodual"] = {alias_de = "fdu"},
["fdunota"] = {},
["s"] = {lista = true},
["singular"] = {alias_de = "s"},
["snota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
local cat_pref = "BR:Sustantivos"
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
elseif sub(modo, 1, 1) == "c" then
enc = "colectivo"
insert(cats, cat_pref.." colectivos")
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{{"singular", args.s, args["snota"]}},
ns == 0 and cats or {}
)
elseif not find(modo, "^irr") then
error("modo no reconocido")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local flex_ = {du={},pl={title.."où"},f={},fpl={},fdu={}}
local flex, i1 = sobreescribir_formas(flex_, args)
flex.sg = {title}
for forma,arr in pairs(flex) do
local arr2 = {}
for i,a in ipairs(arr) do
insert(arr2, a)
insert_if_not(arr2, mutacion_suave(a))
insert_if_not(arr2, mutacion_dura(a))
insert_if_not(arr2, mutacion_aspirada(a))
end
flex[forma] = arr2
end
if i1 then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(concat(flex.sg, ", ")),
enc,
args["nota"],
{{"dual", flex.du, args["dunota"]},
{"plural", flex.pl, args["plnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino dual", flex.fdu, args["fdunota"]},
{"femenino plural", flex.fpl, args["fplnota"]}
},
ns == 0 and cats or {}
)
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "comp"},
[3] = {alias_de = "sup"},
[4] = {alias_de = "exc"},
["alt"] = {},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
["exc"] = {lista = true},
["exclamativo"] = {alias_de = "exc"},
["excnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
if find(title, "%s") then
error("locuciones no soportadas")
end
local cat_pref = "BR:Adjetivos"
local cats = {}
local enc
local flex_ = {p=title}
flex_.comp = {mutacion_cola(title).."oc’h"}
flex_.sup = {mutacion_cola(title).."añ"}
flex_.exc = {mutacion_cola(title).."at"}
args.p = {} -- para que no arroje "irregular"
local flex, i1 = sobreescribir_formas(flex_, args)
if i1 then
enc = enc and enc..", "..f("#irregular#") or f("#irregular#")
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.p[1]),
enc,
args["nota"],
{{"comparativo", flex.comp, args["compnota"]},
{"superlativo", flex.sup, args["supnota"]},
{"exclamativo", flex.exc, args["excnota"]}},
ns == 0 and cats or {}
)
end
return export
q1j99qeevpg2afug7jcz5o287djvyhb
Módulo:flex/eu
828
1059947
6307328
6076988
2026-08-06T00:34:09Z
TMCbot
164594
.
6307328
Scribunto
text/plain
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local list_to_set = m_table.listToSet
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local sub = m_str.sub
local gsub_try_mult = function(p, l1, l2)
for i,a in ipairs(l1) do
local q, subs = gsub(p, a, l2[i])
if subs > 0 then
return q
end
end
return p
end
local m_flex = require("Módulo:flex")
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local sust_lb = {
-- absolutivo (nor)
["abs_indef"] = "indef.",
["abs_sg"] = "sg.",
["abs_pl"] = "pl.",
["abs_prox"] = "prox.",
-- ergativo (nork)
["erg_indef"] = "indef.",
["erg_sg"] = "sg.",
["erg_pl"] = "pl.",
["erg_prox"] = "prox.",
-- dativo (nori)
["dat_indef"] = "indef.",
["dat_sg"] = "sg.",
["dat_pl"] = "pl.",
["dat_prox"] = "prox.",
-- genitivo posesivo (noren/zeren)
["gen_indef"] = "indef.",
["gen_sg"] = "sg.",
["gen_pl"] = "pl.",
["gen_prox"] = "prox.",
-- comitativo (nor/zerekin)
["com_indef"] = "indef.",
["com_sg"] = "sg.",
["com_pl"] = "pl.",
["com_prox"] = "prox.",
-- causativo (nor/zer(en)gatik)
["cau_indef"] = "indef.",
["cau_sg"] = "sg.",
["cau_pl"] = "pl.",
["cau_prox"] = "prox.",
-- benefactivo (nor/zerentzat)
["ben_indef"] = "indef.",
["ben_sg"] = "sg.",
["ben_pl"] = "pl.",
["ben_prox"] = "prox.",
-- instrumental
["ins_indef"] = "indef.",
["ins_sg"] = "sg.",
["ins_pl"] = "pl.",
["ins_prox"] = "prox.",
-- inesivo (non, norengan)
["ine_anim_indef"] = "indef.",
["ine_anim_sg"] = "sg.",
["ine_anim_pl"] = "pl.",
["ine_anim_prox"] = "prox.",
["ine_inan_indef"] = "indef.",
["ine_inan_sg"] = "sg.",
["ine_inan_pl"] = "pl.",
["ine_inan_prox"] = "prox.",
-- genitivo locativo (nongo)
["loc_indef"] = "indef.",
["loc_sg"] = "sg.",
["loc_pl"] = "pl.",
["loc_prox"] = "prox.",
-- ablativo (nondik, norengandik)
["abl_anim_indef"] = "indef.",
["abl_anim_sg"] = "sg.",
["abl_anim_pl"] = "pl.",
["abl_anim_prox"] = "prox.",
["abl_inan_indef"] = "indef.",
["abl_inan_sg"] = "sg.",
["abl_inan_pl"] = "pl.",
["abl_inan_prox"] = "prox.",
-- adlativo simple (nora, norengana)
["ads_anim_indef"] = "indef.",
["ads_anim_sg"] = "sg.",
["ads_anim_pl"] = "pl.",
["ads_anim_prox"] = "prox.",
["ads_inan_indef"] = "indef.",
["ads_inan_sg"] = "sg.",
["ads_inan_pl"] = "pl.",
["ads_inan_prox"] = "prox.",
-- adlativo compuesto (norako, norenganako)
["adc_anim_indef"] = "indef.",
["adc_anim_sg"] = "sg.",
["adc_anim_pl"] = "pl.",
["adc_anim_prox"] = "prox.",
["adc_inan_indef"] = "indef.",
["adc_inan_sg"] = "sg.",
["adc_inan_pl"] = "pl.",
["adc_inan_prox"] = "prox.",
-- adlativo final (noraino, norenganaino)
["adf_anim_indef"] = "indef.",
["adf_anim_sg"] = "sg.",
["adf_anim_pl"] = "pl.",
["adf_anim_prox"] = "prox.",
["adf_inan_indef"] = "indef.",
["adf_inan_sg"] = "sg.",
["adf_inan_pl"] = "pl.",
["adf_inan_prox"] = "prox.",
-- adlativo direccional (norantz, norenganantz)
["add_anim_indef"] = "indef.",
["add_anim_sg"] = "sg.",
["add_anim_pl"] = "pl.",
["add_anim_prox"] = "prox.",
["add_inan_indef"] = "indef.",
["add_inan_sg"] = "sg.",
["add_inan_pl"] = "pl.",
["add_inan_prox"] = "prox.",
-- partitivo (-ik)
["par"] = "indef.",
-- prolativo (zertzat)
["pro"] = "indef.",
}
local function generate_forms(args)
local noun = args["ayuda"]
local pos = args["pos"]
local lemma = noun
local enc = {}
--Handle overrides
local e_dip_ins = (args["md"] or args["gau"]) and "e" or "" --monosyllabic terms ending in a dipthong get an epenthetic -e- in the indefinite instrumental (deiez, not *deiz)
local e_gau = args["gau"] and "e" or "" --gau (and its derivatives) get an epenthetic -e- in the singular local cases
--Proper-noun overrides
if args["num"] == "s" then
if not find(noun, "a$") then
lemma = noun .. "a"
end
elseif args["num"] == "p" then
if not find(noun, "a$") then
lemma = noun .. "ak"
else
lemma = lemma .. "k"
end
end
--stem type. Note that acronyms that aren't spelled out are treated like any other word (but FAGOR -> FAGORek, not *FAGORrek)
local ending_A = false
local ending_JKXZ = false
if find(noun, "[jkxzJKXZ]$") and args["ini"] then
insert(enc, "raíz en a") --initialisms whose final letter ends in -a. We include <jkxz> as they might occur in mixed-case initialisms.
ending_JKXZ = true
elseif find(noun, "ah?$") then
insert(enc, "raíz en a")
elseif find(noun, "A$") then
insert(enc, "raíz en a")
ending_A = true
elseif find(noun, "[eiouwyEIOUWY]h?$") or args["ini"] then --word-final w and y are treated as vowels. Word-final <h> is mute.
insert(enc, "raíz en vocal")
elseif args["tap"] then
insert(enc, "raíz en r")
else
insert(enc, "raíz en consonante")
end
--Epenthetic e and r
local e, r, a_s = "e", "r", "a"
if find(noun, "[aeiouwyAEIOUWY]h?$") or args["ini"] then
e = ""
else
r = ""
end
-- This is needed in acronyms like PDA (PDA + -a = PDA, not *PDAa)
if find(noun, "A$") then
a_s = ""
end
local forms = {}
--add base form and prolative before changing -r to -rr
forms["abs_indef"] = {noun}
if find(noun, "t[szx]$") then
forms["pro"] = {(gsub(noun, "t([szx])$", "%1tzat"))}
else
forms["pro"] = {noun .. "tzat"}
end
--double r if needed
if find(noun, "r$") and not (args["tap"] or args["hyph"]) then
noun = noun .. "r"
end
--nouns in -a
local base_def = find(noun, "a$") and gsub(noun, "a$", "") or noun
--nouns with compulsory hyphen
if args["hyph"] then
noun = noun .. "-"
end
--generate the forms
local function get_forms(def_stem)
local inflected = {}
--absolutive
inflected["abs_sg"] = {def_stem .. a_s}
inflected["abs_pl"] = {def_stem .. a_s .. "k"}
inflected["abs_prox"] = {def_stem .. "ok"}
--ergative
inflected["erg_indef"] = {noun .. e .. "k"}
inflected["erg_sg"] = {def_stem .. a_s .. "k"}
inflected["erg_pl"] = {def_stem .. "ek"}
inflected["erg_prox"] = {def_stem .. "ok"}
--dative
inflected["dat_indef"] = {noun .. r .. "i"}
inflected["dat_sg"] = {def_stem .. a_s .. "ri"}
inflected["dat_pl"] = {def_stem .. "ei"}
inflected["dat_prox"] = {def_stem .. "oi"}
--comitative
inflected["com_indef"] = {noun .. r .. "ekin"}
inflected["com_sg"] = {def_stem .. a_s .. "rekin"}
inflected["com_pl"] = {def_stem .. "ekin"}
inflected["com_prox"] = {def_stem .. "okin"}
--instrumental
inflected["ins_indef"] = {noun .. e .. e_dip_ins .. "z"}
inflected["ins_sg"] = {def_stem .. a_s .. "z"}
inflected["ins_pl"] = {def_stem .. "ez"}
inflected["ins_prox"] = {def_stem .. "otaz"}
--add inanimate/animate flags
local an_flag = "_anim"
local in_flag = "_inan"
local single_anim_cases = list_to_set({"gen", "cau", "ben"})
--cases derived from the genitive (plus the genitive itself)
local gen_cases = {gen = "", cau = "gatik", ben = "tzat", ine = "gan", ads = "gana", adf = "ganaino", add = "ganantz", adc = "ganako", abl = "gandik"}
for case, suf in pairs(gen_cases) do
local an_flag_ = single_anim_cases[case] and "" or an_flag
inflected[case .. an_flag_ .. "_indef"] = {noun .. r .. "en" .. suf}
inflected[case .. an_flag_ .. "_sg"] = {def_stem .. a_s .. "ren" .. suf}
inflected[case .. an_flag_ .. "_pl"] = {def_stem .. "en" .. suf}
inflected[case .. an_flag_ .. "_prox"] = {def_stem .. "on" .. suf}
end
--cases with the infix -ta- in the indefinite (inanimate only). We'll overwrite the previous ones if necessary
local inan_cases = {ine = "n", loc = "ko", ads = "ra", adf = "raino", add = "rantz", adc = "rako", abl = "tik"}
local altform_cases = list_to_set({"loc", "ads", "adf", "add", "adc", "abl"})
local cases_e_last = list_to_set({"abl", "loc"})
local a
local ta = (pos == "prop") and "" or "ta"
-- asumo siempre animado y más adelante hago el filtramiento
for case, suf in pairs(inan_cases) do
a = (case == "ine" and not find(noun, "[aA]$")) and "a" or ""
local in_flag_ = case == "loc" and "" or in_flag
inflected[case .. in_flag_ .. "_indef"] = {noun .. e .. ta .. suf}
inflected[case .. in_flag_ .. "_sg"] = {noun .. e .. e_gau .. a .. suf}
inflected[case .. in_flag_ .. "_pl"] = {def_stem .. "eta" .. suf}
inflected[case .. in_flag_ .. "_prox"] = {def_stem .. "ota" .. suf}
-- Place nouns ending in certain consonants can have forms with and without -e-
if args["topo"] and altform_cases[case] then
local alt_loc_base = gsub(noun, "rr$", "r")
local form_w_e = noun .. e .. suf
local form_wo_e = alt_loc_base .. suf
form_wo_e = gsub_try_mult(form_wo_e, {"([nl])ko$", "([nl])tik$", "tzko", "tztik"}, {"%1go", "%1dik", "zko", "ztik"})
if cases_e_last[case] then
inflected[case .. in_flag_ .. "_indef"] = {form_wo_e, form_w_e}
elseif find(noun, "r$") then --only in words like Eibar, Elgoibar...
inflected[case .. in_flag_ .. "_indef"] = {form_w_e, form_wo_e}
end
end
end
--partitive
inflected["par"] = {noun .. r .. "ik"}
return inflected
end
for k, v in pairs(get_forms(base_def)) do forms[k] = v end
--extra plural forms (numerals [[hiru]] and [[lau]])
if (noun == "hiru" or noun == "lau") and pos == "num" then
local extra_forms = get_forms(noun .. "r")
for k, v in pairs(extra_forms) do
if find(k, "_pl") then
for _, val in ipairs(v) do
insert(forms[k], val)
end
end
end
end
return forms
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {alias_de="pos"},
["ayuda"] = {por_defecto=title},
["title"] = {alias_de="ayuda"},
["md"] = {tipo = "bool"},
["gau"] = {tipo = "bool"},
["topo"] = {tipo = "bool"},
["pos"] = {por_defecto="sust"},
["nota"] = {},
["b"] = {} -- REVISAR: parámetro esotérico agregado en en.wikt
}
for forma,_ in pairs(sust_lb) do
params[forma] = {lista = true}
end
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if find(args["ayuda"], "%s") then
error("locuciones no soportadas")
end
local sg = find(args["pos"], "sg")
local pl = find(args["pos"], "pl")
local anim = find(args["pos"], "anim")
local inan = find(args["pos"], "inan")
local tipo
local cats = {}
if find(args["pos"], "num") then
args["pos"] = "num"
tipo = "numeral"
elseif find(args["pos"], "prop") then
args["pos"] = "prop"
tipo = "propio"
anim = true
inan = false
insert(cats, "EU:Sustantivos propios")
elseif find(args["pos"], "sust") or find(args["pos"], "anim") or find(args["pos"], "inan") then
args["pos"] = "sust"
if anim and not inan then
tipo = "sustantivo animado"
insert(cats, "EU:Sustantivos animados")
elseif inan and not anim then
tipo = "sustantivo inanimado"
insert(cats, "EU:Sustantivos inanimados")
else
tipo = "sustantivo animado e inanimado"
insert(cats, "EU:Sustantivos animados")
insert(cats, "EU:Sustantivos inanimados")
end
elseif find(args["pos"], "adj") then
args["pos"] = "adj"
tipo = "adjetivo"
anim = true
inan = true
else
error("tipo no reconocido")
end
if not sg and not pl then
sg = true
pl = true
elseif sg then
insert(cats, "EU:Sustantivos solo en singular")
elseif pl then
insert(cats, "EU:Sustantivos solo en plural")
end
if (not anim and not inan) then
anim = true
inan = true
end
local decl = generate_forms(args)
local dec = sobreescribir_formas(decl, args)
dec = desactivar_formas(dec,
function (form)
if args["pos"] == "prop" then
return (not find(form, "indef") and form ~= "par" and form ~= "pro")
end
return (find(form, "sg") and not sg) or ((find(form, "pl") or find(form, "prox") or (find(form, "indef") and form ~= "abs_indef")) and not pl) or (find(form, "anim") and not anim) or (find(form, "inan") and not inan)
end
)
dec = agregar_enlaces(dec, title)
dec = formatear_formas(dec, sust_lb)
local t = {}
insert(t, {{""}, {"Indefinido"}, {"Singular"}, {"Plural"}, {"Proximal"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Absolutivo", header=true, color=COLOR_H}, dec["abs_indef"], dec["abs_sg"], dec["abs_pl"], dec["abs_prox"]})
insert(t, {{"Ergativo", header=true, color=COLOR_H}, dec["erg_indef"], dec["erg_sg"], dec["erg_pl"], dec["erg_prox"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, dec["dat_indef"], dec["dat_sg"], dec["dat_pl"], dec["dat_prox"]})
insert(t, {{"Gen. posesivo", header=true, color=COLOR_H}, dec["gen_indef"], dec["gen_sg"], dec["gen_pl"], dec["gen_prox"]})
insert(t, {{"Comitativo", header=true, color=COLOR_H}, dec["com_indef"], dec["com_sg"], dec["com_pl"], dec["com_prox"]})
insert(t, {{"Causativo", header=true, color=COLOR_H}, dec["cau_indef"], dec["cau_sg"], dec["cau_pl"], dec["cau_prox"]})
insert(t, {{"Benefactivo", header=true, color=COLOR_H}, dec["ben_indef"], dec["ben_sg"], dec["ben_pl"], dec["ben_prox"]})
insert(t, {{"Instrumental", header=true, color=COLOR_H}, dec["ins_indef"], dec["ins_sg"], dec["ins_pl"], dec["ins_prox"]})
if anim and not inan then
insert(t, {{"Inesivo", header=true, color=COLOR_H}, dec["ine_anim_indef"], dec["ine_anim_sg"], dec["ine_anim_pl"], dec["ine_anim_prox"]})
insert(t, {{"Ablativo", header=true, color=COLOR_H}, dec["abl_anim_indef"], dec["abl_anim_sg"], dec["abl_anim_pl"], dec["abl_anim_prox"]})
insert(t, {{"Adlat. simple", header=true, color=COLOR_H}, dec["ads_anim_indef"], dec["ads_anim_sg"], dec["ads_anim_pl"], dec["ads_anim_prox"]})
insert(t, {{"Adlat. comp.", header=true, color=COLOR_H}, dec["adc_anim_indef"], dec["adc_anim_sg"], dec["adc_anim_pl"], dec["adc_anim_prox"]})
insert(t, {{"Adlat. final", header=true, color=COLOR_H}, dec["adf_anim_indef"], dec["adf_anim_sg"], dec["adf_anim_pl"], dec["adf_anim_prox"]})
insert(t, {{"Adlat. direcc.", header=true, color=COLOR_H}, dec["add_anim_indef"], dec["add_anim_sg"], dec["add_anim_pl"], dec["add_anim_prox"]})
elseif inan and not anim then
insert(t, {{"Gen. locativo", header=true, color=COLOR_H}, dec["loc_indef"], dec["loc_sg"], dec["loc_pl"], dec["loc_prox"]}) -- solo inan.
insert(t, {{"Inesivo", header=true, color=COLOR_H}, dec["ine_inan_indef"], dec["ine_inan_sg"], dec["ine_inan_pl"], dec["ine_inan_prox"]})
insert(t, {{"Ablativo", header=true, color=COLOR_H}, dec["abl_inan_indef"], dec["abl_inan_sg"], dec["abl_inan_pl"], dec["abl_inan_prox"]})
insert(t, {{"Adlat. simple", header=true, color=COLOR_H}, dec["ads_inan_indef"], dec["ads_inan_sg"], dec["ads_inan_pl"], dec["ads_inan_prox"]})
insert(t, {{"Adlat. comp.", header=true, color=COLOR_H}, dec["adc_inan_indef"], dec["adc_inan_sg"], dec["adc_inan_pl"], dec["adc_inan_prox"]})
insert(t, {{"Adlat. final", header=true, color=COLOR_H}, dec["adf_inan_indef"], dec["adf_inan_sg"], dec["adf_inan_pl"], dec["adf_inan_prox"]})
insert(t, {{"Adlat. direcc.", header=true, color=COLOR_H}, dec["add_inan_indef"], dec["add_inan_sg"], dec["add_inan_pl"], dec["add_inan_prox"]})
else
insert(t, {{"Gen. locativo", header=true, color=COLOR_H}, dec["loc_indef"], dec["loc_sg"], dec["loc_pl"], dec["loc_prox"]}) -- solo inan.
insert(t, {{"Inesivo (anim.)", header=true, color=COLOR_H}, dec["ine_anim_indef"], dec["ine_anim_sg"], dec["ine_anim_pl"], dec["ine_anim_prox"]})
insert(t, {{"Inesivo (inan.)", header=true, color=COLOR_H}, dec["ine_inan_indef"], dec["ine_inan_sg"], dec["ine_inan_pl"], dec["ine_inan_prox"]})
insert(t, {{"Ablativo (anim.)", header=true, color=COLOR_H}, dec["abl_anim_indef"], dec["abl_anim_sg"], dec["abl_anim_pl"], dec["abl_anim_prox"]})
insert(t, {{"Ablativo (inan.)", header=true, color=COLOR_H}, dec["abl_inan_indef"], dec["abl_inan_sg"], dec["abl_inan_pl"], dec["abl_inan_prox"]})
insert(t, {{"Adlat. simple (anim.)", header=true, color=COLOR_H}, dec["ads_anim_indef"], dec["ads_anim_sg"], dec["ads_anim_pl"], dec["ads_anim_prox"]})
insert(t, {{"Adlat. simple (inan.)", header=true, color=COLOR_H}, dec["ads_inan_indef"], dec["ads_inan_sg"], dec["ads_inan_pl"], dec["ads_inan_prox"]})
insert(t, {{"Adlat. comp. (anim.)", header=true, color=COLOR_H}, dec["adc_anim_indef"], dec["adc_anim_sg"], dec["adc_anim_pl"], dec["adc_anim_prox"]})
insert(t, {{"Adlat. comp. (inan.)", header=true, color=COLOR_H}, dec["adc_inan_indef"], dec["adc_inan_sg"], dec["adc_inan_pl"], dec["adc_inan_prox"]})
insert(t, {{"Adlat. final (anim.)", header=true, color=COLOR_H}, dec["adf_anim_indef"], dec["adf_anim_sg"], dec["adf_anim_pl"], dec["adf_anim_prox"]})
insert(t, {{"Adlat. final (inan.)", header=true, color=COLOR_H}, dec["adf_inan_indef"], dec["adf_inan_sg"], dec["adf_inan_pl"], dec["adf_inan_prox"]})
insert(t, {{"Adlat. direcc. (anim.)", header=true, color=COLOR_H}, dec["add_anim_indef"], dec["add_anim_sg"], dec["add_anim_pl"], dec["add_anim_prox"]})
insert(t, {{"Adlat. direcc. (inan.)", header=true, color=COLOR_H}, dec["add_inan_indef"], dec["add_inan_sg"], dec["add_inan_pl"], dec["add_inan_prox"]})
end
insert(t, {{"Partitivo", header=true, color=COLOR_H}, dec["par"], {"―"}, {"―"}, {"―"}})
insert(t, {{"Prolativo", header=true, color=COLOR_H}, dec["pro"], {"―"}, {"―"}, {"―"}})
insert(t, {{args["nota"] or "", colspan=5}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''  tipo: "..tipo,
t,
ns == 0 and cats or {}
)
end
return export
ruhg4h4tv24jksja4lkco3047hd4g11
Módulo:flex/vo
828
1060085
6307347
6077009
2026-08-06T00:34:44Z
TMCbot
164594
.
6307347
Scribunto
text/plain
local export = {}
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local find = m_str.find
local m_flex = require("Módulo:flex")
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local renderizar_tabla = m_flex.renderizar_tabla
local COLOR_H = m_flex.COLOR_H
local sust_lb = {
nom_sg = "sg.",
nom_pl = "pl.",
gen_sg = "sg.",
gen_pl = "pl.",
dat_sg = "sg.",
dat_pl = "pl.",
acc_sg = "sg.",
acc_pl = "pl.",
voc_sg = "sg.",
voc_pl = "pl.",
}
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {por_defecto=""},
["nota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
if find("%s", title) then
error("locuciones no soportadas")
end
local modo = args[1]
local r = title
local flex = {
nom_sg = r,
nom_pl = r.."s",
gen_sg = r.."a",
gen_pl = r.."as",
dat_sg = r.."e",
dat_pl = r.."es",
acc_sg = r.."i",
acc_pl = r.."is",
voc_sg = "o "..r,
voc_pl = "o "..r.."s"
}
local nosg = find(modo, "p")
local nopl = find(modo, "s")
local forms = sobreescribir_formas(flex, {}, false, {}, sust_lb) -- para que pase todo a arreglo y no tiren error las sigs funciones
forms = desactivar_formas(forms,
function (form)
return (form:find("pl") and nopl) or (form:find("sg") and nosg)
end
)
forms = agregar_enlaces(forms, title)
forms = formatear_formas(forms, sust_lb)
local t = {}
insert(t, {{""}, {"Singular"}, {"Plural"}, header=true, color=COLOR_H, class="pc"})
insert(t, {{"Nominativo", header=true, color=COLOR_H}, forms["nom_sg"], forms["nom_pl"]})
insert(t, {{"Genitivo", header=true, color=COLOR_H}, forms["gen_sg"], forms["gen_pl"]})
insert(t, {{"Dativo", header=true, color=COLOR_H}, forms["dat_sg"], forms["dat_pl"]})
insert(t, {{"Acusativo", header=true, color=COLOR_H}, forms["acc_sg"], forms["acc_pl"]})
insert(t, {{"Vocativo", header=true, color=COLOR_H}, forms["voc_sg"], forms["voc_pl"]})
insert(t, {{args["nota"] or "", colspan=3}})
return renderizar_tabla(
frame,
"'''Declinación de ''"..title.."'''''",
t,
ns == 0 and cats or {}
)
end
return export
e4whatb5dumhrlnj97zx0iypmvfe100
Módulo:flex/ia
828
1060087
6307333
6118174
2026-08-06T00:34:23Z
TMCbot
164594
.
6307333
Scribunto
text/plain
-- Módulo para flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local find = m_str.find
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local agregar_enlaces = m_flex.agregar_enlaces
local renderizar_encabezado = m_flex.renderizar_encabezado
local LETRA = "%S"
local ESPACIO = "%s"
local guion = "%-"
function export.flexionar_palabra(p)
local r, a
r, a = match(p, "^(.*)([aeiouAEIOU])$")
if a then
return {s={r.."~"..a.."~"}, p={r.."~"..a.."s~"}}
end
r, a = match(p, "^(.*)([cC])$")
if a then
return {s={r.."~"..a.."~"}, p={r.."~"..a.."hes~"}}
end
r, a = match(p, "^(.*)(.)$")
return {s={r.."~"..a.."~"}, p={r.."~"..a.."es~"}}
end
local function flexion_sust_adj(palabras, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = export.flexionar_palabra(a)
local flex2 = copulativa and export.flexionar_palabra(b) or {s={b}, p={b}}
local flex = combinar_copulativa(flex1, flex2, separador)
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = export.flexionar_palabra(p)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
elseif modo and sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p},
{"comparativo", args["comp"]},
{"superlativo", args["sup"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IA:Locuciones sustantivas" or "IA:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IA:Locuciones adjetivas" or "IA:Adjetivos")
end
return export
muraqghacg9gqvi1arbirsmh9xsgjsc
Módulo:flex/io
828
1060095
6307334
6118175
2026-08-06T00:34:23Z
TMCbot
164594
.
6307334
Scribunto
text/plain
-- Módulo para flexión de sustantivos, adjetivos y verbos
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local find = m_str.find
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local agregar_enlaces = m_flex.agregar_enlaces
local renderizar_encabezado = m_flex.renderizar_encabezado
local LETRA = "%S"
local ESPACIO = "%s"
local guion = "%-"
function export.flexionar_palabra(p)
local r, a
r, a = match(p, "^(.*)([oO])$")
if a then
return {s={r.."~"..a.."~"}, p={r.."~i~"}}
end
return {s={p}, p={}}
end
local function flexion_sust_adj(palabras, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = export.flexionar_palabra(a)
local flex2 = copulativa and export.flexionar_palabra(b) or {s={b}, p={b}}
local flex = combinar_copulativa(flex1, flex2, separador)
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = export.flexionar_palabra(p)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
elseif modo and sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p},
{"comparativo", args["comp"]},
{"superlativo", args["sup"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IO:Locuciones sustantivas" or "IO:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "IO:Locuciones adjetivas" or "IO:Adjetivos")
end
return export
hmv5z3v3uefdmjqzzaoxkwrn3nfc1xc
Módulo:flex/nl
828
1060510
6307340
6294609
2026-08-06T00:34:31Z
TMCbot
164594
.
6307340
Scribunto
text/plain
-- Flexión de sustantivos, adjetivos y verbos en neerlandés
-- Autor: Tmagc, rehecho a partir de los módulos de en.wikt
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local list_to_set = m_table.listToSet
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local lower = m_str.lower
local match = m_str.match
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local irregular_diminutives = {
{"blad", "blaadje"},
{"gat", "gaatje"},
{"glas", "glaasje"},
{"jongen", "jongetje"},
{"meid", "meisje"},
{"pad", "paadje"},
{"schip", "scheepje"},
{"vat", "vaatje"},
}
local remove_diacritic = {
["ä"] = "a",
["ë"] = "e",
["ï"] = "i",
["ö"] = "o",
["ü"] = "u",
["â"] = "a",
["ê"] = "e",
["î"] = "i",
["ô"] = "o",
["û"] = "u",
}
local vowels = "AEIOUaeiouäëïöüâêîôû"
local V = "[" .. vowels .. "]"
local NV = "[^" .. vowels .. "]"
local long_vowels = list_to_set {
-- long monophthongs
"aa", "ee", "ie", "oo", "uu",
-- diphthongs
"ai", "au", "ei", "eu", "ij", "oe", "ou", "oi", "ui"
}
local unstressed_last_two_letters_noun = list_to_set {
"er", "el", "en", "or", "em", "um"
}
local unstressed_last_two_letters_adjective = list_to_set {
"er", "el", "en", "or", "em", "um", "ig"
}
local lengthen = {
["a"] = "aa",
["e"] = "ee",
["i"] = "ie",
["o"] = "oo",
["u"] = "uu",
["A"] = "Aa",
["E"] = "Ee",
["I"] = "Ie",
["O"] = "Oo",
["U"] = "Uu",
-- FIXME: Do the following ever occur and if so are these correct?
["ä"] = "äa",
["ë"] = "ëe",
["ï"] = "ïe",
["ö"] = "öo",
["ü"] = "üu",
-- FIXME: Do the following ever occur and if so are these correct?
["â"] = "âa",
["ê"] = "êe",
["î"] = "îe",
["ô"] = "ôo",
["û"] = "ûu",
}
local devoice = {
["z"] = "s", -- grijze -> grijs
["v"] = "f", -- gave -> gaafje
}
local function devoice_final(form)
local butlast, last = match(form, "^(.*)(.)$")
return butlast .. (devoice[last] or last)
end
local function normalize_form(form)
local y, _ = gsub(lower(form), "[äëïöüâêîôû]", remove_diacritic)
return y
end
local function ends_in_long_vowel(form)
local last_two = match(normalize_form(form), "(..)$")
return last_two and long_vowels[last_two]
end
local function remove_final_e(form, final_multisyllable_stress)
-- Must end in -e preceded by at least one vowel.
local butlast = match(form, "^(.*" .. V .. NV .. "*)[eë]$")
if not butlast then
return form
end
-- If ends in long vowel + -e (e.g. frije, luie), just truncate the -e.
if ends_in_long_vowel(butlast) then
return butlast
end
-- If ends in long vowel including + -e (e.g. twee?), return the whole thing.
if ends_in_long_vowel(form) then
return form
end
form = butlast
local butlast = match(form, "^(.*)" .. NV .. "$")
if butlast and ends_in_long_vowel(butlast) then
return devoice_final(form)
end
if not final_multisyllable_stress then
local last_two = match(normalize_form(form), V .. NV .. "*(..)$")
if last_two and unstressed_last_two_letters_adjective[last_two] then
return devoice_final(form)
end
end
local butlast_two, last_v, last_c = match(form, "^(.*)(" .. V .. ")(" .. NV .. ")$")
if butlast_two then
return butlast_two .. lengthen[last_v] .. devoice_final(last_c)
end
local base, last_c = match(form, "^(.*)(" .. NV .. ")%2$")
if base then
return base .. devoice_final(last_c)
end
return devoice_final(form)
end
local function add_e(stem, weak_final, lengthen)
-- Vowel lengthening
if lengthen then
return gsub(stem, "i(.)$", "e%1") .. "e"
-- Final weak syllable, no consonant doubling
elseif weak_final then
if stem:find("ie$") then
return stem:gsub("ie$", "ië")
else
return stem .. "e"
end
else
-- Ends in ee, ie, oe
if stem:find("[eio]e$") then
return stem .. "ë"
-- Ends in e
elseif stem:find("e$") then
return stem
-- Ends in double vowel + single consonant, remove one of the vowels
elseif stem:find("([aeou])%1[bcdfgklmnpqrstvxz]$") then
-- Add a diaeresis if the removal would create a digraph
if find(stem, "[io]ee.$") then
return gsub(stem, "..(.)$", "ë%1e")
else
return gsub(stem, ".(.)$", "%1e")
end
-- Ends in single vowel + single consonant, double the consonant
elseif stem:find("[AaEeIiOoUu][bcdfgklmnpqrstvz]$") and not find(stem, "[IiïOoö]e.$")
and (not find(stem, "[AaäEeëOoöUuü]i.$") or find(stem, "qui.$")) and not find(stem, "[AaäEeëOoö]u.$") then
return gsub(stem, "(.)$", "%1%1e")
-- for obsolete spellings on -sch (except -isch)
elseif stem:find("[AaEeIOoUu]sch$") and not find(stem, "[IiïOoö]esch$") and not find(stem, "[AaäEeëOoö]usch$") then
return gsub(stem, "sch$", "ssche")
else
return stem .. "e"
end
end
end
local function generate_plurals(p)
local generated = {}
generated["-s"] = p .. "s"
generated["-'s"] = p .. "'s"
local stem_FF = add_e(p, false, false)
local stem_TF = add_e(p, true, false)
local stem_FT = add_e(p, false, true)
generated["-es"] = stem_FF .. "s"
generated["-@es"] = stem_TF .. "s"
generated["-:es"] = stem_FT .. "s"
generated["-en"] = stem_FF .. "n"
generated["-@en"] = stem_TF .. "n"
generated["-:en"] = stem_FT .. "n"
generated["-eren"] = add_e(p .. (p:find("n$") and "d" or ""), false, false) .. "ren"
generated["-:eren"] = stem_FT .. "ren"
if p:find("f$") then
local stem = p:gsub("f$", "v")
stem_FF = add_e(stem, false, false)
stem_TF = add_e(stem, true, false)
stem_FT = add_e(stem, false, true)
generated["-ves"] = stem_FF .. "s"
generated["-@ves"] = stem_TF .. "s"
generated["-:ves"] = stem_FT .. "s"
generated["-ven"] = stem_FF .. "n"
generated["-@ven"] = stem_TF .. "n"
generated["-:ven"] = stem_FT .. "n"
generated["-veren"] = stem_FF .. "ren"
generated["-:veren"] = stem_FT .. "ren"
elseif p:find("s$") then
local stem = p:gsub("s$", "z")
stem_FF = add_e(stem, false, false)
stem_TF = add_e(stem, true, false)
stem_FT = add_e(stem, false, true)
generated["-zes"] = stem_FF .. "s"
generated["-@zes"] = stem_TF .. "s"
generated["-:zes"] = stem_FT .. "s"
generated["-zen"] = stem_FF .. "n"
generated["-@zen"] = stem_TF .. "n"
generated["-:zen"] = stem_FT .. "n"
generated["-zeren"] = stem_FF .. "ren"
generated["-:zeren"] = stem_FT .. "ren"
elseif p:find("heid$") then
generated["-heden"] = p:gsub("heid$", "heden")
end
return generated
end
-- Based on [https://www.dutchgrammar.com/en/?n=NounsAndArticles.23].
local function default_dim(lemma, final_multisyllable_stress, modifier_final_multisyllable_stress, first_only)
if first_only then
local first_word, rest = match(lemma, "^([^ ]+) (.*)$")
if first_word then
return default_dim(first_word, final_multisyllable_stress, modifier_final_multisyllable_stress) .. " " ..
rest
end
end
local first_word, rest = match(lemma, "^([^ ]+[eë]) (.*)$")
if first_word then
return remove_final_e(first_word, modifier_final_multisyllable_stress) .. " " .. default_dim(
rest, final_multisyllable_stress, modifier_final_multisyllable_stress)
end
for _, ending_repl in ipairs(irregular_diminutives) do
local ending, repl = unpack(ending_repl)
if find(lemma, ending .. "$") then
return sub(lemma, 1, -#ending - 1) .. repl
end
end
if ends_in_long_vowel(lemma) then
return lemma .. "tje"
end
if find(lemma, "[aouäöü]$") then
return sub(lemma, 1, -2) .. lengthen[sub(lemma, -1)] .. "tje"
end
if find(lemma, "i$") then
return lemma .. "etje"
end
if find(lemma, NV .. "y$") then
return lemma .. "'tje"
end
if find(lemma, "é$") then
return sub(lemma, 1, -2) .. "eetje"
end
if final_multisyllable_stress and find(lemma, "e$") then
lemma = remove_final_e(lemma, true)
end
if (find(lemma, V .. "$") or find(lemma, "[wy]$") or
find(lemma, "[rln]$") and ends_in_long_vowel(sub(lemma, 1, -2)) or find(lemma, "rn$")) then
return lemma .. "tje"
end
if find(lemma, V .. NV .. "*[eë][rln]$") or find(lemma, V .. NV .. "*[oö]r$") then
-- NOTE: we already handled LONGV .. [rln]$ above, so any occurrence of V .. (e[rln]|or)$ is not a long vowel
-- or diphthong.
return final_multisyllable_stress and lemma .. sub(lemma, -1) .. "etje" or lemma .. "tje"
end
if find(lemma, V .. "[rln]$") then
-- NOTE: we already handled LONGV .. [rln]$ above, so any occurrence of V .. [rln]$ is not a long vowel or
-- diphthong.
return lemma .. sub(lemma, -1) .. "etje"
end
if find(lemma, "m$") and ends_in_long_vowel(sub(lemma, 1, -2)) or find(lemma, "[lr]m$") then
return lemma .. "pje"
end
if find(lemma, V .. NV .. "*[eëuü]m$") then
-- NOTE: we already handled LONGV .. m$ above, so any occurrence of V .. [eu]m$ is not a long vowel or
-- diphthong.
return final_multisyllable_stress and lemma .. sub(lemma, -1) .. "etje" or lemma .. "pje"
end
if find(lemma, V .. "m$") then
-- NOTE: we already handled LONGV .. m$ above, so any occurrence of V .. m$ is not a long vowel or diphthong.
return lemma .. sub(lemma, -1) .. "etje"
end
if find(lemma, "ng$") and ends_in_long_vowel(sub(lemma, 1, -3)) then
-- NOTE: This may not exist.
return lemma .. "je"
end
if find(lemma, V .. NV .. "*[iï]ng$") then
-- NOTE: we already handled LONGV .. ng$ above, so any occurrence of V .. ing$ is not a long vowel or diphthong.
return final_multisyllable_stress and lemma .. "etje" or sub(lemma, 1, -2) .. "kje"
end
if find(lemma, V .. "ng$") then
-- NOTE: we already handled LONGV .. ng$ above, so any occurrence of V .. ng$ is not a long vowel or diphthong.
return lemma .. "etje"
end
return lemma .. "je"
end
local function generate_diminutive(p, dim)
if dim == "+" then
return default_dim(p)
elseif dim == "++" then
return default_dim(p, "final multisyllable stress")
elseif dim == "++/+" then
return default_dim(p, false, "modifier final multisyllable stress")
elseif dim == "++/++" then
return default_dim(p, "final multisyllable stress", "modifier final multisyllable stress")
elseif dim == "+first" then
return default_dim(p, false, false, "first only")
elseif dim == "++first" then
return default_dim(p, "final multisyllable stress", false, "first only")
elseif dim == "-" then
return {}
elseif dim and sub(dim, 1, 1) == "-" then
return p .. sub(dim, 2)
end
return {}
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido=true},
[2] = {},
["ayuda"] = {por_defecto=title},
["nota"] = {},
["p"] = {lista=true},
["d"] = {lista=true},
["m"] = {lista=true},
["f"] = {lista=true},
["pnota"] = {lista=true},
["dnota"] = {lista=true},
["mnota"] = {lista=true},
["fnota"] = {lista=true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local cat_pref = find(title, "%s") and "NL:Locuciones sustantivas" or "NL:Sustantivos"
local cats = {}
local p = args["ayuda"]
local modo = args[1]
local enc
if modo then
if find(modo, "inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif find(modo, "inc") then
enc = "incontable"
insert(cats, cat_pref.." incontables")
elseif find(modo, "sg") or modo == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif find(modo, "pl") or modo == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local forms = {}
forms.p = parsear_arreglo(args[1])
local generar_plural = generate_plurals(p)
for i,pl in ipairs(forms.p) do
if pl ~= "-" then
forms.p[i] = generar_plural[pl] or pl
else
forms.p[i] = nil
end
end
forms.d = generate_diminutive(p, args[2])
forms.m = {}
forms.f = {}
local flex, i1 = sobreescribir_formas(forms, args)
if not flex.p[1] then
enc = "sin plural"
insert(cats, cat_pref.." solo en singular")
end
if not flex.d[1] then
enc = enc and enc..", sin diminutivo" or "sin diminutivo"
insert(cats, cat_pref.." sin diminutivo")
end
return renderizar_encabezado(
frame,
p,
enc,
args["nota"],
{{"plural", flex["p"], args["pnota"]},
{"diminutivo", flex["d"], args["dnota"]},
{"masculino", flex["m"], args["mnota"]},
{"femenino", flex["f"], args["fnota"]}},
ns == 0 and cats or {}
)
end
local function make_inflected(base)
-- Adjectives ending in unstressed -en or -e get no extra -e.
if base:find("[^eio]en$") or base:find("[aeou]ien$") or base:find("[^eio]e$") then
return base
-- Adjectives ending in certain digraphs get a diaeresis
elseif base:find("[eio]e$") then
return base .. "ë"
else
return base .. "e"
end
end
local function make_comparative(base)
local inflected = make_inflected(base)
-- Adjectives ending in -r get an extra -d- in the comparative,
-- disregarding the inflected form
if base:find("r$") then
return base .. "der"
-- If the inflected form does not end in -e, add it
elseif not inflected:find("[eë]$") then
return inflected .. "er"
else
return inflected .. "r"
end
end
local function make_partitive(base)
-- Adjectives ending in a sibilant do not get an extra -s
if base:find("s$") or base:find("sch$") or base:find("x$") or base:find("sj$") or base:find("sh$") then
return base
-- Adjectives ending in a long vowel get an apostrophe before the -s
elseif base:find("[^aeiou][aiouy]$") then
return base .. "'s"
else
return base .. "s"
end
end
local function make_superlative(base)
local partitive = make_partitive(base)
-- Adjectives in -ide have a superlative -iedst
if base:find("[iï]de$") then
return base:gsub("([iï])de$", "%1ed") .. "st"
elseif partitive then
return partitive .. "t"
else
return base .. "st"
end
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {por_defecto=""},
[2] = {},
[3] = {},
["ayuda"] = {por_defecto=title},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["compnota"] = {lista = true},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
["supnota"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local p = args["ayuda"]
local modo = args[1]
args["comp"][1] = args["comp"][1] or args[2]
args["sup"][1] = args["sup"][1] or args[3]
local cat_pref = find(title, "%s") and "NL:Locuciones adjetivas" or "NL:Adjetivos"
local cats = {}
local largo = find(modo, "l")
local pred = find(modo, "p")
local enc
local forms = {}
if find(modo, "i?nc") or modo == "-" or (args["comp"][1] == "no" and args["sup"][1] == "no") then
enc = "incomparable"
insert(cats, cat_pref.." incomparables")
return renderizar_encabezado(
frame,
p,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
if largo and pred then
enc = "largo, predicativo"
insert(cats, cat_pref.." largos")
insert(cats, cat_pref.." predicativos")
elseif largo then
enc = "largo"
insert(cats, cat_pref.." largos")
elseif pred then
enc = "predicativo"
insert(cats, cat_pref.." predicativos")
end
if largo or pred then
forms.comp = "meer "..p
forms.sup = "meest "..p
else
forms.comp = make_comparative(p)
forms.sup = {}
if p:find("[iï]de$") or p:find("[^eio]e$") or p:find("s[dkt]?$") or p:find("scht?$") or p:find("x$") then
insert(forms.sup, "meest "..p)
end
insert(forms.sup, make_superlative(p))
end
local flex, i1 = sobreescribir_formas(forms, args)
if i1 then
if not enc then
enc = f("#irregular#")
else
enc = enc..", "..f("#irregular#")
end
insert(cats, cat_pref.." irregulares")
end
return renderizar_encabezado(
frame,
p,
enc,
args["nota"],
{{"comparativo", flex["comp"], args["compnota"]},
{"superlativo", flex["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
local function make_long(form)
return (form:gsub("([^aeou])([aou])$", "%1%2%2"):gsub("([^aeiou])i$", "%1ie"))
end
function export.v(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {}, -- pres
[2] = {}, -- pret
[3] = {}, -- part
[4] = {}, -- subjpres
[5] = {}, -- subjpret
[6] = {}, -- past_t, actualmente SIN USO
["ayuda"] = {por_defecto=title},
["aux"] = {}, -- sin uso
["trans"] = {}, -- sin uso
["trans2"] = {}, -- sin uso
["nota"] = {},
["abrv"] = {tipo="bool"},
["abbr"] = {alias_de="abrv"},
["clase"] = {},
["dt"] = {},
["sep"] = {},
["pref"] = {},
["partpres"] = {lista = true},
["part"] = {lista = true},
["pres"] = {lista = true},
["pret"] = {lista = true},
["subjpres"] = {lista=true},
["subjpret"] = {lista=true},
["partpresnota"] = {lista = true},
["partnota"] = {lista = true},
["presnota"] = {lista = true},
["pretnota"] = {lista = true},
["subjpresnota"] = {lista=true},
["subjpretnota"] = {lista=true},
["vnoun"] = {lista=true}, -- sin uso
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local cat_pref = find(title, "%s") and "NL:Locuciones verbales" or "NL:Verbos"
local cats = {}
local v = args["ayuda"]
local forms = {}
local pres = args[1]
local pres_e, pres_t, past, past_e, past_t, part
if args.clase then
assert(args[2], "especifique el pretérito para verbos fuertes")
assert(args[3], "especifique el participio para verbos fuertes")
end
if args.abrv then
pres_e = args[4] or pres.."'e"
pres_t = pres.."'t"
local dt = args["dt"] or (pres:find("[fpsxFPSX]$") and "t" or "d")
past = args[2] or pres .. "'" .. dt .. "e"
part = args[3] or args[2] or pres .. "'" .. dt -- PARCHE: el pretérito debe sobreescribir tb. al participio por defecto
else
pres_e = args[4] or pres.."e"
if find(pres, "t$") then
pres_t = make_long(pres)
else
pres_t = make_long(pres).."t"
end
local dt = args["dt"] or (pres_e:find("[cfhkpqstx]e$") and "t" or "d")
past = args[2] or pres:gsub("([^aeiou])i$", "%1ie") .. dt .. "e"
part = args[3] or args[2] or make_long(pres) .. (pres:find("[dt]$") and "" or dt) -- PARCHE: el pretérito debe sobreescribir tb. al participio por defecto
-- "zeggen" has an irregular past tense alongside the regular one
end
past_e = args[5] or (gsub(past, "e?$", "e", 1)) -- para que no inserte dos veces la e
past_t = args[6] or ((find(past, "[^eio]e$") or find(past, "[të]$")) and past or past.."t")
local irr
if args[2] then
past = "#"..past.."#"
past_e = "#"..past_e.."#"
past_t = "#"..past_t.."#"
part = "#"..part.."#"
irr = true
else
if args[3] then
part = "#"..part.."#"
irr = true
end
if args[5] then
past_e = "#"..past_e.."#"
irr = true
end
if args[6] then
past_t = "#"..past_t.."#"
irr = true
end
end
if args[4] then
pres_e = "#"..pres_e.."#"
irr = true
end
local sep1 = args.sep or ""
local sep2 = args.sep and " "..args.sep or ""
local pref = args.pref or ""
-- forms.inf = v
forms.partpres = sep1..pref..make_long(pres_e).."nd"
forms.part = sep1..(pref ~= "" and pref or "ge")..part
forms.pres = pref..pres..sep2
forms.pret = pref..past..sep2
forms.subjpres = pref..pres_e..sep2
forms.subjpret = pref..past_e..sep2
local flex, irr2 = sobreescribir_formas(forms, args)
local enc
if args.clase then
enc = f("fuerte, clase "..args.clase..", #irregular#")
insert(cats, cat_pref.." fuertes")
insert(cats, cat_pref.." fuertes clase "..args.clase)
insert(cats, cat_pref.." irregulares")
else
enc = "débil"
if irr or irr2 then
enc = enc..f(", #irregular#")
insert(cats, cat_pref.." débiles")
insert(cats, cat_pref.." irregulares")
else
insert(cats, cat_pref.." débiles")
insert(cats, cat_pref.." regulares")
end
end
return renderizar_encabezado(
frame,
v,
enc,
args["nota"],
{{"pres.", flex.pres, args.presnota},
{"pret.", flex.pret, args.pretnota},
{"part.", flex.part, args.partnota},
{"part. pres.", flex.partpres, args.partpresnota},
{"subj. pres.", flex.subjpres, args.subjpresnota},
{"subj. pret.", flex.subjpret, args.subjpretnota}},
ns == 0 and cats or {}
)
end
return export
5x54q71jq8qs3u8vxor8x6hd4fgx451
Módulo:flex/nci
828
1060579
6307339
6118178
2026-08-06T00:34:30Z
TMCbot
164594
.
6307339
Scribunto
text/plain
-- FLEXIÓN DEL NAHUATL CLASICO
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local sub = m_str.sub
local gsub = m_str.gsub
local gsubb = m_str.gsubb
local find = m_str.find
local m_flex = require("Módulo:flex")
local f = m_flex.f
local sobreescribir_formas = m_flex.sobreescribir_formas
local renderizar_encabezado = m_flex.renderizar_encabezado
local divsil = "%-"
local separador = "%s"..divsil
local SEPARADOR = "[" .. separador .. "]"
local ESPACIO = "%s"
local guion = "%-"
local LETRA = "[^"..separador.."]"
local function try(p, rx, pl, pl2)
local p2, sust = gsubb(p, rx, "~%0~")
if not sust then
return nil
end
if not pl then
return {s={p2}, p={}}
end
if not pl2 then
return {s={p2}, p={(gsub(p, rx, pl))}}
end
return {s={p2}, p={(gsub(p, rx, pl)), (gsub(p, rx, pl2))}}
end
local function flexionar_palabra(p)
local fl = try(p, "huitl$", "~htin~")
or try(p, "tli$", "~tin~")
or try(p, "li$", "~tin~")
or try(p, "in$", "~tin~")
or try(p, "tl$", "~meh~")
or try(p, ".$", "~%1meh~")
assert(fl, "No se pudo determinar la flexión de la palabra")
return fl
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif find(modo, "^ina") then
enc = "inanimado"
insert(cats, cat_pref.." inanimados")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["n"],
{},
ns == 0 and cats or {}
)
end
end
local flex_ = flexionar_palabra(title)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
elseif modo and sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p},
{"comparativo", args["comp"]},
{"superlativo", args["sup"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de = "p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["nota"] = {},
["comp"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args["cg"] = "sust"
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "NCI:Locuciones sustantivas" or "NCI:Sustantivos")
end
return export
6n15j3b3clmjl69vg78ctsmdiskbc3x
Módulo:flex/tlh
828
1061167
6307346
6118184
2026-08-06T00:34:43Z
TMCbot
164594
.
6307346
Scribunto
text/plain
-- FLEXIÓN DEL KLINGON
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local list_to_set = m_table.listToSet
local keys_to_list = m_table.keysToList
local insert_if_not = m_table.insertIfNot
local deep_copy = m_table.deepCopy
local contains = m_table.contains
local append = m_table.append
local merge = m_table.merge
local m_str = require("Módulo:string")
local u = m_str.char
local match = m_str.match
local sub = m_str.sub
local gsub = m_str.gsub
local gsubb = m_str.gsubb
local split = m_str.split
local gsplit = m_str.gsplit
local find = m_str.find
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local separar_palabras = m_flex.separar_palabras
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local agregar_enlaces = m_flex.agregar_enlaces
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local function flexionar_sust(p, tipo)
local r = p
if tipo:find("[dD][uU]'?") then
return {s={r}, p={r.."~Du'~"}}
elseif tipo:find("[pP][uU]'?") then
return {s={r}, p={r.."~pu'~"}}
end
return {s={r}, p={r.."~mey~"}}
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {por_defecto = ""},
[2] = {alias_de = "p"},
["alt"] = {},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["nota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local modo = args[1]
local cats = {}
local cat_pref = "TLH:Sustantivos"
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif modo == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif modo == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local flex_ = flexionar_sust(title, modo)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and modo == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
flex.p = {}
elseif modo and modo == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
flex.p = {}
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{{"plural", flex.p}},
ns == 0 and cats or {},
nil,
"." -- considero toda la cadena como toda una sola palabra, independientemente de los guiones o espacios que tenga
)
end
return export
92t0zcu0elqbkeu6jt02hgj3duqovb9
Módulo:flex/lfn
828
1061294
6307337
6118177
2026-08-06T00:34:28Z
TMCbot
164594
.
6307337
Scribunto
text/plain
-- Flexión para la LINGUA FRANCA NOVA
-- Autor: Tmagc
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local len = m_str.len
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local vocal_no_tilde = "aeiouüAEIOUÜ"
local vocal_tilde = "áéíóúÁÉÍÓÚ"
local vocal = vocal_no_tilde..vocal_tilde
local cons = "bcdfghjklmnñpqrstvwxyzBCDFGHJKLMNÑPQRSTVWXYZ"
local espacios = "%-‐%s"
local guion = "%-"
local VOCAL = "["..vocal.."]"
local CONS = "["..cons.."]"
local ESPACIO = "["..espacios.."]"
local LETRA = "[^"..espacios.."]"
local function flexionar_palabra(p, g)
local mf = g == "mf"
local r, v = match(p, "^(.*)("..VOCAL..")$")
if v then
return {s={r.."~"..v.."~"}, p={r.."~"..v.."s~"}}
end
r, v = match(p, "^(.*)("..CONS..")$")
if v then
return {s={r.."~"..v.."~"}, p={r.."~"..v.."es~"}}
end
error("No se pudo determinar la flexión de la palabra")
end
local function flexion_sust_adj(palabras, g, copulativa)
local a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, g)
local flex2 = copulativa and flexionar_palabra(b, g) or {s={b}, p={}}
flex1.p = flex1.p[1] and flex1.p or flex1.s
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.p, flex.s) then
flex.p = {}
end
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto = match(palabras, "^("..guion.."?"..LETRA.."+)(.-)$")
local flex = flexionar_palabra(p, g)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, modo, cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif modo == "mf" then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif find(title, LETRA..ESPACIO..LETRA) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.s[1]),
enc,
args["nota"],
{{"plural", flex.p}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
["alt"] = {},
["s"] = {lista = true},
["p"] = {lista = true},
["plural"] = {alias_de = "p"},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
return formatear_sust_adj(frame, title, ns, args, find(title, LETRA..ESPACIO..LETRA) and "LFN:Locuciones sustantivas" or "LFN:Sustantivos")
end
return export
jcdsuwx6oayzb6h38fpcixpqhpr2if9
Módulo:flex/oc
828
1061596
6307342
6118180
2026-08-06T00:34:33Z
TMCbot
164594
.
6307342
Scribunto
text/plain
-- Flexión del occitano
-- Basado en la implementación de ca.wikt [[ca:Module:oc-lema]]
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local maxindex = m_table.maxIndex
local deepcopy = m_table.deepCopy
local deepequals = m_table.deepEquals
local insert_if_not = m_table.insertIfNot
local merge = m_table.merge
local size = m_table.size
local m_str = require("Módulo:string")
local find = m_str.find
local gsub = m_str.gsub
local gsub1 = m_str.gsub1
local gsubb = m_str.gsubb
local match = m_str.match
local sub = m_str.sub
local len = m_str.len
local m_flex = require("Módulo:flex")
local f = m_flex.f
local f_links = m_flex.f_links
local parsear_arreglo = m_flex.parsear_arreglo
local combinar_copulativa = m_flex.combinar_copulativa
local sobreescribir_formas = m_flex.sobreescribir_formas
local formatear_formas = m_flex.formatear_formas
local comprobar_defectivo = m_flex.comprobar_defectivo
local renderizar_encabezado = m_flex.renderizar_encabezado
local unaccented_vowel = "aeiouïüAEIOUÏÜ"
local accented_vowel = "àèéíòóúÀÈÉÍÒÓÚ"
local vowel = unaccented_vowel .. accented_vowel
local cons = "bcdfghjklmnpqrstvwxyzçBCDFGHJKLMNPQRSTVWXYZÇ·"
local V = "[" .. vowel .. "]"
local AV = "[" .. accented_vowel .. "]"
local NAV = "[^" .. accented_vowel .. "]"
local UAV = "[" .. unaccented_vowel .. "]"
local C = "[" .. cons .. "]"
-- local LETRA = "[" .. vowel .. cons .. "]"
local espacios = "%s"
local espacios_o_guiones = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local ESPACIO_O_GUION = "["..espacios_o_guiones.."]"
local LETRA = "[^"..espacios.."]"
local quitar_tilde =
{
["á"] = "a",
["é"] = "e",
["í"] = "i",
["ó"] = "o",
["ú"] = "u",
["à"] = "a",
["è"] = "e",
["ì"] = "i",
["ò"] = "o",
["ù"] = "u",
["a"] = "a",
["e"] = "e",
["i"] = "i",
["o"] = "o",
["u"] = "u",
["Á"] = "A",
["É"] = "E",
["Í"] = "I",
["Ó"] = "O",
["Ú"] = "U",
["À"] = "A",
["È"] = "E",
["Ì"] = "I",
["Ò"] = "O",
["Ù"] = "U",
["A"] = "A",
["E"] = "E",
["I"] = "I",
["O"] = "O",
["U"] = "U",
}
local tildar = {
["a"] = "à",
["e"] = "è",
["i"] = "í",
["o"] = "ò",
["u"] = "ú",
["ï"] = "í",
["A"] = "À",
["E"] = "È",
["I"] = "Í",
["O"] = "Ò",
["U"] = "Ú",
["Ï"] = "Í",
}
local function es_locucion(tit, cop)
return find(tit, LETRA..ESPACIO_O_GUION..LETRA) or (cop ~= nil and find(tit, LETRA..ESPACIO_O_GUION..LETRA))
end
local function try(p, rx, repl)
local p2, sust = gsubb(p, rx, "~%0~")
if sust then
if not repl then
return {p2, nil}
end
local a = gsub(p, rx, repl)
return {p2, a}
end
return nil
end
-- Forma plural aranesa
local function forma_plural_ar(sing, pos, forzar_s)
local plural = try(sing, "ca$", "~ques~")
or try(sing, "ça$", "~ces~")
or try(sing, "ga$", "~gues~")
or try(sing, "gua$", "~gües~")
or try(sing, "ja$", "~ges~")
or try(sing, "a$", "~es~")
or try(sing, "([ao])ís$", "~%1ïsi~")
or try(sing, "([àèò])s$", function (a) return "~"..quitar_tilde[a].."ssi~" end)
or try(sing, "([éíóú])s$", function (a) return "~"..quitar_tilde[a].."si~" end)
if pos == "adj-m" then
plural = try(sing, "[^aàeèéiíoòóuú][^aàeèéiíoòóuú]e$", "~%0s~")
or try(sing, "e$", "~i~")
or try(sing, "i$", "~%0s~")
or try(sing, "([aàeéèiíoóòuú])th$", "~%1ri~")
or try(sing, "([aàeéèiíoóòuú])t$", "~%1di~")
if plural then
return plural
end
end
if pos == "nom-m" or pos == "adj-m" then
plural = try(sing, "s$", "~%0i~")
or try(sing, "tz$", "~%0i~")
or try(sing, "ish$", "~%0i~")
or try(sing, "s[^aàeèéiíoòóuú]$", "~%0i~")
else
plural = try(sing, "s$", "~%0es~")
or try(sing, "tz$", "~%0es~")
or try(sing, "ish$", "~%0es~")
or try(sing, "s[^aàeèéiíoòóuú]$", "~%0es~")
end
plural = try(sing, "ç$", "~ci~")
or try(sing, "c$", "~qui~")
or try(sing, "[^i]$", "~%0i~")
or try(sing, "[^s]$", "~%0s~")
if not plural then
error("no se pudo determinar la flexión de la palabra")
end
return plural
end
-- Forma plural general
local function forma_plural_general(sing, pos, forzar_s)
local plural = try(sing, "([ao])ís$", "~%1ïses~")
or try(sing, "([àèò])s$", function (a) return "~"..quitar_tilde[a].."sses~" end)
or try(sing, "([éíóú])s$", function (a) return "~"..quitar_tilde[a].."ses~" end)
or try(sing, "[aàeéèiíoóòuú][^aàeéèiíoóòuú]+[aeiou]s$", nil)
or try(sing, "ç$", "~ces~")
or try(sing, "sc$", "~sques~")
or try(sing, "[^aàeéèiíoóòuú]g$", "~%0s~")
or try(sing, "tz$", "~ses~")
or try(sing, "[sx]t$", "~%0es~")
or try(sing, "[cs]h$", "~%0es~")
or try(sing, "sp$", "~%0es~")
or try(sing, "[fgsxz]$", "~%0es~")
or try(sing, "[^s]$", "~%0s~")
if not plural then
error("no se pudo determinar la flexión de la palabra")
end
return plural
end
local function forma_plural(word, pos, forzar_s)
local flex1 = forma_plural_general(word, pos, forzar_s)
local flex2 = forma_plural_ar(word, pos, forzar_s)
local flex = {m={flex1[1]},p={flex1[2]},f={},fp={}}
if flex2[2] and flex1[2] and gsub1(flex1[2], "[~#]", "") ~= gsub1(flex2[2], "[~#]", "") then
insert(flex.p, flex2[2])
end
return flex
end
local function forma_femenina(masc)
local fem
if find(masc, "a$") then
fem = masc
elseif find(masc, "[aàeéèoóòuú]c$") then
fem = gsub(masc, "c$", "ga")
elseif find(masc, "e$") then
fem = gsub(masc, "ce$", "ça")
fem = gsub(fem, "ge$", "ja")
fem = gsub(fem, "güe$", "gua")
fem = gsub(fem, "e$", "a")
elseif find(masc, "[aàeéèiíoóòuú]g$") then
fem = gsub(masc, "g$", "ja")
elseif find(masc, "th$") then
fem = gsub(masc, "th$", "ra")
elseif find(masc, "i$") then
fem = gsub(masc, "a([^aeiou][^aeiou]?)i$", "à%1ia")
fem = gsub(fem, "i([^aeiou])i$", "í%1ia")
fem = gsub(fem, "i$", "ia")
elseif find(masc, "o$") then
fem = gsub(masc, "o$", "a")
elseif find(masc, "p$") then
fem = gsub(masc, "p$", "ba")
elseif find(masc, "[àéèíóòú]s$") then
fem = gsub(masc, "às$", "asa")
fem = gsub(fem, "és$", "esa")
fem = gsub(fem, "ès$", "essa")
fem = gsub(fem, "([ao])ís$", "%1ïsa")
fem = gsub(fem, "ís$", "isa")
fem = gsub(fem, "òs$", "ossa")
fem = gsub(fem, "ós$", "osa")
fem = gsub(fem, "ús$", "usa")
elseif find(masc, "[aàeéèiíoóòuú]t$") then
fem = gsub(masc, "t$", "da")
elseif find(masc, "u$") then
fem = gsub(masc, "([aeio])u$", "%1va")
fem = gsub(fem, "i(%l)u$", "í%1ua")
fem = gsub(fem, "u$", "ua")
else
fem = masc .. "a"
end
return fem
end
local function flexionar_palabra(p, modo, s)
local pos, g = match(modo, "^(.*)%-(.*)$")
if g ~= "mf" then
return forma_plural(p, pos.."-"..g, s)
end
local flex = forma_plural(p, pos.."-m", s)
local fem = forma_femenina(p)
local flex_f = forma_plural(fem, pos.."-f", s)
if not deepequals(flex, flex_f) then
flex.f = flex_f.m
flex.fp = flex_f.p
end
return flex
end
local function flexion_sust_adj(palabras, modo, forzar_s, copulativa)
local a, separador, b
if copulativa == true or copulativa == false then
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO_O_GUION..")("..LETRA.."+)$")
else
a, separador, b = match(palabras, "^("..LETRA.."+)("..ESPACIO..")("..LETRA.."+)$")
end
if b then
if copulativa == nil then
error("Especifique si la estructura es copulativa o no usando el parámetro booleano \"cop\"")
end
local flex1 = flexionar_palabra(a, modo, forzar_s)
local flex2 = copulativa and flexionar_palabra(b, modo, forzar_s) or {m={b}, p={}, f={}, fp={}}
flex1.p = flex1.p[1] and flex1.p or flex1.m
flex1.f = flex1.f[1] and flex1.f or flex1.m
flex1.fp = flex1.fp[1] and flex1.fp or flex1.p
flex2.p = flex2.p[1] and flex2.p or flex2.m
flex2.f = flex2.f[1] and flex2.f or flex2.m
flex2.fp = flex2.fp[1] and flex2.fp or flex2.p
local flex = combinar_copulativa(flex1, flex2, separador)
if deepequals(flex.fp, flex.p) and deepequals(flex.f, flex.m) then
flex.f = {}
flex.fp = {}
if deepequals(flex.p, flex.m) then
flex.p = {}
end
end
flex.n = {}
return flex
elseif copulativa == true then
error("Solo se admiten estructuras copulativas de exactamente dos palabras")
end
-- sino, flexiono solo la primera palabra
local p, resto
if copulativa == false then
p, resto = match(palabras, "^(%-?[^"..espacios_o_guiones.."]+)(.-)$")
else
p, resto = match(palabras, "^("..LETRA.."+)(.-)$")
end
local flex = flexionar_palabra(p, modo, forzar_s)
for _,arr in pairs(flex) do
for i,e in ipairs(arr) do
arr[i] = e..resto
end
end
flex.n = {}
return flex
end
local function formatear_sust_adj(frame, title, ns, args, cat_pref)
local modo = args[1]
local cats = {}
local enc
if modo then
if find(modo, "^inv") then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif sub(modo, 1, 1) == "s" then
enc = "singularia tantum"
insert(cats, cat_pref.." solo en singular")
elseif sub(modo, 1, 1) == "p" then
enc = "pluralia tantum"
insert(cats, cat_pref.." solo en plural")
end
if enc then
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{},
ns == 0 and cats or {}
)
end
end
local cop -- = modo == "irreg" and false or args["cop"] falla...
if modo == "irreg" then
cop = false
else
cop = args["cop"]
end
local flex_ = flexion_sust_adj(title, args.es_adjetivo and "adj-mf" or "nom-"..modo, args["s"], cop)
local flex, irr = sobreescribir_formas(flex_, args, true)
if not flex.p[1] and not flex.f[1] and not flex.fp[1] then
enc = "invariable"
insert(cats, cat_pref.." invariables")
elseif irr then
enc = f("#irregular#")
insert(cats, cat_pref.." irregulares")
elseif modo and sub(modo, 1, 1) == "n" then
flex.f = {}
flex.fp = {}
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." irregulares")
elseif (not flex.f[1] and not flex.fp[1] and modo == "mf") then
enc = "invariable en género"
insert(cats, cat_pref.." invariables en género")
--insert(cats, cat_pref.." regulares")
elseif es_locucion(title, args["cop"]) then
if args["cop"] then
enc = "copulativa"
insert(cats, cat_pref.." copulativas")
else
enc = "no copulativa"
insert(cats, cat_pref.." no copulativas")
end
else
insert(cats, cat_pref.." regulares")
end
return renderizar_encabezado(
frame,
args["alt"] or f(flex.m[1]),
enc,
args["nota"],
{{"plural", flex.p, args["pnota"]},
{"femenino", flex.f, args["fnota"]},
{"femenino plural", flex.fp, args["fpnota"]},
{"neutro", flex.n, args["nnota"]},
{"comparativo", args["comp"], args["compnota"]},
{"superlativo", args["sup"], args["supnota"]}},
ns == 0 and cats or {}
)
end
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
local valido = {
["m"] = true,
["f"] = true,
["mf"] = true,
["n"] = true,
["ng"] = true,
["inv"] = true,
["s"] = true,
["p"] = true,
["irreg"] = true
}
assert(valido[args[1]], "Especifique el género del sustantivo en el primer parámetro: m, f, mf, ng, inv, s, p, irreg")
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "OC:Locuciones sustantivas" or "OC:Sustantivos")
end
function export.adj(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {},
[2] = {alias_de="p"},
[3] = {alias_de="f"},
[4] = {alias_de="fp"},
["alt"] = {},
["nota"] = {},
["cop"] = {tipo = "bool"},
["copulativa"] = {alias_de = "cop"},
["s"] = {tipo = "bool"},
["forzars"] = {alias_de = "s"},
["m"] = {lista = true},
["mnota"] = {lista = true},
["masculino"] = {alias_de = "m"},
["p"] = {lista = true},
["pnota"] = {lista = true},
["plural"] = {alias_de = "p"},
["f"] = {lista = true},
["fnota"] = {lista = true},
["femenino"] = {alias_de = "f"},
["fp"] = {lista = true},
["fpnota"] = {lista = true},
["femeninoplural"] = {alias_de = "fp"},
["n"] = {lista = true},
["nnota"] = {lista = true},
["neutro"] = {alias_de = "n"},
["comp"] = {lista = true},
["compnota"] = {lista = true},
["comparativo"] = {alias_de = "comp"},
["sup"] = {lista = true},
["supnota"] = {lista = true},
["superlativo"] = {alias_de = "sup"},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
args[1] = args[1] or "mf"
args.es_adjetivo = true
return formatear_sust_adj(frame, title, ns, args, es_locucion(title, args["cop"]) and "OC:Locuciones adjetivas" or "OC:Adjetivos")
end
return export
4rhfpvvht3bzkwb0rmipw9e5xc3bemi
Módulo:flex/nb
828
1061623
6307338
6294767
2026-08-06T00:34:29Z
TMCbot
164594
.
6307338
Scribunto
text/plain
-- Flexión del Noruebo bokmal
-- Adaptado desde en.wikt
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local renderizar_encabezado = m_flex.renderizar_encabezado
local espacios = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local labels = {
["indef_sg"] = "indef. sg.",
["indef_pl"] = "indef. pl.",
["def_sg"] = "def. sg.",
["def_pl"] = "def. pl.",
}
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido = true},
[2] = {},
[3] = {},
["num"] = {por_defecto = "sgpl"},
["alt"] = {},
["ayuda"] = {por_defecto = title},
["indef_sg"] = {lista = true},
["indef_pl"] = {lista = true},
["def_sg"] = {lista = true},
["def_pl"] = {lista = true},
["gen"] = {lista = true},
["nota"] = {},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(args[1], "falta especificar el tipo en el primer parámetro")
local cats = {}
local decl = {}
local enc
local tipo = args[1]
local tit = args["ayuda"]
-- Gather parameters
local root = tit:gsub("e$", "")
local irreg
local root_pl = nil
local root_sg = nil
if args[2] and args[2] ~= '' and not args[3] then
root_sg = "#"..args[2].."#"
root_pl = "#"..args[2].."#"
irreg = true
elseif args[3] and args[3] ~= '' then
root_pl = "#"..args[3].."#"
if args[2] and args[2] ~= '' then
root_sg = "#"..args[2].."#"
end
irreg = true
end
local inc
tipo, inc = tipo:gsub('u', '')
if not root_pl then
if tit:find("kel$") then
root_pl = tit:gsub("k?kel$", "kl")
elseif tit:find("tel$") and not tit:find('mittel$') and not tit:find('pitel$')then
root_pl = tit:gsub("t?tel$", "tl")
else
root_pl = root
end
end
if not root_sg then
root_sg = root
end
decl.indef_sg = args["ayuda"]
if tipo == "m1" or tipo == "m" then
decl.def_sg = root_sg..'en'
decl.indef_pl = root_pl..'er'
decl.def_pl = root_pl..'ene'
insert(cats, "NB:Sustantivos masculinos")
insert(cats, "NB:Sustantivos masculinos de la primera declinación")
elseif tipo == "m2" then
decl.def_sg = root_sg..'en'
decl.indef_pl = root_pl..'e'
decl.def_pl = root_pl..'ne'
insert(cats, "NB:Sustantivos masculinos")
insert(cats, "NB:Sustantivos masculinos de la segunda declinación")
elseif tipo == "m3" then
root_pl = tit:gsub("er$", "")
decl.def_sg = root_sg..'en'
decl.indef_pl = {root_sg..'e', root_pl..'re', root_pl..'rer'}
decl.def_pl = {root_pl..'erne', root_pl..'rene'}
insert(cats, "NB:Sustantivos masculinos")
insert(cats, "NB:Sustantivos masculinos de la tercera declinación")
elseif tipo == "n1" or tipo == "n" then
decl.def_sg = root_sg..'et'
decl.indef_pl = root_pl
decl.def_pl = {root_pl..'a', root_pl..'ene'}
insert(cats, "NB:Sustantivos neutros")
insert(cats, "NB:Sustantivos neutros de la primera declinación")
elseif tipo == "n2" then
decl.def_sg = root_sg..'et'
decl.indef_pl = root_pl..'er'
decl.def_pl = {root_pl..'a', root_pl..'ene'}
insert(cats, "NB:Sustantivos neutros")
insert(cats, "NB:Sustantivos neutros de la segunda declinación")
elseif tipo == "n3" then
decl.def_sg = root_sg..'et'
decl.indef_pl = {root_pl, root_pl..'er'}
decl.def_pl = {root_pl..'a', root_pl..'ene'}
insert(cats, "NB:Sustantivos neutros")
insert(cats, "NB:Sustantivos neutros de la tercera declinación")
elseif tipo == "c" or tipo == "c1" or tipo == "mf1" or tipo == "fm1" then
decl.def_sg = {root_sg..'a', root_sg..'en'}
decl.indef_pl = root_pl..'er'
decl.def_pl = root_pl..'ene'
insert(cats, "NB:Sustantivos comunes")
insert(cats, "NB:Sustantivos comunes de la primera declinación")
elseif tipo == "c2" or tipo == "mf2" or tipo == "fm2" then
decl.def_sg = {root_sg..'en', root_sg..'et'}
decl.indef_pl = {root_pl..'er', root_pl}
decl.def_pl = {root_pl..'ene', root_pl..'a'}
insert(cats, "NB:Sustantivos comunes")
insert(cats, "NB:Sustantivos comunes de la segunda declinación")
else
error("Debe especificar el género con uno de los siguientes valores: m, m-ov, m-a, f, f-mixto, f-i, f-i-mixto, f-v, n")
end
local sg = find(args["num"], "sg")
local pl = find(args["num"], "pl")
if inc and inc > 0 then
pl = false
end
if not sg then
insert(cats, "NB:Sustantivos solo en plural")
end
if not pl then
insert(cats, "NB:Sustantivos solo en singular")
end
local dec, irreg2 = sobreescribir_formas(decl, args)
if irreg or irreg2 then
enc = f("#irregular#")
end
dec = desactivar_formas(dec,
function (form)
local xx = sub(form, -2)
return (xx == "sg" and not sg) or (xx == "pl" and not pl)
end
)
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{{"plural", dec.indef_pl},
{"definido singular", dec.def_sg},
{"definido plural", dec.def_pl},
{"genitivo", args.gen}
},
ns == 0 and cats or {}
)
end
return export
ncs1ui10darlmmk9x9ghbg1o0j7cb7h
Módulo:flex/nn
828
1061640
6307341
6124310
2026-08-06T00:34:32Z
TMCbot
164594
.
6307341
Scribunto
text/plain
-- Flexión del Noruego nynorsk
-- Adaptado desde en.wikt
local export = {}
local unpack = unpack or table.unpack
local insert = table.insert
local concat = table.concat
local m_table = require("Módulo:tabla")
local insert_if_not = m_table.insertIfNot
local m_str = require("Módulo:string")
local u = m_str.char
local find = m_str.find
local gsub = m_str.gsub
local sub = m_str.sub
local m_flex = require("Módulo:flex")
local f = m_flex.f
local sobreescribir_formas = m_flex.sobreescribir_formas
local desactivar_formas = m_flex.desactivar_formas
local renderizar_encabezado = m_flex.renderizar_encabezado
local espacios = "%-‐%s"
local ESPACIO = "["..espacios.."]"
local NO_ESPACIO = "[^"..espacios.."]"
local labels = {
["indef_sg"] = "indef. sg.",
["indef_pl"] = "indef. pl.",
["def_sg"] = "def. sg.",
["def_pl"] = "def. pl.",
}
function export.sust(frame)
local title_ = mw.title.getCurrentTitle()
local title = title_.fullText
local ns = title_.namespace
if ns ~= 0 then
return "Use esta plantilla en el espacio principal."
end
local params = {
[1] = {requerido = true},
[2] = {},
[3] = {},
["num"] = {por_defecto = "sgpl"},
["alt"] = {},
["nota"] = {},
["ayuda"] = {por_defecto = title},
["indef_sg"] = {lista = true},
["indef_pl"] = {lista = true},
["def_sg"] = {lista = true},
["def_pl"] = {lista = true},
["gen"] = {lista = true},
}
local parent_frame = frame:getParent()
local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
assert(args[1], "falta especificar el tipo en el primer parámetro")
local cats = {}
local decl = {}
local enc
local tipo = args[1]
local tit = args["ayuda"]
-- Gather parameters
local root = tit:gsub("e$", "")
local irreg
local root_pl = nil
local root_sg = nil
if args[2] and args[2] ~= '' and not args[3] then
root_sg = "#"..args[2].."#"
root_pl = "#"..args[2].."#"
irreg = true
elseif args[3] and args[3] ~= '' then
root_pl = "#"..args[3].."#"
if args[2] and args[2] ~= '' then
root_sg = "#"..args[2].."#"
end
irreg = true
end
local inc
tipo, inc = tipo:gsub('u', '')
if not root_pl then
if tit:find("kel$") then
root_pl = tit:gsub("k?kel$", "kl")
elseif tit:find("tel$") and not tit:find('mittel$') and not tit:find('pitel$')then
root_pl = tit:gsub("t?tel$", "tl")
else
root_pl = root
end
end
if not root_sg then
root_sg = root
end
decl.indef_sg = args["ayuda"]
if tipo == "m1" or tipo == "m" then
decl.def_sg = root_sg..'en'
decl.indef_pl = root_pl..'ar'
decl.def_pl = root_pl..'ane'
insert(cats, "NN:Sustantivos masculinos")
insert(cats, "NN:Sustantivos masculinos de la primera declinación")
elseif tipo == "m2" then
decl.def_sg = root_sg..'en'
decl.indef_pl = {root_pl..'er', root_pl..'ar'}
decl.def_pl = {root_pl..'ene', root_pl..'ane'}
insert(cats, "NN:Sustantivos masculinos")
insert(cats, "NN:Sustantivos masculinos de la segunda declinación")
elseif tipo == "m3" then
decl.def_sg = root_sg..'en'
decl.indef_pl = root_sg
decl.def_pl = root_pl..'a'
insert(cats, "NN:Sustantivos masculinos")
insert(cats, "NN:Sustantivos masculinos de la tercera declinación")
elseif tipo == "n1" or tipo == "n" then
decl.def_sg = root_sg..'et'
decl.indef_pl = tit
decl.def_pl = root_pl..'a'
insert(cats, "NN:Sustantivos neutros")
insert(cats, "NN:Sustantivos neutros de la primera declinación")
elseif tipo == "f1" then
decl.def_sg = root_sg..'a'
decl.indef_pl = root_pl..'er'
decl.def_pl = root_pl..'ene'
insert(cats, "NN:Sustantivos femeninos")
insert(cats, "NN:Sustantivos femeninos de la primera declinación")
elseif tipo == "f2" then
decl.def_sg = root_sg..'a'
decl.indef_pl = root_pl..'er'
decl.def_pl = root_pl..'ene'
insert(cats, "NN:Sustantivos femeninos")
insert(cats, "NN:Sustantivos femeninos de la segunda declinación")
elseif tipo == "f3" then
decl.def_sg = root_sg..'a'
decl.indef_pl = root_pl..'ar'
decl.def_pl = root_pl..'ane'
insert(cats, "NN:Sustantivos femeninos")
insert(cats, "NN:Sustantivos femeninos de la tercera declinación")
elseif tipo == "f13" then
decl.def_sg = root_sg..'a'
decl.indef_pl = {root_pl..'er', root_pl..'ar'}
decl.def_pl = {root_pl..'ene',root_pl..'ane'}
insert(cats, "NN:Sustantivos femeninos")
insert(cats, "NN:Sustantivos femeninos de la primera declinación")
insert(cats, "NN:Sustantivos femeninos de la tercera declinación")
elseif tipo == "c" or tipo == "c1" or tipo == "mf" or tipo == "fm" or tipo == "mf1" or tipo == "fm1" then
decl.def_sg = {root_sg..'en', root_sg..'a'}
decl.indef_pl = {root_pl..'er', root_pl..'ar'}
decl.def_pl = {root_pl..'ene', root_pl..'ane'}
insert(cats, "NN:Sustantivos comunes")
insert(cats, "NN:Sustantivos comunes de la primera declinación")
elseif tipo == "mn1" or tipo == "mn" then
decl.def_sg = {root_sg..'en'}
decl.indef_pl = {root_pl..'ar'}
decl.def_pl = {root_pl..'ane'}
insert_if_not(decl.def_sg, root_sg..'et')
insert_if_not(decl.indef_pl, tit)
insert_if_not(decl.def_pl, root_pl..'a')
insert(cats, "NN:Sustantivos masculinos")
insert(cats, "NN:Sustantivos masculinos de la primera declinación")
insert(cats, "NN:Sustantivos neutros")
insert(cats, "NN:Sustantivos neutros de la primera declinación")
elseif tipo == "-ium" or tipo == "ium" then
local r = tit:gsub("um$", "")
decl.def_sg = {r..'et'}
decl.indef_pl = {tit}
decl.def_pl = {r..'a'}
insert(cats, "NN:Sustantivos neutros")
insert(cats, "NN:Sustantivos neutros de la primera declinación")
else
error("Debe especificar el género con uno de los siguientes valores: m, m-ov, m-a, f, f-mixto, f-i, f-i-mixto, f-v, n")
end
local sg = find(args["num"], "sg")
local pl = find(args["num"], "pl")
if inc and inc > 0 then
pl = false
end
if not sg then
insert(cats, "NN:Sustantivos solo en plural")
end
if not pl then
insert(cats, "NN:Sustantivos solo en singular")
end
local dec, irreg2 = sobreescribir_formas(decl, args)
if irreg or irreg2 then
enc = f("#irregular#")
end
dec = desactivar_formas(dec,
function (form)
local xx = sub(form, -2)
return (xx == "sg" and not sg) or (xx == "pl" and not pl)
end
)
return renderizar_encabezado(
frame,
args["alt"] or title,
enc,
args["nota"],
{{"plural", dec.indef_pl},
{"definido singular", dec.def_sg},
{"definido plural", dec.def_pl},
{"genitivo", args.gen}
},
ns == 0 and cats or {}
)
end
return export
fy3it71a6mdml4deglgztdwxgqp0j1u
dese
0
1061995
6307361
6090133
2026-08-06T00:37:59Z
TMCbot
164594
.
6307361
wikitext
text/x-wiki
{{desambiguación|dése|desé|desè}}
== {{lengua|es}} ==
{{pron-graf|v=desa|ayuda=de-se}}
=== Etimología ===
{{etimología|lexicalización|dese}}; {{etim|compuesto|de|ese}}.
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1: Objeto cuyo nombre no se recuerda.<ref>{{DLE}}</ref>
{{uso|coloquial}}
{{ámbito|México}}
{{sinónimo|coso|cosito}}
=== Forma flexiva ===
==== Contracción ====
{{es.adj|irreg|deses|desa|desas|neutro=deso}}
;1: {{contracción|de|ese}}.
{{uso|anticuado}}
== Referencias y notas ==
<references />
qjemnk7of0lynizn067nw1c27d4wgyu
Módulo:abecedario
828
1062519
6307318
6077084
2026-08-06T00:33:36Z
TMCbot
164594
.
6307318
Scribunto
text/plain
local export = {}
local insert = table.insert
local concat = table.concat
function export.mostrar(frame)
local parent_frame = frame:getParent()
local args = parent_frame.args
local prefijo = args["prefijo"] or "#"
local t = {}
local abc = args
if not abc[1] then
abc = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","Ñ","O","P","Q","R","S","T","U","V","W","X","Y","Z"}
end
for _,a in ipairs(abc) do
insert(t, "[["..prefijo..a.."|"..a.."]]")
end
return concat(t, " • ")
end
return export
2fx87ktoj2oonempibii2lw3vhn2dbw
Plantilla:ast.sust/doc
10
1062710
6307387
6117328
2026-08-06T01:03:31Z
Tmagc
158167
6307387
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
== Uso ==
Esta es la nueva plantilla para flexionar '''sustantivos''' del asturiano. Reemplaza a todas las anteriores que se usaron.
TLDR: Generalmente, o bien no es necesario especificar nada, o bien es necesario invocarla con {{epc|ast.sust|mf}} en el primer parámetro si el sustantivo es masculino y femenino. Para la plantilla {{ep|ast.adj}}, este parámetro se activa por defecto para que genere ambas formas, mientras que el resto funciona igual a esta plantilla.
Los sustantivos se flexionan según el siguiente criterio:
{| class="wikitable"
! termina en !! plural !! femenino !! femenino plural !! neutro
|-
| -és (aguda/monosílaba) || -eses || -esa || -eses || -és, -eso
|-
| vocal + s || +es || +a || +es || +o
|-
| -ón (aguda/monosílaba) || -ones || -ona || -ones || -ón, -ono
|-
| -án, -én (aguda/monosílaba) || +es || +a || +es || +o
|-
| -au, -áu (aguda/monosílaba) || -aos || -ada || aes || ao
|-
| -ou, -óu (aguda/monosílaba) || -oos || -oda || oes || oo
|-
| -éu || -eos || -eda || -ees || -eo
|-
| -íu || -íos || -ida || -íes || -ío
|-
| -izu || -izos || -iza || -ices || -izo
|-
| -o, -u || -os || -a || -es || o
|-
| -a || -es || || ||
|-
| vocal || -s || || ||
|-
| -ol, -or || +es || +a || +as || inv.
|-
| vocal + l/r/x/z || +es || || ||
|-
| consonante + -y || -is || || ||
|-
| -ch || +es || || ||
|-
| doble consonante (una es s/z) || inv || || ||
|-
| doble consonante || +s || || ||
|-
| vocal + consonante || +s || || ||
|}
Los sustantivos que NO se ajusten a estas reglas deberán ser tratados como irregulares, especificando toda la flexión manualmente. '''PRESTE ATENCIÓN''' Muchas irregularidades están asociadas a la duplicación o no duplicación de las consonantes finales.
=== Otros casos ===
:* '''Sustantivos masculinos y femeninos''': Invóquese con el valor <code>mf</code> en el primer parámetro
:* '''Sustantivos y adjetivos invariantes, o solo en singular o plural''': En estos casos debe usarse el primer parámetro:
::* con {{epc|ast.sust|n}} o {{epc|ast.sust|ng}} (no género) se especifica "mf" pero se prohíbe explícitamente flexionar en género, muy útil en adjetivos excepcionales que terminan en -o o a veces en -e pero que no flexionan a -a.
::* con {{epc|ast.sust|inv}}, la palabra es invariante tanto en género como en número.
::* con {{epc|ast.sust|s}} o con {{epc|ast.sust|p}}, la palabra existe solo en singular o solo en plural.
::* con {{epc|ast.sust|irreg}}, la palabra flexiona de forma irregular (ver Sustantivos y adjetivos con femeninos o plurales irregulares).
:* '''Comparativos y superlativos''': Se puede especificar cada uno de los comparativos y superlativos con los parámetros de lista {{parámetro|comparativo}} y {{parámetro|superlativo}}. Ver ejemplo en [[bueno]].
:* '''Sustantivos y adjetivos con femeninos o plurales irregulares''': Las palabras que no se ajustan a las reglas deberán especificarse manualmente con los parámetros de lista {{parámetro|p}} (plural), {{parámetro|f}} (femenino), {{parámetro|fp}} (femenino plural), habiéndose invocado con el valor "irreg" en el primer parámetro. Por defecto, el segundo, tercer y cuarto parámetro posicional de la plantilla están asociados con {{parámetro|p1}}, {{parámetro|f1}}, {{parámetro|fp1}}. Ver ejemplos en [[líder]] o [[actor]].
:* '''Notas al pie''': Se puede agregar una nota al pie con el parámetro {{parámetro|nota}}.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|1}}
|Tipo de flexión en el sustantivo o adjetivo.
|Lista de valores
|ninguno (por defecto), mf (masculino y femenino), ng (sin marca de género), inv (invariante), s (singularia tantum), p (pluralia tantum), irreg (sufijo completamente irregular)
|-
|{{parámetro|2}}
|Alias para {{parámetro|p1}}
|
|
|-
|{{parámetro|3}}
|Alias para {{parámetro|f1}}
|
|
|-
|{{parámetro|4}}
|Alias para {{parámetro|fp1}}
|
|
|-
|{{parámetro|p}} ({{parámetro|p2}}, {{parámetro|p3}}, etc.)
|Plurales (masculinos) irregulares
|Libre
|especificar el plural
|-
|{{parámetro|f}} ({{parámetro|f2}}, {{parámetro|f3}}, etc.)
|Femeninos irregulares
|Libre
|especificar el femenino
|-
|{{parámetro|fp}} ({{parámetro|fp2}}, {{parámetro|fp3}}, etc.)
|Femeninos plurales irregulares
|Libre
|especificar el femenino en plural
|-
|{{parámetro|n}} ({{parámetro|n2}}, {{parámetro|n3}}, etc.)
|Neutros irregulares
|Libre
|especificar el neutro
|-
|{{parámetro|comp}} ({{parámetro|comp2}}, {{parámetro|comp3}}, etc.)
|Comparativo
|Libre
|especificar el comparativo
|-
|{{parámetro|sup}} ({{parámetro|sup2}}, {{parámetro|sup3}}, etc.)
|Superlativo
|Libre
|especificar el superlativo
|-
|{{parámetro|cop}}
|Si la estructura es copulativa; obligatorio especificarlo en las locuciones que tienen plural, si no lo tiene o es invariante especificarlo con el primer parámetro.
|booleano
|n (no), s (sí)
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
<includeonly><!--
++++ POR FAVOR, AÑADE LAS CATEGORÍAS DEBAJO DE ESTA LÍNEA, DENTRO DE LAS ETIQUETAS INCLUDEONLY, GRACIAS. -->
[[Categoría:AST:Plantillas de flexión]]
</includeonly>
p5atw336uv8fk0uh1urw9goo20k5md2
Plantilla:yua.sust/doc
10
1062712
6307406
6092711
2026-08-06T02:13:43Z
26agcp
138617
corrección
6307406
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
== Uso ==
Plantilla para sustantivos del maya yucateco. En general, no es necesario especificar ningún parámetro.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|p}} ({{parámetro|p1}}, {{parámetro|p2}}, ...)
|Sobreescribe el plural (sustantivos irregulares)
|Libre
|
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
<includeonly>
[[Categoría:YUA:Plantillas de flexión]]
</includeonly>
9bvnozlbx2954bp5ueh2wcgsxym6635
Plantilla:yua.adj/doc
10
1062713
6307407
6092712
2026-08-06T02:15:04Z
26agcp
138617
corrección
6307407
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
== Uso ==
Plantilla para adjetivos del maya yucateco. En general, no es necesario especificar ningún parámetro.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|p}} ({{parámetro|p1}}, {{parámetro|p2}}, ...)
|Sobreescribe el plural (adjetivos irregulares)
|Libre
|
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
<includeonly>
[[Categoría:YUA:Plantillas de flexión]]
</includeonly>
i3g2n9lx9o5ao3zckp9qditohqcvzn9
Plantilla:oc.sust/doc
10
1062770
6307384
6288078
2026-08-06T01:00:20Z
TMCbot
164594
.
6307384
wikitext
text/x-wiki
{{subpágina documentación de plantilla}}
<!-- POR FAVOR, AÑADE LAS CATEGORÍAS AL FINAL DE ESTA PÁGINA. -->
<!-- Si te dispones a documentar una plantilla de mantenimiento, por favor considera adoptar el formato de [[Wikipedia:Documentación de plantillas de mantenimiento]]-->
{{metaplantilla de avisos|tipo=desarrollo|texto=Documentación incompleta. Contactar a [[Usuario discusión:Tmagc]] si se necesita mayor información}}
== Uso ==
Esta es la nueva plantilla para flexionar '''sustantivos''' del occitano. Reemplaza a todas las anteriores que se usaron.
TLDR: '''Obligatorio especificar el género del sustantivo en el primer parámetro'''. Puede ser masculino (m), femenino (f) o masculino y femenino (mf). Obviamente que las otras opciones (ng, inv, s, p, irreg) también son aceptables y dan suficiente información para construir la flexión "regular". Para la plantilla {{ep|oc.adj}}, se activa por defecto "mf" para que genere ambas formas, mientras que el resto funciona igual a esta plantilla.
Los sustantivos se flexionan según el siguiente criterio, respetando la precedencia de las filas:
(tabla por construir)
Los sustantivos que NO se ajusten a estas reglas deberán ser tratados como irregulares, especificando toda la flexión manualmente. '''PRESTE ATENCIÓN''' Muchas irregularidades están asociadas a:
* El no cambio de -t final a -d. Por ejemplo: [[petit]] -> [[petita]] (en lugar del esperado *petida).
* La duplicación de la s final: [[abís]] -> [[abisses]].
=== Otros casos ===
:* '''Sustantivos masculinos y femeninos''': Invóquese con el valor <code>mf</code> en el primer parámetro
:* '''Sustantivos y adjetivos invariantes, o solo en singular o plural''': En estos casos debe usarse el primer parámetro:
::* con {{epc|oc.sust|n}} o {{epc|oc.sust|ng}} (no género) se especifica "mf" pero se prohíbe explícitamente flexionar en género, muy útil en adjetivos con forma idéntica en femenino y masculino.
::* con {{epc|oc.sust|inv}}, la palabra es invariante tanto en género como en número.
::* con {{epc|oc.sust|s}} o con {{epc|oc.sust|p}}, la palabra existe solo en singular o solo en plural.
::* con {{epc|oc.sust|irreg}}, la palabra flexiona de forma irregular (ver Sustantivos y adjetivos con femeninos o plurales irregulares).
:* '''Comparativos y superlativos''': Se puede especificar cada uno de los comparativos y superlativos con los parámetros de lista {{parámetro|comparativo}} y {{parámetro|superlativo}}. Ver ejemplo en [[bueno]].
:* '''Sustantivos y adjetivos con femeninos o plurales irregulares''': Las palabras que no se ajustan a las reglas deberán especificarse manualmente con los parámetros de lista {{parámetro|p}} (plural), {{parámetro|f}} (femenino), {{parámetro|fp}} (femenino plural), habiéndose invocado con el valor "irreg" en el primer parámetro. Por defecto, el segundo, tercer y cuarto parámetro posicional de la plantilla están asociados con {{parámetro|p1}}, {{parámetro|f1}}, {{parámetro|fp1}}. Ver ejemplos en [[líder]] o [[actor]].
:* '''Notas al pie''': Se puede agregar una nota al pie con el parámetro {{parámetro|nota}}.
=== Parámetros ===
{| class="wikitable"
|+Parámetros
!Parámetro
!Función
!Tipo
!Valores posibles
|-
|{{parámetro|1}}
|Tipo de flexión en el sustantivo o adjetivo.
|Lista de valores
|m (masculino), f (femenino), mf (masculino y femenino), ng (sin marca de género), inv (invariante), s (singularia tantum), p (pluralia tantum), irreg (sufijo completamente irregular)
|-
|{{parámetro|2}}
|Alias para {{parámetro|p1}}
|
|
|-
|{{parámetro|3}}
|Alias para {{parámetro|f1}}
|
|
|-
|{{parámetro|4}}
|Alias para {{parámetro|fp1}}
|
|
|-
|{{parámetro|ayuda}}
|Grafía de la palabra con tildes.
|Libre
|Indica cuál es la sílaba tónica o si tiene diptongos o hiatos. Si no se especifica se asume acentuación llana.
|-
|{{parámetro|s}} ({{parámetro|forzars}})
|Prohibir el plural con -es
|booleano
|n (no, por defecto), s (sí)
|-
|{{parámetro|p}} ({{parámetro|p2}}, {{parámetro|p3}}, etc.)
|Plurales (masculinos) irregulares
|Libre
|especificar el plural
|-
|{{parámetro|f}} ({{parámetro|f2}}, {{parámetro|f3}}, etc.)
|Femeninos irregulares
|Libre
|especificar el femenino
|-
|{{parámetro|fp}} ({{parámetro|fp2}}, {{parámetro|fp3}}, etc.)
|Femeninos plurales irregulares
|Libre
|especificar el femenino en plural
|-
|{{parámetro|comp}} ({{parámetro|comp2}}, {{parámetro|comp3}}, etc.)
|Comparativo
|Libre
|especificar el comparativo
|-
|{{parámetro|sup}} ({{parámetro|sup2}}, {{parámetro|sup3}}, etc.)
|Superlativo
|Libre
|especificar el superlativo
|-
|{{parámetro|cop}}
|Si la estructura es copulativa; '''obligatorio especificarlo en las locuciones que tienen plural, si no lo tiene o es invariante especificarlo con el primer parámetro posicional'''.
|booleano
|n (no), s (sí)
|-
|{{parámetro|nota}}
|Nota
|Libre
|especificar una nota al pie
|}
<includeonly><!--
++++ POR FAVOR, AÑADE LAS CATEGORÍAS DEBAJO DE ESTA LÍNEA, DENTRO DE LAS ETIQUETAS INCLUDEONLY, GRACIAS. -->
[[Categoría:OC:Plantillas de flexión]]
</includeonly>
dj0eltw2badydh0bixn37jps49zlk54
negrata
0
1065141
6307390
6121202
2026-08-06T01:21:29Z
Tmagc
158167
/* {{sustantivo masculino y femenino|es}} */
6307390
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|sufijo|negro|ata}}.
==== {{sustantivo masculino y femenino|es}} ====
{{es.sust|mf}}
;1: Persona con la [[piel]] [[oscuro|oscura]]
{{uso|despectivo}}
{{ámbito|España}}
==== Traducciones ====
{{trad-arriba}}
<!-- formato: {{t|idioma|t1=(traducción1)|t2=(traducción2|...(hay más opciones))}} p. ej. {{t|fr|t1=chose|a1=1|g1=f}} (ver más ejemplos en Plantilla:t/doc) -->
{{trad-abajo}}
<!-- si va a insertar una nueva sección de etimología o de idioma, por favor, hágalo ↑ arriba ↑ de esta línea. NO BORRE LO QUE ESTÁ DEBAJO, GRACIAS. -->
== Referencias y notas ==
<references />
0vf9haeo262q9xyll4sv6yhepe33tek
Wikcionario:Café/2026 06
4
1065143
6307310
6194711
2026-08-05T23:19:41Z
MABot
70592
Bot: archivo de 1 hilo procedente de [[Wikcionario:Café]]
6307310
wikitext
text/x-wiki
{{Archivo}}
== Noticias técnicas: 2026-23 ==
<section begin="technews-2026-W23"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/23|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* El [[mw:Special:MyLanguage/Readers/Reader Experience|equipo de Experiencia de Lectura]] está desarrollando un experimento para mostrar la función beta de [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|listas de lectura]] a los usuarios sin sesión iniciada. El objetivo es evaluar si esta herramienta incentiva de mejor manera la creación de cuentas en comparación con el botón de la lista de seguimiento. El [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists#Experiment timeline|experimento]] se lanzó el 18 de mayo en las Wikipedias en alemán, español, italiano, portugués, polaco, neerlandés, turco y urdu, y se mantendrá activo durante un mes.
* El equipo de Wikimedia Apps ha lanzado la [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh/Phase 1|fase 1]] del rediseño del feed de la página de inicio en la versión beta de la aplicación para Android. El nuevo feed incluye una sección renovada de "Comunidad" y una pestaña personalizada de «Para ti» que muestra recomendaciones diarias personalizadas. Este rediseño forma parte de los esfuerzos para mejorar el descubrimiento de contenidos y crear experiencias más atractivas en las aplicaciones de Wikipedia.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:18}} {{PLURAL:18|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un error por el cual las imágenes no se cargaban en algunas ediciones sugeridas en [[w:Special:Homepage|Special:Homepage]], lo que dejaba la miniatura colgada en estado de carga. [https://phabricator.wikimedia.org/T424048]
'''Actualizaciones para los colaboradores técnicos'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.5|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/23|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W23"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:08 1 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30613639 -->
== Noticias técnicas: 2026-24 ==
<section begin="technews-2026-W24"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/24|Traducciones en varios idiomas]] están disponibles.
'''Lo más destacado de la semana'''
* Wikimedia Enterprise ha aumentado el límite gratuito que ofrece para sus API. El límite mensual de solicitudes para la API bajo demanda se incrementó de 5000 a 50 000 peticiones, mientras que el límite de la API de instantáneas (Snapshot) aumentó de 15 a 30 solicitudes por mes. Además, las instantáneas de contenido estructurado ya se encuentran disponibles para las cuentas gratuitas. Estos cambios expanden el acceso a los datos de Wikimedia Enterprise para desarrolladores, investigadores y organizaciones que utilizan contenidos de Wikimedia. [https://enterprise.wikimedia.com/blog/enhanced-free-api]
'''Actualizaciones para editores'''
* El [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Explore Feed Refresh/Phase 1|feed Explorar renovado]], ahora llamado feed de Inicio, se está lanzando al 50 % de los usuarios de la aplicación de Wikipedia para Android. Este feed ayuda a los lectores a descubrir contenidos mediante dos pestañas nuevas: «Comunidad» y «Para ti». La pestaña de Comunidad muestra un feed de contenidos curados y actualizaciones de la comunidad Wikimedia y del movimiento, mientras que la pestaña «Para ti» entrega una experiencia a pantalla completa que muestra contenidos de acuerdo con los intereses del usuario. Este rediseño forma parte de un esfuerzo con el fin de mejorar el descubrimiento de contenidos y la experiencia de aprendizaje en la app de Wikipedia.
* El juego de trivia diario [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/"Which came first?" Game|¿Qué fue primero?]] ya está disponible en la versión beta de la aplicación de Wikipedia para iOS en inglés, alemán, francés, portugués, ruso, español, árabe, chino y turco. El juego utiliza eventos históricos extraídos de la sección «En este día» de Wikipedia y desafía al lector a adivinar cuál de dos acontecimientos ocurrió primero. Esta función ya se había lanzado previamente en Android. Las comunidades interesadas en que el juego esté disponible en su idioma pueden [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Games#Game availability by language|consultar las instrucciones y los requisitos]].
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Subreferenciación]], una nueva función de MediaWiki que permite a los editores reutilizar referencias añadiendo detalles específicos, se comenzará a desplegar en las wikis de Wikimedia tras una exitosa fase piloto. El despliegue iniciará el 8 de junio para la mayoría [[wikitech:Deployments/Train#Wednesday|de las wikis del Grupo 1]] y la Wikipedia en francés, mientras que las demás versiones de Wikipedia comenzarán a recibir esta característica en los meses siguientes. Se anima a las comunidades a prepararse revisando los [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-cite&language=en&action_source=search&filter=%21translated&optional=1&action=translate mensajes sin traducir de la extensión Cite] en sus respectivos idiomas y verificando el uso de [[mw:Special:MyLanguage/Reference Tooltips|Reference Tooltips]], que podrían requerir una [[:phab:T416304#11668731|actualización]] para dar soporte a la nueva funcionalidad. Las wikis que utilizan la [[mw:Special:MyLanguage/Help:Reference Previews|vista previa de referencias]] estándar no necesitan realizar ninguna acción. Asimismo, las comunidades pueden crear la [[Special:TrackingCategories|categoría de seguimiento]] ''cite-tracking-category-ref-details'' como una categoría oculta usando <code><nowiki>__HIDDENCAT__</nowiki></code> (o una plantilla dedicada a este propósito) y conectarla con el elemento de Wikidata [[d:Q129764848]]. [https://phabricator.wikimedia.org/T425662]
* El [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews#Experimentation|experimento de Page Previews]] ha finalizado en la web móvil. El equipo ha decidido no lanzar la característica después de que los resultados no mostraron un impacto significativo en la retención de lectores, que fue definida como la principal métrica del estudio. Page Previews, la cual ya está disponible en las versiones de escritorio y apps, muestra una miniatura, un párrafo inicial y un enlace al artículo completo cuando el usuario selecciona un enlace en azul. El experimento probó esta experiencia en la web para dispositivos móviles en seis Wikipedias.
* La [[mw:Special:MyLanguage/Codex/Design/Icons|biblioteca de iconos para la interfaz de usuario]] será [[phab:T399175|actualizada esta o la próxima semana]]. Cerca de 300 iconos han sido ligeramente redefinidos y se han añadido aproximadamente 30 iconos nuevos. Estos cambios mejorarán los iconos para hacerlos más consistentes y fáciles de entender y proveerán un balance visual cuando se usen en grupos.
* La interfaz del [[mw:Special:MyLanguage/Universal Language Selector|Selector de Idioma Universal]] (ULS en inglés), el cual ayuda a los usuarios a seleccionar contenidos en otros idiomas, fue actualizada. La nueva versión mejora la velocidad y la accesibilidad, y los usuarios de proyectos Wikimedia ahora pueden fijar los idiomas para un cambio más rápido. El despliegue en los sitios de Wikimedia será gradual durante las próximas semanas. Puedes probarlo como una función beta seleccionando [[Special:Preferences#mw-prefsection-betafeatures|funciones beta]] en las preferencias de tu perfil y compartir tus comentarios en [[mw:Special:MyLanguage/Universal Language Selector/New ULS|la página del proyecto]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:21}} {{PLURAL:21|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se resolvió un problema que afectaba al panel de Análisis de Vistas en pageviews.wmcloud.org, el cual había dejado de actualizar los gráficos de mayo de 2026, lo que afectaba a todos los usuarios. [https://phabricator.wikimedia.org/T427171]
'''Actualizaciones para los colaboradores técnicos'''
* La firma de la función <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink()</nowiki></code></bdi> ha sido simplificada. Los desarrolladores ahora pueden pasar el objeto de configuración en lugar de una lista de parámetros posicionales al crear enlaces de portlet. La firma de la función anterior mantendrá la compatibilidad heredada. Por ejemplo, en lugar de <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', '#', 'Stub', 'ca-stubtag', 'Add a stub tag to this page');</nowiki></code></bdi>, use <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', { href: '#', text: 'Stub', id: 'ca-stubtag', tooltip: 'Add a stub tag to this page' });</nowiki></code></bdi>. Se anima a los mantenedores de scripts a revisar los usos existentes de <bdi lang="zxx" dir="ltr"><code><nowiki>addPortletLink()</nowiki></code></bdi> y actualizarlos donde corresponda. Este cambio estará disponible en todas las wikis a partir del 11 de junio. Gracias al voluntario comunitario Gerges por contribuir a esta mejora. [https://phabricator.wikimedia.org/T427945]
* '''Discusión sobre la Lista de deseos de la comunidad''': Producto y Tecnología [[m:Special:MyLanguage/Community Wishlist/Updates#May 20, 2026: Community Tech becomes a program|introdujo cambios]] destinados a aumentar el número y la complejidad de los deseos cumplidos, incluyendo la disolución del equipo de Tecnología Comunitaria. Actualmente, se encuentran [[m:Special:MyLanguage/Community Wishlist/Updates|participando en discusiones]] sobre una [[m:Talk:Community Wishlist#Proposed direction for Wishlist|propuesta de dirección alternativa para la lista de deseos]] presentada por miembros de la comunidad. Esto incluye formas de estructurar la votación anual, un mejor seguimiento de los deseos, la eliminación de las áreas de enfoque y [[m:Special:MyLanguage/Community Wishlist/Updates|actualizaciones sobre el personal]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.6|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/24|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W24"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:30 8 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30650573 -->
== Uso de invariable vs invariante en los géneros de los adjetivos ==
Estimados: Como recordarán se había discutido si usar la palabra "invariante o invariable" en relación al género de los adjetivos. Al leer la discusión, me dio la impresión que se había optado por "invariable". Sin embargo, en las páginas quedó "invariante". Debo recordar que nosotros no somos fuente primaria por lo que no podemos inventar conceptos. Así, invariable es [https://www.rae.es/gtg/invariable]. En cambio, invariante es [https://www.rae.es/dpd/invariante]. Saludos cordiales. [[Usuario:Adelpine|Adelpine]] ([[Usuario discusión:Adelpine|discusión]]) 23:00 11 jun 2026 (UTC)
:En principio coincido en usar "invariable", como manifesté en [[WN:Café/2026 05#Géneros en francés y español]]. Un saludo, [[Usuario:Peter Bowman|Peter Bowman]] ([[Usuario discusión:Peter Bowman|discusión]]) 23:07 11 jun 2026 (UTC)
:Hola, como ya dije no veo mucha diferencia entre ambos términos ni tampoco me queda claro de que exista un consenso generalizado en toda la comunidad por hacer la distinción que propone el DLE. Dicho esto, prefiero mantener la denominación que se venía usando para los sustantivos y adjetivos que no flexionan nada en absoluto, que es "invariante", puesto que lo correcto sería modificar todas las categorías que digan "invariante" por "invariable". Esto lo digo porque si modificamos todas las categorías perderíamos las redirecciones de Google, asunto que fue en su momento tan importante cuando propuse eliminar de cuajo las páginas con las denominaciones antiguas que se usaban para el tesauro. Si ese argumento valió en su momento, no veo razón para no usarlo ahora.
:Aparte en lo personal menos ganas me dan de acceder a los caprichos de [[Usuario:Adelpine|Adelpine]] después de [[Special:Diff/6117749|su diatriba contra este proyecto]], insinuando que el contenido es de mala calidad y que malinformamos a los escolares, cuando todavía no aportó ninguna prueba concreta: ni de que "no estamos entre los mejores diccionarios", ni de que ahora con esta modificación sí pasaríamos a estarlo, ni de que somos o debamos ser profesionales cuando aquí se trabaja plenamente ad honorem, ni de que tengamos que estar alineados con la visión de todas o alguna institución educativa. Realmente no entendí a qué quiere llegar con ninguno de sus dos comentarios. [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 23:53 11 jun 2026 (UTC)
::Lo de Google tiene fácil solución: no borrar las redirecciones. Lo de Adelpine no es una diatriba ([https://dle.rae.es/diatriba "discurso o escrito acre y violento contra alguien o algo"]) ni aprecio por su parte que afirme que Wikcionario sea de mala calidad. Lo de que no estamos entre los mejores diccionarios se podría expresar de otra forma con [[WN:Wikcionario no es una fuente primaria]]. Esto es, sí dependemos de otras fuentes "oficiales", profesionales, educativas, etc. para reflejar nuestra propia calidad. [[Usuario:Peter Bowman|Peter Bowman]] ([[Usuario discusión:Peter Bowman|discusión]]) 00:12 12 jun 2026 (UTC)
== Noticias técnicas: 2026-25 ==
<section begin="technews-2026-W25"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/25|Traducciones en varios idiomas]] están disponibles.
'''Lo más destacado de la semana'''
* El [[mw:Special:MyLanguage/Readers/Reader Growth|equipo de Crecimiento de Lectura]] ha lanzado la función beta [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Image Browsing]] en la versión de la web móvil de todas las Wikipedias. La característica muestra un carrusel de imágenes al inicio del artículo con 3 o más imágenes. Los editores pueden configurar esta característica con los siguientes controles: ocultar una imagen específica de una página, usando <code>class=notpageimage</code> para excluirla de la vista previa de miniaturas; o <code>class=noviewer</code> para excluirla de MediaViewer. El carrusel también se puede deshabilitar en una página utilizando la palabra mágica <code><nowiki>__NOMEDIAVIEWERCAROUSEL__</nowiki></code>. Para enviar retroalimentación o reportar fallos, por favor visite la [[mw:Talk:Readers/Reader Growth/Image Browsing|página del proyecto]].
* [[mw:Special:MyLanguage/Help:Tables#class="wikitable"|Wikitablas]] pueden ser [[mw:Special:MyLanguage/Help:Sortable tables#Forcing the initial sort direction|ordenadas en orden descendente]] al hacer el primer clic al añadir <code dir=ltr>data-sort-order="desc"</code> en la celda de encabezado. Anteriormente, por defecto, al hacer clic en el encabezado de una columna por primera vez, se ordenaba de manera ascendente. Esta opción añade más control y flexibilidad a las wikitablas, mientras se mantiene el comportamiento por defecto de los clics posteriores. [https://phabricator.wikimedia.org/T398416]
'''Actualizaciones para editores'''
* La [[mw:Special:MyLanguage/Article guidance|asistencia de artículos]] es una función que se está probando actualmente con algunos editores al crear nuevos artículos en las Wikipedias en inglés simple, francés y turco. El experimento comenzará próximamente en las Wikipedias en árabe y bengalí. [[w:simple:Special:NewArticle|Esta función]] les entrega una guía creada por la comunidad a los editores para ayudarles a crear algunos artículos siguiendo los estándares comunitarios. Los usuarios con experiencia pueden seguir creando o adaptando criterios para tipos específicos de artículos que comúnmente son creados por usuarios con menos experiencia. Las pautas guían a los usuarios con menos experiencia en la creación de artículos de mejor calidad. Se puede consultar una guía rápida del el marcado usado en las pautas en [[mw:Special:MyLanguage/Article guidance/Test feature guide#Markups in outlines|esta página]]. [[w:simple:Wikipedia:Article Guidance|Las pautas de ejemplos]] que pueden ser adaptadas y sus instrucciones de cómo adaptarlas se encuentran en [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|esta sección]] de la página del proyecto.
* Las wikis que deseen reemplazar el botón "Indefinido" en la página de Especial:Bloquear para cuentas temporales (por ejemplo, wikis que bloquean a los usuarios temporales hasta la expiración de su cuenta) pueden hacerlo al crear [[MediaWiki:ipb-indefinite-expiry-temporary-account]] con la duración del bloqueo que deseen. [https://phabricator.wikimedia.org/T427125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:41}} {{PLURAL:41|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]].
'''Actualizaciones para los colaboradores técnicos'''
* A finales de junio, se comenzará a requerir una cadena de agente de usuario (''user-agent'') para las descargas automáticas desde dumps.wikimedia.org. Las solicitudes automáticas que provean un agente genérico o vacío serán bloqueadas. Esto es parte del [[phab:T400119|cumplimiento de las normas]] de la [[foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|política de agente de usuario]]. No se cambiará el acceso a los dumps mediante Wikimedia Cloud Services.
* Se completó el proceso de implementación de los [[mw:Wikimedia APIs/Rate limits|límites de solicitudes de la API]], con el cumplimiento de la política en todas las API y con su documentación de niveles para todos los grupos. Bots que se ejecutan desde Toolfoge/WMCS o bots con permisos de usuarios de bot en cualquier wiki se mantendrán exceptuados. Todos los bots deberán seguir las buenas prácticas documentadas para evitar ser limitados.
* La [https://api.wikimedia.org/wiki/Main_Page wiki de API Portal] será marcada como solo lectura a partir de esta semana (del 15 al 18 de junio). La semana siguiente (del 22 al 25 de junio), todas las URLs del portal serán redirigidas a [[mw:Wikimedia APIs|APIs de Wikimedia en mediawiki.org]]. Lee más información en [[wikitech:API Portal/Deprecation|la página del proyecto]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.7|MediaWiki]]
'''Reuniones y eventos'''
* El 17 de junio a las 6pm UTC, la WMF sostendrá una llamada de Discord enfocada en la revisión de código. Hemos escuchado a través de la [[mw:Special:MyLanguage/Developer Satisfaction Survey/2026|Encuesta de satisfacción de desarrolladores]] que los voluntarios tienen problemas con la revisión de código y deseamos discutir sus experiencias, con el objetivo de plantear soluciones. Puedes unirte a la llamada [https://discord.gg/wikipedia?event=1514727511102062664 mediante el servidor de Discord de la comunidad Wikimedia].
* La [[m:Special:MyLanguage/Conferencia Wikimedia de América Latina 2026|Conferencia de Latinoamérica]] tendrá una sesión de hackathon regional que reunirá a la comunidad técnica, que incluye desarrolladores, administradores de sistemas, científicos de datos y usuarios con permisos extendidos. Las personas interesadas en participar pueden [https://docs.google.com/forms/d/e/1FAIpQLSf4osJzTHBJjQbYJk7TMVEJjTEQv7IgtsUDfP-o-qTgeRQQxw/viewform solicitar una beca] para participar hasta el 21 de junio a medianoche (hora de Bolivia, UTC-4)
* Apúntate a los Desafíos en Equipos de Wikimanía para unirte a este evento especial. Los desafíos en equipos tendrán lugar en línea y en persona los días 21 y 22 de julio, antes de la Wikimania. Todas las personas son bienvenidas, sin importar sus conocimientos o su participación en Wikimania. Los equipos trabajarán en 10 desafíos importantes que apoyen a la comunidad Wikimedia. Para más detalles, visita [[wmania:Special:MyLanguage/2026:Team challenges|la página del desafío]] y [https://wikimedia.eventyay.com/wm/teamchallenges/ regístrate aquí]. El registro cierra el 20 de junio a las 11pm UTC.
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/25|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W25"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:48 15 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:UOzurumba (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30689604 -->
== Noticias técnicas: 2026-26 ==
<section begin="technews-2026-W26"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/26|Traducciones en varios idiomas]] están disponibles.
'''Lo más destacado de la semana'''
* [[mw:Special:MyLanguage/Growth/Feature summary|Las características de crecimiento]] ya están [[phab:T418115|disponibles en Wikidata]]. Esta actualización habilita las Mentorías ([[mw:Special:MyLanguage/Help:Growth/Mentorship|si está configurada]]), el módulo de Impacto, el Panel de Ayuda y una página simplificada para Recién Llegados (sin Ediciones Sugeridas). Los administradores de Wikidatra pueden configurar la Configuración Comunitaria.
'''Actualizaciones para editores'''
* Se ha creado la página espacial [[{{#special:RangeCalculator}}]]. Permite a los usuarios encontrar un rango de IP sin la necesidad de acceder a herramientas externas. Hasta ahora, la herramienta estaba disponible solamente a los CheckUsers. [https://phabricator.wikimedia.org/T268429]
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referenciación]] es una nueva característica de MediaWiki que permite a los usuarios reutilizar referencias con diferentes detalles. Será desplegado el 23 de junio para la mayoría de las Wikipedia de tamaños pequeños y medianos. Las [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|Preguntas Frecuentes]] presentan una lista de posibles acciones que debes realizar en tu wiki para poder utilizar esta característica. Chequea el [[:phab:T414094|plan de lanzamiento]] para los siguientes pasos de lanzamiento. [https://phabricator.wikimedia.org/T428902]
* A partir de la próxima semana, los usuarios recibirán una notificación cuando estén bloqueados o desbloqueados de la edición, o si el bloqueo es modificado. [https://phabricator.wikimedia.org/T100974]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:32}} {{PLURAL:32|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]].
'''Actualizaciones para los colaboradores técnicos'''
* A partir de la próxima semana, los filtros de abuso que están configurados para "exigir verificación CAPTCHA" comenzarán a afectar también a los usuarios con el permiso <code>skipcaptcha</code>, que incluye a la mayoría de los usuarios autoconfirmados. Los bots están exentos. Este cambio solo afecta a las modificaciones que activan un filtro de abuso. El derecho de <code>skipcaptcha</code> seguirá eximiendo a los usuarios de tener que resolver CAPTCHA en el curso ordinario de usar las wikis. [https://phabricator.wikimedia.org/T402595]
* La documentación de referencia para la [[wikitech:Machine_Learning/LiftWing/API|API Lift Wing]] fue trasladada desde el portal API a la [https://wikitech.wikimedia.org/w/index.php?api=lift-wing&title=Special%3ARestSandbox zona de pruebas REST].
* La wiki del Portal API ya ha sido cerrada. Para la documentación de API, revisa la página [[mw:Special:MyLanguage/Wikimedia_APIs|APIs Wikimedia en mediawiki.org]]. Todas las URL del portal de API (https://api.wikimedia.org/wiki/) serán redireccionadas a la página de mediawiki.org a partir del 22 de junio. [https://phabricator.wikimedia.org/T427537]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.8|MediaWiki]]
'''Reuniones y eventos'''
* Únete a una llamada en línea el 25 de junio a las 2:30pm UTC para reunirte con los actuales internos del [[mw:Google_Summer_of_Code/2026|Google Summer of Code]] y [[mw:Outreachy/Round_32|Outreachy]]. Los internos resumirán sus proyectos y harán una breve demostración de sus trabajos. Los participantes podrán [[mw:event:Google_Summer_of_Code/Summer_2026_June_Internship_open_session|compartir ideas y conectarse mw:Google_Summer_of_Code/2026con sus comunidades]].
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/26|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W26"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:05 23 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Trizek (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30722494 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|discusión]])</bdi> 17:12 23 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Codename Noreste@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Incorporación del enlace «Contactos legales y de seguridad» en el pie de página de vuestra wiki ==
<section begin="Message"/>
'''Contactos legales y de seguridad'''
Hola a toda la comunidad: la Fundación Wikimedia ha puesto a vuestra disposición una [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|página única de contacto sobre cuestiones legales y de seguridad]], que debéis incluir en el pie de página de vuestra wiki para garantizar el acceso a información jurídica precisa. Se trata de un requisito normativo. Ya hemos implementado enlaces a las wikis en inglés, alemán, italiano, español y otros idiomas de Wikipedia, y pronto los implementaremos en vuestra wiki. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Por favor, leed más información en la página del proyecto]] y dejad vuestros comentarios en este hilo o en la [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|página de discusión]].
<section end="Message"/>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31 25 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Sannita (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Brawlio ==
Hola, llevo hace un par de días revirtiendo ediciones de este usuario que, si bien no son vandalismo, parecen claros casos de '''impericia'''. Dejo algunos ejemplos:
* [[scout]]: agrega ''cernir'' como sinónimo, pero (el DLE lo redirige a ''cerner''), viendo cerner la definición parece más bien algo pasivo, mientras que ''scout'' sería algo más activo. Es cierto que el DLE pone una acepción regional extra en ''cernir'' pero queremos agregar regionalismos en las traducciones?
* [[seek]]: lo traduce por ''catear''. Aunque no tiene traducción directa, el término estaría más cerca de ''desear'' o ''anhelar'', por lo que de nuevo no podría ser.
* [[tip]]: lo traduce por ''herrón'', y pone que es sinónimo a secas de [[punta]]
* [[although]]: agrega [[si que]], no sé a qué se refiere.
* [[barely]]: agrega [[no bien]], pero esta última expresión equivale a [[recién]], de ahí que se confunda con [[escasamente]].
* [[mess]]: agrega [[quilombo]] que no está mal, pero otra vez: necesitamos regionalismos en las traducciones?
[[Usuario:Brawlio|Brawlio]], como preveo que nos darás más trabajo de cara al futuro, sugiero que te abstengas de seguir haciendo este tipo de ediciones. Hay una lista gigante con un montón de otras tareas que podés hacer si tanto te interesa el proyecto. Y a los moderadores sugiero que tomen cartas en el asunto. No tenemos ninguna política contra la impericia actualmente, pero si sirve, traigo a colación el caso de [[:en:Wiktionary:Tea_room/2025/June#Ungrammatical sentence examples by @JMGN|JMGN en en.wiktionary]] para que vean un extremo de adónde podría llegar la situación. El usuario cree tener un dominio del idioma mayor del que posee, en consecuencia, agrega y enlaza cualquier palabra con otra solamente porque remotamente vio algo como del estilo: A es sinónimo de B, B es sinónimo de C, por lo tanto A es sinónimo de C. En el proceso, se pierde de cualquier contexto acerca de cómo y cuándo se usa cada término y se genera información falsa causada por alucinaciones (similar a las de IA). De hecho, hay una solución muy fácil al problema que consiste en no deducir nada de las fuentes que veas, así no extrapolarás la información segura hacia terrenos equívocos. Después de esto, sugiero que en las políticas que tenemos en donde condenan el vandalismo, se condene también la impericia y la especulación, que de eso hay muy pocas leyes hasta ahora. [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 03:41 26 jun 2026 (UTC)
:Nota aparte: Por ''impericia'' me refiero exclusivamente a aquella sobre el conocimiento acerca del contenido que se agrega. Quiero decir, aunque no exigimos certificados de nada para contribuir, sí creo que es posible darse cuenta en algunos cuando un usuario pretende saber más de un idioma de lo que conoce. [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 03:53 26 jun 2026 (UTC)
::Hola. No veo que sea necesario elevar este asunto al Café, en primer lugar habría dirigido las observaciones anteriores a [[Usuario discusión:Brawlio]] (hace unos días contactaste con él, pero para un asunto diferente). Dicho esto, @[[User:Braulio|Braulio]], ¿comprendes lo que señala Tmagc? Un saludo, [[Usuario:Peter Bowman|Peter Bowman]] ([[Usuario discusión:Peter Bowman|discusión]]) 15:04 26 jun 2026 (UTC)
:::Perdón, corrijo el ping: @[[User:Brawlio|Brawlio]]. [[Usuario:Peter Bowman|Peter Bowman]] ([[Usuario discusión:Peter Bowman|discusión]]) 18:45 26 jun 2026 (UTC)
::::sí, creo entenderlo。 [[Usuario:Brawlio|Brawlio]] ([[Usuario discusión:Brawlio|discusión]]) 20:16 26 jun 2026 (UTC)
== Eliminar "Excepto Australia" ==
Estimados: Cuando comencé a agregar las transcripciones AFI para Australia pensé que era una buena idea crear "excepto Australia" (190 apariciones) lo que anduvo bien un par de años, pero cuando comencé a agregar las de Nueva Zelanda quedaron obsoletas. Por esa razón, sería aconsejable que un bot reemplazara la PRIMERA aparición de "excepto Australia" por "Received Pronunciation, General American, Canadá". Una vez efectuado lo anterior, me encargaré de corregir la siguiente aparición. Saludos cordiales. [[Usuario:Adelpine|Adelpine]] ([[Usuario discusión:Adelpine|discusión]]) 01:13 26 jun 2026 (UTC)
:Hola, @[[Usuario:Adelpine|Adelpine]]. Hecho: [//es.wiktionary.org/w/index.php?title=Especial%3AContribuciones&target=PBbot&namespace=0&tagfilter=&start=2026-06-27&end=2026-06-27&limit=250 contribuciones del bot], [//es.wiktionary.org/w/index.php?limit=250&search=insource%3A%22excepto+Australia%22&title=Especial:Buscar&profile=default&ns0=1 apariciones restantes]. Un saludo, [[Usuario:Peter Bowman|Peter Bowman]] ([[Usuario discusión:Peter Bowman|discusión]]) 10:01 27 jun 2026 (UTC)
== Clasificadores ==
Hola. Creo que nos hace falta crear la categoría gramatical de "[[w:Clasificador (lingüística)|Clasificador]]", ya que este tipo de palabras se usa en varios idiomas como el japonés, mandarín y las lenguas mayas. [[Usuario:26agcp|26agcp]] ([[Usuario discusión:26agcp|discusión]]) 21:15 26 jun 2026 (UTC)
:@[[Usuario:26agcp|26agcp]] ahí creé la [[Plantilla:clasificador]]. Viste alguna entrada en donde fuera necesario utilizarla? [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 22:23 26 jun 2026 (UTC)
::@[[Usuario:Tmagc|Tmagc]] Por ahora la usé en [[jaats]]. Solo que al crear la Categoría:YUA:Clasificadores el módulo no la reconoce. [[Usuario:26agcp|26agcp]] ([[Usuario discusión:26agcp|discusión]]) 00:24 27 jun 2026 (UTC)
:::@[[Usuario:26agcp|26agcp]] arreglado, gracias por mencionarlo [[Usuario:Tmagc|Tmagc]] ([[Usuario discusión:Tmagc|discusión]]) 00:57 27 jun 2026 (UTC)
== Noticias técnicas: 2026-27 ==
<section begin="technews-2026-W27"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/27|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* Como parte de los [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|experimentos de Creación de Cuentas]], el equipo de Crecimiento probó agregar el icono de cuenta de usuario en el encabezado para usuarios no registrados, el cual es un acceso directo a las acciones de "Crear una cuenta" e "Iniciar sesión". El experimento aumentó la creación de cuentas en un 20 % sin afectar negativamente la calidad de las ediciones o la tasa de ediciones constructivas. La característica se habilitará en todas las wikis de Fundación Wikimedia en la versión móvil durante la primera semana de julio. [https://phabricator.wikimedia.org/T428220]
* Después de un [[phab:T426248|experimento exitoso]], los usuarios registrados que no [[mw:Special:MyLanguage/Help:Email_confirmation|confirmaron su correo electrónico]] al crear la cuenta verán un mensaje que les pedirá finalizar el proceso. Esto ayudará a reducir el riesgo de que los usuarios pierdan el acceso a su cuenta y permitirá que las cuentas de correo electrónico sean más fiables. Esto forma parte del proyecto de [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Seguridad de Cuentas]]. [https://phabricator.wikimedia.org/T428292]
* Una actualización en [[Special:Search|Buscar]] está refinando el comportamiento de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> cuando se utiliza para excluir resultados. Anteriormente, el uso de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> con negación podía ampliar involuntariamente los resultados de búsqueda al añadir los espacios de nombres incluidos en el alcance de la búsqueda, lo que generaba un comportamiento confuso para los usuarios que esperaban un filtro de exclusión directo. Con la actualización, <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> ahora excluirá estrictamente los títulos de página coincidentes según lo previsto y podría mostrar una advertencia si el espacio de nombres correspondiente no se ha seleccionado explícitamente. Sin embargo, el comportamiento de <bdi lang="zxx" dir="ltr"><code><nowiki>prefix:</nowiki></code></bdi> sin negación se mantiene sin cambios. [https://phabricator.wikimedia.org/T427443]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:33}} {{PLURAL:33|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un error por el cual los revisores que utilizaban la barra de herramientas de curación de páginas (Page Curation) no se suscribían automáticamente a las discusiones que iniciaban en las páginas de discusión. Ahora, los revisores recibirán notificaciones cuando alguien responda a esos hilos. [https://phabricator.wikimedia.org/T329346]
'''Actualizaciones para los colaboradores técnicos'''
* A partir del 29 de junio, las descargas automáticas desde el sitio web dumps.wikimedia.org estarán sujetas a la [[Foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|política de agentes de usuario]] (user-agent). Las solicitudes automáticas provenientes de un agente de usuario genérico o vacío serán bloqueadas. El acceso a los volcados mediante Wikimedia Cloud Services se mantendrá sin cambios. Esto forma parte del anuncio realizado en las [[m:Special:MyLanguage/Tech/News/2026/25|Noticias Técnicas 2026/25]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.9|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/27|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W27"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 11:48 29 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30744833 -->
23m40e4q09lil5owgtuzz3jihwjzdaj
portezuelo
0
1065228
6307391
6121575
2026-08-06T01:21:52Z
Tmagc
158167
/* {{sustantivo femenino|es}} */
6307391
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|sufijo|puerto|elo}}.
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1: {{diminutivo|puerto}}.<ref name="dlc">{{DLC1899}}</ref>
==== Traducciones ====
{{trad-arriba}}
<!-- formato: {{t|idioma|t1=(traducción1)|t2=(traducción2|...(hay más opciones))}} p. ej. {{t|fr|t1=chose|a1=1|g1=f}} (ver más ejemplos en Plantilla:t/doc) -->
{{trad-abajo}}
<!-- si va a insertar una nueva sección de etimología o de idioma, por favor, hágalo ↑ arriba ↑ de esta línea. NO BORRE LO QUE ESTÁ DEBAJO, GRACIAS. -->
== Referencias y notas ==
<references />
dvgke9gtqybh2x89p5vxt5ieoetg3er
hedgehog
0
1065843
6307280
6306569
2026-08-05T13:33:45Z
Intolerable situation
130039
/* {{lengua|en}} */
6307280
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=ˈhɛd͡ʒhɒɡ|1pron1=Received Pronunciation
|2fono1=ˈhɛd͡ʒhɔɡ|2pron1=General American
|ls=2}}
=== Etimología ===
{{etimología|leng=en}}.
==== {{sustantivo|en}} ====
{{en.sust|c}}
;1 {{csem|leng=en|mamíferos}}: {{plm|erizo}}.
==== Véase también ====
{{w|leng=en}}
== Referencias y notas ==
<references />
kcvertv9rtdz2ngac26ct2jczhyigc9
adorn
0
1065880
6307278
6294372
2026-08-05T13:32:02Z
Intolerable situation
130039
/* {{lengua|en}} */
6307278
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=əˈdɔːn|1pron1=Received Pronunciation
|2fono1=əˈdɔɹn|2pron1=General American
|ls=2}}
=== Etimología ===
{{etimología|leng=en}}
==== {{verbo transitivo|en}} ====
;1: [[aliñar]]
{{sinónimo|leng=en|decorate}}
==== Conjugación ====
{{en.v}}
== Referencias y notas ==
<references />
sm2icunrqkar16zkoyw8ebbaid73qgj
Australian
0
1065881
6307277
6294894
2026-08-05T13:30:28Z
Intolerable situation
130039
/* {{lengua|en}} */
6307277
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en
|1fono1=ɒˈstɹeɪliən|1pron1=Received Pronunciation
|2fono1=ɔˈstɹeɪljən|2pron1=General American
|ls=4}}
=== Etimología ===
{{etimología|leng=en|sufijo|Australia|an}}
=== {{adjetivo|en}} ===
[[Categoría:EN:Gentilicios]]
{{en.adj|inc}}
;1: {{plm|australiano}} (persona).
{{uso|leng=en|utcs}}.
eirtclt01mse2gwyzn34q1w3okaznoo
beverage
0
1065883
6307281
6294370
2026-08-05T13:34:34Z
Intolerable situation
130039
/* {{lengua|en}} */
6307281
wikitext
text/x-wiki
== {{lengua|en}} ==
{{pron-graf|leng=en|fono=ˈbɛvəɹɪd͡ʒ|ls=3}}
=== Etimología ===
{{etimología|leng=en}}
==== {{sustantivo|en}} ====
{{en.sust|ci}}
;1: [[bebida]] (liquido)
{{sinónimo|drink}}
==== Véase también ====
{{w|leng=en}}
== Referencias y notas ==
<references />
o4rzuvqn0ah50euqzi7366s845nlkl5
estar en Peñaranda
0
1065939
6307292
2026-08-05T14:29:30Z
~2026-34597-22
183061
Página creada con «== {{lengua|es}} == {{pron-graf}} === Etimología === {{etimología2|Juego de palabras entre "[[en]] [[Peñaranda]]" y "[[empeñar]]"}} === {{locución verbal|es}} === ;1: Estar un objeto [[empeñar|empeñado]] (dejado a un prestamista o empeñador a cambio de un préstamo y mientras dure el mismo). === Traducciones === {{trad-arriba}} <!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} --> {{trad-abajo}} == Referencias y notas == <…»
6307292
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología2|Juego de palabras entre "[[en]] [[Peñaranda]]" y "[[empeñar]]"}}
=== {{locución verbal|es}} ===
;1: Estar un objeto [[empeñar|empeñado]] (dejado a un prestamista o empeñador a cambio de un préstamo y mientras dure el mismo).
=== Traducciones ===
{{trad-arriba}}
<!-- formato: {{t+|idioma|<acepción#>|palabra|género}} p. ej. {{t+|fr|1|chose|f}} -->
{{trad-abajo}}
== Referencias y notas ==
<references />
e47hezqwwlmo0bsa1841tnxk90ywch9
peñedo
0
1065940
6307295
2026-08-05T14:54:25Z
~2026-34597-22
183061
Página creada con «== {{lengua|es}} == {{pron-graf}} === Etimología 1 === {{etimología|la|pinnetum}} ==== {{sustantivo femenino|es}} ==== {{es.sust}} ;1: {{plm|peña}} o [[peñasco]].<ref name="dlc">{{DLC1899}}</ref> {{uso|desusado}} ==== Traducciones ==== {{trad-arriba}} {{trad-abajo}} == Referencias y notas == <references />»
6307295
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la|pinnetum}}
==== {{sustantivo femenino|es}} ====
{{es.sust}}
;1: {{plm|peña}} o [[peñasco]].<ref name="dlc">{{DLC1899}}</ref>
{{uso|desusado}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
lt0uwuup8ydrbud4hxz2wa00njuo1ti
6307392
6307295
2026-08-06T01:24:49Z
Tmagc
158167
/* {{sustantivo femenino|es}} */
6307392
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología 1 ===
{{etimología|la|pinnetum}}
==== {{sustantivo masculino|es}} ====
{{es.sust}}
;1: {{plm|peña}} o [[peñasco]].<ref name="dlc">{{DLC1899}}</ref>
{{uso|desusado}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
61epb38sl0r215n7nvpde3dssz0o4vk
picotada
0
1065941
6307298
2026-08-05T15:23:32Z
~2026-34597-22
183061
Página creada con «== {{lengua|es}} == {{pron-graf}} ==== {{sustantivo femenino|es}} ==== {{es.sust}} ;1: {{plm|picotazo}}.<ref name="dlc">{{DLC1899}}</ref> ==== Traducciones ==== {{trad-arriba}} {{trad-abajo}} == Referencias y notas == <references />»
6307298
wikitext
text/x-wiki
== {{lengua|es}} ==
{{pron-graf}}
==== {{sustantivo femenino|es}} ====
{{es.sust}}
;1: {{plm|picotazo}}.<ref name="dlc">{{DLC1899}}</ref>
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
ip0lovgxvvboadi7qe2ov7kgdjuiv7o
peliero
0
1065942
6307309
2026-08-05T22:16:20Z
Tmagc
158167
Página creada con «{{desambiguación|}} == {{lengua|es}} == {{pron-graf}} === Etimología === {{etimología|sufijo|pelear|ero}}. ==== {{adjetivo|es}} ==== {{es.adj}} ;1: {{variante|peleón}} (que constantemente busca iniciar peleas). {{uso|coloquial}} {{sinónimo|buscarroña|pendenciero}} {{antónimo|pacífico}} == Referencias y notas == <references />»
6307309
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|sufijo|pelear|ero}}.
==== {{adjetivo|es}} ====
{{es.adj}}
;1: {{variante|peleón}} (que constantemente busca iniciar peleas).
{{uso|coloquial}}
{{sinónimo|buscarroña|pendenciero}}
{{antónimo|pacífico}}
== Referencias y notas ==
<references />
2cdmidi2n421rx66gdn4xq2pjbqd8d5
Wikcionario:Café/2026 07
4
1065943
6307311
2026-08-05T23:19:51Z
MABot
70592
Bot: archivo de 1 hilo procedente de [[Wikcionario:Café]]
6307311
wikitext
text/x-wiki
{{Archivo}}
== Noticias técnicas: 2026-28 ==
<section begin="technews-2026-W28"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/28|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:34}} {{PLURAL:34|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un problema por el que los resultados en la barra de búsqueda de Wikidata se mostraban en inglés en lugar de usar el idioma correcto para los usuarios con variantes de idiomas. Las sugerencias de búsqueda ahora siguen la cadena de idiomas. [https://phabricator.wikimedia.org/T429769]
'''Actualizaciones para los colaboradores técnicos'''
* En preparación para [[m:Special:MyLanguage/Event:Celebrate Women|la campaña Celebrate Women]] planeada para marzo de 2027, el [[m:Special:MyLanguage/Wikimedia Foundation/Advancement/Community Growth/Content Enablement|equipo de Habilitación de Contenidos]] de la Fundación Wikimedia lanzó una encuesta de 22 preguntas para comprender mejor las contribuciones técnicas realizadas por mujeres+ (cualquier persona que se identifique como mujer) en los proyectos Wikimedia. La encuesta toma entre 15 y 20 minutos en ser contestada y se mantendrá abierta hasta el 20 de julio de 2026. Las [[m:Special:MyLanguage/Celebrate Women/Technical contributions survey|preguntas]] también están disponibles en la wiki para que se revisen anticipadamente.
* La [[mw:Special:MyLanguage/Extension:Score|extensión Score]] ahora soporta el renderizado de partituras musicales en SVG, además de PNG, implementando una [[:phab:T49578|solicitud de mejora]] bastante antigua y resolviendo, además, los problemas de calidad de imagen. Ambos formatos se proveen a los clientes con PNG en el atributo <bdi lang="zxx" dir="ltr"><code><nowiki>src</nowiki></code></bdi> y SVG en el atributo <bdi lang="zxx" dir="ltr"><code><nowiki>srcset</nowiki></code></bdi>.
* El nuevo parser [[wikitech:Parsoid|Parsoid]] [[mw:Special:MyLanguage/Parsoid/Parser_Unification/Updates|continúa su implementación en wikis adicionales]], lo que facilita añadir nuevas funciones de lectura y edición. Fue habilitado en la Wikipedia en francés, dejando el progreso total en un 78,9 % de las visitas a Wikipedia. El lanzamiento de la versión de escritorio en la Wikipedia en inglés se realizará esta semana.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.10|MediaWiki]]
'''A fondo'''
* El [[diffblog:2026/06/29/wikimedia-hackathon-2026-building-collaborating-and-shaping-the-future-together/|post de recapitulación]] de la Wikimedia Hackathon 2026 ya está disponible. En él se resumen los proyectos, las sesiones y las actividades sociales del evento de este año y se comparten los planes iniciales para la Wikimedia Hackathon de 2027.
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/28|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W28"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:57 6 jul 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30773578 -->
9kx9qxbnpgf8dnna2yl9tvl8prtyt3i
활
0
1065944
6307396
2026-08-06T01:40:53Z
Intolerable situation
130039
Página creada con «== {{lengua|ko}} == {{pron-graf|leng=ko}} === Etimología === {{etimología|leng=ko}}. === {{sustantivo|ko}} === ;1 {{csem|leng=ko|Armas}}: {{plm|arco}}. == Referencias y notas == <references />»
6307396
wikitext
text/x-wiki
== {{lengua|ko}} ==
{{pron-graf|leng=ko}}
=== Etimología ===
{{etimología|leng=ko}}.
=== {{sustantivo|ko}} ===
;1 {{csem|leng=ko|Armas}}: {{plm|arco}}.
== Referencias y notas ==
<references />
0ozdgryhks3cvd440nzm2gfvt8t12de
Categoría:KO:Armas
14
1065945
6307397
2026-08-06T01:41:58Z
Intolerable situation
130039
Página creada con «{{auto cat}}»
6307397
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
amén de
0
1065946
6307425
2026-08-06T04:54:21Z
Tmagc
158167
Página creada con «{{desambiguación|}} == {{lengua|es}} == {{pron-graf}} === Etimología === {{etimología|contracción|a menos de}}. ==== {{locución preposicional|es}} ==== ;1: [[añadir|Añadido]] a lo precedente. {{sinónimo|además|así como|aparte de}} {{ejemplo|Esquivé, otro sí, el pleonasmo del no aprobado, por no reincidir en el ridículo paso del célebre academista Bárgas-Ponce; el cual, imprimiendo una memoria que escribió para la concurrencia a los premios académico…»
6307425
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|contracción|a menos de}}.
==== {{locución preposicional|es}} ====
;1: [[añadir|Añadido]] a lo precedente.
{{sinónimo|además|así como|aparte de}}
{{ejemplo|Esquivé, otro sí, el pleonasmo del no aprobado, por no reincidir en el ridículo paso del célebre academista Bárgas-Ponce; el cual, imprimiendo una memoria que escribió para la concurrencia a los premios académicos de 1791, la anunció con la nota de presentada y nó premiada: con que manifestó, ''amén'' de su poquedad, su pueril resentimento.|a=Bartolomé José Gallardo|f=1928|fo=1841|t=Alocución a los electores de diputados por la provincia de Madrid|l=Madrid|editorial=Blass|c=libro}}
{{ejemplo|La habitación alta está dividida en sendos compartimentos, adornados cada uno con su tablado de cama verde, jergón de paja, sábanas choriceras y manta segoviana; su mesilla de pino, con un jarro candil y una estampa del Dos de Mayo o del Juicio final, pegada con miga de pan en el comedio de la pared; ''amén'' de los diversos adornos que alternativamente aparecen y desaparecen.|c=libro|t=Escenas y tipos matritenses|a=Ramón de Mesonero Romanos|f=2020-08-20|editorial=Editorial Verbum|isbn=9788413373065|p=420}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
8xbs2lwckznrxrnja4qn1hrt9n5f1zv
6307426
6307425
2026-08-06T04:55:56Z
Tmagc
158167
6307426
wikitext
text/x-wiki
{{desambiguación|}}
== {{lengua|es}} ==
{{pron-graf}}
=== Etimología ===
{{etimología|contracción|a menos de}}.
==== {{locución preposicional|es}} ====
;1: {{plm|a excepción de}}.
{{uso|obsoleto}}
;2: [[añadir|Añadido]] a lo precedente.
{{sinónimo|además|así como|aparte de}}
{{ejemplo|Esquivé, otro sí, el pleonasmo del no aprobado, por no reincidir en el ridículo paso del célebre academista Bárgas-Ponce; el cual, imprimiendo una memoria que escribió para la concurrencia a los premios académicos de 1791, la anunció con la nota de presentada y nó premiada: con que manifestó, ''amén'' de su poquedad, su pueril resentimento.|a=Bartolomé José Gallardo|f=1928|fo=1841|t=Alocución a los electores de diputados por la provincia de Madrid|l=Madrid|editorial=Blass|c=libro}}
{{ejemplo|La habitación alta está dividida en sendos compartimentos, adornados cada uno con su tablado de cama verde, jergón de paja, sábanas choriceras y manta segoviana; su mesilla de pino, con un jarro candil y una estampa del Dos de Mayo o del Juicio final, pegada con miga de pan en el comedio de la pared; ''amén'' de los diversos adornos que alternativamente aparecen y desaparecen.|c=libro|t=Escenas y tipos matritenses|a=Ramón de Mesonero Romanos|f=2020-08-20|editorial=Editorial Verbum|isbn=9788413373065|p=420}}
==== Traducciones ====
{{trad-arriba}}
{{trad-abajo}}
== Referencias y notas ==
<references />
o81z0sswhuxcpcrpu8xnyepbtsqwppd