• Stars
    star
    162
  • Rank 225,006 (Top 5 %)
  • Language
    JavaScript
  • License
    Other
  • Created over 11 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Node.js module for rendering emails with swig templates and email-friendly inline CSS using boost.

swig-email-templates

This package is unmaintained; please volunteer if you want it to not rely on outdated dependencies.

swig-email-templates is a Node.js module for rendering emails with Swig templates and email-friendly inline CSS using juice, inspired by niftylettuce/node-email-templates.

Features

  • Uses swig, which supports Django-inspired template inheritance.
  • Uses juice, which takes an HTML file and inlines all the <link rel="stylesheet">s and the <style>s.
  • URL rewrite support - you can provide a function to rewrite your links.
  • Text emails - for a template name passed into render(), if a file exists with the same name but a .txt extension it will be rendered separately. If the .txt file does not exist, html-to-text will auto-generate a text version of the html file. This can be disabled with the option text: false.

Upgrading from 1.x

Check out the changelog for details of what changed since 1.x. The upgrade should be pretty straightforward.

Quick start

Install:

npm install swig-email-templates

A quick working example:

var EmailTemplates = require('swig-email-templates');
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport();

var templates = new EmailTemplates();
var context = {
  meatballCount: 9001
};

const { html, text, subject } = await templates.render('meatball-sandwich.html', context) 
transporter.sendMail({
    from: 'sender@address',
    to: 'receiver@address',
    subject: subject,
    html: html,
    text: text
});

EmailTemplates API

Constructor(options)

Creates a a new EmailTemplates instance.

var EmailTemplates = require('swig-email-templates');
var templates = new EmailTemplates();

To set options, pass an object to the constructor. It can have the following keys:

root (string)

Path to template files. Defaults to path.join(__dirname, 'templates')

swig (object)

Swig options. Gets passed to swig.setDefaults(). See swig documentation for more information.

filters (object)

An object of Swig filters to set. Format: { name1: method1, name2: method2 }. For more information see Swig documentation for setFilter().

juice (object)

Juice options. See juice documentation for more information.

rewrite (function(cheerio instance))

After rendering the template and running the rewriteUrl function (see below), but before inlining resources, this function will be called if provided. It will be passed a cheerio instance and can alter its content. Cheerio instances are modified in-place so it does not need to return a value.

rewriteUrl (function (string) => string)

Each a href attribute in the output HTML will have its value replaced by the result of calling this function with the original href value.

text (boolean)

Whether to generate text alternative to HTML. Defaults to true.

Example

new EmailTemplates({
  root: '/var/www/test.site/templates',
  text: false,       // Disable text alternatives
  swig: {
    cache: false     // Don't cache swig templates
  },
  filters: {
    upper: function(str) {
      return str.toUpperCase();
    }
  },
  juice: {
    webResources: {
      images: 8      // Inline images under 8kB
    }
  },
  rewriteUrl: function (url) {
    return url + 'appendage';
  },
  rewrite: function($) {
    $("img").each(function(idx, anchor) {
      $(anchor).attr('src', 'no-img.png');
    });
  }
})

render(templateName, context, callback?)

Render a template with templateName, with the context provided.

If no callback is given, returns a promise which resolves to an object that looks like { html, text, subject }.

If a callback function is given, use legacy callback style. The callback has the signature function(err, html, text, subject).

Example (promise):

const EmailTemplates = require('swig-email-templates');
const templates = new EmailTemplates();
const { html, text, subject } = await templates.render('template.html', { user: 55 })
// html is inlined html
// text is text equivalent
// subject is parsed subject template or null if not found

Example (callback):

const EmailTemplates = require('swig-email-templates');
const templates = new EmailTemplates();
templates.render('template.html', { user: 55 }, function (err, html, text, subject) {
  // html is inlined html
  // text is text equivalent
  // subject is parsed subject template or null if not found
})

Behaviour of text templates

If the 'text' option is true (see above), then swig-email-templates will attempt to create a text equivalent as well as your HTML. By default, this will be by rendering the HTML output as text using html-to-text.

You can provide your own text template to override this behaviour. This should have the same basename as your HTML template but end in '.txt' instead of '.html'. For example, if your HTML template is 'template.html' then the text version should be 'template.txt'. This will receive the same context as the HTML template.

If the 'text' option is false, then no text alternative will be generated and the callback passed to the EmailTemplate.render() function will receive a falsy value instead of text as its third argument.

Behaviour of subject templates

swig-email-templates will attempt to create a text equivalent as well as your HTML. This template should have the same basename as your HTML template but end in .subject.txt. This will receive the same context as the HTML template.

Using subject templates, you can generate subject that contains variables.

Command Line

Installing swig-email-templates through npm will put the swig-email-templates command in your system path, allowing it to be run from any directory.

Usage

swig-email-templates [files] [options]

