Jump to content

Global templates (alternative concept)

From Meta, a Wikimedia project coordination wiki

Notice: This is just an alternative concept of what global templates could look like. Currently, a similar function is offered by Wikifunctions, and the concept of global templates is an alias for Wikifunctions.

Definition

[edit]

Global templates are special, which can be run on any Wikipedia. Global templates achieve the simplicity of calling templates, but at the same time the performance of programming languages.

Calls

[edit]

Global templates always start with an underscore. A global call has a lower priority than a local one – it can be overridden.

Parameters

[edit]

Parameters can be defined in 2 ways:

  • by default as call template in the present,
  • in the format of global templates.

Parameters are always sent as text from the forend.

Global templates (format)

[edit]

Calling is similar to the C like programming language. Ie: key=value.

The basic types are:

  • variable (a=2024),
  • array (a=[2023,2024]),
  • object (a={before=2023, now=2024}).

Example

[edit]

Call example

[edit]

In the wiki syntax:

{{_sucet_2_parameters|5|3}}

Call definition

[edit]

In the special section of the all global call definitions:

name=addition_2_parameters
parameter_1=string
parameter_2=string

Implementations

[edit]

Implementation (C)

[edit]

The parameters in the front end are not before-processed in any way, so the implementation has to process them by itself.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

char *addition_2_parameters(
	char *number1, uint16_t length1,
	char *number2, uint16_t length2
)
{
	long long int n1, n2, suma;
	char buffer[100];
	char *output;
	
	if(sscanf(number1, "%lld", &n1) != 1)
		return NULL;
	if(sscanf(number2, "%lld", &n2) != 1)
		return NULL;
		
	suma=n1+n2;
	
	snprintf(buffer, 100, "%lld", suma);
	
	output=strdup(buffer);
	
	return output;
}

#ifdef TEST
int main()
{
	char *result;
	
	// {{_addition_2_parameters|5|3}}
	result=addition_2_parameters(
		"5", 1,
		"3", 1
	);
	
	puts(result);
	
	free(result);
	
	return 0;
}
#endif

Implementation (C + glib)

[edit]

The parameters in the front end are not before-processed in any way, so the implementation has to process them by itself.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <glib-2.0/glib.h>

GString *sucet_2_parameters(
	char *number1, uint16_t length1,
	char *number2, uint16_t length2
)
{
	long long int n1, n2, suma;
	GString *output;
	
	if(sscanf(number1, "%lld", &n1) != 1)
		return NULL;
	if(sscanf(number2, "%lld", &n2) != 1)
		return NULL;
	
	output=g_string_new(NULL);
	g_string_append_printf(output, "%lld", (long long int) (n1+n2));
	
	return output;
}

#ifdef TEST
int main()
{
	GString *result;
	
	// {{_sucet_2_parameters|5|3}}
	result=sucet_2_parameters(
		"5", 1,
		"3", 1
	);
	
	puts(result->str);
	
	g_string_free(result, TRUE);
	
	return 0;
}
#endif

Implementation (PHP)

[edit]

The parameters in the front end are not before-processed in any way, so the implementation has to process them by itself.

<?php

function sucet_2_parameters(array $fargs) : string|bool
{
	if(!isset($fargs[0])) return false;
	if(!ctype_digit($fargs[0])) return false;
    
	if(!isset($fargs[1])) return false;
	if(!ctype_digit($fargs[1])) return false;
	
	return $fargs[0]+$fargs[1];
}

	
// {{_sucet_2_parameters|5|3}}
$result=sucet_2_parameters(array("5", "3"));

echo $result."\n";