pidgin2adium 3.1.0 → 3.1.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/ChangeLog CHANGED
@@ -1,3 +1,10 @@
1
+ === 3.1.1 / 2010-08-13
2
+ * Moved BasicParser and its subclasses into parsers/ subdir
3
+ - You can now do "require 'pidgin2adium/parsers/all'",
4
+ though the old "require 'pidgin2adium/log_parser" will still work
5
+ * Moved Message and its subclasses into messages/ subdir
6
+ - You can now do "require 'pidgin2adium/messages/all'",
7
+ though the old "require 'pidgin2adium/message" will still work
1
8
  === 3.1.0 / 2010-08-13
2
9
  * Compatible with Ruby 1.9!
3
10
  - removed dependency on "parsedate" library, which 1.9 doesn't have
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.0
1
+ 3.1.1
@@ -14,6 +14,7 @@ module Pidgin2Adium
14
14
  # StatusMessage:: status
15
15
  class LogFile
16
16
  include Pidgin2Adium
17
+ include Enumerable
17
18
  def initialize(chat_lines, service, user_SN, partner_SN, adium_chat_time_start)
18
19
  @chat_lines = chat_lines
19
20
  @user_SN = user_SN
@@ -1,3 +1,2 @@
1
- require 'pidgin2adium/basic_parser'
2
- require 'pidgin2adium/text_log_parser'
3
- require 'pidgin2adium/html_log_parser'
1
+ # For backwards compatibility with Pidgin2Adium < 3.1.1
2
+ require 'pidgin2adium/parsers/all'
@@ -1,97 +1,2 @@
1
- # The Message class and its subclasses, each used for holding one line of a
2
- # chat.
3
-
4
- module Pidgin2Adium
5
- # A holding object for each line of the chat. It is subclassed as
6
- # appropriate (eg AutoReplyMessage). Each subclass (but not Message
7
- # itself) has its own to_s which prints out its information in a format
8
- # appropriate for putting in an Adium log file.
9
- # Subclasses: XMLMessage, AutoReplyMessage, StatusMessage, Event.
10
- class Message
11
- def initialize(sender, time, buddy_alias)
12
- # The sender's screen name
13
- @sender = sender
14
- # The time the message was sent, in Adium format (e.g.
15
- # "2008-10-05T22:26:20-0800")
16
- @time = time
17
- # The receiver's alias (NOT screen name)
18
- @buddy_alias = buddy_alias
19
- end
20
- attr_accessor :sender, :time, :buddy_alias
21
- end
22
-
23
- # Basic message with body text (as opposed to pure status messages, which
24
- # have no body).
25
- class XMLMessage < Message
26
- def initialize(sender, time, buddy_alias, body)
27
- super(sender, time, buddy_alias)
28
- @body = body
29
- @styled_body = '<div><span style="font-family: Helvetica; font-size: 12pt;">%s</span></div>' % @body
30
- normalize_body!()
31
- end
32
- attr_accessor :body
33
-
34
- def to_s
35
- return sprintf('<message sender="%s" time="%s" alias="%s">%s</message>' << "\n",
36
- @sender, @time, @buddy_alias, @styled_body)
37
- end
38
-
39
- # Balances mismatched tags, normalizes body style, and fixes actions
40
- # so they are in Adium style (Pidgin uses "***Buddy waves at you", Adium uses
41
- # "*Buddy waves at you*").
42
- def normalize_body!
43
- normalize_body_entities!()
44
- # Fix mismatched tags. Yes, it's faster to do it per-message
45
- # than all at once.
46
- @body = Pidgin2Adium.balance_tags_c(@body)
47
- if @buddy_alias[0,3] == '***'
48
- # "***<alias>" is what pidgin sets as the alias for a /me action
49
- @buddy_alias.slice!(0,3)
50
- @body = '*' << @body << '*'
51
- end
52
- end
53
-
54
- # Escapes entities.
55
- def normalize_body_entities!
56
- # Convert '&' to '&amp;' only if it's not followed by an entity.
57
- @body.gsub!(/&(?!lt|gt|amp|quot|apos)/, '&amp;')
58
- end
59
- end # END XMLMessage class
60
-
61
- # An auto reply message.
62
- class AutoReplyMessage < XMLMessage
63
- def to_s
64
- return sprintf('<message sender="%s" time="%s" auto="true" alias="%s">%s</message>' << "\n",
65
- @sender, @time, @buddy_alias, @styled_body)
66
- end
67
- end # END AutoReplyMessage class
68
-
69
- # A message saying e.g. "Blahblah has gone away."
70
- class StatusMessage < Message
71
- def initialize(sender, time, buddy_alias, status)
72
- super(sender, time, buddy_alias)
73
- @status = status
74
- end
75
- attr_accessor :status
76
-
77
- def to_s
78
- return sprintf('<status type="%s" sender="%s" time="%s" alias="%s"/>' << "\n", @status, @sender, @time, @buddy_alias)
79
- end
80
- end # END StatusMessage class
81
-
82
- # Pidgin does not have Events, but Adium does. Pidgin mostly uses system
83
- # messages to display what Adium calls events. These include sending a file,
84
- # starting a Direct IM connection, or an error in chat.
85
- class Event < XMLMessage
86
- def initialize(sender, time, buddy_alias, body, event_type)
87
- super(sender, time, buddy_alias, body)
88
- @event_type = event_type
89
- end
90
- attr_accessor :event_type
91
-
92
- def to_s
93
- return sprintf('<event type="%s" sender="%s" time="%s" alias="%s">%s</event>',
94
- @event_type, @sender, @time, @buddy_alias, @styled_body)
95
- end
96
- end # END Event class
97
- end
1
+ # For backwards compatibility with Pidgin2Adium < 3.1.1
2
+ require 'pidgin2adium/message/all'
@@ -0,0 +1,5 @@
1
+ require 'pidgin2adium/messages/message.rb'
2
+ require 'pidgin2adium/messages/xml_message.rb'
3
+ require 'pidgin2adium/messages/auto_reply_message.rb'
4
+ require 'pidgin2adium/messages/event.rb'
5
+ require 'pidgin2adium/messages/status_message.rb'
@@ -0,0 +1,11 @@
1
+ # The Message class's subclasses, each used for holding one line of a chat.
2
+
3
+ module Pidgin2Adium
4
+ # An auto reply message.
5
+ class AutoReplyMessage < XMLMessage
6
+ def to_s
7
+ return sprintf('<message sender="%s" time="%s" auto="true" alias="%s">%s</message>' << "\n",
8
+ @sender, @time, @buddy_alias, @styled_body)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Pidgin2Adium
2
+ # Pidgin does not have Events, but Adium does. Pidgin mostly uses system
3
+ # messages to display what Adium calls events. These include sending a file,
4
+ # starting a Direct IM connection, or an error in chat.
5
+ class Event < XMLMessage
6
+ def initialize(sender, time, buddy_alias, body, event_type)
7
+ super(sender, time, buddy_alias, body)
8
+ @event_type = event_type
9
+ end
10
+ attr_accessor :event_type
11
+
12
+ def to_s
13
+ return sprintf('<event type="%s" sender="%s" time="%s" alias="%s">%s</event>',
14
+ @event_type, @sender, @time, @buddy_alias, @styled_body)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # The Message class and its subclasses, each used for holding one line of a
2
+ # chat.
3
+
4
+ module Pidgin2Adium
5
+ # A holding object for each line of the chat. It is subclassed as
6
+ # appropriate (eg AutoReplyMessage). Each subclass (but not Message
7
+ # itself) has its own to_s which prints out its information in a format
8
+ # appropriate for putting in an Adium log file.
9
+ # Subclasses: XMLMessage, AutoReplyMessage, StatusMessage, Event.
10
+ class Message
11
+ def initialize(sender, time, buddy_alias)
12
+ # The sender's screen name
13
+ @sender = sender
14
+ # The time the message was sent, in Adium format (e.g.
15
+ # "2008-10-05T22:26:20-0800")
16
+ @time = time
17
+ # The receiver's alias (NOT screen name)
18
+ @buddy_alias = buddy_alias
19
+ end
20
+ attr_accessor :sender, :time, :buddy_alias
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # The Message class's subclasses, each used for holding one line of a chat.
2
+
3
+ module Pidgin2Adium
4
+ # A message saying e.g. "Blahblah has gone away."
5
+ class StatusMessage < Message
6
+ def initialize(sender, time, buddy_alias, status)
7
+ super(sender, time, buddy_alias)
8
+ @status = status
9
+ end
10
+ attr_accessor :status
11
+
12
+ def to_s
13
+ return sprintf('<status type="%s" sender="%s" time="%s" alias="%s"/>' << "\n",
14
+ @status, @sender, @time, @buddy_alias)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ module Pidgin2Adium
2
+ # Basic message with body text (as opposed to pure status messages, which
3
+ # have no body).
4
+ class XMLMessage < Message
5
+ def initialize(sender, time, buddy_alias, body)
6
+ super(sender, time, buddy_alias)
7
+ @body = body
8
+ @styled_body = '<div><span style="font-family: Helvetica; font-size: 12pt;">%s</span></div>' % @body
9
+ normalize_body!()
10
+ end
11
+ attr_accessor :body
12
+
13
+ def to_s
14
+ return sprintf('<message sender="%s" time="%s" alias="%s">%s</message>' << "\n",
15
+ @sender, @time, @buddy_alias, @styled_body)
16
+ end
17
+
18
+ # Balances mismatched tags, normalizes body style, and fixes actions
19
+ # so they are in Adium style (Pidgin uses "***Buddy waves at you", Adium uses
20
+ # "*Buddy waves at you*").
21
+ def normalize_body!
22
+ normalize_body_entities!()
23
+ # Fix mismatched tags. Yes, it's faster to do it per-message
24
+ # than all at once.
25
+ @body = Pidgin2Adium.balance_tags_c(@body)
26
+ if @buddy_alias[0,3] == '***'
27
+ # "***<alias>" is what pidgin sets as the alias for a /me action
28
+ @buddy_alias.slice!(0,3)
29
+ @body = '*' << @body << '*'
30
+ end
31
+ end
32
+
33
+ # Escapes all entities in @body except for "&lt;", "&gt;", "&amp;", "&quot;",
34
+ # and "&apos;".
35
+ def normalize_body_entities!
36
+ # Convert '&' to '&amp;' only if it's not followed by an entity.
37
+ @body.gsub!(/&(?!lt|gt|amp|quot|apos)/, '&amp;')
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ require 'pidgin2adium/parsers/basic_parser.rb'
2
+ require 'pidgin2adium/parsers/text_log_parser.rb'
3
+ require 'pidgin2adium/parsers/html_log_parser.rb'
@@ -10,7 +10,7 @@ require 'date'
10
10
  require 'time'
