maildown 2.0.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3015c6cd2855144aaa66368e064f210e38b9558f07eaeef739f4330e5d7325cb
4
- data.tar.gz: 3e7ce8df93af569dad9ead634a7df86f9fcf75a5797858ab64f9485e0cbc95c7
3
+ metadata.gz: 26ca653dc43004e76229cd6ae163a8f67b3682cefa478b6daf03c5322e8877c1
4
+ data.tar.gz: e4cf385979d5adcd82a6b020065a616f936db4b7f692d81f7d90ffa908614284
5
5
  SHA512:
6
- metadata.gz: fb872109df5155820dbc63005e45afef0af5db00688f5bb69210166422e9a2c1233ae7a4e7cedf63c1f000fec75cddb057be51903daa7ba2309ce94ae4045526
7
- data.tar.gz: dd047ceec3b6898e5488aefe6c131ce74b6136fbac8855c03c691c83cc16e83db692539df16bb02856e7a17066b76369dc6b0050cd0dff55be9de5b8f3238169
6
+ metadata.gz: eab147c20f6c250e74a4f018f0a1ca0dfb568ad357ab17f7bcc1745b255e1519f1a7f6af0f97e71192d33e1a610e3fdfa7c4241c03883c6b49ce570112c48f9d
7
+ data.tar.gz: 3ea0e175ea11f1abb2d706aaeed2eac4f36e5b2859b141a2a5b74526caeeb5c745e98c156caf9191ab96629a8557b3580f3502c9dbd342ddbbb70d7639d6ec9b
@@ -1,34 +1,54 @@
1
- require 'action_mailer'
1
+ # frozen_string_literal: true
2
2
 
3
- mail_view_klass = ActionMailer::Base.view_context_class
4
- mail_view_klass.default_formats = (mail_view_klass.default_formats << :md)
5
- Mime::Type.register "text/md", :md, [], %w(md)
3
+ require 'action_mailer'
4
+ require 'action_mailer/base'
6
5
 
6
+ # Monkeypatch to allow mailer to auto generate text/html
7
+ #
8
+ # If you generate a mailer action, by default it will only
9
+ # render an html email:
10
+ #
11
+ # def welcome
12
+ # mail(
13
+ # to: "foo@example.com",
14
+ # reply_to: "noreply@schneems.com",
15
+ # subject: "hello world"
16
+ # )
17
+ # end
18
+ #
19
+ # You can add a format block to have it produce html
20
+ # and text emails:
21
+ #
22
+ # def welcome
23
+ # mail(
24
+ # to: "foo@example.com",
25
+ # reply_to: "noreply@schneems.com",
26
+ # subject: "hello world"
27
+ # ) do |format|
28
+ # format.text
29
+ # format.html
30
+ # end
31
+ # end
32
+ #
33
+ # For the handler to work correctly and produce both HTML
34
+ # and text emails this would need to be required similar to
35
+ # how https://github.com/plataformatec/markerb works.
36
+ #
37
+ # This monkeypatch detects when a markdown email is being
38
+ # used and generates both a markdown and text template
7
39
  class ActionMailer::Base
8
- alias :original_collect_responses :collect_responses
9
-
10
- def collect_responses(*args, &block)
11
- responses = original_collect_responses(*args, &block)
12
- md = ::Maildown::Md.new(responses)
13
- if md.contains_md?
14
- rendered_response = md.to_responses
40
+ alias :original_each_template :each_template
15
41
 
16
- if Maildown.enable_layouts
17
- text = rendered_response[0]
18
- html = rendered_response[1]
42
+ def each_template(paths, name, &block)
43
+ templates = original_each_template(paths, name, &block)
19
44
 
20
- layout_name = _layout(text[:content_type])
21
- text[:layout] = "#{layout_name}.text.erb"
22
- text[:body] = render(text)
45
+ return templates if templates.first.handler != Maildown::Handlers::Markdown
23
46
 
