pidgin2adium 3.3.0 → 4.0.0.beta1
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.
- 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
|