11
11
 
12
12
  require 'pidgin2adium/log_file'
13
- require 'pidgin2adium/message'
13
+ require 'pidgin2adium/messages/all'
14
14
 
15
15
  module Pidgin2Adium
16
16
  # Empty class. Raise'd by LogParser if the first line of a log is not
@@ -182,8 +182,7 @@ module Pidgin2Adium
182
182
  if tz_match and tz_match[1]
183
183
  tz_offset = tz_match[1]
184
184
  else
185
- # "-0500" (3d rather than 2d to allow for "+")
186
- tz_offset = sprintf('%+03d00', Time.zone_offset(Time.now.zone) / 3600)
185
+ tz_offset = Pidgin2Adium::DEFAULT_TZ_OFFSET
187
186
  end
188
187
  return tz_offset
189
188
  end
data/lib/pidgin2adium.rb CHANGED
@@ -4,7 +4,8 @@
4
4
  # them in the Adium log directory.
5
5
 
6
6
  require 'fileutils'
7
- require 'pidgin2adium/log_parser'
7
+ require 'time'
8
+ require 'pidgin2adium/parsers/all'
8
9
 
9
10
  module Pidgin2Adium
10
11
  # Returned by LogFile.write_out if the output logfile already exists.
@@ -13,6 +14,8 @@ module Pidgin2Adium
13
14
  # These files/directories show up in Dir.entries()
