bookmarks 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Changelog.markdown +4 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +35 -0
- data/README.markdown +70 -0
- data/Rakefile +25 -0
- data/TODO +3 -0
- data/VERSION +1 -0
- data/lib/bookmarks/document.rb +104 -0
- data/lib/bookmarks/netscape_bookmark.rb +94 -0
- data/lib/bookmarks.rb +11 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bb320228bd68d2c679651f8b0bef8ed3be77526a
|
4
|
+
data.tar.gz: 6049fb5986c41ae4ffb2eaf5618e6046b39d3bd7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 343aec86130060ee882d7eda260dbdbdd81fdddb525ac8e705d1f3978fe6a344083c60d56cf476ddf093064f7df8366d99c84a88e47c847be19aa74f5c60337e
|
7
|
+
data.tar.gz: 30fcb9a2a5bda9c3746758503cc183ef83da15b35ecb9b1312444a44449bc8ce025d379fc355fe994ea9c7b99ef74419fd8da3568bd3b0867b0ae488e9d94f86
|
data/Changelog.markdown
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bookmarks (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
coco (0.7.1)
|
10
|
+
diff-lcs (1.2.4)
|
11
|
+
rake (10.1.0)
|
12
|
+
rspec (2.14.0)
|
13
|
+
rspec-core (~> 2.14.0)
|
14
|
+
rspec-expectations (~> 2.14.0)
|
15
|
+
rspec-mocks (~> 2.14.0)
|
16
|
+
rspec-core (2.14.1)
|
17
|
+
rspec-expectations (2.14.0)
|
18
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
19
|
+
rspec-mocks (2.14.1)
|
20
|
+
tomparse (0.4.2)
|
21
|
+
yard (0.8.6.2)
|
22
|
+
yard-tomdoc (0.7.1)
|
23
|
+
tomparse (>= 0.4.0)
|
24
|
+
yard
|
25
|
+
|
26
|
+
PLATFORMS
|
27
|
+
ruby
|
28
|
+
|
29
|
+
DEPENDENCIES
|
30
|
+
bookmarks!
|
31
|
+
coco (>= 0.7.1)
|
32
|
+
rake
|
33
|
+
rspec
|
34
|
+
yard
|
35
|
+
yard-tomdoc
|
data/README.markdown
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
Bookmarks [![Build Status](https://travis-ci.org/lkdjiin/bookmarks.png)](https://travis-ci.org/lkdjiin/bookmarks)
|
2
|
+
================
|
3
|
+
|
4
|
+
Description
|
5
|
+
-----------
|
6
|
+
|
7
|
+
Bookmarks is a library to parse or build a file of bookmarks, currently
|
8
|
+
only files in netscape format, like the ones exported by Delicious.
|
9
|
+
|
10
|
+
Install
|
11
|
+
-------------------------
|
12
|
+
|
13
|
+
On the CLI
|
14
|
+
|
15
|
+
gem install bookmarks
|
16
|
+
|
17
|
+
or in a Gemfile
|
18
|
+
|
19
|
+
gem 'bookmarks'
|
20
|
+
|
21
|
+
Usage
|
22
|
+
--------------------------
|
23
|
+
|
24
|
+
require 'bookmarks'
|
25
|
+
|
26
|
+
# To parse a document.
|
27
|
+
document = Document.new
|
28
|
+
document.parse 'bookmarks_file.html'
|
29
|
+
document.total # => Number of bookmarks.
|
30
|
+
first_bookmark = document.bookmarks.first
|
31
|
+
first_bookmark.class # => NetscapeBookmark
|
32
|
+
first_bookmark.url # => Url of the bookmark.
|
33
|
+
first_bookmark.title # => Title of the bookmark.
|
34
|
+
first_bookmark.tags # => Tags of the bookmark.
|
35
|
+
first_bookmark.date # => Date of the bookmark.
|
36
|
+
first_bookmark.description # => Description of the bookmark.
|
37
|
+
|
38
|
+
# To build a document.
|
39
|
+
# ary is an array of NetscapeBookmark.
|
40
|
+
document.build do
|
41
|
+
ary.each {|e| e }
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
Dependencies
|
47
|
+
--------------------------
|
48
|
+
|
49
|
+
* ruby >= 2.0.0
|
50
|
+
|
51
|
+
Contributing
|
52
|
+
-------------------------
|
53
|
+
|
54
|
+
1. Fork it
|
55
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
56
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
57
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
58
|
+
5. Create new Pull Request
|
59
|
+
|
60
|
+
|
61
|
+
License
|
62
|
+
--------------------------
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
Questions and/or Comments
|
67
|
+
--------------------------
|
68
|
+
|
69
|
+
Feel free to email [Xavier Nayrac](mailto:xavier.nayrac@gmail.com)
|
70
|
+
with any questions, or contact me on [twitter](https://twitter.com/lkdjiin).
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
desc 'Test Bookmarks'
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
desc 'Test Bookmarks with rspec'
|
10
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
11
|
+
t.rspec_opts = ['--color']
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Check for code smells'
|
15
|
+
task :reek do
|
16
|
+
puts 'Checking for code smells...'
|
17
|
+
files = Dir.glob 'lib/**/*.rb'
|
18
|
+
args = files.join(' ')
|
19
|
+
sh "reek --quiet #{args} | ./reek.sed"
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Generate documentation'
|
23
|
+
task :doc do
|
24
|
+
sh "yard --plugin tomdoc"
|
25
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Bookmarks
|
4
|
+
|
5
|
+
# Public: Document is your main interface to the file of bookmarks
|
6
|
+
# (called «document»).
|
7
|
+
class Document
|
8
|
+
|
9
|
+
# Public: Init a new Document.
|
10
|
+
#
|
11
|
+
# format - The Symbol format of the document (Optional).
|
12
|
+
#
|
13
|
+
# Examples
|
14
|
+
#
|
15
|
+
# # The two following calls work the same way.
|
16
|
+
# Document.new
|
17
|
+
# Document.new format: :netscape
|
18
|
+
def initialize format: :netscape
|
19
|
+
@bookmarks_format = format
|
20
|
+
@document = ""
|
21
|
+
@bookmarks = []
|
22
|
+
@total = 0
|
23
|
+
end
|
24
|
+
|
25
|
+
# Public: Returns the Symbol format of the document. Currently
|
26
|
+
# there is only one format available: `:netscape`.
|
27
|
+
attr_reader :bookmarks_format
|
28
|
+
|
29
|
+
# Public: Returns the String document.
|
30
|
+
attr_reader :document
|
31
|
+
|
32
|
+
# Public: Returns an Array of NetscapeBookmark bookmarks.
|
33
|
+
attr_reader :bookmarks
|
34
|
+
|
35
|
+
# Public: Returns the Integer numbers of bookmarks in the document.
|
36
|
+
attr_reader :total
|
37
|
+
|
38
|
+
# Public: Build a document, ie build a file of bookmarks.
|
39
|
+
#
|
40
|
+
# block - A block that enumerate all NetscapeBookmark to put
|
41
|
+
# into the document.
|
42
|
+
#
|
43
|
+
# Examples
|
44
|
+
#
|
45
|
+
# # ary is an array of NetscapeBookmark.
|
46
|
+
# document.build do
|
47
|
+
# ary.each {|e| e }
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# Returns the String document.
|
51
|
+
def build &block
|
52
|
+
@document += FIRST_PART
|
53
|
+
block.call.each do |n|
|
54
|
+
@document += n.to_s + "\n"
|
55
|
+
@total += 1
|
56
|
+
end
|
57
|
+
@document += LAST_PART
|
58
|
+
end
|
59
|
+
|
60
|
+
# Public: Parse a file of bookmarks (netscape format). Bookmarks could
|
61
|
+
# then be retrieved with #bookmarks.
|
62
|
+
#
|
63
|
+
# file_path - Full String pathname of the file to parse.
|
64
|
+
#
|
65
|
+
# Returns the String document (see also #document).
|
66
|
+
def parse file_path
|
67
|
+
File.new(file_path).readlines.each {|line| parse_a_bookmark line }
|
68
|
+
@total = @bookmarks.size
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# Parse a single line from a bookmarks file.
|
74
|
+
#
|
75
|
+
# line - String.
|
76
|
+
#
|
77
|
+
# Returns nothing.
|
78
|
+
def parse_a_bookmark line
|
79
|
+
if line =~ /^<DT>/
|
80
|
+
@bookmarks << NetscapeBookmark.from_string(line)
|
81
|
+
elsif line =~ /^<DD>/
|
82
|
+
@bookmarks.last.description = line[4..-1].chomp
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# First part of a bookmark's file in netscape format.
|
88
|
+
FIRST_PART = <<CODE
|
89
|
+
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
90
|
+
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
91
|
+
<!-- This is an automatically generated file.
|
92
|
+
It will be read and overwritten.
|
93
|
+
Do Not Edit! -->
|
94
|
+
<TITLE>Bookmarks</TITLE>
|
95
|
+
<H1>Bookmarks</H1>
|
96
|
+
<DL><p>
|
97
|
+
CODE
|
98
|
+
|
99
|
+
# Last part of a bookmark's file in netscape format.
|
100
|
+
LAST_PART = "</DL><p>\n"
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Bookmarks
|
4
|
+
|
5
|
+
# Public: A single bookmark in netscape format.
|
6
|
+
class NetscapeBookmark
|
7
|
+
|
8
|
+
# Public: Init a new NetscapeBookmark.
|
9
|
+
#
|
10
|
+
# url - An optional String url.
|
11
|
+
# title - An optional String title.
|
12
|
+
# date - An optional Date/DateTime date.
|
13
|
+
# tags - An optional String tags. Tags are comma separated.
|
14
|
+
# description - An optional String description.
|
15
|
+
def initialize url: "", title: "", date: nil, tags: "", description: ""
|
16
|
+
@url = url
|
17
|
+
@title = title
|
18
|
+
@date = date
|
19
|
+
@tags = tags
|
20
|
+
@description = description
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Initialize a new NetscapeBookmark object from a line from
|
24
|
+
# a bookmarks file.
|
25
|
+
#
|
26
|
+
# line - String line from a bookmarks file.
|
27
|
+
#
|
28
|
+
# Returns a new NetscapeBookmark object.
|
29
|
+
def self.from_string line
|
30
|
+
url = /HREF="(.*?)"/.match(line)[1]
|
31
|
+
title = /HREF=.*>(.*)<\/A>$/.match(line)[1]
|
32
|
+
date = /ADD_DATE="(.*?)"/.match(line)[1]
|
33
|
+
date = Time.at(date.to_i).to_s
|
34
|
+
tags = /TAGS="(.*?)"/.match(line)[1]
|
35
|
+
title = prettify_title title, url
|
36
|
+
new url: url, title: title, date: date, tags: tags
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
# Public: Set/get the String url.
|
41
|
+
attr_accessor :url
|
42
|
+
|
43
|
+
# Public: Set/get the String title.
|
44
|
+
attr_accessor :title
|
45
|
+
|
46
|
+
# Public: Set/get the Date/DateTime date.
|
47
|
+
attr_accessor :date
|
48
|
+
|
49
|
+
# Public: Set/get the String tags.
|
50
|
+
attr_accessor :tags
|
51
|
+
|
52
|
+
# Public: Set/get the String description.
|
53
|
+
attr_accessor :description
|
54
|
+
|
55
|
+
# Public: Returns the bookmark as a String.
|
56
|
+
def to_s
|
57
|
+
str = "<DT><A HREF=\"#{@url}\" " +
|
58
|
+
"ADD_DATE=\"#{@date.nil? ? "" : @date.to_time.to_i}\" " +
|
59
|
+
"TAGS=\"#{@tags}\">" +
|
60
|
+
(@title.empty? ? 'None' : @title) + "</A>"
|
61
|
+
if @description.empty?
|
62
|
+
str
|
63
|
+
else
|
64
|
+
str + "\n<DD>#{@description}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# In some case (which?) Delicious miss the title and we have a crapy
|
69
|
+
# 'None' instead of the original title. Bad news is the original title
|
70
|
+
# is lost. And there is no good news :) In such case, we build a new
|
71
|
+
# title from the url.
|
72
|
+
#
|
73
|
+
# Examples
|
74
|
+
#
|
75
|
+
# # Before expand_title
|
76
|
+
# @title # => 'None'
|
77
|
+
# @url # => "http://designmodo.com/flat-design-colors/"
|
78
|
+
# # After expand_title
|
79
|
+
# @title # => 'flat design colors'
|
80
|
+
#
|
81
|
+
# Returns String prettified title.
|
82
|
+
def self.prettify_title title, url
|
83
|
+
return title unless title == '' || title == 'None'
|
84
|
+
title = url
|
85
|
+
# Remove '/' at the end if it exists.
|
86
|
+
title = title.gsub(/\/$/, '')
|
87
|
+
# Keep the last element of the url.
|
88
|
+
title = title.match(/^.*\/(.*)/)[1]
|
89
|
+
# Substitute each '-' by a space.
|
90
|
+
title = title.gsub('-', ' ')
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
data/lib/bookmarks.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
4
|
+
$BOOKMARKS_PATH = File.expand_path(File.expand_path(File.dirname(__FILE__)) + '/..')
|
5
|
+
|
6
|
+
require 'bookmarks/document'
|
7
|
+
require 'bookmarks/netscape_bookmark'
|
8
|
+
|
9
|
+
# Public: Bookmarks is a library to parse or build a file of bookmarks.
|
10
|
+
module Bookmarks
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bookmarks
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Xavier Nayrac
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: coco
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: yard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard-tomdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: |-
|
70
|
+
Bookmarks is a library to parse or build a file of
|
71
|
+
bookmarks, currently only files in netscape format, like the ones
|
72
|
+
exported by Delicious.
|
73
|
+
email: xavier.nayrac@gmail.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- lib/bookmarks.rb
|
79
|
+
- lib/bookmarks/document.rb
|
80
|
+
- lib/bookmarks/netscape_bookmark.rb
|
81
|
+
- Changelog.markdown
|
82
|
+
- Gemfile
|
83
|
+
- Gemfile.lock
|
84
|
+
- README.markdown
|
85
|
+
- Rakefile
|
86
|
+
- TODO
|
87
|
+
- VERSION
|
88
|
+
homepage: https://github.com/lkdjiin/bookmarks
|
89
|
+
licenses:
|
90
|
+
- MIT
|
91
|
+
metadata: {}
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 2.0.0
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
requirements: []
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 2.0.3
|
109
|
+
signing_key:
|
110
|
+
specification_version: 4
|
111
|
+
summary: Bookmarks is a library to parse or build a file of bookmarks.
|
112
|
+
test_files: []
|
113
|
+
has_rdoc:
|