mc_markdown 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bd77c3ac8d404a34b13fce0798dce8e0ecd703ef
4
+ data.tar.gz: 01143bd86643d7fcc301f47e56da0be1dc3ba361
5
+ SHA512:
6
+ metadata.gz: 343a2e49df1c68dc69479d67bd25c77a5d833e3c508d8f62dccc6467e3316d97c95c960276c6af980fba068d35f742d3d7b33f99b7ba0514de4faf4f315fb5a6
7
+ data.tar.gz: f94055d08e32929046ce2c8f81aca889818cb959601fae05fa69bb05def250ee8e1b261636545c061763c5f74faac8fd9d031e98884ac660b97a1b5c7ec3cd4e
@@ -0,0 +1,11 @@
1
+ require 'redcarpet'
2
+
3
+ # Parsing
4
+ require_relative 'mc_markdown/parsers'
5
+
6
+ # Formatters
7
+ require_relative 'mc_markdown/formatters'
8
+
9
+ # Util
10
+ require_relative 'mc_markdown/extensions'
11
+ require_relative 'mc_markdown/renderers'
@@ -0,0 +1,10 @@
1
+ module MCMarkdown
2
+ module Extensions
3
+ attr_reader :extensions
4
+
5
+ def initialize extensions={}
6
+ @extensions = extensions
7
+ super extensions
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'formatters/common_misspellings'
2
+ require_relative 'formatters/header_with_id'
3
+ require_relative 'formatters/image'
4
+ require_relative 'formatters/links'
5
+ require_relative 'formatters/lists'
6
+ require_relative 'formatters/escape_merge_tags'
7
+ require_relative 'formatters/blockquote'
8
+ require_relative 'formatters/blocks'
9
+ require_relative 'formatters/wistia'
@@ -0,0 +1,38 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Blockquote
4
+
5
+ # http://rubular.com/r/9DaY7IwzEV
6
+ BLOCK_QUOTE_PATTERN = /(?<!>\n) (^>\s[^>].+)/x
7
+
8
+ def preprocess doc
9
+ doc.gsub!(BLOCK_QUOTE_PATTERN) do |match|
10
+ match.prepend "\n{{break_quote}}\n"
11
+ end
12
+
13
+ if defined?(super)
14
+ return super(doc)
15
+ else
16
+ return doc
17
+ end
18
+ end
19
+
20
+ def postprocess doc
21
+ doc.gsub! "\n<p>{{break_quote}}</p>", ""
22
+
23
+ if defined?(super)
24
+ return super(doc)
25
+ else
26
+ return doc
27
+ end
28
+ end
29
+
30
+ def block_quote quote
31
+ quote = quote.strip.gsub( "<p>{{break_quote}} ", '</blockquote><blockquote><p>').gsub(/\n/, '')
32
+
33
+ "<blockquote>" << quote << "</blockquote>"
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,47 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Blocks
4
+
5
+ def preprocess doc
6
+ doc.gsub!( Parser::BlockTag::Block.open_block ) do |match|
7
+ "\n\n#{match}\n\n"
8
+ end
9
+
10
+ doc.gsub!( Parser::BlockTag::Block.close_block ) do |match|
11
+ "\n\n#{match}\n\n"
12
+ end
13
+
14
+ if defined?(super)
15
+ return super(doc)
16
+ else
17
+ return doc
18
+ end
19
+ end
20
+
21
+ def postprocess doc
22
+ doc = Parser::BlockTag.new(doc, BlockFormatter).parsed
23
+
24
+ if defined?(super)
25
+ return super(doc)
26
+ else
27
+ return doc
28
+ end
29
+ end
30
+
31
+ class BlockFormatter < Parser::Formatter
32
+
33
+ def notes attributes={}
34
+ content = attributes[:content]
35
+ "<div class=\"notes\">\n\n#{content}\n\n</div>"
36
+ end
37
+
38
+ def callout attributes={}
39
+ content = attributes[:content]
40
+ "<div class=\"callout\">\n\n#{content}\n\n</div>"
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module CommonMisspellings
4
+
5
+ def preprocess doc
6
+
7
+ replacements = {
8
+ "(&ldqou;)" => "&ldquo;",
9
+ "(&rdqou;)" => "&rdquo;",
10
+ "(&rsqou;)" => "&rsquo;"
11
+ }
12
+
13
+ replacements.each do |bad_regex, correction|
14
+ doc.gsub! /#{bad_regex}/xi, correction
15
+ end
16
+
17
+ if defined?(super)
18
+ return super(doc)
19
+ else
20
+ return doc
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module EscapeMergeTags
4
+ ALLOWED_CHARACTERS = ['w', ':', '_', '<', '>', '/' ]
5
+
6
+ def emphasis text
7
+ characters = ALLOWED_CHARACTERS.map { |char| "\\#{char}" }.join("")
8
+ unless text.match /^\| .+ \|$/x
9
+ "<em>#{text}</em>"
10
+ else
11
+ "*#{convert_em_tags_to_underscores(text)}*"
12
+ end
13
+ end
14
+
15
+ def convert_em_tags_to_underscores string
16
+ string.gsub( /<\/?em>/, '_' )
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ require 'slugity/extend_string'
2
+
3
+ module MCMarkdown
4
+ module Formatter
5
+ module HeaderWithID
6
+
7
+ def header text, header_level
8
+ header_levels = Array(header_options.fetch(:level, 1))
9
+ return "<h#{header_level}>#{text}</h#{header_level}>" unless header_levels.include?(header_level)
10
+
11
+ # add ids to all h1 headers (pray they're unique)
12
+ if header_options.fetch(:template_tag_headers, false)
13
+ namespace = "{{section_id}}"
14
+ else
15
+ namespace = "#{header_options.fetch(:slug, 'section')}-#{text.strip.to_slug}"
16
+ end
17
+
18
+ return "<h#{header_level} id='#{namespace}'>#{text}</h#{header_level}>"
19
+ end
20
+
21
+ def header_options
22
+ if defined?(extensions)
23
+ options = extensions.fetch(:header_with_id, {})
24
+ options[:template_tag_headers] = extensions.fetch(:template_tag_headers, false)
25
+ else
26
+ options = {}
27
+ end
28
+
29
+ return options
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,55 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Image
4
+
5
+ # http://rubular.com/r/lss0C9HqoP
6
+ # $1 => alt
7
+ # $2 => class/attrs
8
+ IMG_ATTRIBUTES_PATTERN = /^ ([^_{}]+)? (?:{(.+?)})? \s?$/x
9
+
10
+ # add classes to images and render title as figure/figcaption
11
+ # ![alt {class}](/path/to/img.jpg "caption")
12
+ def image link, title, alt_text
13
+ return "![#{alt_text}](#{link}#{(title && !title.empty?) ? " \"#{title}\"" : ''})" if extensions[:no_images]
14
+
15
+ match_data = IMG_ATTRIBUTES_PATTERN.match (alt_text || "")
16
+ alt_text = match_data[1] || ""
17
+ attrs = match_data[2] || ""
18
+
19
+ # check for attrs in class field
20
+ if attrs.include? ':'
21
+ attrs = attrs.split(', ').each_with_object([]) do |frag, out|
22
+ frag = frag.split ':'
23
+ out.push "#{frag[0].strip}='#{frag[1].strip}'"
24
+ out
25
+ end.join(" ") + " "
26
+ elsif !attrs.empty?
27
+ classes = attrs
28
+ attrs = "class='#{attrs}' "
29
+ end
30
+
31
+ if title
32
+ return "<figure class='img #{classes}'>" +
33
+ "<img src='#{link}' alt='#{alt_text.strip}' />" +
34
+ "<figcaption>" + ::Redcarpet::Markdown.new( self ).render(title).strip + "</figcaption>" +
35
+ "</figure>"
36
+ else
37
+ return "<img src='#{link}' alt='#{alt_text.strip}' #{attrs}/>"
38
+ end
39
+ end
40
+
41
+ # need to strip paragraph tags from around
42
+ # figures, has potential to cause invalid markup
43
+ def postprocess doc
44
+ doc = doc.gsub( /<p><figure/, '<figure' ).gsub( /<\/figure><\/p>/, '</figure>' )
45
+
46
+ if defined?(super)
47
+ return super(doc)
48
+ else
49
+ return doc
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,51 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Links
4
+
5
+ # http://rubular.com/r/nVJvYdiGud
6
+ # $1 => text
7
+ # $2 => junk
8
+ # $3 => class/attrs
9
+ # $4 => target
10
+ LINK_ATTRIBUTES_PATTERN = /^ ([^_{}]+) ({(.+?)})? (\s\_[a-zA-Z]+)? \s?$/x
11
+
12
+
13
+ # add ability to add classes to links
14
+ # [Link Test {class} _target ](link)
15
+ def link link, title, content
16
+ return "[#{content}](#{link}#{(title && !title.empty?) ? " \"#{title}\"" : ''})" if extensions[:no_links]
17
+
18
+ match_data = LINK_ATTRIBUTES_PATTERN.match content
19
+ content = match_data[1]
20
+ attrs = match_data[3] || ""
21
+ target = match_data[4]
22
+
23
+ # check for attrs in class field
24
+ if attrs.include? ':'
25
+ attrs = attrs.split(', ').each_with_object([]) do |frag, out|
26
+ frag = frag.split ':'
27
+ out.push "#{frag[0].strip}='#{frag[1].strip}'"
28
+ out
29
+ end.join(" ")
30
+ elsif !attrs.empty?
31
+ attrs = "class='#{attrs}'"
32
+ end
33
+
34
+ if extensions[:xml]
35
+ link.encode!(xml: :text)
36
+ # content gets loosely encoded before it
37
+ # enters the formatter
38
+ end
39
+
40
+ # there is always a link
41
+ return_string = "<a href='#{link}'"
42
+ return_string << " " << attrs if !attrs.empty?
43
+ return_string << " target='#{target.strip}'" if target
44
+ return_string << ">#{content.strip}</a>"
45
+
46
+ return return_string
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Lists
4
+
5
+ def list content, list_type
6
+ tag = ( list_type == :ordered ) ? "ol" : "ul"
7
+ tag = (/\<dt\>/.match(content) ) ? "dl" : tag
8
+
9
+ "<#{tag} class='list markers'>#{content}</#{tag}>"
10
+ end
11
+
12
+ def list_item text, list_type
13
+ if /\n\:\s*\n/.match(text)
14
+ match_data = /^((.*)\n\:\s*\n)/.match(text)
15
+ title = "<p>" << match_data[2].gsub('<p>','') << "</p>"
16
+
17
+ # strip the title from the text, but leave <p> tags
18
+ text = text.gsub( match_data[1].gsub(/\<\/?p\>/,''), '')
19
+
20
+ # strip opening and closing p tags
21
+ text = text.strip.gsub( /(\A\<p\>|\<\/p\>\z)/, '' )
22
+
23
+ text = "<p>" << text << "</p>"
24
+
25
+ "<dt>#{title}</dt><dd>#{text}</dd>"
26
+ else
27
+ "<li>#{text.strip}</li>"
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,64 @@
1
+ module MCMarkdown
2
+ module Formatter
3
+ module Wistia
4
+
5
+ def preprocess doc
6
+ doc = Parser::ShortTag.new(doc, WistiaFormatter).parsed
7
+
8
+ if defined?(super)
9
+ return super(doc)
10
+ else
11
+ return doc
12
+ end
13
+ end
14
+
15
+ class WistiaFormatter < Parser::Formatter
16
+
17
+ def video attributes={}
18
+ wistia_id = attributes.delete(:id)
19
+ options = defaults.merge(attributes)
20
+
21
+ query_params = options.map do |attr,value|
22
+ # camel case attribute names
23
+ camel_case = attr.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
24
+ "#{camel_case}=#{value}"
25
+ end
26
+
27
+ html_params = {
28
+ src: "http://fast.wistia.com/embed/iframe/#{wistia_id}?#{query_params.join('&')}",
29
+ allowtransparency: 'true',
30
+ frameborder: '0',
31
+ scrolling: 'no',
32
+ class: 'wistia_embed',
33
+ name: 'wistia_embed',
34
+ width: options[:video_width],
35
+ height: options[:video_height]
36
+ }
37
+
38
+ if wistia_id
39
+ "<iframe #{render_params( html_params )}></iframe>"
40
+ else
41
+ ""
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def defaults
48
+ {
49
+ version: "v1",
50
+ video_width: 600,
51
+ video_height: 400,
52
+ controls_visible_on_load: true
53
+ }
54
+ end
55
+
56
+ def render_params params
57
+ params.map { |attr, value| "#{attr}='#{value}'" }.join(' ')
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,4 @@
1
+ require_relative 'parsers/block_tag'
2
+ require_relative 'parsers/formatter'
3
+ require_relative 'parsers/short_tag'
4
+ require_relative 'parsers/frontmatter'
@@ -0,0 +1,70 @@
1
+ module MCMarkdown
2
+ module Parser
3
+
4
+ class BlockTag
5
+
6
+ attr_reader :content
7
+ attr_reader :formatter
8
+
9
+ def initialize content, formatter
10
+ @content = content
11
+ @formatter = formatter.new
12
+ end
13
+
14
+ def parsed
15
+ content.gsub Block.pattern do |match|
16
+ tag = Block.new(match)
17
+ formatter.format(tag)
18
+ end
19
+ end
20
+
21
+ class Block
22
+ class << self
23
+ def pattern
24
+ / #{open_block} (.*?) #{close_block} /xm
25
+ end
26
+
27
+ def open_block
28
+ / (?:#{open_tag})? \{\{(.+?)\}\} #{repeated_spaces} (?:#{close_tag})? /x
29
+ end
30
+
31
+ def close_block
32
+ / (?:#{open_tag})? #{repeated_spaces} \{\{\/(.+?)\}\} (?:#{close_tag})? /x
33
+ end
34
+
35
+ def open_tag
36
+ / < (?:\w+?) > /x
37
+ end
38
+
39
+ def close_tag
40
+ / < (?:\/) (?:\w+?) > /x
41
+ end
42
+
43
+ private
44
+
45
+ def repeated_spaces
46
+ / (?:[\s\t]*) /x
47
+ end
48
+ end
49
+
50
+
51
+ attr_reader :orig
52
+ attr_reader :type
53
+ attr_reader :attributes
54
+
55
+ def initialize content
56
+ @orig = content
57
+ end
58
+
59
+ def type
60
+ @_type ||= @orig.match( Block.pattern )[1]
61
+ end
62
+
63
+ def attributes
64
+ @_attributes ||= { content: @orig.match( Block.pattern )[2].strip }
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,17 @@
1
+ module MCMarkdown
2
+ module Parser
3
+
4
+ class Formatter
5
+
6
+ def format tag
7
+ if self.respond_to? tag.type
8
+ self.public_send(tag.type, tag.attributes)
9
+ else
10
+ tag.orig
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ module MCMarkdown
2
+ module Parsers
3
+
4
+ class Frontmatter
5
+ attr_reader :content
6
+
7
+ def initialize content
8
+ @content = content
9
+ end
10
+
11
+ def parsed
12
+ match = content.match( frontmatter_regex )
13
+ raw_fm = match[1]
14
+ content = match[2]
15
+
16
+ if raw_fm && !raw_fm.empty?
17
+ frontmatter = SafeYAML.load raw_fm, safe: true,
18
+ deserialize_symbols: true,
19
+ raise_on_unknown_tag: true
20
+ else
21
+ frontmatter = {}
22
+ end
23
+
24
+ [ frontmatter, content ]
25
+ end
26
+
27
+ private
28
+
29
+ def frontmatter_regex
30
+ # http://rubular.com/r/tJ6VoFBuqK
31
+ # [1] => frontmatter || nil
32
+ # [2] => content
33
+ /(?:(?:\A-{3,}\s*\n+) (.+?) (?:-{3,}\s*\n+))? (.*)/mx
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,51 @@
1
+ module MCMarkdown
2
+ module Parser
3
+
4
+ class ShortTag
5
+
6
+ attr_reader :content
7
+ attr_reader :formatter
8
+
9
+ def initialize content, formatter
10
+ @content = content
11
+ @formatter = formatter.new
12
+ end
13
+
14
+ def parsed
15
+ content.gsub Tag.pattern do |match|
16
+ tag = Tag.new(match)
17
+ formatter.format(tag)
18
+ end
19
+ end
20
+
21
+ class Tag
22
+
23
+ def self.pattern
24
+ /\{\{ (.*?) \}\}/x
25
+ end
26
+
27
+ attr_reader :orig
28
+ attr_reader :type
29
+ attr_reader :attributes
30
+
31
+ def initialize matched_string
32
+ @orig = matched_string
33
+ @data = @orig.match( Tag.pattern )[1].strip.split(' ')
34
+ @type = @data.shift
35
+ @attributes = @data.map { |set| set.scan( attribute_pattern ) }.inject({}) do |out,pair|
36
+ out[ pair[0][0].to_sym ] = pair[0][1]
37
+ out
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def attribute_pattern
44
+ / (\w+) = ['"](.+?)['"] /x
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,46 @@
1
+ module MCMarkdown
2
+ module Renderers
3
+ class << self
4
+
5
+ def use renderer_class, options={}
6
+ fetch( { class: renderer_class, extensions: options.delete(:extensions), options: options } )
7
+ end
8
+
9
+ private
10
+
11
+ def store
12
+ @_store ||= {}
13
+ end
14
+
15
+ def fetch renderer_key
16
+ store.fetch(renderer_key) { add(renderer_key) }
17
+ end
18
+
19
+ def add renderer_key
20
+ extensions = renderer_key[:extensions] || {}
21
+
22
+ store[renderer_key] = Redcarpet::Markdown.new(
23
+ ::MCMarkdown.const_get( renderer_key[:class].to_s.capitalize ).new( renderer_key[:options] ),
24
+ extensions
25
+ )
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ def self.render input, renderer=:base, options={}
32
+ Renderers.use(renderer, options).render(input)
33
+ end
34
+
35
+ def self.render_with_frontmatter input, renderer=:base, options={}
36
+ require 'safe_yaml/load'
37
+
38
+ frontmatter, content = Parsers::Frontmatter.new(input).parsed
39
+ rendered_content = Renderers.use(renderer, options).render(content)
40
+
41
+ [ frontmatter, rendered_content ]
42
+ end
43
+ end
44
+
45
+ require_relative 'renderers/html'
46
+ require_relative 'renderers/base'
@@ -0,0 +1,12 @@
1
+ module MCMarkdown
2
+ class Base < Html
3
+ include ::MCMarkdown::Formatter::Lists
4
+ include ::MCMarkdown::Formatter::Image
5
+ include ::MCMarkdown::Formatter::Links
6
+ include ::MCMarkdown::Formatter::EscapeMergeTags
7
+ include ::MCMarkdown::Formatter::CommonMisspellings
8
+ include ::MCMarkdown::Formatter::Blockquote
9
+ include ::MCMarkdown::Formatter::Blocks
10
+ include ::MCMarkdown::Formatter::Wistia
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module MCMarkdown
2
+ class Html < Redcarpet::Render::HTML
3
+ include Extensions
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module MCMarkdown
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mc_markdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Steven Sloan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redcarpet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: slugity
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: safe_yaml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ description: ' MailChimp flavoured markdown syntax using RedCarpet '
56
+ email:
57
+ - stevenosloan@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/mc_markdown.rb
63
+ - lib/mc_markdown/extensions.rb
64
+ - lib/mc_markdown/formatters.rb
65
+ - lib/mc_markdown/formatters/blockquote.rb
66
+ - lib/mc_markdown/formatters/blocks.rb
67
+ - lib/mc_markdown/formatters/common_misspellings.rb
68
+ - lib/mc_markdown/formatters/escape_merge_tags.rb
69
+ - lib/mc_markdown/formatters/header_with_id.rb
70
+ - lib/mc_markdown/formatters/image.rb
71
+ - lib/mc_markdown/formatters/links.rb
72
+ - lib/mc_markdown/formatters/lists.rb
73
+ - lib/mc_markdown/formatters/wistia.rb
74
+ - lib/mc_markdown/parsers.rb
75
+ - lib/mc_markdown/parsers/block_tag.rb
76
+ - lib/mc_markdown/parsers/formatter.rb
77
+ - lib/mc_markdown/parsers/frontmatter.rb
78
+ - lib/mc_markdown/parsers/short_tag.rb
79
+ - lib/mc_markdown/renderers.rb
80
+ - lib/mc_markdown/renderers/base.rb
81
+ - lib/mc_markdown/renderers/html.rb
82
+ - lib/mc_markdown/version.rb
83
+ homepage: http://github.com/mailchimp/mc_markdown
84
+ licenses:
85
+ - New-BSD
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.4.5
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: MailChimp flavoured markdown syntax using RedCarpet
107
+ test_files: []