14
15
  BAD_DIRS = %w{. .. .DS_Store Thumbs.db .system}
15
16
  VERSION = "3.1.0"
17
+ # "-0500" (3d rather than 2d to allow for "+")
18
+ DEFAULT_TZ_OFFSET = sprintf('%+03d00', Time.zone_offset(Time.now.zone) / 3600)
16
19
  # For displaying after we finish converting
17
20
  @@oops_messages = []
18
21
  @@error_messages = []
data/pidgin2adium.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pidgin2adium}
8
- s.version = "3.1.0"
8
+ s.version = "3.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gabe Berke-Williams"]
@@ -36,14 +36,20 @@ Gem::Specification.new do |s|
36
36
  "ext/balance_tags_c/balance_tags_c.c",
37
37
  "ext/balance_tags_c/extconf.rb",
38
38
  "lib/pidgin2adium.rb",
39
- "lib/pidgin2adium/balance_tags.rb",
40
- "lib/pidgin2adium/basic_parser.rb",
41
- "lib/pidgin2adium/html_log_parser.rb",
42
39
  "lib/pidgin2adium/log_converter.rb",
43
40
  "lib/pidgin2adium/log_file.rb",
44
41
  "lib/pidgin2adium/log_parser.rb",
45
42
  "lib/pidgin2adium/message.rb",
