xbel 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -7
- data/VERSION +1 -1
- data/lib/nokogiri/decorators/xbel/bookmark.rb +6 -6
- data/lib/nokogiri/decorators/xbel/folder.rb +4 -4
- data/lib/xbel.rb +4 -12
- data/test/helper.rb +1 -7
- data/test/test_xbel.rb +81 -27
- data/test/wikipedia.xbel +20 -0
- data/xbel.gemspec +7 -11
- metadata +5 -16
- data/lib/xbel/writer.rb +0 -41
- data/test/complex.xbel +0 -165
data/Rakefile
CHANGED
@@ -5,15 +5,13 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "xbel"
|
8
|
-
gem.summary = %Q{Ruby API for XBEL based on Nokogiri
|
8
|
+
gem.summary = %Q{Ruby API for XBEL based on Nokogiri.}
|
9
9
|
gem.description = %Q{}
|
10
10
|
gem.email = "florian.assmann@email.de"
|
11
11
|
gem.homepage = "http://xbel.monkey-patch.me"
|
12
12
|
gem.authors = ["Florian Aßmann"]
|
13
|
-
gem.add_development_dependency "
|
14
|
-
gem.add_dependency 'watchr', '>= 0'
|
13
|
+
gem.add_development_dependency "riot", ">= 0"
|
15
14
|
gem.add_dependency 'nokogiri', '>= 0'
|
16
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
15
|
end
|
18
16
|
Jeweler::GemcutterTasks.new
|
19
17
|
rescue LoadError
|
@@ -24,7 +22,7 @@ require 'rake/testtask'
|
|
24
22
|
Rake::TestTask.new(:test) do |test|
|
25
23
|
test.libs << 'lib' << 'test'
|
26
24
|
test.pattern = 'test/**/test_*.rb'
|
27
|
-
test.verbose =
|
25
|
+
test.verbose = false
|
28
26
|
end
|
29
27
|
|
30
28
|
begin
|
@@ -40,8 +38,6 @@ rescue LoadError
|
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
43
|
-
task :test => :check_dependencies
|
44
|
-
|
45
41
|
task :default => :test
|
46
42
|
|
47
43
|
require 'rake/rdoctask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -3,26 +3,26 @@ module Nokogiri::Decorators::XBEL
|
|
3
3
|
include Entry
|
4
4
|
|
5
5
|
def modified
|
6
|
-
if value =
|
6
|
+
if value = self['modified'] then Date.parse value end
|
7
7
|
end
|
8
8
|
def modified=(value)
|
9
|
-
|
9
|
+
self['modified'] = value.to_s
|
10
10
|
end
|
11
11
|
def visited
|
12
|
-
if value =
|
12
|
+
if value = self['visited'] then Date.parse value end
|
13
13
|
end
|
14
14
|
def visited=(value)
|
15
|
-
|
15
|
+
self['visited'] = value.to_s
|
16
16
|
end
|
17
17
|
def visit
|
18
18
|
self.visited = Date.today
|
19
19
|
end
|
20
20
|
def href
|
21
|
-
if value =
|
21
|
+
if value = self['href'] then value end
|
22
22
|
end
|
23
23
|
def href=(value)
|
24
24
|
self.modified = Date.today
|
25
|
-
|
25
|
+
self['href'] = value
|
26
26
|
end
|
27
27
|
def bookmark?
|
28
28
|
true
|
@@ -31,16 +31,16 @@ module Nokogiri::Decorators::XBEL
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# Builds a bookmark with given attributes and add it.
|
34
|
-
def build_bookmark(attributes = {}, &block)
|
34
|
+
def build_bookmark(title, attributes = {}, &block)
|
35
35
|
node = Nokogiri::XML::Node.new('bookmark', document)
|
36
|
-
assign_to node, attributes
|
36
|
+
assign_to node, attributes.merge('title' => title)
|
37
37
|
|
38
38
|
add_child node
|
39
39
|
end
|
40
40
|
# Builds a folder with given attributes and add it.
|
41
|
-
def build_folder(attributes = {}, &block)
|
41
|
+
def build_folder(title, attributes = {}, &block)
|
42
42
|
node = Nokogiri::XML::Node.new('folder', document)
|
43
|
-
assign_to node, attributes
|
43
|
+
assign_to node, attributes.merge('title' => title)
|
44
44
|
|
45
45
|
add_child node
|
46
46
|
end
|
data/lib/xbel.rb
CHANGED
@@ -3,21 +3,19 @@ require 'forwardable'
|
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'nokogiri/decorators/xbel'
|
5
5
|
|
6
|
-
require 'watchr'
|
7
|
-
|
8
6
|
class XBEL < Nokogiri::XML::Document
|
9
7
|
extend Forwardable
|
10
8
|
def_delegators :root, :title, :title=, :desc, :desc=
|
11
9
|
|
12
|
-
|
10
|
+
def self.new(major = 1, minor = 0)
|
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
|
+
end
|
13
13
|
|
14
14
|
# Use <tt>XBEL.parse(string)</tt> create an instance.
|
15
15
|
def initialize(*args)
|
16
16
|
super
|
17
17
|
decorators(Nokogiri::XML::Node) << Nokogiri::Decorators::XBEL
|
18
18
|
decorate!
|
19
|
-
|
20
|
-
# self.root = '<xbel version="1.0"></xbel>'
|
21
19
|
end
|
22
20
|
|
23
21
|
# Returns an array of version numbers.
|
@@ -26,13 +24,7 @@ class XBEL < Nokogiri::XML::Document
|
|
26
24
|
end
|
27
25
|
# Sets version numbers.
|
28
26
|
def version=(*numbers)
|
29
|
-
root.attribute('version').value = numbers
|
30
|
-
end
|
31
|
-
|
32
|
-
# Writes XBEL to path.
|
33
|
-
def write(path)
|
34
|
-
# TODO: should start locking write process
|
35
|
-
Writer.new(self, path).write
|
27
|
+
root.attribute('version').value = numbers * '.'
|
36
28
|
end
|
37
29
|
|
38
30
|
end
|
data/test/helper.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
3
|
-
require 'shoulda'
|
2
|
+
require 'riot'
|
4
3
|
|
5
4
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
5
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
6
|
require 'xbel'
|
8
|
-
|
9
|
-
class Test::Unit::TestCase
|
10
|
-
include Nokogiri::Decorators::XBEL
|
11
|
-
attr_reader :xbel
|
12
|
-
end
|
data/test/test_xbel.rb
CHANGED
@@ -1,35 +1,89 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
context 'New XBEL' do
|
4
|
+
|
5
|
+
asserts 'version' do
|
6
|
+
XBEL.new.version
|
7
|
+
end.equals [1, 0]
|
8
|
+
asserts 'user defined version' do
|
9
|
+
XBEL.new(2, 2).version
|
10
|
+
end.equals [2, 2]
|
11
|
+
asserts 'set version' do
|
12
|
+
xbel = XBEL.new
|
13
|
+
xbel.version = 1, 1
|
14
|
+
|
15
|
+
xbel.version
|
16
|
+
end.equals [1, 1]
|
17
|
+
should 'be empty' do
|
18
|
+
XBEL.new.root.content.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'XBEL' do
|
24
|
+
|
25
|
+
setup do
|
26
|
+
path = File.join "#{ File.dirname __FILE__ }", 'wikipedia.xbel'
|
27
|
+
@xbel = XBEL.parse File.read(path)
|
28
|
+
end
|
29
|
+
|
30
|
+
asserts('version') { @xbel.version }.equals [1, 0]
|
31
|
+
|
32
|
+
asserts("title") { @xbel.title }.equals %q"Lesezeichen!"
|
33
|
+
should('delegate title to root') { @xbel.root.title == @xbel.title }
|
34
|
+
|
35
|
+
context 'Alias' do
|
36
|
+
setup { @alias = @xbel.root.aliases.first }
|
37
|
+
should('be an alias') { @alias.alias? }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'Folder' do
|
41
|
+
setup { @folder = @xbel.root.folders.first }
|
42
|
+
|
43
|
+
asserts('title') { @folder.title }.equals 'Wiki'
|
44
|
+
asserts('entries') { @folder.entries }.kind_of Nokogiri::XML::NodeSet
|
45
|
+
asserts('bookmarks') { @folder.bookmarks }.kind_of Nokogiri::XML::NodeSet
|
46
|
+
asserts('aliases') { @folder.bookmarks }.kind_of Nokogiri::XML::NodeSet
|
47
|
+
should('be a folder') { @folder.folder? }
|
48
|
+
|
49
|
+
context 'Bookmark' do
|
50
|
+
setup { @bookmark = @folder.bookmarks.first }
|
51
|
+
|
52
|
+
asserts('modified attribute') { @bookmark.modified }.kind_of Date
|
53
|
+
asserts('visited') { @bookmark.visited }.kind_of Date
|
54
|
+
asserts('visit') { @bookmark.visit; @bookmark.visited }.equals Date.today
|
55
|
+
should('be a bookmark') { @bookmark.bookmark? }
|
14
56
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
57
|
+
context 'new Bookmark' do
|
58
|
+
setup do
|
59
|
+
@bookmark = @folder.build_bookmark 'Bookmark',
|
60
|
+
:href => 'http://www.github.com/boof/xbel', :description => 'desc'
|
61
|
+
end
|
62
|
+
|
63
|
+
asserts('added attribute') { @bookmark.added }.equals Date.today
|
64
|
+
asserts('title attribute') { @bookmark.title }.equals 'Bookmark'
|
65
|
+
asserts('href attribute') { @bookmark.href }.
|
66
|
+
equals 'http://www.github.com/boof/xbel'
|
67
|
+
asserts('description attribute') { @bookmark.description }.
|
68
|
+
equals 'desc'
|
20
69
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
70
|
+
|
71
|
+
context 'new Folder' do
|
72
|
+
setup do
|
73
|
+
@subfolder = @folder.build_folder 'subfolder',
|
74
|
+
:id => 'id-2', :desc => 'description'
|
75
|
+
end
|
76
|
+
asserts('added attribute') { @subfolder.added }.equals Date.today
|
77
|
+
asserts('title attribute') { @subfolder.title }.equals 'subfolder'
|
78
|
+
asserts('id attribute') { @subfolder.id }.equals 'id-2'
|
79
|
+
asserts('desc attribute') { @subfolder.desc }.equals 'description'
|
28
80
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
81
|
+
|
82
|
+
context 'new Alias' do
|
83
|
+
setup { @alias = @folder.build_alias @folder }
|
84
|
+
should('reference its folder') { @alias.entry == @folder }
|
33
85
|
end
|
86
|
+
|
34
87
|
end
|
88
|
+
|
35
89
|
end
|
data/test/wikipedia.xbel
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1"?>
|
2
|
+
<!DOCTYPE xbel
|
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
|
+
<xbel version="1.0">
|
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
|
+
<title>Wikimedia Foundation</title>
|
13
|
+
</bookmark>
|
14
|
+
<bookmark href="http://de.wikipedia.org/" id="b1" added="2007-11-11" modified="2007-11-14" visited="2007-12-27">
|
15
|
+
<title>Wikipedia</title>
|
16
|
+
</bookmark>
|
17
|
+
</folder>
|
18
|
+
<separator />
|
19
|
+
<alias ref="b1" />
|
20
|
+
</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.
|
8
|
+
s.version = "0.2.0"
|
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-10
|
12
|
+
s.date = %q{2009-11-10}
|
13
13
|
s.description = %q{}
|
14
14
|
s.email = %q{florian.assmann@email.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -30,17 +30,16 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/nokogiri/decorators/xbel/folder.rb",
|
31
31
|
"lib/nokogiri/decorators/xbel/seperator.rb",
|
32
32
|
"lib/xbel.rb",
|
33
|
-
"lib/xbel/writer.rb",
|
34
|
-
"test/complex.xbel",
|
35
33
|
"test/helper.rb",
|
36
34
|
"test/test_xbel.rb",
|
35
|
+
"test/wikipedia.xbel",
|
37
36
|
"xbel.gemspec"
|
38
37
|
]
|
39
38
|
s.homepage = %q{http://xbel.monkey-patch.me}
|
40
39
|
s.rdoc_options = ["--charset=UTF-8"]
|
41
40
|
s.require_paths = ["lib"]
|
42
41
|
s.rubygems_version = %q{1.3.5}
|
43
|
-
s.summary = %q{Ruby API for XBEL based on Nokogiri
|
42
|
+
s.summary = %q{Ruby API for XBEL based on Nokogiri.}
|
44
43
|
s.test_files = [
|
45
44
|
"test/helper.rb",
|
46
45
|
"test/test_xbel.rb"
|
@@ -51,17 +50,14 @@ Gem::Specification.new do |s|
|
|
51
50
|
s.specification_version = 3
|
52
51
|
|
53
52
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
54
|
-
s.add_development_dependency(%q<
|
55
|
-
s.add_runtime_dependency(%q<watchr>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<riot>, [">= 0"])
|
56
54
|
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
57
55
|
else
|
58
|
-
s.add_dependency(%q<
|
59
|
-
s.add_dependency(%q<watchr>, [">= 0"])
|
56
|
+
s.add_dependency(%q<riot>, [">= 0"])
|
60
57
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
61
58
|
end
|
62
59
|
else
|
63
|
-
s.add_dependency(%q<
|
64
|
-
s.add_dependency(%q<watchr>, [">= 0"])
|
60
|
+
s.add_dependency(%q<riot>, [">= 0"])
|
65
61
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
66
62
|
end
|
67
63
|
end
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Florian A\xC3\x9Fmann"
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10
|
12
|
+
date: 2009-11-10 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: riot
|
17
17
|
type: :development
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -22,16 +22,6 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: "0"
|
24
24
|
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: watchr
|
27
|
-
type: :runtime
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: "0"
|
34
|
-
version:
|
35
25
|
- !ruby/object:Gem::Dependency
|
36
26
|
name: nokogiri
|
37
27
|
type: :runtime
|
@@ -65,10 +55,9 @@ files:
|
|
65
55
|
- lib/nokogiri/decorators/xbel/folder.rb
|
66
56
|
- lib/nokogiri/decorators/xbel/seperator.rb
|
67
57
|
- lib/xbel.rb
|
68
|
-
- lib/xbel/writer.rb
|
69
|
-
- test/complex.xbel
|
70
58
|
- test/helper.rb
|
71
59
|
- test/test_xbel.rb
|
60
|
+
- test/wikipedia.xbel
|
72
61
|
- xbel.gemspec
|
73
62
|
has_rdoc: true
|
74
63
|
homepage: http://xbel.monkey-patch.me
|
@@ -97,7 +86,7 @@ rubyforge_project:
|
|
97
86
|
rubygems_version: 1.3.5
|
98
87
|
signing_key:
|
99
88
|
specification_version: 3
|
100
|
-
summary: Ruby API for XBEL based on Nokogiri
|
89
|
+
summary: Ruby API for XBEL based on Nokogiri.
|
101
90
|
test_files:
|
102
91
|
- test/helper.rb
|
103
92
|
- test/test_xbel.rb
|
data/lib/xbel/writer.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
class XBEL::Writer #:nodoc:
|
2
|
-
DOCTYPE = '<!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">'
|
3
|
-
|
4
|
-
attr_reader :document, :lockfile_path, :path
|
5
|
-
def new(document, path)
|
6
|
-
@document, @path = document, path
|
7
|
-
@lockfile_path = "#{ path }.lock"
|
8
|
-
end
|
9
|
-
|
10
|
-
def write
|
11
|
-
synchronize do
|
12
|
-
File.open path, 'w' do |file|
|
13
|
-
file.puts DOCTYPE
|
14
|
-
file << document
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def locked?(path)
|
22
|
-
File.exists? lockfile_path
|
23
|
-
end
|
24
|
-
def lock
|
25
|
-
File.open(lockfile_path, 'w') { |*| yield }
|
26
|
-
ensure
|
27
|
-
File.unlink lockfile_path
|
28
|
-
end
|
29
|
-
|
30
|
-
def synchronize
|
31
|
-
current_thread = Thread.current
|
32
|
-
|
33
|
-
while locked?
|
34
|
-
watch(lockfile_path, :delete) { |*| current_thread.run }
|
35
|
-
current_thread.sleep
|
36
|
-
end
|
37
|
-
|
38
|
-
lock { yield }
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
data/test/complex.xbel
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
<?xml version="1.0"?>
|
2
|
-
<!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange
|
3
|
-
Language 1.0//EN//XML"
|
4
|
-
"http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
|
5
|
-
<xbel version="1.0">
|
6
|
-
<title>Some of David's Bookmarks</title>
|
7
|
-
|
8
|
-
<folder>
|
9
|
-
<title>HTTP Clients</title>
|
10
|
-
|
11
|
-
<bookmark href="http://www.netscape.com/download/" id="bookmark-1">
|
12
|
-
<title>Netscape</title>
|
13
|
-
|
14
|
-
<desc>Netscape 6.2 is the latest update to the Internet
|
15
|
-
browsing, email and instant messagin software suite from
|
16
|
-
Netscape.</desc>
|
17
|
-
</bookmark>
|
18
|
-
|
19
|
-
<bookmark href="http://www.opera.com/">
|
20
|
-
<title>Opera</title>
|
21
|
-
|
22
|
-
<desc>Opera -- Simply the Best Internet Experience</desc>
|
23
|
-
</bookmark>
|
24
|
-
|
25
|
-
<alias ref="bookmark-5"></alias>
|
26
|
-
|
27
|
-
<bookmark href="http://www.microsoft.com/ie/">
|
28
|
-
<title>Microsoft Internet Explorer</title>
|
29
|
-
|
30
|
-
<desc>Internet Explorer 6 sets a new standard in privacy,
|
31
|
-
reliability, and flexibility. Come see how Internet Explorer
|
32
|
-
is leading the way on the Web.</desc>
|
33
|
-
</bookmark>
|
34
|
-
|
35
|
-
<bookmark href="http://lynx.browser.org/">
|
36
|
-
<title>Lynx</title>
|
37
|
-
|
38
|
-
<desc>Lynx is a fully-featured World Wide Web (WWW) client
|
39
|
-
for users running cursor-addressable, character-cell display
|
40
|
-
devices (e.g., vt100 terminals, vt100 emulators running on
|
41
|
-
PCs or Macs, or any other character-cell display). It will
|
42
|
-
display Hypertext Markup Language (HTML) documents containing
|
43
|
-
links to files on the local system, as well as files on
|
44
|
-
remote systems running http, gopher, ftp, wais, nntp, finger,
|
45
|
-
or cso/ph/qi servers, and services accessible via logins to
|
46
|
-
telnet, tn3270 or rlogin accounts. Current versions of Lynx
|
47
|
-
run on Unix, VMS, Windows95/NT, 386DOS and OS/2 EMX.</desc>
|
48
|
-
</bookmark>
|
49
|
-
|
50
|
-
<bookmark href="http://www.w3.org/Amaya/" id="bookmark-5">
|
51
|
-
<title>Amaya</title>
|
52
|
-
|
53
|
-
<desc>Amaya is a browser/authoring tool that allows you to
|
54
|
-
publish documents on the Web. It is used to demonstrate and
|
55
|
-
test many of the new developments in Web protocols and data
|
56
|
-
formats. Given the very fast moving nature of Web technology,
|
57
|
-
Amaya has a central role to play. It is versatile and
|
58
|
-
extensible and is available on both Unix and Windows '95/NT
|
59
|
-
platforms.</desc>
|
60
|
-
</bookmark>
|
61
|
-
|
62
|
-
<alias ref="bookmark-1"></alias>
|
63
|
-
|
64
|
-
</folder>
|
65
|
-
|
66
|
-
<folder>
|
67
|
-
<title>Extensible Markup Language (XML)</title>
|
68
|
-
|
69
|
-
<bookmark
|
70
|
-
href="http://www.sciam.com/1999/0599issue/0599bosak.html">
|
71
|
-
<title>Scientific American: Feature Article: XML and the
|
72
|
-
Second Generation Web: May 1999</title>
|
73
|
-
|
74
|
-
<desc>The combination of hypertext and a global Internet
|
75
|
-
started a revolution. A new ingredient, XML, is poised to
|
76
|
-
finish the job. by Jon Bosak and Tim Bray</desc>
|
77
|
-
|
78
|
-
</bookmark>
|
79
|
-
|
80
|
-
<bookmark
|
81
|
-
href="http://www.sciam.com/2001/0501issue/0501berners-lee.html">
|
82
|
-
|
83
|
-
<title>Scientific American: Feature Article: The Semantic
|
84
|
-
Web: May 2001</title>
|
85
|
-
|
86
|
-
<desc>A new form of Web content that is meaningful to
|
87
|
-
computers will unleash a revolution of new possibilities . by
|
88
|
-
TIM BERNERS-LEE, JAMES HENDLER and ORA LASSILA</desc>
|
89
|
-
</bookmark>
|
90
|
-
|
91
|
-
<bookmark href="http://www.w3.org/XML/1999/XML-in-10-points">
|
92
|
-
|
93
|
-
<title>XML in 10 Points</title>
|
94
|
-
</bookmark>
|
95
|
-
|
96
|
-
<folder>
|
97
|
-
<title>Building XML Documents</title>
|
98
|
-
|
99
|
-
<bookmark
|
100
|
-
href="http://www.webreview.com/2000/08_04/webauthors/08_04_00_4.shtml">
|
101
|
-
|
102
|
-
<title>Well-Formed XML Documents (webreview.com)</title>
|
103
|
-
|
104
|
-
<desc>Still trying to tame the XML beast? Begin with this
|
105
|
-
tutorial that will show you in clear terms how to build a
|
106
|
-
simple XML document that is well-formed and valid.</desc>
|
107
|
-
</bookmark>
|
108
|
-
</folder>
|
109
|
-
|
110
|
-
<folder>
|
111
|
-
<title>RSS</title>
|
112
|
-
|
113
|
-
<bookmark
|
114
|
-
href="http://www.webreference.com/authoring/languages/xml/rss/intro/">
|
115
|
-
|
116
|
-
<title>Introduction to RSS - WebReference.com</title>
|
117
|
-
|
118
|
-
<desc>Rich Site Summary (RSS) is a lightweight XML format
|
119
|
-
designed for sharing headlines and other Web
|
120
|
-
content.</desc>
|
121
|
-
</bookmark>
|
122
|
-
|
123
|
-
<bookmark
|
124
|
-
href="http://www.WebReview.com/1999/10_29/webauthors/10_29_99_2a.shtml">
|
125
|
-
|
126
|
-
<title>WebReview.com: RSS Delivers the XML Promise</title>
|
127
|
-
|
128
|
-
<desc>RSS is a content syndication format that uses the
|
129
|
-
power of XML to share data over the Internet.</desc>
|
130
|
-
</bookmark>
|
131
|
-
</folder>
|
132
|
-
|
133
|
-
<folder>
|
134
|
-
<title>Extensible Stylesheet Language (XSL)</title>
|
135
|
-
|
136
|
-
<bookmark
|
137
|
-
href="http://www.webreview.com/2001/08_03/developers/index01.shtml">
|
138
|
-
|
139
|
-
<title>WebReview.com: August 3, 2001: Introduction to
|
140
|
-
XSLT</title>
|
141
|
-
|
142
|
-
<desc>An introduction to XSLT</desc>
|
143
|
-
</bookmark>
|
144
|
-
</folder>
|
145
|
-
|
146
|
-
<folder>
|
147
|
-
<title>Recommended Books</title>
|
148
|
-
|
149
|
-
<bookmark href="http://www.oreilly.com/catalog/learnxml/">
|
150
|
-
<title>Learning XML : (Guide to) Creating Self-Describing
|
151
|
-
Data</title>
|
152
|
-
|
153
|
-
<desc>Eric T. Ray, (O'Reilly)</desc>
|
154
|
-
</bookmark>
|
155
|
-
|
156
|
-
<bookmark
|
157
|
-
href="http://www.amazon.com/exec/obidos/ASIN/0789725045/">
|
158
|
-
<title>XML By Example</title>
|
159
|
-
|
160
|
-
<desc>Benoit Marchal</desc>
|
161
|
-
</bookmark>
|
162
|
-
</folder>
|
163
|
-
</folder>
|
164
|
-
</xbel>
|
165
|
-
|