@@ -12,6 +12,7 @@ import (
1212 "github.com/jmoiron/sqlx"
1313 "github.com/jmoiron/sqlx/types"
1414 "github.com/lib/pq"
15+ "github.com/preslavrachev/gomjml/mjml"
1516 null "gopkg.in/volatiletech/null.v6"
1617)
1718
@@ -29,6 +30,7 @@ const (
2930 CampaignContentTypeMarkdown = "markdown"
3031 CampaignContentTypePlain = "plain"
3132 CampaignContentTypeVisual = "visual"
33+ CampaignContentTypeMJML = "mjml"
3234)
3335
3436// Campaigns represents a slice of Campaigns.
@@ -156,28 +158,48 @@ func (c *Campaign) CompileTemplate(f template.FuncMap) error {
156158
157159 // Compile the base template.
158160 body := c .TemplateBody
161+ hasBaseTpl := body != ""
159162
160- if body == "" || c .ContentType == CampaignContentTypeVisual {
163+ if ! hasBaseTpl || c .ContentType == CampaignContentTypeVisual {
161164 body = `{{ template "content" . }}`
162165 }
163166
164167 for _ , r := range regTplFuncs {
165168 body = r .regExp .ReplaceAllString (body , r .replace )
166169 }
167170
171+ // Parse the base template also as MJML if the campaign content type is MJML.
172+ // Skip when there's no base template body (only the placeholder), since the
173+ // placeholder isn't valid MJML and the campaign body itself is rendered below.
174+ if c .ContentType == CampaignContentTypeMJML && hasBaseTpl {
175+ htmlBody , err := mjml .Render (body )
176+ if err != nil {
177+ return fmt .Errorf ("error compiling MJML: %v" , err )
178+ }
179+ body = htmlBody
180+ }
181+
168182 baseTPL , err := template .New (BaseTpl ).Funcs (f ).Parse (body )
169183 if err != nil {
170184 return fmt .Errorf ("error compiling base template: %v" , err )
171185 }
172186
173- // If the format is markdown, convert Markdown to HTML.
174- if c .ContentType == CampaignContentTypeMarkdown {
187+ // If the campaign format is markdown, convert Markdown to HTML.
188+ switch c .ContentType {
189+ case CampaignContentTypeMarkdown :
175190 var b bytes.Buffer
176191 if err := markdown .Convert ([]byte (c .Body ), & b ); err != nil {
177192 return err
178193 }
179194 body = b .String ()
180- } else {
195+
196+ case CampaignContentTypeMJML :
197+ htmlBody , err := mjml .Render (c .Body )
198+ if err != nil {
199+ return fmt .Errorf ("error compiling MJML: %v" , err )
200+ }
201+ body = htmlBody
202+ default :
181203 body = c .Body
182204 }
183205
@@ -264,6 +286,13 @@ func (c *Campaign) ConvertContent(from, to string) (string, error) {
264286 return out , err
265287 }
266288 out = b .String ()
289+ } else if from == CampaignContentTypeMJML &&
290+ (to == CampaignContentTypeHTML || to == CampaignContentTypeRichtext ) {
291+ htmlBody , err := mjml .Render (c .Body )
292+ if err != nil {
293+ return out , fmt .Errorf ("error converting MJML: %v" , err )
294+ }
295+ out = htmlBody
267296 } else {
268297 return out , errors .New ("unknown formats to convert" )
269298 }
0 commit comments