From 174eeadecf72c4edfb5dc54aced97068b67b2e1d Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Wed, 20 Jan 2016 17:59:35 -0800 Subject: [PATCH] Added support for image attachments by converting Markdown image tags into CIDs and adding the corresponding attachments. At the moment all image tags are parsed as attachments -- external resources, such as http://, are not respected. Default newsletter now depends on markdown-it-anchor and markdown-it-deflist -- this should probably not be the default. --- app.js | 3 +- newsletters/default/config.json | 3 +- newsletters/default/index.js | 26 +++++++++++- newsletters/default/package.json | 2 + newsletters/default/templates/html.dot | 56 ++++++++++++++++++++++++-- newsletters/default/templates/md.dot | 2 +- 6 files changed, 85 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index 01cb0ea..aa27b94 100644 --- a/app.js +++ b/app.js @@ -152,7 +152,8 @@ Newsletter.prototype.send = function() { from: this.options.from, subject: this.temp.subject, text: (this.temp.text ? this.temp.text : ''), - html: (this.temp.html ? this.temp.html : '') + html: (this.temp.html ? this.temp.html : ''), + attachments: (this.temp.attachments ? this.temp.attachments : []) }); }; /* Method: archive(letter, file) diff --git a/newsletters/default/config.json b/newsletters/default/config.json index 13d862f..045352e 100644 --- a/newsletters/default/config.json +++ b/newsletters/default/config.json @@ -1,7 +1,8 @@ { "options": { "from": "Polymail ", - "heading": "Polymail" + "heading": "[Polymail]", + "name": "Polymail" }, "subscribers": [ "user@domain" diff --git a/newsletters/default/index.js b/newsletters/default/index.js index 7731c54..c80f455 100644 --- a/newsletters/default/index.js +++ b/newsletters/default/index.js @@ -11,12 +11,30 @@ var md = require('markdown-it')({ typographer: true }); md.use(require('markdown-it-header-sections')); +md.use(require('markdown-it-deflist')); + +var defaultRender = md.renderer.rules.image; +md.renderer.rules.image = function(tokens, idx, options, env, self) { + var token = tokens[idx], + aIndex = token.attrIndex('src'); + + newsletter.temp.attachments.push({ + filename: token.attrs[aIndex][1], + path: '', + cid: token.attrs[aIndex][1] + }); + token.attrs[aIndex][1] = 'cid:'+token.attrs[aIndex][1]; + + return defaultRender(tokens, idx, options, env, self); +}; /* ==== NEWSLETTER ========================================================== */ // our custom build step newsletter.build = function(file, options, cb) { // clear potential old newsletter - newsletter.temp = {}; + newsletter.temp = { + attachments: [] + }; // merge passed options with newsletter defaults var opts = polymail.mergeObjects(newsletter.options, options); // read our provided content file @@ -28,6 +46,12 @@ newsletter.build = function(file, options, cb) { var md_result = md_template(opts); // convert our content md into html opts.content = md.render(opts.content.toString()); + // at this point attachments should be populated with all pertinent attachments - let's modify it to make all paths relative to this file's directory + var path = file; + file = file.replace(/\.[^/.]+$/, ""); + for (var i = 0; i < newsletter.temp.attachments.length; i++) { + newsletter.temp.attachments[i].path = file+'/'+newsletter.temp.attachments[i].filename; + } // read our html template and build it var html_source = fs.readFileSync(__dirname+'/templates/html.dot'); var html_template = doT.template(html_source); diff --git a/newsletters/default/package.json b/newsletters/default/package.json index 72c8c13..4ae46c1 100644 --- a/newsletters/default/package.json +++ b/newsletters/default/package.json @@ -2,6 +2,8 @@ "dependencies": { "dot": "^1.0.3", "markdown-it": "^5.0.2", + "markdown-it-anchor": "^2.3.3", + "markdown-it-deflist": "^2.0.0", "markdown-it-header-sections": "^0.2.2" } } diff --git a/newsletters/default/templates/html.dot b/newsletters/default/templates/html.dot index 9a60415..b972941 100644 --- a/newsletters/default/templates/html.dot +++ b/newsletters/default/templates/html.dot @@ -2,14 +2,64 @@ {{=it.heading || ''}} {{=it.title || ''}} -

{{=it.heading || ''}} {{=it.title || ''}}

- {{=it.timestamp}} +

{{=it.name || '' }} {{=it.letter || ''}} {{=it.date || ''}}

{{=it.content || ''}} diff --git a/newsletters/default/templates/md.dot b/newsletters/default/templates/md.dot index 82b73e3..cbb8e14 100644 --- a/newsletters/default/templates/md.dot +++ b/newsletters/default/templates/md.dot @@ -1,3 +1,3 @@ -# {{=it.heading || ''}} {{=it.title || ''}} {{=it.timestamp || ''}} +# {{=it.name || ''}} {{=it.letter || ''}} -- {{=it.date || ''}} {{=it.content || ''}}