inkcite 1.2.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dff1fb6ce80d821e6c797a6c691e904ed6dfb60d
4
- data.tar.gz: dcea60b5e3efe7edabc97186822e09e8cf43c8d5
3
+ metadata.gz: 49c0ee10df003264c9c13457a64286f6f55284c4
4
+ data.tar.gz: 720db2e0316a425f31b390dc6e493e11af271f1f
5
5
  SHA512:
6
- metadata.gz: 8b19819db8870689817a7947159c7d30ff14e7a237c485dd42d43443691da47f2af0573e34df9f1873cdb14c8a20b71516ff0a23e6b9abdf06eac3747fd7a315
7
- data.tar.gz: 118adc599578c2d779d841ea78c8808a8a49334b084809e48eae9e6499e505d93218e5c5ab25026c7cf14b34ec930c39b4bc45401a928d3562eaed823f43aa80
6
+ metadata.gz: 6ecb5788b293ad9fcf75d344a3454cd57309b6f79c93b4ff8555e3c79b234087b75d304a4904afddb368a4fdb27861991ba915918f0c41de6a9610c027e26438
7
+ data.tar.gz: 67aa5173680fc76cea09588242493282b6a03cbe8b7ad39bdd93766a7f92119af08220dc6a2fef5a2b1b89feeb83334484ba96e96e3d412576ec3eb1ab3421bc
Binary file
@@ -0,0 +1,37 @@
1
+ // This file helps you keep your email code DRY (don't repeat yourself) by
2
+ // allowing you to easily define constants and custom tags.
3
+ //
4
+ // https://inkcite.readme.io/docs/helpers
5
+ //
6
+ // NOTE! The keys and values in this file are TAB-delimited.
7
+
8
+
9
+ // This controls the subject line used for email prevents and text that is
10
+ // written into the <title> of the HTML created by Inkcite.
11
+ title Welcome to Inkcite
12
+
13
+ // This sets the color for all links generated with Inkcite's {a} helper.
14
+ #link #000099
15
+
16
+ // This defines the default font family used throughout your email.
17
+ font-family sans-serif
18
+
19
+ // Default font styles
20
+ font-family sans-serif
21
+ font-size 15
22
+ line-height 19
23
+
24
+ // This custom Helper wraps content in a specially formatted <span></span>
25
+ // that changes its font family, size, color and applies custom padding.
26
+ code {span font-family=monospace font-size=16 padding=3 color=#999} {/span}
27
+
28
+ // Bullet-proof buttons
29
+ button-border-radius 5
30
+ button-float center
31
+ button-padding 8
32
+ button-width 175
33
+
34
+ // Dimensions
35
+ width 500
36
+
37
+ wrap {table width=100% bgcolor=#fff}{td font-family="{font-family}" align=center} {/td}{/table}
@@ -0,0 +1,32 @@
1
+ {wrap}
2
+
3
+ {preheader}This preheader will only be visible in supporting clients.{/preheader}
4
+
5
+ {table padding=10 width={width} mobile="fill"}
6
+ {td font=default align=left}
7
+
8
+ {img src=logo.jpg height=50 width=200 alt="Company Logo"}<br>
9
+
10
+ {img src=billboard.jpg height=180 width={width} mobile="fill"}<br>
11
+
12
+ The {code}&#123;img&#125;{/code} Helper automatically uses placehold.it when the specified image is missing from the {code}images/{/code} folder. It also sets the {code}display{/code} attribute of its style to {code}block{/code} and will warn you when you've forgotten to set dimensions. Inkcite's Image Helper is responsive-ready, too - you can set this image to {code}hide{/code}, {code}fill{/code} or show a different image using the {code}mobile-src{/code} property.<br><br>
13
+
14
+ {a id="image-docs" href="https://inkcite.readme.io/docs/image"}Learn More{/a}
15
+
16
+ {/td}
17
+ {/table}
18
+
19
+ {table padding=10 width={width} float=center mobile="fill"}
20
+ {td align=left font=small}
21
+
22
+ {img src=footer.jpg height=100 width={width} mobile="hide"}<br>
23
+
24
+ <% if email? %>
25
+ This email was sent to [email]. {a id="unsubscribe" href=#}Click here to unsubscribe{/a}.
26
+ Using ERB, this unsubscribe notice will only appear in the 'email' format of this project.
27
+ <% end %>
28
+
29
+ {/td}
30
+ {/table}
31
+
32
+ {/wrap}
File without changes
@@ -12,8 +12,9 @@ copy-alt-to-title: false
12
12
  # usually be disabled in development to make debugging easier.
13
13
  minify: true
14
14
 
15
- # When true (recommended), enables image optimization using ImageOptim.
16
- # http://imageoptim.com
15
+ # When true (recommended), enables automatic image optimization of GIF,
16
+ # JPG and PNG images used in your email.
17
+ # https://inkcite.readme.io/v1.0/docs/image-optimization
17
18
  optimize-images: true
18
19
 
19
20
  # When empty links are found in content, this is the URL that will be
@@ -21,9 +22,26 @@ optimize-images: true
21
22
  # and needs to be provided.
22
23
  missing-link-url: 'https://github.com/404'
23
24
 
25
+ # Add Google Fonts (https://www.google.com/fonts) to your emails. Add
26
+ # the URLs to the family and sizes needed in your email. Then reference
27
+ # the font family in either source.html:
28
+ #
29
+ # {td font-family="'Open Sans Condensed', sans-serif"
30
+ #
31
+ # or inside of helpers.tsv:
32
+ #
33
+ # default-font-family 'Open Sans Condensed', sans-serif
34
+ #
35
+ # https://inkcite.readme.io/docs/fonts#section-google-fonts
36
+ #
37
+ #fonts:
38
+ # - 'https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700'
39
+
24
40
  # Inkcite can generate multiple versions of an email from a single source
25
41
  # file which is useful for targeted mailings and a/b testing. Specify a
26
42
  # unique, single-word identifier for each version.
43
+ # https://dash.readme.io/project/inkcite/v1.0/docs/ab-testing-and-versioning
44
+ #
27
45
  #versions:
28
46
  # - past_customer
29
47
  # - prospect
@@ -31,6 +49,8 @@ missing-link-url: 'https://github.com/404'
31
49
  # SMTP settings for sending previews to the small list of internal and client
32
50
  # addresses specified below. Most importantly, specify the address your test
33
51
  # emails will be sent 'from:'
52
+ # https://dash.readme.io/project/inkcite/v1.0/docs/email-previews
53
+ #
34
54
  smtp:
35
55
  host: 'smtp.gmail.com'
36
56
  port: 587
@@ -39,7 +59,18 @@ smtp:
39
59
  password: ''
40
60
  from: 'Your Name <email@domain.com>'
41
61
 
62
+ # Mailgun settings for sending previews via their 3x faster API. Sign up for
63
+ # a free account and retrieve your API key and sending domain from your
64
+ # Mailgun account dashboard.
65
+ # https://inkcite.readme.io/v1.0/docs/email-previews#section-sending-via-mailgun
66
+ #
67
+ # mailgun:
68
+ # api-key: 'key-your-api-key'
69
+ # domain: 'mg.sending-domain.com'
70
+ # from: 'Your Name <email@domain.com>'
71
+
42
72
  # Specify the distribution lists for preview versions of your email.
73
+ #
43
74
  recipients:
44
75
  client:
45
76
  - 'Awesome Client <awesome.client@domain.com>'
@@ -48,7 +79,8 @@ recipients:
48
79
  - 'Proofreader <proof.reader@domain.com>'
49
80
 
50
81
  # Easy Litmus integration for compatibility testing.
51
- # http://litmusapp.com
82
+ # https://inkcite.readme.io/docs/compatibility-testing
83
+ #
52
84
  litmus:
53
85
  subdomain: ''
54
86
  username: ''
@@ -56,6 +88,8 @@ litmus:
56
88
 
57
89
  # Easy deployment of static assets to a CDN or publicly-accessible
58
90
  # server - required when your email has images.
91
+ # https://dash.readme.io/project/inkcite/v1.0/docs/cdn-upload
92
+ #
59
93
  sftp:
60
94
  host: ''
61
95
  path: ''
@@ -67,16 +101,21 @@ sftp:
67
101
  # website analytics. {id} will be replaced with the unique ID
68
102
  # from the link if you're concerned about which link the
69
103
  # recipient clicked to get to your website.
104
+ # https://inkcite.readme.io/v1.0/docs/links
105
+ #
70
106
  tag-links: "from_email=myemail|{id}"
71
107
 
72
108
  # Optionally, if your email newsletter links to multiple websites
73
109
  # and you only want to tag links to a specific domain, include
74
110
  # that domain in this setting.
111
+ # https://inkcite.readme.io/v1.0/docs/links
112
+ #
75
113
  #tag-links-domain: 'clientdomain.com'
76
114
 
77
115
 
78
116
  # Environment-specific overrides allow you to change any setting
79
117
  # for each environment (e.g local development vs. client preview).
118
+ # https://dash.readme.io/project/inkcite/v1.0/docs/environments
80
119
 
81
120
  # These overrides apply to your local development environment when
82
121
  # you are viewing the email in your browser via Inkcite's server.
@@ -94,4 +133,3 @@ production:
94
133
  cache-bust: false
95
134
  image-host: "http://production.imagehost.com/emails/myemail"
96
135
  view-in-browser-url: 'http://production.contenthost.com/path/{filename}'
97
-
@@ -1,31 +1,17 @@
1
- // This file helps you keep your email code DRY (don't repeat yourself)
2
- // by allowing you to easily define constants and custom tags.
1
+ // This file helps you keep your email code DRY (don't repeat yourself) by
2
+ // allowing you to easily define constants and custom tags.
3
3
  //
4
- // The keys and values in this file are tab-delimited.
5
-
6
- // Palette
7
- #background #ffffff
8
- #text #000000
9
- #link #0099cc
10
-
11
- // Default font styles
12
- font-family sans-serif
13
- font-size 15
14
- line-height 19
4
+ // https://inkcite.readme.io/docs/helpers
5
+ //
6
+ // NOTE! The keys and values in this file are TAB-delimited.
15
7
 
16
- // This is an example of a custom tag. Tabs delimit the tag name, its open and
17
- // close values. Inkcite will replace instances of {big} and {/big} with these
18
- // values, respectively. Notice that it allows its color, which defaults to
19
- // #444444, to be configured in your HTML as in {big color=#ff0000}.
20
- big <div style="font-size: 18px; font-weight: bold; color: $color=#444444$"> </div>
21
8
 
22
- // Bullet-proof buttons
23
- button-border-radius 5
24
- button-float center
25
- button-padding 8
26
- button-width 175
9
+ // This controls the subject line used for email prevents and text that is
10
+ // written into the <title> of the HTML created by Inkcite.
11
+ title Welcome to Inkcite
27
12
 
28
- // Dimensions
29
- width 500
13
+ // This sets the color for all links generated with Inkcite's {a} helper.
14
+ #link #0099cc
30
15
 
31
- wrap {table width=100% bgcolor={#background}}{td font-family="{font-family}" align=center} {/td}{/table}
16
+ // This defines the default font family used throughout your email.
17
+ font-family sans-serif
@@ -0,0 +1,37 @@
1
+ # If you have enabled image optimization in config.yml you can control the
2
+ # exact inner-workings of the process through these settings. Additional
3
+ # documentation available here:
4
+ # https://github.com/toy/image_optim
5
+
6
+ allow_lossy: true # Small images through lossy compression
7
+ verbose: false # Verbose output
8
+
9
+ # Worker/optimizer-specific configurations follow
10
+
11
+ advpng:
12
+ level: 4 # Compression level: 0 - don't compress, 1 - fast, 2 - normal, 3 - extra, 4 - extreme
13
+
14
+ gifsicle:
15
+ level: 3 # Compression level: 1 - light and fast, 2 - normal, 3 - heavy (slower)
16
+ careful: false # Avoid bugs with some software (defaults to false)
17
+
18
+ jpegoptim:
19
+ max_quality: 50 # Maximum image quality factor 0..100, ignored in default/lossless mode
20
+
21
+ jpegrecompress:
22
+ quality: 1 # JPEG quality preset: 0 - low, 1 - medium, 2 - high, 3 - veryhigh
23
+
24
+ optipng:
25
+ level: 5 # Optimization level preset: 0 - least, 7 - best
26
+
27
+ pngquant:
28
+ quality: !ruby/range 0..50 # Quality min..max - don't save below min, use less colors below max
29
+ speed: 1 # Speed/quality trade-off: 1 - slow, 3 - default, 11 - fast & rough
30
+
31
+ # Note: PNGOUT is free to use even in commercial soft, but you can not
32
+ # redistribute, repackage or reuse it without consent and agreement of creator.
33
+ # Enable PNGOUT optimization by downloading and installing the binaries available
34
+ # from http://www.jonof.id.au/kenutils
35
+ pngout: false
36
+
37
+ svgo: false
@@ -1,60 +0,0 @@
1
- {wrap}
2
-
3
- {preheader}This preheader will only be visible in supporting clients.{/preheader}
4
-
5
- {table padding=10 width={width} mobile="fill"}
6
- {td font=default align=left}
7
-
8
- {img src=logo.gif height=50 width=200 alt="Company Logo"}<br>
9
-
10
- The &#123;img&#125; helper automatically uses placehold.it when the specified image is missing from the images/ folder. It also sets the <code>display</code>-style to block and will warn you when you've forgotten to set dimensions. &#123;img&#124; are responsive-ready - you can set this image to <code>hide</code>, <code>fill</code> or show a different image using the <code>mobile-src</code> property.
11
-
12
- {img src=billboard.jpg height=180 width={width} mobile="fill"}<br>
13
-
14
- {lorem sentences=10}<br><br>
15
-
16
- {button id="call-to-action" href="http://inkceptional.com"}I'm a Responsive Button{/button}<br>
17
-
18
- {/td}
19
- {/table}
20
-
21
- {table width={width} padding=10 float=center valign=top mobile="drop"}
22
- {td width=50%}
23
-
24
- {img src=kittens.jpg width=250 height=150 mobile="fill"}<br>
25
-
26
- {big}{lorem type=headline}{/big}
27
-
28
- {lorem sentences=8}<br><br>
29
-
30
- {button id="call-to-action2" href="http://inkceptional.com"}Create &amp; Send{/button}
31
-
32
- {/td}
33
- {td width=50% bgcolor=#eeeeee font=default}
34
-
35
- {big}{lorem type=headline}{/big}
36
- {lorem sentences=3}<br><br>
37
-
38
- {big}{lorem type=headline}{/big}
39
- {lorem sentences=3}<br><br>
40
-
41
- {big color=#990000}{lorem type=headline}{/big}
42
- {lorem sentences=3}
43
-
44
- {/td}
45
- {/table}
46
-
47
- {table padding=10 width={width} float=center mobile="fill"}
48
- {td align=left font=small}
49
-
50
- {img src=footer.jpg height=100 width={width} mobile="hide"}<br>
51
-
52
- <% if email? %>
53
- This email was sent to [email]. {a id="unsubscribe" href=#}Click here to unsubscribe{/a}.
54
- Using ERB, this unsubscribe notice will only appear in the 'email' format of this project.
55
- <% end %>
56
-
57
- {/td}
58
- {/table}
59
-
60
- {/wrap}
data/inkcite.gemspec CHANGED
@@ -27,6 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'builder'
28
28
  spec.add_dependency 'erubis'
29
29
  spec.add_dependency 'faker'
30
+ spec.add_dependency 'image_optim'
31
+ spec.add_dependency 'image_optim_pack'
30
32
  spec.add_dependency 'litmus'
31
33
  spec.add_dependency 'mail'
32
34
  spec.add_dependency 'mailgun-ruby'
@@ -23,9 +23,13 @@ module Inkcite
23
23
  end
24
24
 
25
25
  desc 'init NAME [options]', 'Initialize a new email project in the NAME directory'
26
+ option :'empty',
27
+ :aliases => '-e',
28
+ :desc => 'Prevents Inkcite from copying the example email files into the new project',
29
+ :type => :boolean
26
30
  option :from,
27
31
  :aliases => '-f',
28
- :desc => 'Clones an existing Inkcite project into a new one'
32
+ :desc => 'Clones an existing Inkcite project (all images, helpers, partials, etc.) into the new one'
29
33
 
30
34
  def init name
31
35
  require_relative 'init'
@@ -99,7 +99,7 @@ module Inkcite
99
99
 
100
100
  # Check to see if images should be optimized and if so, perform said
101
101
  # optimization on new or updated images.
102
- email.optimize_images if email.optimize_images?
102
+ email.optimize_images
103
103
 
104
104
  # For each of the production views, build the HTML and links files.
105
105
  email.views(:production) do |ev|
@@ -10,36 +10,51 @@ module Inkcite
10
10
  # Inkcite project.
11
11
  abort "It appears that an Inkcite already exists in #{path}" if File.exists?(File.join(full_init_path, 'config.yml'))
12
12
 
13
- init_image_path = File.join(path, Inkcite::Email::IMAGES)
14
- full_init_image_path = File.join(full_init_path, Inkcite::Email::IMAGES)
15
-
16
- # Create the images directory first because it's the deepest level
17
- # of the project structure.
18
- FileUtils.mkpath(full_init_image_path)
19
-
20
- puts "Created #{init_image_path}"
21
-
22
13
  # Check to see if the user specified a --from path that is used to
23
14
  # clone an existing project rather than init a new one.
24
15
  from_path = opts[:from]
25
16
 
17
+ # True if the designer wants the project empty/fresh rather than pre-populated
18
+ # with the example/demonstration email content.
19
+ is_empty = opts[:empty]
20
+
26
21
  # True if we're initializing a project from the built-in files.
27
22
  is_new = opts[:from].blank?
23
+ if is_new
24
+
25
+ # Use the default, bundled path if a from-path wasn't specified.
26
+ # Verify the path exists
27
+ from_path = File.join(Inkcite.asset_path, 'init')
28
28
 
29
- # Use the default, bundled path if a from-path wasn't specified.
30
- # Verify the path exists
31
- from_path = File.join(File.expand_path('../../..', File.dirname(__FILE__)), 'assets', 'init') if is_new
29
+ elsif is_empty
30
+ abort "Can't initialize a project using --empty and --from at the same time"
31
+
32
+ end
33
+
34
+ init_image_path = File.join(path, Inkcite::Email::IMAGES)
35
+ full_init_image_path = File.join(full_init_path, Inkcite::Email::IMAGES)
36
+
37
+ # Create the images directory first because it's the deepest level
38
+ # of the project structure.
39
+ FileUtils.mkpath(full_init_image_path)
40
+ puts "Created #{init_image_path}"
32
41
 
33
42
  # Verify that the source directory contains the config.yml file
34
43
  # signifying an existing Inkcite project.
35
44
  abort "Can't find #{from_path} or it isn't an existing Inkcite project" unless File.exists?(File.join(from_path, 'config.yml'))
36
45
 
37
46
  # Copy the main Inkcite project files
38
- FILES.each do |file|
39
- from_file = File.join(from_path, file)
40
- next unless File.exists?(from_file)
47
+ Dir.glob(File.join(from_path, '*.{html,tsv,txt,yml}')).each do |from_file|
41
48
  FileUtils.cp(from_file, full_init_path)
42
- puts "Created #{File.join(path, file)}"
49
+ puts "Created #{File.join(path, from_file)}"
50
+ end
51
+
52
+ # If the example email is required, switch to the example root and
53
+ # copy the files within over the existing files.
54
+ unless is_empty
55
+ from_path = File.join(Inkcite.asset_path, 'example')
56
+ FileUtils.cp_r(File.join(from_path, '.'), full_init_path)
57
+ puts 'Copied example email files'
43
58
  end
44
59
 
45
60
  # Check to see if there are images and copy those as well.
@@ -92,6 +92,11 @@ module Inkcite
92
92
  puts ''
93
93
  puts "#{ts} Rendering your email [environment=#{environment}, format=#{format}, version=#{version || 'default'}]"
94
94
 
95
+ # Before the rendering takes place, trigger image optimization of any
96
+ # new or updated images. The {image} tag takes care of injecting the
97
+ # right path (optimized or not) depending on which version is needed.
98
+ @email.optimize_images
99
+
95
100
  view = @email.view(environment, format, version)
96
101
 
97
102
  html = view.render!
@@ -7,46 +7,31 @@ module Inkcite
7
7
 
8
8
  def self.invoke email, opt
9
9
 
10
+ # Verify that a litmus: section is defined in the config.yml
11
+ config = email.config[:litmus]
12
+ if !config || config.blank?
13
+ puts "Unable to test with Litmus ('litmus:' section not found in config.yml)"
14
+ return false
15
+ end
16
+
17
+ # The new Litmus launched in October, 2015 no longer uses the API for creating
18
+ # tests and instead just accepts emails sent to the account's static email address.
19
+ # Check to see if a test-address has been defined.
20
+ send_to = config[:'test-address']
21
+ if send_to.nil? || send_to.blank?
22
+ puts "Unable to test with Litmus! ('test-address' entry missing from 'litmus:' section in the config.yml)"
23
+ return false
24
+ end
25
+
10
26
  # Push the browser preview up to the server to ensure that the
11
27
  # latest images are available.
12
28
  email.upload
13
29
 
14
- config = email.config[:litmus]
15
-
16
- # Initialize the Litmus base.
17
- Litmus::Base.new(config[:subdomain], config[:username], config[:password], true)
18
-
19
30
  # Send each version to Litmus separately
20
31
  email.versions.each do |version|
21
32
 
22
33
  view = email.view(:preview, :email, version)
23
34
 
24
- # This will hold the Litmus Test Version which provides the GUID (e.g. email)
25
- # to which we will send.
26
- test_version = nil
27
-
28
- # Check to see if this email already has a test ID.
29
- test_id = view.meta(:litmus_test_id)
30
- if test_id.blank? || opt[:new]
31
-
32
- email_test = Litmus::EmailTest.create
33
-
34
- # Store the litmus test ID in the email's meta data.
35
- view.set_meta :litmus_test_id, email_test['id']
36
-
37
- # Extract the email address we need to send the test to.
38
- test_version = email_test["test_set_versions"].first
39
-
40
- else
41
-
42
- # Create a new version of the test using the same ID as before.
43
- test_version = Litmus::TestVersion.create(test_id)
44
-
45
- end
46
-
47
- # Extract the email address to send the test to.
48
- send_to = test_version["url_or_guid"]
49
-
50
35
  puts "Sending '#{view.subject}' to #{send_to} ..."
51
36
 
52
37
  Inkcite::Mailer.litmus(email, version, send_to)
data/lib/inkcite/email.rb CHANGED
@@ -52,12 +52,12 @@ module Inkcite
52
52
  # Optimizes this email's images if optimize-images is enabled
53
53
  # in the email configuration.
54
54
  def optimize_images
55
- optimize_images! if optimize_images?
55
+ Minifier.images(self, false) if optimize_images?
56
56
  end
57
57
 
58
58
  # Optimizes all of the images in this email.
59
59
  def optimize_images!
60
- Minifier.images(self)
60
+ Minifier.images(self, true)
61
61
  end
62
62
 
63
63
  def optimize_images?