friendly_format 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +11 -0
- data/LICENSE +201 -0
- data/NOTICE +10 -0
- data/README +45 -0
- data/Rakefile +58 -0
- data/TODO +6 -0
- data/friendly_format.gemspec +42 -0
- data/lib/friendly_format/set_common.rb +16 -0
- data/lib/friendly_format/set_strict.rb +12 -0
- data/lib/friendly_format/version.rb +3 -0
- data/lib/friendly_format.rb +171 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +192 -0
- data/tasks/git.rake +40 -0
- data/tasks/manifest.rake +48 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +39 -0
- data/tasks/rdoc.rake +50 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +279 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/test/sample/complex_article.txt +111 -0
- data/test/sample/complex_article_result.txt +108 -0
- data/test/test_friendly_format.rb +168 -0
- metadata +119 -0
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
|
+
<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
|
+
測試</a>
|
7
|
+
<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
|
+
<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>"/></a>
|
9
|
+
※ 引述《godfat (godfat 真常)》之銘言:
|
10
|
+
> 3. tuple + traits, 也就是一堆 template 技巧了
|
11
|
+
> class Dispatcher{
|
12
|
+
> template <class T>
|
13
|
+
> void sub(shared_ptr<T> p){
|
14
|
+
> get_tuple_data_field_by_type<T>(data).push_back(p);
|
15
|
+
> }
|
16
|
+
> tuple<A, B, C> data;
|
17
|
+
> };
|
18
|
+
|
19
|
+
以上 A, B, C 是指 timer_subscriber_list<A>, etc.
|
20
|
+
|
21
|
+
這個東西會需要從 T => tuple index 的 mapping
|
22
|
+
現在這部份做完了...........(template 沒忘太多啊哈哈)
|
23
|
+
|
24
|
+
#include <tr1/tuple>
|
25
|
+
#include <tr1/type_traits>
|
26
|
+
#include <iostream>
|
27
|
+
|
28
|
+
using namespace std::tr1;
|
29
|
+
|
30
|
+
// 拿來判斷兩個整數是否相同,這是為了檢查有沒有爆表
|
31
|
+
// 像是 tuple_element<3, tuple<int,int,int> >::type
|
32
|
+
// 這樣就是爆表,因為這 tuple 沒這麼大
|
33
|
+
template <bool> struct is_equal_type { typedef true_type type; };
|
34
|
+
template <> struct is_equal_type<false>{ typedef false_type type; };
|
35
|
+
|
36
|
+
// 定義相等的話,is_equal<1,1>::value 會是 1
|
37
|
+
// is_equal<1,2>::value 會是 0
|
38
|
+
// ::type 會是 true_type/false_type (from tr1)
|
39
|
+
template <int Lhs, int Rhs> struct is_equal{
|
40
|
+
enum{ value = Lhs == Rhs };
|
41
|
+
typedef typename is_equal_type<value>::type type;
|
42
|
+
};
|
43
|
+
|
44
|
+
template <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 <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 <class T, class Tuple, int Index>
|
55
|
+
struct type_index_check<T, Tuple, Index, false_type>{
|
56
|
+
enum{ value = type_index_imp<T, Tuple, Index+1>::value };
|
57
|
+
};
|
58
|
+
|
59
|
+
// 找到了!
|
60
|
+
template <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 <class T, class Tuple, int Index>
|
67
|
+
struct type_index_if<T, Tuple, Index, false_type>{
|
68
|
+
enum{ value = type_index_check<T, Tuple, Index,
|
69
|
+
typename is_equal<Index+1, tuple_size<Tuple>::value>::type>::value };
|
70
|
+
};
|
71
|
+
|
72
|
+
// 檢查兩個型別是否相同
|
73
|
+
template <class T, class Tuple, int Index>
|
74
|
+
struct type_index_imp{
|
75
|
+
enum{ value = type_index_if<T, Tuple, Index,
|
76
|
+
typename is_same<T, typename tuple_element<Index, Tuple>::type>::type>::value };
|
77
|
+
};
|
78
|
+
|
79
|
+
// simple wrapper
|
80
|
+
template <class T, class Tuple>
|
81
|
+
struct type_index{
|
82
|
+
enum{ value = type_index_imp<T, Tuple, 0>::value };
|
83
|
+
};
|
84
|
+
|
85
|
+
int main(){
|
86
|
+
typedef tuple<int, char, void> test_t;
|
87
|
+
std::cout << type_index<int, test_t>::value << std::endl;
|
88
|
+
std::cout << type_index<char, test_t>::value << std::endl;
|
89
|
+
std::cout << type_index<void, test_t>::value << std::endl;
|
90
|
+
std::cout << tuple_size<test_t>::value << std::endl;
|
91
|
+
// std::cout << type_index<int*, test_t>::value << 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<p>if missing end of p</p>', format_article(str, :a)
|
115
|
+
str = '<pre>asdasd<a>orz'
|
116
|
+
assert_equal '<pre>asdasd<a>orz</pre>', format_article(str, :a, :pre)
|
117
|
+
assert_equal '<pre>asdasd<a>orz</a></pre>', format_article(str, :a)
|
118
|
+
assert_equal '<pre>asdasd<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<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 λ x. x+1'
|
131
|
+
assert_equal str, format_article(str)
|
132
|
+
str = 'as you can see, use <img src="asd"/> 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><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 的開發頗有貢獻。</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
|