markio 0.0.3 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,33 +1,59 @@
1
1
  # Markio
2
2
 
3
- A ruby gem for parsing Netscape Bookmark File Format
4
- http://msdn.microsoft.com/en-us/library/aa753582(v=vs.85).aspx
3
+ A Ruby Gem for parsing [Netscape Bookmark File Format](http://msdn.microsoft.com/en-us/library/aa753582\(v=vs.85\).aspx)
5
4
 
6
5
  ## Installation
7
6
 
8
7
  Add this line to your application's Gemfile:
9
8
 
10
- gem 'markio'
9
+ ```ruby
10
+ gem 'markio'
11
+ ```
11
12
 
12
13
  And then execute:
13
14
 
14
- $ bundle
15
+ ```bash
16
+ $ bundle
17
+ ```
15
18
 
16
19
  Or install it yourself as:
17
20
 
18
- $ gem install markio
21
+ ```bash
22
+ $ gem install markio
23
+ ```
19
24
 
20
25
  ## Usage
21
26
 
22
- bookmarks = Markio::parse('/path/to/bookmarks.html')
23
- bookmarks.each do |b|
24
- b.title # String
25
- b.href # String with bookmark URL
26
- b.folders # Array of strings - folders (tags)
27
- b.add_date # DateTime
28
- b.last_visit # DateTime
29
- b.last_modified # DateTime
30
- end
27
+ ### Parsing bookmarks file
28
+
29
+ ```ruby
30
+ bookmarks = Markio::parse(File.open('/path/to/bookmarks.html'))
31
+ bookmarks.each do |b|
32
+ b.title # String
33
+ b.href # String with bookmark URL
34
+ b.folders # Array of strings - folders (tags)
35
+ b.add_date # DateTime
36
+ b.last_visit # DateTime
37
+ b.last_modified # DateTime
38
+ end
39
+ ```
40
+
41
+ ### Building bookmarks file
42
+
43
+ ```ruby
44
+ builder = Markio::Builder.new
45
+ builder.bookmarks << Bookmark.create({
46
+ :title => "Google",
47
+ :href => "http://google.com"
48
+ })
49
+ file_contents = builder.build_string
50
+ File.open('/path/to/bookmarks.html', 'w') { |f| f.write file_contents }
51
+ ```
52
+
53
+ ## TODO
54
+
55
+ - Builder output to file
56
+ - Builder should not ignore bookmark folders
31
57
 
32
58
  ## Contributing
33
59
 
@@ -16,7 +16,7 @@ class Markio::Bookmark
16
16
 
17
17
  def == other
18
18
  unless other.nil? or other.class != self.class
19
- other.href == href
19
+ other.href == href and other.title == title
20
20
  end
21
21
  end
22
22
  end
@@ -23,6 +23,19 @@ class Markio::Builder
23
23
 
24
24
  def build
25
25
 
26
+ bookmarks = { nil => [] }
27
+ @bookmarks.each do |b|
28
+
29
+ if b.folders.any?
30
+ b.folders.each do |f|
31
+ bookmarks[f] ||= []
32
+ bookmarks[f] << b
33
+ end
34
+ else
35
+ bookmarks[nil] << b
36
+ end
37
+ end
38
+
26
39
  docparts = Nokogiri::HTML::DocumentFragment.parse ''
27
40
  Nokogiri::HTML::Builder.with(docparts) do |html|
28
41
  html.comment <<END
@@ -34,18 +47,34 @@ END
34
47
  html.title @title
35
48
  html.dl {
36
49
  html.p
37
- @bookmarks.each do |b|
38
- html.dt {
39
- params = { :href => b.href }
40
- params[:add_date] = b.add_date.to_time.to_i if b.add_date
41
- params[:last_visit] = b.last_visit.to_time.to_i if b.last_visit
42
- params[:last_modified] = b.last_modified.to_time.to_i if b.last_modified
43
- html.a(b.title, params)
44
- }
50
+ bookmarks.keys.each do |f|
51
+ unless f.nil?
52
+ html.dt {
53
+ html.h3 f
54
+ html.dl {
55
+ html.p
56
+ bookmarks[f].each { |b| build_bookmark html, b }
57
+ }
58
+ }
59
+ else
60
+ bookmarks[nil].each { |b| build_bookmark html, b }
61
+ end
45
62
  end
46
63
  }
47
64
  end
48
65
 
49
- "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" << docparts.to_html
66
+ "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" << docparts.to_html
67
+ end
68
+
69
+ private
70
+
71
+ def build_bookmark(html, b)
72
+ html.dt {
73
+ params = { :href => b.href }
74
+ params[:add_date] = b.add_date.to_time.to_i if b.add_date
75
+ params[:last_visit] = b.last_visit.to_time.to_i if b.last_visit
76
+ params[:last_modified] = b.last_modified.to_time.to_i if b.last_modified
77
+ html.a(b.title, params)
78
+ }
50
79
  end
51
80
  end
@@ -12,7 +12,7 @@ module Markio
12
12
  traverse(@document, []) do |bookmark|
13
13
  bookmarks << bookmark
14
14
  end
15
- bookmarks
15
+ consolidate bookmarks
16
16
  end
17
17
 
18
18
  private
@@ -55,5 +55,18 @@ module Markio
55
55
  Time.at(timestamp.to_i).to_datetime if timestamp
56
56
  end
57
57
 
58
+ def consolidate(bookmarks)
59
+ consolidated = []
60
+ bookmarks.each do |b|
61
+ index = consolidated.index b
62
+ unless index.nil?
63
+ consolidated[index].folders += b.folders
64
+ else
65
+ consolidated << b
66
+ end
67
+ end
68
+ consolidated
69
+ end
70
+
58
71
  end
59
72
  end
@@ -1,3 +1,3 @@
1
1
  module Markio
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1"
3
3
  end
@@ -9,8 +9,8 @@ Gem::Specification.new do |gem|
9
9
  gem.authors = ["Tomas Varaneckas"]
10
10
  gem.email = ["tomas.varaneckas@gmail.com"]
11
11
  gem.description = %q{Import/export utility for Netscape Bookmark Format}
12
- gem.summary = %q{Import/export utility for Netscape Bookmark Format}
13
- gem.homepage = ""
12
+ gem.summary = %q{Handles parsing and building Netscabe Bookmark Format in Ruby way.}
13
+ gem.homepage = "https://github.com/spajus/markio"
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -32,12 +32,12 @@ module Markio
32
32
  it 'should be able to parse what it builds' do
33
33
  builder = Builder.new
34
34
  builder.bookmarks << Bookmark.create({
35
- :title => "Test bookmark",
35
+ :title => "Test bookmark 1",
36
36
  :href => "http://test.com"
37
37
  })
38
38
  builder.bookmarks << Bookmark.create({
39
- :title => "Test bookmark",
40
- :href => "http://test.com",
39
+ :title => "Test bookmark 2",
40
+ :href => "http://test2.com",
41
41
  :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
42
42
  :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
43
43
  :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
@@ -54,11 +54,11 @@ module Markio
54
54
  builder = Builder.new
55
55
  builder.bookmarks << Bookmark.create({
56
56
  :title => "Test bookmark",
57
- :href => "http://test.com"
57
+ :href => "http://test1.com"
58
58
  })
59
59
  builder.bookmarks << Bookmark.create({
60
- :title => "Test bookmark",
61
- :href => "http://test.com",
60
+ :title => "Test bookmark 2",
61
+ :href => "http://test2.com",
62
62
  :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
63
63
  :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
64
64
  :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
@@ -69,5 +69,53 @@ module Markio
69
69
  builder.bookmarks = bookmarks
70
70
  builder.build_string.should eq file_contents
71
71
  end
72
+
73
+ it 'should group bookmarks into folders' do
74
+ builder = Builder.new
75
+ builder.bookmarks << Bookmark.create({
76
+ :title => "Test bookmark 1",
77
+ :href => "http://test1.com",
78
+ :folders => ["One"]
79
+ })
80
+ builder.bookmarks << Bookmark.create({
81
+ :title => "Test bookmark 2",
82
+ :href => "http://test2.com",
83
+ :folders => ["Two"]
84
+ })
85
+ file_contents = builder.build_string
86
+ file_contents.should match "One"
87
+ file_contents.should match "Two"
88
+ bookmarks = Markio.parse file_contents
89
+ bookmarks.length.should eq builder.bookmarks.length
90
+ bookmarks.each do |b|
91
+ builder.bookmarks.should include b
92
+ b.folders.length.should eq 1
93
+ end
94
+ end
95
+
96
+ it 'should work with multi-folder bookmarks' do
97
+ builder = Builder.new
98
+ builder.bookmarks << Bookmark.create({
99
+ :title => "Test bookmark 1",
100
+ :href => "http://test1.com",
101
+ :folders => ["One", "Shared"]
102
+ })
103
+ builder.bookmarks << Bookmark.create({
104
+ :title => "Test bookmark 2",
105
+ :href => "http://test2.com",
106
+ :folders => ["Two", "Shared"]
107
+ })
108
+ file_contents = builder.build_string
109
+ file_contents.should match "One"
110
+ file_contents.should match "Two"
111
+ file_contents.should match "Shared"
112
+ bookmarks = Markio.parse file_contents
113
+ bookmarks.length.should eq builder.bookmarks.length
114
+ bookmarks.each do |b|
115
+ builder.bookmarks.should include b
116
+ b.folders.length.should eq 2
117
+ b.folders.should include "Shared"
118
+ end
119
+ end
72
120
  end
73
121
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: '0.1'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-28 00:00:00.000000000 Z
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -101,7 +101,7 @@ files:
101
101
  - spec/builder_spec.rb
102
102
  - spec/parser_spec.rb
103
103
  - spec/spec_helper.rb
104
- homepage: ''
104
+ homepage: https://github.com/spajus/markio
105
105
  licenses: []
106
106
  post_install_message:
107
107
  rdoc_options: []
@@ -124,7 +124,7 @@ rubyforge_project:
124
124
  rubygems_version: 1.8.24
125
125
  signing_key:
126
126
  specification_version: 3
127
- summary: Import/export utility for Netscape Bookmark Format
127
+ summary: Handles parsing and building Netscabe Bookmark Format in Ruby way.
128
128
  test_files:
129
129
  - spec/assets/corrupted.html
130
130
  - spec/assets/many_bookmarks.html