Search code examples
jinja2text-alignment

Jinja2 go-to-column


I am using Jinja2 to perform code generation.

Besides the trivial problem to generate correctly indented code I also would like to perform certain in-line alignments; example use-cases would be:

  1. start inline comments at a certain column
  2. align operators in assignment series

A small excerpt of (1) would be:

Sound_Chime_t chime_array[] = {
{%- for k, cmd in commands.items() %}
    {
        "{{ cmd['Sound Command'] }}", // command
        "{{ cmd['tag'] }}",           // tag
        {{ cmd['Priority'] }},        // priority
        {{ cmd['Mix'] }},             // mix
        {{ cmd['Loop'] }},            // loop
        {{ cmd['region'] }},          // region
        "{{ cmd['Sound File']}}"      // filename
    }{{ ',' if not loop.last else '' }}
{%- endfor %}
};

Of course //... is nicely aligned in template, but it won't be in generated code.

Is there some (not too convoluted) way to obtain this?


Solution

  • You can align the comments using two .format() calls. The second one is required by the occasional quotation marks and commas after a value. This will pad the values to 20:

    Sound_Chime_t chime_array[] = {
    {%- for k, cmd in commands.items() %}
        {
            {{ '{:<20} // command'.format('"{}",'.format(cmd['Sound Command'])) }}
            {{ '{:<20} // tag'.format('"{},"'.format(cmd['tag'])) }}
            {{ '{:<20} // priority'.format('{},'.format(cmd['Priority'])) }}
            {{ '{:<20} // mix'.format('{},'.format(cmd['Mix'])) }}
            {{ '{:<20} // loop'.format('{},'.format(cmd['Loop'])) }}
            {{ '{:<20} // region'.format('{},'.format(cmd['region'])) }}
            {{ '{:<20} // filename'.format('"{}"'.format(cmd['Sound File'])) }}
        }{{ ',' if not loop.last else '' }}
    {%- endfor %}
    };