{{Man modulo}}
Questo [[Aiuto:Moduli|modulo]] costituisce il codice di funzionamento del [[Template:Fr-conj]] e crea, in base ai parametri inseriti in quest'ultimo, la tabella di coniugazione dei verbi francesi. Si compone di una funzione principale, '''p.frconj''' (richiamata direttamente nel template) e di tre funzioni accessorie ('''p.over''', '''p.wiki''', e '''p.alts''') che sono utilizzate solo all'interno della funzione principale per abbreviarne il codice (ad es., la funzione p.wiki rende il suo argomento un [[Aiuto:Wikilink|wikilink]]). Le sezioni seguenti illustrano il loro funzionamento, iniziando da quella principale.

Questo modulo è stato creato nel giugno 2014 a partire dal [[modulo:It-conj]], a sua volta derivato dal [[:en:Module:it-conj|corrispondente modulo]] di en.wikt, la cui [https://en.wiktionary.org/w/index.php?title=Module:it-conj&action=history cronologia] riporta i relativi autori (NB: successive modifiche apportate tanto su en. quanto su it. hanno reso i due moduli molto diversi fra loro, per cui i relativi template potrebbero comportarsi in modo molto differente).

==Funzione p.frconj==
È la funzione principale del modulo; interpreta i parametri inseriti nel template (radice, desinenza all'infinito, ausiliare, eventuali forme irregolari) e in base ad essi costruisce la [[:w:Aiuto:Tabelle|tabella]] che ne costituisce l'output. La funzione internamente è suddivisibile in sottosezioni identificate nel modulo dai <code>-- commenti</code>; tali sottosezioni vengono di seguito brevemente descritte separatamente.

La prima sottosezione definisce le variabili passate al modulo dal template:
* <code>stem</code> : la radice del verbo (ad. es. ''parl'' per "parler"); corrisponde al primo parametro del [[Template:Fr-conj]]
* <code>type</code> : la desinenza (all'infinito) del verbo (''er'', ''ir'', ''er-se'' etc.); corrisponde al secondo parametro del [[Template:Fr-conj]]
* <code>aus</code> : l'ausiliare (''être'' o ''avoir''); corrisponde al terzo parametro del [[Template:Fr-conj]]
Successivamente vengono definite le variabili interne al template, che saranno poi codificate successivamente: ad es. <code>inf</code> per la voce verbale all'infinito, <code>pres1s</code> per la prima persona singolare del presente indicativo, <code>prem1s</code> per la prima persona singolare del passato remoto e così via; se si aggiunge una nuova variabile è bene aggiungerla anche a tale lista, altrimenti potrebbe risultare nulla.

Segue poi la costruzione delle voci verbali standard: in base alla desinenza (<code>type</code>) il modulo genera le stringhe per le varie forme flesse unendo radice (<code>stem</code>) e relativa uscita: ad es. se la desinenza è "er" (<code>if type = "are"</code>), <code>pres1s = stem.. "e"</code> (''parle''); <code>prem1s = stem.. "ai"</code> (''parlai'') e così via. Stesso discorso per i verbi riflessivi (<code>tipe = "er-se"</code> e simili). 

Nella sottosezione identificata da <code>-- Recupera le eventuali forme irregolari o varianti..</code>, le stringhe per le voci verbali così create vengono riunite in stringhe uniche: la funzione p.over sostituisce la forma flessa generata automaticamente con quella eventualmente inserita manualmente nel template, se presente; la funzione p.alts aggiunge alla forma flessa generata automaticamente quella eventualmente inserita manualmente, se presente. Ad es. per il presente indicativo:
* <code>pres1s = p.over(pres1s,args["pres1s"])</code> -> se nel template è inserito il parametro "pres1s=", viene sovrascritto a quello generato automaticamente
* <code>pres1s = p.alts(pres1s, pres1s2)</code> -> se nel template è inserito il parametro "pres1s2=", viene aggiunto accanto a quello generato automaticamente

Nella sottosezione <code>-- Tempi composti</code> vengono generate le forme per i tempi composti (passato prossimo etc.) e i relativi titoli dei cassetti. Prima si genera automaticamente, tramite la funzione p.plurale (vedi sotto), il plurale del participio passato <code>pplur</code> (necessario se l'ausiliare è essere). Successivamente, in base all'ausiliare inserito, si generano le stringhe per le varie voci verbali unendo ausiliare (coniugato) e participio passato: ad es. per il passato prossimo:
* se l'ausiliare è avoir (<code>if aus = "avoir"</code>), <code>paspros1s = "<nowiki>[[ai]]</nowiki> ".. pp</code> (''ai parlé'') e così via
* se l'ausiliare è être (<code>if aus = "être"</code>), <code>paspros1s = "<nowiki>[[suis]]</nowiki> ".. pp</code> e così via
* se il participio passato non esiste (<code>if pp = ""</code>) le forme composte si annullano <code>paspros1s = ""</code>
* se l'ausiliare è diverso da "être" o "avoir" (<code>else</code>), escono le doppie forme composte <code>paspros1s = "<nowiki>[[ai]]</nowiki> ".. pp, "<nowiki>[[suis]]</nowiki> ".. pp</code> e così via.
Subito dopo si generano i titoli dei cassetti, con la corrispondente descrizione (se <code>if pp = ""</code>, la descrizione è per tutti "manca dei tempi composti").

Infine, nella sottosezione <code>-- Costruisce la tabella di coniugazione</code> il modulo costruisce la tabella (<code>conj</code>) e vi inserisce le forme flesse precedentemente generate. Il modulo restituisce tale tabella con output (<code>return conj</code>).

==Funzione p.over==
La funzione p.over (<code>p.over(x,over,xtra)</code>) serve per sovrascrivere l'eventuale voce verbale irregolare (identificata dal suo secondo argomento, <code>over</code>), se definita, a quella generata automaticamente (identificata dal primo argomento <code>x</code>). Ad esempio, all'interno della funzione principale il codice 
*<code>pp = p.over(pp,args["pp"])</code>
cerca l'eventuale parametro "pp=" (participio passato) nel template; se questo è definito lo rimpiazza alla forma predefinita, se non lo è restituisce invece quest'ultima.

Il terzo parametro <code>xtra</code> va settato su <code>0</code> solo nel caso dei verbi riflessivi, e inserisce la corrispondete particella pronominale ("me", "te" etc.), in tutti gli altri casi può essere ignorato. 

==Funzione p.wiki==
La funzione p.wiki (<code>p.wiki(x)</code>) rende il suo argomento, <code>x</code>, un wikilink, con "[[:w:Aiuto:Piped_link#Piped_wikilink|pipe]]" alla sezione francese. In pratica, nel modulo, scrivere <code>p.wiki(qualcosa)</code> equivale al wikicodice <nowiki>[[qualcosa#Francese|qualcosa]]</nowiki>.

Inoltre, la funzione controlla, tramite la funzione standard di Scribunto [[:mw:Extension:Scribunto/Lua_reference_manual#mw.title.new|mw.title.new(x).exists]] (si veda anche [[:en:Wiktionary:Scribunto/Converting_templates#Ifexist|qui]]) se la pagina a cui punta tale link esiste o meno (funziona in modo molto simile alla [[:w:Aiuto:Funzioni parser|funzione parser]] ''ifexist'' del codice mediawiki). Se la pagina non esiste, aggiunge al wikilink la [[:Categoria:Verbi francesi con forme da scrivere]], e/o la [[:Categoria:Verbi francesi da scrivere]] se ad essere rosso è il link verso la forma all'infinito.

==Funzione p.alts==
La funzione p.alts (<code>p.alts(x, y)</code>) aggiunge l'eventuale variante alternativa (identificata dal suo secondo argomento, <code>y</code>), se definita, accanto a quella generata automaticamente (identificata dal primo argomento <code>x</code>), separandola con una virgola. Ad esempio, all'interno della funzione principale, il codice
*<code>pp = p.alts(pp, pp2)</code> 
cerca l'eventuale parametro "pp2=" (variante del participio passato) nel template; se questo è definito lo aggiunge al seguito di quella base, se non lo è restituisce invece solo quest'ultima.

<noinclude>[[Categoria:Manuali dei moduli|fr-conj]]</noinclude>
<includeonly>[[Categoria:Moduli|fr-conj]]</includeonly>