24
- layout_name = _layout(html[:content_type])
25
- html[:layout] = "#{layout_name}.html.erb"
26
- html[:body] = render(html)
27
- end
47
+ html_template = templates.first
48
+ text_template = html_template.dup
49
+ formats = html_template.formats.dup.tap { |f| f.delete(:html) }
28
50
 
29
- return rendered_response
30
- else
31
- return responses
32
- end
51
+ text_template.formats = formats
52
+ return [html_template, text_template]
33
53
  end
34
54
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_view'
4
+
5
+ # This monkeypatch allows the use of `.md.erb` file extensions
6
+ # in addition to `.md+erb` and `.md`
7
+ module ActionView
8
+ class OptimizedFileSystemResolver
9
+ alias :original_extract_handler_and_format_and_variant :extract_handler_and_format_and_variant
10
+
11
+ # Different versions of rails have different
12
+ # method signatures here, path is always first
13
+ def extract_handler_and_format_and_variant(*args)
14
+ if args.first.end_with?('md.erb')
15
+ path = args.shift
16
+ path = path.gsub(/\.md\.erb\z/, '.md+erb')
17
+ args.unshift(path)
18
+ end
19
+ return original_extract_handler_and_format_and_variant(*args)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ require 'action_view'
3
+
4
+ module Maildown
5
+ module Handlers
6
+ # The handler is what allows Rails to render markdown
7
+ #
8
+ # See docs/rails_template_handler.pdf for detailed tutorial on
9
+ # using a template handler with Rails.
10
+ #
11
+ # The TLDR; is you define a handler that responds to `call` and then
12
+ # you register it against an file extension with `ActionView::Template.register_template_handler`
13
+ #
14
+ # At runtime if Rails finds a template with the same file extension that was
15
+ # registered it will use you handler and pass the template into `call` to
16
+ # render the template
17
+ module Markdown
18
+ def self.erb_handler
19
+ @erb_handler ||= ActionView::Template.registered_template_handler(:erb)
20
+ end
21
+
22
+ # Expected return value is valid ruby code wrapped in a string.
23
+ #
24
+ # This handler takes care of both text and html email templates
25
+ # by inspectig the available `"formats"` and rendering the
26
+ # markdown to HTML if one of the formats is `:html`.
27
+ def self.call(template)
28
+ # Match beginning whitespace but not newline http://rubular.com/r/uCXQ58OOC8
29
+ template.source.gsub!(/^[^\S\n]+/, ''.freeze) if Maildown.allow_indentation
30
+
31
+ compiled_source = erb_handler.call(template)
32
+
33
+ if template.formats.include?(:html)
34
+ return "Maildown::MarkdownEngine.to_html(begin;#{compiled_source}; end)"
35
+ else
36
+ return "Maildown::MarkdownEngine.to_text(begin;#{compiled_source}; end)"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ # Allows for templates like `contact.md` or `contact.md+erb` to be rendered as
44
+ # markdown.
45
+ ActionView::Template.register_template_handler :"md+erb", Maildown::Handlers::Markdown
46
+ ActionView::Template.register_template_handler :"md", Maildown::Handlers::Markdown
47
+
48
+ # Used in conjunction with ext/action_view.rb monkey patch
49
+ # to allow for using the ".md.erb" file "extension".
50
+ #
51
+ # Rails only considers the last part of the file extension
52
+ # i.e the "erb" from "md.erb" to be an extension.
53
+ #
54
+ # The monkeypatch in `ext/action_view.rb` detects "md.erb" and converts
55
+ # it to md+erb which is an extension with a "variant". However
56
+ # to allow rails to even attempt to process the file, it needs this
57
+ # handler with ".md.erb" to be registered.
58
+ ActionView::Template.register_template_handler :"md.erb", Maildown::Handlers::Markdown
59
+
@@ -1,5 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Maildown
4
+ # This module provides the API for Replacing the Markdown engine
5
+ #
6
+ # Maildown uses [kramdown](https://github.com/gettalong/kramdown) by default.
7
+ # Kramdown is pure ruby, so it runs the same across all ruby implementations:
8
+ # jruby, rubinius, MRI, etc. You can configure another parser if you like using
9
+ # the `Maildown::MarkdownEngine.set_html` method and pasing it a block.
10
+ #
11
+ # For example, if you wanted to use Redcarpet you could set it like this:
12
+ #
13
+ #
14
+ # Maildown::MarkdownEngine.set_html do |text|
15
+ # carpet = Redcarpet::Markdown.new(Redcarpet::Render::HTML, {})
16
+ # carpet.render(text).html_safe
17
+ # end
18
+ #
2
19
  module MarkdownEngine