Where [files] can be any number of input files to process.

The options are:

  • -v, --version: Display the installed version of swig-email-templates
  • -h, --help: Show the help screen
  • -o, --output: The directory to output your files to. Defaults to stdout
  • -r, --root: The root location for the files. The default is ..
  • -j, --json: The file that contains your context, stored in JSON.
  • -c, --context: The file that contains your context, stored as a CommonJS module. Used only if -j is not provided.

Example

The following example renders two files, email1.html and email2.html, which are both contained in the cwd. It uses the context stored in context/main.json for rendering, and places the results in the folder output.

swig-email-templates email1.html email2.html -o output/ -j context/main.json

Tests

npm test

More Repositories

1

groovebasin

Music player server with a web-based user interface.
JavaScript
1,851
star
2

libsoundio

C library for cross-platform real-time audio input and output
C
1,847
star
3

node-s3-client

high level amazon s3 client for node.js
JavaScript
1,004
star
4

naught

Zero downtime deployment for your Node.js server using builtin cluster API
JavaScript
788
star
5

poop

Performance Optimizer Observation Platform
Zig
712
star
6

jamulator

(unmaintained) recompiling NES roms into native executables
Go
388
star
7

tetris

A simple tetris clone written in zig programming language.
Zig
345
star
8

libgroove

streaming audio processing library
C
286
star
9

node-diacritics

remove diacritics from strings ("ascii folding") - Node.js module
JavaScript
259
star
10

waveform

simultaneously transcode and generate visuals for an audio file
C
251
star
11

HellOS

"hello world" x86 kernel example
Zig
235
star
12

clashos

multiplayer arcade game for bare metal Raspberry Pi 3 B+
Zig
206
star
13

genesis

Genesis Digital Audio Workstation
C++
176
star
14

chem

2d canvas-based rapid prototyping game engine
JavaScript
176
star
15

node-groove

bindings to libgroove - music player backend library
C++
155
star
16

node-mv

Like `fs.rename`, but works across devices, and works with directories. Think of the unix utility `mv`.
JavaScript
155
star
17

ffmpeg

ffmpeg with the build system replaced by zig
C
113
star
18

zig-window

window client library
C++
106
star
19

node-waveform

simultaneously transcode audio and generate visuals - Node.js module
C
99
star
20

node-s3-cli

command line utility to go along with node s3 module
JavaScript
97
star
21

malcheck

Test your code with malcheck to make sure it handles out of memory conditions correctly.
C
95
star
22

mpd.js

Connect to a music player daemon server, send commands, emit events.
JavaScript
89
star
23

zig-wasi

Minimal WASI interpreter
C
87
star
24

zasm

multi-target assembler and disassembler
Zig
87
star
25

PyDaw

python library to mess with Digital Audio Workstations. FL Studio project files (.flp) supported.
C++
87
star
26

sdl-zig-demo

SDL2 hello world in zig
Zig
86
star
27

zig-vulkan-triangle

simple triangle displayed using vulkan, glfw, and zig
Zig
81
star
28

node-flp

FL Studio project file parser for node.js
JavaScript
72
star
29

node-tmx-parser

node.js module to parse and load tiled map editor maps (see mapeditor.org)
JavaScript
71
star
30

node-astar

Generic A* algorithm for node.js
JavaScript
67
star
31

node-sox

(unmaintained) node.js interface to the sox audio utility
JavaScript
61
star
32

mcserve

wraps minecraft server and gives you a web interface
JavaScript
54
star
33

zig-async-demo

Comparing concurrent code example programs between other languages and Zig
Zig
53
star
34

zig-general-purpose-allocator

work-in-progress general purpose allocator intended to be eventually merged into Zig standard library. live streamed development
Zig
45
star
35

StaticHttpFileServer

Zig module for serving a directory of files from memory via HTTP
Zig
44
star
36

autodoc

Zig Documentation Generator
Zig
44
star
37

node-perlin-noise

perlin noise generator for node.js
JavaScript
33
star
38

liblaxjson

C library for parsing JSON config files
C
32
star
39

lua-in-the-browser

using zig to build lua for webassembly
C
32
star
40

node-fd-slicer

safely create multiple ReadStream or WriteStream objects from the same file descriptor
JavaScript
30
star
41

flag2struct

simple CLI tool for converting zig source code using flags-style declarations to packed structs
Zig
28
star
42

connect-sse

connect middleware for server sent events (EventSource)
JavaScript
27
star
43

rucksack

texture packer and resource bundler
C
27
star
44

mime

zig package for mapping extensions to mime types
Zig
26
star
45

PyWaveform

Python library to create an image of a song's waveform
C
26
star
46

zig-stage1

Exploring replacing Zig's stage1 compiler with pure C code that outputs pure C code
C
25
star
47

libavfilter-example

