Estou trabalhando em um sistema em que confiamos muitos "administradores / gerentes" enviando e-mails a usuários do banco de dados. Um dos principais recursos é poder enviar e-mail para várias pessoas ao mesmo tempo, com informações específicas relevantes para cada uma delas. Outro recurso importante é poder criar e-mails manualmente, porque é necessário modificá-los levemente a cada vez, mas ter um modelo básico economiza muito tempo.
Para isso, temos a solução típica de "modelos", onde temos um modelo mais ou menos assim:
Hello {{recipient.full_name}},
Your application to {{activity.title}} has been accepted.
You have requested to participate on dates {{application.dates}}, in role {{application.role}}
Blah blah blah
O problema que estamos enfrentando é obviamente que (como esperávamos), os gerentes não entendem toda a idéia das "variáveis" e fazem coisas como substituí-las, o que não lhes permite enviar e-mails para mais de uma pessoa por vez, assumindo eles não serão substituídos e que o sistema está quebrado ou até coisas inexplicáveis como "Olá {{John}}".
O grande problema é que isso não é relegado, como sempre, a uma seção "admin", na qual apenas alguns usuários avançados têm acesso à edição dos modelos que são enviados automaticamente, e espera-se que eles saibam o que estão fazendo. Todo usuário do sistema fica exposto a esse problema.
A solução óbvia seria substituir as variáveis antes de mostrar este modelo para o usuário editar, mas isso não funciona ao enviar e-mail para várias pessoas.
Parece um problema razoavelmente comum, e esperamos que alguém já o tenha resolvido.
Você já viu em algum lugar / criou / consegue pensar em boas soluções para esse problema?
Atualizar
O que acabei fazendo com base na resposta de Daniel B foi detectar, com base na posição do cursor e na posição de {{}} no código, se o usuário está atualmente "dentro de uma variável" ou "fora". Por dentro, mostro um pequeno pedaço de texto abaixo da grande área de texto, explicando que isso será substituído e que eles podem removê-lo completamente, se quiserem, mas não podem editá-lo.
Eu faço isso onClick, onChange, onKeyDown, onKeyUp. Para os eventos "key", se estivermos dentro de uma variável, retornarei TRUE apenas se o keyCode for uma das poucas chaves "de navegação". Caso contrário, retornarei FALSE, o que efetivamente impede a edição dessa variável.
Não é perfeito, mas era muito barato e parece eficaz.