Ayuda:ParseFunctions

De Inciclopedia
Ir a la navegación Ir a la búsqueda

Esta es una adaptación (que no traducción) de http://meta.wikimedia.org/wiki/ParserFunctions para Inciclopedia.

Esta cosa es un conjunto de pseudo-plantillas al estilo de las variables para hacer más fácil la vida de los inciclopedistas pero de forma más avanzada. Para usar este tipo de ayudas hay que usar la siguiente sintaxis.

{{#<nombre_función>: <arg_1> | <arg_n> | ... }}

Funciones

Esta extensión añade precisamente 7 tipos de funciones distintas: expr, if, ifeq, ifexist, ifexpr, switch, time y rel2abs.

#expr:

La función expr realiza operaciones matemáticas para aquellos que no quieren sacar una calculadora para sumar y se quieren complicar la vida para escribir un simple número. Se os explicaría en que se basa para hacer los cálculos pero como que no interesa.

Sintaxis

La sintaxis de esta función es:

{{#expr: <operaciones_matemáticas>}} 

Operaciones soportadas

Esta es la lista de operaciones soportadas por esta función y que su autor se a dignado a implementar:

Símbolo Descripción Ejemplo
<Dígito> Un número normal y corriente en arábigos {{#expr: 1234567890}} = 1234567890
{{#expr: 0.000001}} = 1.0E-6
( ) Kit-Kat's de uso totalmente ortodoxo y nada en especial {{#expr: (30 + 7) * 7}} = 259
+ Signo positivo de un número (Signo "+" unitario).
Básicamente sin uso tangible.
{{#expr: +30 * +7}} = 210
- Signo negativo de un número. (signo "-" unitario) {{#expr: -30 * -7}} = 210
NOT Cosas de informáticos, no interesa mucho.
Los más frikis lo llaman Negación.
{{#expr: not 0 * 7}} = 7
{{#expr: not 30+7}} = 7
* Reproducción por esporas.
Permite calcular el número final de hijos que se tiene por un número dado de individuos.
{{#expr: 30 * 7}} = 210
/ Repartición de bienes.
Con esto puede saber canta cantidad del botín robado te corresponde.
{{#expr: 30 / 7}} = 4.2857142857143
DIV División no entera, exactamente igual que /.
El autor no tenía ganas de implementar la división entera.
{{#expr: 30 div 7}} = 4.2857142857143
{{#expr: 5 div 2 * 2 + 5 mod 2}} = 6
MOD Módulo. También llamado Resto de la división entera por la gente normal.
Además está realizado de forma extraña ya que redondea los números antes de dividir, cuando todo el mundo sabe que:
6.7 MOD 3.2 = Type Mismatch...
{{#expr: 30 mod 7}} = 2
{{#expr: -8 mod -3}} = -2
{{#expr: -8 mod +3}} = -2
{{#expr: 8 mod 2.7}} = 0
{{#expr: 8 mod 3.2}} = 2
{{#expr: 8.9 mod 3}} = 2
+ Adicción a las drogas. {{expr: 30 + 7}} = 37
- Sustracción. Realiza además una llamada a la policía local automáticamente para denunciar lo sustraido. {{#expr: 30 - 7}} = 23
ROUND Aquí el autor se lució demasiado.
Redondea el número que está a su izquierda a una potencia de 10^n
(n = número que esta a la derecha de ROUND)
{{#expr: 30 / 7 round 3}} = 4.286
{{#expr: 30 / 7 round 0}} = 4
{{#expr: 3456 round -2}} = 3500
= Igual, lógico... {{#expr: 30 = 7}} = 0
<> Desigual, distinto.... Para los fans de PASCAL o BASIC. {{#expr: 30 <> 7}} = 1
!= Desigual, distinto... Para los fans de C y JAVA {{#expr: 1 != 0}} = 1
< Menorqué {{#expr: 30 < 7}} = 0
> Mayorqué {{#expr: 30 > 7}} = 1
<= Menorqué o igual, lógico... {{#expr: 30 <= 7}} = 0
>= Mayorqué o igual, lógico... {{#expr: 30 >= 7}} = 1
AND ilógico Y en inglés {{#expr: 4<5 and 4 mod 2}} = 0
OR O en inglés {{#expr: 4<5 or 4 mod 2}} = 1

Notas

Los operadores booleanos usan "0" como valor que es falso, y cualquier otro valor numérico como que es cierto. Sin embargo el resultado de as operaciones en valor que indica que es cierto se muestra así: "1".

El payo que lo hizo es anglosajón así que como os supondréis el punto (".") se usa para separar los decimales. Si os queréis sentir totalmente bien con vosotros mismo y defender el uso de la coma (",") podéis juguetear con la función formatnum:, no esperamos menos de ti.

La notación científica con la "E" equivaliendo a "* 10n" no se puede usarda y tienes dos opciones:

  • Escribir el número entero: 1234567890000000000
  • Escribir el número entero de todas formas porque no soporta la potencia.

Sin embargo, chulo de él, en los resultados la "E" sí que es usada para chinchar.

Al menos el autor se ha currado la precedencia de las operaciones, no como los desarrolladores de PASCAL. Así que el orden de realización de las operaciones es la normal de toda la vida, que se resumiría así:

  1. Los Kit-Kat: "( )"
  2. Los urinarios unitarios: "+", "-" y "NOT"
  3. Los multiplicativos: "*", "/", "DIV" y "MOD"
  4. Los aditivos: "+" y "-"
  5. ROUND
  6. Las odiosas comparaciones: "=", "!=", "<", ">", etc.
  7. AND
  8. OR

Cuando se encuentran operaciones que están dentro del mismo grupo se realizan de izquierda a derecha. Pero el autor dice que no hay que fiarse mucho y que poner paréntesis rebundantes tampoco biene mal.

#if:

La función if es la construcción lógica que simula un "Si ... entonces ... Ahh, ¿no?, pues entonces ...", basándose en cadenas de caracteres. Se usa sobre todo en plantillas para controlar los parámetros.

Sintaxis

La forma general de uso es

{{#if: <condición> | <texto_entonces> | <si_no_este_texto>}}

<condición> es una cadena de caracteres (o sea texto). Si ese texto no está vacio, entonces se escribe el <texto_entonces>. Sin embargo si <condición> está vacio o sólo tiene espacios en blanco se escribe <si_no_este_texto>.

<si_no_este_texto> puede ser omitido.

Uso

Básicamente esta función no tiene uso fuera de la plantillas, para así poder usar un parámetro como condición.

Como ejemplo de como usarlo y los resultados que dá:

Supongamos la plantilla "Plantilla" con este contenido:

{{#if: {{{parámetro|}}} | Está definido. | No está definido o está vacío}}

Entonces dependiendo de como se haga la llamada a plantilla devuelve un texto o otro:

             {{Plantilla|parámetro=blabla}}  {{Plantilla}}  {{Plantilla|parámetro=}}
                                 |                  |                |
                                 |                   ----------------
                                 |                          |
 {{#if: {{{parámetro|}}} | Está definido. | No está definido o está vacío}}

Notas

Atención al "|" en la comprobación del parámetro.

Aclarar que esta estructura if no es la habitual ni comprueba expresiones matemáticas. Se limita a comprobar sólo si la cadena de la condición está vacía. {{#if: 1 = 2|Correcto|Falso}} devuelve "Correcto" porque la cadena "1 = 2" no está vacia.

#ifeq:

La función ifeq compara dos números o cadenas de caracteres y devuelve otra cadena de caracteres dependiendo del resultado de la comparación.

Sintaxis

{{#ifeq: <texto_1> | <texto_2> | <Son_iguales> | <Son_distintos>}}

Si <texto_1> y <texto_2> pueden ser interpretados como números se realiza una comparación numérica. Así que si lo que quieres es forzar que la comparación sea entre los textos puedes hacer una chapuza añadiendo algún carácter a ambos texto para que que no lo interprete como un número.

{{#ifeq: +07 | 007 | ''igual'' | ''distinto'' }} devuelve igual
{{#ifeq:"+07"|"007"| ''igual'' | ''distinto'' }} devuelve distinto

Notas

La comparación entre cadenas, como suele ser habitual, diferencia entre mayúsculas, minúsculas, acentos y demás variaciones de letras que parece que los anglosajones nunca llegarán a entender (A ver si aprenden de Google):

{{#ifeq: A | a | ''igual'' | ''distinto'' }} devuelve distinto

#if: básicamente se trata de un atajo a un comparación con la cadena vacía:

{{#ifeq: <parámetro> | | <Son_iguales> | <Son_distintos>}} es equivalente a
{{#if: <parámetro> | <Son_iguales> | <Son_distintos>}}.

#ifexist:

ifexist devuelve una cadena de texto dependiendo de si una página existe.

Sintaxis

{{#ifexist:<título_página>|<texto_si_existe>|<text_si_no existe>}}

<título_página> es algo especial ya que se aplican las reglas de la diferenciación de las mayúsculas general de la Wiki. Es decir hace diferenciación entre ellas y las minúsculas menos cuando es el inicio del título. Ejemplos:

{{#ifexist: Tio1.jpg |Existe|No existe}} da como resultado "Existe", porque Tio1.jpg existe.
{{#ifexist: tio1.jpg |Existe|No existe}} da como resultado "Existe", porque para la wiki tio1.jpg y Tio1.jpg son lo mismo como enlace.
{{#ifexist: TIO1.JPG |Existe|No existe}} da como resultado "No existe", porque no existe la página TIO1.JPG.

Notas

No funciona correctamente si se indican prefijos como si se tratar de una wiki externa.

{{#ifexist: :es:Tio1.jpg|Existe|No Existe}} da como resultado "No Existe" a pesar de que es:Tio1.jpg existe pero es culpa del prefijo.

Aunque esto no debe ser ningun problema ya que los enlaces no tendrían razón para ser puestos de esa manera.

#ifexpr:

ifexpr evalúa una expresión matemática y devuelve una cadena de caracteres dependiendo del resultado. Es decir lo más parecido a un if de toda la vida.

Sintaxis

{{#ifexpr: <expresión> | <texto_si_verdadero> | <texto_si_falso>}}

Si <expresión> es igual a cero "0", entonces devuelve <texto_si_falso>, para cualquier otro valor devuelve <texto_si_verdadero>.

La operaciones permitidas en <expresión> son las misma que para expr.

Notas

Por el momento cuando <expresión> es una cadena vacía devuelve <texto_si_falso>.

{{#ifexpr: |Verdadero|Falso}} da como resultado "Falso"

Si se omite <texto_si_verdadero> y <texto_si_falso> no muestra texto alguno excepto si se trata de un mensaje de error.

{{#ifexpr: 1/0}} devuelve "División por cero."
{{#ifexpr: 1=2}} no devuelve nada ya que la expresión aunque sea falsa no se trata de una expresión erronea... ""
{{#ifexpr: 1E2}} devuelve ""

En principio no tiene mucho interes pero sobre todo si se quieren encadenar varios expr: el hecho de que las expr: devuelvan el valor con notación científica puede causar problemas y para ello esta forma de usar el ifexpr puede ser útil, un ejemplo de aplicación es una plantilla que evite que se calcule el resultado si este no va a poder ser utilizado en las siguientes expr: anidadas (Plantilla de ejemplo).

#switch:

Switch, también llamado por algunos "Case" compara una cadena de caracteres con otras y devuelve el otra cadena en caso de que encuentre alguna coincidencia.

Sintaxis

{{#switch: <cadena_a_comparar>
 | <valor_1> = <resultado_1>
 | <valor_2> = <resultado_2>
 | ...
 | <valor_n> = <resultado_n>
 | <resultado_por_defecto>
 }}

Switch comparará <cadena_a_comparar> con todos los <valor_n> hasta que encuentre una coincidencia, entoces escribe el <resultado_n> correspondiente.

En caso de que le hayas querido engañar y <cadena_a_comparar> no coincide con ninguna <valor_n> entonces escribirá <resultado_por_defecto>, si está definido... (Lee las notas en caso de que <resultado_por_defecto> necesite tener un signo "=")

Para los más vagos, es posible asignar a varias comparaciones el mismo resultado y aí no tener que repetir el mismo <resultado_n> en varias líneas. Se hace de la siguiente forma:

{{#switch: <cadena_a_comparar>
 | <valor_1>
 | <valor_2>
 | <valor_3> = <resultado_1_2_3>
 | ...
 | <valor_n> = <resultado_n>
 | <resultado_por_defecto>
 }}

Por tanto, teniendo esta estructura, si <cadena_a_comparar> coincide con <valor_1> o <valor_2> devolverá <resultado_1_2_3>.

Notas

Al igual que #ifeq:, también se pueden hacer comparaciones numéricas:

{{#switch: +07 | 7 = Sí | 007 = James Bond | No }} obtienes ""
{{#switch:"+07"|"7"= Sí |"007"= [[James Bond]] | No}} devuelve "No"

Tanto <cadena_a_comparar> como <resultado_n> pueden ser cadenas vacías por tanto las siguientes construcciones son equivalentes:

{{#if: | no vacía | cadena vacía}} devuelve "cadena vacía"
{{#switch: |=cadena vacía| no vacía}} devuelve "cadena vacía"

Por supuesto las comparaciones diferencian entre mayúsculas, minúsculas y demás variaciones en las letras.

Importante
Si el resultado por defecto (<resultado_por_defecto>) tiene un signo igual ("="), debe usarse la siguiente estructura:
{{#switch: <cadena_a_comparar>
 | <valor_1> = <resultado_1>
 | ...
 | <valor_n> = <resultado_n>
 | #default = <resultado_por_defecto>
 }}

#time:

Este texto está en inglés porque el que lo trajo no tenía ni tiempo ni ganas de traducirlo.

Así que ya sabes que hacer

{{#time}} is a time and date formatting function. The syntax is:

{{#time:format}}
{{#time:format | time}}

If the time is not specified, the time at which the article is converted to HTML is used. Note that due to caching, this may be up to a week different to the time at which the article is viewed. Manual updates may be required, this can be achieved by saving the page without making any changes (a "null edit") or viewed with action=purge in search string of URL or viewed by a user whose option is "Disable page caching".

The format parameter is a format string similar to the one used by PHP's date.

The following format codes have the same meaning as in PHP. Significant differences from PHP's behaviour, apart from internationalisation (i.e. language and locale differences), should be considered an error of ParserFunctions and should be reported. All numeric format codes return numbers formatted according to the local language, use the xn code described below to override this.

Code Description Example output Current output
Year:
Y The 4-digit year. e.g. 2006 2023
y The 2-digit year. 00 to 99, e.g. 06 for year 2006. 23
Month:
n The month number, not zero-padded. 1 to 12 10
m The month number, zero-padded. 01 to 12 10
M An abbreviation of the month name. Often internationalised. Jan to Dec oct
F The full month name. Often internationalised. January octubre
Week:
W ISO 8601 week number (ISO years have full weeks from monday to sunday, and ISO week number 1 always contains January 4 or the first thursday of the civil year), zero-padded. 01 to 52 or 53 (depends on year) 43
Day:
j The day of the month, not zero-padded. 1 to 31 25
d The day of the month, zero-padded. 01 to 31 25
z The day of the year (starting from 0) 0 to 364, or 365 on a leap year 297
D An abbreviation for the day of the week. Rarely internationalised. Mon to Sun mié
l The full weekday name. Rarely internationalised. Monday to Sunday miércoles
N ISO 8601 day of the week (according to the ISO 8601 week). 1 (for Monday) through 7 (for Sunday) 3
w number of the day of the week (according to the American week). 0 (for Sunday) through 6 (for Saturday) 3
Hour:
a am (between 01:00:00 and 12:59:59 on the same day) or pm, with lowercase (used with the 12-hour format). am or pm am
A Same as with code a above, but with uppercase. AM or PM AM
g 12-hour format of the hour without leading zeros (one or two digits, used with am/pm or AM/PM). 1 to 12 3
h 12-hour format of the hour, with leading padding zero (two digits, used with am/pm or AM/PM). 01 to 12 03
G 24-hour format of the hour, without leading padding zero (one or two digits). 0 to 23 3
H 24-hour format of the hour, with leading padding zero (two digits). 00 to 23 03
Minutes and seconds:
i The minute, with leading padding zero (two digits). 00 to 59 05
s The second, with leading padding zero (two digits). 00 to 59 12
U Seconds since January 1 1970 00:00:00 GMT. 0 to infinite 1698203112
Miscellaneous:
L Whether it's a leap year. 1 if it is a leap year, 0 otherwise. 0
t Number of days in the month. 28 to 31 31
c ISO 8601 formatted date, same as 2023-10-25UTC03:05:12+03:05|+0 032023u43UTC25, 25 +00002023-10-25T03:05:12+00:0031 2023 03:05:12 +000012. fixed length string 2023-10-25T03:05:12+00:00
r RFC 2822 formatted date, same as mié, 25 oct 2023 03:05:12 +03:05|+0 032023u43UTC25, 25 +00002023-10-25T03:05:12+00:0031 2023 03:05:12 +000012. variable length string Wed, 25 Oct 2023 03:05:12 +0000

The following format codes are extensions to the PHP syntax:

Code Description
xn Format the next numeric code as a raw ASCII number. For example, in the Hindi language, Plantilla:Ft produces ०६, 06.
xN Toggle a permanent raw number formatting flag. Like xn, except it lasts until the end of the string or until the same code appears again.
xr Format the next numeric code as a roman numeral. Only works for numbers up to 3000.
xg Output the genitive form of the month name, for languages which make such a distinction between genitive and nominative.
xx A literal "x"

Any unrecognised character will be passed through to the output unmodified. There are also two quoting conventions which can be used to output literal characters.

  • Characters enclosed in double quotes will be considered literal (with the quotes themselves removed). Unmatched quotes will be considered literal quotes. Example:
    • {{#time:"The month is" F}} → The month is octubre
    • {{#time:i's"}} → 05'12"
  • Backslash escaping as in PHP's date() is supported. \H produces a literal H, \" produces a literal ".

More format codes may be added in the future, as demanded by the users of this extension. This may come in the form of either a more complete implementation of PHP's format codes, or additional "x" codes.

The format of the time parameter is identical to the one used by PHP's strtotime(). It supports both absolute and relative dates, such as "December 11" and/or "+10 hours", which can be used for timezone translation. Please see the GNU tar manual for more information.

Examples

  • {{#time:l j F Y | 20070304}} gives domingo 4 marzo 2007
  • {{#time:l j F Y | 2007-3-4}} gives domingo 4 marzo 2007
  • {{#time:l j F Y | 4 March 2007}} gives domingo 4 marzo 2007
  • [[{{#time:j F Y|4 March 2007}}]] gives 4 marzo 2007
  • {{#time:l j F Y | -14 days}} gives miércoles 11 octubre 2023 (14 days ago)
  • {{#time:H:i | +6 hours}} gives 09:05 (6 hours later than UTC)
  • {{#time:H:i | 8:15 +6 hours}} gives 14:15
  • {{#time:m/Y | -1 months}} gives 09/2023 (1 month ago)

In combination with the date formatting feature:

  • {{#time:l| -14 days}} [[{{#time:j F| -14 days}}]] [[{{#time:Y | -14 days}}]] gives miércoles 11 octubre 2023

Range

The range of proper functioning is 01 January 1970 00:00:01 through 19 January 2038 03:14:07, or 1 through seconds after the start of 1970 (the Year 2038 problem). For arbitrary dates that may exceed this range, use date computing templates such as Plantilla:Tim instead.

February 29

Caution should be taken with February 29, as {{#time:j|February 29}} will vary with the year. For example

  • {{#time:j|February 29 2006}} gives 1
  • {{#time:j|February 29 2008}} gives 29

#rel2abs:

Este texto está en inglés porque el que lo trajo no tenía ni tiempo ni ganas de traducirlo.

Así que ya sabes que hacer

{{#rel2abs}} converts a relative path to an absolute path.

{{#rel2abs:path}}
{{#rel2abs:path | base path}}

A relative path is a path starting with '/', './', '../'. or is containing '/../' or '/.' or is simply the strings '..' or '.'. if a base path is given, is should be defined in an absolute syntax.

Example:

  • If standing in Help:Foo/bar and is calling {{#rel2abs: ../baz | Help:Foo/bar }}, the result will be Help:Foo/baz
  • If standing in Help:Foo and is calling {{#rel2abs: ../baz | Help:Foo }}, the result will be baz
  • If standing in Help:Foo and is calling {{#rel2abs: ../../baz | Help:Foo }}, the result will be Error: profundidad no válida en la ruta «Help:Foo/../../baz» (trataste de acceder a un nodo por encima de la raíz).
  • If calling {{#rel2abs: ../baz | Help:Bar/foo }}, the result will be Help:Bar/baz
  • If calling {{#rel2abs: Help:Foo/bar/../baz }}, the result will be Help:Foo/baz

There is no checks if the path do exist, for that you might use Plantilla:Ft in combination:

{{ #ifexist: {{#rel2abs: .. }} | '..' exist | '..' does not exist }} gives '..' does not exist
{{ #ifexist: {{#rel2abs: . }} | '.' exist | '.' does not exist }} gives '.' exist

Problemillas

Esta es la lista de problemillas conocidos y que el autor de esta extensión se desentiende con la barata excusa de que no son precisamente su problema...

Sustituciones

Aplicar un subst: a una función de esta extensión tiene que funcionar... siempre que no haya espacios entre el subst: y el "#". Debe hacerse {{subst:#ifexpr ...}}.

La verdad es que esto no tiene un uso común y es una técnica algo complicada de la que sacar provecho. En esta página explican un uso de esta combinación.

Al igual que otras funciones de este tipo les afecta el bug 5678 pero como básicamente el subst: no se usa, pues tampoco se necesita explicar de forma exaustiva el fallo que se produce.

El problema viene dado por los parámetros indefinidos, asi que para evitarse problemas se definen y punto.

Tablas

Insertar una tabla con formato wiki como resultado de una función no es posible sin tener que hacer una chapuzilla.

Para los menos despiertos: una tabla con formato wiki es la que está hecha así:

{|
||
...
|}

Bueno pues para solucionarlo se pueden hacer principalmente dos chapuzas:

  • Hacer la tabla con HTML a pelo. Es decir, con <table>, <tr>, <th>, <td>, etc
  • Usar la Plantilla:! donde correspondería el símbolo "|", escribiendo {{!}}.

De las dos, la más recomendable sería la la segunda ya que hay bots que se dedican a transformar el código HTML en formato wiki y cambiarían el estilo de la tabla.

Le verdad es que nada de lo anterior es nuevo ya que siempre ha habido problemas al usar el "|" y "=" dentro de una llamada a una plantillas.

Expresiones

DIV
Al contrario que alguna gente puede pensar no se trata de la división entera y es un símbolo rebundante. Usa "/" en vez de este para las divisiones reales.
MOD
Usa el operador de PHP "%" que es diferente de lo que nos tiene acostumbrados PASCAL, C y similares. También es recomenda echar un vistazo al bug 6068.
Por otra parte esta función puede que de resultados distintos para un mismo par de valores (bug 6356) si estos son mayores de 1E+12.
Anidación de #expr:
La anidación de varios expr:, o el uso de de esa función dentro de la evaluación de otra función es muy posible que falle debido a que no se aceptan números científicos en las expresiones y sin embargo sí que se devuelven nímeros en ese formato.
Por ejemplo: {{#expr:{{#expr:0.0000001}}}} devuelve "1.0E-7"
Para solucionarlo se puede importar esta plantilla.
ROUND 0, FIGHT!
Bajo ciertas condiciones devuelve "-0", para solucionarlo se puede usar la expresion "0 + (x)".

Espacios

Debido que se eliminan todos los caracteres de separación (espacios, tabuladores) alrededor de la barra vertical "|", obligar que se escriba algún tipo de espaciado antes o después de un texto puede no ser sencillo. De forma general se pueden usar los siguientes consejos:

  • Si sólo se quiere insertar espacios se puede usar la entidad de HTML:
    • &#32; que inserta un espacio normal
    • &nbsp; que inserta un espacio inseparable;
  • Si lo que quieres es insertar una nueva línea, puedes añadir algún tag que no muestre nada entre "|" y el salto de línea, como pueden ser <!-- --> o <nowiki />

Por ejemplo:

Primer párrafo. {{#if:{{{parrafo}}}|<nowiki /> 

Segundo párrafo.}}

Da como resultado:

Primer párrafo.

Segundo párrafo.

Instalación

No hay que instalar nada, ya viene con Inciclopedia de serie.

Pero si insistes y lo quieres tener instalado en tu ordenador....

  1. Instalate el MySQL
  2. Instalate el Apache,
  3. Instalate el Mediawiki
    Nota: Tendrás algun que otro problemilla al instalarlo pero no hay nada que una Googleada no pueda hacer
  4. Leete esto para saber que hacer.

Bien... y ahora pregunto... ¿Para que quieres una wiki instalada en tu ordenador y a la que nadie más puede acceder?

Links