46
- "lib/pidgin2adium/text_log_parser.rb",
43
+ "lib/pidgin2adium/messages/all.rb",
44
+ "lib/pidgin2adium/messages/auto_reply_message.rb",
45
+ "lib/pidgin2adium/messages/event.rb",
46
+ "lib/pidgin2adium/messages/message.rb",
47
+ "lib/pidgin2adium/messages/status_message.rb",
48
+ "lib/pidgin2adium/messages/xml_message.rb",
49
+ "lib/pidgin2adium/parsers/all.rb",
50
+ "lib/pidgin2adium/parsers/basic_parser.rb",
51
+ "lib/pidgin2adium/parsers/html_log_parser.rb",
52
+ "lib/pidgin2adium/parsers/text_log_parser.rb",
47
53
  "pidgin2adium.gemspec",
48
54
  "spec/balance_tags_c_extn_spec.rb",
49
55
  "spec/basic_parser_spec.rb",
@@ -14,30 +14,21 @@ describe "LogFile" do
14
14
  "2010-08-10T22:55:17-0500",
15
15
  "2010-08-10T22:55:22-0500"]
16
16
 
17
- @messages = [
18
- Pidgin2Adium::XMLMessage.new(@user_SN,
19
- @start_time,
20
- @user_alias,
21
- "Hello!"),
22
- Pidgin2Adium::StatusMessage.new(@partner_SN,
23
- times[1],
24
- @partner_alias,
25
- "Matz has gone away"),
26
- Pidgin2Adium::Event.new(@user_SN,
27
- times[2],
28
- @user_alias,
29
- "gabebw logged in.",
30
- 'online'),
31
- Pidgin2Adium::AutoReplyMessage.new(@partner_SN,
32
- times[3],
33
- @partner_alias,
34
- "This is an away message")
35
- ]
36
- @logfile = Pidgin2Adium::LogFile.new(@messages,
37
- 'aim',
38
- @user_SN,
39
- @partner_SN,
40
- @start_time)
17
+ message_1 = Pidgin2Adium::XMLMessage.new(@user_SN, @start_time,
18
+ @user_alias, "Hello!")
19
+ message_2 = Pidgin2Adium::StatusMessage.new(@partner_SN, times[1],
20
+ @partner_alias, "Matz has gone away")
21
+
22
+ message_3 = Pidgin2Adium::Event.new(@user_SN, times[2], @user_alias,
23
+ "gabebw logged in.", 'online')
24
+
25
+ message_4 = Pidgin2Adium::AutoReplyMessage.new(@partner_SN, times[3],
26
+ @partner_alias,
27
+ "This is an away message")
28
+
29
+ @messages = [message_1, message_2, message_3, message_4]
30
+ @logfile = Pidgin2Adium::LogFile.new(@messages, 'aim', @user_SN,
31
+ @partner_SN, @start_time)
41
32
  end
