nedbat / cog

Small bits of Python computation for static files
MIT License
340 stars 26 forks source link

Make [[[end]]] optional to allow inline templating #12

Open tw39124-1 opened 4 years ago

tw39124-1 commented 4 years ago

Firstly, thanks for Cog, it is such a great way to generate files against a template using Python.

However, the major downside of the current implementation (for me at least) is that it is line-based. There doesn't appear to be a way to do inline templating. For example, let's say I want to generate a Doxygen C source file header:

[[[cog import cog ]]] [[[end]]]
/**
 * @file [[[cog cog.out(filename) ]]] [[[end]]]
 * @copyright Copyright (c) [[[ cog.out(current_year + " " + company_name) ]]] [[[end]]]
 * @author [[[cog cog.out(file_author) ]]] [[[end]]]
 */

However, the Cog source code mandates that the [[[end]]] tag is present, and is on a different line to the Python code block, which prevents this rather useful ability. If the -d option is used to delete the source code and the [[[end]]] tag was optional, I could just do:

/**
 * @file [[[cog cog.out(filename) ]]]
 * @copyright Copyright (c) [[[ cog.out(current_year + " " + company_name) ]]]
 * @author [[[cog cog.out(file_author) ]]]
 */

which would get transformed rather neatly into:

/**
 * @file my_first_file.h
 * @copyright Copyright (c) 2020 AcmeCorp
 * @author Joe Bloggs
 */

This is kinda similar to how PHP works inline with HTML, and would be a really useful feature IMO.

kiteloopdesign commented 3 years ago

Yes, I guess its not that nice, but you can still do like so (dont think it compiles but you get the idea ...)

/**
[[[cog import cog 
 filename = FILENAME
company_name = COMPANY_NAME 
]]]
 * print (f'@file{FILENAME})
 * print (f'@file{COMPANY_NAME})* 
 */ [[[end]]]