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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/29|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/30|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/31|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/32|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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 "").."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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)..")'''&emsp;".." ("..(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)..")'''&emsp;".." ("..(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)..")'''''&emsp;".." ("..(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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;("..(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"].."'''''&emsp;&emsp;("..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"].."'''''&emsp;&emsp;("..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.."'''''&emsp;&emsp; ("..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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;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.."'''''&emsp;&emsp;("..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, " &rarr; " .. 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.."'''''&emsp;&emsp;dialecto: "..dialectos[args.dial].."&emsp;&emsp;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.."'''''&emsp;&emsp;dialecto: "..dialectos[args.dial].."&emsp;&emsp;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.."'''&emsp;&emsp;("..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.."'''''&emsp;&emsp;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, "&ensp;&bull;&ensp;") 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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/23|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/24|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/25|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/26|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/27|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Colabore]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/28|traduzca]]&nbsp;• [[m:Tech|obtenga ayuda]]&nbsp;• [[m:Talk:Tech/News|denos su opinión]]&nbsp;• [[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