xbel 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +18 -7
- data/VERSION +1 -1
- data/lib/nokogiri/decorators/xbel/bookmark.rb +4 -0
- data/lib/nokogiri/decorators/xbel/folder.rb +9 -4
- data/lib/nokogiri/decorators/xbel.rb +16 -4
- data/lib/xbel.rb +8 -0
- data/test/helper.rb +1 -0
- data/test/test_xbel.rb +71 -35
- data/test/wikipedia.xbel +21 -16
- data/xbel.gemspec +2 -2
- metadata +2 -2
data/README.markdown
CHANGED
@@ -1,23 +1,34 @@
|
|
1
1
|
# xbel
|
2
2
|
|
3
|
-
Introduces XBEL decorations for Nokogiri.
|
4
|
-
development.
|
3
|
+
Introduces XBEL decorations for Nokogiri.
|
5
4
|
|
6
5
|
## Installation
|
7
6
|
|
8
7
|
gem install xbel
|
9
8
|
|
10
|
-
##
|
9
|
+
## Using
|
11
10
|
|
12
11
|
require 'rubygems'
|
13
12
|
require 'xbel'
|
14
13
|
|
15
|
-
|
14
|
+
### Reading
|
16
15
|
|
17
|
-
|
18
|
-
|
16
|
+
XBEL.open('test/wikipedia.xbel')[:f0].bookmarks.
|
17
|
+
map do |bookmark|
|
18
|
+
link_to bookmark.title, bookmark.href
|
19
|
+
end
|
19
20
|
|
20
|
-
###
|
21
|
+
### Writing
|
22
|
+
|
23
|
+
xbel = XBEL.new
|
24
|
+
xbel.build_folder 'XBEL' do |folder|
|
25
|
+
folder.build_bookmark "boof's xbel", 'http://github.com/boof/xbel'
|
26
|
+
end
|
27
|
+
File.open('my.xbel', 'w') { |file| file << xbel }
|
28
|
+
|
29
|
+
_Note: You can use all Nokogiri::XML::Node methods._
|
30
|
+
|
31
|
+
## Patches/Pull Requests:
|
21
32
|
|
22
33
|
1. Fork the project.
|
23
34
|
2. Make your feature addition or bug fix.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -2,9 +2,13 @@ module Nokogiri::Decorators::XBEL
|
|
2
2
|
module Folder
|
3
3
|
include Entry
|
4
4
|
|
5
|
+
def self.extended(node)
|
6
|
+
node.initialize_decorator
|
7
|
+
end
|
8
|
+
|
5
9
|
# Returns an instance of NodeSet with all valid children for this folder.
|
6
10
|
def entries
|
7
|
-
xpath './alias
|
11
|
+
xpath './alias | ./bookmark | ./folder | ./separator'
|
8
12
|
end
|
9
13
|
# Returns an instance of NodeSet with all aliases for this folder.
|
10
14
|
def aliases
|
@@ -31,16 +35,17 @@ module Nokogiri::Decorators::XBEL
|
|
31
35
|
end
|
32
36
|
|
33
37
|
# Builds a bookmark with given attributes and add it.
|
34
|
-
def build_bookmark(title, attributes = {}, &block)
|
38
|
+
def build_bookmark(title, href, attributes = {}, &block)
|
35
39
|
node = Nokogiri::XML::Node.new('bookmark', document)
|
36
|
-
assign_to node, attributes.merge('title' => title)
|
40
|
+
assign_to node, attributes.merge('title' => title, 'href' => href),
|
41
|
+
&block
|
37
42
|
|
38
43
|
add_child node
|
39
44
|
end
|
40
45
|
# Builds a folder with given attributes and add it.
|
41
46
|
def build_folder(title, attributes = {}, &block)
|
42
47
|
node = Nokogiri::XML::Node.new('folder', document)
|
43
|
-
assign_to node, attributes.merge('title' => title)
|
48
|
+
assign_to node, attributes.merge('title' => title), &block
|
44
49
|
|
45
50
|
add_child node
|
46
51
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Nokogiri::Decorators::XBEL
|
2
2
|
|
3
|
-
autoload :Folder, "#{ File.dirname __FILE__ }/xbel/folder.rb"
|
4
|
-
autoload :Seperator, "#{ File.dirname __FILE__ }/xbel/folder.rb"
|
5
3
|
autoload :Bookmark, "#{ File.dirname __FILE__ }/xbel/bookmark.rb"
|
4
|
+
autoload :Folder, "#{ File.dirname __FILE__ }/xbel/folder.rb"
|
6
5
|
autoload :Alias, "#{ File.dirname __FILE__ }/xbel/alias.rb"
|
6
|
+
autoload :Seperator, "#{ File.dirname __FILE__ }/xbel/folder.rb"
|
7
7
|
|
8
8
|
def self.extended(base)
|
9
9
|
case base.name
|
@@ -13,16 +13,28 @@ module Nokogiri::Decorators::XBEL
|
|
13
13
|
base.extend Bookmark
|
14
14
|
when 'folder'
|
15
15
|
base.extend Folder
|
16
|
-
when 'separator'
|
17
|
-
base.extend Separator
|
18
16
|
when 'alias'
|
19
17
|
base.extend Alias
|
18
|
+
when 'separator'
|
19
|
+
base.extend Separator
|
20
20
|
when 'xbel'
|
21
21
|
base.extend Folder
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
module Entry
|
26
|
+
|
27
|
+
def initialize_decorator
|
28
|
+
@info = Hash.new do |info, owner|
|
29
|
+
if String === owner
|
30
|
+
info[owner] = at "./info/metadata[@owner='#{owner}']"
|
31
|
+
else
|
32
|
+
info[owner.to_s]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
attr_reader :info
|
37
|
+
|
26
38
|
def desc
|
27
39
|
if node = at('./desc') then node.content end
|
28
40
|
end
|
data/lib/xbel.rb
CHANGED
@@ -11,6 +11,10 @@ class XBEL < Nokogiri::XML::Document
|
|
11
11
|
parse %Q'<!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML" "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd"><xbel version="%i.%i"></xbel>' % [major, minor]
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.open(path)
|
15
|
+
parse File.read(path.to_s)
|
16
|
+
end
|
17
|
+
|
14
18
|
# Use <tt>XBEL.parse(string)</tt> create an instance.
|
15
19
|
def initialize(*args)
|
16
20
|
super
|
@@ -18,6 +22,10 @@ class XBEL < Nokogiri::XML::Document
|
|
18
22
|
decorate!
|
19
23
|
end
|
20
24
|
|
25
|
+
def [](id)
|
26
|
+
root.at("//*[@id='#{ id }']")
|
27
|
+
end
|
28
|
+
|
21
29
|
# Returns an array of version numbers.
|
22
30
|
def version
|
23
31
|
root.attribute('version').value.split('.').map { |n| n.to_i }
|
data/test/helper.rb
CHANGED
data/test/test_xbel.rb
CHANGED
@@ -23,65 +23,101 @@ end
|
|
23
23
|
context 'XBEL' do
|
24
24
|
|
25
25
|
setup do
|
26
|
-
|
27
|
-
|
26
|
+
root = Pathname.new File.dirname(__FILE__)
|
27
|
+
XBEL.open root.join('wikipedia.xbel')
|
28
28
|
end
|
29
29
|
|
30
|
-
asserts('version') {
|
30
|
+
asserts('version') { topic.version }.equals [1, 0]
|
31
31
|
|
32
|
-
asserts(
|
33
|
-
should('delegate title to root')
|
32
|
+
asserts('title') { topic.title }.equals 'Lesezeichen!'
|
33
|
+
should('delegate title accessor to root') do
|
34
|
+
topic.title = 'Bookmarks!'
|
35
|
+
|
36
|
+
topic.title == topic.root.title and
|
37
|
+
topic.title == 'Bookmarks!'
|
38
|
+
end
|
34
39
|
|
35
40
|
context 'Alias' do
|
36
|
-
setup {
|
37
|
-
should('be an alias') {
|
41
|
+
setup { topic.root.aliases.first }
|
42
|
+
should('be an alias') { topic.alias? }
|
43
|
+
|
44
|
+
should('have a reference') do
|
45
|
+
topic.ref and
|
46
|
+
topic.ref == topic.reference
|
47
|
+
end
|
38
48
|
end
|
39
49
|
|
40
50
|
context 'Folder' do
|
41
|
-
setup {
|
51
|
+
setup { topic[:f0] }
|
52
|
+
should('be a folder') { topic.folder? }
|
42
53
|
|
43
|
-
asserts('title') {
|
44
|
-
|
45
|
-
asserts('
|
46
|
-
asserts('
|
47
|
-
|
54
|
+
asserts('title') { topic.title }.equals 'Wiki'
|
55
|
+
# TODO: check type with <name>?
|
56
|
+
asserts('entries') { topic.entries }.kind_of Nokogiri::XML::NodeSet
|
57
|
+
asserts('bookmarks') { topic.bookmarks }.kind_of Nokogiri::XML::NodeSet
|
58
|
+
asserts('aliases') { topic.aliases }.kind_of Nokogiri::XML::NodeSet
|
59
|
+
asserts('folders') { topic.folders }.kind_of Nokogiri::XML::NodeSet
|
48
60
|
|
49
61
|
context 'Bookmark' do
|
50
|
-
setup {
|
62
|
+
setup { topic.bookmarks.first }
|
63
|
+
should('be a bookmark') { topic.bookmark? }
|
51
64
|
|
52
|
-
asserts('modified
|
53
|
-
|
54
|
-
asserts('
|
55
|
-
|
65
|
+
asserts('modified') { topic.modified }.kind_of Date
|
66
|
+
|
67
|
+
asserts('visited') { topic.visited }.kind_of Date
|
68
|
+
asserts('visit') do
|
69
|
+
topic.visit
|
70
|
+
topic.visited
|
71
|
+
end.equals Date.today
|
56
72
|
end
|
57
73
|
context 'new Bookmark' do
|
58
74
|
setup do
|
59
|
-
|
60
|
-
:
|
75
|
+
topic.build_bookmark "boof's xbel", 'http://www.github.com/boof/xbel',
|
76
|
+
:description => 'Ruby API for XBEL based on Nokogiri.'
|
61
77
|
end
|
78
|
+
should('be a bookmark') { topic.bookmark? }
|
62
79
|
|
63
|
-
asserts('added
|
64
|
-
asserts('title
|
65
|
-
asserts('href
|
80
|
+
asserts('added') { topic.added }.equals Date.today
|
81
|
+
asserts('title') { topic.title }.equals 'boof\'s xbel'
|
82
|
+
asserts('href') { topic.href }.
|
66
83
|
equals 'http://www.github.com/boof/xbel'
|
67
|
-
asserts('description
|
68
|
-
equals '
|
84
|
+
asserts('description') { topic.description }.
|
85
|
+
equals 'Ruby API for XBEL based on Nokogiri.'
|
69
86
|
end
|
70
87
|
|
71
88
|
context 'new Folder' do
|
72
|
-
setup
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
asserts('
|
77
|
-
asserts('
|
78
|
-
asserts('
|
79
|
-
asserts('desc attribute') { @subfolder.desc }.equals 'description'
|
89
|
+
setup { topic.build_folder 'sub', :id => 'id-2', :desc => 'desc' }
|
90
|
+
should('be a folder') { topic.folder? }
|
91
|
+
|
92
|
+
asserts('added') { topic.added }.equals Date.today
|
93
|
+
asserts('title') { topic.title }.equals 'sub'
|
94
|
+
asserts('id') { topic.id }.equals 'id-2'
|
95
|
+
asserts('desc') { topic.desc }.equals 'desc'
|
80
96
|
end
|
81
97
|
|
82
98
|
context 'new Alias' do
|
83
|
-
setup {
|
84
|
-
should('
|
99
|
+
setup { topic.build_alias topic }
|
100
|
+
should('be an alias') { topic.alias? }
|
101
|
+
|
102
|
+
should('reference its folder') { topic.entry == topic.parent }
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'Bookmark b0' do
|
108
|
+
setup { topic[:b0] }
|
109
|
+
should('be a bookmark') { topic.bookmark? }
|
110
|
+
|
111
|
+
context 'Info' do
|
112
|
+
setup { topic.info }
|
113
|
+
should('be a hash') { Hash === topic }
|
114
|
+
|
115
|
+
context 'metadata for xbel' do
|
116
|
+
setup { topic[:xbel] if topic }
|
117
|
+
should('be a node') { Nokogiri::XML::Node === topic }
|
118
|
+
|
119
|
+
should('be have an alias') { not topic.at('./alias').nil? }
|
120
|
+
end
|
85
121
|
end
|
86
122
|
|
87
123
|
end
|
data/test/wikipedia.xbel
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
2
2
|
<!DOCTYPE xbel
|
3
|
-
|
4
|
-
|
3
|
+
PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
|
4
|
+
"http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
|
5
5
|
<xbel version="1.0">
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
6
|
+
<title>Lesezeichen!</title>
|
7
|
+
<desc>Lernen von XBEL am Beispiel von zwei Lesezeichen und einer Verknüpfung</desc>
|
8
|
+
<folder id="f0" added="2007-11-10">
|
9
|
+
<title>Wiki</title>
|
10
|
+
<desc>Webseiten von Autoren-Gemeinschaften</desc>
|
11
|
+
<bookmark href="http://wikimediafoundation.org/" id="b0" added="2007-11-11" modified="2007-11-14" visited="2007-11-14">
|
12
|
+
<info>
|
13
|
+
<metadata owner="xbel">
|
14
|
+
<alias ref="f0" />
|
15
|
+
</metadata>
|
16
|
+
</info>
|
17
|
+
<title>Wikimedia Foundation</title>
|
18
|
+
</bookmark>
|
19
|
+
<bookmark href="http://de.wikipedia.org/" id="b1" added="2007-11-11" modified="2007-11-14" visited="2007-12-27">
|
20
|
+
<title>Wikipedia</title>
|
21
|
+
</bookmark>
|
22
|
+
</folder>
|
23
|
+
<separator />
|
24
|
+
<alias ref="b1" />
|
20
25
|
</xbel>
|
data/xbel.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{xbel}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Florian A\303\237mann"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-11}
|
13
13
|
s.description = %q{}
|
14
14
|
s.email = %q{florian.assmann@email.de}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xbel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Florian A\xC3\x9Fmann"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-11 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|