peterbe / premailer

Turns CSS blocks into style attributes
https://premailer.io
BSD 3-Clause "New" or "Revised" License
1.06k stars 188 forks source link

Improved preserve_handlebar_syntax regex #270

Open IwanBurg opened 2 years ago

IwanBurg commented 2 years ago

Problem: preserve_handlebar_syntax=True doesn't preserve handlebars with characters before or after the handlebars.

Examples of html that don't preserve handlebars: a href="mailto:{{ Test }}" a href="{{ Test }}?subject=x"

Current regex code:

stripped = re.sub(
                    r'="{{(.*?)}}"',
                    lambda match: '="{{' + escape(match.groups()[0]) + '}}"',
                    stripped,
                )
out = re.sub(
                    r'="%7B%7B(.+?)%7D%7D"',
                    lambda match: '="{{' + unescape(unquote(match.groups()[0])) + '}}"',
                    out,
                )

Proposed regex code:

stripped = re.sub(
                    r'="([^"]*){{(.*?)}}([^"]*?)"',
                    lambda match: '="' +
                                  match.groups()[0] +
                                  '{{' + escape(match.groups()[1]) + '}}' +
                                  match.groups()[2] + '"',
                    stripped,
                )

https://regex101.com/r/tLC41B/2

out = re.sub(
                    r'="([^"]*)%7B%7B(.+?)%7D%7D([^"]*?)"',
                    lambda match: '="' +
                                  match.groups()[0] +
                                  '{{' + unescape(unquote(match.groups()[1])) + '}}' +
                                  match.groups()[2] + '"',
                    out,
                )

https://regex101.com/r/ADvQjO/1

Issue also here: https://github.com/peterbe/premailer/issues/271

I also added a testcase to test_premailer.py for: a href="mailto:{{ data | default: "Test & code" }}?subject=x"

I'm new to this, so I hope this is how it works.