# Mappers ```{tip} Understanding the concept of mappers is not required for basic uses of `dj-angles`. It is only needed to support additional HTML tags or for custom implementations. ``` ## Basic flow `dj-angles` is built on the basic flow of: 1. parse template HTML with regex 2. look up a mapper for any matches found 3. call mapper appropriately `dj-angles` includes a dictionary of built-in mappers. However, custom mappers can be added to handle other use cases. ## Custom mappers All of the mappers are stored in a dictionary. The key of the mapper dictionary is a string and is the text match of the regex after the `initial_tag_regex`, i.e. for the default `initial_tag_regex` of `r"(dj-)"`, the key would be the result after "dj-" until a space or a ">". For example, if `""` was in the HTML, `"include"` would be looked up in the mapper dictionary to determine what to do with that tag. The value of the mapper dictionary can either be a string or a callable. ### string value When the dictionary value is a string, it replaces the `initial_tag_regex` plus the key, and puts it between "{%", arguments, and then "%}". ```python # settings.py ANGLES = { "mappers": { "component": "include", }, } ``` ```text ``` Would compile to the following Django template. ```text {% include 'partial.html' %} ``` ### Callable value When the dictionary value is a callable, the string result is dictated by the output of the mapper function. The callable has one argument, `Tag`, which encapsulates information about the matched tag that can be useful in building custom functionality, e.g. `tag_name`, `is_end`, `is_self_closing`, etc. ```python # settings.py from dj_angles import Tag def map_text(tag: Tag) -> str: return "This is some text." def map_hello(tag: Tag) -> str: return f"

{tag.tag_name.upper()}! {tag.template_tag_args}

" ANGLES = { "mappers": { "text": map_text, "hello": map_hello, }, } ``` ```text ``` Would compile to the following Django template. ```html This is some text.

HELLO! Goodbye!

```