42
33
 
43
34
  describe "attributes" do
@@ -69,12 +60,17 @@ describe "LogFile" do
69
60
  end
70
61
  end
71
62
 
72
- describe "#each" do
73
- it "should yield the messages" do
74
- n = 0
75
- @logfile.each do |x|
76
- x.should == @messages[n]
77
- n += 1
63
+
64
+ describe "enumerable methods" do
65
+ it "should include Enumerable" do
66
+ Pidgin2Adium::LogFile.included_modules.include?(Enumerable).should be_true
67
+ end
68
+
69
+ describe "#each_with_index" do
70
+ it "should yield the correct messages" do
71
+ @logfile.each_with_index do |msg, n|
72
+ msg.should == @messages[n]
73
+ end
78
74
  end
79
75
  end
80
76
  end
data/spec/spec_helper.rb CHANGED
@@ -16,7 +16,6 @@ prefork_block = lambda do
16
16
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'ext', 'balance_tags_c'))
17
17
 
18
18
  require 'pidgin2adium'
19
- require 'faker'
20
19
  require 'time' # for Time.zone_offset
21
20
 
22
21
  rspec_configure_block = lambda do |config|
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 3
7
7
  - 1
8
- - 0
9
- version: 3.1.0
8
+ - 1
9
+ version: 3.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gabe Berke-Williams
@@ -86,14 +86,20 @@ files:
86
86
  - ext/balance_tags_c/balance_tags_c.c
87
87
  - ext/balance_tags_c/extconf.rb
88
88
  - lib/pidgin2adium.rb
89
- - lib/pidgin2adium/balance_tags.rb
90
- - lib/pidgin2adium/basic_parser.rb
91
- - lib/pidgin2adium/html_log_parser.rb
92
89
  - lib/pidgin2adium/log_converter.rb
93
90
  - lib/pidgin2adium/log_file.rb
94
91
  - lib/pidgin2adium/log_parser.rb
95
92
  - lib/pidgin2adium/message.rb
96
- - lib/pidgin2adium/text_log_parser.rb
93
+ - lib/pidgin2adium/messages/all.rb
94
+ - lib/pidgin2adium/messages/auto_reply_message.rb
95
+ - lib/pidgin2adium/messages/event.rb
96
+ - lib/pidgin2adium/messages/message.rb
97
+ - lib/pidgin2adium/messages/status_message.rb
98
+ - lib/pidgin2adium/messages/xml_message.rb
99
+ - lib/pidgin2adium/parsers/all.rb
100
+ - lib/pidgin2adium/parsers/basic_parser.rb
101
+ - lib/pidgin2adium/parsers/html_log_parser.rb
102
+ - lib/pidgin2adium/parsers/text_log_parser.rb
97
103
  - pidgin2adium.gemspec
98
104
  - spec/balance_tags_c_extn_spec.rb
99
105
  - spec/basic_parser_spec.rb
