ThodarKuri (Generic Recursive Template Engine)
A Generic Recursive Template Engine which generates a JSON/Dictionary which can be edited from the code and then the same values can be filled in the tesmplates to write them as new variants of the template.
Check out the example code in repo ( https://github.com/Palani-SN/ThodarKuri ) for reference
Template commands to be used (only 3 statements)
Command 1 : adds the key Title to the current dict with value None
Command 2 : adds the key Plot to the current dict with value as dict of file template_plot.html
R[Plot] => template_plot.html
Command 3 : adds the key Bar to the current dict with value as list of dict of file template_bar.html
( R[Bar] => template_bar.html )*
Generate a Skeleton of type Dictionary/JSON from a specified entrypoint
Sample usage of the file is as given below (Refer html_plot - SR1 for template examples in EXAMPLES folder)
from ThodarKuri .Parser import ParserTemplateEngine
import json
Parser = ParserTemplateEngine ();
Settings = Parser .ParseEntryPoint ("html_plot - SR1/template_index.html" );
print (json .dumps (Settings , sort_keys = True , indent = 4 ));
Note : Template files to be placed in the same folder path for use
{
"Plot": {
"Bar": [
{
"description": null,
"name": null,
"size": null
}
],
"Plot_Description": null,
"Plot_Orientation": null
},
"Title": null
}
ParserTemplateEngine (class from Parser.py)
Initialising class helps to configure the RegexEdges and it also validates the pattern based on the second parameter FuncCallTemplate
Arguments
Arg1 - RegexEdges (a tuple with start and end delimiters)
Arg2 - FuncCallTemplate is the sample string with "self.FUNC_CALL()" keyword to validate the RegexEdges
Sample regex configurations in ParserTemplateEngine Initialisation is shown below
## Default RegexEdges=("{{", "}}"),
## FuncCallTemplate="{{self.FUNC_CALL()}}"
TE1 = ParserTemplateEngine ();
## RegexEdges=("_StArT_", "_eNd_"),
## FuncCallTemplate="_StArT_self.FUNC_CALL()_eNd_"
TE2 = ParserTemplateEngine (("_StArT_" , "_eNd_" ), "_StArT_self.FUNC_CALL()_eNd_" );
## RegexEdges=("<<", ">>"),
## FuncCallTemplate="<<self.FUNC_CALL()>>"
TE3 = ParserTemplateEngine (("<<" , ">>" ), "<<self.FUNC_CALL()>>" );
## RegexEdges=("\\[\\[", "\\]\\]"),
## FuncCallTemplate="[[self.FUNC_CALL()]]"
TE4 = ParserTemplateEngine (("\\ [\\ [" , "\\ ]\\ ]" ), "[[self.FUNC_CALL()]]" );
## RegexEdges=("{\\[<{\\[", "}\\]>}\\]"),
## FuncCallTemplate="{[<{[self.FUNC_CALL()}]>}]"
TE5 = ParserTemplateEngine (("{\\ [<{\\ [" , "}\\ ]>}\\ ]" ), "{[<{[self.FUNC_CALL()}]>}]" );
Parses the template Name/Path and file Name/Path.
Returns the differences between them as a dict.
## Definition
def ParseEntryPoint (self , TemplateName , DebugTokens = False ):
Arguments
Arg 1 - TemplateName (Name of the EntryPoint template to be edited)
Arg 2 - DebugTokens (If True prints the return Dict, If false doesnt print)
Returns
Dict - the result as a dictionary (keys and default values like a schema: Return_values)
To be used to fill a template from code using JSON skeleton/Dictionary that is parsed using parser class and EntryPoint template
Sample usage of the file is as given below (Refer html_plot - SR1 for template examples in EXAMPLES folder)
from ThodarKuri .Filler import FillerTemplateEngine
import json
SettingsAsJson = """
{
"Plot": {
"Bar": [
{
"description": "African Caribbean in Barbados",
"name": "1000GENOMES:phase_3:ACB",
"size": 96
},
{
"description": "African Ancestry in Southwest US",
"name": "1000GENOMES:phase_3:ASW",
"size": 61
},
{
"description": "Bengali in Bangladesh",
"name": "1000GENOMES:phase_3:BEB",
"size": 86
},
{
"description": "Chinese Dai in Xishuangbanna, China",
"name": "1000GENOMES:phase_3:CDX",
"size": 93
},
{
"description": "Utah residents with Northern and Western European ancestry",
"name": "1000GENOMES:phase_3:CEU",
"size": 99
},
{
"description": "Colombian in Medellin, Colombia",
"name": "1000GENOMES:phase_3:CLM",
"size": 94
},
{
"description": "Esan in Nigeria",
"name": "1000GENOMES:phase_3:ESN",
"size": 99
},
{
"description": "Finnish in Finland",
"name": "1000GENOMES:phase_3:FIN",
"size": 99
},
{
"description": "British in England and Scotland",
"name": "1000GENOMES:phase_3:GBR",
"size": 91
},
{
"description": "Kinh in Ho Chi Minh City, Vietnam",
"name": "1000GENOMES:phase_3:KHV",
"size": 99
},
{
"description": "Luhya in Webuye, Kenya",
"name": "1000GENOMES:phase_3:LWK",
"size": 99
},
{
"description": "Mende in Sierra Leone",
"name": "1000GENOMES:phase_3:MSL",
"size": 85
},
{
"description": "Mexican Ancestry in Los Angeles, California",
"name": "1000GENOMES:phase_3:MXL",
"size": 64
},
{
"description": "Peruvian in Lima, Peru",
"name": "1000GENOMES:phase_3:PEL",
"size": 85
},
{
"description": "Punjabi in Lahore, Pakistan",
"name": "1000GENOMES:phase_3:PJL",
"size": 96
}
],
"Plot_Description": "Horizontal Bar Chart",
"Plot_Orientation": "horizontal"
},
"Title": "Template Engine Demo"
}
"""
settings = json .loads (SettingsAsJson )
Filler = FillerTemplateEngine ();
FilledString = Filler .FillEntryPoint (Settings , "html_plot - SR1/template_index.html" , "html_plot - SR1/index.html" );
The Output of the above code looks as follows
FillerTemplateEngine (class from Filler.py)
Initialising class helps to configure the RegexEdges and it also validates the pattern based on the second parameter FuncCallTemplate
Arguments
Arg1 - RegexEdges (a tuple with start and end delimiters)
Arg2 - FuncCallTemplate is the sample string with "self.FUNC_CALL()" keyword to validate the RegexEdges
Sample regex configurations in FillerTemplateEngine Initialisation is shown below.
## Default RegexEdges=("{{", "}}"),
## FuncCallTemplate="{{self.FUNC_CALL()}}"
TE1 = FillerTemplateEngine ();
## RegexEdges=("_StArT_", "_eNd_"),
## FuncCallTemplate="_StArT_self.FUNC_CALL()_eNd_"
TE2 = FillerTemplateEngine (("_StArT_" , "_eNd_" ), "_StArT_self.FUNC_CALL()_eNd_" );
## RegexEdges=("<<", ">>"),
## FuncCallTemplate="<<self.FUNC_CALL()>>"
TE3 = FillerTemplateEngine (("<<" , ">>" ), "<<self.FUNC_CALL()>>" );
## RegexEdges=("\\[\\[", "\\]\\]"),
## FuncCallTemplate="[[self.FUNC_CALL()]]"
TE4 = FillerTemplateEngine (("\\ [\\ [" , "\\ ]\\ ]" ), "[[self.FUNC_CALL()]]" );
## RegexEdges=("{\\[<{\\[", "}\\]>}\\]"),
## FuncCallTemplate="{[<{[self.FUNC_CALL()}]>}]"
TE5 = FillerTemplateEngine (("{\\ [<{\\ [" , "}\\ ]>}\\ ]" ), "{[<{[self.FUNC_CALL()}]>}]" );
Gets the Template Name/Path of the template function calls that is going to be used.
Will initialize the MapDict for updating the function calls in the template.
## Definition
def FillEntryPoint (self , MapDict , TemplateName , FileName = None , DebugTokens = False ):
Arguments
Arg1 - MapDict (a dict that contains the key of the template to be filled with the value)
Arg2 - TemplateName (Entry Point Template name which needs to be edited)
Arg3 - FileName (New file name which needs to be created with the filled content)
Arg4 - DebugTokens (If True prints the return str, If false doesnt print)
Returns
Str - string created by dictionary values recursively filled in the template string