small example of using libavfilter to filter audio
C
22
star
48

xml

Tokenize XML
Zig
22
star
49

node-plan

(unmaintained, deprecated, abandoned) Execute a complicated dependency graph of tasks with smooth progress events.
JavaScript
20
star
50

connect-static

static file server middleware for connect. loads files once at startup and saves gzipped versions in memory
JavaScript
19
star
51

dotfiles

linux yo
Nix
18
star
52

pyedsdk

Python library to control cameras via EDSDK
C
18
star
53

node-pend

dead-simple optimistic async helper in javascript
JavaScript
16
star
54

groove-rs

rust bindings to libgroove - streaming audio processing library
Rust
15
star
55

purgatory

escape from the circles of hell - 7 hour game jam
JavaScript
15
star
56

evo

specification, reference implementation, and examples of Evo, the programming language made for being the DNA of genetic algorithms
Zig
15
star
57

mediablast

(unmaintained, deprecated, abandoned) open source media processing server
JavaScript
14
star
58

browserify-lite

browserify, minus some of the advanced features and heavy dependencies
JavaScript
14
star
59

pillagers

Real time strategy game with space physics
JavaScript
12
star
60

hackerrank

my solutions to hackerrank puzzles
Go
11
star
61

connect-nocache

connect middleware to insert no cache headers
JavaScript
11
star
62

andrewkelley.me

my personal site
HTML
11
star
63

SIMD-test

exploring SIMD optimization
C
10
star
64

truthfinder

TruthFinder.org website
Python
10
star
65

mc-bot-server

(unmaintained) server that spins up minecraft bots
JavaScript
9
star
66

pulseaudio

pulseaudio with the build system replaced by zig
C
9
star
67

zig-mandelbrot-gl

mandelbrot set in zig
Zig
9
star
68

node-yawl

yet another websockets library for Node.js
JavaScript
8
star
69

clashproto

prototyping the game for andrewrk/clashos
Zig
8
star
70

planet-evo

evolution simulation software
C++
8
star
71

advent-of-code

https://adventofcode.com
Zig
8
star
72

node-music-library-index

node module to build a searchable javascript object model given track metadata objects
JavaScript
7
star
73

github-popularity-contest

see who has the most collective stars
JavaScript
7
star
74

node-human-size

tiny node.js module to get human readable file size from byte count
JavaScript
7
star
75

libmp3lame

libmp3lame with the build system replaced by zig
C
7
star
76

node-stream-counter

node.js module to keep track of how many bytes have been written to a stream
JavaScript
7
star
77

mpd

a fork of mpd to add library management, better search, and a sophisticated dynamic playlist
C
7
star
78

boost

Inline CSS into your HTML source
JavaScript
6
star
79

Secure-WordVault

(unmaintained, deprecated, abandoned) Enables you to store sensitive information in a portable manner
C++
6
star
80

TrenchBowl

simple music player UI to demonstrate libgroove
C++
6
star
81

node-spritesheet

node.js module: given a list of image files, create a spritesheet using cairo
JavaScript
6
star
82

chem-cli

html5 canvas game engine optimized for rapid development - command line interface
JavaScript
5
star
83

face-the-music

indie speed run game jam
JavaScript
5
star
84

dominion

Node.js module and command line program to play Dominion, the card game by Donald X. Vaccarino.
JavaScript
5
star
85

ruff

little tool to help my dad quickly find info in a .csv file
C++
5
star
86

gbremote

Groove Basin remote control command line app and Node.js module
JavaScript
5
star
87

archerbot

mineflayer bot that engages you in a gentlemanly duel
JavaScript
5
star
88

holocaust

html5 video game - rebuild society after a nuclear holocaust ravages the world
JavaScript
4
star
89

planetarius

Ludum Dare 30 Entry. networked multiplayer arcade shooter
JavaScript
4
star
90

Camlift-Controller

Controls a Canon camera and operates a motorized lift
Visual Basic
4
star
91

swig-dummy-context

given a swig template, create a dummy context which is useful for template composing tools
JavaScript
4
star
92

node-passthrough-truncate

truncate the last N bytes of a stream - Node.js module
JavaScript
3
star
93

scrabble

Scrabble solving AI
3
star
94

spacefight

vaporware 3D space-dogfighting simulator game
C++
3
star
95

math3d-rs

computer-graphics matrix calculations for dummies like me
Rust
3
star
96

lemming-js

PyWeek #12 entry ported to JavaScript with chem
JavaScript
3
star
97

pypowerusb

Python library to control a PowerUSB
C
3
star
98

opengl-multi-window-test

see if multiple windows in opengl causes a framerate issue
C
3
star
99

disinfecticide

A game about controlling a disease outbreak.
JavaScript
2
star
100

socketio-ssl-test

test whether we can use socket.io with xhr requests securely on an insecure page
JavaScript
2
star