@@ -1,118 +0,0 @@
1
- module Pidgin2Adium
2
- # Balances tags of string using a modified stack. Returns a balanced
3
- # string, but also affects the text passed into it!
4
- # Use text = balance_tags(text).
5
-
6
- # From Wordpress's formatting.php; rewritten in Ruby by Gabe
7
- # Berke-Williams, 2009.
8
- # Author:: Leonard Lin <leonard@acm.org>
9
- # License:: GPL v2.0
10
- # Copyright:: November 4, 2001
11
- def Pidgin2Adium.balance_tags( text )
12
- tagstack = []
13
- stacksize = 0
14
- tagqueue = ''
15
- newtext = ''
16
- single_tags = %w{br hr img input meta} # Known single-entity/self-closing tags
17
- #nestable_tags = %w{blockquote div span} # Tags that can be immediately nested within themselves
18
- nestable_tags = %w{blockquote div span font} # Tags that can be immediately nested within themselves
19
- # 1: tagname, with possible leading "/"
20
- # 2: attributes
21
- tag_regex = /<(\/?\w*)\s*([^>]*)>/
22
-
23
- # WP bug fix for comments - in case you REALLY meant to type '< !--'
24
- text.gsub!('< !--', '< !--')
25
-
26
- # WP bug fix for LOVE <3 (and other situations with '<' before a number)
27
- text.gsub!(/<([0-9]{1})/, '&lt;\1')
28
-
29
- while ( pos = (text =~ tag_regex) )
30
- newtext << tagqueue
31
- tag = $1.downcase
32
- attributes = $2
33
- matchlen = $~[0].size
34
-
35
- # clear the shifter
36
- tagqueue = ''
37
- # Pop or Push
38
- if (tag[0,1] == "/") # End Tag
39
- tag.slice!(0,1)
40
- # if too many closing tags
41
- if(stacksize <= 0)
42
- tag = ''
43
- #or close to be safe: tag = '/' << tag
44
- elsif (tagstack[stacksize - 1] == tag) # found closing tag
45
- # if stacktop value == tag close value then pop
46
- tag = '</' << tag << '>' # Close Tag
47
- # Pop
48
- tagstack.pop
49
- stacksize -= 1
50
- else # closing tag not at top, search for it
51
- (stacksize-1).downto(0) do |j|
52
- if (tagstack[j] == tag)
53
- # add tag to tagqueue
54
- ss = stacksize - 1
55
- ss.downto(j) do |k|
56
- tagqueue << '</' << tagstack.pop << '>'
57
- stacksize -= 1
58
- end
59
- break
60
- end
61
- end
62
- tag = ''
63
- end
64
- else
65
- # Begin Tag
66
-
67
- # Tag Cleaning
68
- if( (attributes[-1,1] == '/') || (tag == '') )
69
- # If: self-closing or '', don't do anything.
70
- elsif ( single_tags.include?(tag) )
71
- # ElseIf: it's a known single-entity tag but it doesn't close itself, do so
72
- attributes << '/'
73
- else
74
- # Push the tag onto the stack
75
- # If the top of the stack is the same as the tag we want to push, close previous tag
76
- if ((stacksize > 0) &&
77
- ! nestable_tags.include?(tag) &&
78
- (tagstack[stacksize - 1] == tag))
79
- tagqueue = '</' << tagstack.pop << '>'
80
- stacksize -= 1
81
- end
82
- tagstack.push(tag)
83
- stacksize += 1
84
- end
85
-
86
- # Attributes
87
- if(attributes != '')
88
- attributes = ' ' << attributes
89
- end
90
- tag = '<' << tag << attributes << '>'
91
- #If already queuing a close tag, then put this tag on, too
92
- if (tagqueue)
93
- tagqueue << tag
94
- tag = ''
95
- end
96
- end
97
- newtext << text[0,pos] << tag
98
- text = text[pos+matchlen, text.length - (pos+matchlen)]
99
- end
100
-
101
- # Clear Tag Queue
102
- newtext << tagqueue
103
-
104
- # Add Remaining text
105
- newtext << text
106
-
107
- # Empty Stack
108
- tagstack.reverse_each do |t|
109
- newtext << '</' << t << '>' # Add remaining tags to close
110
- end
111
-
112
- # WP fix for the bug with HTML comments
113
- newtext.gsub!("< !--", "<!--")
114
- newtext.gsub!("< !--", "< !--")
115
-
116
- return newtext
117
- end
118
- end