pidgin2adium 3.3.0 → 4.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -3
- data/.rspec +1 -0
- data/.simplecov +5 -0
- data/.travis.yml +12 -0
- data/Gemfile +6 -1
- data/LICENSE +17 -17
- data/NEWS.md +89 -0
- data/README.md +60 -0
- data/Rakefile +5 -23
- data/bin/pidgin2adium +19 -90
- data/lib/pidgin2adium.rb +4 -136
- data/lib/pidgin2adium/adium_chat_file_creator.rb +64 -0
- data/lib/pidgin2adium/file_finder.rb +23 -0
- data/lib/pidgin2adium/runner.rb +23 -0
- data/lib/pidgin2adium/version.rb +1 -1
- data/pidgin2adium.gemspec +25 -21
- data/spec/features/parse_pidgin_log_file_spec.rb +50 -0
- data/spec/fixtures/input/input.html +3 -0
- data/spec/fixtures/output.xml +5 -0
- data/spec/pidgin2adium/adium_chat_file_creator_spec.rb +89 -0
- data/spec/pidgin2adium/file_finder_spec.rb +63 -0
- data/spec/spec_helper.rb +17 -59
- metadata +96 -89
- data/.autotest +0 -28
- data/ChangeLog +0 -79
- data/Manifest.txt +0 -18
- data/README.rdoc +0 -122
- data/config/website.yml +0 -2
- data/ext/balance_tags_c/balance_tags_c.c +0 -198
- data/ext/balance_tags_c/extconf.rb +0 -4
- data/lib/pidgin2adium/log_converter.rb +0 -71
- data/lib/pidgin2adium/log_file.rb +0 -100
- data/lib/pidgin2adium/log_parser.rb +0 -2
- data/lib/pidgin2adium/message.rb +0 -2
- data/lib/pidgin2adium/messages/all.rb +0 -5
- data/lib/pidgin2adium/messages/auto_reply_message.rb +0 -11
- data/lib/pidgin2adium/messages/event.rb +0 -17
- data/lib/pidgin2adium/messages/message.rb +0 -39
- data/lib/pidgin2adium/messages/status_message.rb +0 -17
- data/lib/pidgin2adium/messages/xml_message.rb +0 -40
- data/lib/pidgin2adium/parsers/all.rb +0 -3
- data/lib/pidgin2adium/parsers/basic_parser.rb +0 -456
- data/lib/pidgin2adium/parsers/html_log_parser.rb +0 -125
- data/lib/pidgin2adium/parsers/text_log_parser.rb +0 -39
- data/spec/balance_tags_c_extn_spec.rb +0 -47
- data/spec/basic_parser_spec.rb +0 -219
- data/spec/html_log_parser_spec.rb +0 -150
- data/spec/log_converter_spec.rb +0 -48
- data/spec/log_file_spec.rb +0 -176
- data/spec/logfiles/2006-12-21.223606.txt +0 -3
- data/spec/logfiles/2008-01-15.071445-0500PST.htm +0 -5
- data/spec/logfiles/2008-01-15.071445-0500PST.html +0 -5
- data/spec/pidgin2adium_spec.rb +0 -252
- data/spec/spec.opts +0 -1
- data/spec/test-output/README.md +0 -1
- data/spec/test-output/html_log_output.xml +0 -6
- data/spec/test-output/text_log_output.xml +0 -4
- data/spec/text_log_parser_spec.rb +0 -42
- data/tasks/extconf.rake +0 -8
- data/tasks/extconf/balance_tags_c.rake +0 -47
@@ -1,125 +0,0 @@
|
|
1
|
-
# HtmlLogParser class, a subclass of BasicParser.
|
2
|
-
# Used for parse()ing HTML logs.
|
3
|
-
|
4
|
-
require 'balance_tags_c'
|
5
|
-
|
6
|
-
module Pidgin2Adium
|
7
|
-
class HtmlLogParser < BasicParser
|
8
|
-
def initialize(src_path, user_aliases, force_conversion = false)
|
9
|
-
super(src_path, user_aliases, force_conversion)
|
10
|
-
@timestamp_rx = '\(((?:\d{4}-\d{2}-\d{2} )?\d{1,2}:\d{1,2}:\d{1,2}(?: [AP]M)?)\)'
|
11
|
-
|
12
|
-
# @line_regex matches a line in an HTML log file other than the
|
13
|
-
# first time matches on either "2008-11-17 14:12" or "14:12"
|
14
|
-
# @line_regex match obj:
|
15
|
-
# 0: timestamp, extended or not
|
16
|
-
# 1: screen name or alias, if alias set
|
17
|
-
# 2: "<AUTO-REPLY>" or nil
|
18
|
-
# 3: message body
|
19
|
-
# The ":" is optional to allow for strings like "(17:12:21) <b>***Gabe B-W</b> is confused<br/>"
|
20
|
-
@line_regex = /#{@timestamp_rx} ?<b>(.+?) ?(<AUTO-REPLY>)?:?<\/b> ?(.+)<br ?\/>/o
|
21
|
-
# @line_regex_status matches a status line
|
22
|
-
# @line_regex_status match obj:
|
23
|
-
# 0: timestamp
|
24
|
-
# 1: status message
|
25
|
-
@line_regex_status = /#{@timestamp_rx} ?<b> (.+)<\/b><br ?\/>/o
|
26
|
-
end
|
27
|
-
|
28
|
-
# Returns a cleaned string.
|
29
|
-
# Removes the following tags from _text_:
|
30
|
-
# * html
|
31
|
-
# * body
|
32
|
-
# * font
|
33
|
-
# * a with no innertext, e.g. <a href="blah"></a>
|
34
|
-
# And removes the following style declarations:
|
35
|
-
# * color: #000000 (just turns text black)
|
36
|
-
# * font-family
|
37
|
-
# * font-size
|
38
|
-
# * background
|
39
|
-
# * em (really it's changed to <span style="font-style: italic;">)
|
40
|
-
# Since each <span> has only one style declaration, spans with these
|
41
|
-
# declarations are removed (but the text inside them is preserved).
|
42
|
-
def cleanup(text)
|
43
|
-
# Sometimes this is in there. I don't know why.
|
44
|
-
text.gsub!(%r{</FONT HSPACE='\d'>}, '')
|
45
|
-
# We can remove <font> safely since Pidgin and Adium both show bold
|
46
|
-
# using <span style="font-weight: bold;"> except Pidgin uses single
|
47
|
-
# quotes while Adium uses double quotes.
|
48
|
-
text.gsub!(/<\/?(?:html|body|font)(?: .+?)?>/, '') # very important!
|
49
|
-
|
50
|
-
text.tr!("\r", '')
|
51
|
-
# Remove empty lines
|
52
|
-
text.gsub!("\n\n", "\n")
|
53
|
-
|
54
|
-
# Remove newlines that end the file, since they screw up the
|
55
|
-
# newline -> <br/> conversion
|
56
|
-
text.gsub!(/\n\Z/, '')
|
57
|
-
|
58
|
-
# Replace newlines with "<br/>" unless they end a chat line.
|
59
|
-
# This must go after we remove <font> tags.
|
60
|
-
text.gsub!(/\n(?!#{@timestamp_rx})/, '<br/>')
|
61
|
-
|
62
|
-
# These empty links are sometimes appended to every line in a chat,
|
63
|
-
# for some weird reason. Remove them.
|
64
|
-
text.gsub!(%r{<a href=['"].+?['"]>\s*?</a>}, '')
|
65
|
-
|
66
|
-
# Replace single quotes inside tags with double quotes so we can
|
67
|
-
# easily change single quotes to entities.
|
68
|
-
# For spans, removes a space after the final declaration if it exists.
|
69
|
-
text.gsub!(/<span style='([^']+?;) ?'>/, '<span style="\1">')
|
70
|
-
text.gsub!(/([a-z]+=)'(.+?)'/, '\1"\2"')
|
71
|
-
=begin
|
72
|
-
text.gsub!(/<a href='(.+?)'>/, '<a href="\1">')
|
73
|
-
text.gsub!(/<img src='([^']+?)'/, '<img src="\1"')
|
74
|
-
text.gsub!(/ alt='([^']+?)'/, ' alt="\1"')
|
75
|
-
=end
|
76
|
-
text.gsub!("'", ''')
|
77
|
-
|
78
|
-
# This actually does match stuff, but doesn't group it correctly. :(
|
79
|
-
# text.gsub!(%r{<span style="((?:.+?;)+)">(.*?)</span>}) do |s|
|
80
|
-
text.gsub!(%r{<span style="(.+?)">(.*?)</span>}) do |s|
|
81
|
-
# Remove empty spans.
|
82
|
-
next if $2 == ''
|
83
|
-
|
84
|
-
# style = style declaration
|
85
|
-
# innertext = text inside <span>
|
86
|
-
style, innertext = $1, $2
|
87
|
-
# TODO: replace double quotes with """, but only outside tags; may still be tags inside spans
|
88
|
-
# innertext.gsub!("")
|
89
|
-
|
90
|
-
styleparts = style.split(/; ?/)
|
91
|
-
styleparts.map! do |p|
|
92
|
-
if p[0,5] == 'color'
|
93
|
-
if p.include?('color: #000000')
|
94
|
-
next
|
95
|
-
elsif p =~ /(color: #[0-9a-fA-F]{6})(>.*)?/
|
96
|
-
# Regarding the bit with the ">", sometimes this happens:
|
97
|
-
# <span style="color: #000000>today;">today was busy</span>
|
98
|
-
# Then p = "color: #000000>today"
|
99
|
-
# Or it can end in ">;", with no text before the semicolon.
|
100
|
-
# So keep the color but remove the ">" and anything following it.
|
101
|
-
next($1)
|
102
|
-
end
|
103
|
-
else
|
104
|
-
# don't remove font-weight
|
105
|
-
case p
|
106
|
-
when /^font-family/ then next
|
107
|
-
when /^font-size/ then next
|
108
|
-
when /^background/ then next
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end.compact!
|
112
|
-
unless styleparts.empty?
|
113
|
-
style = styleparts.join('; ')
|
114
|
-
innertext = "<span style=\"#{style};\">#{innertext}</span>"
|
115
|
-
end
|
116
|
-
innertext
|
117
|
-
end
|
118
|
-
# Pidgin uses <em>, Adium uses <span>
|
119
|
-
if text.gsub!('<em>', '<span style="font-style: italic;">')
|
120
|
-
text.gsub!('</em>', '</span>')
|
121
|
-
end
|
122
|
-
return text
|
123
|
-
end
|
124
|
-
end # END HtmlLogParser class
|
125
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# TextLogParser class, a subclass of BasicParser.
|
2
|
-
# Used for parse()ing text logs.
|
3
|
-
|
4
|
-
module Pidgin2Adium
|
5
|
-
class TextLogParser < BasicParser
|
6
|
-
def initialize(src_path, user_aliases, force_conversion = false)
|
7
|
-
super(src_path, user_aliases, force_conversion)
|
8
|
-
@timestamp_rx = '\((\d{1,2}:\d{1,2}:\d{1,2})\)'
|
9
|
-
|
10
|
-
# @line_regex matches a line in a TXT log file other than the first
|
11
|
-
# @line_regex matchdata:
|
12
|
-
# 0: timestamp
|
13
|
-
# 1: screen name or alias, if alias set
|
14
|
-
# 2: "<AUTO-REPLY>" or nil
|
15
|
-
# 3: message body
|
16
|
-
@line_regex = /#{@timestamp_rx} (.*?) ?(<AUTO-REPLY>)?: (.*)/o
|
17
|
-
# @line_regex_status matches a status line
|
18
|
-
# @line_regex_status matchdata:
|
19
|
-
# 0: timestamp
|
20
|
-
# 1: status message
|
21
|
-
@line_regex_status = /#{@timestamp_rx} ([^:]+)/o
|
22
|
-
end
|
23
|
-
|
24
|
-
def cleanup(text)
|
25
|
-
text.tr!("\r", '')
|
26
|
-
# Escape entities since this will be in XML
|
27
|
-
text.gsub!('&', '&') # escape '&' first
|
28
|
-
text.gsub!('<', '<')
|
29
|
-
text.gsub!('>', '>')
|
30
|
-
text.gsub!('"', '"')
|
31
|
-
text.gsub!("'", ''')
|
32
|
-
# Replace newlines with "<br/>" unless they end a chat line.
|
33
|
-
# Add the <br/> after converting to < etc so we
|
34
|
-
# don't escape the tag.
|
35
|
-
text.gsub!(/\n(?!(#{@timestamp_rx}|\Z))/, '<br/>')
|
36
|
-
return text
|
37
|
-
end
|
38
|
-
end # END TextLogParser class
|
39
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'ext', 'balance_tags_c'))
|
4
|
-
require "balance_tags_c"
|
5
|
-
|
6
|
-
describe "BalanceTagsCExtension" do
|
7
|
-
describe "text without tags" do
|
8
|
-
it "should be left untouched" do
|
9
|
-
text = "Foo bar baz, this is my excellent test text!"
|
10
|
-
Pidgin2Adium.balance_tags_c(text).should == text
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "text with tags" do
|
15
|
-
it "should be balanced correctly" do
|
16
|
-
Pidgin2Adium.balance_tags_c('<p><b>this is unbalanced!').should == "<p><b>this is unbalanced!</b></p>"
|
17
|
-
end
|
18
|
-
|
19
|
-
# Make sure it doesn't segfault
|
20
|
-
it "should be balanced correctly when run many times" do
|
21
|
-
text = <<-LATIN
|
22
|
-
Sequi unde et nobis ipsum. Expedita temporibus aut adipisci debitis
|
23
|
-
porro ducimus. Dignissimos est tenetur vero error voluptatem quidem
|
24
|
-
ducimus. Sapiente non occaecati omnis non provident sint ut. Repellat
|
25
|
-
laudantium quis aperiam ad fugit accusantium placeat itaque. Quia
|
26
|
-
velit voluptatem sint aliquid rem quam occaecati doloremque. Eos
|
27
|
-
provident ut suscipit reprehenderit mollitia. Non vitae voluptatem
|
28
|
-
laudantium quis a et. In libero voluptas aliquam.Veniam minima
|
29
|
-
consequatur quod. Voluptatem quibusdam ut consequatur et ratione
|
30
|
-
repellat. Iusto est aspernatur consequatur ex nostrum voluptas
|
31
|
-
voluptas et. Rerum voluptas et veritatis ratione voluptates ut iusto
|
32
|
-
ut. Aspernatur sed molestiae sint eveniet asperiores mollitia qui.
|
33
|
-
Rerum laudantium architecto soluta. Earum qui ut vel corporis ullam
|
34
|
-
doloribus voluptatem. Nemo quo recusandae ut. Deleniti vel ea qui ut
|
35
|
-
perferendis. Est dolor ducimus voluptatem nemo quis et animi
|
36
|
-
reprehenderit. Laudantium voluptas adipisci alias. Ut aut soluta
|
37
|
-
repellat consequuntur quidem. Deserunt voluptatem eum eveniet cum.Quia
|
38
|
-
consectetur at ut quisquam occaecati et sint. Sint voluptatem quaerat
|
39
|
-
qui molestiae ratione voluptatem. Autem labore quos perferendis enim
|
40
|
-
fuga deleniti recusandae. Aut libero quo cum autem voluptatem.
|
41
|
-
LATIN
|
42
|
-
2_000.times do
|
43
|
-
Pidgin2Adium.balance_tags_c("<p><b>#{text}").should == "<p><b>#{text}</b></p>"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/spec/basic_parser_spec.rb
DELETED
@@ -1,219 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "BasicParser" do
|
4
|
-
it "should include Pidgin2Adium" do
|
5
|
-
Pidgin2Adium::BasicParser.included_modules.include?(Pidgin2Adium).should be_true
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "#parse" do
|
9
|
-
it "should return false" do
|
10
|
-
bp = Pidgin2Adium::BasicParser.new(@text_logfile_path,
|
11
|
-
@aliases)
|
12
|
-
bp.parse().should be_false
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#create_adium_time" do
|
17
|
-
before(:each) do
|
18
|
-
@first_line_time = "4/18/2007 11:02:00 AM"
|
19
|
-
@time = "2007-08-20 12:33:13"
|
20
|
-
@minimal_time = "04:22:05 AM"
|
21
|
-
@minimal_time_2 = "04:22:05"
|
22
|
-
@invalid_time = "Hammer time!"
|
23
|
-
|
24
|
-
# Use HTML logfile because it has an explicit timezone (-0500), so we
|
25
|
-
# don't have to calculate it out.
|
26
|
-
@bp = Pidgin2Adium::BasicParser.new(@html_logfile_path,
|
27
|
-
@aliases)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should parse a first line time correctly" do
|
31
|
-
time = @bp.create_adium_time(@first_line_time)
|
32
|
-
time.should =~ /2007-04-18T11:02:00[-+]\d{2}:00/
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should parse a normal time correctly" do
|
36
|
-
time = @bp.create_adium_time(@time)
|
37
|
-
time.should =~ /2007-08-20T12:33:13[-+]\d{2}:00/
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should parse a minimal time correctly" do
|
41
|
-
time = @bp.create_adium_time(@minimal_time)
|
42
|
-
time.should =~ /2008-01-15T04:22:05[-+]\d{2}:00/
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should parse a minimal time without AM/PM correctly" do
|
46
|
-
time = @bp.create_adium_time(@minimal_time_2)
|
47
|
-
time.should =~ /2008-01-15T04:22:05[-+]\d{2}:00/
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should return an array of nils for an invalid time" do
|
51
|
-
time = @bp.create_adium_time(@invalid_time)
|
52
|
-
time.should be_nil
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "#pre_parse!" do
|
57
|
-
it "should raise an error for an invalid first line" do
|
58
|
-
bp = Pidgin2Adium::BasicParser.new(
|
59
|
-
File.join(@current_dir,
|
60
|
-
"logfiles",
|
61
|
-
"invalid-first-line.txt"),
|
62
|
-
@aliases)
|
63
|
-
lambda do
|
64
|
-
bp.pre_parse!()
|
65
|
-
end.should raise_error(Pidgin2Adium::InvalidFirstLineError)
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should return true when everything can be parsed" do
|
69
|
-
bp = Pidgin2Adium::BasicParser.new(@html_logfile_path,
|
70
|
-
@aliases)
|
71
|
-
bp.pre_parse!.should be_true
|
72
|
-
end
|
73
|
-
|
74
|
-
describe "correctly setting variables" do
|
75
|
-
before do
|
76
|
-
@bp = Pidgin2Adium::BasicParser.new(@html_logfile_path, @aliases)
|
77
|
-
@bp.pre_parse!()
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should correctly set @service" do
|
81
|
-
@bp.instance_variable_get('@service').should == 'aim'
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should correctly set user_SN" do
|
85
|
-
@bp.instance_variable_get('@user_SN').should == 'othersn'
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should correctly set partner_SN" do
|
89
|
-
@bp.instance_variable_get('@partner_SN').should == 'aolsystemmsg'
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should correctly set basic_time_info" do
|
93
|
-
@bp.instance_variable_get('@basic_time_info').should == {:year=>2008, :mon=>1, :mday=>15}
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should correctly set adium_chat_time_start" do
|
97
|
-
@bp.instance_variable_get('@adium_chat_time_start').should == '2008-01-15T07:14:45-05:00'
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe "#get_sender_by_alias" do
|
103
|
-
before(:each) do
|
104
|
-
@my_alias = "Gabe B-W"
|
105
|
-
@my_SN = "awesomesn" # normalized from "awesome SN"
|
106
|
-
|
107
|
-
@partner_alias = "Leola Farber III"
|
108
|
-
@partner_SN = "BUDDY_PERSON" # not normalized
|
109
|
-
# Use text logfile since it has aliases set up.
|
110
|
-
@bp = Pidgin2Adium::BasicParser.new(@text_logfile_path,
|
111
|
-
@my_alias)
|
112
|
-
end
|
113
|
-
|
114
|
-
it "should return my SN when passed my alias" do
|
115
|
-
@bp.get_sender_by_alias(@my_alias).should == @my_SN
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should return my SN when passed my alias with an action" do
|
119
|
-
@bp.get_sender_by_alias("***#{@my_alias}").should == @my_SN
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should return partner's SN when passed partner's alias" do
|
123
|
-
@bp.get_sender_by_alias(@partner_alias).should == @partner_SN
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe "#create_msg" do
|
128
|
-
before(:each) do
|
129
|
-
body = "Your screen name (otherSN) is now signed into " +
|
130
|
-
"AOL(R) Instant Messenger (TM) in 2 locations. " +
|
131
|
-
"To sign off the other location(s), reply to this message " + "with the number 1. Click " +
|
132
|
-
"<a href='http://www.aim.com/password/routing.adp'>here</a> " +
|
133
|
-
"for more information."
|
134
|
-
@matches = ['2008-01-15T07.14.45-05:00', # time
|
135
|
-
'AOL System Msg', # alias
|
136
|
-
nil, # not an auto-reply
|
137
|
-
body # message body
|
138
|
-
]
|
139
|
-
@auto_reply_matches = @matches.dup
|
140
|
-
@auto_reply_matches[2] = '<AUTO-REPLY>'
|
141
|
-
|
142
|
-
@bp = Pidgin2Adium::BasicParser.new(@text_logfile_path,
|
143
|
-
"Gabe B-W")
|
144
|
-
end
|
145
|
-
|
146
|
-
|
147
|
-
it "should return XMLMessage class for a normal message" do
|
148
|
-
@bp.create_msg(@matches).should
|
149
|
-
be_instance_of(Pidgin2Adium::XMLMessage)
|
150
|
-
end
|
151
|
-
|
152
|
-
it "should return AutoReplyMessage class for an auto reply" do
|
153
|
-
@bp.create_msg(@auto_reply_matches).should
|
154
|
-
be_instance_of(Pidgin2Adium::AutoReplyMessage)
|
155
|
-
end
|
156
|
-
|
157
|
-
it "should return nil if the time is nil" do
|
158
|
-
@matches[0] = nil
|
159
|
-
@bp.create_msg(@matches).should be_nil
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
describe "#create_status_or_event_msg" do
|
164
|
-
before(:each) do
|
165
|
-
# not yet converted to Adium format
|
166
|
-
@time = "2007-08-20 12:33:13"
|
167
|
-
@alias = "Gabe B-W"
|
168
|
-
@status_map = {
|
169
|
-
"#{@alias} logged in." => 'online',
|
170
|
-
"#{@alias} logged out." => 'offline',
|
171
|
-
"#{@alias} has signed on." => 'online',
|
172
|
-
"#{@alias} has signed off." => 'offline',
|
173
|
-
"#{@alias} has gone away." => 'away',
|
174
|
-
"#{@alias} is no longer away." => 'available',
|
175
|
-
"#{@alias} has become idle." => 'idle',
|
176
|
-
"#{@alias} is no longer idle." => 'available'
|
177
|
-
}
|
178
|
-
|
179
|
-
# Small subset of all events
|
180
|
-
@libpurple_event_msg = "Starting transfer of cute kitties.jpg from Gabe B-W"
|
181
|
-
@event_msg = "You missed 8 messages from Gabe B-W because they were too large"
|
182
|
-
@event_type = 'chat-error'
|
183
|
-
|
184
|
-
@ignored_event_msg = "Gabe B-W is now known as gbw.<br/>"
|
185
|
-
|
186
|
-
@bp = Pidgin2Adium::BasicParser.new(@html_logfile_path,
|
187
|
-
@alias)
|
188
|
-
end
|
189
|
-
|
190
|
-
it "should map statuses correctly" do
|
191
|
-
@status_map.each do |message, status|
|
192
|
-
return_value = @bp.create_status_or_event_msg([@time,
|
193
|
-
message])
|
194
|
-
return_value.should be_instance_of(Pidgin2Adium::StatusMessage)
|
195
|
-
return_value.status.should == status
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
it "should map libpurple events correctly" do
|
200
|
-
return_val = @bp.create_status_or_event_msg([@time,
|
201
|
-
@libpurple_event_msg])
|
202
|
-
return_val.should be_instance_of(Pidgin2Adium::Event)
|
203
|
-
return_val.event_type.should == 'libpurpleEvent'
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should map non-libpurple events correctly" do
|
207
|
-
return_val = @bp.create_status_or_event_msg([@time,
|
208
|
-
@event_msg])
|
209
|
-
return_val.should be_instance_of(Pidgin2Adium::Event)
|
210
|
-
return_val.event_type.should == @event_type
|
211
|
-
end
|
212
|
-
|
213
|
-
it "should return nil for ignored events" do
|
214
|
-
return_val = @bp.create_status_or_event_msg([@time,
|
215
|
-
@ignored_event_msg])
|
216
|
-
return_val.should be_nil
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
@@ -1,150 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "HtmlLogParser" do
|
4
|
-
before(:each) do
|
5
|
-
# @year, @am, and @pm are not required. @time is.
|
6
|
-
# So @year + @time is a valid time,
|
7
|
-
# as is @time, and @year + @time + @am.
|
8
|
-
@year = '2007-10-28 '
|
9
|
-
@time = '4:46:20'
|
10
|
-
@am = ' AM'
|
11
|
-
@pm = ' PM'
|
12
|
-
@hlp = Pidgin2Adium::HtmlLogParser.new(@html_logfile_path,
|
13
|
-
@aliases)
|
14
|
-
@clean = "clean"
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should have Pidgin2Adium.balance_tags_c available" do
|
18
|
-
Pidgin2Adium.should respond_to(:balance_tags_c)
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "#cleanup" do
|
22
|
-
it "should remove html, body, and font tags" do
|
23
|
-
dirty_text = %Q{<html><body type="ichat"><font color="red">#{@clean}</font></body></html>}
|
24
|
-
@hlp.cleanup(dirty_text).should == @clean
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should remove those weird <FONT HSPACE> tags" do
|
28
|
-
dirty = %Q{</FONT HSPACE='2'>#{@clean}}
|
29
|
-
@hlp.cleanup(dirty).should == @clean
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should remove \\r" do
|
33
|
-
dirty = [@clean, @clean, @clean].join("\r")
|
34
|
-
@hlp.cleanup(dirty).should == @clean * 3
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should remove empty lines" do
|
38
|
-
dirty = "#{@clean}\n\n"
|
39
|
-
@hlp.cleanup(dirty).should == @clean
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should replace newlines with <br/>" do
|
43
|
-
dirty = "\n#{@clean}"
|
44
|
-
@hlp.cleanup(dirty).should == "<br/>#{@clean}"
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should remove empty links" do
|
48
|
-
dirty = %Q{<a href="awesomelink"> </a>#{@clean}}
|
49
|
-
dirty += %Q{<a href='awesomelink'></a>#{@clean}}
|
50
|
-
@hlp.cleanup(dirty).should == @clean + @clean
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "with <span>s" do
|
54
|
-
it "should remove font-family" do
|
55
|
-
dirty = %Q{<span style='font-family: Helvetica;'>#{@clean}</span>}
|
56
|
-
@hlp.cleanup(dirty).should == @clean
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should remove font-size" do
|
60
|
-
dirty = %Q{<span style="font-size: 6;">#{@clean}</span>}
|
61
|
-
@hlp.cleanup(dirty).should == @clean
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should remove background" do
|
65
|
-
dirty = %Q{<span style="background: #00afaf;">#{@clean}</span>}
|
66
|
-
@hlp.cleanup(dirty).should == @clean
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should remove color=#00000" do
|
70
|
-
dirty = %Q{<span style="color: #000000;">#{@clean}</span>}
|
71
|
-
@hlp.cleanup(dirty).should == @clean
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should not remove color != #00000" do
|
75
|
-
dirty = %Q{<span style="color: #01ABcdef;">#{@clean}</span>}
|
76
|
-
@hlp.cleanup(dirty).should == dirty
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should remove improperly-formatted colors" do
|
80
|
-
dirty = %Q{<span style="color: #0;">#{@clean}</span>}
|
81
|
-
@hlp.cleanup(dirty).should == @clean
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should replace <em> with italic font-style" do
|
85
|
-
dirty = "<em>#{@clean}</em>"
|
86
|
-
clean = %Q{<span style="font-style: italic;">#{@clean}</span>}
|
87
|
-
@hlp.cleanup(dirty).should == clean
|
88
|
-
end
|
89
|
-
|
90
|
-
it "shouldn't modify clean text" do
|
91
|
-
@hlp.cleanup(@clean).should == @clean
|
92
|
-
end
|
93
|
-
|
94
|
-
# This implicitly tests a lot of other things, but they've been tested
|
95
|
-
# before this too.
|
96
|
-
it "should remove a trailing space after style declaration and replace double quotes" do
|
97
|
-
dirty_span_open = "<span style='color: #afaf00; font-size: 14pt; font-weight: bold; '>"
|
98
|
-
# Replaced double quotes, removed space before ">"
|
99
|
-
clean_span_open = '<span style="color: #afaf00;">'
|
100
|
-
dirty = dirty_span_open + @clean + "</span>"
|
101
|
-
@hlp.cleanup(dirty).should == clean_span_open + @clean + "</span>"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
describe "#parse" do
|
107
|
-
before(:each) do
|
108
|
-
@logfile = @hlp.parse()
|
109
|
-
end
|
110
|
-
|
111
|
-
it "should return a LogFile instance" do
|
112
|
-
@logfile.should be_instance_of(Pidgin2Adium::LogFile)
|
113
|
-
end
|
114
|
-
|
115
|
-
it "should return a LogFile with the correct number of chat_lines" do
|
116
|
-
@logfile.chat_lines.size.should == 3
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should return a LogFile with the correct message type" do
|
120
|
-
@logfile.chat_lines.map{|x| x.class }.should == [Pidgin2Adium::XMLMessage] * 3
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should return a LogFile with the correct data" do
|
124
|
-
first_msg = @logfile.chat_lines[0]
|
125
|
-
second_msg = @logfile.chat_lines[1]
|
126
|
-
third_msg = @logfile.chat_lines[2]
|
127
|
-
|
128
|
-
first_msg.sender.should == "aolsystemmsg"
|
129
|
-
first_msg.buddy_alias.should == "AOL System Msg"
|
130
|
-
# Use regex to ignore time zone
|
131
|
-
first_msg.time.should =~ /^2008-01-15T07:14:45[-+]\d{2}:00$/
|
132
|
-
# This fails due to balance_tags_c().
|
133
|
-
good_body = %Q{Your screen name (otherSN) is now signed into AOL(R) Instant Messenger (TM) in 2 locations.} + " " +
|
134
|
-
%Q{To sign off the other location(s), reply to this message with the number 1.} + " " +
|
135
|
-
%Q{Click <a href="http://www.aim.com/password/routing.adp">here</a> for more information.}
|
136
|
-
first_msg.body.should == good_body
|
137
|
-
|
138
|
-
second_msg.sender.should == "othersn"
|
139
|
-
second_msg.buddy_alias.should == "Gabe B-W"
|
140
|
-
second_msg.time.should =~ /^2008-01-15T07:14:48[-+]\d{2}:00$/
|
141
|
-
second_msg.body.should == "1"
|
142
|
-
|
143
|
-
third_msg.sender.should == "aolsystemmsg"
|
144
|
-
third_msg.buddy_alias.should == "AOL System Msg"
|
145
|
-
# Use regex to ignore time zone
|
146
|
-
third_msg.time.should =~ /^2008-01-15T07:14:48[-+]\d{2}:00$/
|
147
|
-
third_msg.body.should == "Your other AIM sessions have been signed-off. You are now signed-on from 1 location(s)."
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|