friendly_format 0.5.1

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.
data/tasks/test.rake ADDED
@@ -0,0 +1,40 @@
1
+
2
+ if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
3
+ require 'rake/testtask'
4
+
5
+ namespace :test do
6
+
7
+ Rake::TestTask.new(:run) do |t|
8
+ t.libs = PROJ.libs
9
+ t.test_files = if test(?f, PROJ.test.file) then [PROJ.test.file]
10
+ else PROJ.test.files end
11
+ t.ruby_opts += PROJ.ruby_opts
12
+ t.ruby_opts += PROJ.test.opts
13
+ end
14
+
15
+ if HAVE_RCOV
16
+ desc 'Run rcov on the unit tests'
17
+ task :rcov => :clobber_rcov do
18
+ opts = PROJ.rcov.opts.dup << '-o' << PROJ.rcov.dir
19
+ opts = opts.join(' ')
20
+ files = if test(?f, PROJ.test.file) then [PROJ.test.file]
21
+ else PROJ.test.files end
22
+ files = files.join(' ')
23
+ sh "#{RCOV} #{files} #{opts}"
24
+ end
25
+
26
+ task :clobber_rcov do
27
+ rm_r 'coverage' rescue nil
28
+ end
29
+ end
30
+
31
+ end # namespace :test
32
+
33
+ desc 'Alias to test:run'
34
+ task :test => 'test:run'
35
+
36
+ task :clobber => 'test:clobber_rcov' if HAVE_RCOV
37
+
38
+ end
39
+
40
+ # EOF
@@ -0,0 +1,111 @@
1
+ http://phpbb.godfat.org/viewtopic.php?t=873
2
+ <pre> 作者 godfat (godfat 真常) 站內 ProjectX
3
+ 標題 Re: [PSC] variants timer
4
+ 時間 2008/03/04 Tue 00:34:54
5
+ http://phpbb.godfat.org/viewtopic.php?t=873
6
+ <a href="http://phpbb.godfat.org/viewtopic.php?t=873">
7
+ 測試</a>
8
+ <a href="http://phpbb.godfat.org/viewtopic.php?t=873">
9
+ <img src="http://phpbb.godfat.org/templates/subSilver/images/logo_phpBB.gif"/></a>
10
+ ※ 引述《godfat (godfat 真常)》之銘言:
11
+ > 3. tuple + traits, 也就是一堆 template 技巧了
12
+ > class Dispatcher{
13
+ > template <class T>
14
+ > void sub(shared_ptr<T> p){
15
+ > get_tuple_data_field_by_type<T>(data).push_back(p);
16
+ > }
17
+ > tuple<A, B, C> data;
18
+ > };
19
+
20
+ 以上 A, B, C 是指 timer_subscriber_list<A>, etc.
21
+
22
+ 這個東西會需要從 T => tuple index 的 mapping
23
+ 現在這部份做完了...........(template 沒忘太多啊哈哈)
24
+
25
+ #include <tr1/tuple>
26
+ #include <tr1/type_traits>
27
+ #include <iostream>
28
+
29
+ using namespace std::tr1;
30
+
31
+ // 拿來判斷兩個整數是否相同,這是為了檢查有沒有爆表
32
+ // 像是 tuple_element<3, tuple<int,int,int> >::type
33
+ // 這樣就是爆表,因為這 tuple 沒這麼大
34
+ template <bool> struct is_equal_type { typedef true_type type; };
35
+ template <> struct is_equal_type<false>{ typedef false_type type; };
36
+
37
+ // 定義相等的話,is_equal<1,1>::value 會是 1
38
+ // is_equal<1,2>::value 會是 0
39
+ // ::type 會是 true_type/false_type (from tr1)
40
+ template <int Lhs, int Rhs> struct is_equal{
41
+ enum{ value = Lhs == Rhs };
42
+ typedef typename is_equal_type<value>::type type;
43
+ };
44
+
45
+ template <class T, class Tuple, int Index> struct type_index_imp;
46
+
47
+ // 如果跑到這裡,表示爆表了,在我的 g++4.3 上會顯示:
48
+ // tuple.cpp:20: error: ‘type_not_found’ is not a member of "T"
49
+ template <class T, class Tuple, int Index, class Bool>
50
+ struct type_index_check{
51
+ enum{ value = T::type_not_found };
52
+ };
53
+
54
+ // 沒有爆表就繼續找吧
55
+ template <class T, class Tuple, int Index>
56
+ struct type_index_check<T, Tuple, Index, false_type>{
57
+ enum{ value = type_index_imp<T, Tuple, Index+1>::value };
58
+ };
59
+
60
+ // 找到了!
61
+ template <class T, class Tuple, int Index, class Bool>
62
+ struct type_index_if{
63
+ enum{ value = Index }; // found, stop recursion
64
+ };
65
+
66
+ // 不直接呼叫 imp, 呼叫 check 檢查是否爆表
67
+ template <class T, class Tuple, int Index>
68
+ struct type_index_if<T, Tuple, Index, false_type>{
69
+ enum{ value = type_index_check<T, Tuple, Index,
70
+ typename is_equal<Index+1, tuple_size<Tuple>::value>::type>::value };
71
+ };
72
+
73
+ // 檢查兩個型別是否相同
74
+ template <class T, class Tuple, int Index>
75
+ struct type_index_imp{
76
+ enum{ value = type_index_if<T, Tuple, Index,
77
+ typename is_same<T, typename tuple_element<Index, Tuple>::type>::type>::value };
78
+ };
79
+
80
+ // simple wrapper
81
+ template <class T, class Tuple>
82
+ struct type_index{
83
+ enum{ value = type_index_imp<T, Tuple, 0>::value };
84
+ };
85
+
86
+ int main(){
87
+ typedef tuple<int, char, void> test_t;
88
+ std::cout << type_index<int, test_t>::value << std::endl;
89
+ std::cout << type_index<char, test_t>::value << std::endl;
90
+ std::cout << type_index<void, test_t>::value << std::endl;
91
+ std::cout << tuple_size<test_t>::value << std::endl;
92
+ // std::cout << type_index<int*, test_t>::value << std::endl;
93
+ }
94
+
95
+ 輸出:
96
+ 0
97
+ 1
98
+ 2
99
+ 3
100
+
101
+ 最後一行註解拿掉,則顯示:
102
+ tuple.cpp:20: error: "type_not_found" is not a member of "T"
103
+
104
+ 這樣應該是蠻完整的了。有了這個之後.... 後面還有得做 XD
105
+ 至少還需要一個 tuple for_each, 這也會用 template 遞迴展開
106
+
107
+ --
108
+ ※ Orign: 群星的眷屬 chance.twbbs.org
109
+ ◆ Author: godfat From 220-135-28-18.HINET-IP.hinet.net</pre>
110
+
111
+ end of article...
@@ -0,0 +1,108 @@
1
+ <a href="http://phpbb.godfat.org/viewtopic.php?t=873" title="http://phpbb.godfat.org/viewtopic.php?t=873">http://phpbb.godfat.org/viewtopic.php?t=873</a><br /><pre> 作者 godfat (godfat 真常) 站內 ProjectX
2
+ 標題 Re: [PSC] variants timer
3
+ 時間 2008/03/04 Tue 00:34:54
4
+ <a href="http://phpbb.godfat.org/viewtopic.php?t=873" title="http://phpbb.godfat.org/viewtopic.php?t=873">http://phpbb.godfat.org/viewtopic.php?t=873</a>
5
+ &lt;a href="<a href="http://phpbb.godfat.org/viewtopic.php?t=873" title="http://phpbb.godfat.org/viewtopic.php?t=873">http://phpbb.godfat.org/viewtopic.php?t=873</a>">
6
+ 測試&lt;/a>
7
+ &lt;a href="<a href="http://phpbb.godfat.org/viewtopic.php?t=873" title="http://phpbb.godfat.org/viewtopic.php?t=873">http://phpbb.godfat.org/viewtopic.php?t=873</a>">
8
+ &lt;img src="<a href="http://phpbb.godfat.org/templates/subSilver/images/logo_phpBB.gif" title="http://phpbb.godfat.org/templates/subSilver/images/logo_phpBB.gif">http://phpbb.godfat.org/templates/subSilver/images/logo_phpBB.gif</a>"/>&lt;/a>
9
+ ※ 引述《godfat (godfat 真常)》之銘言:
10
+ > 3. tuple + traits, 也就是一堆 template 技巧了
11
+ > class Dispatcher{
12
+ > template &lt;class T>
13
+ > void sub(shared_ptr&lt;T> p){
14
+ > get_tuple_data_field_by_type&lt;T>(data).push_back(p);
15
+ > }
16
+ > tuple&lt;A, B, C> data;
17
+ > };
18
+
19
+ 以上 A, B, C 是指 timer_subscriber_list&lt;A>, etc.
20
+
21
+ 這個東西會需要從 T => tuple index 的 mapping
22
+ 現在這部份做完了...........(template 沒忘太多啊哈哈)
23
+
24
+ #include &lt;tr1/tuple>
25
+ #include &lt;tr1/type_traits>
26
+ #include &lt;iostream>
27
+
28
+ using namespace std::tr1;
29
+
30
+ // 拿來判斷兩個整數是否相同,這是為了檢查有沒有爆表
31
+ // 像是 tuple_element&lt;3, tuple&lt;int,int,int> >::type
32
+ // 這樣就是爆表,因為這 tuple 沒這麼大
33
+ template &lt;bool> struct is_equal_type { typedef true_type type; };
34
+ template &lt;> struct is_equal_type&lt;false>{ typedef false_type type; };
35
+
36
+ // 定義相等的話,is_equal&lt;1,1>::value 會是 1
37
+ // is_equal&lt;1,2>::value 會是 0
38
+ // ::type 會是 true_type/false_type (from tr1)
39
+ template &lt;int Lhs, int Rhs> struct is_equal{
40
+ enum{ value = Lhs == Rhs };
41
+ typedef typename is_equal_type&lt;value>::type type;
42
+ };
43
+
44
+ template &lt;class T, class Tuple, int Index> struct type_index_imp;
45
+
46
+ // 如果跑到這裡,表示爆表了,在我的 g++4.3 上會顯示:
47
+ // tuple.cpp:20: error: ‘type_not_found’ is not a member of "T"
48
+ template &lt;class T, class Tuple, int Index, class Bool>
49
+ struct type_index_check{
50
+ enum{ value = T::type_not_found };
51
+ };
52
+
53
+ // 沒有爆表就繼續找吧
54
+ template &lt;class T, class Tuple, int Index>
55
+ struct type_index_check&lt;T, Tuple, Index, false_type>{
56
+ enum{ value = type_index_imp&lt;T, Tuple, Index+1>::value };
57
+ };
58
+
59
+ // 找到了!
60
+ template &lt;class T, class Tuple, int Index, class Bool>
61
+ struct type_index_if{
62
+ enum{ value = Index }; // found, stop recursion
63
+ };
64
+
65
+ // 不直接呼叫 imp, 呼叫 check 檢查是否爆表
66
+ template &lt;class T, class Tuple, int Index>
67
+ struct type_index_if&lt;T, Tuple, Index, false_type>{
68
+ enum{ value = type_index_check&lt;T, Tuple, Index,
69
+ typename is_equal&lt;Index+1, tuple_size&lt;Tuple>::value>::type>::value };
70
+ };
71
+
72
+ // 檢查兩個型別是否相同
73
+ template &lt;class T, class Tuple, int Index>
74
+ struct type_index_imp{
75
+ enum{ value = type_index_if&lt;T, Tuple, Index,
76
+ typename is_same&lt;T, typename tuple_element&lt;Index, Tuple>::type>::type>::value };
77
+ };
78
+
79
+ // simple wrapper
80
+ template &lt;class T, class Tuple>
81
+ struct type_index{
82
+ enum{ value = type_index_imp&lt;T, Tuple, 0>::value };
83
+ };
84
+
85
+ int main(){
86
+ typedef tuple&lt;int, char, void> test_t;
87
+ std::cout &lt;&lt; type_index&lt;int, test_t>::value &lt;&lt; std::endl;
88
+ std::cout &lt;&lt; type_index&lt;char, test_t>::value &lt;&lt; std::endl;
89
+ std::cout &lt;&lt; type_index&lt;void, test_t>::value &lt;&lt; std::endl;
90
+ std::cout &lt;&lt; tuple_size&lt;test_t>::value &lt;&lt; std::endl;
91
+ // std::cout &lt;&lt; type_index&lt;int*, test_t>::value &lt;&lt; std::endl;
92
+ }
93
+
94
+ 輸出:
95
+ 0
96
+ 1
97
+ 2
98
+ 3
99
+
100
+ 最後一行註解拿掉,則顯示:
101
+ tuple.cpp:20: error: "type_not_found" is not a member of "T"
102
+
103
+ 這樣應該是蠻完整的了。有了這個之後.... 後面還有得做 XD
104
+ 至少還需要一個 tuple for_each, 這也會用 template 遞迴展開
105
+
106
+ --
107
+ ※ Orign: 群星的眷屬 chance.twbbs.org
108
+ ◆ Author: godfat From 220-135-28-18.HINET-IP.hinet.net</pre><br /><br />end of article...<br />
@@ -0,0 +1,168 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'minitest/unit'
5
+ MiniTest::Unit.autorun
6
+
7
+ require 'friendly_format'
8
+
9
+ # 2008-05-09 godfat
10
+ class TestFriendlyFormat < MiniTest::Unit::TestCase
11
+ include FriendlyFormat
12
+
13
+ def test_article
14
+ str =
15
+ ' http://friends.roodo.com/forum/viewTopic/10170
16
+ 用 Haskell 寫成的名軟體?
17
+
18
+ 主題發起人 : godfat 真常
19
+
20
+ 2008年04月02日 01:24
21
+ 第一個當然是首推唐鳳寫的 Pugs!
22
+ 是基於 Perl 6 一直實作困難,所以才決定寫 Pugs 當中繼者。
23
+
24
+ Pugs 無論對 Haskell 社群和 Perl 6 社群都有很大的影響。
25
+ 唐大師:
26
+ http://zh.wikipedia.org/wiki/唐鳳
27
+
28
+ 另一個就是 Darcs 了,非常強大的 revision control system,
29
+ 蠻多人在用的。理所當然,比 svn 先進多了。
30
+ svn 其實也差不多是要慢慢式微了...
31
+ 取而代之的大概會是 SVK, git, 和 Darcs 吧
32
+ 目前看到是這三個最多,都很先進。不過我對 git 沒好感。
33
+
34
+ 另一方面還有非常多,Haskell 正在成長中啊 ~~~
35
+ 很多知名 library 都有 haskell binding 了,wxWidgets,
36
+ OpenGL, 還有一些 web cgi 之類的東西也有。
37
+
38
+ 現在切入正是時機啊... XD'
39
+
40
+ assert_equal \
41
+ ' <a href="http://friends.roodo.com/forum/viewTopic/10170" title="http://friends.roodo.com/forum/viewTopic/10170">http://friends.roodo.com/forum/viewTopic/10170</a>
42
+ 用 Haskell 寫成的名軟體?
43
+
44
+ 主題發起人 : godfat 真常
45
+
46
+ 2008年04月02日 01:24
47
+ 第一個當然是首推唐鳳寫的 Pugs!
48
+ 是基於 Perl 6 一直實作困難,所以才決定寫 Pugs 當中繼者。
49
+
50
+ Pugs 無論對 Haskell 社群和 Perl 6 社群都有很大的影響。
51
+ 唐大師:
52
+ <a href="http://zh.wikipedia.org/wiki/" title="http://zh.wikipedia.org/wiki/">http://zh.wikipedia.org/wiki/</a>唐鳳
53
+
54
+ 另一個就是 Darcs 了,非常強大的 revision control system,
55
+ 蠻多人在用的。理所當然,比 svn 先進多了。
56
+ svn 其實也差不多是要慢慢式微了...
57
+ 取而代之的大概會是 SVK, git, 和 Darcs 吧
58
+ 目前看到是這三個最多,都很先進。不過我對 git 沒好感。
59
+
60
+ 另一方面還有非常多,Haskell 正在成長中啊 ~~~
61
+ 很多知名 library 都有 haskell binding 了,wxWidgets,
62
+ OpenGL, 還有一些 web cgi 之類的東西也有。
63
+
64
+ 現在切入正是時機啊... XD', s = format_autolink(str)
65
+ assert_equal s, format_autolink_regexp(str)
66
+ end
67
+ def test_persent
68
+ str =
69
+ 'XDDDD
70
+ http://www.amazon.co.jp/%E3%80%8C%E7%84%94~%E3%83%9B%E3%83%A0%E3%83%A9%E3%80%8D~Ar-tonelico2-hymmnos-concert-Side-%E7%B4%85~/dp/B000VKZL30/ref=pd_sbs_sw_img_2 orz'
71
+
72
+ assert_equal \
73
+ 'XDDDD
74
+ <a href="http://www.amazon.co.jp/%E3%80%8C%E7%84%94~%E3%83%9B%E3%83%A0%E3%83%A9%E3%80%8D~Ar-tonelico2-hymmnos-concert-Side-%E7%B4%85~/dp/B000VKZL30/ref=pd_sbs_sw_img_2" title="http://www.amazon.co.jp/%E3%80%8C%E7%84%94~%E3%83%9B%E3%83%A0%E3%83%A9%E3%80%8D~Ar-tonelico2-hymmnos-concert-Side-%E7%B4%85~/dp/B000VKZL30/ref=pd_sbs_sw_img_2">http://www.amazon.co.jp/%E3%80%8C%E7%84%94~%E3%83%9B%E3%83%A0%E3%83%A9%E...</a> orz', s = format_autolink(str)
75
+ assert_equal s, format_autolink_regexp(str)
76
+ end
77
+ def test_img_src
78
+ str =
79
+ 'Thirst for Knowledge
80
+ <img src="http://friends.roodo.com/images/diary_photos_large/15386/MjMyNjYtdGhpcnN0X2Zvcl9rbm93bGVkZ2U=.jpg" />
81
+
82
+ 2007年12月14日
83
+ '
84
+ assert_equal str, s = format_autolink(str)
85
+ assert_equal s, format_autolink_regexp(str)
86
+ end
87
+ def test_wikipedia_persent
88
+ str = 'http://en.wikipedia.org/wiki/Haskell_%28programming_language%29'
89
+ assert_equal \
90
+ '<a href="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29" title="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29">http://en.wikipedia.org/wiki/Haskell_%28programming_language%29</a>', s = format_autolink(str)
91
+ assert_equal s, format_autolink_regexp(str)
92
+ end
93
+ def test_wikipedia_parentheses
94
+ str = 'http://en.wikipedia.org/wiki/Haskell_(programming_language)'
95
+ assert_equal \
96
+ '<a href="http://en.wikipedia.org/wiki/Haskell_" title="http://en.wikipedia.org/wiki/Haskell_" class="XD">http://en.wikipedia.org/wiki/Haskell_</a>(programming_language)', s = format_autolink(str, :class => 'XD')
97
+ assert_equal s, format_autolink_regexp(str, :class => 'XD')
98
+ end
99
+ def test_fixing_html
100
+ str = 'test<p>if missing end of p'
101
+ assert_equal 'test<p>if missing end of p</p>', format_autolink(str)
102
+ str = 'test<p>if missing<a> end of p'
103
+ assert_equal 'test<p>if missing<a> end of p</a></p>', format_autolink(str)
104
+ end
105
+ def test_www_url
106
+ str = 'go to www.google.com to see if you can see'
107
+ assert_equal 'go to <a href="http://www.google.com" title="http://www.google.com">www.google.com</a> to see if you can see',
108
+ s = format_autolink(str)
109
+ assert_equal s, format_autolink_regexp(str)
110
+ end
111
+ def test_escape_html_and_correct_html
112
+ str = 'test<p>if missing end of p'
113
+ assert_equal 'test<p>if missing end of p</p>', format_article(str, :p)
114
+ assert_equal 'test&lt;p>if missing end of p&lt;/p>', format_article(str, :a)
115
+ str = '<pre>asdasd<a>orz'
116
+ assert_equal '<pre>asdasd&lt;a>orz</pre>', format_article(str, :a, :pre)
117
+ assert_equal '&lt;pre>asdasd<a>orz</a>&lt;/pre>', format_article(str, :a)
118
+ assert_equal '<pre>asdasd&lt;a>orz</pre>', format_article(str, :pre)
119
+ str = 'orz<img>asd'
120
+ assert_equal 'orz<img />asd', format_article(str, :img)
121
+ assert_equal 'orz&lt;img>asd', format_article(str)
122
+ end
123
+ def test_trim_url
124
+ str = 'test with http://890123456789012345678901234567890123456789012345678901234567890123456789.com'
125
+
126
+ assert_equal 'test with <a href="http://890123456789012345678901234567890123456789012345678901234567890123456789.com" title="http://890123456789012345678901234567890123456789012345678901234567890123456789.com">http://89012345678901234567890123456789012345678901234567890123456789012...</a>', s = format_article(str)
127
+ assert_equal s, format_autolink_regexp(str)
128
+ end
129
+ def test_escape_html
130
+ str = 'a lambda expression is &lambda; x. x+1'
131
+ assert_equal str, format_article(str)
132
+ str = 'as you can see, use &lt;img src="asd"/&gt; to use'
133
+ assert_equal str, format_article(str)
134
+ end
135
+ def test_html_with_pre_and_newline2br
136
+ result = File.read('test/sample/complex_article_result.txt')
137
+ input = File.read('test/sample/complex_article.txt')
138
+
139
+ assert_equal result, format_article(input, :pre)
140
+ assert_equal result, format_article(input, SetCommon.new)
141
+ end
142
+ def test_simple_link
143
+ s = '今天是我一歲生日 <a href="http://godfat.org/" title="http://godfat.org/">http://godfat.org/</a> 真的嗎?'
144
+ assert_equal s, format_article(s, :a)
145
+ assert_equal s, format_autolink_regexp(s)
146
+ end
147
+ def test_extra_xd_at_tail
148
+ input = '<img style="float: right;" src="http://flolac.iis.sinica.edu.tw/lambdawan/sites/default/files/ruby.png.thumb.jpg"/>
149
+ <a href="http://www.ruby-forum.com/topic/169911">JRuby 1.1.5 Released</a>
150
+ <a href="http://jruby.codehaus.org/">JRuby</a> 是用 Java 寫成的 Ruby interpreter/compiler.
151
+ 原本 JRuby 只是普通的 open source project, 後來因為 <a href="http://www.sun.com/">Sun Microsystem</a>,
152
+ 也就是 Java 的開發公司,看好 JRuby, 於是僱用 JRuby team,
153
+ full time 開發 JRuby. 後來 JRuby 在各方面都快速大幅成長,
154
+ 尤其效能有了不可思議的大幅提昇,可能是 Sun 有一些撇步沒有公開吧。
155
+
156
+ 效能大幅提昇之後,JRuby 開發沒有停緩,接下來是非常大量的相容性提昇。
157
+ 也從原本僅支援 interpret mode 到後來也支援 just in time 與 ahead of time 的
158
+ compilation mode. 非常驚人的開發速度。
159
+ <zzz><xd>
160
+ 此外,其中一位開發者,<a href="http://blog.headius.com/">Charles Nutter</a> 也經常參與 <a href="http://www.ruby-forum.com/forum/14">ruby-core</a> 的討論,
161
+ 對於 Ruby 的開發頗有貢獻。'
162
+
163
+ expected = '<img src="http://flolac.iis.sinica.edu.tw/lambdawan/sites/default/files/ruby.png.thumb.jpg" style="float: right;" /><br /><a href="http://www.ruby-forum.com/topic/169911">JRuby 1.1.5 Released</a><br /><a href="http://jruby.codehaus.org/">JRuby</a> 是用 Java 寫成的 Ruby interpreter/compiler.<br />原本 JRuby 只是普通的 open source project, 後來因為 <a href="http://www.sun.com/">Sun Microsystem</a>,<br />也就是 Java 的開發公司,看好 JRuby, 於是僱用 JRuby team,<br />full time 開發 JRuby. 後來 JRuby 在各方面都快速大幅成長,<br />尤其效能有了不可思議的大幅提昇,可能是 Sun 有一些撇步沒有公開吧。<br /><br />效能大幅提昇之後,JRuby 開發沒有停緩,接下來是非常大量的相容性提昇。<br />也從原本僅支援 interpret mode 到後來也支援 just in time 與 ahead of time 的<br />compilation mode. 非常驚人的開發速度。<br /><zzz>&lt;xd><br />此外,其中一位開發者,<a href="http://blog.headius.com/">Charles Nutter</a> 也經常參與 <a href="http://www.ruby-forum.com/forum/14">ruby-core</a> 的討論,<br />對於 Ruby 的開發頗有貢獻。&lt;/xd></zzz>'
164
+
165
+ assert_equal expected, format_article(input, SetCommon.new, :zzz)
166
+
167
+ end
168
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: friendly_format
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
5
+ platform: ruby
6
+ authors:
7
+ - "Lin Jen-Shin (a.k.a. godfat \xE7\x9C\x9F\xE5\xB8\xB8)"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-12 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hpricot
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: bones
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: minitest
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.3.0
44
+ version:
45
+ description: make user input be valid xhtml and format it with gsub("\n", "<br/>") etc. you can partially allow some tags and don't escape them.
46
+ email: godfat (XD) godfat.org
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - CHANGES
53
+ - LICENSE
54
+ - NOTICE
55
+ - README
56
+ - TODO
57
+ - friendly_format.gemspec
58
+ files:
59
+ - CHANGES
60
+ - LICENSE
61
+ - NOTICE
62
+ - README
63
+ - Rakefile
64
+ - TODO
65
+ - friendly_format.gemspec
66
+ - lib/friendly_format.rb
67
+ - lib/friendly_format/set_common.rb
68
+ - lib/friendly_format/set_strict.rb
69
+ - lib/friendly_format/version.rb
70
+ - tasks/ann.rake
71
+ - tasks/bones.rake
72
+ - tasks/gem.rake
73
+ - tasks/git.rake
74
+ - tasks/manifest.rake
75
+ - tasks/notes.rake
76
+ - tasks/post_load.rake
77
+ - tasks/rdoc.rake
78
+ - tasks/rubyforge.rake
79
+ - tasks/setup.rb
80
+ - tasks/spec.rake
81
+ - tasks/svn.rake
82
+ - tasks/test.rake
83
+ - test/sample/complex_article.txt
84
+ - test/sample/complex_article_result.txt
85
+ - test/test_friendly_format.rb
86
+ has_rdoc: true
87
+ homepage: http://github.com/godfat/friendly_format
88
+ post_install_message:
89
+ rdoc_options:
90
+ - --diagram
91
+ - --charset=utf-8
92
+ - --inline-source
93
+ - --line-numbers
94
+ - --promiscuous
95
+ - --main
96
+ - README
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: "0"
104
+ version:
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: "0"
110
+ version:
111
+ requirements: []
112
+
113
+ rubyforge_project: ludy
114
+ rubygems_version: 1.3.1
115
+ signing_key:
116
+ specification_version: 2
117
+ summary: make user input be valid xhtml and format it with gsub("\n", "<br/>") etc. you can partially allow some tags and don't escape them.
118
+ test_files:
119
+ - test/test_friendly_format.rb