simple_format 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -14
- data/lib/simple_format.rb +51 -30
- data/lib/simple_format/auto_link.rb +52 -74
- data/lib/simple_format/emoji.rb +41 -13
- data/lib/simple_format/version.rb +1 -1
- metadata +35 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34c845c32712d925c46d8130899832a6d3cf0a6f
|
4
|
+
data.tar.gz: c6b23b1066f559f1c6a0644055d052818bd5e6ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80a82f9016c92d09ade050bb8bcf1a139820ea0f996b3a1334bbef6324ac84f1d98e5929c73f31c4205de48bcebe7bfc49906eaa1fbc4263a6554f68b95250d6
|
7
|
+
data.tar.gz: 0f30d1cab8e76c3e49ebceee2a917053d3776a823d4d00a16a4db66ae91ef3ac8a27afd5fd2d13b9eccd772b56df822dfe390c343dd7aac05f2aadb3825e6734
|
data/README.md
CHANGED
@@ -5,6 +5,8 @@ simple_format
|
|
5
5
|
* Auto Link url and email.
|
6
6
|
* Clean HTML elements and attributes.
|
7
7
|
|
8
|
+
[![Gem Version](https://badge.fury.io/rb/simple_format.png)](http://badge.fury.io/rb/simple_format) [![Dependency Status](https://gemnasium.com/mimosa/simple_format.png?travis)](https://gemnasium.com/mimosa/rails-cache_control) [![Code Climate](https://codeclimate.com/github/mimosa/simple_format.png)](https://codeclimate.com/github/mimosa/simple_format)
|
9
|
+
|
8
10
|
|
9
11
|
Installation
|
10
12
|
------------
|
@@ -20,35 +22,36 @@ Usage
|
|
20
22
|
|
21
23
|
``` ruby
|
22
24
|
require 'simple_format'
|
23
|
-
|
24
|
-
|
25
|
+
c = SimpleFormat::Converter.new
|
26
|
+
string = "This is a <span src='error'>:ruby:</span> <script type='text/javascript'>alert('Formater');</script>.\n\n Test Auto Link www.ruby-china.com\n\nmail@domain.com\n\nTest Emoji tag <a href=':cat:'>🍀</a>:ruby-china:." # 测试文本
|
27
|
+
```
|
28
|
+
------
|
29
|
+
``` ruby
|
30
|
+
c.rich_with(string) # 富文本转换(Emoji, nl2br, Auto Link, Sanitize.clean)
|
25
31
|
```
|
26
|
-
* return
|
27
|
-
|
28
32
|
``` html
|
29
|
-
This is a <span src=\"error\">:ruby:</span> alert('Formater');.<br><br> Test Auto Link <a href=\"http://www.ruby-china.com\" target=\"_blank\">www.ruby-china.com</a><br><br><a href=\"mailto:mail@domain.com\">mail@domain.com</a><br><br>Test Emoji tag <a href=\"<img%20class=%22emoji%22%20src=%22//l.ruby-china.org/assets/emojis/cat.png%22%20width=%2264%22%20height=%2264%22%20/>\"><img class=\"emoji\" src=\"//l.ruby-china.org/assets/emojis/four_leaf_clover.png\"
|
33
|
+
=> "This is a <span src=\"error\">:ruby:</span> alert('Formater');.<br><br> Test Auto Link <a href=\"http://www.ruby-china.com\" target=\"_blank\">www.ruby-china.com</a><br><br><a href=\"mailto:mail@domain.com\">mail@domain.com</a><br><br>Test Emoji tag <a href=\"<img%20class=%22emoji%22%20src=%22//l.ruby-china.org/assets/emojis/cat.png%22%20width=%2264%22%20height=%2264%22%20/>\"><img class=\"emoji\" src=\"//l.ruby-china.org/assets/emojis/four_leaf_clover.png\"></a>:ruby-china:."
|
30
34
|
```
|
35
|
+
----
|
31
36
|
|
32
37
|
``` ruby
|
33
|
-
|
38
|
+
c.auto_link('www.ruby-china.org') # 自动链接
|
34
39
|
```
|
35
|
-
* return
|
36
|
-
|
37
40
|
``` html
|
38
|
-
|
41
|
+
=> "<a href='//www.ruby-china.org' target='_blank'>www.ruby-china.org</a>"
|
39
42
|
```
|
43
|
+
----
|
40
44
|
|
41
45
|
``` ruby
|
42
|
-
|
46
|
+
c.emoji_with('🍀') # 表情符
|
43
47
|
```
|
44
|
-
* return
|
45
|
-
|
46
48
|
``` html
|
47
|
-
|
49
|
+
=> "<img class=\"emoji\" src=\"//l.ruby-china.org/assets/emojis/four_leaf_clover.png\" />"
|
48
50
|
```
|
51
|
+
----
|
49
52
|
|
50
53
|
``` ruby
|
51
|
-
|
54
|
+
c.text_with(string) # 清除 HTML
|
52
55
|
=> "This is a :ruby: alert('Formater');.\n\n Test Auto Link www.ruby-china.com\n\nmail@domain.com\n\nTest Emoji tag 🍀:ruby-china:."
|
53
56
|
|
54
57
|
```
|
data/lib/simple_format.rb
CHANGED
@@ -5,36 +5,57 @@ require 'simple_format/auto_link'
|
|
5
5
|
require 'sanitize' unless defined?(::Sanitize)
|
6
6
|
|
7
7
|
module SimpleFormat
|
8
|
-
|
8
|
+
class Converter
|
9
|
+
def initialize(emoji=nil)
|
10
|
+
@emoji = emoji if emoji.is_a?(SimpleFormat::Emoji)
|
11
|
+
end
|
12
|
+
|
13
|
+
def rich_with(string) # 转 富文本
|
14
|
+
return string unless string
|
15
|
+
string = emoji_with(string)
|
16
|
+
string = nl2br(string).to_str
|
17
|
+
string = auto_link(string)
|
18
|
+
string = html_with(string)
|
19
|
+
return string
|
20
|
+
end
|
21
|
+
|
22
|
+
def emoji_with(string) # 表情符 转 <img>
|
23
|
+
emoji.replace_emoji_with_images(string)
|
24
|
+
end
|
25
|
+
|
26
|
+
def html_with(html, options = {})
|
27
|
+
options = { elements: sanitized_allowed_tags, attributes: { all: sanitized_allowed_attributes } } if options.empty?
|
28
|
+
Sanitize.clean(html, options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def text_with(string) # 清除 html
|
32
|
+
Sanitize.clean(string, {elements: [], attributes: { all: [] }})
|
33
|
+
end
|
34
|
+
|
35
|
+
def nl2br(string) # 回车 转 <br />
|
36
|
+
if string
|
37
|
+
string.gsub("\n\r","<br />").gsub("\r", "").gsub("\n", "<br />")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def auto_link(string) # 链接转换
|
42
|
+
@auto_link ||= AutoLink.new
|
43
|
+
@auto_link.all(string)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def emoji
|
49
|
+
@emoji || Emoji.new
|
50
|
+
end
|
51
|
+
|
52
|
+
def sanitized_allowed_tags
|
53
|
+
['a', 'p', 'br', 'img', 'abbr', 'mark', 'm', 'fieldset', 'legend', 'label', 'summary', 'details', 'address', 'map', 'area', 'td', 'tr', 'th', 'thead', 'tbody', 'tfoot', 'caption', 'table', 'h4', 'h5', 'h6', 'hr', 'span', 'em', 'dl', 'dt', 'dd', 'b', 'del', 'ins', 'small', 'pre', 'blockquote', 'strong', 'audio', 'video', 'source', 'ul', 'ol', 'li', 'i', 'embed', 'sub', 'sup']
|
54
|
+
end
|
55
|
+
|
56
|
+
def sanitized_allowed_attributes
|
57
|
+
['shape', 'coords', 'target', 'href', 'muted', 'volume', 'name', 'class', 'title', 'border', 'poster', 'loop', 'autoplay', 'allowfullscreen', 'fullscreen', 'align' , 'quality', 'allowscriptaccess', 'wmode', 'flashvars', 'webkit-playsinline', 'x-webkit-airplay', 'data-original', 'src', 'controls', 'preload', 'type', 'width', 'height', 'size', 'alt']
|
58
|
+
end
|
9
59
|
|
10
|
-
def h(string, size=64)
|
11
|
-
return string unless string
|
12
|
-
string = emoji.replace_emoji_with_images(string, size)
|
13
|
-
string = auto_link(string)
|
14
|
-
string = clean(string)
|
15
60
|
end
|
16
|
-
|
17
|
-
def replace_emoji_with_images(string, size=64)
|
18
|
-
emoji.replace_emoji_with_images(string, size)
|
19
|
-
end
|
20
|
-
|
21
|
-
def clean(html, options = {})
|
22
|
-
options = { elements: sanitized_allowed_tags, attributes: { all: sanitized_allowed_attributes } } if options.empty?
|
23
|
-
Sanitize.clean(html, options)
|
24
|
-
end
|
25
|
-
|
26
|
-
def emoji
|
27
|
-
@emoji ||= Emoji.new
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def sanitized_allowed_tags
|
33
|
-
['a', 'p', 'br', 'img', 'abbr', 'mark', 'm', 'fieldset', 'legend', 'label', 'summary', 'details', 'address', 'map', 'area', 'td', 'tr', 'th', 'thead', 'tbody', 'tfoot', 'caption', 'table', 'h4', 'h5', 'h6', 'hr', 'span', 'em', 'dl', 'dt', 'dd', 'b', 'del', 'ins', 'small', 'pre', 'blockquote', 'strong', 'audio', 'video', 'source', 'ul', 'ol', 'li', 'i', 'embed', 'sub', 'sup']
|
34
|
-
end
|
35
|
-
|
36
|
-
def sanitized_allowed_attributes
|
37
|
-
['shape', 'coords', 'target', 'href', 'muted', 'volume', 'name', 'class', 'title', 'border', 'poster', 'loop', 'autoplay', 'allowfullscreen', 'fullscreen', 'align' , 'quality', 'allowscriptaccess', 'wmode', 'flashvars', 'webkit-playsinline', 'x-webkit-airplay', 'data-original', 'src', 'controls', 'preload', 'type', 'width', 'height', 'size', 'alt']
|
38
|
-
end
|
39
|
-
|
40
61
|
end
|
@@ -1,94 +1,72 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
module SimpleFormat
|
4
|
-
|
4
|
+
class AutoLink
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# 转换回行
|
15
|
-
text = nl2br(text).to_str
|
16
|
-
# 根据类型生成链接
|
17
|
-
case options[:link].to_sym
|
18
|
-
when :all then auto_link_email_addresses(auto_link_urls(text, &block), &block)
|
19
|
-
when :email_addresses then auto_link_email_addresses(text, &block)
|
20
|
-
when :urls then auto_link_urls(text, &block)
|
6
|
+
def initialize()
|
7
|
+
@regex = {
|
8
|
+
protocol: %r{(?: ((?:ed2k|ftp|http|https|irc|mailto|news|gopher|nntp|telnet|webcal|xmpp|callto|feed|svn|urn|aim|rsync|tag|ssh|sftp|rtsp|afs|file):)// | www\. )[^\s<]+}x,
|
9
|
+
href: [/<[^>]+$/, /^[^>]*>/, /<a\b.*?>/i, /<\/a>/i],
|
10
|
+
mail: /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/,
|
11
|
+
brackets: { ']' => '[', ')' => '(', '}' => '{' },
|
12
|
+
word_pattern: RUBY_VERSION < '1.9' ? '\w' : '\p{Word}'
|
13
|
+
}
|
21
14
|
end
|
22
|
-
end
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if string
|
28
|
-
string.gsub("\n\r","<br />").gsub("\r", "").gsub("\n", "<br />")
|
16
|
+
def all(text)
|
17
|
+
return text unless text
|
18
|
+
email_addresses( urls(text) )
|
29
19
|
end
|
30
|
-
end
|
31
|
-
|
32
|
-
AUTO_LINK_RE = %r{
|
33
|
-
(?: ((?:ed2k|ftp|http|https|irc|mailto|news|gopher|nntp|telnet|webcal|xmpp|callto|feed|svn|urn|aim|rsync|tag|ssh|sftp|rtsp|afs|file):)// | www\. )
|
34
|
-
[^\s<]+
|
35
|
-
}x
|
36
|
-
|
37
|
-
# regexps for determining context, used high-volume
|
38
|
-
AUTO_LINK_CRE = [/<[^>]+$/, /^[^>]*>/, /<a\b.*?>/i, /<\/a>/i]
|
39
|
-
|
40
|
-
AUTO_EMAIL_RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/
|
41
|
-
|
42
|
-
BRACKETS = { ']' => '[', ')' => '(', '}' => '{' }
|
43
20
|
|
44
|
-
|
21
|
+
# Turns all urls into clickable links. If a block is given, each url
|
22
|
+
# is yielded and the result is used as the link text.
|
23
|
+
def urls(text)
|
24
|
+
|
25
|
+
text.gsub(@regex[:protocol]) do
|
26
|
+
scheme, href = $1, $&
|
27
|
+
punctuation = []
|
45
28
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
else
|
58
|
-
# don't include trailing punctuation character as part of the URL
|
59
|
-
while href.sub!(/[^#{WORD_PATTERN}\/-]$/, '')
|
60
|
-
punctuation.push $&
|
61
|
-
if opening = BRACKETS[punctuation.last] and href.scan(opening).size > href.scan(punctuation.last).size
|
62
|
-
href << punctuation.pop
|
63
|
-
break
|
29
|
+
if auto_linked?($`, $')
|
30
|
+
# do not change string; URL is already linked
|
31
|
+
href
|
32
|
+
else
|
33
|
+
# don't include trailing punctuation character as part of the URL
|
34
|
+
while href.sub!(/[^#{@regex[:word_pattern]}\/-]$/, '')
|
35
|
+
punctuation.push $&
|
36
|
+
if opening = @regex[:brackets][punctuation.last] and href.scan(opening).size > href.scan(punctuation.last).size
|
37
|
+
href << punctuation.pop
|
38
|
+
break
|
39
|
+
end
|
64
40
|
end
|
65
|
-
end
|
66
41
|
|
67
|
-
|
68
|
-
|
42
|
+
link_text = block_given?? yield(href) : href
|
43
|
+
href = '//' + href unless scheme
|
69
44
|
|
70
|
-
|
45
|
+
"<a href='#{href}' target='_blank'>#{link_text}</a>" + punctuation.reverse.join('')
|
46
|
+
end
|
71
47
|
end
|
72
48
|
end
|
73
|
-
end
|
74
49
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
50
|
+
# Turns all email addresses into clickable links. If a block is given,
|
51
|
+
# each email is yielded and the result is used as the link text.
|
52
|
+
def email_addresses(text)
|
53
|
+
text.gsub(@regex[:mail]) do
|
54
|
+
text = $&
|
55
|
+
if auto_linked?($`, $')
|
56
|
+
text
|
57
|
+
else
|
58
|
+
display_text = (block_given?) ? yield(text) : text
|
59
|
+
# mail_to text, display_text
|
60
|
+
"<a href='mailto:#{text}'>#{display_text}</a>"
|
61
|
+
end
|
86
62
|
end
|
87
63
|
end
|
88
|
-
end
|
89
64
|
|
90
|
-
|
91
|
-
|
92
|
-
|
65
|
+
private
|
66
|
+
|
67
|
+
# Detects already linked context or position in the middle of a tag
|
68
|
+
def auto_linked?(left, right)
|
69
|
+
(left =~ @regex[:href][0] and right =~ @regex[:href][1]) or (left.rindex(@regex[:href][2]) and $' !~ @regex[:href][3])
|
70
|
+
end
|
93
71
|
end
|
94
72
|
end
|
data/lib/simple_format/emoji.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
require 'multi_json' unless defined?(::MultiJson)
|
3
|
+
require 'active_support/core_ext/string' unless ::String.respond_to?(:present?)
|
4
|
+
require 'active_support/core_ext/object/inclusion' unless ::String.respond_to?(:in?)
|
3
5
|
|
4
6
|
module SimpleFormat
|
5
7
|
class Emoji
|
@@ -23,9 +25,10 @@ module SimpleFormat
|
|
23
25
|
@emoji_name_regex = /:([a-z0-9\+\-_]+):/
|
24
26
|
@emoji_unicode_regex = /#{@emoji_by_unicode.keys.join('|')}/
|
25
27
|
end
|
28
|
+
|
26
29
|
# 主机地址
|
27
30
|
def asset_host
|
28
|
-
@asset_host || '
|
31
|
+
@asset_host || 'emoji.qiniudn.com'
|
29
32
|
end
|
30
33
|
# 设置主机地址
|
31
34
|
def asset_host=(host)
|
@@ -33,51 +36,69 @@ module SimpleFormat
|
|
33
36
|
end
|
34
37
|
# 资源路径
|
35
38
|
def asset_path
|
36
|
-
@asset_path || '/
|
39
|
+
@asset_path || '/'
|
37
40
|
end
|
38
41
|
# 设置路径
|
39
42
|
def asset_path=(path)
|
40
43
|
@asset_path = path
|
41
44
|
end
|
45
|
+
# 图标尺寸
|
46
|
+
def asset_size
|
47
|
+
@asset_size || ''
|
48
|
+
end
|
49
|
+
# 设置图标尺寸
|
50
|
+
def asset_size=(size)
|
51
|
+
@asset_size = size
|
52
|
+
end
|
53
|
+
# 分隔符
|
54
|
+
def asset_delimiter
|
55
|
+
@asset_delimiter || '_'
|
56
|
+
end
|
57
|
+
def asset_delimiter=(delimiter)
|
58
|
+
@asset_delimiter = delimiter
|
59
|
+
end
|
42
60
|
# 通过(名称、字符)替换表情
|
43
|
-
def replace_emoji_with_images(string
|
61
|
+
def replace_emoji_with_images(string)
|
44
62
|
return string unless string
|
45
|
-
|
46
63
|
html ||= string.dup
|
47
|
-
html = replace_name_with_images(html
|
48
|
-
html = replace_unicode_with_images(html.to_str
|
49
|
-
puts html
|
50
|
-
puts '_'*88 + 'replace_unicode_with_images'
|
64
|
+
html = replace_name_with_images(html)
|
65
|
+
html = replace_unicode_with_images(html.to_str)
|
51
66
|
return html
|
52
67
|
end
|
53
68
|
# 通过(名称)替换表情
|
54
|
-
def replace_name_with_images(string
|
69
|
+
def replace_name_with_images(string)
|
55
70
|
unless string && string.match(names_regex)
|
56
71
|
return string
|
57
72
|
end
|
58
73
|
|
59
74
|
string.to_str.gsub(names_regex) do |match|
|
60
75
|
if names.include?($1)
|
61
|
-
%Q{<img class="emoji" src="
|
76
|
+
%Q{<img class="emoji" src="//#{ image_url_for_name($1) }" />}
|
62
77
|
else
|
63
78
|
match
|
64
79
|
end
|
65
80
|
end
|
66
81
|
end
|
67
82
|
# 通过(字符)替换表情
|
68
|
-
def replace_unicode_with_images(string
|
83
|
+
def replace_unicode_with_images(string)
|
69
84
|
unless string && string.match(unicodes_regex)
|
70
85
|
return string
|
71
86
|
end
|
72
87
|
|
73
88
|
html ||= string.dup
|
74
89
|
html.gsub!(unicodes_regex) do |unicode|
|
75
|
-
%Q{<img class="emoji" src="
|
90
|
+
%Q{<img class="emoji" src="//#{ image_url_for_unicode(unicode) }" />}
|
76
91
|
end
|
77
92
|
end
|
78
93
|
# 通过(名称)合成图片地址
|
79
94
|
def image_url_for_name(name)
|
80
|
-
"#{asset_host}#{ File.join(asset_path, name) }.png"
|
95
|
+
image_url = "#{asset_host}#{ File.join(asset_path, name) }.png"
|
96
|
+
if image_url.present?
|
97
|
+
if asset_size.present? && asset_size.in?(sizes)
|
98
|
+
image_url = [image_url, asset_size].join(asset_delimiter)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
return image_url
|
81
102
|
end
|
82
103
|
# 通过(字符)合成图片地址
|
83
104
|
def image_url_for_unicode(unicode)
|
@@ -108,5 +129,12 @@ module SimpleFormat
|
|
108
129
|
def unicodes_regex
|
109
130
|
@emoji_unicode_regex
|
110
131
|
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
# 尺寸
|
136
|
+
def sizes
|
137
|
+
%W(16x16 24x24 32x32 48x48 56x56)
|
138
|
+
end
|
111
139
|
end
|
112
140
|
end
|
metadata
CHANGED
@@ -1,79 +1,79 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_format
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Howl王
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
15
|
-
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
23
21
|
requirements:
|
24
|
-
- -
|
22
|
+
- - '>='
|
25
23
|
- !ruby/object:Gem::Version
|
26
24
|
version: '0'
|
25
|
+
prerelease: false
|
26
|
+
type: :runtime
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sanitize
|
29
|
-
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
37
35
|
requirements:
|
38
|
-
- -
|
36
|
+
- - '>='
|
39
37
|
- !ruby/object:Gem::Version
|
40
38
|
version: '0'
|
39
|
+
prerelease: false
|
40
|
+
type: :runtime
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
|
-
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.5'
|
48
|
-
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
51
49
|
requirements:
|
52
|
-
- -
|
50
|
+
- - ~>
|
53
51
|
- !ruby/object:Gem::Version
|
54
52
|
version: '1.5'
|
53
|
+
prerelease: false
|
54
|
+
type: :development
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
|
-
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
-
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
65
63
|
requirements:
|
66
|
-
- -
|
64
|
+
- - '>='
|
67
65
|
- !ruby/object:Gem::Version
|
68
66
|
version: '0'
|
69
|
-
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
description:
|
70
70
|
email:
|
71
71
|
- howl.wong@gmail.com
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
-
|
76
|
+
- .gitignore
|
77
77
|
- Gemfile
|
78
78
|
- LICENSE.txt
|
79
79
|
- README.md
|
@@ -88,24 +88,24 @@ homepage: https://github.com/mimosa/simple_format/
|
|
88
88
|
licenses:
|
89
89
|
- MIT
|
90
90
|
metadata: {}
|
91
|
-
post_install_message:
|
91
|
+
post_install_message:
|
92
92
|
rdoc_options: []
|
93
93
|
require_paths:
|
94
94
|
- lib
|
95
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- -
|
97
|
+
- - '>='
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '0'
|
100
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - '>='
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
|
-
rubyforge_project:
|
107
|
-
rubygems_version: 2.2.
|
108
|
-
signing_key:
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.2.2
|
108
|
+
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: Returns text transformed into HTML using simple formatting rules.
|
111
111
|
test_files: []
|