20
+ @maildown_markdown_engine_html_block = nil
21
+ @maildown_markdown_engine_text_block = nil
22
+
3
23
  def self.to_html(string)
4
24
  html_block.call(string)
5
25
  end
@@ -16,17 +36,10 @@ module Maildown
16
36
  set_html(&block)
17
37
  end
18
38
 
19
- class << self
20
- extend Gem::Deprecate
21
- deprecate :set, :set_html, 2017, 6
22
- end
23
-
24
39
  def self.set_text(&block)
25
40
  @maildown_markdown_engine_text_block = block
26
41
  end
27
42
 
28
- @maildown_markdown_engine_html_block = nil
29
- @maildown_markdown_engine_text_block = nil
30
43
  def self.html_block
31
44
  @maildown_markdown_engine_html_block || default_html_block
32
45
  end
@@ -1,3 +1,3 @@
1
1
  module Maildown
2
- VERSION = "2.0.3"
2
+ VERSION = "3.0.0"
3
3
  end
data/lib/maildown.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # Top level module, all module methods are used for configuration
1
2
  module Maildown
2
3
  @allow_indentations = false
3
4
  @enable_layouts = false
@@ -11,14 +12,17 @@ module Maildown
11
12
  end
12
13
 
13
14
  def self.enable_layouts
15
+ puts "Maildown.enable_layouts is deprecated, setting this does nothing"
14
16
  @enable_layouts
15
17
  end
16
18
 
17
19
  def self.enable_layouts=(enable_layouts)
20
+ puts "Maildown.enable_layouts= is deprecated, setting this does nothing"
18
21
  @enable_layouts = enable_layouts
19
22
  end
20
23
  end
21
24
 
22
25
  require 'maildown/markdown_engine'
23
- require 'maildown/md'
24
26
  require 'maildown/ext/action_mailer'
27
+ require 'maildown/ext/action_view'
28
+ require 'maildown/handlers/markdown'
@@ -0,0 +1,6 @@
1
+ class HandlersController < ApplicationController
2
+
3
+ def show
4
+ render params[:id]
5
+ end
6
+ end
@@ -8,4 +8,28 @@ class UserNoLayoutMailer < ApplicationMailer
8
8
  subject: "hello world"
9
9
  )
10
10
  end
11
+
12
+ def leading_whitespace
13
+ mail(
14
+ to: "foo@example.com",
15
+ reply_to: "noreply@schneems.com",
16
+ subject: "hello world"
17
+ )
18
+ end
19
+
20
+ def leading_whitespace_again
21
+ mail(
22
+ to: "foo@example.com",
23
+ reply_to: "noreply@schneems.com",
24
+ subject: "hello world"
25
+ )
26
+ end
27
+
28
+ def contact
29
+ mail(
30
+ to: "foo@example.com",
31
+ reply_to: "noreply@schneems.com",
32
+ subject: "hello world"
33
+ )
34
+ end
11
35
  end
@@ -0,0 +1 @@
1
+ Dual templates **rock**!
@@ -1,3 +1,3 @@
1
1
  Rails.application.routes.draw do
2
-
2
+ get "handlers/:id", to: "handlers#show"
3
3
  end